changeset 167:6fd053c99421

Primitivus: misc improvments on TabsContainer/FocusFrame - FocusFrame: better management of keypress - TabsContainer: new addFooter method, to add a widget on the bottom of the container
author Goffi <goffi@goffi.org>
date Mon, 09 Aug 2010 21:58:28 +0800
parents b318d2b58887
children a2655a0a4eac
files frontends/primitivus/custom_widgets.py frontends/primitivus/xmlui.py
diffstat 2 files changed, 19 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/frontends/primitivus/custom_widgets.py	Mon Aug 09 21:39:41 2010 +0800
+++ b/frontends/primitivus/custom_widgets.py	Mon Aug 09 21:58:28 2010 +0800
@@ -816,6 +816,10 @@
     """Frame which manage 'tab' key"""
 
     def keypress(self, size, key):
+        ret = urwid.Frame.keypress(self, size, key)
+        if not ret:
+            return
+        
         if key == 'tab':
             focus_list = ('header','body','footer')
             focus_idx = focus_list.index(self.focus_part)
@@ -826,7 +830,7 @@
                 if widget!=None and widget.selectable():
                     self.set_focus(focus_name)
 
-        return urwid.Frame.keypress(self, size, key)
+        return ret 
 
 class TabsContainer(urwid.WidgetWrap):
     signals = ['click']
@@ -835,14 +839,14 @@
         #self._current_tab = 0
         self._buttons_cont = ColumnsRoller()
         self.tabs = []
-        self.__frame = urwid.Frame(urwid.Filler(urwid.Text('')),urwid.Pile([self._buttons_cont,urwid.Divider(u"─")]))
+        self.__frame = FocusFrame(urwid.Filler(urwid.Text('')),urwid.Pile([self._buttons_cont,urwid.Divider(u"─")]))
         urwid.WidgetWrap.__init__(self, self.__frame)
 
-    """def selectable(self):
-        return True
-    
     def keypress(self, size, key):
-        return key"""
+        if key=='tab':
+            self._w.keypress(size,key)
+            return
+        return self._w.keypress(size,key)
 
     def __buttonClicked(self, button, invisible=False):
         """Called when a button on the tab is changed,
@@ -880,6 +884,12 @@
         self.__appendButton(name)
         return listbox
 
+    def addFooter(self, widget):
+        """Add a widget on the bottom of the tab (will be displayed on all pages)
+        @param widget: FlowWidget"""
+        self._w.footer = widget
+    
+
 ## DECORATORS ##
 class LabelLine(urwid.LineBox):
     """Like LineBox, but with a Label centered in the top line"""
--- a/frontends/primitivus/xmlui.py	Mon Aug 09 21:39:41 2010 +0800
+++ b/frontends/primitivus/xmlui.py	Mon Aug 09 21:58:28 2010 +0800
@@ -164,7 +164,7 @@
         assert ret_wid.body
         
         if isinstance(ret_wid.body[0],custom_widgets.TabsContainer):
-            ret_wid = urwid.Pile([ret_wid.body[0]]) #xxx: awfull hack cause TabsContainer is a BoxWidget, can't be inside a ListBox
+            ret_wid = ret_wid.body[0] #xxx: awfull hack cause TabsContainer is a BoxWidget, can't be inside a ListBox
         
         
         if self.type == 'form':
@@ -176,15 +176,13 @@
             grid_wid = urwid.GridFlow(buttons,max_len+4,1,0,'center')
             ret_wid.body.append(grid_wid)
         elif self.type == 'param':
-            assert(isinstance(ret_wid,urwid.Pile))
+            assert(isinstance(ret_wid,custom_widgets.TabsContainer))
             buttons = []
             buttons.append(custom_widgets.CustomButton(_('Save'),self.onSaveParams))
             buttons.append(custom_widgets.CustomButton(_('Cancel'),lambda x:self.host.removeWindow()))
             max_len = max([button.getSize() for button in buttons])
             grid_wid = urwid.GridFlow(buttons,max_len,1,0,'center')
-            ret_wid.widget_list.append(urwid.Filler(grid_wid))
-            ret_wid.item_types.append(('weight',1))
-        
+            ret_wid.addFooter(grid_wid)
         return ret_wid
 
     def show(self):