commit-gnue
[Top][All Lists]
Advanced

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

r5153 - in trunk/gnue-forms/src: . uidrivers/gtk2/widgets uidrivers/qt u


From: jcater
Subject: r5153 - in trunk/gnue-forms/src: . uidrivers/gtk2/widgets uidrivers/qt uidrivers/qt/widgets uidrivers/qt/widgets/form
Date: Tue, 24 Feb 2004 23:35:09 -0600 (CST)

Author: jcater
Date: 2004-02-24 23:35:08 -0600 (Tue, 24 Feb 2004)
New Revision: 5153

Modified:
   trunk/gnue-forms/src/GFForm.py
   trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py
   trunk/gnue-forms/src/uidrivers/qt/QTSplashScreen.py
   trunk/gnue-forms/src/uidrivers/qt/ToolBar.py
   trunk/gnue-forms/src/uidrivers/qt/UIdriver.py
   trunk/gnue-forms/src/uidrivers/qt/common.py
   trunk/gnue-forms/src/uidrivers/qt/widgets/_base.py
   trunk/gnue-forms/src/uidrivers/qt/widgets/button.py
   trunk/gnue-forms/src/uidrivers/qt/widgets/entry.py
   trunk/gnue-forms/src/uidrivers/qt/widgets/form/widget.py
Log:
Fixes for QT Driver
 * Toolbars now emit events, show tooltips
 * Entries respond to mouse events (including highlighting)
 * Partial support for multi-line entries
 * Buttons and comboboxes mostly functional
 * Support for busy notification cursors and error bells
 * Clipboard support
 



Modified: trunk/gnue-forms/src/GFForm.py
===================================================================
--- trunk/gnue-forms/src/GFForm.py      2004-02-24 12:40:37 UTC (rev 5152)
+++ trunk/gnue-forms/src/GFForm.py      2004-02-25 05:35:08 UTC (rev 5153)
@@ -58,7 +58,7 @@
   # TODO: with a little tweaking we can now stop passing  
GFParser.getXMLelements
     GRootObj.__init__(self, 'form', GFParser.getXMLelements, GFParser)
     GFObj.__init__(self, parent)
-    
+
     self._type = "GFForm"
     self.name="__main__"
 
@@ -99,7 +99,7 @@
                             'ON-EXIT':        'On-Exit',
                             'PRE-COMMIT':     'Pre-Commit',
                             'POST-COMMIT':    'Post-Commit' }
