commit-gnue
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gnue] r8158 - trunk/gnue-forms/src/uidrivers/wx26


From: johannes
Subject: [gnue] r8158 - trunk/gnue-forms/src/uidrivers/wx26
Date: Fri, 10 Feb 2006 05:28:33 -0600 (CST)

Author: johannes
Date: 2006-02-10 05:28:33 -0600 (Fri, 10 Feb 2006)
New Revision: 8158

Modified:
   trunk/gnue-forms/src/uidrivers/wx26/dialogs.py
Log:
Fixed the InputDialog to behave the same way on wxMSW, wxGTK and wxMac


Modified: trunk/gnue-forms/src/uidrivers/wx26/dialogs.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/wx26/dialogs.py      2006-02-10 07:57:47 UTC 
(rev 8157)
+++ trunk/gnue-forms/src/uidrivers/wx26/dialogs.py      2006-02-10 11:28:33 UTC 
(rev 8158)
@@ -67,7 +67,7 @@
     bold.SetWeight (wx.FONTWEIGHT_BOLD)
 
     # On Windows the SMALL_FONT is really too small
-    if '__WXMSW__' in wx.PlatformInfo:
+    if 'wxMSW' in wx.PlatformInfo:
       small = wx.NORMAL_FONT
     else:
       small = wx.SMALL_FONT
@@ -179,7 +179,6 @@
 
     self.inputData   = {}
     self.__dropdowns = {}
-    self.__controls  = []
     self.__lastEntry = None
 
     row = 0
@@ -187,27 +186,24 @@
       ftp = fieldtype.lower ()
 
       if ftp in ['label', 'warning']:
-        self.__add_text (row, label, ftp == 'warning')
+        self.__addText (row, label, ftp == 'warning')
 
       elif ftp == 'image':
         self.__addImage (row, name)
 
-      elif ftp == 'string':
-        self.__add_string (row, label, name, default, elements)
+      elif ftp in ['string', 'password']:
+        self.__addString (row, label, name, default, elements, ftp != 'string')
 
-      elif ftp == 'password':
-        self.__add_string (row, label, name, default, elements, True)
-
       elif ftp == 'dropdown':
-        self.__add_dropdown (row, label, name, default, master, elements)
+        self.__addChoice (row, label, name, default, master, elements)
 
-      gbs.AddGrowableCol (1)
       row += 1
 
+    gbs.AddGrowableCol (1)
     topSizer.Add (gbs, 1, wx.EXPAND | wx.ALL, 6)
 
-    topSizer.Add (wx.StaticLine (self, wx.ID_STATIC, wx.DefaultPosition,
-      wx.DefaultSize, wx.LI_HORIZONTAL), 0, wx.EXPAND | wx.LEFT | wx.RIGHT, 8)
+    topSizer.Add (wx.StaticLine (self, wx.ID_STATIC, style = wx.LI_HORIZONTAL),
+      0, wx.EXPAND | wx.LEFT | wx.RIGHT, 8)
 
     buttonSizer = self.CreateButtonSizer (wx.OK | (cancel and wx.CANCEL or 0) |
         wx.NO_DEFAULT)
@@ -215,18 +211,14 @@
 
     self.SetSizerAndFit (topSizer)
 
-    if self.__controls:
-      self.__controls [0].SetFocus ()
-
     self.CenterOnScreen ()
 
 
-
   # ---------------------------------------------------------------------------
   # Add a centered, static label or warning
   # ---------------------------------------------------------------------------
 
-  def __add_text (self, row, label, warning = False):
+  def __addText (self, row, label, warning = False):
 
     text = wx.StaticText (self, -1, label, style = wx.ALIGN_CENTRE)
 
@@ -237,42 +229,39 @@
         wx.ALIGN_CENTER_HORIZONTAL)
 
 
-
   # ---------------------------------------------------------------------------
   # Add a text control for a string or a password
   # ---------------------------------------------------------------------------
 
-  def __add_string (self, row, label, name, default, elements, pwd = False):
+  def __addString (self, row, label, name, default, elements, pwd = False):
 
     text = wx.StaticText (self, wx.ID_ANY, label)
     self.gbs.Add (text, (row, 0), flag = wx.ALIGN_CENTER_VERTICAL)
 
+    self.inputData [name] = default or ''
+
     eStyle = wx.TE_PROCESS_ENTER
     if pwd:
       eStyle |= wx.TE_PASSWORD
 
-    self.inputData [name] = default or ''
-
     entry = wx.TextCtrl (self, wx.ID_ANY, default or '', style = eStyle)
     entry._field = name
 
     if elements and elements [0][0]:
       entry.SetToolTip (wx.ToolTip (elements [0][0]))
 
