From 0b0f3e09687e643e34478f1821a926c1c5259f07 Mon Sep 17 00:00:00 2001 From: Andrew Psaltis Date: Fri, 2 Jan 2009 22:12:58 -0500 Subject: [PATCH] curses/curses_misc.py: meta+right or meta+left now move the selected tab right and left respectively. Focus goes back to the tabs, though. Fixed a bug in ComboBox where show_first does nothing Restored get_selected to its original state curses/prefs_curses.py: Moved the automatic reconnect category to "General Settings" Made the backend selector actually select the selected backend at first Reset the button statuses each time we load the settings meta+enter now saves+closes the preferences dialog curses/wicd-curses.py: Turned the wired list into a list of custom SelTexts, so that they can do the connecting/script-choosing/configuring/etc, instead of the dialog itself Offset the version in the about dialog a little less Recycle the old preferences dialog instead of making a new one if we run it more than once --- curses/curses_misc.py | 31 +++++++----- curses/prefs_curses.py | 40 +++++++++++----- curses/wicd-curses.py | 106 +++++++++++++++++++++++++++-------------- 3 files changed, 115 insertions(+), 62 deletions(-) diff --git a/curses/curses_misc.py b/curses/curses_misc.py index 91d9c2a..478dbcd 100644 --- a/curses/curses_misc.py +++ b/curses/curses_misc.py @@ -120,15 +120,19 @@ class TabColumns(urwid.WidgetWrap): def keypress(self,size,key): self._w.keypress(size,key) - wid = self.pile.get_focus().get_body() - if wid == self.columns: - # lw = self.listbox.body - # lw.pop(1) - self.active_tab.set_attr('body') - self.columns.get_focus().set_attr('tab active') - self.active_tab = self.columns.get_focus() - self.gen_pile(self.tab_map[self.active_tab]) - return key + if key == "meta left" or key == "meta right": + self._w.get_body().set_focus(0) + self.keypress(size,key[5:]) + else: + wid = self.pile.get_focus().get_body() + if wid == self.columns: + # lw = self.listbox.body + # lw.pop(1) + self.active_tab.set_attr('body') + self.columns.get_focus().set_attr('tab active') + self.active_tab = self.columns.get_focus() + self.gen_pile(self.tab_map[self.active_tab]) + return key # self.listbox.body = lw @@ -144,7 +148,7 @@ class ComboBox(urwid.WidgetWrap): """A ComboBox of text objects""" class ComboSpace(urwid.WidgetWrap): """The actual menu-like space that comes down from the ComboText""" - def __init__(self,list,body,ui,show_first=0,pos=(0,0),attr=('body','focus')): + def __init__(self,list,body,ui,show_first,pos=(0,0),attr=('body','focus')): """ body : parent widget list : stuff to include in the combobox @@ -163,6 +167,7 @@ class ComboBox(urwid.WidgetWrap): content = [urwid.AttrWrap(SelText(w), attr[0], attr[1]) for w in list] self._listbox = urwid.ListBox(content) + self._listbox.set_focus(show_first) overlay = urwid.Overlay(self._listbox, body, ('fixed left', pos[0]), width + 2, ('fixed top', pos[1]), height) @@ -233,9 +238,9 @@ class ComboBox(urwid.WidgetWrap): def set_show_first(self,show_first): self.show_first = show_first - def build_combobox(self,body,ui,row,show_first=0): + def build_combobox(self,body,ui,row): str,trash = self.label.get_text() - self.cbox = urwid.AttrWrap(SelText([self.list[show_first]+' vvv']), + self.cbox = urwid.AttrWrap(SelText([self.list[self.show_first]+' vvv']), self.attr[0],self.attr[1]) if str != '': w = urwid.Columns([('fixed',len(str),self.label),self.cbox],dividechars=1) @@ -271,7 +276,7 @@ class ComboBox(urwid.WidgetWrap): # Return the index of the selected element def get_selected(self): wid,pos = self.overlay._listbox.get_focus() - return pos + return (wid,pos) # Almost completely ripped from rbreu_filechooser.py: diff --git a/curses/prefs_curses.py b/curses/prefs_curses.py index 3dd275a..3a191a3 100644 --- a/curses/prefs_curses.py +++ b/curses/prefs_curses.py @@ -79,6 +79,9 @@ class PrefsDialog(urwid.WidgetWrap): wired_auto_2_t = language['show_wired_list'] wired_auto_3_t = language['use_last_used_profile'] + auto_reconn_cat_t = ('header','Automatic Reconnection') + auto_reconn_t = 'Automatically reconnect on connection loss' + #### External Programs automatic_t = language['wicd_auto_config'] @@ -113,8 +116,6 @@ class PrefsDialog(urwid.WidgetWrap): wless_cat_t = ('header','Wireless Interface') use_dbm_t = language['display_type_dialog'] - auto_reconn_cat_t = ('header','Automatic Reconnect') - auto_reconn_t = 'Automatically reconnect on connection loss' #### @@ -145,6 +146,9 @@ class PrefsDialog(urwid.WidgetWrap): self.wired_auto_1 = urwid.RadioButton(self.wired_auto_l,wired_auto_1_t) self.wired_auto_2 = urwid.RadioButton(self.wired_auto_l,wired_auto_2_t) self.wired_auto_3 = urwid.RadioButton(self.wired_auto_l,wired_auto_3_t) + + self.auto_reconn_cat = urwid.Text(auto_reconn_cat_t) + self.auto_reconn_checkb = urwid.CheckBox(auto_reconn_t) generalLB = urwid.ListBox([self.net_cat, self.wless_edit,#_blank, self.wired_edit, @@ -156,7 +160,9 @@ class PrefsDialog(urwid.WidgetWrap): self.wired_auto_cat, self.wired_auto_1, self.wired_auto_2, - self.wired_auto_3 + self.wired_auto_3, _blank, + self.auto_reconn_cat, + self.auto_reconn_checkb ]) #### External Programs tab @@ -207,8 +213,6 @@ class PrefsDialog(urwid.WidgetWrap): self.wless_cat = urwid.Text(wless_cat_t) self.use_dbm_checkb = urwid.CheckBox(use_dbm_t) - self.auto_reconn_cat = urwid.Text(auto_reconn_cat_t) - self.auto_reconn_checkb = urwid.CheckBox(auto_reconn_t) advancedLB = urwid.ListBox([self.wpa_cat, self.wpa_cbox,self.wpa_warn,_blank, @@ -217,9 +221,8 @@ class PrefsDialog(urwid.WidgetWrap): self.debug_cat, self.debug_mode_checkb, _blank, self.wless_cat, - self.use_dbm_checkb, _blank, - self.auto_reconn_cat, - self.auto_reconn_checkb]) + self.use_dbm_checkb, _blank + ]) headerList = [self.header0,self.header1,self.header2] @@ -260,6 +263,10 @@ class PrefsDialog(urwid.WidgetWrap): self.__super.__init__(self.tabs) def load_settings(self): + # Reset the buttons + self.CANCEL_PRESSED = False + self.OK_PRESSED = False + ### General Settings # Urwid does not like dbus.Strings as text markups wless_iface = unicode(daemon.GetWirelessInterface()) @@ -282,6 +289,8 @@ class PrefsDialog(urwid.WidgetWrap): # Wired Automatic Connection self.wired_auto_l[daemon.GetWiredAutoConnectMethod()-1] + self.auto_reconn_checkb.set_state(daemon.GetAutoReconnect()) + ### External Programs dhcp_method = daemon.GetDHCPClient() self.dhcp_l[dhcp_method].set_state(True) @@ -314,11 +323,15 @@ class PrefsDialog(urwid.WidgetWrap): self.backends.remove('') self.thebackends= [unicode(w) for w in self.backends] self.backend_cbox.set_list(self.thebackends) + cur_backend = daemon.GetSavedBackend() + try: + self.backend_cbox.set_show_first(self.thebackends.index(cur_backend)) + except ValueError: + self.backend_cbox.set_show_first(0) - # Three last checkboxes + # Two last checkboxes self.debug_mode_checkb.set_state(daemon.GetDebugMode()) self.use_dbm_checkb.set_state(daemon.GetSignalDisplayType()) - self.auto_reconn_checkb.set_state(daemon.GetAutoReconnect()) def save_results(self): """ Pushes the selected settings to the daemon. @@ -329,7 +342,7 @@ class PrefsDialog(urwid.WidgetWrap): self.search_dom.get_edit_text()) daemon.SetWirelessInterface(self.wless_edit.get_edit_text()) daemon.SetWiredInterface(self.wired_edit.get_edit_text()) - daemon.SetWPADriver(self.wpadrivers[self.wpa_cbox.get_selected()]) + daemon.SetWPADriver(self.wpadrivers[self.wpa_cbox.get_selected()[1]]) daemon.SetAlwaysShowWiredInterface(self.always_show_wired_checkb.get_state()) daemon.SetAutoReconnect(self.auto_reconn_checkb.get_state()) daemon.SetDebugMode(self.debug_mode_checkb.get_state()) @@ -341,7 +354,7 @@ class PrefsDialog(urwid.WidgetWrap): else: daemon.SetWiredAutoConnectMethod(1) - daemon.SetBackend(self.backends[self.backend_cbox.get_selected()]) + daemon.SetBackend(self.backends[self.backend_cbox.get_selected()[1]]) # External Programs Tab if self.dhcp0.get_state(): @@ -410,9 +423,10 @@ class PrefsDialog(urwid.WidgetWrap): for k in keys: #Send key to underlying widget: overlay.keypress(dim, k) + # Check if buttons are pressed. if self.CANCEL_PRESSED: return False - if self.OK_PRESSED in keys: + if self.OK_PRESSED or 'meta enter' in keys: return True diff --git a/curses/wicd-curses.py b/curses/wicd-curses.py index aa5ac35..eb63cc0 100644 --- a/curses/wicd-curses.py +++ b/curses/wicd-curses.py @@ -185,24 +185,10 @@ def gen_network_list(): wlessL = [] for network_id in range(0, wireless.GetNumberOfNetworks()): - # ?: in python - encryption = wireless.GetWirelessProperty(network_id, 'encryption_method') if wireless.GetWirelessProperty(network_id, 'encryption') else 'Unsecured' - theString = ' %*s %25s %9s %17s %6s: %s' % ( gap, - daemon.FormatSignalForPrinting( - str(wireless.GetWirelessProperty(network_id, strenstr))), - wireless.GetWirelessProperty(network_id, 'essid'), - #wireless.GetWirelessProperty(network_id, 'encryption_method'), - encryption, - wireless.GetWirelessProperty(network_id, 'bssid'), - wireless.GetWirelessProperty(network_id, 'mode'), # Master, Ad-Hoc - wireless.GetWirelessProperty(network_id, 'channel') - ) is_active = wireless.GetCurrentSignalStrength("") != 0 and wireless.GetCurrentNetworkID(wireless.GetIwconfig())==network_id - if is_active: - theString = '>'+theString[1:] - wlessL.append(urwid.AttrWrap(SelText(theString),'connected','connected focus')) - else: - wlessL.append(urwid.AttrWrap(SelText(theString),'body','focus')) + + label = NetLabel(network_id,is_active) + wlessL.append(label) return (wiredL,wlessL) def about_dialog(body): @@ -215,7 +201,7 @@ def about_dialog(body): ('green'," /// \\\\\\")," | |/ |/ / / __/ _ / \n", ('green',"/|| // \\\\ ||\\")," |__/|__/_/\__/\_,_/ \n", ('green',"||| ||"),"(|^|)",('green',"|| |||"), -" ($VERSION) \n".replace("$VERSION",daemon.Hello()), +" ($VERSION) \n".replace("$VERSION",daemon.Hello()), ('green',"\\|| \\\\")," |+| ",('green',"// ||/ \n"), ('green'," \\\\\\")," |+| ",('green',"///")," http://wicd.net \n", @@ -242,6 +228,50 @@ def about_dialog(body): if about.b_pressed == 'OK': return False +class NetLabel(urwid.WidgetWrap): + def __init__(self, id, is_active): + # Pick which strength measure to use based on what the daemon says + if daemon.GetSignalDisplayType() == 0: + strenstr = 'quality' + gap = 3 + else: + strenstr = 'strength' + gap = 5 + self.id = id + # All of that network property stuff + self.stren = daemon.FormatSignalForPrinting( + str(wireless.GetWirelessProperty(id, strenstr))) + self.essid = wireless.GetWirelessProperty(id, 'essid') + self.bssid = wireless.GetWirelessProperty(id, 'bssid') + self.encrypt = wireless.GetWirelessProperty(id,'encryption_method') if wireless.GetWirelessProperty(id, 'encryption') else 'Unsecured' + self.mode = wireless.GetWirelessProperty(id, 'mode') # Master, Ad-Hoc + self.channel = wireless.GetWirelessProperty(id, 'channel') + theString = ' %*s %25s %9s %17s %6s: %s' % (gap, + self.stren,self.essid,self.encrypt,self.bssid,self.mode,self.channel) + if is_active: + theString = '>'+theString[1:] + w = urwid.AttrWrap(SelText(theString),'connected','connected focus') + else: + w = urwid.AttrWrap(SelText(theString),'body','focus') + + self.__super.__init__(w) + def selectable(self): + return True + def keypress(self,size,key): + self._w.keypress(size,key) + if key == 'C': + # Configure the network + pass + elif key == 'S': + # Configure scripts + pass + elif key == 'enter': + self.connect() + return key + def connect(self): + # This should work. + wireless.ConnectWireless(self.id) + ######################################## ##### APPLICATION INTERFACE CLASS ######################################## @@ -299,8 +329,10 @@ class appGUI(): self.prev_state = False self.connecting = False self.screen_locked = False - self.connecting = False self.always_show_wired = daemon.GetAlwaysShowWiredInterface() + + self.pref = None + self.update_status() #self.dialog = PrefOverlay(self.frame,self.size) @@ -406,7 +438,7 @@ class appGUI(): # If we are connecting and being called from the idle function, spin # the wheel. if from_idle and self.connecting: - # This is probably the wrong way to do this, but ir works for now. + # This is probably the wrong way to do this, but it works for now. toAppend=self.twirl[self.incr % 4] self.footer2 = urwid.AttrWrap(urwid.Text(text+' '+toAppend),'important') self.frame.set_footer(urwid.BoxAdapter( @@ -463,6 +495,7 @@ class appGUI(): if "f5" in keys: wireless.Scan() if "enter" in keys: + # TODO: Make this totally go away by superclassing ComboBox # Should be a function of the labels, I think. self.call_connect() if "D" in keys: @@ -476,11 +509,11 @@ class appGUI(): # Prevents automatic reconnecting if that option is enabled daemon.SetForcedDisconnect(True) if "P" in keys: - dialog = PrefsDialog(self.frame,(0,1),ui, - dbusmanager.get_dbus_ifaces()) - # There is some lag in using the buttons. Not my fault. - if dialog.run(ui,self.size,self.frame): - dialog.save_results() + if not self.pref: + self.pref = PrefsDialog(self.frame,(0,1),ui, + dbusmanager.get_dbus_ifaces()) + if self.pref.run(ui,self.size,self.frame): + self.pref.save_results() self.update_ui() if "A" in keys: about_dialog(self.frame) @@ -491,13 +524,15 @@ class appGUI(): self.frame.keypress( self.size, k ) if " " in keys: - #self.set_status('space pressed on wiredCB!') - wid,pos = self.wiredCB.get_body().get_selected() - text,attr = wid.get_text() - wired.ReadWiredNetworkProfile(text) - # Make sure our internal reference to the combobox matches the - # one found in the pile. - self.wiredCB = self.thePile.get_focus() + focus = self.thePile.get_focus() + if focus == self.wiredCB: + #self.set_status('space pressed on wiredCB!') + wid,pos = self.wiredCB.get_body().get_selected() + text,attr = wid.get_text() + wired.ReadWiredNetworkProfile(text) + # Make sure our internal reference to the combobox matches the + # one found in the pile. + #self.wiredCB = self.thePile.get_focus() return True @@ -510,9 +545,8 @@ class appGUI(): self.connect(self,'wired',0) #return "Wired network %i" % pos elif wid is self.wlessLB: - #self.footer1 = urwid.Text("Wireless!") - wid2,pos = self.wlessLB.get_focus() - self.connect(self,'wireless',pos) + # Do nothing + pass else: self.set_status("call_connect() failed! This is definitely a bug!") #return "Failure!" @@ -602,7 +636,7 @@ def setup_dbus(force=True): # Suggestions as to what should go here print "Can't connect to the daemon. Are you sure it is running?" print "Please check the wicd log for error messages." - raise + #raise # return False # <- Will need soon. bus = dbusmanager.get_bus() dbus_ifaces = dbusmanager.get_dbus_ifaces()