From e37ae620796f2a2d82f7a66e663d590a8f9c4ba4 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Mon, 19 Oct 2009 18:51:21 +0100 Subject: [PATCH 1/9] Initial video fudging! --- openlp/core/ui/maindisplay.py | 36 ++++++++++++++++++++++++++- openlp/plugins/media/lib/mediaitem.py | 23 +++++++++++++---- 2 files changed, 53 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index e98d1eb96..c692e4d5c 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -23,7 +23,9 @@ ############################################################################### import logging + from PyQt4 import QtCore, QtGui +from PyQt4.phonon import Phonon from openlp.core.lib import Receiver, str_to_bool @@ -85,9 +87,16 @@ class MainDisplay(DisplayLabel): self.layout.setSpacing(0) self.layout.setMargin(0) self.layout.setObjectName(u'layout') + self.mediaObject = Phonon.MediaObject(self) + self.video = Phonon.VideoWidget() + self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self.mediaObject) + self.video.setFullScreen(True) + Phonon.createPath(self.mediaObject, self.video) + Phonon.createPath(self.mediaObject, self.audio) + self.layout.insertWidget(0, self.video) self.display = QtGui.QLabel(self) self.display.setScaledContents(True) - self.layout.addWidget(self.display) + self.layout.insertWidget(0, self.display) self.displayBlank = False self.blankFrame = None self.frame = None @@ -102,6 +111,8 @@ class MainDisplay(DisplayLabel): QtCore.SIGNAL(u'presentations_start'), self.hideDisplay) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'presentations_stop'), self.showDisplay) + QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'finished()'), + self.onMediaFinish) def setup(self, screenNumber): """ @@ -220,3 +231,26 @@ class MainDisplay(DisplayLabel): self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame)) self.killTimer(self.timer_id) self.timer_id = 0 + + def queueMedia(self, item, firstItem=True): + if firstItem: + self.mediaObject.setCurrentSource(Phonon.MediaSource(item)) + else: + self.mediaObject.enqueue(Phonon.MediaSource(item)) + + def playMedia(self): + self.display.close() + self.mediaObject.play() + + def stopMedia(self): + self.mediaObject.stop() + + def onMediaFinish(self): + self.mediaObject.stop() + self.video.close() + self.display = QtGui.QLabel(self) + self.display.setScaledContents(True) + self.layout.insertWidget(0, self.display) + + def mediaFinished(self): + pass diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index cb8b50c6e..e6df754c0 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -56,6 +56,7 @@ class MediaMediaItem(MediaManagerItem): #self.ServiceItemIconName = u':/media/media_image.png' self.PreviewFunction = self.video_get_preview MediaManagerItem.__init__(self, parent, icon, title) + self.MainDisplay = self.parent.live_controller.parent.mainDisplay def requiredIcons(self): MediaManagerItem.requiredIcons(self) @@ -78,7 +79,7 @@ class MediaMediaItem(MediaManagerItem): return False service_item.title = u'Media' for index in indexes: - filename = self.ListData.getFilename(index) + filename = self.ListView.getFilename(index) frame = QtGui.QImage(unicode(filename)) (path, name) = os.path.split(filename) service_item.add_from_image(path, name, frame) @@ -88,12 +89,24 @@ class MediaMediaItem(MediaManagerItem): log.debug(u'Media Preview Button pressed') items = self.ListView.selectedIndexes() for item in items: - text = self.ListData.getValue(item) - print text + baseItem = self.ListView.item(item.row()) + itemText = unicode(baseItem.data(QtCore.Qt.UserRole).tostring()) + print itemText - def onMediaLiveClick(self): + def onLiveClick(self): log.debug(u'Media Live Button pressed') - pass + items = self.ListView.selectedIndexes() + if len(items) > 0: + firstPass = True + for item in items: + baseItem = self.ListView.item(item.row()) + filename = unicode(baseItem.data(QtCore.Qt.UserRole).toString()) + if firstPass: + self.MainDisplay.queueMedia(filename, firstPass) + firstPass = False + else: + self.MainDisplay.queueMedia(filename, firstPass) + self.MainDisplay.playMedia() def initialise(self): self.ListView.setSelectionMode( From b37b95d928939669593dec68fb9bc6372db1d624 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Thu, 22 Oct 2009 14:43:49 +0100 Subject: [PATCH 2/9] Rename to ServiceItemType and add Video type --- openlp/core/lib/serviceitem.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 499bf0542..846e9606e 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -30,13 +30,14 @@ from PyQt4 import QtGui from openlp.core.lib import buildIcon -class ServiceType(object): +class ServiceItemType(object): """ Defines the type of service item """ Text = 1 Image = 2 Command = 3 + Video = 4 class ServiceItem(object): """ @@ -90,7 +91,7 @@ class ServiceItem(object): """ log.debug(u'Render called') self.frames = [] - if self.service_item_type == ServiceType.Text: + if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') if self.theme is None: self.RenderManager.set_override_theme(None) @@ -108,9 +109,9 @@ class ServiceItem(object): self.frames.append({u'title': title, u'text': lines, u'image': frame}) log.info(u'Formatting took %4s' % (time.time() - before)) - elif self.service_item_type == ServiceType.Command: + elif self.service_item_type == ServiceItemType.Command: self.frames = self.service_frames - elif self.service_item_type == ServiceType.Image: + elif self.service_item_type == ServiceItemType.Image: for slide in self.service_frames: slide[u'image'] = \ self.RenderManager.resize_image(slide[u'image']) @@ -147,7 +148,7 @@ class ServiceItem(object): ``image`` The actual image file name. """ - self.service_item_type = ServiceType.Image + self.service_item_type = ServiceItemType.Image self.service_item_path = path self.service_frames.append( {u'title': frame_title, u'text':None, u'image': image}) @@ -162,7 +163,7 @@ class ServiceItem(object): ``raw_slide`` The raw text of the slide. """ - self.service_item_type = ServiceType.Text + self.service_item_type = ServiceItemType.Text frame_title = frame_title.split(u'\n')[0] self.service_frames.append( {u'title': frame_title, u'raw_slide': raw_slide}) @@ -177,7 +178,7 @@ class ServiceItem(object): ``command`` The command of/for the slide. """ - self.service_item_type = ServiceType.Command + self.service_item_type = ServiceItemType.Command self.service_item_path = path self.service_frames.append( {u'title': frame_title, u'command': None, u'text':None, u'image': image}) @@ -198,15 +199,17 @@ class ServiceItem(object): u'audit':self.audit } service_data = [] - if self.service_item_type == ServiceType.Text: + if self.service_item_type == ServiceItemType.Text: for slide in self.service_frames: service_data.append(slide) - elif self.service_item_type == ServiceType.Image: + elif self.service_item_type == ServiceItemType.Image: for slide in self.service_frames: service_data.append(slide[u'title']) - elif self.service_item_type == ServiceType.Command: + elif self.service_item_type == ServiceItemType.Command: for slide in self.service_frames: service_data.append(slide[u'title']) + elif self.service_item_type == ServiceItemType.Video: + pass return {u'header': service_header, u'data': service_data} def set_from_service(self, serviceitem, path=None): @@ -229,15 +232,17 @@ class ServiceItem(object): self.addIcon(header[u'icon']) self.raw_footer = header[u'footer'] self.audit = header[u'audit'] - if self.service_item_type == ServiceType.Text: + if self.service_item_type == ServiceItemType.Text: for slide in serviceitem[u'serviceitem'][u'data']: self.service_frames.append(slide) - elif self.service_item_type == ServiceType.Image: + elif self.service_item_type == ServiceItemType.Image: for text_image in serviceitem[u'serviceitem'][u'data']: filename = os.path.join(path, text_image) real_image = QtGui.QImage(unicode(filename)) self.add_from_image(path, text_image, real_image) - elif self.service_item_type == ServiceType.Command: + elif self.service_item_type == ServiceItemType.Command: for text_image in serviceitem[u'serviceitem'][u'data']: filename = os.path.join(path, text_image) self.add_from_command(path, text_image) + elif self.service_item_type == ServiceItemType.Video: + pass From fac8bb8dd31b0be601a8a61202194d9e5ee3d3d4 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Fri, 23 Oct 2009 23:54:29 +0100 Subject: [PATCH 3/9] Fix ServiceType -> ServiceItemType change --- openlp/core/lib/__init__.py | 2 +- openlp/core/ui/servicemanager.py | 7 ++++--- openlp/core/ui/slidecontroller.py | 26 +++++++++++++------------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index cdbd6446a..cc9db0953 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -128,7 +128,7 @@ from settingstab import SettingsTab from mediamanageritem import MediaManagerItem from xmlrootclass import XmlRootClass from serviceitem import ServiceItem -from serviceitem import ServiceType +from serviceitem import ServiceItemType from serviceitem import ServiceItem from toolbar import OpenLPToolbar from dockwidget import OpenLPDockWidget diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 2b5838b3f..087c8fa07 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -30,7 +30,8 @@ import zipfile from PyQt4 import QtCore, QtGui from openlp.core.lib import PluginConfig, OpenLPToolbar, ServiceItem, \ - translate, ServiceType, contextMenuAction, contextMenuSeparator, Receiver + translate, ServiceItemType, contextMenuAction, contextMenuSeparator, \ + Receiver class ServiceManagerList(QtGui.QTreeWidget): @@ -398,8 +399,8 @@ class ServiceManager(QtGui.QWidget): for item in self.serviceItems: service.append( {u'serviceitem':item[u'data'].get_service_repr()}) - if item[u'data'].service_item_type == ServiceType.Image or \ - item[u'data'].service_item_type == ServiceType.Command: + if item[u'data'].service_item_type == ServiceItemType.Image or \ + item[u'data'].service_item_type == ServiceItemType.Command: for frame in item[u'data'].frames: path_from = unicode(os.path.join( item[u'data'].service_item_path, frame[u'title'])) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 4f7163ba0..ee32b1a86 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -26,7 +26,7 @@ import logging import time from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, translate, Receiver, ServiceType +from openlp.core.lib import OpenLPToolbar, translate, Receiver, ServiceItemType label_stylesheet = u""" QTableWidget::item:selected @@ -244,9 +244,9 @@ class SlideController(QtGui.QWidget): """ Allows the live toolbar to be customised """ - if item.service_item_type == ServiceType.Text: + if item.service_item_type == ServiceItemType.Text: self.Toolbar.makeWidgetsInvisible(self.image_list) - elif item.service_item_type == ServiceType.Image: + elif item.service_item_type == ServiceItemType.Image: #Not sensible to allow loops with 1 frame if len(item.frames) > 1: self.Toolbar.makeWidgetsVisible(self.image_list) @@ -268,14 +268,14 @@ class SlideController(QtGui.QWidget): log.debug(u'addServiceItem') #If old item was a command tell it to stop if self.commandItem is not None and \ - self.commandItem.service_item_type == ServiceType.Command: + self.commandItem.service_item_type == ServiceItemType.Command: Receiver().send_message(u'%s_stop'% self.commandItem.name.lower()) self.commandItem = item before = time.time() item.render() log.info(u'Rendering took %4s' % (time.time() - before)) self.enableToolBar(item) - if item.service_item_type == ServiceType.Command: + if item.service_item_type == ServiceItemType.Command: Receiver().send_message(u'%s_start' % item.name.lower(), \ [item.shortname, item.service_item_path, item.service_frames[0][u'title']]) @@ -290,11 +290,11 @@ class SlideController(QtGui.QWidget): log.debug(u'addServiceItem') #If old item was a command tell it to stop if self.commandItem is not None and \ - self.commandItem.service_item_type == ServiceType.Command: + self.commandItem.service_item_type == ServiceItemType.Command: Receiver().send_message(u'%s_stop'% self.commandItem.name.lower()) self.commandItem = item self.enableToolBar(item) - if item.service_item_type == ServiceType.Command: + if item.service_item_type == ServiceItemType.Command: Receiver().send_message(u'%s_start' % item.name.lower(), \ [item.shortname, item.service_item_path, item.service_frames[0][u'title'], slideno]) @@ -351,7 +351,7 @@ class SlideController(QtGui.QWidget): Go to the first slide. """ if self.commandItem is not None and \ - self.commandItem.service_item_type == ServiceType.Command: + self.commandItem.service_item_type == ServiceItemType.Command: Receiver().send_message(u'%s_first'% self.commandItem.name.lower()) else: self.PreviewListWidget.selectRow(0) @@ -362,7 +362,7 @@ class SlideController(QtGui.QWidget): Blank the screen. """ if self.commandItem is not None and \ - self.commandItem.service_item_type == ServiceType.Command: + self.commandItem.service_item_type == ServiceItemType.Command: if blanked: Receiver().send_message(u'%s_blank'% self.commandItem.name.lower()) else: @@ -377,7 +377,7 @@ class SlideController(QtGui.QWidget): """ row = self.PreviewListWidget.currentRow() if row > -1 and row < self.PreviewListWidget.rowCount(): - if self.commandItem.service_item_type == ServiceType.Command: + if self.commandItem.service_item_type == ServiceItemType.Command: Receiver().send_message(u'%s_slide'% self.commandItem.name.lower(), [row]) else: #label = self.PreviewListWidget.cellWidget(row, 0) @@ -395,7 +395,7 @@ class SlideController(QtGui.QWidget): Go to the next slide. """ if self.commandItem is not None and \ - self.commandItem.service_item_type == ServiceType.Command: + self.commandItem.service_item_type == ServiceItemType.Command: Receiver().send_message(u'%s_next'% self.commandItem.name.lower()) else: row = self.PreviewListWidget.currentRow() + 1 @@ -409,7 +409,7 @@ class SlideController(QtGui.QWidget): Go to the previous slide. """ if self.commandItem is not None and \ - self.commandItem.service_item_type == ServiceType.Command: + self.commandItem.service_item_type == ServiceItemType.Command: Receiver().send_message( u'%s_previous'% self.commandItem.name.lower()) else: @@ -424,7 +424,7 @@ class SlideController(QtGui.QWidget): Go to the last slide. """ if self.commandItem is not None and \ - self.commandItem.service_item_type == ServiceType.Command: + self.commandItem.service_item_type == ServiceItemType.Command: Receiver().send_message(u'%s_last'% self.commandItem.name.lower()) else: self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1) From 359c2bee42f93b35e99c2b51026086260acbdf1c Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Thu, 29 Oct 2009 17:16:24 +0000 Subject: [PATCH 4/9] TRB Fixes --- openlp/core/ui/maindisplay.py | 1 + openlp/plugins/media/lib/mediaitem.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 663230abf..5a3e577b2 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -242,6 +242,7 @@ class MainDisplay(DisplayLabel): def playMedia(self): self.display.close() self.mediaObject.play() + self.setVisible(True) def stopMedia(self): self.mediaObject.stop() diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index e6df754c0..0eca69a54 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -90,7 +90,7 @@ class MediaMediaItem(MediaManagerItem): items = self.ListView.selectedIndexes() for item in items: baseItem = self.ListView.item(item.row()) - itemText = unicode(baseItem.data(QtCore.Qt.UserRole).tostring()) + itemText = unicode(baseItem.data(QtCore.Qt.UserRole).toString()) print itemText def onLiveClick(self): From 490b19ddc21cee29b31c47b6850c8c8efcc4128e Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Thu, 29 Oct 2009 18:25:34 +0000 Subject: [PATCH 5/9] Enable media additions to ServiceManager and fixes --- openlp/core/lib/mediamanageritem.py | 10 +++--- openlp/core/lib/serviceitem.py | 16 ++++++++-- openlp/plugins/media/lib/mediaitem.py | 32 +++++++++++-------- openlp/plugins/presentations/lib/mediaitem.py | 6 ++-- 4 files changed, 43 insertions(+), 21 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 651029e5a..8f4aabbe7 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -319,8 +319,7 @@ class MediaManagerItem(QtGui.QWidget): pass def onFileClick(self): - files = QtGui.QFileDialog.getOpenFileNames( - self, self.trUtf8(self.OnNewPrompt), + files = QtGui.QFileDialog.getOpenFileNames(self, self.OnNewPrompt, self.parent.config.get_last_dir(), self.OnNewFileMasks) log.info(u'New files(s)%s', unicode(files)) if len(files) > 0: @@ -382,8 +381,11 @@ class MediaManagerItem(QtGui.QWidget): Common method for generating a service item """ service_item = ServiceItem(self.parent) - service_item.addIcon( - u':/media/media_' + self.PluginNameShort.lower() + u'.png') + if self.ServiceItemIconName: + service_item.addIcon(self.ServiceItemIconName) + else: + service_item.addIcon( + u':/media/media_' + self.PluginNameShort.lower() + u'.png') if self.generateSlideData(service_item): self.ListView.clearSelection() return service_item diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 35c688711..c83825aaf 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -117,6 +117,11 @@ class ServiceItem(object): slide[u'image'] = \ self.RenderManager.resize_image(slide[u'image']) self.frames = self.service_frames + elif self.service_item_type == ServiceItemType.Video: + for slide in self.service_frames: + slide[u'image'] = \ + self.RenderManager.resize_image(slide[u'image']) + self.frames = self.service_frames else: log.error(u'Invalid value renderer :%s' % self.service_item_type) @@ -152,7 +157,13 @@ class ServiceItem(object): self.service_item_type = ServiceItemType.Image self.service_item_path = path self.service_frames.append( - {u'title': frame_title, u'text':None, u'image': image}) + {u'title': frame_title, u'text': None, u'image': image}) + + def add_from_media(self, path, frame_title, image): + self.service_item_type = ServiceItemType.Video + self.service_item_path = path + self.service_frames.append( + {u'title': frame_title, u'text': None, u'image': image}) def add_from_text(self, frame_title, raw_slide): """ @@ -210,7 +221,8 @@ class ServiceItem(object): for slide in self.service_frames: service_data.append(slide[u'title']) elif self.service_item_type == ServiceItemType.Video: - pass + for slide in self.service_frames: + service_data.append(slide[u'title']) return {u'header': service_header, u'data': service_data} def set_from_service(self, serviceitem, path=None): diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index c402a0d95..7532c938a 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -47,13 +47,10 @@ class MediaMediaItem(MediaManagerItem): self.PluginNameShort = u'Media' self.IconPath = u'images/image' self.ConfigSection = u'media' - self.OnNewPrompt = u'Select Media(s)' - self.OnNewFileMasks = \ - u'Videos (*.avi *.mpeg *.mpg *.mp4);;Audio (*.ogg *.mp3 *.wma);;All files (*)' # this next is a class, not an instance of a class - it will # be instanced by the base MediaManagerItem self.ListViewWithDnD_class = MediaListView - #self.ServiceItemIconName = u':/media/media_image.png' + self.ServiceItemIconName = u':/media/media_video.png' self.PreviewFunction = self.video_get_preview MediaManagerItem.__init__(self, parent, icon, title) self.MainDisplay = self.parent.live_controller.parent.mainDisplay @@ -61,13 +58,18 @@ class MediaMediaItem(MediaManagerItem): def initPluginNameVisible(self): self.PluginNameVisible = self.trUtf8(self.PluginNameShort) + def reTranslateUI(self): + self.OnNewPrompt = self.trUtf8(u'Select Media') + self.OnNewFileMasks = self.trUtf8(u'Videos (*.avi *.mpeg *.mpg' + '*.mp4);;Audio (*.ogg *.mp3 *.wma);;All files (*)') + def requiredIcons(self): MediaManagerItem.requiredIcons(self) self.hasFileIcon = True self.hasNewIcon = False self.hasEditIcon = False - def video_get_preview(self, filename): + def video_get_preview(self): # # For now cross platform is an icon. Phonon does not support # individual frame access (yet?) and GStreamer is not available @@ -77,15 +79,19 @@ class MediaMediaItem(MediaManagerItem): return image def generateSlideData(self, service_item): - indexes = self.ListView.selectedIndexes() - if len(indexes) > 1: + items = self.ListView.selectedIndexes() + if len(items) > 1: return False - service_item.title = u'Media' - for index in indexes: - filename = self.ListView.getFilename(index) - frame = QtGui.QImage(unicode(filename)) + service_item.title = self.trUtf8(u'Media') + for item in items: + bitem = self.ListView.item(item.row()) + filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString()) + frame = u':/media/media_video.png' (path, name) = os.path.split(filename) - service_item.add_from_image(path, name, frame) + #service_item.add_from_image(path, name, frame) + print path + print name + service_item.add_from_media(path, name, frame) return True def onPreviewClick(self): @@ -129,7 +135,7 @@ class MediaMediaItem(MediaManagerItem): for file in list: (path, filename) = os.path.split(unicode(file)) item_name = QtGui.QListWidgetItem(filename) - img = self.video_get_preview(file) + img = self.video_get_preview() item_name.setIcon(buildIcon(img)) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) self.ListView.addItem(item_name) diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index f6b19a579..3d881099e 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -52,8 +52,6 @@ class PresentationMediaItem(MediaManagerItem): self.PluginNameShort = u'Presentation' self.ConfigSection = u'presentations' self.IconPath = u'presentations/presentation' - self.OnNewPrompt = u'Select Presentation(s)' - self.OnNewFileMasks = u'Presentations (*.ppt *.pps *.odp)' # this next is a class, not an instance of a class - it will # be instanced by the base MediaManagerItem self.ListViewWithDnD_class = PresentationListView @@ -63,6 +61,10 @@ class PresentationMediaItem(MediaManagerItem): def initPluginNameVisible(self): self.PluginNameVisible = self.trUtf8(self.PluginNameShort) + def reTranslateUI(self): + self.OnNewPrompt = self.trUtf8(u'Select Presentation(s)') + self.OnNewFileMasks = self.trUtf8(u'Presentations (*.ppt *.pps *.odp)') + def requiredIcons(self): MediaManagerItem.requiredIcons(self) self.hasFileIcon = True From 6df0649fbc6703f787f5789e18e0a8d300e4aa42 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 1 Nov 2009 16:06:59 +0000 Subject: [PATCH 6/9] Video cleanup part1 --- openlp/core/lib/serviceitem.py | 5 --- openlp/core/ui/slidecontroller.py | 4 +-- openlp/plugins/media/lib/mediaitem.py | 46 +++++++++++++-------------- 3 files changed, 25 insertions(+), 30 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index c83825aaf..7fab33ea3 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -117,11 +117,6 @@ class ServiceItem(object): slide[u'image'] = \ self.RenderManager.resize_image(slide[u'image']) self.frames = self.service_frames - elif self.service_item_type == ServiceItemType.Video: - for slide in self.service_frames: - slide[u'image'] = \ - self.RenderManager.resize_image(slide[u'image']) - self.frames = self.service_frames else: log.error(u'Invalid value renderer :%s' % self.service_item_type) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index d61c7638f..4c51b3c83 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -294,7 +294,7 @@ class SlideController(QtGui.QWidget): #More than 20 verses hard luck pass self.Songbar.setVisible(True) - elif item.service_item_type == ServiceType.Image: + elif item.service_item_type == ServiceItemType.Image: #Not sensible to allow loops with 1 frame if len(item.frames) > 1: self.Toolbar.makeWidgetsVisible(self.image_list) @@ -444,7 +444,7 @@ class SlideController(QtGui.QWidget): if row > -1 and row < self.PreviewListWidget.rowCount(): if self.commandItem.service_item_type == ServiceItemType.Command: Receiver().send_message(u'%s_slide'% self.commandItem.name.lower(), [row]) - if isLive: + if self.isLive: QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) else: frame = self.serviceitem.frames[row][u'image'] diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 06da94efb..2a98f78b7 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -91,31 +91,31 @@ class MediaMediaItem(MediaManagerItem): #service_item.add_from_image(path, name, frame) print path print name - service_item.add_from_media(path, name, frame) + service_item.add_from_command(path, name, frame) return True - def onPreviewClick(self): - log.debug(u'Media Preview Button pressed') - items = self.ListView.selectedIndexes() - for item in items: - baseItem = self.ListView.item(item.row()) - itemText = unicode(baseItem.data(QtCore.Qt.UserRole).toString()) - print itemText - - def onLiveClick(self): - log.debug(u'Media Live Button pressed') - items = self.ListView.selectedIndexes() - if len(items) > 0: - firstPass = True - for item in items: - baseItem = self.ListView.item(item.row()) - filename = unicode(baseItem.data(QtCore.Qt.UserRole).toString()) - if firstPass: - self.MainDisplay.queueMedia(filename, firstPass) - firstPass = False - else: - self.MainDisplay.queueMedia(filename, firstPass) - self.MainDisplay.playMedia() +# def onPreviewClick(self): +# log.debug(u'Media Preview Button pressed') +# items = self.ListView.selectedIndexes() +# for item in items: +# baseItem = self.ListView.item(item.row()) +# itemText = unicode(baseItem.data(QtCore.Qt.UserRole).toString()) +# print itemText +# +# def onLiveClick(self): +# log.debug(u'Media Live Button pressed') +# items = self.ListView.selectedIndexes() +# if len(items) > 0: +# firstPass = True +# for item in items: +# baseItem = self.ListView.item(item.row()) +# filename = unicode(baseItem.data(QtCore.Qt.UserRole).toString()) +# if firstPass: +# self.MainDisplay.queueMedia(filename, firstPass) +# firstPass = False +# else: +# self.MainDisplay.queueMedia(filename, firstPass) +# self.MainDisplay.playMedia() def initialise(self): self.ListView.setSelectionMode( From c06b64fdbe884771b052cc163ab65b7e69510ac5 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 1 Nov 2009 19:22:51 +0000 Subject: [PATCH 7/9] Start to add the menu items to slide controller --- openlp/core/ui/maindisplay.py | 45 ++++++++++++++++++++----------- openlp/core/ui/slidecontroller.py | 29 ++++++++++++++++++++ resources/images/openlp-2.qrc | 3 +++ 3 files changed, 61 insertions(+), 16 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 5a3e577b2..7ec4f649c 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -23,6 +23,7 @@ ############################################################################### import logging +import os from PyQt4 import QtCore, QtGui from PyQt4.phonon import Phonon @@ -103,6 +104,7 @@ class MainDisplay(DisplayLabel): self.alertactive = False self.alertTab = None self.timer_id = 0 + self.firstTime = True QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'live_slide_blank'), self.blankDisplay) QtCore.QObject.connect(Receiver.get_receiver(), @@ -111,8 +113,17 @@ class MainDisplay(DisplayLabel): QtCore.SIGNAL(u'presentations_start'), self.hideDisplay) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'presentations_stop'), self.showDisplay) - QtCore.QObject.connect(self.mediaObject, QtCore.SIGNAL(u'finished()'), - self.onMediaFinish) + QtCore.QObject.connect(self.mediaObject, + QtCore.SIGNAL(u'finished()'), self.onMediaFinish) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'media_start'), self.onMediaQueue) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'media_play'), self.onMediaPlay) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'media_pause'), self.onMediaPaws) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'media_stop'), self.onMediaFinish) + def setup(self, screenNumber): """ @@ -233,26 +244,28 @@ class MainDisplay(DisplayLabel): self.killTimer(self.timer_id) self.timer_id = 0 - def queueMedia(self, item, firstItem=True): - if firstItem: - self.mediaObject.setCurrentSource(Phonon.MediaSource(item)) - else: - self.mediaObject.enqueue(Phonon.MediaSource(item)) - - def playMedia(self): + def onMediaQueue(self, message): self.display.close() + file = os.path.join(message[1], message[2]) + if self.firstTime: + self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) + self.firstTime = False + else: + self.mediaObject.enqueue(Phonon.MediaSource(file)) + + def onMediaPlay(self): + self.display.hide() self.mediaObject.play() self.setVisible(True) - def stopMedia(self): + def onMediaStop(self): + self.mediaObject.stop() + + def onMediaPaws(self): self.mediaObject.stop() def onMediaFinish(self): + self.setVisible(False) self.mediaObject.stop() self.video.close() - self.display = QtGui.QLabel(self) - self.display.setScaledContents(True) - self.layout.insertWidget(0, self.display) - - def mediaFinished(self): - pass + self.display.show() diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 4c51b3c83..557b468aa 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -80,6 +80,11 @@ class SlideController(QtGui.QWidget): u'Loop Separator', u'Image SpinBox' ] + self.media_list = [ + u'Media Start', + u'Media Stop', + u'Media Pause' + ] self.song_list = [ u'Edit Song', ] @@ -172,6 +177,16 @@ class SlideController(QtGui.QWidget): u'Image SpinBox', self.DelaySpinBox) self.DelaySpinBox.setSuffix(self.trUtf8(u's')) self.DelaySpinBox.setToolTip(self.trUtf8(u'Delay between slides in seconds')) + self.Toolbar.addToolbarButton( + u'Media Start', u':/slides/media_playback_start.png', + self.trUtf8(u'Start playing media'), self.onMediaPlay) + self.Toolbar.addToolbarButton( + u'Media Pause', u':/slides/media_playback_pause.png', + self.trUtf8(u'Start playing media'), self.onMediaPause) + self.Toolbar.addToolbarButton( + u'Media Stop', u':/slides/media_playback_stop.png', + self.trUtf8(u'Start playing media'), self.onMediaStop) + self.ControllerLayout.addWidget(self.Toolbar) # Build the Song Toolbar if isLive: @@ -232,6 +247,7 @@ class SlideController(QtGui.QWidget): Receiver().send_message(u'request_spin_delay') if isLive: self.Toolbar.makeWidgetsInvisible(self.image_list) + self.Toolbar.makeWidgetsInvisible(self.media_list) else: self.Toolbar.makeWidgetsInvisible(self.song_list) QtCore.QObject.connect(Receiver.get_receiver(), @@ -279,6 +295,7 @@ class SlideController(QtGui.QWidget): """ self.Songbar.setVisible(False) self.Toolbar.makeWidgetsInvisible(self.image_list) + self.Toolbar.makeWidgetsInvisible(self.media_list) if item.service_item_type == ServiceItemType.Text: self.Toolbar.makeWidgetsInvisible(self.image_list) if item.name == u'Songs' and \ @@ -298,6 +315,9 @@ class SlideController(QtGui.QWidget): #Not sensible to allow loops with 1 frame if len(item.frames) > 1: self.Toolbar.makeWidgetsVisible(self.image_list) + elif item.service_item_type == ServiceItemType.Command and \ + item.name == u'Media': + self.Toolbar.makeWidgetsVisible(self.media_list) def enablePreviewToolBar(self, item): """ @@ -551,3 +571,12 @@ class SlideController(QtGui.QWidget): if row > -1 and row < self.PreviewListWidget.rowCount(): self.parent.LiveController.addServiceManagerItem( self.commandItem, row) + + def onMediaPause(self): + Receiver().send_message(u'%s_pause'% self.commandItem.name.lower()) + + def onMediaPlay(self): + Receiver().send_message(u'%s_play'% self.commandItem.name.lower()) + + def onMediaStop(self): + Receiver().send_message(u'%s_stop'% self.commandItem.name.lower()) diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index 83c88c3e5..f7e6f095f 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -27,6 +27,9 @@ slide_last.png slide_next.png slide_previous.png + media_playback_start.png + media_playback_stop.png + media_playback_pause.png openlp-logo-16x16.png From 9a190742eb094627214a881cd5918061b7c82722 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 1 Nov 2009 19:24:04 +0000 Subject: [PATCH 8/9] missing icons --- resources/images/media_playback_pause.png | Bin 0 -> 484 bytes resources/images/media_playback_start.png | Bin 0 -> 501 bytes resources/images/media_playback_stop.png | Bin 0 -> 499 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/images/media_playback_pause.png create mode 100644 resources/images/media_playback_start.png create mode 100644 resources/images/media_playback_stop.png diff --git a/resources/images/media_playback_pause.png b/resources/images/media_playback_pause.png new file mode 100644 index 0000000000000000000000000000000000000000..a9b3113fb0b3067163f8186bc42d66151b6f7b73 GIT binary patch literal 484 zcmVMzCV_|S* zE^l&Yo9;Xs0004FNklB9I38p(Iz6IO^dEMQjt>}>^t3llMXiwcw)!{H|)}++uwH(K|-~|IrqGh@yQpO zH=a3ThfpD++=dBxU5K?1eFDKBVp?BowuED$I} zkR>PRm)K&!hzw1}kQOC^{*qJ33LIZ~rbLxp_E@EaXM7bn6PpN9cKz5(7SqMlOZ>Pz a(ftDwiElIZXxcXb0000MzCV_|S* zE^l&Yo9;Xs0004WNkl zYnIH1=*_xx>SF|Ngh5}Rs6lxM@#19}#d-$sFy8p}`-Kof9M%r9Ebou{qbxtj4r@XP z5kmBny|h<$Z0qaW*3m2X(taXDh~1<&*z(MYp&!nCcVfqu-e5NoA-d^?SHAga?8-ld zU(Oxd&`m|8wav2Y)E}jHu1r-X3KzC*mT4{4vt=LsR+>6?KYoWuxj3n8IOEc8GB)A6pN#dQ-vvRyY8A>?)zk_@Y3Qa+WC^9 zu?lzGbVJ8qRK}iY=h4m@-n%rxJ$HQoOq^+G@5jShvwZ4Yq4Guns1&-I<-=NtRyya% zg~CK-sxnb{YfdW_Ar_L>VAh(UOJjwxGaa*9gM~zd5Ur$<*2`Ioc0Bjkta{lYIBdh20qxn%iZ)DAy5JLP1do6CCFD*BW00000NkvXXu0mjf%^}{d literal 0 HcmV?d00001 diff --git a/resources/images/media_playback_stop.png b/resources/images/media_playback_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..180280e8ba359d2a4389e93284454cf943b27dbd GIT binary patch literal 499 zcmVMzCV_|S* zE^l&Yo9;Xs0004UNklyX+scBW;@{ixB;GHteD? zi4zVk%KMm2d+-vpg@ZO1m$9PhNBs_CwvU6gp6B-T^cklp z%LPGv>rmBAl^Q-iHLBFjq4KSMp<&gV+w9V!%@Z9SXtBdK^=89D1o6}c7u@qo%qL%H z-gxGm4LpU2vNw&#BOe&P>Cq!4LGwb5O`~jC4;H!Q9m5r89H7`jk)mm{$oi2~!WHh& zq+HUVf=iBBAfd||l~Br&N1K?GJ(kHa#W>SIO3XgxNJ>$aM>IXMj535U#3;~1b3iGQ zVp#4kxJ)p@Fe6O#7nUi8QVbk!=#sF+43ms8$qbOt!J&90^LD|k@{A_sUnv@of|<7k zaaER6UeF|@gCDNR;wnUtIm>NkSffps7)?xvDjD47oYjZrT8_$_3?+8hV}T5L<0#h} p&_s}e?F9KS7v-XS=mdoU?jMapX0!E+{+R#(002ovPDHLkV1o6$+0Fm} literal 0 HcmV?d00001 From 8880a1b016fef713ab0e64f06610628498915a43 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 1 Nov 2009 19:41:13 +0000 Subject: [PATCH 9/9] It works as long as you wont to play only 1 thing per service --- openlp/core/ui/maindisplay.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 7ec4f649c..e59f399b4 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -252,20 +252,19 @@ class MainDisplay(DisplayLabel): self.firstTime = False else: self.mediaObject.enqueue(Phonon.MediaSource(file)) + self.onMediaPlay() def onMediaPlay(self): self.display.hide() self.mediaObject.play() self.setVisible(True) - def onMediaStop(self): - self.mediaObject.stop() - def onMediaPaws(self): - self.mediaObject.stop() + self.mediaObject.pause() def onMediaFinish(self): self.setVisible(False) self.mediaObject.stop() + self.mediaObject.clearQueue() self.video.close() self.display.show()