commit-gnue
[Top][All Lists]
Advanced

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

[gnue] r7458 - in trunk/gnue-forms/src/uidrivers: _base gtk2


From: johannes
Subject: [gnue] r7458 - in trunk/gnue-forms/src/uidrivers: _base gtk2
Date: Fri, 22 Apr 2005 03:20:14 -0500 (CDT)

Author: johannes
Date: 2005-04-22 03:20:12 -0500 (Fri, 22 Apr 2005)
New Revision: 7458

Added:
   trunk/gnue-forms/src/uidrivers/gtk2/dialogs.py
Removed:
   trunk/gnue-forms/src/uidrivers/gtk2/about.py
Modified:
   trunk/gnue-forms/src/uidrivers/_base/UIdriver.py
   trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py
Log:
Added a versatile input dialog


Modified: trunk/gnue-forms/src/uidrivers/_base/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/_base/UIdriver.py    2005-04-22 07:27:09 UTC 
(rev 7457)
+++ trunk/gnue-forms/src/uidrivers/_base/UIdriver.py    2005-04-22 08:20:12 UTC 
(rev 7458)
@@ -594,6 +594,63 @@
 
 
   # ---------------------------------------------------------------------------
+  # Get an input dialog for a given set of fields
+  # ---------------------------------------------------------------------------
+
+  def getInput (self, title, fields, cancel = True):
+    """
+    Prompt the user for a given number of fields and return the result as
+    dictionary.
+
+    @param title: title of the input dialog
+    @param fields: field definition as described below
+    @param cancel: if True the dialog has a cancel button, otherwise not
+    
+    These field definitions are specified as follows:
+
+    A field definition is a tuple having these elements:
+    - fieldlabel: This text will be used as label in the left column
+    - fieldname: This is the key in the result-dictionary to contain the value
+        entered by the user
+    - fieldtype: Currently these types are supported:
+        - label: The contents of 'fieldlabel' as static text
+        - warning: The contents of 'fieldlabel' as static text, formatted as
+            warning
+        - string: A text entry control
+        - password: A text entry control with obscured characters
+        - dropdown: Foreach element given in 'elements' a separate ComboBox
+            control will be created, where each one has it's own dictionary of
+            allowed values. If a value is selected in one control, all others
+            are synchronized to represent the same key-value.
+    - default: Default value to use
+    - masterfield: Used for 'dropdowns'. This item specifies another field
+        definition acting as master field. If this master field is changed, the
+        allowedValues of this dropdown will be changed accordingly. If a
+        masterfield is specified the 'allowedValues' dictionaries are built 
like
+        {master1: {key: value, key: value, ...}, master2: {key: value, ...}}
+    - elements: sequence of input element tuples (label, allowedValues). This
+        is used for dropdowns only. 'label' will be used as ToolTip for the
+        control and 'allowedValues' gives a dictionary with all valid keys to
+        be selected in the dropdown.
+
+    @return: If closed by 'Ok' the result is a dictionary with all values
+      entered by the user, where the "fieldname"s will be used as keys. If the
+      user has not selected a value from a dropdown (i.e. it has no values to
+      select) there will be no such key in the result dictionary. If the dialog
+      is canceled ('Cancel'-Button) the result will be None.
+    """
+
+    return self._getInput (title, fields, cancel)
+
+
+  # ---------------------------------------------------------------------------
+
+  def _getInput (self, title, fields, cancel):
+
+    raise ImplementationError, (self.name, '_getInput')
+
+
+  # ---------------------------------------------------------------------------
   # gotoPage
   # ---------------------------------------------------------------------------
 

Modified: trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py     2005-04-22 07:27:09 UTC 
(rev 7457)
+++ trunk/gnue-forms/src/uidrivers/gtk2/UIdriver.py     2005-04-22 08:20:12 UTC 
(rev 7458)
@@ -63,7 +63,7 @@
 from gnue.forms.uidrivers.gtk2.GFApp import *
 from gnue.forms.uidrivers.gtk2.SplashScreen import *
 from gnue.forms.uidrivers.gtk2.widgets._base  import *
