diff frontends/src/wix/xmlui.py @ 1106:e2e1e27a3680

frontends: XMLUI refactoring + dialogs: - there are now XMLUIPanel and XMLUIDialog both inheriting from XMLUIBase - following dialogs are managed: - MessageDialog - NoteDialog - ConfirmDialog - FileDialog - XMLUI creation is now made using xmlui.create(...) instead of instanciating directly XMLUI - classes must be registed in frontends - "parent" attribute renamed to "_xmlui_parent" to avoid name conflicts with frontends toolkits
author Goffi <goffi@goffi.org>
date Wed, 13 Aug 2014 14:48:49 +0200
parents 8e0072754413
children f91e7028e2c3
line wrap: on
line diff
--- a/frontends/src/wix/xmlui.py	Mon Aug 11 19:10:24 2014 +0200
+++ b/frontends/src/wix/xmlui.py	Wed Aug 13 14:48:49 2014 +0200
@@ -23,9 +23,8 @@
 import wx
 from sat.core.log import getLogger
 log = getLogger(__name__)
-from sat.tools.jid  import JID
 from sat_frontends.tools import xmlui
-from sat_frontends.constants import Const
+from sat_frontends.constants import Const as C
 
 
 class EventWidget(object):
@@ -53,20 +52,20 @@
 
 class EmptyWidget(WixWidget, xmlui.EmptyWidget, wx.Window):
 
-    def __init__(self, parent):
-        wx.Window.__init__(self, parent, -1)
+    def __init__(self, _xmlui_parent):
+        wx.Window.__init__(self, _xmlui_parent, -1)
 
 
 class TextWidget(WixWidget, xmlui.TextWidget, wx.StaticText):
 
-    def __init__(self, parent, value):
-        wx.StaticText.__init__(self, parent, -1, value)
+    def __init__(self, _xmlui_parent, value):
+        wx.StaticText.__init__(self, _xmlui_parent, -1, value)
 
 
 class LabelWidget(xmlui.LabelWidget, TextWidget):
 
-    def __init__(self, parent, value):
-        super(LabelWidget, self).__init__(parent, value+": ")
+    def __init__(self, _xmlui_parent, value):
+        super(LabelWidget, self).__init__(_xmlui_parent, value+": ")
 
 
 class JidWidget(xmlui.JidWidget, TextWidget):
@@ -75,49 +74,49 @@
 
 class DividerWidget(WixWidget, xmlui.DividerWidget, wx.StaticLine):
 
-    def __init__(self, parent, style='line'):
-        wx.StaticLine.__init__(self, parent, -1)
+    def __init__(self, _xmlui_parent, style='line'):
+        wx.StaticLine.__init__(self, _xmlui_parent, -1)
 
 
 class StringWidget(EventWidget, ValueWidget, xmlui.StringWidget, wx.TextCtrl):
     _xmlui_change_event = wx.EVT_TEXT
 
-    def __init__(self, parent, value, read_only=False):
+    def __init__(self, _xmlui_parent, value, read_only=False):
         style = wx.TE_READONLY if read_only else 0
-        wx.TextCtrl.__init__(self, parent, -1, value, style=style)
+        wx.TextCtrl.__init__(self, _xmlui_parent, -1, value, style=style)
         self._xmlui_proportion = 1
 
 
 class PasswordWidget(EventWidget, ValueWidget, xmlui.PasswordWidget, wx.TextCtrl):
     _xmlui_change_event = wx.EVT_TEXT
 
-    def __init__(self, parent, value, read_only=False):
+    def __init__(self, _xmlui_parent, value, read_only=False):
         style = wx.TE_PASSWORD
         if read_only:
             style |= wx.TE_READONLY
-        wx.TextCtrl.__init__(self, parent, -1, value, style=style)
+        wx.TextCtrl.__init__(self, _xmlui_parent, -1, value, style=style)
         self._xmlui_proportion = 1
 
 
 class TextBoxWidget(EventWidget, ValueWidget, xmlui.TextBoxWidget, wx.TextCtrl):
     _xmlui_change_event = wx.EVT_TEXT
 
-    def __init__(self, parent, value, read_only=False):
+    def __init__(self, _xmlui_parent, value, read_only=False):
         style = wx.TE_MULTILINE
         if read_only:
             style |= wx.TE_READONLY
-        wx.TextCtrl.__init__(self, parent, -1, value, style=style)
+        wx.TextCtrl.__init__(self, _xmlui_parent, -1, value, style=style)
         self._xmlui_proportion = 1
 
 
 class BoolWidget(EventWidget, ValueWidget, xmlui.BoolWidget, wx.CheckBox):
     _xmlui_change_event = wx.EVT_CHECKBOX
 
-    def __init__(self, parent, state, read_only=False):
+    def __init__(self, _xmlui_parent, state, read_only=False):
         style = wx.CHK_2STATE
         if read_only:
             style |= wx.TE_READONLY