-    
+
     self._triggerFunctions = {'setFocus':{'function':self.triggerSetFocus,
                                           'global': True,
                                           },
@@ -154,8 +154,8 @@
 
     self._features = {
       'GUI:MENUBAR:SUPPRESS': False,
-      'GUI:TOOLBAR:SUPPRESS': False, 
-      'GUI:STATUSBAR:SUPPRESS': False, 
+      'GUI:TOOLBAR:SUPPRESS': False,
+      'GUI:STATUSBAR:SUPPRESS': False,
     }
 
     self._in_trigger_lock = False
@@ -297,7 +297,7 @@
 
         if self._currentEntry._type != 'GFButton':
           val = self._currentEntry.getValue()
-          if self._currentEntry._field.min_length and val is not None and 
len(str(val)): 
+          if self._currentEntry._field.min_length and val is not None and 
len(str(val)):
             if len(str(val)) < self._currentEntry._field.min_length:
               message = _("Minimum required length %d" % 
self._currentEntry._field.min_length )
               # Piggybacking off the triggers message box code
@@ -354,7 +354,7 @@
 
       if blockChange:
         self.refreshDisplay(self._currentBlock)
-      
+
       self.dispatchEvent('updateENTRY', oldEntry, _form=self)
       self.dispatchEvent('updateENTRY', self._currentEntry, _form=self)
 
@@ -406,11 +406,11 @@
     if (self._currentEntry._type != 'GFButton' and \
         self._currentEntry._displayHandler.isPending()):
       return 0
-    
+
     for block in self._logic._blockList:
       if not block.isSaved():
         return 0
-      
+
     return 1
 
   def initQuery(self):
@@ -437,11 +437,11 @@
 
     for block in self._logic._blockList:
       block.initQuery()
-    
-    
+
+
     return message
 
-    
+
   def cancelQuery(self):
     self.dispatchEvent('endENTERQUERY', _form=self)
     #self._instance.dispatchEvent('endENTERQUERY', _form=self)
@@ -450,9 +450,9 @@
       block.cancelQuery()
 
     return message
-    
-  def copyQuery(self):    
-    if self._currentBlock.mode != 'query': 
+
+  def copyQuery(self):
+    if self._currentBlock.mode != 'query':
       self.initQuery()
 
     self.dispatchEvent('endENTERQUERY', _form=self);
@@ -462,8 +462,8 @@
       block.copyQuery()
 
     return message
-    
 
+
   def executeQuery(self):
     if self._currentBlock.mode != 'query':
       return _("Form not in query mode")
@@ -523,7 +523,7 @@
 
         for block in self._logic._blockList:
             block.switchRecord(0)
-        
+
         self.dispatchEvent('cannotCOMMIT')
         self.dispatchEvent('cannotROLLBACK')
 
@@ -531,7 +531,7 @@
         message = _('Form is readonly')
         #self._instance.dispatchEvent('endWAIT',None, _form=self)
         self.dispatchEvent('endWAIT',None, _form=self)
-        
+
         return message
 
       self.processTrigger('Post-Commit')
@@ -567,16 +567,16 @@
 
 
   #
-  # 
   #
+  #
   def updateUIEntry(self,field):
     for entry in field._entryList:
       self.dispatchEvent('updateENTRY',entry, _form=self)
       #self._instance.dispatchEvent('updateENTRY',entry, _form=self)
 
   #
-  # 
-  # 
+  #
+  #
 
   #
   # nextEntry
@@ -592,28 +592,28 @@
       source = self._currentBlock._focusOrder[:]
 
     # If we want the previous entry, then reverse the focusorder we're using
-    if reverse: 
+    if reverse:
       source.reverse()
-      
+
     nextEntry = None
     firstEntry = None
     keepNext = False
     for object in source:
-      
+
       if ((object._navigable) and ((not object.readonly) or
          (self._currentBlock.mode=='query' and object._queryable))):
-         
+
         # If we only wanted the first navigable field in the block, then return
-        if first: 
+        if first:
           nextEntry = object
           break
-      
+
         # Put the first field as the next to rollover
         if nextEntry == None:
           nextEntry = object
           firstEntry = object
 
-        # If we're at the current focused entry, 
+        # If we're at the current focused entry,
         # then the next entry will be what we want
         if object == self._currentEntry:
           keepNext = True
@@ -628,8 +628,8 @@
       # Jump to the next/(previous) page if block is page as transparent
       pages =  self._layout._pageList
       i = pages.index(self._currentPage)
-      
-      if reverse: 
+
+      if reverse:
         try:
           dest = self._layout._pageList[i-1]
         except IndexError:
@@ -642,7 +642,7 @@
         except IndexError:
           dest = self._layout._pageList[0]
         self.findAndChangeFocus(dest)
-        
+
     else:
       self.changeFocus(nextEntry)
 
@@ -713,19 +713,19 @@
       else:
         dispatchEvent('canPREVRECORD')
         dispatchEvent('canFIRSTRECORD')
-        
-      if block._resultSet.isLastRecord(): 
+
+      if block._resultSet.isLastRecord():
         dispatchEvent('cannotLASTRECORD')
-        if block._resultSet.current.isEmpty(): 
+        if block._resultSet.current.isEmpty():
           dispatchEvent('cannotNEXTRECORD')
           dispatchEvent('cannotNEWRECORD')
         else:
-          dispatchEvent('canNEWRECORD')        
-      else: 
+          dispatchEvent('canNEWRECORD')
+      else:
         dispatchEvent('canNEXTRECORD')
         dispatchEvent('canLASTRECORD')
-        dispatchEvent('canNEWRECORD')        
-    
+        dispatchEvent('canNEWRECORD')
+
   #
   # nextBlock
   #
@@ -739,9 +739,9 @@
     except IndexError:
       nextBlock = self._logic._blockList[0]
     self.findAndChangeFocus(nextBlock)
-    
 
 
+
   #
   # findPreviousBlock
   #
@@ -839,7 +839,7 @@
       return
 
     self._in_trigger_lock = True
-    
+
     focus = object._object
     if focus._type=='GFField':
       try:
@@ -854,12 +854,12 @@
     self.dispatchEvent('gotoENTRY',object=self._currentEntry,_form=self)
 
     self._in_trigger_lock = False
-    
+
   #
   # allow the trigger to get a handle to
   # an actual GFEntry object
   #
-  # TODO: WHY?  This seems like a good way to write 
+  # TODO: WHY?  This seems like a good way to write
   # TODO: triggers that break due to internal forms changes
   #
   def triggerGetCurrentEntry(self):
@@ -870,7 +870,7 @@
   # allow the trigger to get a handle to
   # an actual GFBlock object
   #
-  # TODO: WHY?  This seems like a good way to write 
+  # TODO: WHY?  This seems like a good way to write
   # TODO: triggers that break due to internal forms changes
   #
   def triggerGetCurrentBlock(self):
@@ -880,7 +880,7 @@
   # allow the trigger to get a handle to
   # an actual GFPage object
   #
-  # TODO: WHY?  This seems like a good way to write 
+  # TODO: WHY?  This seems like a good way to write
   # TODO: triggers that break due to internal forms changes
   #
   def triggerGetCurrentPage(self):

Modified: trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py        2004-02-24 
12:40:37 UTC (rev 5152)
+++ trunk/gnue-forms/src/uidrivers/gtk2/widgets/entry.py        2004-02-25 
05:35:08 UTC (rev 5153)
@@ -57,15 +57,15 @@
 
       # should we add this to the wx driver as well?
       self.choices.sort()
-      
+
       newWidget = gtk.Combo()
       newWidget.set_popdown_strings(self.choices)
-      
+
       newWidget.set_size_request(self.itemWidth, self.itemHeight)
       event.container.put(newWidget, object.Char__x * event.widgetWidth,
                           (object.Char__y + spacer + (object._gap * spacer)) \
                           * event.widgetHeight)
-      
+
       newWidget.list.connect('select-child', self.comboHandler, newWidget)
 
       if event.initialize:
@@ -77,39 +77,39 @@
 
 
     elif style == 'label':
-      newWidget = gtk.Label("")      
+      newWidget = gtk.Label("")
       newWidget.set_size_request(self.itemWidth, self.itemHeight + 1)
       event.container.put(newWidget, object.Char__x * event.widgetWidth,
                           (object.Char__y + spacer + (object._gap * spacer))\
                           * event.widgetHeight)
-      
+
     elif style == 'checkbox':
       newWidget = gtk.CheckButton(object.label)
       newWidget.set_size_request(self.itemWidth, event.textHeight)
       event.container.put(newWidget, object.Char__x * event.widgetWidth,
         (object.Char__y + spacer + (object._gap * spacer)) * 
event.widgetHeight)
-      newWidget._clicked_handler = newWidget.connect('clicked', 
self.checkboxHandler, newWidget)      
+      newWidget._clicked_handler = newWidget.connect('clicked', 
self.checkboxHandler, newWidget)
       if event.initialize:
         self._addDefaultEventHandler(newWidget, event.eventHandler,\
                                      self._uiDriver)
 
-    else:    
+    else:
       value=""
       if hasattr(object,'Char__height') and object.Char__height>1:
         newWidget = MultiLineEdit(value, event.eventHandler,self._uiDriver)
-        viewport = newWidget.viewport        
+        viewport = newWidget.viewport
       else:
         newWidget=viewport=gtk.Entry()
         newWidget._insert_handler = newWidget.connect('insert-text', \
                                                       self.insertTextHandler,\
                                                       event.eventHandler, \
                                                       self._uiDriver)
-        
+
         newWidget._delete_handler = newWidget.connect('delete-text',\
                                                       self.deleteTextHandler,\
                                                       event.eventHandler,\
                                                       self._uiDriver)
-                
+
       viewport.set_size_request(self.itemWidth, self.itemHeight+1)
       event.container.put(viewport, object.Char__x * event.widgetWidth,
                           (object.Char__y + spacer + (object._gap * spacer))\
@@ -118,14 +118,14 @@
         self._addDefaultEventHandler(newWidget, event.eventHandler,\
                                      self._uiDriver)
 
-    self._eventHandler = event.eventHandler          
-    event.container.show_all()    
+    self._eventHandler = event.eventHandler
+    event.container.show_all()
     return newWidget
 
 
   def setCursorPosition(self, position, index=0):
     widget=self.widgets[index]
-    if isinstance(widget,gtk.Entry) or isinstance(widget,MultiLineEdit):      
+    if isinstance(widget,gtk.Entry) or isinstance(widget,MultiLineEdit):
       widget.set_position(position)
     else:
       print _("Wrong Place to execute set CursorPosition (%s,%s), widget is a 
%s") % (position,index,widget)
@@ -135,7 +135,7 @@
     if isinstance(widget,gtk.Entry):
       widget.select_region(selection1, selection2)
     elif  isinstance(widget,gtk.TextView):
-      widget.get_buffer().select_region(position)      
+      widget.get_buffer().select_region(position)
 
   ###########################################################
   #
@@ -161,15 +161,15 @@
     #       this should be passed with the event
 
     # Compatibility layer for 0.5.1
-    #text = unicode(newtext,'utf-8')    
+    #text = unicode(newtext,'utf-8')
     text = unicode(newtext,'utf-8').encode(gConfigForms('textEncoding'))
-    
+
     action = events.Event('requestKEYPRESS', text, text=text,
                           code=0, _form=object._form)
-    
+
     # don't process event further
     widget.emit_stop_by_name('insert-text')
-    
+
     gtk.idle_add(eventHandler,action)  # our eventHandler will be called later
 
   #
@@ -192,13 +192,13 @@
       CursorPos = widget.get_position()
     except:
       CursorPos = widget.get_insert()
-    
+
     action = events.Event('requestDELETERANGE',
                           start_pos=start_pos,
                           end_pos=end_pos,
                           position=CursorPos,
                           _form=object._form)
-        
+
     widget.emit_stop_by_name('delete-text')
     gtk.idle_add(eventHandler,action)
 
@@ -234,14 +234,14 @@
     # don't process event further
     widget.emit_stop_by_name('clicked') # FIXME: won't accept veto
     widget.emit_stop_by_name('released') # FIXME: won't accept veto
-    
+
     #gtk.idle_add(self._eventHandler,action)  # our eventHandler will be 
called later
     return gtk.TRUE
 
 
 # TODO: Add support for READONLY edits with: set_editable
 
-class MultiLineEdit:  
+class MultiLineEdit:
   def __init__(self,value,eventHandler,uiDriver):
     self.textTagTable=gtk.TextTagTable()
     self.textBuffer=gtk.TextBuffer(self.textTagTable)
@@ -258,7 +258,7 @@
                                              self.insertTextHandler,\
                                              eventHandler, \
                                              uiDriver)
-        
+
     self.delete_handler = self.textBuffer.connect('delete-range',\
                                              self.deleteTextHandler,\
                                              eventHandler,\
@@ -288,7 +288,7 @@
     try:
       self.baseWidget.handler_unblock(self.mv_cur_handler)
     except:
-      pass      
+      pass
 
   def set_text(self,value):
     try:
@@ -302,9 +302,9 @@
       self.textBuffer.handler_unblock(self.insert_handler)
       self.textBuffer.handler_unblock(self.delete_handler)
     except:
-      pass      
+      pass
 
-  # pass through function calls 
+  # pass through function calls
   def __getattr__(self, attr):
     #print "doing %s" % attr
     if self.baseWidget and attr[1] != '_' and hasattr(self.baseWidget,attr):
@@ -320,15 +320,15 @@
     object._displayHandler.cursor = textiter.get_offset()
 
     # Compatibility layer for 0.5.1
-    #text = unicode(newtext,'utf-8')    
+    #text = unicode(newtext,'utf-8')
     text = unicode(newtext,'utf-8').encode(gConfigForms('textEncoding'))
-    
+
     action = events.Event('requestKEYPRESS', text, text=text,
                           code=0, _form=object._form)
-    
+
     # don't process event further
     widget.emit_stop_by_name('insert-text')
-    
+
     gtk.idle_add(eventHandler,action)  # our eventHandler will be called later
 
 
@@ -338,14 +338,14 @@
     object=uiDriver._WidgetToGFObj[self]
 
     cursor_iter = widget.get_iter_at_mark(widget.get_insert())
-    
-    
+
+
     action = events.Event('requestDELETERANGE',
                           start_pos=start_pos.get_offset(),
                           end_pos=end_pos.get_offset(),
                           position=cursor_iter.get_offset(),
                           _form=object._form)
-        
+
     widget.emit_stop_by_name('delete-range')
     gtk.idle_add(eventHandler,action)
 
@@ -357,14 +357,14 @@
 
     return
     cursor_iter = widget.get_iter_at_mark(widget.get_insert())
-    
-    
+
+
     action = events.Event('requestDELETERANGE',
                           start_pos=start_pos.get_offset(),
                           end_pos=end_pos.get_offset(),
                           position=cursor_iter.get_offset(),
                           _form=object._form)
-        
+
     widget.emit_stop_by_name('delete-range')
     gtk.idle_add(eventHandler,action)
 

Modified: trunk/gnue-forms/src/uidrivers/qt/QTSplashScreen.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/qt/QTSplashScreen.py 2004-02-24 12:40:37 UTC 
(rev 5152)
+++ trunk/gnue-forms/src/uidrivers/qt/QTSplashScreen.py 2004-02-25 05:35:08 UTC 
(rev 5153)
@@ -63,7 +63,7 @@
     wxStaticText(parent=self, id=-1, label=str(text),
                  size=wxSize(swidth,theight), 
pos=wxPoint(1,25),style=wxALIGN_CENTRE)
 
-    text = "(c)2000-2002 Free Software Foundation"
+    text = "(c)2000-2004 Free Software Foundation"
     twidth,theight = self.GetTextExtent(text)
     wxStaticText(self, -1, str(text),
                  wxPoint(1,50),wxSize(swidth,theight),wxALIGN_CENTRE)

Modified: trunk/gnue-forms/src/uidrivers/qt/ToolBar.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/qt/ToolBar.py        2004-02-24 12:40:37 UTC 
(rev 5152)
+++ trunk/gnue-forms/src/uidrivers/qt/ToolBar.py        2004-02-25 05:35:08 UTC 
(rev 5153)
@@ -19,11 +19,9 @@
 # Copyright 2000-2004 Free Software Foundation
 #
 # FILE:
-# wx/ToolBar.py
+# qt/ToolBar.py
 #
 # DESCRIPTION:
-# A generic UIdriver base for common message-based GUI toolkits.
-#
 # NOTES:
 #
 
@@ -35,7 +33,7 @@
 
   # Create the menu
   def init(self):
-    self.toolbar = QToolBar("GNUe Toolbar", self.container)
+    self.toolbar = QToolBar(_("Forms Navigation"), self.container)
     self.toolbar.show()
     return self.toolbar
 
@@ -61,32 +59,67 @@
       print "** WARNING: Cannot add '%s' to toolbar; no icon" % 
userAction.event
       return
 
-    button = QToolButton(self.toolbar, name)
-    button.setIconSet(icon)
-    button.setTextLabel(name)
+    action = QAction(self.toolbar, name)
+    action.setIconSet(icon)
+    action.setText(name)
     if userAction.canToggle:
-      button.setToggleButton(1)
+      action.setToggleAction(True)
 
-    return button
+    # Set popup tooltip
+    try:
+      action.setToolTip(userAction.help)
+    except AttributeError:
+      action.setToolTip(userAction.description)
 
 
+    # Set status tip   TODO: Doesn't seem to do anything
+    try:
+      action.setStatusTip(userAction.description)
+    except AttributeError:
+      pass
+
+    # Connect to the events
+    event = 'request%s' % userAction.event
+    function = '_%s_activate' % id(action)
+    if userAction.canToggle:
+      self.__dict__[function] = lambda state, l=self.driver, \
+              e=event, a=action, \
+              te='request%s' % userAction.canToggle, \
+              f=self.form: l.dispatchEvent(state and e or te,_form=f)
+
+      QObject.connect(action, SIGNAL('toggled(bool)'),self.__dict__[function])
+    else:
+      self.__dict__[function] = lambda l=self.driver, e=event, f=self.form: 
l.dispatchEvent(e,_form=f)
+      QObject.connect(action, SIGNAL('activated()'), self.__dict__[function])
+
+    # Add ourself to toolbar
+    action.addTo(self.toolbar)
+
+    return action
+
+
   # Add a separator
   def addSeparator(self):
     self.toolbar.addSeparator()
 
   # Enable a menu item
   def enableItem(self, item):
-    item.setEnabled(1)
+    item.setEnabled(True)
 
   # Disable a menu item
   def disableItem(self, item):
-    item.setEnabled(0)
+    item.setEnabled(False)
 
   def startingItem(self, item):
-    item.setOn(1)
+    item.setOn(True)
 
   def endingItem(self, item):
-    item.setOn(0)
+    item.setOn(False)
 
+  # A menu item was selected
+  def __itemSelected(self, itemid):
+    print "foobar"
+    self.driver.dispatchEvent(self.__idmap[itemid], _form=self.form)
 
+
 _cachedIcons = {}

Modified: trunk/gnue-forms/src/uidrivers/qt/UIdriver.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/qt/UIdriver.py       2004-02-24 12:40:37 UTC 
(rev 5152)
+++ trunk/gnue-forms/src/uidrivers/qt/UIdriver.py       2004-02-25 05:35:08 UTC 
(rev 5153)
@@ -164,21 +164,21 @@
     self._qtapp.exec_loop()
 
 
-  def _bell(self, event):
-    self._qtApp.bell()
+  def _beep(self, event):
+    self._qtapp.bell()
 
   #
   # Called whenever forms goes into a "wait" state in which user cannot
   # interact with interface (e.g., while waiting for a query or a commit)
   #
-  #def beginWait (self, event):
-  #  wxBeginBusyCursor()
+  def beginWait (self, event):
+    self._qtapp.setOverrideCursor(QCursor(self._qtapp.WaitCursor))
 
   #
   # Called whenever forms leaves a "wait" state
   #
-  #def endWait (self, event):
-  #  wxEndBusyCursor()
+  def endWait (self, event):
+    self._qtapp.restoreOverrideCursor()
 
 
   #
@@ -188,39 +188,14 @@
   # these methods should be overridden to use that
   # clipboard.
   #
-##   def getClipboardContents(self, event):
+  def getClipboardContents(self, event):
+    event.__result__ = str(self._qtapp.clipboard().text())
 
-##     if wxTheClipboard.Open():
-##       data = wxTextDataObject()
-##       success = wxTheClipboard.GetData(data)
-##       wxTheClipboard.Close()
-##     else:
-##       success = 0
-##       GDebug.printMesg(5,'Unable to open clipboard for read')
 
-##     if success:
-##       value = data.GetText()
-##     else:
-##       GDebug.printMesg(5,'Unable to obtain clipboard contents. Defaulting 
to Empty.')
-##       value = None
+  def setClipboardContents(self, event):
+    self._qtapp.clipboard().setText(event.text)
 
-##     GDebug.printMesg(5, "Getting clipboard value '%s'" % value)
-##     event.__result__ = value
 
-
-##   def setClipboardContents(self, event):
-
-##     GDebug.printMesg(5,"Setting clipboard '%s'" % event.text)
-
-##     if wxTheClipboard.Open():
-##       value = wxTheClipboard.SetData(wxTextDataObject(event.text))
-##       GDebug.printMesg(10,"Set Clipboard Status: %s" % value)
-##       wxTheClipboard.Close()
-
-##     else:
-##       GDebug.printMesg(5,'Unable to open clipboard for write')
-
-
   #############################################################################
   #
   # Internal Event Processors

Modified: trunk/gnue-forms/src/uidrivers/qt/common.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/qt/common.py 2004-02-24 12:40:37 UTC (rev 
5152)
+++ trunk/gnue-forms/src/uidrivers/qt/common.py 2004-02-25 05:35:08 UTC (rev 
5153)
@@ -22,8 +22,9 @@
 # UIqt.py
 #
 # DESCRIPTION:
-# A QT-based user interface driver for GNUe forms.
-#
+"""
+Common routines for the QT driver
+"""
 # NOTES:
 #
 
@@ -53,18 +54,16 @@
 #FIX#    'cp1250': wxFONTENCODING_CP1250,
 #FIX#    'cp1251': wxFONTENCODING_CP1251,
 #FIX#    'cp1252': wxFONTENCODING_CP1252
-   '':''        
-    }   
+   '':''
+    }
 
 
 
-# hack for wxPython 2.2 (2.3+ doesn't need this)
+# TODO: get rid of this call
 def _eventObjToQtWindow(event):
-#FIX#    eo = event.GetEventObject()
-#FIX#    return wxPyTypeCast(eo, 'wxWindow')
   return event
-    
 
+
 #
 # Little global helper routine to set font according to options
 #
@@ -86,26 +85,27 @@
 #####################################################################
 
 def _setDefaultEventHandlers(newWidget, eventHandler, initialize, uiDriver):
-  return 
-##  if initialize:      
+  return
+##  if initialize:
 ##    uiBaseEvtHandler(newWidget, eventHandler, uiDriver)
-        
 
+
 ##
 ##
 ##
-class uiBaseEvtHandler: 
-  def __init__(self, event, uiwidget): 
+class uiBaseEvtHandler:
+  def __init__(self, event, uiwidget, qtClass=None):
     self._eventHandler = event.eventHandler
     self._uiwidget = uiwidget
+    self._qtClass = qtClass
     self.setFocusPolicy(QWidget.NoFocus)
-    
+
   #
   # Over-ride events
   #
   def keyPressEvent(self, event):
     action = None
-    
+
     uiwidget = self._uiwidget
     gfObject = uiwidget._gfObject
 
@@ -174,7 +174,6 @@
   # Over-ride events
   #
   def mousePressEvent(self, event):
-    print "BOING!"
     uiwidget = self._uiwidget
     gfObject = uiwidget._gfObject
 
@@ -184,14 +183,27 @@
       count = uiwidget._uiDriver._IdToUIObj[id(self)].widgets.index(self)
       self._eventHandler('requestJUMPRECORD',count - 
gfObject._visibleIndex,_form=gfObject._form)
 
-    # TODO: HACK!!! does QT not have a way to translate a
-    # TODO: mouse click into text insertion point?
-    cursorPosition = int(event.x() / float(uiwidget._uiDriver.textWidth)+0.5)
-    
self._eventHandler('requestCURSORMOVE',position=cursorPosition,_form=gfObject._form)
+    if self._qtClass:
+      self._qtClass.mousePressEvent(self, event)
+    try:
+      self.__cursor = self.cursorPosition()
+      selected, start, end = self.getSelection()
+      
self._eventHandler('requestCURSORMOVE',position=self.cursorPosition(),_form=gfObject._form)
+      if selected:
+        
self._eventHandler('requestSELECTWITHMOUSE',position1=start,position2=end,_form=gfObject._form)
+    except AttributeError:
+      pass # Not everything has a cursorPosition()
 
-    
 
-                                                              
+  def _selectionChanged(self):
+    uiwidget = self._uiwidget
+    gfObject = uiwidget._gfObject
+    selected, start, end = self.getSelection()
+    if selected:
+      
self._eventHandler('requestSELECTWITHMOUSE',position1=start,position2=end,_form=gfObject._form)
+
+
+
 #####################################################################
 ##
 ## Keymapper Support
@@ -218,4 +230,4 @@
 
 GFKeyMapper.KeyMapper.setUIKeyMap(qtKeyTranslations)
 
-      
+

Modified: trunk/gnue-forms/src/uidrivers/qt/widgets/_base.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/qt/widgets/_base.py  2004-02-24 12:40:37 UTC 
(rev 5152)
+++ trunk/gnue-forms/src/uidrivers/qt/widgets/_base.py  2004-02-25 05:35:08 UTC 
(rev 5153)
@@ -134,7 +134,7 @@
 
   def setSelectedArea(self, selection1, selection2, index=0):
     try:
-      self.widgets[index].setSelection(selection1, selection2)
+      self.widgets[index].setSelection(selection1, selection2-selection1)
     except (AttributeError, TypeError):
       pass  # For label-style & dropdown entries
 

Modified: trunk/gnue-forms/src/uidrivers/qt/widgets/button.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/qt/widgets/button.py 2004-02-24 12:40:37 UTC 
(rev 5152)
+++ trunk/gnue-forms/src/uidrivers/qt/widgets/button.py 2004-02-25 05:35:08 UTC 
(rev 5153)
@@ -41,19 +41,19 @@
 class UIButton(UIHelper):
   def _createWidget(self, event, spacer):
     object = event.object
-    
+
     # Create a button..
     newWidget = _Button(event, self)
-    
+
     # .. set the label text..
     newWidget.setText(str(object.label))
-    
+
     # .. the examples had this, so we do to ..  :)
     newWidget.setAutoDefault(1)
-    
+
     # ..and move it to it's proper place
     newWidget.setGeometry(object.Char__x*event.widgetWidth,
-                          
(object.Char__y+spacer+(spacer*object._gap))*event.widgetHeight, 
+                          
(object.Char__y+spacer+(spacer*object._gap))*event.widgetHeight,
                           self.itemWidth,self.itemHeight)
 
     # Attach the events to our button, and we can all go home...
@@ -61,23 +61,22 @@
       self._eventHandler = event.eventHandler
       QObject.connect(newWidget, SIGNAL("clicked()"), self.buttonHandler)
       #QObject.connect(newWidget, PYSIGNAL("sigClicked"), self.buttonHandler)
-      
 
+
     return newWidget
 
   #
   #
   def buttonHandler(self):
-    print "Click"
     self._eventHandler('buttonActivated', self._gfObject)
 
 
-class _Button(_Base, QPushButton): 
-  def __init__(self, event, *args): 
+class _Button(_Base, QPushButton):
+  def __init__(self, event, *args):
     QPushButton.__init__(self, event.container,'button%s' % id(self))
-    _Base.__init__(self, event, *args)
-    
-    
+    _Base.__init__(self, event, qtClass=QPushButton, *args)
+
+
 configuration = {
     'baseClass'  : UIButton,
     'provides'   : 'GFButton',

Modified: trunk/gnue-forms/src/uidrivers/qt/widgets/entry.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/qt/widgets/entry.py  2004-02-24 12:40:37 UTC 
(rev 5152)
+++ trunk/gnue-forms/src/uidrivers/qt/widgets/entry.py  2004-02-25 05:35:08 UTC 
(rev 5153)
@@ -22,8 +22,9 @@
 # UIwxpython.py
 #
 # DESCRIPTION:
-# A QT-based user interface driver for GNUe forms.
-#
+"""
+Entry widget
+"""
 # NOTES:
 #
 from qt import *
@@ -52,20 +53,20 @@
 
       newWidget = _ComboBox(event, self)
       newWidget.setInsertionPolicy(QComboBox.NoInsertion)
-      
+
       if event.initialize:
         newWidget.setChoices(choices)
         newWidget._origAllowedValues = object._field._allowedValues
-        newWidget.setEditable(1)
-        newWidget.setCurrentItem(0)
-        
+        newWidget.setEditable(True)
+        newWidget.setCurrentItem(False)
+
         # TODO: Listen for textChanged(), highlighted()
 
 
     elif style == 'label':
-      newWidget = QLabel("", event.container) 
-              
+      newWidget = QLabel("", event.container)
 
+
     elif style == 'checkbox':
       newWidget = _CheckBox(event, self)
 
@@ -73,81 +74,124 @@
       newWidget.setText(object.label)
 
       if event.initialize:
-        newWidget.setChecked(0)
-        
+        newWidget.setChecked(False)
+
         # TODO: Listen for "clicked()"
 
 
     else: # Normal text box
       if hasattr(object,'Char__height') and object.Char__height > 1:
         cls = _MultiLineEdit
-      else: 
+      else:
         # TODO: According to the QT 3 docs, we should probably switch
         # TODO: to QTextEdit.  However, I'm not sure how to check for
         # TODO: the QT version in use :)
         cls = _SingleLineEdit
 
       newWidget = cls(event, self)
-          
+
       # TODO: Capture textChanged, returnPressed, selectionChanged signals
-      
-      
+
+
     # Move it to it's proper place
     newWidget.setGeometry(object.Char__x*event.widgetWidth,
-                          
(object.Char__y+spacer+(spacer*object._gap))*event.widgetHeight, 
+                          
(object.Char__y+spacer+(spacer*object._gap))*event.widgetHeight,
                           self.itemWidth,self.itemHeight)
-      
-    
+
+
 ##    # Attach the events to our entry and call it a night...
 ##    if event.initialize:
 ##      self._eventHandler = event.eventHandler
 ##      _setDefaultEventHandlers(newWidget, event.eventHandler, 
event.initialize,self._uiDriver)
 
-    
+
     return newWidget
 
-    
+
 ###########################################################
 #
 #  Our custom event-riddled QObjects
 #
-class _SingleLineEdit (_Base, QLineEdit): 
-  def __init__(self, event, uiwidget): 
+class _SingleLineEdit (_Base, QLineEdit):
+  """
+  """
+  def __init__(self, event, uiwidget):
     QLineEdit.__init__(self, event.container)
-    _Base.__init__(self, event, uiwidget)
+    _Base.__init__(self, event, uiwidget, QLineEdit)
+    QObject.connect(self, SIGNAL('selectionChanged()'), self._selectionChanged)
 
-    
-class _MultiLineEdit (_Base, QLineEdit): 
 
-  def __init__(self, event, uiwidget): 
-    QLineEdit.__init__(self, event.container)
-    _Base.__init__(self, event, uiwidget)
 
-    
-class _ComboBox (_Base, QComboBox): 
-  def __init__(self, event, uiwidget): 
-    QComboBox.__init__(self, event.container)
-    _Base.__init__(self, event, uiwidget)
 
-  def setChoices(self,choices): 
+class _MultiLineEdit (_Base, QTextEdit):
+  """
+  """
+  def __init__(self, event, uiwidget):
+    QTextEdit.__init__(self, event.container)
+    _Base.__init__(self, event, uiwidget, QTextEdit)
+    QObject.connect(self, SIGNAL('selectionChanged()'), self._selectionChanged)
+
+
+
+class _ComboBox (_Base, QComboBox):
+  """
+  """
+  def __init__(self, event, uiwidget):
+    QComboBox.__init__(self, True, event.container, "Foo")
+    _Base.__init__(self, event, uiwidget, QComboBox)
+    QComboBox.setLineEdit(self, _SingleLineEdit(event, uiwidget))
+    QObject.connect(self, SIGNAL('activated(int)'), self.__itemSelected)
+
+  def setChoices(self,choices):
     self.__choices = choices
-    for choice in choices: 
+    for choice in choices:
       self.insertItem(choice)
-    
-  def setText(self, text): 
+
+  def setText(self, text):
     self.setCurrentItem(self.__choices.index(text))
-  
 
-class _CheckBox (_Base, QCheckBox): 
-  def __init__(self, event, uiwidget): 
+  def __itemSelected(self, selection):
+    selected_text = self.__choices[selection]
+
+    uiwidget = self._uiwidget
+    gfObject = uiwidget._gfObject
+    action = events.Event('requestREPLACEVALUE',object=gfObject,
+                          index=selection, text=selected_text,
+                          _form=gfObject._form)
+
+    # TODO: allow veto
+    self._eventHandler(action)
+
+  def focusInEvent(self,event):
+    uiwidget = self._uiwidget
+    gfObject = uiwidget._gfObject
+    self._eventHandler('requestFOCUS',gfObject,_form=gfObject._form)
+    count = uiwidget._uiDriver._IdToUIObj[id(self)].widgets.index(self)
+    self._eventHandler('requestJUMPRECORD',count - 
gfObject._visibleIndex,_form=gfObject._form)
+
+
+class _ComboBoxLineEdit(QLineEdit):
+  def __init__(self, parent, *args, **parms):
+    QLineEdit(*args, **parms)
+    self.__parent = parent
+    self.setFocusPolicy(QWidget.NoFocus)
+
+  def focusInEvent(self,event):
+    self.__parent.focusInEvent(event)
+
+
+class _CheckBox (_Base, QCheckBox):
+  """
+  """
+  def __init__(self, event, uiwidget):
     QCheckBox.__init__(self, event.container)
-    _Base.__init__(self, event, uiwidget)
+    _Base.__init__(self, event, uiwidget, QCheckBox)
 
 #
 #
-#           
+#
 configuration = {
     'baseClass'  : UIEntry,
     'provides'   : 'GFEntry',
-    'container'  : 0,
+    'container'  : False,
   }

Modified: trunk/gnue-forms/src/uidrivers/qt/widgets/form/widget.py
===================================================================
--- trunk/gnue-forms/src/uidrivers/qt/widgets/form/widget.py    2004-02-24 
12:40:37 UTC (rev 5152)
+++ trunk/gnue-forms/src/uidrivers/qt/widgets/form/widget.py    2004-02-25 
05:35:08 UTC (rev 5153)
@@ -44,12 +44,12 @@
 # Widget set specific function that creates a single instance of a Form widget
 #
 class UIForm(UIHelper):
-  
+
   def __init__(self, event):
     self._uiPageList=[]
     UIHelper.__init__(self, event)
 
-    
+
   def _createWidget(self, event, spacer):
     object = event.object
 
@@ -136,7 +136,7 @@
   #
   def gotoPage(self,event):
     
self._wrapper.setPage(self._uiDriver._gfObjToUIWidget[event.data].widgets[0])
-    
+
 ##    if not self._notebook:
 ##      for page in self._uiPageList:
 ##        if page != uiPage:
@@ -145,18 +145,25 @@
 ##          page.show()
 ##    else:
 ##      # uiPage widgets only contain 1 item
-##      
+##
 ##      pageId = uiPage.widgets[0].GetId()
-##      
+##
 ##      for count in range(self._notebook.GetPageCount()):
 ##        if pageId == self._notebook.GetPage(count).GetId():
 ##          self._notebook.SetSelection(count)
-      
-                     
+
+
   #
   # _setStatusBar
   #
   def _setStatusBar(self,tip, statusValue, insertValue, currentRecord, 
maxRecord, currentPage, maxPage):
+
+    # Popup forms don't seem to have a statusbar
+    try:
+      self.statusFields
+    except AttributeError:
+      return
+
     if tip != None: self.statusFields[0].setText(str(tip))
 
     if statusValue:
@@ -171,11 +178,11 @@
     if currentPage and  maxPage:
       self.statusFields[3].setText((string.strip("%s/%s" % 
(currentPage,maxPage))))
 
-    #### TODO #####      
+    #### TODO #####
     return
     #### TODO #####
-    
-      
+
+
     #
     # Adjust the status fields to reflect width of text in them
     #





reply via email to

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