-    wx.EVT_TEXT (entry, -1, self.__entryChanged)
-    wx.EVT_TEXT_ENTER (entry, -1, self.__enterPressed)
+    self.Bind (wx.EVT_TEXT, self.OnEntryChanged, entry)
+    self.Bind (wx.EVT_TEXT_ENTER, self.OnEnter, entry)
 
     self.gbs.Add (entry, (row, 1), flag = wx.EXPAND | wx.ALIGN_CENTER_VERTICAL)
+    self.__lastEntry = entry
 
-    self.__addToControls (entry)
 
-
-
   # ---------------------------------------------------------------------------
   # Add a series of dropdowns into a single row
   # ---------------------------------------------------------------------------
 
-  def __add_dropdown (self, row, label, name, default, master, elements):
+  def __addChoice (self, row, label, name, default, master, elements):
 
     self.gbs.Add (wx.StaticText (self, wx.ID_ANY, label), (row, 0),
         flag = wx.ALIGN_CENTER_VERTICAL)
@@ -280,38 +269,28 @@
     rowSizer = wx.BoxSizer (wx.HORIZONTAL)
 
     perMaster = self.__dropdowns.setdefault (master, {})
-    drops     = perMaster.setdefault (name, [])
+    perRow    = perMaster.setdefault (name, [])
 
     border = 0
     for (tip, allowedValues) in elements:
-      (keys, data, defItem) = self.__getModel (master, allowedValues, default)
+      widget = wx.Choice (self, -1)
+      widget._master  = master
+      widget._name    = name
+      widget._allowed = allowedValues
+      widget._default = default
 
-      data = [str (d) for d in data]
-      combo = wx.ComboBox (self, -1, defItem or '', choices = data,
-          style = wx.CB_READONLY)
+      self.__updateWidget (widget)
 
-      combo._keys    = keys
-      combo._data    = data
-      combo._default = default
-      combo._field   = name
-      combo._master  = master
-      combo._allowedValues = allowedValues
-
       if tip:
-        combo.SetToolTip (wx.ToolTip (tip))
+        widget.SetToolTip (wx.ToolTip (tip))
 
-      drops.append (combo)
-      wx.EVT_COMBOBOX (combo, -1, self.__comboChanged)
-      wx.EVT_TEXT_ENTER (combo, -1, self.__enterPressed)
+      self.Bind (wx.EVT_CHOICE, self.OnChoiceChanged, widget)
+      perRow.append (widget)
 
-      if defItem:
-        self.inputData [name] = default
-
-      rowSizer.Add (combo, 1, wx.EXPAND | wx.LEFT, border)
+      rowSizer.Add (widget, 1, wx.EXPAND | wx.LEFT, border)
       border = 4
+      self.__lastEntry = widget
 
-      self.__addToControls (combo)
-
     self.gbs.Add (rowSizer, (row, 1), flag = 
wx.EXPAND|wx.ALIGN_CENTER_VERTICAL)
 
 
@@ -336,7 +315,7 @@
   # Whenever an entry will be changed, keep inputData in snyc
   # ---------------------------------------------------------------------------
 
-  def __entryChanged (self, event):
+  def OnEntryChanged (self, event):
 
     entry = event.GetEventObject ()
     self.inputData [entry._field] = entry.GetValue ()
@@ -346,123 +325,84 @@
   # If <Enter> is pressed within a text control, move the focus
   # ---------------------------------------------------------------------------
   
-  def __enterPressed (self, event):
+  def OnEnter (self, event):
 
     entry = event.GetEventObject ()
+
     if entry == self.__lastEntry:
       self.EndModal (wx.ID_OK)
+    else:
+      entry.Navigate (wx.NavigationKeyEvent.IsForward)
 
-    for item in self.__controls:
-      if item._index == entry._index + 1:
-        item.SetFocus ()
 
-
   # ---------------------------------------------------------------------------
-  # On change of a combo, make sure to keep all others and depending in sync
+  # After the selection of a choice has change, keep all others in sync
   # ---------------------------------------------------------------------------
-   
-  def __comboChanged (self, event):
 
-    combo  = event.GetEventObject ()
-    value  = combo.GetStringSelection ()
-    newKey = combo._keys [combo._data.index (value)]
+  def OnChoiceChanged (self, event):
 
-    self.inputData [combo._field] = newKey
-    self.__updateDeps (combo, combo._master, combo._field, newKey)
+    widget = event.GetEventObject ()
+    newKey = widget.GetClientData (event.GetSelection ())
+    self.inputData [widget._name] = newKey
 
+    # Make sure all controls stay in sync
+    for item in self.__dropdowns [widget._master][widget._name]:
+      item.SetSelection (event.GetSelection ())
 
-  # ---------------------------------------------------------------------------
-  # Get the data model for a given master from a data dictionary
-  # ---------------------------------------------------------------------------
+    # Keep all depending controls in sync
+    self.__updateDepending (widget._name)
 
