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 PyQt4.QtCore import *
00030 from PyQt4.QtGui import *
00031 from PyQt4.uic import *
00032
00033 from Koo.Fields.AbstractFieldWidget import *
00034 from Koo.Fields.AbstractFieldDelegate import *
00035 from Koo.Common import Api
00036 from Koo.Common import Common
00037 from Koo.Common import Shortcuts
00038 from Koo.Screen.Screen import Screen
00039 from Koo.Model.Group import RecordGroup
00040
00041 (OneToManyDialogUi, OneToManyDialogBase) = loadUiType( Common.uiPath('one2many_dialog.ui') )
00042
00043 class OneToManyDialog( QDialog, OneToManyDialogUi ):
00044 def __init__(self, modelGroup, parent, record=None, attrs=None, creationContext=None):
00045 QDialog.__init__( self, parent )
00046 OneToManyDialogUi.__init__( self )
00047 self.setupUi( self )
00048
00049 if attrs is None:
00050 attrs = {}
00051 if creationContext is None:
00052 creationContext = {}
00053
00054 self.creationContext = creationContext
00055
00056 self.setModal(True)
00057 if ('string' in attrs) and attrs['string']:
00058 self.setWindowTitle( self.windowTitle() + " - " + attrs['string'])
00059
00060 self.screen.setRecordGroup( modelGroup )
00061 self.screen.setEmbedded( True )
00062
00063
00064 if ('views' in attrs) and ('form' in attrs['views']):
00065 arch = attrs['views']['form']['arch']
00066 fields = attrs['views']['form']['fields']
00067 self.screen.addView(arch, fields, display=True)
00068 else:
00069 self.screen.addViewByType('form', display=True)
00070
00071 if not record:
00072 self._recordAdded = True
00073 record = self.screen.new(context=self.creationContext)
00074 else:
00075 self._recordAdded = False
00076 self.screen.setCurrentRecord( record )
00077
00078 self.screen.display()
00079
00080 self.connect( self.pushOk, SIGNAL("clicked()"), self.accepted )
00081 self.connect( self.pushCancel, SIGNAL("clicked()"), self.rejected )
00082 self.connect( self, SIGNAL('reject()'), self.cleanup )
00083 self.connect( self.pushPrevious, SIGNAL('clicked()'), self.previous )
00084 self.connect( self.pushNext, SIGNAL('clicked()'), self.next )
00085
00086 if not self._recordAdded:
00087
00088
00089 self.pushCancel.hide()
00090
00091
00092
00093
00094 size = self.screen.sizeHint()
00095 available = QDesktopWidget().availableGeometry().size()
00096 available -= QSize( 180, 180 )
00097 self.screen.setMinimumSize( size.boundedTo( available ) )
00098
00099 self.updatePosition()
00100 self.show()
00101
00102 def setReadOnly(self, value):
00103 self.screen.setReadOnly( value )
00104
00105 def cleanup(self):
00106 if self._recordAdded:
00107 self.screen.remove()
00108
00109
00110 self.screen.setCurrentRecord( None )
00111
00112 def rejected( self ):
00113 self.cleanup()
00114 self.reject()
00115
00116 def accepted( self ):
00117 if self._recordAdded:
00118 self.screen.currentView().store()
00119 self.screen.new(context=self.creationContext)
00120 self.updatePosition()
00121 else:
00122 self.screen.currentView().store()
00123
00124
00125 self.screen.setCurrentRecord( None )
00126 self.accept()
00127
00128 def updatePosition( self ):
00129 position = self.screen.group.indexOfRecord( self.screen.currentRecord() ) + 1
00130 total = self.screen.group.count()
00131 self.uiPosition.setText( '(%s/%s)' % (position, total) )
00132
00133 def previous( self ):
00134 self.screen.currentView().store()
00135 self.screen.displayPrevious()
00136 self.updatePosition()
00137
00138 def next( self ):
00139 self.screen.currentView().store()
00140 self.screen.displayNext()
00141 self.updatePosition()
00142
00143 (OneToManyFieldWidgetUi, OneToManyFieldWidgetBase ) = loadUiType( Common.uiPath('one2many.ui') )
00144
00145 class OneToManyFieldWidget(AbstractFieldWidget, OneToManyFieldWidgetUi):
00146 def __init__(self, parent, model, attrs={}):
00147 AbstractFieldWidget.__init__(self, parent, model, attrs)
00148 OneToManyFieldWidgetUi.__init__(self)
00149 self.setupUi(self)
00150
00151 self.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Expanding )
00152
00153
00154
00155 self.connect( self.pushNew, SIGNAL( "clicked()"),self.new )
00156 self.connect( self.pushEdit,SIGNAL( "clicked()"),self.edit )
00157 self.connect( self.pushRemove, SIGNAL( "clicked()"),self.remove )
00158 self.connect( self.pushBack, SIGNAL( "clicked()"),self.previous )
00159 self.connect( self.pushForward, SIGNAL( "clicked()"),self.next )
00160 self.connect( self.pushSwitchView, SIGNAL( "clicked()"),self.switchView )
00161
00162 self.connect(self.screen, SIGNAL('recordMessage(int,int,int)'), self.setLabel)
00163 self.connect(self.screen, SIGNAL('activated()'), self.edit)
00164
00165
00166 self.scNew = QShortcut( self )
00167 self.scNew.setKey( Shortcuts.NewInOneToMany )
00168 self.scNew.setContext( Qt.WidgetWithChildrenShortcut )
00169 self.connect( self.scNew, SIGNAL('activated()'), self.new )
00170
00171 self.scEdit = QShortcut( self )
00172 self.scEdit.setKey( Shortcuts.EditInOneToMany )
00173 self.scEdit.setContext( Qt.WidgetWithChildrenShortcut )
00174 self.connect( self.scEdit, SIGNAL('activated()'), self.edit )
00175
00176 self.scDelete = QShortcut( self )
00177 self.scDelete.setKey( Shortcuts.DeleteInOneToMany )
00178 self.scDelete.setContext( Qt.WidgetWithChildrenShortcut )
00179 self.connect( self.scDelete, SIGNAL('activated()'), self.remove )
00180
00181 self.scSwitchView = QShortcut( self )
00182 self.scSwitchView.setKey( Shortcuts.SwitchViewInOneToMany )
00183 self.scSwitchView.setContext( Qt.WidgetWithChildrenShortcut )
00184 self.connect( self.scSwitchView, SIGNAL('activated()'), self.switchView )
00185
00186
00187
00188
00189
00190 def initGui(self):
00191 if self.record:
00192 group = self.record.value(self.name)
00193 else:
00194 group = None
00195 if not group:
00196 group = RecordGroup( self.attrs['relation'] )
00197 group.setDomainForEmptyGroup()
00198
00199 self.screen.setRecordGroup( group )
00200 self.screen.setPreloadedViews( self.attrs.get('views', {}) )
00201 self.screen.setEmbedded( True )
00202 self.screen.setViewTypes( self.attrs.get('mode', 'tree,form').split(',') )
00203 self.uiTitle.setText( self.screen.currentView().title )
00204
00205 def switchView(self):
00206
00207
00208
00209 if QApplication.keyboardModifiers() & Qt.ControlModifier:
00210 if not self.screen.currentRecord():
00211 return
00212 id = self.screen.currentRecord().id
00213 if not id:
00214 return
00215
00216 if QApplication.keyboardModifiers() & Qt.ShiftModifier:
00217 target = 'background'
00218 else:
00219 target = 'current'
00220
00221 Api.instance.createWindow( False, self.attrs['relation'], id, [('id','=',id)], 'form',
00222 mode='form,tree', target=target )
00223 else:
00224 self.screen.switchView()
00225
00226 def setReadOnly(self, value):
00227 AbstractFieldWidget.setReadOnly(self, value)
00228 self.uiTitle.setEnabled( not value )
00229 self.pushNew.setEnabled( not value )
00230 self.pushRemove.setEnabled( not value )
00231 self.updateButtons()
00232
00233 def updateButtons(self):
00234 if not self.screen.group:
00235 value = False
00236 else:
00237 value = True
00238 self.pushEdit.setEnabled( value )
00239 self.pushBack.setEnabled( value )
00240 self.pushForward.setEnabled( value )
00241 self.pushSwitchView.setEnabled( value )
00242
00243 def colorWidget(self):
00244 return self.screen
00245
00246 def new(self):
00247
00248
00249
00250 self.view.store()
00251
00252 ctx = self.record.evaluateExpression(self.attrs.get('default_get', {}))
00253 ctx.update(self.record.evaluateExpression( 'dict(%s)' % self.attrs.get('context', '')))
00254
00255 if ( not self.screen.currentView().showsMultipleRecords() ) or not self.screen.currentView().isReadOnly():
00256 self.screen.new(context=ctx)
00257 else:
00258 dialog = OneToManyDialog(self.screen.group, parent=self, attrs=self.attrs, creationContext=ctx)
00259 dialog.exec_()
00260 self.screen.display()
00261
00262 def edit(self):
00263 if not self.screen.currentRecord():
00264 QMessageBox.information(self, _('Information'), _('No record selected'))
00265 return
00266 dialog = OneToManyDialog( self.screen.group, parent=self, record=self.screen.currentRecord(), attrs=self.attrs)
00267 dialog.setReadOnly( self.isReadOnly() )
00268 dialog.exec_()
00269 self.screen.display()
00270
00271 def next(self ):
00272 self.screen.displayNext()
00273
00274 def previous(self):
00275 self.screen.displayPrevious()
00276
00277 def remove(self):
00278
00279
00280
00281 self.view.store()
00282 self.screen.remove()
00283
00284 def setLabel(self, position, count, value):
00285 name = '_'
00286 if position >= 0:
00287 name = str(position + 1)
00288 line = '(%s/%s)' % (name, count)
00289 self.uiLabel.setText( line )
00290
00291 def clear(self):
00292 self.screen.setRecordGroup( None )
00293 self.screen.display()
00294
00295 def showValue(self):
00296 group = self.record.value(self.name)
00297
00298 group.setContext( self.record.fieldContext( self.name ) )
00299 if self.screen.group != group:
00300 self.screen.setRecordGroup(group)
00301
00302
00303
00304 self.screen.display()
00305 self.updateButtons()
00306
00307 def storeValue(self):
00308 self.screen.currentView().store()
00309
00310 def saveState(self):
00311 self.screen.storeViewSettings()
00312 return AbstractFieldWidget.saveState(self)
00313
00314
00315
00316
00317
00318 class OneToManyFieldDelegate( AbstractFieldDelegate ):
00319 def setEditorData(self, editor, index):
00320 pass
00321 def setModelData(self, editor, model, index):
00322 pass
00323