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