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
00030 from Koo import Rpc
00031 from Koo.Common import Api
00032 from Koo.Common import Help
00033 from FieldPreferencesDialog import *
00034
00035 from PyQt4.QtGui import *
00036 from PyQt4.QtCore import *
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047 class AbstractFieldWidget(QWidget):
00048
00049
00050
00051
00052
00053 def __init__(self, parent, view, attributes):
00054 QWidget.__init__(self, parent)
00055
00056 self.attrs = attributes
00057 self.view = view
00058
00059 self._isInitialized = False
00060 self._isUpToDate = False
00061
00062
00063
00064
00065
00066 self._required = self.attrs.get('required', False) not in ('False', '0', False)
00067 self._readOnly = self.attrs.get('readonly', False) not in ('False', '0', False)
00068
00069
00070 self.setStyleSheet( eval(self.attrs.get('use', '{}')).get('stylesheet','') )
00071
00072 self.defaultReadOnly= self._readOnly
00073 self.defaultMenuEntries = [
00074 (_('Set to default value'), self.setToDefault, 1),
00075 ]
00076
00077
00078
00079 if self.view:
00080 self.defaultMenuEntries.append( (_('Set as default value'), self.setAsDefault, 1) )
00081
00082
00083 self.name = self.attrs.get('name', 'unnamed')
00084 self.record = None
00085
00086
00087 self.colors = {
00088 'invalid' : '#FF6969',
00089 'readonly' : '#e3e3e3',
00090 'required' : '#ddddff',
00091 'normal' : 'white'
00092 }
00093
00094 def addShortcut(self, keys):
00095 if not keys:
00096 return
00097 shortcut = QShortcut(QKeySequence(keys), self)
00098 self.connect(shortcut, SIGNAL('activated()'), self.setFocus)
00099
00100 def initialize(self):
00101 self.addShortcut( eval(self.attrs.get('use', '{}')).get('shortcut','') )
00102
00103 def showEvent(self, event):
00104 if not self._isInitialized:
00105 self._isInitialized = True
00106 self.initGui()
00107 self.initialize()
00108 if not self._isUpToDate:
00109 self._isUpToDate = True
00110 if self.record:
00111 self.showValue()
00112 self.updateColor()
00113 return QWidget.showEvent(self, event)
00114
00115 def showHelp(self):
00116 QApplication.setOverrideCursor( Qt.WaitCursor )
00117 helpWidget = Help.HelpWidget( self.sender() )
00118 helpWidget.setLabel( self.attrs.get('string','') )
00119 helpWidget.setHelp( self.attrs.get('help','') )
00120 helpWidget.setType( helpWidget.FieldType )
00121 if self.record:
00122
00123 helpWidget.setFilter( (self.record.group.resource, self.name) )
00124 helpWidget.show()
00125 QApplication.restoreOverrideCursor()
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136 def initGui(self):
00137 return
00138
00139
00140
00141
00142 def setToDefault(self):
00143 try:
00144 model = self.record.group.resource
00145 res = Rpc.session.call('/object', 'execute', model, 'default_get', [self.attrs['name']])
00146 self.record.setValue(self.name, res.get(self.name, False))
00147 self.display()
00148 except:
00149 QMessageBox.warning(None, _('Operation not permited'), _('You can not set to the default value here !') )
00150 return False
00151
00152
00153 def setAsDefault(self):
00154 if not self.view:
00155 return
00156 deps = []
00157 wid = self.view.widgets
00158 for wname, wview in self.view.widgets.items():
00159 if wview.attrs.get('change_default', False):
00160 value = wview.record.value(wview.name)
00161 deps.append((wname, wname, value, value))
00162 value = self.record.default( self.name )
00163 model = self.record.group.resource
00164 dialog = FieldPreferencesDialog(self.attrs['name'], self.attrs.get('string', self.attrs['name']), model, value, deps)
00165 dialog.exec_()
00166
00167
00168 def updateColor(self):
00169 if self.record and not self.record.isFieldValid( self.name ):
00170 self.setColor('invalid')
00171 elif self._readOnly:
00172 self.setColor('readonly')
00173 elif self._required:
00174 self.setColor('required')
00175 else:
00176 self.setColor('normal')
00177
00178
00179
00180
00181
00182 def setReadOnly(self, ro):
00183 self._readOnly = ro
00184 self.updateColor()
00185
00186
00187 def isReadOnly(self):
00188 return self._readOnly
00189
00190
00191
00192
00193 def refresh(self):
00194 self.setReadOnly( self._readOnly )
00195
00196
00197
00198
00199 def colorWidget(self):
00200 return self
00201
00202
00203
00204
00205 def menuEntries(self):
00206 return []
00207
00208
00209
00210
00211
00212 def setColor(self, name):
00213 color = QColor( self.colors.get( name, 'white' ) )
00214 palette = QPalette()
00215 palette.setColor(QPalette.Active, QPalette.Base, color)
00216 self.colorWidget().setPalette(palette);
00217
00218
00219
00220
00221 def installPopupMenu( self, widget ):
00222 widget.installEventFilter( self )
00223
00224
00225
00226
00227 def eventFilter( self, target, event ):
00228 if event.type() == QEvent.ContextMenu:
00229 self.showPopupMenu( target, event.globalPos() )
00230 return True
00231 if event.type() == QEvent.FocusOut:
00232 if self.record:
00233 self.store()
00234 return False
00235
00236
00237
00238 def showPopupMenu(self, parent, position):
00239 entries = self.defaultMenuEntries[:]
00240 new = self.menuEntries()
00241 if len(new) > 0:
00242 entries = entries + [(None, None, None)] + new
00243 menu = QMenu( parent )
00244 for title, slot, enabled in entries:
00245 if title:
00246 item = QAction( title, menu )
00247 if slot:
00248 self.connect( item, SIGNAL("triggered()"), slot )
00249 item.setEnabled( enabled )
00250 menu.addAction( item )
00251 else:
00252 menu.addSeparator()
00253 menu.popup( position )
00254
00255
00256
00257
00258
00259 def modified(self):
00260 if not self.record:
00261 return
00262 self.store()
00263
00264
00265
00266 def showValue(self):
00267 pass
00268
00269
00270
00271 def clear(self):
00272 pass
00273
00274
00275
00276
00277
00278 def display(self):
00279 if not self.record:
00280 self._readOnly = True
00281 self.clear()
00282 self.refresh()
00283 return
00284 self._readOnly = self.record.isFieldReadOnly(self.name)
00285 self._required = self.record.isFieldRequired(self.name)
00286 self.refresh()
00287 if self.isVisible():
00288 if not self._isInitialized:
00289 self._isInitialized = True
00290 self.initGui()
00291 self.initialize()
00292 self._isUpToDate = True
00293 self.showValue()
00294 else:
00295 self._isUpToDate = False
00296
00297 def reset(self):
00298 self.refresh()
00299
00300
00301 def load(self, record ):
00302 self.record = record
00303 self.display()
00304
00305
00306
00307 def storeValue(self):
00308 pass
00309
00310
00311
00312
00313
00314 def store(self):
00315 if not self._isUpToDate:
00316 return
00317 self.storeValue()
00318
00319 def saveState(self):
00320 return QByteArray()
00321
00322 def restoreState(self, state):
00323 pass