1
0
mirror of https://github.com/gryf/wicd.git synced 2025-12-19 20:38:00 +01:00

New feature: dialogs to "forget" saved networks

This commit is contained in:
David Paleino
2012-05-06 17:16:15 +02:00
parent 1f9f5596f9
commit 11e8a96677
7 changed files with 188 additions and 5 deletions

View File

@@ -511,14 +511,17 @@ class Dialog2(urwid.WidgetWrap):
# Simple dialog with text in it and "OK" # Simple dialog with text in it and "OK"
class TextDialog(Dialog2): class TextDialog(Dialog2):
def __init__(self, text, height, width, header=None,align='left'): def __init__(self, text, height, width, header=None, align='left',
buttons=(_('OK'), 1)):
l = [urwid.Text(text)] l = [urwid.Text(text)]
body = urwid.ListBox(l) body = urwid.ListBox(l)
body = urwid.AttrWrap(body, 'body') body = urwid.AttrWrap(body, 'body')
Dialog2.__init__(self, header, height+2, width+2, body) Dialog2.__init__(self, header, height+2, width+2, body)
self.add_buttons([('OK',1)]) if type(buttons) == list:
self.add_buttons(buttons)
else:
self.add_buttons([buttons])
def unhandled_key(self, size, k): def unhandled_key(self, size, k):
if k in ('up','page up','down','page down'): if k in ('up','page up','down','page down'):

View File

@@ -221,6 +221,7 @@ _('For more detailed help, consult the wicd-curses(8) man page.')+"\n",
('bold',' I'),": "+_('Scan for hidden networks')+"\n", ('bold',' I'),": "+_('Scan for hidden networks')+"\n",
('bold',' S'),": "+_('Select scripts')+"\n", ('bold',' S'),": "+_('Select scripts')+"\n",
('bold',' O'),": "+_('Set up Ad-hoc network')+"\n", ('bold',' O'),": "+_('Set up Ad-hoc network')+"\n",
('bold',' X'),": "+_('Remove settings for saved networks')+"\n",
('bold',' ->'),": "+_('Configure selected network')+"\n", ('bold',' ->'),": "+_('Configure selected network')+"\n",
('bold',' A'),": "+_("Display 'about' dialog")+"\n", ('bold',' A'),": "+_("Display 'about' dialog")+"\n",
('bold',' F8 q Q'),": "+_('Quit wicd-curses')+"\n", ('bold',' F8 q Q'),": "+_('Quit wicd-curses')+"\n",
@@ -511,6 +512,54 @@ class AdHocDialog(Dialog2):
self.key_edit.get_edit_text()) self.key_edit.get_edit_text())
return exitcode, data return exitcode, data
# TODO
class ForgetDialog(Dialog2):
def __init__(self):
self.to_remove = dict(essid=[], bssid=[])
header = urwid.AttrWrap(urwid.Text(' %20s %20s' % ('ESSID', 'BSSID')), 'listbar')
title = urwid.Text(_('Please select the networks to forget'))
l = [ title, header ]
for entry in wireless.GetSavedWirelessNetworks():
label = '%20s %20s'
if entry[1] != 'None':
label = label % (entry[0], entry[1])
data = entry
else:
label = label % (entry[0], 'global')
data = (entry[0], 'essid:' + entry[0])
cb = urwid.CheckBox(label, on_state_change=self.update_to_remove, user_data=data)
l.append(cb)
body = urwid.ListBox(l)
header = ('header', _('List of saved networks'))
Dialog2.__init__(self, header, 15, 50, body)
self.add_buttons([(_('Remove'),1),(_('Cancel'),-1)])
self.frame.set_focus('body')
def update_to_remove(self, widget, checked, data):
if checked:
self.to_remove['essid'].append(data[0])
self.to_remove['bssid'].append(data[1])
else:
self.to_remove['essid'].remove(data[0])
self.to_remove['bssid'].remove(data[1])
def unhandled_key(self, size, k):
if k in ('up','page up'):
self.frame.set_focus('body')
if k in ('down','page down'):
self.frame.set_focus('footer')
if k == 'enter':
# pass enter to the "ok" button
self.frame.set_focus('footer')
self.buttons.set_focus(1)
self.view.keypress(size, k)
def on_exit(self, exitcode):
return exitcode, self.to_remove
######################################## ########################################
##### APPLICATION INTERFACE CLASS ##### APPLICATION INTERFACE CLASS
######################################## ########################################
@@ -892,7 +941,18 @@ class appGUI():
data[1], "WEP", data[1], "WEP",
data[5], data[5],
data[4], False) data[4], False)
if 'X' in keys:
exitcode, data = ForgetDialog().run(ui, self.frame)
if exitcode == 1:
text = _('Are you sure you want to discard settings for ' +
'the selected networks?')
text += '\n\n' + '\n'.join(data['essid'])
confirm, useless = TextDialog(text, 20, 50,
buttons=[(_('OK'), 1), (_('Cancel'), -1)],
).run(ui, self.frame)
if confirm == 1:
map(wireless.DeleteWirelessNetwork, data['bssid'])
for k in keys: for k in keys:
if urwid.VERSION < (1, 0, 0): if urwid.VERSION < (1, 0, 0):
check_mouse_event = urwid.is_mouse_event check_mouse_event = urwid.is_mouse_event

