moved settings to separate module
[wifi-assistant] / package / src / wifi_assistant / config-gui.py
1 #!/usr/bin/python2.5
2 import gtk, hildon
3
4 from launcher import Launcher
5 from settings import Settings
6
7 def _(str):
8     return str
9
10 class ConfigGui():
11     
12     def __init__(self, launcher, settings):
13         self._launcher = launcher
14         self._settings = settings
15         self._program = hildon.Program.get_instance()
16         self._win = hildon.StackableWindow()
17         self._model= self._settings.getLaunchSettings()
18
19
20     def main(self):
21         self._win.set_title(_("Wifi Jail Breakout Assistant"))
22         ssid_list = self._create_ssid_view(self._model)
23         pannable_area= hildon.PannableArea()
24         pannable_area.add(ssid_list)
25         self._win.add(pannable_area)
26         self._win.set_app_menu(self._create_menu())
27         self._win.connect("destroy", gtk.main_quit, None)
28         self._win.show_all()
29         gtk.main()
30
31      
32      # FIXME: refactor out
33     def _launch_browser(self, url):
34         self._launcher.openUrl(url)
35     
36     
37     def _show_about(self, x):
38         dialog = gtk.Dialog(_('About'), self._win)
39         text = "I got tired of not being able to connect easily to networks guarded by a login page, " + \
40             "so I created this app to scratch that itch. It's free to use, inspect, adapt and share, " + \
41             "licensed under a BSD type license.\nI hope you enjoy it!"
42         about_label = gtk.Label(_(text))
43         about_label.set_line_wrap(True)
44         dialog.vbox.add(about_label)
45         
46         dialog.add_button(_('File a bug'), 1)
47         dialog.add_button(_('Donate'), 2)
48         dialog.add_button(_('Close'), 3)
49         
50         dialog.show_all()
51         result = dialog.run()
52         dialog.hide()
53         
54         if result == 1:
55             self._launcher.openUrl(_('http://wifi-assistant.garage.maemo.org/bugs/'))
56         if result == 2:
57             self._launcher.openUrl(_('http://wifi-assistant.garage.maemo.org/donate/'))
58     
59         
60     def _show_settings(self, x):
61         checkbox = hildon.CheckButton(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
62         checkbox.set_label(_('Show popup when connected to a new SSID'))
63         checkbox.set_active(self._settings.getUsePopup())
64         
65         url_label = gtk.Label(_('URL to open when launching browser:')) # IMPROVEMENT: caption?
66         url_label.set_alignment(0, 0.5)
67         url_label.set_padding(5, 5)
68         url_field = hildon.Entry(gtk.HILDON_SIZE_AUTO)
69         url_field.set_text(self._settings.getUrlToOpen())
70         
71         dialog = gtk.Dialog(_('Settings'), self._win)
72         dialog.vbox.set_homogeneous(False)
73         
74         dialog.vbox.add(checkbox)
75         dialog.vbox.add(url_label)
76         dialog.vbox.add(url_field)
77         
78         dialog.add_button(_('Cancel'), gtk.RESPONSE_CANCEL)
79         dialog.add_button(_('Save'), gtk.RESPONSE_YES)
80         
81         dialog.show_all()
82         result = dialog.run()
83         dialog.hide()
84         
85         if result == gtk.RESPONSE_YES:
86             self._settings.setUrlToOpen(url_field.get_text())
87             self._settings.setUsePopup(checkbox.get_active())
88     
89     
90     def _create_menu(self):
91         menu = hildon.AppMenu()
92         
93         about = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
94         about.set_label(_("About"))
95         about.connect("clicked", self._show_about)
96         menu.append(about)
97      
98         settings = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
99         settings.set_label(_("Settings"))
100         settings.connect("clicked",self._show_settings)
101         menu.append(settings)
102         
103         add = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
104         add.set_label(_("Add network"))
105         add.connect("clicked", self._add_ssid)
106         menu.append(add)
107         
108         delete = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
109         delete.set_label(_("Delete networks"))
110         delete.connect("clicked", self._delete_ssid)
111         menu.append(delete)
112         
113         menu.show_all()
114         return menu
115     
116
117     def _edit_ssid(self, ssid, model, iter):
118         dialog = gtk.Dialog(ssid, self._win)
119         dialog.vbox.set_homogeneous(False)
120         
121         dialog.add_button(_('No'), gtk.RESPONSE_NO)
122         dialog.add_button(_('Yes'), gtk.RESPONSE_YES)
123         
124         label = gtk.Label(_('After being connected to ' + ssid + ' do you wish to launch a browser?')) #FIXME: l10n
125         label.set_line_wrap(True)
126         label.set_justify(gtk.JUSTIFY_LEFT)
127         label.set_alignment(0, 0.5)
128         dialog.vbox.add(label)
129     
130         dialog.show_all()
131         result = dialog.run()
132         dialog.hide()
133         
134         launchBrowser = None
135         if result == gtk.RESPONSE_YES:
136             launchBrowser = True
137         elif result == gtk.RESPONSE_NO:
138             launchBrowser = False
139         
140         if launchBrowser is not None:
141             self._settings.setLaunchSetting(ssid, launchBrowser)
142             model.set(iter, 1, launchBrowser)
143     
144     
145     def _add_ssid(self, x):
146         checkbox = hildon.CheckButton(gtk.HILDON_SIZE_AUTO_WIDTH | gtk.HILDON_SIZE_FINGER_HEIGHT)
147         checkbox.set_label(_('Launch browser when connected'))
148         checkbox.set_active(True)
149         
150         url_label = gtk.Label(_('Name of the network:')) # IMPROVEMENT: caption?
151         url_label.set_alignment(0, 0.5)
152         url_label.set_padding(5, 5)
153         url_field = hildon.Entry(gtk.HILDON_SIZE_AUTO)
154         url_field.set_text(_('MyNetwork'))
155         
156         dialog = gtk.Dialog(_('Add network'), self._win)
157         dialog.vbox.set_homogeneous(False)
158         
159         dialog.vbox.add(url_label)
160         dialog.vbox.add(url_field)
161         dialog.vbox.add(checkbox)
162         
163         dialog.add_button(_('Cancel'), gtk.RESPONSE_CANCEL)
164         dialog.add_button(_('Save'), gtk.RESPONSE_YES)
165         
166         dialog.show_all()
167         result = dialog.run()
168         dialog.hide()
169         
170
171         if result == gtk.RESPONSE_YES:
172             launchBrowser = checkbox.get_active()
173             ssid = url_field.get_text()
174             self._settings.setLaunchSetting(ssid, launchBrowser)
175             self._model.append([ssid, launchBrowser])
176     
177
178     def _delete_ssid(self, x):
179         window = hildon.StackableWindow()
180         window.set_border_width(6)
181         toolbar = hildon.EditToolbar(_("Choose network settings to delete"), _("Delete"))
182         window.set_edit_toolbar(toolbar)
183      
184         area = hildon.PannableArea()
185         tree_view = self._create_delete_view()
186         area.add(tree_view)
187         window.add(area)
188      
189         toolbar.connect("button-clicked", self._delete_button_clicked, tree_view)
190         toolbar.connect_object("arrow-clicked", gtk.Window.destroy, window)
191      
192         window.show_all()
193         window.fullscreen()
194
195
196     def _delete_button_clicked(self, button, treeview):
197         selection = treeview.get_selection()
198      
199         (model, selected_rows) = selection.get_selected_rows()
200         
201         # TODO: are you sure?
202      
203         row_references = []
204         for path in selected_rows:
205             ref = gtk.TreeRowReference(model, path)
206             row_references.append(ref)
207      
208         for ref in row_references:
209             path = ref.get_path()
210             iter = model.get_iter(path)
211             ssid, x = model.get(iter, 0, 1)  
212             self._settings.deleteLaunchSetting(ssid)
213             model.remove(iter)
214
215         # TODO: close delete window?
216
217         
218     def _create_delete_view(self):
219         tv = hildon.GtkTreeView(gtk.HILDON_UI_MODE_EDIT)
220         renderer = gtk.CellRendererText()
221         col = gtk.TreeViewColumn("Title", renderer, text=0)
222      
223         tv.append_column(col)
224      
225         # Set multiple selection mode
226         selection = tv.get_selection()
227         selection.set_mode(gtk.SELECTION_MULTIPLE)
228      
229         tv.set_model(self._model)
230      
231         return tv
232
233
234     def _create_ssid_view(self, model):
235 #        view = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL, model)
236 #        view = hildon.GtkTreeView(gtk.HILDON_UI_MODE_NORMAL, model)
237
238         if len(model) == 0:
239             return gtk.Label(_('There are no launch settings saved for any network'))
240
241         view = gtk.TreeView(model)
242         view.set_border_width(5)
243         
244         def boolean_func(column, cell, model, iter):
245             if model.get_value(iter, 1):
246                 stock_id = 'gtk-yes'
247             else:
248                 stock_id = 'gtk-no'
249             cell.set_property('stock-id', stock_id)
250         
251         launch_cell = gtk.CellRendererPixbuf()
252         launch_cell.set_fixed_size(100, 50)
253         view.insert_column_with_data_func(1, _('Launch'), launch_cell, boolean_func)
254 #        toggle_cell = gtk.CellRendererToggle()
255 #        toggle_cell.set_fixed_size(100, 50)
256 #        view.append_column( gtk.TreeViewColumn( '', toggle_cell, active=1))
257          
258         tvcolumn = gtk.TreeViewColumn(_('SSID'), gtk.CellRendererText(), text = 0)
259         tvcolumn.set_expand(True)
260         view.append_column(tvcolumn)
261     
262         view.connect('row-activated', self._row_activated)
263         view.set_search_column(0)
264         tvcolumn.set_sort_column_id(0)
265         
266         return view
267
268
269     def _row_activated(self, treeview, path, view_column):
270         model = treeview.get_model()
271         iter = model.get_iter(path)
272         ssid = model.get_value(iter, 0)
273         self._edit_ssid(ssid, model, iter)
274         
275
276 if __name__ == "__main__":
277     gui = ConfigGui(Launcher(), Settings())
278     gui.main()