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 import os
00030 import tempfile
00031
00032 from Koo.Fields.AbstractFieldWidget import *
00033 from PyQt4.QtCore import *
00034 from PyQt4.QtGui import *
00035 from PyQt4.uic import *
00036
00037 from Koo.Common import Common
00038 from Koo.Common import Semantic
00039 from Koo.Common import Numeric
00040
00041 try:
00042 from NanScan.ScanDialog import ScanDialog, AbstractImageSaverFactory, AbstractImageSaver
00043 isNanScanAvailable = True
00044 except:
00045 isNanScanAvailable = False
00046
00047 if isNanScanAvailable:
00048 class BinaryImageSaverFactory(AbstractImageSaverFactory):
00049 def __init__(self, record, field):
00050 self.record = record
00051 self.field = field
00052
00053 def create(self, parent):
00054 saver = BinaryImageSaver( parent )
00055 saver.record = self.record
00056 saver.field = self.field
00057 return saver
00058
00059 class BinaryImageSaver(AbstractImageSaver):
00060 def run(self):
00061 self.error = True
00062 image = QBuffer()
00063 if self.item.image.save( image, 'PNG' ):
00064 self.error = False
00065 self.record.setValue( self.field, str( image.buffer() ) )
00066
00067 (BinaryFieldWidgetUi, BinaryFieldWidgetBase) = loadUiType( Common.uiPath('binary.ui') )
00068
00069 class BinaryFieldWidget(AbstractFieldWidget, BinaryFieldWidgetUi):
00070 def __init__(self, parent, model, attrs={}):
00071 AbstractFieldWidget.__init__(self, parent, model, attrs)
00072 BinaryFieldWidgetUi.__init__(self)
00073 self.setupUi(self)
00074
00075 self.filters = attrs.get('filters', '*')
00076 if isinstance( self.filters, basestring ):
00077 self.filters = self.filters.split(',')
00078 self.filters = _('Files (%s)') % ' '.join( self.filters )
00079
00080 self.fileNameField = attrs.get('filename')
00081 self.baseDirectory = unicode( QDir.homePath() )
00082
00083 self.connect( self.pushRemove, SIGNAL('clicked()'),self.remove )
00084
00085 self.actionNew = QAction(self)
00086 self.actionNew.setText( _('&New') )
00087 self.actionNew.setIcon( QIcon( ':/images/new.png' ) )
00088
00089 self.actionScan = QAction(self)
00090 self.actionScan.setText( _('&Scan') )
00091 self.actionScan.setIcon( QIcon( ':/images/scanner.png' ) )
00092
00093 self.newMenu = QMenu( self )
00094 self.newMenu.addAction( self.actionNew )
00095 if isNanScanAvailable:
00096 self.newMenu.addAction( self.actionScan )
00097 self.pushNew.setMenu( self.newMenu )
00098 self.pushNew.setDefaultAction( self.actionNew )
00099
00100 self.actionSave = QAction(self)
00101 self.actionSave.setText( _('&Save') )
00102 self.actionSave.setIcon( QIcon( ':/images/save.png' ) )
00103 self.actionOpen = QAction(self)
00104 self.actionOpen.setText( _('&Open') )
00105 self.actionOpen.setIcon( QIcon( ':/images/open.png' ) )
00106 self.actionShowImage = QAction(self)
00107 self.actionShowImage.setText( _('Show &image'), )
00108 self.actionShowImage.setIcon( QIcon( ':/images/convert.png' ) )
00109
00110 self.saveMenu = QMenu( self )
00111 self.saveMenu.addAction( self.actionSave )
00112 self.saveMenu.addAction( self.actionOpen )
00113 self.saveMenu.addAction( self.actionShowImage )
00114 self.pushSave.setMenu( self.saveMenu )
00115 self.pushSave.setDefaultAction( self.actionSave )
00116
00117 self.connect( self.actionNew, SIGNAL('triggered()'), self.new )
00118 self.connect( self.actionScan, SIGNAL('triggered()'), self.scan )
00119 self.connect( self.actionSave, SIGNAL('triggered()'), self.save )
00120 self.connect( self.actionOpen, SIGNAL('triggered()'), self.open )
00121 self.connect( self.actionShowImage, SIGNAL('triggered()'), self.showImage )
00122 self.connect( self.saveMenu, SIGNAL('aboutToShow()'), self.updateShowImageAction )
00123
00124 self.uiBinary.setAcceptDrops( True )
00125 self.installPopupMenu( self.uiBinary )
00126
00127 self.sizeName = '%s.size' % self.name
00128
00129 def eventFilter(self, target, event):
00130 if not event.type() in (QEvent.Drop, QEvent.DragEnter, QEvent.DragMove):
00131 return AbstractFieldWidget.eventFilter(self, target, event)
00132 if not event.mimeData().hasText():
00133 return AbstractFieldWidget.eventFilter(self, target, event)
00134 if event.type() in (QEvent.DragMove, QEvent.DragEnter):
00135 event.accept()
00136 return True
00137 path = unicode( event.mimeData().text() ).replace( 'file://', '' )
00138 self.setBinaryFile( path )
00139 return True
00140
00141 def setReadOnly(self, value):
00142 AbstractFieldWidget.setReadOnly(self, value)
00143 self.uiBinary.setEnabled( not value )
00144 self.pushNew.setEnabled( not value )
00145 self.pushRemove.setEnabled( not value )
00146 self.updateActions()
00147
00148 def updateShowImageAction(self):
00149 pix = QPixmap()
00150 if self.record and pix.loadFromData( self.record.value(self.name) ):
00151 self.actionShowImage.setEnabled( True )
00152 else:
00153 self.actionShowImage.setEnabled( False )
00154
00155 def updateActions(self):
00156 if self.record and self.record.value(self.sizeName):
00157 enable = True
00158 else:
00159 enable = False
00160 self.actionSave.setEnabled( enable )
00161 self.actionOpen.setEnabled( enable )
00162 self.actionShowImage.setEnabled( enable )
00163
00164 def menuEntries(self):
00165 enableApplication = False
00166 enableImage = False
00167 if self.record.value(self.name):
00168 enableApplication = True
00169 pix = QPixmap()
00170 if pix.loadFromData( self.record.value(self.name) ):
00171 enableImage = True
00172
00173 return [ (_('Open...'), self.open, enableApplication),
00174 (_('Show &image...'), self.showImage, enableImage) ]
00175
00176 def scan(self):
00177 from NanScan.ScanDialog import ScanDialog
00178
00179 saver = BinaryImageSaverFactory( self.record, self.name )
00180
00181 dialog = ScanDialog( self )
00182 dialog.setImageSaverFactory( saver )
00183 dialog.show()
00184
00185 def open(self):
00186 if not self.record.value(self.name):
00187 return
00188
00189
00190
00191
00192
00193
00194 extension = ''
00195 if self.fileName() and '.' in self.fileName():
00196 extension = '.%s' % self.fileName().rpartition('.')[2]
00197 else:
00198 extension = ''
00199
00200 fileName = tempfile.mktemp( extension )
00201 fp = file(fileName,'wb+')
00202 fp.write( self.record.value(self.name) )
00203 fp.close()
00204 Common.openFile( fileName )
00205
00206 def showImage(self):
00207 if not self.record.value(self.name):
00208 return
00209 dialog = QDialog( self )
00210 dialog.setWindowTitle( _('Image') )
00211 label = QLabel( dialog )
00212 pix = QPixmap()
00213 pix.loadFromData( self.record.value(self.name) )
00214 label.setPixmap( pix )
00215 layout = QHBoxLayout( dialog )
00216 layout.addWidget( label )
00217 dialog.exec_()
00218
00219 def new(self):
00220 filename = QFileDialog.getOpenFileName(self, _('Select the file to attach'), self.baseDirectory, self.filters)
00221 if filename.isNull():
00222 return
00223 filename = unicode(filename)
00224 self.baseDirectory = os.path.dirname(filename)
00225 self.setBinaryFile( filename )
00226
00227 def setBinaryFile(self, filename):
00228 try:
00229 value = file(filename, 'rb').read()
00230 except Exception, e:
00231 QMessageBox.information(self, _('Error'), _('Error reading the file:\n%s') % unicode(e.args) )
00232 return
00233
00234 self.record.setValue( self.name, value )
00235
00236
00237
00238 if self.fileNameField:
00239 self.record.setValue( self.fileNameField, os.path.basename(filename) )
00240 if self.view:
00241 self.view.widgets[self.fileNameField].load(self.record)
00242 self.showValue()
00243
00244 def fileName(self):
00245 if self.fileNameField:
00246 if self.record.fieldExists( self.fileNameField ):
00247 return self.record.value( self.fileNameField )
00248 if self.record.fieldExists( 'name' ):
00249 return self.record.value( 'name' ) or self.name
00250 return self.name
00251
00252 def save(self):
00253 directory = '%s/%s' % (self.baseDirectory, unicode(self.fileName()) )
00254 filename = QFileDialog.getSaveFileName( self, _('Save as...'), directory, self.filters )
00255 if filename.isNull():
00256 return
00257 filename = unicode(filename)
00258 self.baseDirectory = os.path.dirname(filename)
00259
00260 try:
00261 fp = file(filename,'wb+')
00262 fp.write( self.record.value(self.name) )
00263 fp.close()
00264 except Exception, e:
00265 QMessageBox.information(self, _('Error'), _('Error writing the file:\n%s') % unicode(e.args) )
00266 return
00267 Semantic.addInformationToFile( filename, self.record.group.resource, self.record.id, self.name )
00268
00269 def remove(self):
00270 self.record.setValue( self.name, False )
00271 self.clear()
00272 self.modified()
00273 if 'filename' in self.attrs:
00274 w = self.attrs['filename']
00275 self.record.setValue( w, False )
00276 if self.view:
00277 self.view.widgets[w].load(self.record)
00278
00279 def showValue(self):
00280 if self.record.value( self.sizeName ):
00281 self.setText( self.record.value( self.sizeName ) )
00282 else:
00283 self.clear()
00284 self.updateActions()
00285
00286 def clear(self):
00287 self.uiBinary.clear()
00288 self.updateActions()
00289
00290 def setText(self, text):
00291 if text:
00292 self.uiBinary.setText( text )
00293 else:
00294 self.uiBinary.clear()
00295 self.uiBinary.setCursorPosition( 0 )
00296
00297
00298
00299
00300 def storeValue(self):
00301 pass
00302
00303 def colorWidget(self):
00304 return self.uiBinary
00305
00306 def saveState(self):
00307 return QByteArray( self.baseDirectory.encode('utf-8') )
00308
00309 def restoreState(self, value):
00310 if not value:
00311 return
00312 self.baseDirectory = unicode( str( value ), 'utf-8' )