View File

@@ -60,6 +60,16 @@
<signal name="activate" handler="hidden_clicked"/> <signal name="activate" handler="hidden_clicked"/>
</object> </object>
</child> </child>
<child>
<object class="GtkImageMenuItem" id="forget_network_button">
<property name="label" translatable="yes">Forget network settings</property>
<property name="visible">True</property>
<property name="tooltip_text" translatable="yes">Remove settings for saved networks</property>
<property name="image">image3</property>
<property name="use_stock">True</property>
<signal name="activate" handler="forget_network_clicked"/>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>
@@ -1732,5 +1742,9 @@ WPA supplicant driver.</property>
<property name="visible">True</property> <property name="visible">True</property>
<property name="stock">gtk-find</property> <property name="stock">gtk-find</property>
</object> </object>
<object class="GtkImage" id="image3">
<property name="visible">True</property>
<property name="stock">gtk-delete</property>
</object>
<object class="GtkAccelGroup" id="accelgroup1"/> <object class="GtkAccelGroup" id="accelgroup1"/>
</interface> </interface>

View File

@@ -180,6 +180,7 @@ class appGui(object):
"preferences_clicked" : self.settings_dialog, "preferences_clicked" : self.settings_dialog,
"about_clicked" : self.about_dialog, "about_clicked" : self.about_dialog,
"create_adhoc_clicked" : self.create_adhoc_network, "create_adhoc_clicked" : self.create_adhoc_network,
"forget_network_clicked" : self.forget_network,
} }
self.wTree.connect_signals(dic) self.wTree.connect_signals(dic)
@@ -300,6 +301,66 @@ class appGui(object):
False) #chkbox_use_ics.get_active()) False) #chkbox_use_ics.get_active())
dialog.destroy() dialog.destroy()
def forget_network(self, widget=None):
"""
Shows a dialog that lists saved wireless networks, and lets the user
delete them.
"""
wireless.ReloadConfig()
dialog = gtk.Dialog(title = _('List of saved networks'),
flags = gtk.DIALOG_MODAL,
buttons=(gtk.STOCK_DELETE, 1, gtk.STOCK_OK, 2))
dialog.set_has_separator(True)
dialog.set_size_request(400, 200)
networks = gtk.ListStore(str, str)
for entry in wireless.GetSavedWirelessNetworks():
if entry[1] != 'None':
networks.append(entry)
else:
networks.append((entry[0], _('Global settings for this ESSID')))
tree = gtk.TreeView(model=networks)
tree.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
cell = gtk.CellRendererText()
column = gtk.TreeViewColumn(_('ESSID'), cell, text = 0)
tree.append_column(column)
column = gtk.TreeViewColumn(_('BSSID'), cell, text = 1)
tree.append_column(column)
scroll = gtk.ScrolledWindow()
scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
scroll.add(tree)
dialog.vbox.pack_start(scroll)
dialog.vbox.set_spacing(5)
dialog.show_all()
response = dialog.run()
if response == 1:
model, pathlist = tree.get_selection().get_selected_rows()
to_remove = dict(essid=[], bssid=[])
if pathlist:
for row in pathlist:
iter = model.get_iter(path=row)
to_remove['essid'].append(misc.noneToString(model.get_value(iter, 0)))
to_remove['bssid'].append(model.get_value(iter, 1))
confirm = gtk.MessageDialog(
flags = gtk.DIALOG_MODAL,
type = gtk.MESSAGE_INFO,
buttons = gtk.BUTTONS_YES_NO,
message_format = _('Are you sure you want to discard' +
' settings for the selected networks?')
)
confirm.format_secondary_text('\n'.join(to_remove['essid']))
response = confirm.run()
if response == gtk.RESPONSE_YES:
map(wireless.DeleteWirelessNetwork, to_remove['bssid'])
wireless.ReloadConfig()
confirm.destroy()
dialog.destroy()
def toggle_encrypt_check(self, widget=None): def toggle_encrypt_check(self, widget=None):
""" Toggles the encryption key entry box for the ad-hoc dialog. """ """ Toggles the encryption key entry box for the ad-hoc dialog. """
self.key_entry.set_sensitive(self.chkbox_use_encryption.get_active()) self.key_entry.set_sensitive(self.chkbox_use_encryption.get_active())

