add a 'clear cache' button in the settings
[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         clear_button = hildon.GtkButton(gtk.HILDON_SIZE_FINGER_HEIGHT | gtk.HILDON_SIZE_HALFSCREEN_WIDTH)
25         clear_button.set_label("Clear Cache")
26         clear_button.connect("clicked", self.on_clear_cache_clicked)
27         vbox.pack_start(clear_button, False, False, 1)
28         
29         # add butttons
30         # all stock responses are negative, so we can use any positive value
31         new_button = self.add_button("New", self.RESPONSE_NEW)
32         #TODO: get edit button working
33         #edit_button = self.add_button("Edit", RESPONSE_EDIT)
34         delete_button = self.add_button("Delete", self.RESPONSE_DELETE)
35         ok_button = self.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
36
37         self.show_all()
38         
39         result = self.run()
40
41         while(result != gtk.RESPONSE_DELETE_EVENT):
42             if result == self.RESPONSE_NEW:
43                 self.on_new_account_clicked()
44             elif result == self.RESPONSE_DELETE:
45                 # get the selected treeview item, and delete the gconf keys
46                 self.on_delete_account_clicked()
47             elif result == gtk.RESPONSE_OK:
48                 self.accounts.refresh()
49                 break
50         
51             result = self.run()
52
53         self.destroy()
54
55     def on_clear_cache_clicked(self, button):
56         self.controller.clear_cache()
57
58     def on_new_account_clicked(self):
59         NewAccountDialog(self.win, self.controller)
60         self.accounts.refresh()
61
62     
63     def on_delete_account_clicked(self):
64         uid = self._get_selected_item(0)
65         self.controller.settings.remove_account(uid)
66         self.accounts.refresh()
67     
68     def _get_selected_item(self, column):
69         selection = self.accounts.get_selection()
70         model, miter = selection.get_selected()
71         value = model.get_value(miter, column)
72
73         return value
74
75     def report_error(self, error):
76         hildon.hildon_banner_show_information(self.get_toplevel(), '', error)
77
78 class NewAccountDialog(gtk.Dialog):
79     def __init__(self, parent, controller):
80         self.controller = controller
81         gtk.Dialog.__init__(self, parent=parent)
82         self.build()
83         
84         result = self.run()
85         
86         valid_credentials = False
87
88         while not valid_credentials:
89             if result == gtk.RESPONSE_OK:
90                 uid = self.uidEntry.get_text()
91                 api_key = self.apiEntry.get_text()
92                 try:
93                     validation.validate_uid(uid)
94                     validation.validate_api_key(api_key)
95                 except validation.ValidationError, e:
96                     self.report_error(e.message)
97                     result = self.run()
98                 else:
99                     valid_credentials = True
100                     self.controller.settings.add_account(uid, api_key)
101             else:
102                 break
103
104         self.destroy()
105
106
107     def build(self):
108         #get the vbox to pack all the settings into
109         vbox = self.vbox
110     
111         self.set_title("New Account")
112
113         uidLabel = gtk.Label("User ID:")
114         uidLabel.set_justify(gtk.JUSTIFY_LEFT)
115         vbox.add(uidLabel)
116         
117         self.uidEntry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
118         self.uidEntry.set_placeholder("User ID")
119         self.uidEntry.set_property('is_focus', False)
120         
121         vbox.add(self.uidEntry)
122
123         apiLabel = gtk.Label("API key:")
124         apiLabel.set_justify(gtk.JUSTIFY_LEFT)
125         vbox.add(apiLabel)
126         
127         self.apiEntry = hildon.Entry(gtk.HILDON_SIZE_FINGER_HEIGHT)
128         self.apiEntry.set_placeholder("API Key")
129         self.apiEntry.set_property('is_focus', False)
130
131         vbox.add(self.apiEntry)
132        
133         ok_button = self.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
134
135         self.show_all()
136
137     def report_error(self, error):
138         hildon.hildon_banner_show_information(self.get_toplevel(), '', error)
139
140 class AccountsTreeView(hildon.GtkTreeView):
141     def __init__(self, mode, controller):
142         self.controller = controller
143         hildon.GtkTreeView.__init__(self, mode)
144         
145         self.accounts_model = models.AccountsModel(self.controller)
146         self.set_model(self.accounts_model)
147         self.set_headers_visible(True)
148         self.add_columns()
149
150     def add_columns(self):
151         #Column 0 for the treeview
152         renderer = gtk.CellRendererText()
153         column = gtk.TreeViewColumn('User ID', renderer, 
154                 text=models.AccountsModel.C_UID)
155         column.set_property("expand", True)
156         self.append_column(column)
157
158         #Column 2 (characters) for the treeview
159         column = gtk.TreeViewColumn('Characters', renderer, 
160                 markup=models.AccountsModel.C_CHARS)
161         column.set_property("expand", True)
162         self.append_column(column)
163
164     def refresh(self):
165         self.accounts_model.get_accounts()
166
167
168