[Top][All Lists]
[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
#
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- r5153 - in trunk/gnue-forms/src: . uidrivers/gtk2/widgets uidrivers/qt uidrivers/qt/widgets uidrivers/qt/widgets/form,
jcater <=