View File

@@ -56,6 +56,9 @@ Bring up instructions on how to edit the scripts. I have implemented a way to d
.TP .TP
.BR O .BR O
Raise the Ad-Hoc network creation dialog Raise the Ad-Hoc network creation dialog
.TP
.BR X
Show the list of saved wireless networks, to be able to remove them
.SH "FILES" .SH "FILES"
.TP .TP

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-05-04 00:29+0200\n" "POT-Creation-Date: 2012-05-06 08:57+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -66,6 +66,10 @@ msgstr ""
msgid "Always switch to wired connection when available" msgid "Always switch to wired connection when available"
msgstr "" msgstr ""
#: gtk/gui.py:352
msgid "Are you sure you want to discard settings for the selected networks?"
msgstr ""
#: wicd/translations.py:77 #: wicd/translations.py:77
msgid "Authentication" msgid "Authentication"
msgstr "" msgstr ""
@@ -88,6 +92,10 @@ msgstr ""
msgid "Automatically reconnect on connection loss" msgid "Automatically reconnect on connection loss"
msgstr "" msgstr ""
#: gtk/gui.py:329
msgid "BSSID"
msgstr ""
#: curses/prefs_curses.py:113 curses/prefs_curses.py:114 #: curses/prefs_curses.py:113 curses/prefs_curses.py:114
msgid "Backend" msgid "Backend"
msgstr "" msgstr ""
@@ -364,6 +372,10 @@ msgstr ""
msgid "Key index" msgid "Key index"
msgstr "" msgstr ""
#: gtk/gui.py:309
msgid "List of saved networks"
msgstr ""
#: curses/netentry_curses.py:51 gtk/netentry.py:76 #: curses/netentry_curses.py:51 gtk/netentry.py:76
msgid "Netmask" msgid "Netmask"
msgstr "" msgstr ""
@@ -828,6 +840,14 @@ msgstr ""
msgid "Enter a hidden network to try to locate." msgid "Enter a hidden network to try to locate."
msgstr "" msgstr ""
#: data/wicd.ui:65
msgid "Forget network settings"
msgstr ""
#: data/wicd.ui:67
msgid "Remove settings for saved networks"
msgstr ""
#: data/wicd.ui:79 #: data/wicd.ui:79
msgid "_Switch Off Wi-Fi" msgid "_Switch Off Wi-Fi"
msgstr "" msgstr ""

View File

@@ -41,6 +41,7 @@ import getopt
import signal import signal
import atexit import atexit
from subprocess import Popen from subprocess import Popen
from operator import itemgetter
# DBUS # DBUS
import gobject import gobject
@@ -1306,6 +1307,27 @@ class WirelessDaemon(dbus.service.Object):
''' Returns a list of wireless interfaces on the system. ''' ''' Returns a list of wireless interfaces on the system. '''
return wnettools.GetWirelessInterfaces() return wnettools.GetWirelessInterfaces()
@dbus.service.method('org.wicd.daemon.wireless')
def GetSavedWirelessNetworks(self):
''' Returns a list of saved wireless networks. '''
ret = []
for section in self.config.sections():
if section.startswith('essid:'):
ret.append((section.replace('essid:', ''), 'None'))
else:
essid = self.config.get(section, 'essid')
ret.append((essid, section))
return sorted(ret, key=itemgetter(0))
@dbus.service.method('org.wicd.daemon.wireless')
def DeleteWirelessNetwork(self, section):
""" Deletes a wireless network section. """
section = misc.to_unicode(section)
print "Deleting wireless settings for %s (%s)" % \
(self.config.get(section, 'essid'), str(section))
self.config.remove_section(section)
self.config.write()
@dbus.service.signal(dbus_interface='org.wicd.daemon.wireless', signature='') @dbus.service.signal(dbus_interface='org.wicd.daemon.wireless', signature='')
def SendStartScanSignal(self): def SendStartScanSignal(self):
""" Emits a signal announcing a scan has started. """ """ Emits a signal announcing a scan has started. """