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 Koo.Common import Common
00030 
00031 from Koo.Fields.AbstractFieldWidget import *
00032 from PyQt4.QtCore import *
00033 from PyQt4.QtGui import *
00034 
00035 try:
00036         from PyQt4.phonon import *
00037         phononAvailable = True
00038 except:
00039         phononAvailable = False
00040         pass
00041 
00042 
00043 (VideoFieldWidgetUi, VideoFieldWidgetBase) = loadUiType( Common.uiPath('video.ui') ) 
00044 
00045 class VideoFieldWidget(AbstractFieldWidget, VideoFieldWidgetUi):
00046         def __init__(self, parent, view, attrs={}):
00047                 AbstractFieldWidget.__init__(self, parent, view, attrs)
00048                 VideoFieldWidgetUi.__init__(self)
00049                 self.setupUi(self)
00050                 
00051                 if phononAvailable:
00052                         self.layout().removeWidget( self.uiVideo )
00053                         self.uiVideo.setParent( None )
00054                         self.uiVideo = Phonon.VideoPlayer( Phonon.VideoCategory, self )
00055                         self.uiVideo.setSizePolicy( QSizePolicy.Preferred, QSizePolicy.Expanding )
00056                         self.uiVideo.show()
00057                         self.layout().addWidget( self.uiVideo )
00058                         self.uiSlider = Phonon.SeekSlider( self )
00059                         self.layout().addWidget( self.uiSlider )
00060 
00061                 self.installPopupMenu( self.uiVideo )
00062 
00063                 self.connect( self.pushPlay, SIGNAL('clicked()'), self.play )
00064                 self.connect( self.pushPause, SIGNAL('clicked()'), self.pause )
00065                 self.connect( self.pushStop, SIGNAL('clicked()'), self.stop )
00066                 self.connect( self.pushLoad, SIGNAL('clicked()'), self.loadVideo )
00067                 self.connect( self.pushSave, SIGNAL('clicked()'), self.save )
00068                 self.connect( self.pushRemove, SIGNAL('clicked()'), self.remove )
00069 
00070         def loadVideo(self):
00071                 try:
00072                         filename = QFileDialog.getOpenFileName(self, _('Select the file to attach'))
00073                         if filename.isNull():
00074                                 return
00075                         if self.isBinary():
00076                                 filename = unicode(filename)
00077                                 value = file(filename).read()
00078                                 self.record.setValue( self.name, value )
00079                         else:
00080                                 self.record.setValue( self.name, unicode(filename) )
00081                 except:
00082                         QMessageBox.information(self, _('Error'), _('Error reading the file'))
00083 
00084         def save(self):
00085                 filename = QFileDialog.getSaveFileName( self, _('Save as...') )
00086                 try:
00087                         if filename:
00088                                 fp = file(filename,'wb+')
00089                                 fp.write( self.record.value(self.name) )
00090                                 fp.close()
00091                 except:
00092                         QMessageBox.information(self, _('Error'), _('Error writing the file!'))
00093                 Semantic.addInformationToFile( filename, self.record.group.resource, self.record.id, self.name )
00094 
00095         def remove(self):
00096                 self.clear()
00097                 self.record.setValue( self.name, False )
00098                 self.modified()
00099 
00100         def play(self):
00101                 if self.uiVideo.isPaused():
00102                         self.uiVideo.play()
00103                         return
00104 
00105                 self.stop()
00106                 value = self.record.value( self.name )
00107                 if not value:
00108                         return
00109                 if self.isBinary():
00110                         media = Phonon.MediaSource( QBuffer( QByteArray( value ) ) )
00111                 else:
00112                         media = Phonon.MediaSource( value )
00113 
00114                 self.uiVideo.play( media )
00115                 self.uiVideo.show()
00116                 self.uiSlider.setMediaObject( self.uiVideo.mediaObject() )
00117                 self.uiSlider.show()
00118 
00119         def pause(self):
00120                 self.uiVideo.pause()
00121 
00122         def stop(self):
00123                 self.uiVideo.stop()
00124                 self.uiVideo.hide()
00125                 self.uiSlider.hide()
00126 
00127         def storeValue(self):
00128                 pass
00129 
00130         def clear(self):
00131                 self.stop()
00132                 self.updateButtons()
00133         
00134         def showValue(self):
00135                 self.stop()
00136                 self.updateButtons()
00137 
00138         def setReadOnly(self, value):
00139                 AbstractFieldWidget.setReadOnly(self, value)
00140                 self.pushLoad.setEnabled( not value )
00141 
00142         def isBinary(self):
00143                 if self.attrs['type'] == 'binary':
00144                         return True
00145                 else:
00146                         return False
00147                         
00148         def updateButtons(self):
00149                 if not self.isReadOnly() and self.record and self.record.value(self.name):
00150                         canPlay = True
00151                 else:
00152                         canPlay = False
00153                 self.pushPlay.setEnabled( canPlay )
00154                 self.pushStop.setEnabled( canPlay )
00155                 self.pushPause.setEnabled( canPlay )
00156                 self.pushSave.setEnabled( canPlay )
00157                 self.pushRemove.setEnabled( canPlay )
00158                 if self.isReadOnly():
00159                         self.pushLoad.setEnabled( False )
00160                 else:
00161                         self.pushLoad.setEnabled( True )