-  def __getModel (self, master, dataDict, default = None):
 
-    defaultItem = None
-
-    if master:
-      values = dataDict.get (self.inputData.get (master), {})
-    else:
-      values = dataDict
-
-    if values:
-      (keys, data) = (values.keys (), values.values ())
-      if default and default in keys:
-        defaultItem = data [keys.index (default)]
-    else:
-      keys = data = []
-
-    return (keys, data, defaultItem)
-
-
   # ---------------------------------------------------------------------------
-  # Keep all combos in sync and make sure to have depending combos up to date
+  # Update all depending choice widgets
   # ---------------------------------------------------------------------------
 
-  def __updateDeps (self, combo, master, element, newKey):
-    
-    drops = self.__dropdowns [master] [element]
+  def __updateDepending (self, master):
 
-    # First synchronize all dropdowns of the same element
-    if len (drops) > 1:
-      for item in drops:
-        item.SetValue (item._data [item._keys.index (newKey)])
+    if master in self.__dropdowns:
+      for name in self.__dropdowns [master].keys ():
+        drops = self.__dropdowns [master] [name]
+        for i in drops:
+          self.__updateWidget (i)
 
-    # If this dropdown is master of others, make sure to keep them in sync too
-    if self.__dropdowns.has_key (element):
-      self.__updateDepending (element, newKey)
+        self.__updateDepending (name)
 
 
   # ---------------------------------------------------------------------------
-  # Update all depending combos of a given master
+  # Update the choices of a given choice widget
   # ---------------------------------------------------------------------------
+   
+  def __updateWidget (self, widget):
 
-  def __updateDepending (self, master, masterKey):
+    widget.Freeze ()
+    widget.Clear ()
 
-    drops = self.__dropdowns [master]
+    if widget._master:
+      values = widget._allowed.get (self.inputData.get (widget._master), {})
+    else:
+      values = widget._allowed
 
-    for (datakey, combos) in drops.items ():
-      for combo in combos:
-        (keys, data, defItem) = self.__getModel (master, combo._allowedValues,
-                                                 combo._default)
-        data = [str(d) for d in data]
-        if keys or combo._keys:
-          combo.Enable (True)
-          combo.Clear ()
-          for description in data:
-            combo.Append (str(description))
+    if values:
+      for (k, v) in values.items ():
+        widget.Append (v, k)
 
-        combo._keys = keys
-        combo._data = data
+      if widget._default in values:
+        widget.SetStringSelection (values [widget._default])
+        self.inputData [widget._name] = widget._default
+      else:
+        self.inputData [widget._name] = widget.GetClientData (0)
+        widget.SetSelection (0)
 
-        if not keys:
-          combo.SetValue ('')
-          combo.Disable ()
-          if datakey in self.inputData:
-            del self.inputData [datakey]
-        else:
-          if defItem is not None:
-            combo.SetValue (defItem)
-            self.inputData [datakey] = combo._default
+    else:
+      if widget._name in self.inputData:
+        del self.inputData [widget._name]
 
-          else:
-            ckey = combo._keys [combo._data.index (combo.GetValue ())]
-            self.inputData [datakey] = ckey
+    widget.Enable (len (values))
+    widget.Thaw ()
+    widget.Refresh ()
 
 
   # ---------------------------------------------------------------------------
-  # Add a widget to the list of controls, and give it an index
-  # ---------------------------------------------------------------------------
-
-  def __addToControls (self, widget):
-
-    self.__controls.append (widget)
-    widget._index = len (self.__controls)
-
-    if not isinstance (widget, wx.Button):
-      self.__lastEntry = widget
-
-
-  # ---------------------------------------------------------------------------
   # Show the modal dialog and clear inputData on cancelling
   # ---------------------------------------------------------------------------
 
@@ -619,7 +559,7 @@
   # ---------------------------------------------------------------------------
 
   cname = {'c1': 'demoa', 'c2': 'demob'}
-  ckey  = {'c1': 'ck-A', 'c2': 'ck-B'}
+  ckey  = {'c1': 'ck-A' , 'c2': 'ck-B'}
 
   wija = {'c1': {'04': '2004', '05': '2005'},
           'c2': {'24': '2024', '25': '2025', '26': '2026'}}
@@ -639,6 +579,7 @@
                 ('sepp', {'50': 'se 50', '100': 'se 100', '9': 'se 9'})]),
             ('Noe', '_depp', 'label', 'furz', None, []),
             ('Das ist jetzt ein Fehler', None, 'warning', None, None, []),
+
             ('Firma', 'company', 'dropdown', 'c1', None,
                 [('Name', cname), ('Code', ckey)]),
             ('Wirtschaftsjahr', 'wija', 'dropdown', '05', 'company',





reply via email to

[Prev in Thread] Current Thread [Next in Thread]