4 from launcher import Launcher
5 from settings import Settings
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()
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)
33 def _launch_browser(self, url):
34 self._launcher.openUrl(url)
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)
46 dialog.add_button(_('File a bug'), 1)
47 dialog.add_button(_('Donate'), 2)
48 dialog.add_button(_('Close'), 3)
55 self._launcher.openUrl(_('http://wifi-assistant.garage.maemo.org/bugs/'))
57 self._launcher.openUrl(_('http://wifi-assistant.garage.maemo.org/donate/'))
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())
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())
71 dialog = gtk.Dialog(_('Settings'), self._win)
72 dialog.vbox.set_homogeneous(False)
74 dialog.vbox.add(checkbox)
75 dialog.vbox.add(url_label)
76 dialog.vbox.add(url_field)
78 dialog.add_button(_('Cancel'), gtk.RESPONSE_CANCEL)
79 dialog.add_button(_('Save'), gtk.RESPONSE_YES)
85 if result == gtk.RESPONSE_YES:
86 self._settings.setUrlToOpen(url_field.get_text())
87 self._settings.setUsePopup(checkbox.get_active())
90 def _create_menu(self):
91 menu = hildon.AppMenu()
93 about = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
94 about.set_label(_("About"))
95 about.connect("clicked", self._show_about)
98 settings = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
99 settings.set_label(_("Settings"))
100 settings.connect("clicked",self._show_settings)
101 menu.append(settings)
103 add = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
104 add.set_label(_("Add network"))
105 add.connect("clicked", self._add_ssid)
108 delete = hildon.GtkButton(gtk.HILDON_SIZE_AUTO)
109 delete.set_label(_("Delete networks"))
110 delete.connect("clicked", self._delete_ssid)
117 def _edit_ssid(self, ssid, model, iter):
118 dialog = gtk.Dialog(ssid, self._win)
119 dialog.vbox.set_homogeneous(False)
121 dialog.add_button(_('No'), gtk.RESPONSE_NO)
122 dialog.add_button(_('Yes'), gtk.RESPONSE_YES)
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)
131 result = dialog.run()
135 if result == gtk.RESPONSE_YES:
137 elif result == gtk.RESPONSE_NO:
138 launchBrowser = False
140 if launchBrowser is not None:
141 self._settings.setLaunchSetting(ssid, launchBrowser)
142 model.set(iter, 1, launchBrowser)
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)
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'))
156 dialog = gtk.Dialog(_('Add network'), self._win)
157 dialog.vbox.set_homogeneous(False)
159 dialog.vbox.add(url_label)
160 dialog.vbox.add(url_field)
161 dialog.vbox.add(checkbox)
163 dialog.add_button(_('Cancel'), gtk.RESPONSE_CANCEL)
164 dialog.add_button(_('Save'), gtk.RESPONSE_YES)
167 result = dialog.run()
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])
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)
184 area = hildon.PannableArea()
185 tree_view = self._create_delete_view()
189 toolbar.connect("button-clicked", self._delete_button_clicked, tree_view)
190 toolbar.connect_object("arrow-clicked", gtk.Window.destroy, window)
196 def _delete_button_clicked(self, button, treeview):
197 selection = treeview.get_selection()
199 (model, selected_rows) = selection.get_selected_rows()
201 # TODO: are you sure?
204 for path in selected_rows:
205 ref = gtk.TreeRowReference(model, path)
206 row_references.append(ref)
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)
215 # TODO: close delete window?
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)
223 tv.append_column(col)
225 # Set multiple selection mode
226 selection = tv.get_selection()
227 selection.set_mode(gtk.SELECTION_MULTIPLE)
229 tv.set_model(self._model)
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)
239 return gtk.Label(_('There are no launch settings saved for any network'))
241 view = gtk.TreeView(model)
242 view.set_border_width(5)
244 def boolean_func(column, cell, model, iter):
245 if model.get_value(iter, 1):
249 cell.set_property('stock-id', stock_id)
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))
258 tvcolumn = gtk.TreeViewColumn(_('SSID'), gtk.CellRendererText(), text = 0)
259 tvcolumn.set_expand(True)
260 view.append_column(tvcolumn)
262 view.connect('row-activated', self._row_activated)
263 view.set_search_column(0)
264 tvcolumn.set_sort_column_id(0)
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)
276 if __name__ == "__main__":
277 gui = ConfigGui(Launcher(), Settings())