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