Refactor Fremantule UI code and implement logging
[mevemon] / package / src / ui / fremantle / dialogs.py
1 import hildon
2 import gtk
3
4 import ui.models as models
5 import validation
6
7 class SettingsDialog(gtk.Dialog):
8     RESPONSE_NEW, RESPONSE_EDIT, RESPONSE_DELETE = range(3)
9     def __init__(self, window, controller):
10         self.win = window
11         self.controller = controller
12         gtk.Dialog.__init__(self)
13         self.set_transient_for(self.win)
14         self.set_title("Settings")
15
16         pannable_area = hildon.PannableArea()
17         vbox = gtk.VBox(False, 1)
18         pannable_area.add_with_viewport(vbox)
19         self.vbox.pack_start(pannable_area, True, True, 1)
20
21         self.accounts = AccountsTreeView(gtk.HILDON_UI_MODE_NORMAL, self.controller)
22         vbox.pack_start(self.accounts, False, False, 1)
23         
24         # add butttons
25         # all stock responses are negative, so we can use any positive value
26         new_button = self.add_button("New", self.RESPONSE_NEW)
27         #TODO: get edit button working
28         #edit_button = self.add_button("Edit", RESPONSE_EDIT)
29         delete_button = self.add_button("Delete", self.RESPONSE_DELETE)
30         ok_button = self.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
31
32         self.show_all()
33         
34         result = self.run()
35
36         while(result != gtk.RESPONSE_DELETE_EVENT):
37             if result == self.RESPONSE_NEW:
38                 self.on_new_account_clicked()
39             elif result == self.RESPONSE_DELETE:
40                 # get the selected treeview item, and delete the gconf keys
41                 self.on_delete_account_clicked()
42             elif result == gtk.RESPONSE_OK:
43                 self.accounts.refresh()
44                 break
45         
46             result = self.run()
47
48         self.destroy()
49
50     def on_new_account_clicked(self):
51         NewAccountDialog(self.win, self.controller)
52         self.accounts.refresh()
53
54     
55     def on_delete_account_clicked(self):
56         uid = self._get_selected_item(0)
57         self.controller.remove_account(uid)
58         self.accounts.refresh()
59     
60     def _get_selected_item(self, column):
61         selection = self.accounts.get_selection()
62         model, miter = selection.get_selected()
63         value = model.get_value(miter, column)
64
65         return value
66
67     def report_error(self, error):
68         hildon.hildon_banner_show_information(self.get_toplevel(), '', error)
69
70 class NewAccountDialog(gtk.Dialog):
71     def __init__(self, parent, controller):
72         self.controller = controller
73         gtk.Dialog.__init__(self, parent=parent)
74         self.build()
75         
76         result = self.run()
77         
78         valid_credentials = False
79
80         while not valid_credentials:
81             if result == gtk.RESPONSE_OK:
82                 uid = self.uidEntry.get_text()
83                 api_key = self.apiEntry.get_text()
84                 try:
85                     validation.uid(uid)
86                     validation.api_key(api_key)
87                 except validation.ValidationError, e:
88                     self.report_error(e.message)
89                     result = self.run()
90                 else:
91                     valid_credentials = True
92                     self.controller.add_account(uid, api_key)
93             else:
94                 break
95
96         self.destroy()
97
98
99     def build(self):
100         #get the vbox to pack all the settings into
101         vbox = self.vbox
102     
103         self.set_title("New Account")
104
105         uidLabel = gtk.Label("User ID:")
106         uidLabel.set_justify(gtk.JUSTIFY_LEFT)
107         vbox.add(uidLabel)
108         
109         self.uidEntry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
110         self.uidEntry.set_placeholder("User ID")
111         self.uidEntry.set_property('is_focus', False)
112         
113         vbox.add(self.uidEntry)
114
115         apiLabel = gtk.Label("API key:")
116         apiLabel.set_justify(gtk.JUSTIFY_LEFT)
117         vbox.add(apiLabel)
118         
119         self.apiEntry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
120         self.apiEntry.set_placeholder("API Key")
121         self.apiEntry.set_property('is_focus', False)
122
123         vbox.add(self.apiEntry)
124        
125         ok_button = self.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
126
127         self.show_all()
128
129     def report_error(self, error):
130         hildon.hildon_banner_show_information(self.get_toplevel(), '', error)
131
132 class AccountsTreeView(hildon.GtkTreeView):
133     def __init__(self, mode, controller):
134         self.controller = controller
135         hildon.GtkTreeView.__init__(self, mode)
136         
137         self.accounts_model = models.AccountsModel(self.controller)
138         self.set_model(self.accounts_model)
139         self.set_headers_visible(True)
140         self.add_columns()
141
142     def add_columns(self):
143         #Column 0 for the treeview
144         renderer = gtk.CellRendererText()
145         column = gtk.TreeViewColumn('User ID', renderer, 
146                 text=models.AccountsModel.C_UID)
147         column.set_property("expand", True)
148         self.append_column(column)
149
150         #Column 2 (characters) for the treeview
151         column = gtk.TreeViewColumn('Characters', renderer, 
152                 markup=models.AccountsModel.C_CHARS)
153         column.set_property("expand", True)
154         self.append_column(column)
155
156     def refresh(self):
157         self.accounts_model.get_accounts()
158
159
160