-from gnue.forms.uidrivers.gtk2 import about
+from gnue.forms.uidrivers.gtk2 import dialogs
 
 # =============================================================================
 # This class implements a User Interface for GTK2
@@ -323,12 +323,12 @@
 
   def _showAbout (self, name, appversion, formversion, author, description):
 
-    dialog = about.AboutBox (name, appversion, formversion, author, 
description)
+    dlg = dialogs.AboutBox (name, appversion, formversion, author, description)
     try:
-      dialog.run ()
+      dlg.run ()
 
     finally:
-      dialog.destroy ()
+      dlg.destroy ()
 
 
   # ---------------------------------------------------------------------------
@@ -355,6 +355,21 @@
 
 
   # ---------------------------------------------------------------------------
+  # Start an input dialog and return the data record or None if cancelled
+  # ---------------------------------------------------------------------------
+
+  def _getInput (self, title, fields, cancel = True):
+
+    dialog = dialogs.InputDialog (title, fields, cancel)
+    try:
+      dialog.run ()
+      return dialog.inputData
+
+    finally:
+      dialog.destroy ()
+
+
+  # ---------------------------------------------------------------------------
   # Process all pending events, but do not block if there are no events
   # ---------------------------------------------------------------------------
 

Deleted: trunk/gnue-forms/src/uidrivers/gtk2/about.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/about.py        2005-04-22 07:27:09 UTC 
(rev 7457)
+++ trunk/gnue-forms/src/uidrivers/gtk2/about.py        2005-04-22 08:20:12 UTC 
(rev 7458)
@@ -1,134 +0,0 @@
-# GNU Enterprise Forms - GTK UI Driver - About Box
-#
-# Copyright 2001-2005 Free Software Foundation
-#
-# This file is part of GNU Enterprise
-#
-# GNU Enterprise is free software; you can redistribute it
-# and/or modify it under the terms of the GNU General Public
-# License as published by the Free Software Foundation; either
-# version 2, or (at your option) any later version.
-#
-# GNU Enterprise is distributed in the hope that it will be
-# useful, but WITHOUT ANY WARRANTY; without even the implied
-# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
-# PURPOSE. See the GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public
-# License along with program; see the file COPYING. If not,
-# write to the Free Software Foundation, Inc., 59 Temple Place
-# - Suite 330, Boston, MA 02111-1307, USA.
-#
-# $Id$
-
-import gtk
-import types
-
-from gnue.common.apps import i18n
-
-# =============================================================================
-# Class implementing an about box for GTK2
-# =============================================================================
-
-class AboutBox (gtk.Dialog):
-
-  # ---------------------------------------------------------------------------
-  # Constructor
-  # ---------------------------------------------------------------------------
-
-  def __init__ (self, name, appversion, formversion, author, description):
-    """
-    """
-
-    title = u_("About %s") % name
-    gtk.Dialog.__init__ (self, title, None, gtk.DIALOG_MODAL,
-                         (gtk.STOCK_OK, gtk.RESPONSE_OK))
-    self.set_border_width (5)
-    self.vbox.set_spacing (8)
-
-    box = gtk.Frame (" GNUe Forms ")
-    tbl = gtk.Table (2, 2)
-    tbl.set_border_width (8)
-    tbl.set_col_spacings (8)
-
-    labels = []
-    items  = []
-
-    labels.append (self._newLabel (u_("Version:"), tbl, 0, 1, 0, 1))
-    labels.append (self._newLabel (u_("Driver:"), tbl, 0, 1, 1, 2))
-
-    items.append (self._newLabel (appversion, tbl, 1, 2, 0, 1))
-    items.append (self._newLabel (u'GTK', tbl, 1, 2, 1, 2))
-
-    box.add (tbl)
-    tbl.show ()
-
-    self.vbox.pack_start (box)
-    box.show ()
-
-    box = gtk.Frame (u_(" Form Information "))
-    tbl = gtk.Table (4, 2)
-    tbl.set_border_width (8)
-    tbl.set_col_spacings (8)
-
-    labels.append (self._newLabel (u_("Name:"),        tbl, 0, 1, 0, 1))
-    labels.append (self._newLabel (u_("Version:"),     tbl, 0, 1, 1, 2))
-    labels.append (self._newLabel (u_("Author:"),      tbl, 0, 1, 2, 3))
-    labels.append (self._newLabel (u_("Description:"), tbl, 0, 1, 3, 4))
-
-    items.append (self._newLabel (name,        tbl, 1, 2, 0, 1))
-    items.append (self._newLabel (formversion, tbl, 1, 2, 1, 2))
-    items.append (self._newLabel (author,      tbl, 1, 2, 2, 3))
-
-    l = self._newLabel (description, tbl, 1, 2, 3, 4)
-    l.set_line_wrap (True)
-    items.append (l)
-
-    box.add (tbl)
-    tbl.show ()
-
-    self.vbox.pack_start (box)
-    box.show ()
-
-    self._resizeLabels (labels)
-    self._resizeLabels (items)
-
-
-  # ---------------------------------------------------------------------------
-  # Resize all labels in a sequence to the same width
-  # ---------------------------------------------------------------------------
-
-  def _resizeLabels (self, labels):
-    """
-    This function determines the widest label in the sequence and sets all
-    items to this width.
-    @param labels: sequence of gtk.Label instances
-    """
-    maxW = 0
-    for item in labels:
-      maxW = max (maxW, item.size_request () [0])
-
-    for item in labels:
-      item.set_size_request (maxW, -1)
-
-
-  # ---------------------------------------------------------------------------
-  # Create a new left- and top-aligned label and attach it to a given table
-  # ---------------------------------------------------------------------------
-
-  def _newLabel (self, text, table, left, right, top, bottom):
-    if isinstance (text, types.StringType):
-      text = unicode (text, i18n.encoding)
-    result = gtk.Label (text)
-    result.set_alignment (0, 0)
-    table.attach (result, left, right, top, bottom)
-    result.show ()
-    return result
-
-if __name__ == '__main__':
-  desc = "this is a description to the form. it " \
-         "could be a much longer text than one would excpet."
-
-  x = AboutBox ('form-name', 'app-version', 'form-version', 'author', desc)
-  x.run ()
-  x.destroy ()