-        wx.CheckBox.__init__(self, parent, -1, "", style=wx.CHK_2STATE)
+        wx.CheckBox.__init__(self, _xmlui_parent, -1, "", style=wx.CHK_2STATE)
         self.SetValue(state)
         self._xmlui_proportion = 1
 
@@ -131,22 +130,22 @@
 class ButtonWidget(EventWidget, WixWidget, xmlui.ButtonWidget, wx.Button):
     _xmlui_change_event = wx.EVT_BUTTON
 
-    def __init__(self, parent, value, click_callback):
-        wx.Button.__init__(self, parent, -1, value)
+    def __init__(self, _xmlui_parent, value, click_callback):
+        wx.Button.__init__(self, _xmlui_parent, -1, value)
         self._xmlui_click_callback = click_callback
-        parent.Bind(wx.EVT_BUTTON, lambda evt: click_callback(evt.GetEventObject()), self)
-        self.parent = parent
+        _xmlui_parent.Bind(wx.EVT_BUTTON, lambda evt: click_callback(evt.GetEventObject()), self)
+        self._xmlui_parent = _xmlui_parent
 
     def _xmluiOnClick(self, callback):
-        self.parent.Bind(wx.EVT_BUTTON, lambda evt: callback(evt.GetEventObject()), self)
+        self._xmlui_parent.Bind(wx.EVT_BUTTON, lambda evt: callback(evt.GetEventObject()), self)
 
 
 class ListWidget(EventWidget, WixWidget, xmlui.ListWidget, wx.ListBox):
     _xmlui_change_event = wx.EVT_LISTBOX
 
-    def __init__(self, parent, options, selected, flags):
+    def __init__(self, _xmlui_parent, options, selected, flags):
         styles = wx.LB_MULTIPLE if not 'single' in flags else wx.LB_SINGLE
-        wx.ListBox.__init__(self, parent, -1, choices=[option[1] for option in options], style=styles)
+        wx.ListBox.__init__(self, _xmlui_parent, -1, choices=[option[1] for option in options], style=styles)
         self._xmlui_attr_map = {label: value for value, label in options}
         self._xmlui_proportion = 1
         self._xmluiSelectValues(selected)
@@ -192,8 +191,8 @@
 
 class AdvancedListContainer(WixContainer, xmlui.AdvancedListContainer, wx.ScrolledWindow):
 
-    def __init__(self, parent, columns, selectable='no'):
-        wx.ScrolledWindow.__init__(self, parent)
+    def __init__(self, _xmlui_parent, columns, selectable='no'):
+        wx.ScrolledWindow.__init__(self, _xmlui_parent)
         self._xmlui_selectable = selectable != 'no'
         if selectable:
             columns += 1
@@ -230,8 +229,8 @@
 
 class PairsContainer(WixContainer, xmlui.PairsContainer, wx.Panel):
 
-    def __init__(self, parent):
-        wx.Panel.__init__(self, parent)
+    def __init__(self, _xmlui_parent):
+        wx.Panel.__init__(self, _xmlui_parent)
         self.sizer = wx.FlexGridSizer(cols=2)
         self.sizer.AddGrowableCol(1) #The growable column need most of time to be the right one in pairs
         self.SetSizer(self.sizer)
@@ -239,8 +238,8 @@
 
 class TabsContainer(WixContainer, xmlui.TabsContainer, wx.Notebook):
 
-    def __init__(self, parent):
-        wx.Notebook.__init__(self, parent, -1, style=wx.NB_LEFT if self._xmlui_main.type=='param' else 0)
+    def __init__(self, _xmlui_parent):
+        wx.Notebook.__init__(self, _xmlui_parent, -1, style=wx.NB_LEFT if self._xmlui_main.type=='param' else 0)
 
     def _xmluiAddTab(self, label):
         tab_panel = wx.Panel(self, -1)
@@ -253,30 +252,109 @@
 
 class VerticalContainer(WixContainer, xmlui.VerticalContainer, wx.Panel):
 
-    def __init__(self, parent):
-        wx.Panel.__init__(self, parent)
+    def __init__(self, _xmlui_parent):
+        wx.Panel.__init__(self, _xmlui_parent)
         self.sizer = wx.BoxSizer(wx.VERTICAL)
         self.SetSizer(self.sizer)
 
 
