changeset 152:b1f1955d96b3

Primitivus: XMLUI: tabs layout management + CustomButton now used instead of urwid's buttons
author Goffi <goffi@goffi.org>
date Sat, 31 Jul 2010 00:32:51 +0800
parents 7fcb4f083686
children f197b52796ee
files frontends/primitivus/xmlui.py
diffstat 1 files changed, 31 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/frontends/primitivus/xmlui.py	Fri Jul 30 18:43:09 2010 +0800
+++ b/frontends/primitivus/xmlui.py	Sat Jul 31 00:32:51 2010 +0800
@@ -35,7 +35,7 @@
 
     def append(self, widget):
         pile = self._w.widget_list[self.idx]
-        if pile.__class__ == urwid.Text:
+        if isinstance(pile, urwid.Text):
             self._w.widget_list[self.idx] = urwid.Pile([widget])
             if self.idx == 1:
                 self._w.set_focus(1)
@@ -44,6 +44,8 @@
             pile.item_types.append(('weight',getattr(self,'weight_'+str(self.idx))))
         self.idx = (self.idx + 1) % 2
         
+class InvalidXMLUI(Exception):
+    pass
 
 class XMLUI(urwid.WidgetWrap):
     
@@ -78,13 +80,13 @@
             elif type=="label":
                 ctrl = urwid.Text(value+": ")
             elif type=="string":
-                ctrl = urwid.Edit(edit_text = value)
+                ctrl = custom_widgets.AdvancedEdit(edit_text = value)
                 self.ctrl_list[name] = ({'type':type, 'control':ctrl})
             elif type=="password":
                 ctrl = custom_widgets.Password(edit_text = value)
                 self.ctrl_list[name] = ({'type':type, 'control':ctrl})
             elif type=="textbox":
-                ctrl = urwid.Edit(edit_text = value, multiline=True)
+                ctrl = custom_widgets.AdvancedEdit(edit_text = value, multiline=True)
                 self.ctrl_list[name] = ({'type':type, 'control':ctrl})
             elif type=="list":
                 style=[] if elem.getAttribute("multi")=='yes' else ['single']
@@ -92,66 +94,65 @@
                 self.ctrl_list[name] = ({'type':type, 'control':ctrl})
             elif type=="button":
                 callback_id = elem.getAttribute("callback_id")
-                ctrl = urwid.Button(value, on_press=self.onButtonPress)
+                ctrl = custom_widgets.CustomButton(value, on_press=self.onButtonPress)
                 ctrl.param_id = (callback_id,[field.getAttribute('name') for field in elem.getElementsByTagName("field_back")])
             else:
                 error(_("FIXME FIXME FIXME: type [%s] is not implemented") % type)  #FIXME !
                 raise NotImplementedError
             parent.append(ctrl)
 
-    def __parseChilds(self, current, elem, wanted = ['layout']):
+    def __parseChilds(self, current, elem, wanted = ['layout'], data = None):
         """Recursively parse childNodes of an elemen
         @param current: widget container with 'append' method
         @param elem: element from which childs will be parsed
         @param wanted: list of tag names that can be present in the childs to be SàT XMLUI compliant"""
         for node in elem.childNodes:
             if wanted and not node.nodeName in wanted:
-                raise Exception("Invalid XMLUI") #TODO: make a custom exception
+                raise InvalidXMLUI
             if node.nodeName == "layout":
                 type = node.getAttribute('type')
                 if type == "tabs":
-                    raise NotImplementedError
-                    self.__parseChilds(current, None, node, ['category'])
+                    tab_cont = custom_widgets.TabsContainer()
+                    self.__parseChilds(current, node, ['category'], tab_cont)
+                    current.append(tab_cont)
+                elif type == "vertical":
+                    self.__parseElems(node, current)
+                elif type == "pairs":
+                    pairs = Pairs()
+                    self.__parseElems(node, pairs)
+                    current.append(pairs)
                 else:
-                    if type == "vertical":
-                        pass
-                    elif type == "pairs":
-                        pairs = Pairs()
-                        current.append(pairs)
-                        current = pairs
-                    else:
-                        warning(_("Unknown layout, using default one"))
+                    warning(_("Unknown layout, using default one"))
                     self.__parseElems(node, current)
             elif node.nodeName == "category":
-                raise NotImplementedError
-                """name = node.getAttribute('name') 
-                if not node.nodeName in wanted or not name or not isinstance(parent,wx.Notebook):
-                    raise Exception("Invalid XMLUI") #TODO: make a custom exception
-                notebook = parent
-                tab_panel = wx.Panel(notebook, -1) 
-                tab_panel.sizer = wx.BoxSizer(wx.VERTICAL)
-                tab_panel.SetSizer(tab_panel.sizer)
-                notebook.AddPage(tab_panel, name)
-                self.__parseChilds(tab_panel, None, node, ['layout'])"""
-
+                name = node.getAttribute('name') 
+                if not name or not isinstance(data,custom_widgets.TabsContainer):
+                    raise InvalidXMLUI 
+                tab_cont = data
+                listbox = tab_cont.addTab(name)
+                self.__parseChilds(listbox.body, node, ['layout'])
             else:
                 message=_("Unknown tag")
                 error(message)
-                raise Exception(message) #TODO: raise a custom exception here
+                raise NotImplementedError
 
     def constructUI(self, xml_data):
         
         list_box = urwid.ListBox(urwid.SimpleListWalker([]))
         
         cat_dom = minidom.parseString(xml_data.encode('utf-8'))
-        top= cat_dom.documentElement
+        top=cat_dom.documentElement
         self.type = top.getAttribute("type")
         if not self.title:
             self.title = top.getAttribute("title") #TODO: manage title
         if top.nodeName != "sat_xmlui" or not self.type in ['form', 'param', 'window']:
-            raise Exception("Invalid XMLUI") #TODO: make a custom exception
+            raise InvalidXMLUI
 
         self.__parseChilds(list_box.body, cat_dom.documentElement)
+
+        assert list_box.body
+        if isinstance(list_box.body[0],custom_widgets.TabsContainer):
+            return list_box.body[0] #xxx: awfull hack cause TabsContainer is a BoxWidget, can't be inside a ListBox
         
         if self.type == 'form':
             buttons = []
@@ -162,7 +163,6 @@
             grid_wid = urwid.GridFlow(buttons,max_len+4,1,0,'center')
             list_box.body.append(grid_wid)
         
-        
         return list_box
 
     def show(self):