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 )