-class WidgetFactory(object):
+## Dialogs ##
+
+
+class WixDialog(object):
+
+    def __init__(self, _xmlui_parent, level):
+        self.host = _xmlui_parent.host
+        self.ok_cb = None
+        self.cancel_cb = None
+        if level == C.XMLUI_DATA_LVL_INFO:
+            self.flags = wx.ICON_INFORMATION
+        elif level == C.XMLUI_DATA_LVL_ERROR:
+            self.flags = wx.ICON_ERROR
+        else:
+            self.flags = wx.ICON_INFORMATION
+            log.warning(_("Unmanaged dialog level: %s") % level)
+
+    def _xmluiShow(self):
+        answer = self.ShowModal()
+        if answer == wx.ID_YES or answer == wx.ID_OK:
+            self._xmluiValidated()
+        else:
+            self._xmluiCancelled()
+
+    def _xmluiClose(self):
+        self.Destroy()
+
+
+class MessageDialog(WixDialog, xmlui.MessageDialog, wx.MessageDialog):
+
+    def __init__(self, _xmlui_parent, title, message, level):
+        WixDialog.__init__(self, _xmlui_parent, level)
+        xmlui.MessageDialog.__init__(self, _xmlui_parent)
+        self.flags |= wx.OK
+        wx.MessageDialog.__init__(self, _xmlui_parent.host, message, title, style = self.flags)
+
+
+class NoteDialog(xmlui.NoteDialog, MessageDialog):
+    # TODO: separate NoteDialog
+    pass
+
+
+class ConfirmDialog(WixDialog, xmlui.ConfirmDialog, wx.MessageDialog):
+
+    def __init__(self, _xmlui_parent, title, message, level, buttons_set):
+        WixDialog.__init__(self, _xmlui_parent, level)
+        xmlui.ConfirmDialog.__init__(self, _xmlui_parent)
+        if buttons_set == C.XMLUI_DATA_BTNS_SET_YESNO:
+            self.flags |= wx.YES_NO
+        else:
+            self.flags |= wx.OK | wx.CANCEL
+        wx.MessageDialog.__init__(self, _xmlui_parent.host, message, title, style = self.flags)
+
+
+class FileDialog(WixDialog, xmlui.FileDialog, wx.FileDialog):
+
+    def __init__(self, _xmlui_parent, title, message, level, filetype):
+        # TODO: message and filetype are not managed yet
+        WixDialog.__init__(self, _xmlui_parent, level)
+        self.flags = wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT # FIXME: use the legacy flags, but must manage cases like dir or open
+        xmlui.FileDialog.__init__(self, _xmlui_parent)
+        wx.FileDialog.__init__(self, _xmlui_parent.host, title, style = self.flags)
+
+    def _xmluiShow(self):
+        answer = self.ShowModal()
+        if answer == wx.ID_OK:
+            self._xmluiValidated({'path': self.GetPath()})
+        else:
+            self._xmluiCancelled()
+
+
+class GenericFactory(object):
 
     def __getattr__(self, attr):
         if attr.startswith("create"):
             cls = globals()[attr[6:]]
+            return cls
+
+
+class WidgetFactory(GenericFactory):
+
+    def __getattr__(self, attr):
+        if attr.startswith("create"):
+            cls = GenericFactory.__getattr__(self, attr)
             cls._xmlui_main = self._xmlui_main
             return cls
 
 
-class XMLUI(xmlui.XMLUI, wx.Frame):
+class XMLUIPanel(xmlui.XMLUIPanel, wx.Frame):
     """Create an user interface from a SàT XML"""
     widget_factory = WidgetFactory()
 
-    def __init__(self, host, xml_data, title=None, flags = None,):
+    def __init__(self, host, parsed_xml, title=None, flags = None,):
         self.widget_factory._xmlui_main = self
-        xmlui.XMLUI.__init__(self, host, xml_data, title, flags)
+        xmlui.XMLUIPanel.__init__(self, host, parsed_xml, title, flags)
 
-    def constructUI(self, xml_data):
+    def constructUI(self, parsed_dom):
         style = wx.DEFAULT_FRAME_STYLE & ~wx.CLOSE_BOX if 'NO_CANCEL' in self.flags else wx.DEFAULT_FRAME_STYLE
         wx.Frame.__init__(self, None, style=style)
         self.sizer = wx.BoxSizer(wx.VERTICAL)
@@ -302,7 +380,7 @@
             self.sizer.Fit(self)
             self.Show()
 
-        super(XMLUI, self).constructUI(xml_data, postTreat)
+        super(XMLUIPanel, self).constructUI(parsed_dom, postTreat)
         if not 'NO_CANCEL' in self.flags:
             self.Bind(wx.EVT_CLOSE, self.onClose, self)
         self.MakeModal()
@@ -314,12 +392,12 @@
     ###events
 
     def onParamChange(self, ctrl):
-        super(XMLUI, self).onParamChange(ctrl)
+        super(XMLUIPanel, self).onParamChange(ctrl)
 
     def onFormSubmitted(self, event):
         """Called when submit button is clicked"""
         button = event.GetEventObject()
-        super(XMLUI, self).onFormSubmitted(button)
+        super(XMLUIPanel, self).onFormSubmitted(button)
 
     def onClose(self, event):
         """Close event: we have to send the form."""
@@ -330,3 +408,11 @@
             self._xmluiClose()
         event.Skip()
 
+
+class XMLUIDialog(xmlui.XMLUIDialog):
+    dialog_factory = WidgetFactory()
+
+
+xmlui.registerClass(xmlui.CLASS_PANEL, XMLUIPanel)
+xmlui.registerClass(xmlui.CLASS_DIALOG, XMLUIDialog)
+create = xmlui.create