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 base64 
00031 import binascii
00032 import tempfile
00033 
00034 from Koo.Common import Common
00035 from Koo.Common import Icons
00036 from Koo.Common import Semantic
00037 from Koo.Fields.AbstractFieldWidget import *
00038 from Koo.Fields.AbstractFieldDelegate import *
00039 from PyQt4.QtCore import *
00040 from PyQt4.QtGui import *
00041 from PyQt4.uic import *
00042 
00043 (ImageFieldWidgetUi, ImageFieldWidgetBase) = loadUiType( Common.uiPath('image.ui') ) 
00044 
00045 class ImageFieldWidget(AbstractFieldWidget, ImageFieldWidgetUi):
00046 
00047         def __init__(self, parent, model, attrs={}):
00048                 AbstractFieldWidget.__init__(self, parent, model, attrs)
00049                 ImageFieldWidgetUi.__init__(self)
00050                 self.setupUi(self)
00051 
00052                 self.width = int( attrs.get( 'img_width', 300 ) )
00053                 self.height = int( attrs.get( 'img_height', 100 ) )
00054                 self.installPopupMenu( self.uiImage )
00055                 self.connect( self.pushLoad, SIGNAL('clicked()'), self.loadImage )
00056                 self.connect( self.pushSave, SIGNAL('clicked()'), self.saveImage )
00057                 self.connect( self.pushRemove, SIGNAL('clicked()'), self.removeImage )
00058                 self.pushSave.setEnabled( False )
00059 
00060         
00061         def getImage(self):
00062                 return self.record.value(self.name)
00063 
00064         
00065         def setImage(self, value):
00066                 self.record.setValue(self.name, value)
00067 
00068         def setReadOnly(self, value):
00069                 AbstractFieldWidget.setReadOnly(self, value)
00070                 self.pushLoad.setEnabled( not value )
00071                 self.pushRemove.setEnabled( not value )
00072 
00073         def menuEntries(self):
00074                 if self.getImage():
00075                         enableApplication = True
00076                 else:
00077                         enableApplication = False
00078 
00079                 if self.getImage():
00080                         enableImage = True
00081                 else:
00082                         enableImage = False
00083                 return [ (_('Open...'), self.openApplication, enableApplication),
00084                          ('&Show image...', self.showImage, enableImage) ]
00085 
00086         def openApplication(self):
00087                 if not self.getImage():
00088                         return
00089                 extension = ''
00090                 
00091                 
00092                 
00093                 
00094                 byte = QByteArray( str(self.getImage()) )
00095                 buf = QBuffer( byte )
00096                 buf.open( QBuffer.ReadOnly )
00097                 reader = QImageReader( buf )
00098                 if reader.canRead():
00099                         extension = '.%s' % str( reader.format() )
00100 
00101                 fileName = tempfile.mktemp( extension )
00102                 fp = file(fileName,'wb')
00103                 fp.write(self.getImage())
00104                 fp.close()
00105                 Common.openFile( fileName )
00106 
00107         def showImage(self):
00108                 if not self.getImage():
00109                         return
00110                 dialog = QDialog( self )
00111                 dialog.setWindowTitle( _('Image') )
00112                 label = QLabel( dialog )
00113                 pix = QPixmap()
00114                 pix.loadFromData( self.getImage() )
00115                 label.setPixmap( pix )
00116                 layout = QHBoxLayout( dialog )
00117                 layout.addWidget( label )
00118                 dialog.exec_()
00119 
00120         def removeImage(self):
00121                 self.setImage(False)
00122                 self.update()
00123                 self.modified()
00124 
00125         def saveImage(self):
00126                 name = QFileDialog.getSaveFileName( self, _('Save image as...') )
00127                 if name.isNull():
00128                         return
00129                 try:
00130                         fp = file(unicode(name), 'wb')
00131                         fp.write(self.getImage())
00132                         fp.close()
00133                 except:
00134                         QMessageBox.warning( self, _('Error saving file'), _('Could not save the image with the given file name. Please check that you have permissions.') )
00135                 Semantic.addInformationToFile( name, self.record.group.resource, self.record.id, self.name )
00136 
00137         def loadImage(self):
00138                 fileTypes = "*.png *.jpg *.jpeg *.gif *.tif *.xpm *.bmp"
00139                 fileTypes = _('Image files (%s)') % fileTypes
00140                 name = QFileDialog.getOpenFileName( self, _('Open image file...'), QDir.homePath(), fileTypes )
00141                 if not name.isNull():
00142                         image = file(unicode(name), 'rb').read()
00143                         self.setImage( image )
00144                         self.update()
00145                         self.modified()
00146 
00147         def update(self):
00148                 if self.getImage():
00149                         img = QImage()
00150                         img.loadFromData( self.getImage() )
00151                         pix = QPixmap.fromImage( img.scaled( self.width, self.height, Qt.KeepAspectRatio, Qt.SmoothTransformation ) )
00152                         self.uiImage.setPixmap( pix )
00153                 else:
00154                         self.clear()
00155 
00156         def clear(self):
00157                 self.uiImage.setText( _('(no image)') )
00158 
00159         def showValue(self):
00160                 if self.getImage():
00161                         self.pushSave.setEnabled( True )
00162                 else:
00163                         self.pushSave.setEnabled( False )
00164                 self.update()
00165 
00166         def storeValue(self):
00167                 pass
00168 
00169 class ImageFieldDelegate( AbstractFieldDelegate ):
00170         def createEditor(self, parent, option, index):
00171                 return None
00172         
00173         def sizeHint(self, option, index):
00174                 return QSize(30, 30)
00175 
00176         def paint(self, painter, option, index):
00177                 
00178                 if (option.state & QStyle.State_Selected):
00179                         painter.fillRect(option.rect, option.palette.highlight());
00180 
00181                 value = index.model().recordFromIndex( index ).value( self.name )
00182                 image = QImage()
00183                 image.loadFromData( value )
00184                 painter.drawImage( option.rect, image )
00185 
00186 class PictureFieldWidget( ImageFieldWidget ):
00187         def __init__(self, parent, model, attrs={}):
00188                 ImageFieldWidget.__init__(self, parent, model, attrs)
00189                 self.pushLoad.hide()
00190                 self.pushSave.hide()
00191                 self.pushRemove.hide()
00192 
00193         def getImage(self):
00194                 value = self.record.value(self.name)            
00195 
00196                 if (isinstance(value, tuple) or isinstance(value,list)) and len(value)==2:
00197                         type, data = value
00198                 else:
00199                         type, data = None, value
00200 
00201                 if not data:
00202                         return False
00203 
00204                 if type == 'stock':
00205                         stock, size = data
00206                         return self.pixmapToData( Icons.kdePixmap( stock ) )
00207                 else:
00208                         try:
00209                                 return base64.decodestring(data)
00210                         except binascii.Error:
00211                                 return False
00212 
00213         def pixmapToData(self, pixmap):
00214                 if pixmap.isNull():
00215                         return False
00216                 bytes = QByteArray()
00217                 buffer = QBuffer(bytes);
00218                 buffer.open(QIODevice.WriteOnly);
00219                 pixmap.save(buffer, "BMP")
00220                 return str(bytes)
00221