00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 from Koo.Common import Common
00030 from Koo.Fields.AbstractFieldWidget import *
00031 from Koo.Fields.AbstractFieldDelegate import *
00032 from PyQt4.QtCore import *
00033 from PyQt4.QtGui import *
00034
00035 class SelectionFieldWidget(AbstractFieldWidget):
00036 def __init__(self, parent, view, attrs={}):
00037 AbstractFieldWidget.__init__(self, parent, view, attrs)
00038
00039 self.widget = QComboBox( self )
00040 self.widget.setFrame( True )
00041 self.widget.setEditable( True )
00042 self.widget.setInsertPolicy( QComboBox.NoInsert )
00043 self.widget.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Fixed )
00044
00045
00046
00047
00048 self.setFocusProxy( self.widget )
00049
00050 layout = QHBoxLayout( self )
00051 layout.setContentsMargins( 0, 0, 0, 0 )
00052 layout.addWidget( self.widget )
00053
00054 self._changed = False
00055
00056 self.installPopupMenu( self.widget )
00057
00058 self.connect( self.widget, SIGNAL('activated(int)'), self.activated )
00059 self.connect( self.widget, SIGNAL('editTextChanged(QString)'), self.changed )
00060 self.fill( attrs.get('selection') or [] )
00061
00062 def fill(self, selection):
00063 for (id,name) in selection:
00064 self.widget.addItem( name, QVariant(id) )
00065
00066 def setReadOnly(self, value):
00067 AbstractFieldWidget.setReadOnly(self, value)
00068 self.widget.setEnabled(not value)
00069
00070 def changed(self, text):
00071 self._changed = True
00072
00073 def value(self):
00074 if not self._changed:
00075 return self.record.value(self.name)
00076
00077
00078
00079 value = self.widget.itemData( self.widget.findText( self.widget.currentText(), Qt.MatchExactly | Qt.MatchCaseSensitive) )
00080 if not value.isValid():
00081 value = self.widget.itemData( self.widget.findText( self.widget.currentText(), Qt.MatchExactly ) )
00082 if not value.isValid():
00083 value = self.widget.itemData( self.widget.findText( self.widget.currentText(), Qt.MatchContains ) )
00084 if value.isValid():
00085 if value.typeName() == 'QString':
00086 return unicode( value.toString() )
00087 else:
00088 return value.toLongLong()[0]
00089 else:
00090 return False
00091
00092 def storeValue(self):
00093 self.record.setValue(self.name, self.value())
00094
00095 def clear(self):
00096 self.widget.setCurrentIndex( self.widget.findText('') )
00097
00098 def showValue(self):
00099 value = self.record.value(self.name)
00100 if not value:
00101 self.widget.setCurrentIndex( self.widget.findText( '') )
00102 else:
00103 self.widget.setCurrentIndex( self.widget.findData( QVariant(value) ) )
00104 self._changed = False
00105
00106 def activated(self, idx):
00107 self.store()
00108
00109 def colorWidget(self):
00110 return self.widget
00111
00112 class SelectionFieldDelegate( AbstractFieldDelegate ):
00113 def createEditor(self, parent, option, index):
00114 widget = QComboBox( parent )
00115 widget.setEditable( False )
00116 widget.setInsertPolicy( QComboBox.InsertAtTop )
00117 for (id,name) in self.attributes.get('selection',[]):
00118 widget.addItem( name, QVariant(id) )
00119 return widget
00120
00121 def setEditorData(self, editor, index):
00122 value = index.data(Qt.EditRole).toString()
00123 editor.setCurrentIndex( editor.findText( value ) )
00124
00125 def setModelData(self, editor, model, index):
00126 model.setData( index, QVariant( editor.currentText() ), Qt.EditRole )
00127
00128
00129
00130
00131