Copied: trunk/gnue-forms/src/uidrivers/gtk2/dialogs.py (from rev 7456, 
trunk/gnue-forms/src/uidrivers/gtk2/about.py)
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/about.py        2005-04-21 22:55:34 UTC 
(rev 7456)
+++ trunk/gnue-forms/src/uidrivers/gtk2/dialogs.py      2005-04-22 08:20:12 UTC 
(rev 7458)
@@ -0,0 +1,529 @@
+# GNU Enterprise Forms - GTK UI Driver - UI specific dialogs
+#
+# Copyright 2001-2005 Free Software Foundation
+#
+# This file is part of GNU Enterprise
+#
+# GNU Enterprise is free software; you can redistribute it
+# and/or modify it under the terms of the GNU General Public
+# License as published by the Free Software Foundation; either
+# version 2, or (at your option) any later version.
+#
+# GNU Enterprise is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied
+# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
+# PURPOSE. See the GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public
+# License along with program; see the file COPYING. If not,
+# write to the Free Software Foundation, Inc., 59 Temple Place
+# - Suite 330, Boston, MA 02111-1307, USA.
+#
+# $Id$
+
+import gtk
+import types
+import pango
+
+from gnue.common.apps import i18n, errors
+
+# =============================================================================
+# Exceptions
+# =============================================================================
+
+class InvalidFieldTypeError (errors.ApplicationError):
+  def __init__ (self, fieldtype):
+    msg = u_("%s is not a valid type for an input field") % fieldtype
+    errors.ApplicationError.__init__ (self, msg)
+
+
+# =============================================================================
+# Class implementing an about box for GTK2
+# =============================================================================
+
+class AboutBox (gtk.Dialog):
+  """
+  Displays an about dialog for the current application as defined by the given
+  arguments.
+  """
+
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+
+  def __init__ (self, name, appversion, formversion, author, description):
+    """
+    @param name: name of the application
+    @param appversion: version of the application (GNUe Forms)
+    @param formversion: version of the form
+    @param author: author of the form
+    @param description: text describing the form
+    """
+
+    title = u_("About %s") % name
+    gtk.Dialog.__init__ (self, title, None, gtk.DIALOG_MODAL,
+                         (gtk.STOCK_OK, gtk.RESPONSE_OK))
+
+    hBox = gtk.HBox ()
+    box = gtk.Frame (" GNUe Forms ")
+    hBox.pack_start (box, padding = 6)
+
+    tbl = gtk.Table (2, 2)
+    tbl.set_border_width (8)
+    tbl.set_col_spacings (8)
+
+    labels = []
+    items  = []
+
+    labels.append (self.__newLabel (u_("Version:"), tbl, 0, 1, 0, 1))
+    labels.append (self.__newLabel (u_("Driver:"), tbl, 0, 1, 1, 2))
+
+    items.append (self.__newLabel (appversion, tbl, 1, 2, 0, 1))
+    items.append (self.__newLabel (u'GTK', tbl, 1, 2, 1, 2))
+
+    box.add (tbl)
+
+    self.vbox.pack_start (hBox)
+
+    box = gtk.Frame (u_(" Form Information "))
+    hBox = gtk.HBox ()
+    hBox.pack_start (box, padding = 6)
+
+    tbl = gtk.Table (4, 2)
+    tbl.set_border_width (8)
+    tbl.set_col_spacings (8)
+
+    labels.append (self.__newLabel (u_("Name:"),        tbl, 0, 1, 0, 1))
+    labels.append (self.__newLabel (u_("Version:"),     tbl, 0, 1, 1, 2))
+    labels.append (self.__newLabel (u_("Author:"),      tbl, 0, 1, 2, 3))
+    labels.append (self.__newLabel (u_("Description:"), tbl, 0, 1, 3, 4))
+
+    items.append (self.__newLabel (name,        tbl, 1, 2, 0, 1))
+    items.append (self.__newLabel (formversion, tbl, 1, 2, 1, 2))
+    items.append (self.__newLabel (author,      tbl, 1, 2, 2, 3))
+
+    l = self.__newLabel (description, tbl, 1, 2, 3, 4)
+    l.set_line_wrap (True)
+    items.append (l)
+
+    box.add (tbl)
+
+    self.vbox.pack_start (hBox, padding = 6)
+
+    self.__resizeLabels (labels)
+    self.__resizeLabels (items)
+
+    self.show_all ()
+
+
+  # ---------------------------------------------------------------------------
+  # Resize all labels in a sequence to the same width
+  # ---------------------------------------------------------------------------
+
+  def __resizeLabels (self, labels):
+
+    maxW = max ([item.size_request () [0] for item in labels])
+
+    for item in labels:
+      item.set_size_request (maxW, -1)
+
+
+  # ---------------------------------------------------------------------------
+  # Create a new left- and top-aligned label and attach it to a given table
+  # ---------------------------------------------------------------------------
+
+  def __newLabel (self, text, table, left, right, top, bottom):
+
+    if isinstance (text, types.StringType):
+      text = unicode (text, i18n.encoding)
+
+    result = gtk.Label (text)
+    result.set_alignment (0, 0)
+    table.attach (result, left, right, top, bottom)
+
+    return result
+
+
+# =============================================================================
+# Class implementing a versatile input dialog
+# =============================================================================
+
+class InputDialog (gtk.Dialog):
+  """
+  Dialog class prompting the user for a given number of fields. These field
+  definitions are specified as follows:
+
+  A field definition is a tuple having these elements:
+  - fieldlabel: This text will be used as label in the left column
+  - fieldname: This is the key in the result-dictionary to contain the value
+      entered by the user
+  - fieldtype: Currently these types are supported:
+      - label: The contents of 'fieldlabel' as static text
+      - warning: The contents of 'fieldlabel' as static text, formatted as
+          warning
+      - string: A text entry control
+      - password: A text entry control with obscured characters
+      - dropdown: Foreach element given in 'elements' a separate ComboBox
+          control will be created, where each one has it's own dictionary of
+          allowed values. If a value is selected in one control, all others are
+          synchronized to represent the same key-value.
+  - default: Default value to use
+  - masterfield: Used for 'dropdowns'. This item specifies another field
+      definition acting as master field. If this master field is changed, the
+      allowedValues of this dropdown will be changed accordingly. If a
+      masterfield is specified the 'allowedValues' dictionaries are built like
+      {master1: {key: value, key: value, ...}, master2: {key: value, ...}}
+  - elements: sequence of input element tuples (label, allowedValues). This is
+      used for dropdowns only. 'label' will be used as ToolTip for the control
+      and 'allowedValues' gives a dictionary with all valid keys to be selected
+      in the dropdown.
+
+  @return: If closed by 'Ok' the result is a dictionary with all values entered
+    by the user, where the "fieldname"s will be used as keys. If the user has
+    not selected a value from a dropdown (i.e. it has no values to select)
+    there will be no such key in the result dictionary. If the dialog is
+    canceled ('Cancel'-Button) the result will be None.
+  """
+
+  _FIELDTYPES = ['label', 'warning', 'string', 'password', 'dropdown', 'image']
+
+  # ---------------------------------------------------------------------------
+  # Constructor
+  # ---------------------------------------------------------------------------
+
+  def __init__ (self, title, fields, cancel = True):
+    """
+    Create a new input dialog
+
+    @param title: Dialog title
+    @param fields: sequence of field definition tuples
+    @param cancel: If True add a Cancel button to the dialog
+    """
+
+    gtk.Dialog.__init__ (self, title, None, gtk.DIALOG_MODAL)
+
+    ok = self.add_button (gtk.STOCK_OK, gtk.RESPONSE_OK)
+    if cancel:
+      cancel = self.add_button (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)
+
+    self.set_default (ok)
+
+    self.inputData    = {}
+    self.__dropdowns  = {}
+    self.__tooltips   = gtk.Tooltips ()
+    self.__lastWidget = None
+
+    self.table = gtk.Table (len (fields), 2)
+    self.table.set_col_spacing (0, 10)
+
+    hbox = gtk.HBox ()
+    hbox.pack_start (self.table, padding = 8)
+
+    self.vbox.pack_start (hbox, padding = 8)
+
+    row = 0
+    for (label, name, fieldtype, default, master, elements) in fields:
+      ftype = fieldtype.lower ()
+      if not ftype in self._FIELDTYPES:
+        raise InvalidFieldTypeError, fieldtype
+
+      if ftype in ['label', 'warning']:
+        self.__add_text (row, label, ftype == 'warning')
+
+      elif ftype == 'image':
+        self.__addImage (row, name)
+
+      else:
+        self.__addLabel (row, label)
+
+        if ftype == 'string':
+          self.__add_string (row, label, name, default, elements)
+
+        elif ftype == 'password':
+          self.__add_string (row, label, name, default, elements, True)
+
+        elif ftype == 'dropdown':
+          self.__add_dropdown (row, label, name, default, master, elements)
+
+      row += 1
+
+    self.connect ('response', self.__response)
+    self.show_all ()
+
+
+  # ---------------------------------------------------------------------------
+  # Add a centered label to the table
+  # ---------------------------------------------------------------------------
+
+  def __add_text (self, row, label, isWarning = False):
+
+    gLabel = gtk.Label (label)
+    if isWarning:
+      attr = pango.AttrList ()
+      attr.insert (pango.AttrForeground (65535, 0, 0, 0, len (label)))
+      gLabel.set_attributes (attr)
+
+    self.table.attach (gLabel, 0, 2, row, row + 1)
+
+
+  # ---------------------------------------------------------------------------
+  # Add a text control for strings and passwords to the table
+  # ---------------------------------------------------------------------------
+
+  def __add_string (self, row, label, name, default, tips, password = False):
+
+    entry = gtk.Entry ()
+    entry.set_visibility (not password)
+    entry.set_activates_default (True)
+
+    if default:
+      entry.set_text (default)
+      self.inputData [name] = default
+
+    if tips and tips [0][0]:
+      self.__tooltips.set_tip (entry, tips [0][0])
+
+    entry.connect ('changed', self.__entryChanged, name)
+    entry.connect ('activate', self._activate)
+
+    self.table.attach (entry, 1, 2, row, row + 1)
+    self.__lastWidget = entry
+
+
+  # ---------------------------------------------------------------------------
+  # Add a series of coresponding dropdowns into a row of the table
+  # ---------------------------------------------------------------------------
+
+  def __add_dropdown (self, row, label, name, default, master, elements):
+
+    hbox = gtk.HBox ()
+
+    perMaster = self.__dropdowns.setdefault (master, {})
+    drops     = perMaster.setdefault (name, [])
+
+    for (tip, allowedValues) in elements:
+      # TODO: We could use a single ListStore to keep all possible values,
+      # where the key is in the first column and having another column per
+      # dropdown with the description.
+      (model, defIter) = self.__getModel (master, allowedValues, default)
+
+      combo = gtk.ComboBox (model)
+      cell = gtk.CellRendererText ()
+      combo.pack_start (cell, True)
+      combo.add_attribute (cell, 'text', 1)
+      combo._allowedValues = allowedValues
+      combo._default       = default
+
+      combo.set_sensitive (model is not None)
+
+      drops.append (combo)
+
+      if defIter:
+        combo.set_active_iter (defIter)
+        self.inputData [name] = default
+
+      combo.connect ('changed', self.__comboChanged, name, master)
+
+      # Since a ComboBox widget cannot handle tooltips we add it to an EventBox
+      cBox = gtk.EventBox ()
+      cBox.add (combo)
+      if tip:
+        self.__tooltips.set_tip (cBox, tip)
+
+      hbox.pack_start (cBox)
+
+    self.table.attach (hbox, 1, 2, row, row + 1, yoptions = 0)
+    self.__lastWidget = combo
+
+
+  # ---------------------------------------------------------------------------
+  # Add a label for an input widget to the left column of the table
+  # ---------------------------------------------------------------------------
+
+  def __addLabel (self, row, label):
+
+    gLabel = gtk.Label (label)
+    gLabel.set_alignment (0, gLabel.get_alignment () [1])
+
+    self.table.attach (gLabel, 0, 1, row, row + 1, gtk.FILL)
+
+
+  # ---------------------------------------------------------------------------
+  # Add an image centered to the table
+  # ---------------------------------------------------------------------------
+
+  def __addImage (self, row, imageURL):
+    
+    bmp = gtk.Image ()
+    bmp.set_from_file (imageURL)
+
+    self.table.attach (bmp, 0, 2, row, row + 1, ypadding = 8)
+
+
+  # ---------------------------------------------------------------------------
+  # Handle changes in a drop down
+  # ---------------------------------------------------------------------------
+
+  def __comboChanged (self, combo, dataKey, master):
+
+    iterator = combo.get_active_iter ()
+    value = combo.get_model ().get_value (iterator, 0)
+
+    self.inputData [dataKey] = value
+
+    self.__updateDeps (combo, master, dataKey, value)
+
+
+  # ---------------------------------------------------------------------------
+  # Handle changes in a string or password entry
+  # ---------------------------------------------------------------------------
+
+  def __entryChanged (self, entry, dataKey):
+
+    self.inputData [dataKey] = entry.get_text ()
+
+
+  # ---------------------------------------------------------------------------
+  # Get a tree model using the given master and data dictionary
+  # ---------------------------------------------------------------------------
+
+  def __getModel (self, master, dataDict, default = None):
+
+    if master:
+      values = dataDict.get (self.inputData.get (master), {})
+    else:
+      values = dataDict
+
+    if values:
+      defaultIterator = None
+      result = gtk.ListStore (str, str)
+      for (key, description) in values.items ():
+        added = result.append (("%s" % key, "%s" % description))
+        if default and key == default:
+          defaultIterator = added
+    else:
+      result = defaultIterator = None
+
+    return (result, defaultIterator)
+
+
+  # ---------------------------------------------------------------------------
+  # Synchronize a combo and update all depending controls
+  # ---------------------------------------------------------------------------
+
+  def __updateDeps (self, combo, master, element, newKey):
+    
+    drops = self.__dropdowns [master] [element]
+
+    # First synchronize all dropdowns of the same element
+    if len (drops) > 1:
+      for item in drops:
+        for row in item.get_model ():
+          if row [0] == newKey:
+            item.set_active_iter (row.iter)
+
+    # If this dropdown is master of others, make sure to keep them in sync too
+    if self.__dropdowns.has_key (element):
+      self.__updateDepending (combo, element, newKey)
+
+
+
+  # ---------------------------------------------------------------------------
+  # update all depending controls
+  # ---------------------------------------------------------------------------
+
+  def __updateDepending (self, combo, master, masterKey):
+
+    drops = self.__dropdowns [master]
+
+    for (datakey, combos) in drops.items ():
+      for combo in combos:
+        (model, defIter) = self.__getModel (master, combo._allowedValues,
+            combo._default)
+        if model or combo.get_model ():
+          combo.set_model (model)
+        combo.set_sensitive (model is not None)
+        if not model:
+          if datakey in self.inputData:
+            del self.inputData [datakey]
+        else:
+          if defIter is not None:
+            combo.set_active_iter (defIter)
+
+          elif datakey in self.inputData:
+            del self.inputData [datakey]
+
+
+  # ---------------------------------------------------------------------------
+  # Default action for text controls
+  # ---------------------------------------------------------------------------
+
+  def _activate (self, widget):
+
+    # If the widget is not the last one stop emission of the activate signal,
+    # and emit a 'move-focus' signal instead
+    if widget != self.__lastWidget:
+      widget.stop_emission ('activate')
+      self.emit ('move-focus', gtk.DIR_TAB_FORWARD)
+
+
+  # ---------------------------------------------------------------------------
+  # On cancelling the dialog we clear the input data record
+  # ---------------------------------------------------------------------------
+
+  def __response (self, dialog, rid):
+
+    if rid != gtk.RESPONSE_OK:
+      self.inputData = None
+
+
+# =============================================================================
+# Module self test
+# =============================================================================
+
+if __name__ == '__main__':
+  desc = "this is a description to the form. it " \
+         "could be a much longer text than one would excpet."
+
+  x = AboutBox ('form-name', 'app-version', 'form-version', 'author', desc)
+  x.run ()
+  x.destroy ()
+
+  # ---------------------------------------------------------------------------
+
+  cname = {'c1': 'demoa', 'c2': 'demob'}
+  ckey  = {'c1': 'ck-A', 'c2': 'ck-B'}
+
+  wija = {'c1': {'04': '2004', '05': '2005'},
+          'c2': {'24': '2024', '25': '2025', '26': '2026'}}
+
+  codes = {'24': {'241': 'c-24-1', '242': 'c-24-2'},
+           '25': {'251': 'c-25-1'}}
+
+  fields = [('Foo!', '/home/johannes/gnue/share/gnue/images/gnue.png', 'image',
+             None, None, []),
+            ('Username', '_username', 'string', 'frodo', None, \
+              [('Name of the user', None)]),
+            ('Password', '_password', 'password', 'foo', None, [('yeah',1)]),
+            ('Foobar', '_foobar', 'dropdown', 'frob', None, \
+                [('single', {'trash': 'Da Trash', 'frob': 'Frob'})]),
+            ('Multi', '_multi', 'dropdown', '100', None, \
+                [('name', {'50': 'A 50', '100': 'B 100', '9': 'C 9'}),
+                ('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',
+                [('Jahr', wija)]),
+            ('Codes', 'codes', 'dropdown', None, 'wija',
+                [('Code', codes)])]
+
+            
+  #fields = [('Username', '_username', 'string', 'foobar', None, []),
+            #('Password', '_password', 'password', None, None, [])]
+  dialog = InputDialog ('Hackery', fields)
+  dialog.run ()
+  print "R:", dialog.inputData
+
+  dialog.destroy ()





reply via email to

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