From 058322620d99e837e9666908eb86fbb585b29be7 Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Wed, 24 Jun 2009 20:44:52 +0100 Subject: [PATCH 1/9] First video play works --- openlp/plugins/media/video_render.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/media/video_render.py b/openlp/plugins/media/video_render.py index fa3807d5d..fd310b584 100644 --- a/openlp/plugins/media/video_render.py +++ b/openlp/plugins/media/video_render.py @@ -35,6 +35,7 @@ class w(QtGui.QMainWindow): self.setWindowTitle(u'simple media player') self.show() + if __name__==u'__main__': app = QtGui.QApplication([]) # widget = QtGui.QWidget() @@ -46,8 +47,8 @@ if __name__==u'__main__': widget=QtGui.QWidget(mainwindow) mainwindow.setCentralWidget(widget) widget.setLayout(QtGui.QVBoxLayout(widget)) -# videofile=u'r-128.rm' - videofile=u'/extra_space/Download/coa360download56Kbps240x160.mpg' + videofile=u'synctest.24.muxed.avi' +# videofile=u'/extra_space/Download/coa360download56Kbps240x160.mpg' source=Phonon.MediaSource(videofile) media=Phonon.MediaObject(widget) From 45d9f436ab99583161b9a69ea2ec85f5dc7d6cf2 Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Thu, 25 Jun 2009 22:09:52 +0100 Subject: [PATCH 2/9] Media item for media functions basically. No previews, and no live/preview control --- openlp/core/lib/mediamanageritem.py | 10 ++- openlp/plugins/images/lib/mediaitem.py | 3 +- openlp/plugins/media/lib/mediaitem.py | 111 +++++++------------------ openlp/plugins/media/video_render.py | 72 ---------------- 4 files changed, 36 insertions(+), 160 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index d63b7f0f6..792c529ee 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -122,6 +122,8 @@ class MediaManagerItem(QtGui.QWidget): # self.ListViewWithDnD_class - there is a base list class with DnD assigned to it (openlp.core.lib.BaseListWithDnD()) # each plugin needs to inherit a class from this and pass that *class* (not an instance) to here # via the ListViewWithDnD_class member + # self.ServiceItemIconName - string referring to an icon file or a resource icon + # The assumption is that given that at least two plugins are of the form # "text with an icon" then all this will help # even for plugins of another sort, the setup of the right-click menu, common toolbar @@ -219,25 +221,25 @@ class MediaManagerItem(QtGui.QWidget): self.parent.config.set_list(self.ConfigSection, self.ListData.getFileList()) def generateSlideData(self): - assert (0, 'This fn needs to be defined by the plugin'); + assert 0, 'This fn needs to be defined by the plugin' def onPreviewClick(self): log.debug(self.PluginTextShort+u'Preview Requested') service_item = ServiceItem(self.parent) - service_item.addIcon(u':/media/media_image.png') + service_item.addIcon(self.ServiceItemIconName) self.generateSlideData(service_item) self.parent.preview_controller.addServiceItem(service_item) def onLiveClick(self): log.debug(self.PluginTextShort+u' Live Requested') service_item = ServiceItem(self.parent) - service_item.addIcon(u':/media/media_image.png') + service_item.addIcon(self.ServiceItemIconName) self.generateSlideData(service_item) self.parent.live_controller.addServiceItem(service_item) def onAddClick(self): log.debug(self.PluginTextShort+u' Add Requested') service_item = ServiceItem(self.parent) - service_item.addIcon(u':/media/media_image.png') + service_item.addIcon(self.ServiceItemIconName) self.generateSlideData(service_item) self.parent.service_manager.addServiceItem(service_item) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index a8898526b..f7c04da05 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -49,7 +49,8 @@ class ImageMediaItem(MediaManagerItem): self.OnNewFileMasks = u'Images (*.jpg *jpeg *.gif *.png *.bmp)' # this next is a class, not an instance of a class - it will # be instanced by the base MediaManagerItem - self.ListViewWithDnD_class = ImageListView + self.ListViewWithDnD_class = ImageListView + self.ServiceItemIconName = u':/media/media_image.png' MediaManagerItem.__init__(self, parent, icon, title) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 26bdd1ced..2d5bec6ea 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -26,6 +26,12 @@ from openlp.core.lib import MediaManagerItem, translate from openlp.plugins.media.lib import MediaTab from openlp.plugins.media.lib import FileListData +# from listwithpreviews import ListWithPreviews +from openlp.core.lib import MediaManagerItem, ServiceItem, translate, BaseListWithDnD +class MediaListView(BaseListWithDnD): + def __init__(self, parent=None): + self.PluginName = u'Media' + BaseListWithDnD.__init__(self, parent) class MediaMediaItem(MediaManagerItem): """ @@ -36,92 +42,29 @@ class MediaMediaItem(MediaManagerItem): log.info(u'Media Media Item loaded') def __init__(self, parent, icon, title): + self.TranslationContext = u'MediaPlugin' + self.PluginTextShort = u'Media' + self.ConfigSection = u'images' + 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' MediaManagerItem.__init__(self, parent, icon, title) - def setupUi(self): - # Add a toolbar - self.addToolbar() - # Create buttons for the toolbar - ## New Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'New Media'), - translate(u'MediaMediaItem',u'Load Media into openlp.org'), - ':/videos/video_load.png', self.onMediaNewClick, 'MediaNewItem') - ## Delete Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'Delete Media'), - translate(u'MediaMediaItem',u'Delete the selected Media item'), - ':/videos/video_delete.png', self.onMediaDeleteClick, 'MediaDeleteItem') - ## Separator Line ## - self.addToolbarSeparator() - ## Preview Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'Preview Media'), - translate(u'MediaMediaItem',u'Preview the selected Media item'), - ':/system/system_preview.png', self.onMediaPreviewClick, 'MediaPreviewItem') - ## Live Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'Go Live'), - translate(u'MediaMediaItem',u'Send the selected Media item live'), - ':/system/system_live.png', self.onMediaLiveClick, 'MediaLiveItem') - ## Add Media Button ## - self.addToolbarButton( - translate(u'MediaMediaItem',u'Add Media To Service'), - translate(u'MediaMediaItem',u'Add the selected Media items(s) to the service'), - ':/system/system_add.png',self.onMediaAddClick, 'MediaAddItem') - ## Add the Medialist widget ## - self.MediaListView = QtGui.QListView() - self.MediaListView.setAlternatingRowColors(True) - self.MediaListData = FileListData() - self.MediaListView.setModel(self.MediaListData) - - self.PageLayout.addWidget(self.MediaListView) - - #define and add the context menu - self.MediaListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) - - self.MediaListView.addAction(self.contextMenuAction( - self.MediaListView, ':/system/system_preview.png', - translate(u'MediaMediaItem',u'&Preview Media'), self.onMediaPreviewClick)) - self.MediaListView.addAction(self.contextMenuAction( - self.MediaListView, ':/system/system_live.png', - translate(u'MediaMediaItem',u'&Show Live'), self.onMediaLiveClick)) - self.MediaListView.addAction(self.contextMenuAction( - self.MediaListView, ':/system/system_add.png', - translate(u'MediaMediaItem',u'&Add to Service'), self.onMediaAddClick)) - - def initialise(self): - list = self.parent.config.load_list(u'Media') - self.loadMediaList(list) - - def onMediaNewClick(self): - files = QtGui.QFileDialog.getOpenFileNames(None, - translate(u'MediaMediaItem', u'Select Media(s) items'), - self.parent.config.get_last_dir(), - u'Videos (*.avi *.mpeg);;Audio (*.mp3 *.ogg *.wma);;All files (*)') - if len(files) > 0: - self.loadMediaList(files) - dir, filename = os.path.split(unicode(files[0])) - self.parent.config.set_last_dir(dir) - self.parent.config.set_list(u'media', self.MediaListData.getFileList()) - - def getFileList(self): - filelist = [item[0] for item in self.MediaListView]; - return filelist - - def loadMediaList(self, list): - for files in list: - self.MediaListData.addRow(files) - - def onMediaDeleteClick(self): - indexes = self.MediaListView.selectedIndexes() + def generateSlideData(self, service_item): + indexes = self.ListView.selectedIndexes() + service_item.title = u'Media' for index in indexes: - current_row = int(index.row()) - self.MediaListData.removeRow(current_row) - self.parent.config.set_list(u'media', self.MediaListData.getFileList()) + filename = self.ListData.getFilename(index) + frame = QtGui.QImage(unicode(filename)) + (path, name) = os.path.split(filename) + service_item.add_from_image(path, name, frame) - def onMediaPreviewClick(self): + + def onPreviewClick(self): log.debug(u'Media Preview Button pressed') items = self.MediaListView.selectedIndexes() for item in items: @@ -129,7 +72,9 @@ class MediaMediaItem(MediaManagerItem): print text def onMediaLiveClick(self): + log.debug(u'Media Live Button pressed') pass - def onMediaAddClick(self): - pass \ No newline at end of file +# def onMediaAddClick(self): +# log.debug(u'Media Add Button pressed') +# pass diff --git a/openlp/plugins/media/video_render.py b/openlp/plugins/media/video_render.py index e91d7aab5..4b261ffc1 100644 --- a/openlp/plugins/media/video_render.py +++ b/openlp/plugins/media/video_render.py @@ -20,78 +20,6 @@ Place, Suite 330, Boston, MA 02111-1307 USA import os from PyQt4 import QtCore, QtGui -# xxx this needs a try..except once we've decided what to do if it fails -from PyQt4.phonon import Phonon - -# from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab -# from openlp.plugins.media.lib import MediaTab,MediaMediaItem - -"""Renders a video to some surface or other """ - -class w(QtGui.QMainWindow): - def __init__(self, parent=None): - super(QtGui.QMainWindow, self).__init__(parent) - self.resize(640,480) - self.setWindowTitle(u'simple media player') - self.show() - - -if __name__==u'__main__': - app = QtGui.QApplication([]) -# widget = QtGui.QWidget() -# widget.resize(320, 240) -# widget.setWindowTitle(u'simple') -# widget.show() -# QCore.QCoreApplication.setApplicationName(u'OpenLP') - mainwindow=w() - widget=QtGui.QWidget(mainwindow) - mainwindow.setCentralWidget(widget) - widget.setLayout(QtGui.QVBoxLayout(widget)) - videofile=u'synctest.24.muxed.avi' -# videofile=u'/extra_space/Download/coa360download56Kbps240x160.mpg' - source=Phonon.MediaSource(videofile) - - media=Phonon.MediaObject(widget) - media.setCurrentSource(source) - - video=Phonon.VideoWidget(widget) - audio=Phonon.AudioOutput(Phonon.MusicCategory) -# controller=Phonon.MediaController(media) - Phonon.createPath(media, video); - Phonon.createPath(media, audio); -# player=Phonon.VideoPlayer(Phonon.VideoCategory, widget) - slider=Phonon.SeekSlider(media, mainwindow) - widget.layout().addWidget(slider) - widget.layout().addWidget(video) - slider.show() - - video.show() - media.play() - app.exec_() - -======= -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 -""" -OpenLP - Open Source Lyrics Projection -Copyright (c) 2008 Raoul Snyman -Portions copyright (c) 2008 Martin Thompson, Tim Bentley, - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA -""" -import os -from PyQt4 import QtCore, QtGui - # xxx this needs a try, except once we've decided what to do if it fails from PyQt4.phonon import Phonon From 5e8ff0214e9817932b362b0c530aa55b2151659c Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Tue, 30 Jun 2009 21:35:53 +0100 Subject: [PATCH 3/9] Video items have a preview shown --- openlp/core/lib/listwithpreviews.py | 16 ++++--- openlp/core/lib/mediamanageritem.py | 9 +++- openlp/plugins/media/lib/mediaitem.py | 49 +++++++++++++++++-- openlp/plugins/media/mediaplugin.py | 2 +- openlp/plugins/media/video_render.py | 69 --------------------------- 5 files changed, 64 insertions(+), 81 deletions(-) delete mode 100644 openlp/plugins/media/video_render.py diff --git a/openlp/core/lib/listwithpreviews.py b/openlp/core/lib/listwithpreviews.py index dce892c31..1ccb8165f 100644 --- a/openlp/core/lib/listwithpreviews.py +++ b/openlp/core/lib/listwithpreviews.py @@ -35,14 +35,18 @@ class ListWithPreviews(QtCore.QAbstractListModel): self.items = [] self.rowheight = 50 self.maximagewidth = self.rowheight * 16 / 9.0; - if new_preview_function is not None: - self.make_preview=new_preview_function - else: - self.make_preview=self.preview_function + self.preview_function = new_preview_function - def preview_function(self, filename): + def make_preview(self, filename): if os.path.exists(filename): - preview = QtGui.QImage(filename) + if self.preview_function is not None: + preview=self.preview_function(filename) + else: + preview = QtGui.QImage(filename) + else: + preview = None + + if preview is not None: w = self.maximagewidth; h = self.rowheight preview = preview.scaled(w, h, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 792c529ee..486a601cb 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -18,7 +18,7 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ import types - +import os from PyQt4 import QtCore, QtGui from openlp.core.lib.toolbar import * from openlp.core.lib import translate @@ -123,6 +123,8 @@ class MediaManagerItem(QtGui.QWidget): # each plugin needs to inherit a class from this and pass that *class* (not an instance) to here # via the ListViewWithDnD_class member # self.ServiceItemIconName - string referring to an icon file or a resource icon + # self.PreviewFunction - a function which returns a QImage to represent the item (a preview usually) - no scaling required - that's done later + # If this fn is not defined, a default will be used (treat the filename as an image) # The assumption is that given that at least two plugins are of the form # "text with an icon" then all this will help @@ -168,7 +170,10 @@ class MediaManagerItem(QtGui.QWidget): #Add the List widget self.ListView = self.ListViewWithDnD_class() self.ListView.uniformItemSizes = True - self.ListData = ListWithPreviews() + try: + self.ListData = ListWithPreviews(self.PreviewFunction) + except AttributeError: + self.ListData = ListWithPreviews(None) self.ListView.setModel(self.ListData) self.ListView.setGeometry(QtCore.QRect(10, 100, 256, 591)) self.ListView.setSpacing(1) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 2d5bec6ea..d9f4c43d4 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -19,7 +19,13 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ import logging import os - +import tempfile +try: + import gst +except: + log = logging.getLogger(u'MediaMediaItemSetup') + log.warning(u'Can\'t generate Vidoe previews - import gst failed'); + from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, translate @@ -51,8 +57,45 @@ class MediaMediaItem(MediaManagerItem): # be instanced by the base MediaManagerItem self.ListViewWithDnD_class = MediaListView self.ServiceItemIconName = u':/media/media_image.png' + self.PreviewFunction = self.video_get_preview MediaManagerItem.__init__(self, parent, icon, title) + def video_get_preview(self, filename): + + """Gets a preview of the first frame of a video file using + GSTREAMER (non-portable??? - Can't figure out how to do with + Phonon - returns a QImage""" + + try: + # Define your pipeline, just as you would at the command prompt. + # This is much easier than trying to create and link each gstreamer element in Python. + # This is great for pipelines that end with a filesink (i.e. there is no audible or visual output) + log.info ("Video preview %s"%( filename)) + outfile=tempfile.NamedTemporaryFile(suffix='.png') + cmd=u'filesrc location="%s" ! decodebin ! ffmpegcolorspace ! pngenc ! filesink location="%s"'% (filename, outfile.name) + pipe = gst.parse_launch(cmd) + # Get a reference to the pipeline's bus + bus = pipe.get_bus() + + # Set the pipeline's state to PLAYING + pipe.set_state(gst.STATE_PLAYING) + + # Listen to the pipeline's bus indefinitely until we receive a EOS (end of stream) message. + # This is a super important step, or the pipeline might not work as expected. For example, + # in my example pipeline above, the pngenc will not export an actual image unless you have + # this line of code. It just exports a 0 byte png file. So... don't forget this step. + bus.poll(gst.MESSAGE_EOS, -1) + img=QtGui.QImage(outfile.name) + outfile.close() +# os.unlink(outfile.name) + pipe.set_state(gst.STATE_NULL) + return img + except: + log.info("Can't generate video preview for some reason"); + import sys + print sys.exc_info() + return QtGui.QImage() + def generateSlideData(self, service_item): indexes = self.ListView.selectedIndexes() @@ -66,9 +109,9 @@ class MediaMediaItem(MediaManagerItem): def onPreviewClick(self): log.debug(u'Media Preview Button pressed') - items = self.MediaListView.selectedIndexes() + items = self.ListView.selectedIndexes() for item in items: - text = self.MediaListData.getValue(item) + text = self.ListData.getValue(item) print text def onMediaLiveClick(self): diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 7c79c4bd7..322938ee6 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -22,7 +22,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab from openlp.plugins.media.lib import MediaTab,MediaMediaItem - +from video_preview import video_get_preview class MediaPlugin(Plugin): def __init__(self, plugin_helpers): diff --git a/openlp/plugins/media/video_render.py b/openlp/plugins/media/video_render.py deleted file mode 100644 index 4b261ffc1..000000000 --- a/openlp/plugins/media/video_render.py +++ /dev/null @@ -1,69 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 -""" -OpenLP - Open Source Lyrics Projection -Copyright (c) 2008 Raoul Snyman -Portions copyright (c) 2008 Martin Thompson, Tim Bentley, - -This program is free software; you can redistribute it and/or modify it under -the terms of the GNU General Public License as published by the Free Software -Foundation; version 2 of the License. - -This program is distributed in the hope that it will be useful, but WITHOUT ANY -WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A -PARTICULAR PURPOSE. See the GNU General Public License for more details. - -You should have received a copy of the GNU General Public License along with -this program; if not, write to the Free Software Foundation, Inc., 59 Temple -Place, Suite 330, Boston, MA 02111-1307 USA -""" -import os -from PyQt4 import QtCore, QtGui - -# xxx this needs a try, except once we've decided what to do if it fails -from PyQt4.phonon import Phonon - -# from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab -# from openlp.plugins.media.lib import MediaTab,MediaMediaItem - -"""Renders a video to some surface or other """ - -class w(QtGui.QMainWindow): - def __init__(self, parent=None): - super(QtGui.QMainWindow, self).__init__(parent) - self.resize(640,480) - self.setWindowTitle(u'simple media player') - self.show() - -if __name__==u'__main__': - app = QtGui.QApplication([]) -# widget = QtGui.QWidget() -# widget.resize(320, 240) -# widget.setWindowTitle(u'simple') -# widget.show() -# QCore.QCoreApplication.setApplicationName(u'OpenLP') - mainwindow=w() - widget=QtGui.QWidget(mainwindow) - mainwindow.setCentralWidget(widget) - widget.setLayout(QtGui.QVBoxLayout(widget)) -# videofile=u'r-128.rm' - videofile=u'/extra_space/Download/coa360download56Kbps240x160.mpg' - source=Phonon.MediaSource(videofile) - - media=Phonon.MediaObject(widget) - media.setCurrentSource(source) - - video=Phonon.VideoWidget(widget) - audio=Phonon.AudioOutput(Phonon.MusicCategory) -# controller=Phonon.MediaController(media) - Phonon.createPath(media, video); - Phonon.createPath(media, audio); -# player=Phonon.VideoPlayer(Phonon.VideoCategory, widget) - slider=Phonon.SeekSlider(media, mainwindow) - widget.layout().addWidget(slider) - widget.layout().addWidget(video) - slider.show() - - video.show() - media.play() - app.exec_() From 63495952978f65de09bacab3759656b9c5968dbc Mon Sep 17 00:00:00 2001 From: Martin Thompson Date: Wed, 1 Jul 2009 21:21:13 +0100 Subject: [PATCH 4/9] Changes from review --- openlp/core/lib/mediamanageritem.py | 72 +++++++++++++-------------- openlp/plugins/media/lib/mediaitem.py | 2 +- openlp/plugins/media/mediaplugin.py | 1 - 3 files changed, 35 insertions(+), 40 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 486a601cb..63bac28d0 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -27,7 +27,32 @@ from serviceitem import ServiceItem class MediaManagerItem(QtGui.QWidget): """ MediaManagerItem is a helper widget for plugins. - """ + + None of the following *need* to be used, feel free to override + them cmopletely in your plugin's implementation. Alternatively, call them from your + plugin before or after you've done etra things that you need to. + + The plugin will be assigned an icon called + u':/media/media_' + 'self.ShortPluginName + u'image.png' + which needs to be available in the main resources + + in order for them to work, you need to have setup + + self.TranslationContext + self.PluginTextShort # eg 'Image' for the image plugin + self.ConfigSection - where the items in the media manager are stored + this could potentially be self.PluginTextShort.lower() + + self.OnNewPrompt=u'Select Image(s)' + self.OnNewFileMasks=u'Images (*.jpg *jpeg *.gif *.png *.bmp)' + assumes that the new action is to load a file. If not, override onnew + self.ListViewWithDnD_class - there is a base list class with DnD assigned to it (openlp.core.lib.BaseListWithDnD()) + each plugin needs to inherit a class from this and pass that *class* (not an instance) to here + via the ListViewWithDnD_class member + self.PreviewFunction - a function which returns a QImage to represent the item (a preview usually) - no scaling required - that's done later + If this fn is not defined, a default will be used (treat the filename as an image) + +""" global log log = logging.getLogger(u'MediaManagerItem') log.info(u'Media Item loaded') @@ -106,53 +131,23 @@ class MediaManagerItem(QtGui.QWidget): QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) return action -#################################################################################################### - ### None of the following *need* to be used, feel free to override - ### them cmopletely in your plugin's implementation. Alternatively, call them from your - ### plugin before or after you've done etra things that you need to. - ### in order for them to work, you need to have setup - # self.TranslationContext - # self.PluginTextShort # eg "Image" for the image plugin - # self.ConfigSection - where the items in the media manager are stored - # this could potentially be self.PluginTextShort.lower() - # - # self.OnNewPrompt=u'Select Image(s)' - # self.OnNewFileMasks=u'Images (*.jpg *jpeg *.gif *.png *.bmp)' - # assumes that the new action is to load a file. If not, override onnew - # self.ListViewWithDnD_class - there is a base list class with DnD assigned to it (openlp.core.lib.BaseListWithDnD()) - # each plugin needs to inherit a class from this and pass that *class* (not an instance) to here - # via the ListViewWithDnD_class member - # self.ServiceItemIconName - string referring to an icon file or a resource icon - # self.PreviewFunction - a function which returns a QImage to represent the item (a preview usually) - no scaling required - that's done later - # If this fn is not defined, a default will be used (treat the filename as an image) - - # The assumption is that given that at least two plugins are of the form - # "text with an icon" then all this will help - # even for plugins of another sort, the setup of the right-click menu, common toolbar - # will help to keep things consistent and ease the creation of new plugins - - # also a set of completely consistent action anesm then exist - # (onPreviewClick() is always called that, rather than having the - # name of the plugin added in as well... I regard that as a - # feature, I guess others might differ!) - def setupUi(self): # Add a toolbar self.addToolbar() # Create buttons for the toolbar - ## New Song Button ## + ## New Button ## self.addToolbarButton( translate(self.TranslationContext, u'Load '+self.PluginTextShort), translate(self.TranslationContext, u'Load item into openlp.org'), - u':/images/image_load.png', self.onNewClick, u'ImageNewItem') - ## Delete Song Button ## + u':/images/image_load.png', self.onNewClick, u'NewItem') + ## Delete Button ## self.addToolbarButton( translate(self.TranslationContext, u'Delete '+self.PluginTextShort), translate(self.TranslationContext, u'Delete the selected item'), u':/images/image_delete.png', self.onDeleteClick, u'DeleteItem') ## Separator Line ## self.addToolbarSeparator() - ## Preview Button ## + ## Preview ## self.addToolbarButton( translate(self.TranslationContext, u'Preview '+self.PluginTextShort), translate(self.TranslationContext, u'Preview the selected item'), @@ -162,7 +157,7 @@ class MediaManagerItem(QtGui.QWidget): translate(self.TranslationContext, u'Go Live'), translate(self.TranslationContext, u'Send the selected item live'), u':/system/system_live.png', self.onLiveClick, u'LiveItem') - ## Add Button ## + ## Add to service Button ## self.addToolbarButton( translate(self.TranslationContext, u'Add '+self.PluginTextShort+u' To Service'), translate(self.TranslationContext, u'Add the selected item(s) to the service'), @@ -210,7 +205,7 @@ class MediaManagerItem(QtGui.QWidget): log.info(u'New files(s)', unicode(files)) if len(files) > 0: self.loadList(files) - dir, filename = os.path.split(unicode(files[0])) + dir, filename = os.path.split(uniClickcode(files[0])) self.parent.config.set_last_dir(dir) self.parent.config.set_list(self.ConfigSection, self.ListData.getFileList()) @@ -226,12 +221,13 @@ class MediaManagerItem(QtGui.QWidget): self.parent.config.set_list(self.ConfigSection, self.ListData.getFileList()) def generateSlideData(self): - assert 0, 'This fn needs to be defined by the plugin' + raise NotImplementedError(u'This function needs to be defined by the plugin') def onPreviewClick(self): log.debug(self.PluginTextShort+u'Preview Requested') service_item = ServiceItem(self.parent) service_item.addIcon(self.ServiceItemIconName) + self.generateSlideData(service_item) self.parent.preview_controller.addServiceItem(service_item) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index d9f4c43d4..db869997f 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -94,7 +94,7 @@ class MediaMediaItem(MediaManagerItem): log.info("Can't generate video preview for some reason"); import sys print sys.exc_info() - return QtGui.QImage() + return None def generateSlideData(self, service_item): diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 322938ee6..5306b02bd 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -22,7 +22,6 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, MediaManagerItem, SettingsTab from openlp.plugins.media.lib import MediaTab,MediaMediaItem -from video_preview import video_get_preview class MediaPlugin(Plugin): def __init__(self, plugin_helpers): From 3c71e91498083ef08b1589c04c8e577812e2744f Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 2 Jul 2009 20:04:50 +0100 Subject: [PATCH 5/9] Fix up rendering a bit Re-write the slide controller so it looks better (big clean up) Fix themes where backgrounds are png files so they do not become phantom themes start to sort out conversions Hide openoffice at startup --- cnvdb.py | 3 + openlp/core/lib/rendermanager.py | 8 +- openlp/core/ui/slidecontroller.py | 237 ++++++------------ openlp/core/ui/thememanager.py | 6 +- .../images/lib/imageslidecontroller.py | 15 +- openlp/plugins/images/lib/mediaitem.py | 1 - .../plugins/presentations/lib/impresscom.py | 2 +- 7 files changed, 86 insertions(+), 186 deletions(-) diff --git a/cnvdb.py b/cnvdb.py index 73c105b5b..cba3018cc 100644 --- a/cnvdb.py +++ b/cnvdb.py @@ -30,6 +30,9 @@ class Convert(): infile = codecs.open(inname, 'r', encoding='iso-8859-1') writefile = codecs.open(outname, 'w', encoding='utf-8') for line in infile: + #replace the quotes with quotes + line, replace(u'\x93', "'") + line, replace(u'\x94', "'") writefile.write(line) infile.close() writefile.close() diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index 737db455a..4fa8a88e9 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -155,8 +155,12 @@ class RenderManager: def calculate_default(self, screen): log.debug(u'calculate default %s' , screen) - self.width = screen.width() - self.height = screen.height() + if self.current_display == 0: + self.width = 1024 + self.height = 768 + else: + self.width = screen.width() + self.height = screen.height() log.debug(u'calculate default %d,%d' , self.width, self.height) # 90% is start of footer self.footer_start = int(self.height * 0.90) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 641715052..0863242fd 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -21,84 +21,12 @@ import logging import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, translate +from openlp.core.lib import OpenLPToolbar, translate, buildIcon -class SlideData(QtCore.QAbstractListModel): - """ - List of frames to be displayed on the list and the main display. - """ - global log - log = logging.getLogger(u'SlideData') - - def __init__(self): - QtCore.QAbstractListModel.__init__(self) - self.items = [] - self.rowheight = 50 - self.maximagewidth = self.rowheight * 16 / 9.0; - log.info(u'Starting') - - def clear(self): - self.items = [] - - def columnCount(self, parent): - return 1 - - def rowCount(self, parent=None): - return len(self.items) - - def insertRow(self, row, frame, framenumber): - self.beginInsertRows(QtCore.QModelIndex(), row, row) - log.info(u'insert row %d' % row) - # create a preview image - frame1 = frame.scaled(QtCore.QSize(280, 210), QtCore.Qt.KeepAspectRatio, - QtCore.Qt.SmoothTransformation) - self.items.insert(row, (frame1, framenumber)) - log.info(u'Item loaded') - self.endInsertRows() - - def removeRow(self, row): - self.beginRemoveRows(QtCore.QModelIndex(), row, row) - self.items.pop(row) - self.endRemoveRows() - - def addRow(self, frame, framenumber): - self.insertRow(len(self.items), frame, framenumber) - - def data(self, index, role): - row = index.row() - if row > len(self.items): - # if the last row is selected and deleted, we then get called with - # an empty row! - return QtCore.QVariant() - if role == QtCore.Qt.DecorationRole: - retval = self.items[row][0] - else: - retval = QtCore.QVariant() - if type(retval) is not type(QtCore.QVariant): - return QtCore.QVariant(retval) - else: - return retval - - def __iter__(self): - for item in self.items: - yield item - - def getValue(self, index): - row = index.row() - return self.items[row] - - def getItem(self, row): - log.info(u'Get Item:%d -> %s' %(row, unicode(self.items))) - return self.items[row] - - def getList(self): - filelist = [item[3] for item in self.items]; - return filelist - -class SlideList(QtGui.QListView): +class SlideList(QtGui.QTableWidget): def __init__(self,parent=None,name=None): - QtGui.QListView.__init__(self,parent.Controller) + QtGui.QTableWidget.__init__(self,parent.Controller) self.parent = parent def keyPressEvent(self, event): @@ -145,7 +73,7 @@ class SlideController(QtGui.QWidget): self.PanelLayout.setMargin(0) # Actual controller section self.Controller = QtGui.QWidget(self.Splitter) - self.Controller.setGeometry(QtCore.QRect(0, 0, 800, 536)) + self.Controller.setGeometry(QtCore.QRect(0, 0, 100, 536)) self.Controller.setSizePolicy( QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Maximum)) @@ -153,19 +81,14 @@ class SlideController(QtGui.QWidget): self.ControllerLayout.setSpacing(0) self.ControllerLayout.setMargin(0) # Controller list view - self.PreviewListView = SlideList(self) - self.PreviewListView.setUniformItemSizes(True) - self.PreviewListView.setIconSize(QtCore.QSize(250, 190)) - self.PreviewListData = SlideData() - self.PreviewListView.isLive = self.isLive - if QtCore.QT_VERSION_STR > u'4.4.0': - self.PreviewListView.setFlow(1) - self.PreviewListView.setViewMode(1) - self.PreviewListView.setWrapping(False) - self.PreviewListView.setModel(self.PreviewListData) - self.PreviewListView.setSpacing(0) - self.PreviewListView.setObjectName(u'PreviewListView') - self.ControllerLayout.addWidget(self.PreviewListView) + self.PreviewListWidget = SlideList(self) + self.PreviewListWidget.setColumnCount(1) + self.PreviewListWidget.horizontalHeader().setVisible(False) + self.PreviewListWidget.verticalHeader().setVisible(False) + self.PreviewListWidget.setColumnWidth(1, self.Controller.width()) + self.PreviewListWidget.isLive = self.isLive + self.PreviewListWidget.setObjectName(u'PreviewListWidget') + self.ControllerLayout.addWidget(self.PreviewListWidget) # Plugin the Base Toolbar class self.BaseToolbar = BaseToolbar(self.isLive) self.Toolbar = self.BaseToolbar.getToolbar() @@ -179,7 +102,7 @@ class SlideController(QtGui.QWidget): self.Toolbar.setSizePolicy(sizeToolbarPolicy) # Screen preview area self.PreviewFrame = QtGui.QFrame(self.Splitter) - self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 250, 190)) + self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 280, 190)) self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy( QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)) self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel) @@ -197,20 +120,20 @@ class SlideController(QtGui.QWidget): sizePolicy.setHeightForWidth( self.SlidePreview.sizePolicy().hasHeightForWidth()) self.SlidePreview.setSizePolicy(sizePolicy) - self.SlidePreview.setMinimumSize(QtCore.QSize(280, 210)) + self.SlidePreview.setFixedSize(QtCore.QSize(250, 210)) self.SlidePreview.setFrameShape(QtGui.QFrame.Box) self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain) self.SlidePreview.setLineWidth(1) self.SlidePreview.setScaledContents(True) self.SlidePreview.setObjectName(u'SlidePreview') self.grid.addWidget(self.SlidePreview, 0, 0, 1, 1) - QtCore.QObject.connect(self.PreviewListView, + # Signals + QtCore.QObject.connect(self.PreviewListWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.BaseToolbar.onSlideSelected) - QtCore.QObject.connect(self.PreviewListView, + QtCore.QObject.connect(self.PreviewListWidget, QtCore.SIGNAL(u'activated(QModelIndex)'), self.BaseToolbar.onSlideSelected) # Add Late Arrivals - self.BaseToolbar.PreviewListView = self.PreviewListView - self.BaseToolbar.PreviewListData = self.PreviewListData + self.BaseToolbar.PreviewListWidget = self.PreviewListWidget self.BaseToolbar.SlidePreview = self.SlidePreview self.BaseToolbar.mainDisplay = self.parent.mainDisplay @@ -224,8 +147,7 @@ class BaseToolbar(object): def __init__(self, isLive): self.Toolbar = None - self.PreviewListView = QtGui.QListWidget() - self.PreviewListData = None + self.PreviewListWidget = QtGui.QListWidget() self.isLive = isLive self.defineToolbar() @@ -272,56 +194,35 @@ class BaseToolbar(object): """ Go to the first slide. """ - row = self.PreviewListData.createIndex(0, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + self.PreviewListWidget.selectRow(0) + self.onSlideSelected() def onSlideSelectedNext(self): """ Go to the next slide. """ - indexes = self.PreviewListView.selectedIndexes() - rowNumber = 0 - for index in indexes: - if index.row() == self.PreviewListData.rowCount() - 1: - rowNumber = 0 - else: - rowNumber = index.row() + 1 - row = self.PreviewListData.createIndex(rowNumber, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + row = self.PreviewListWidget.currentRow() + 1 + if row == self.PreviewListWidget.rowCount(): + row = 0 + self.PreviewListWidget.selectRow(row) + self.onSlideSelected() def onSlideSelectedPrevious(self): """ Go to the previous slide. """ - indexes = self.PreviewListView.selectedIndexes() - rowNumber = 0 - for index in indexes: - if index.row() == 0: - rowNumber = self.PreviewListData.rowCount() - 1 - else: - rowNumber = index.row() - 1 - row = self.PreviewListData.createIndex(rowNumber, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + row = self.PreviewListWidget.currentRow() - 1 + if row == -1: + row = self.PreviewListWidget.rowCount() - 1 + self.PreviewListWidget.selectRow(row) + self.onSlideSelected() def onSlideSelectedLast(self): """ Go to the last slide. """ - row = self.PreviewListData.createIndex( - self.PreviewListData.rowCount() - 1, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) + self.onSlideSelected() def onBlankScreen(self): """ @@ -329,54 +230,56 @@ class BaseToolbar(object): """ self.mainDisplay.blankDisplay() - def onSlideSelected(self, index): + def onSlideSelected(self): """ Generate the preview when you click on a slide. + if this is the Live Controller also display on the screen """ - frame = self.PreviewListData.getValue(index) - self.previewFrame(frame) + row = self.PreviewListWidget.currentRow() + if row > -1 and row < self.PreviewListWidget.rowCount(): + label = self.PreviewListWidget.cellWidget(row, 0) + smallframe = label.pixmap() + frame = self.serviceitem.frames[row][u'image'] + self.SlidePreview.setPixmap(smallframe) + if self.isLive: + self.mainDisplay.frameView(frame) - def previewFrame(self, frame): + def addServiceItem(self, serviceitem, slideno= 1): """ - Generates a preview of the current slide. - """ - self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[0])) - if self.isLive: - no = frame[1] - LiveFrame = self.serviceitem.frames[no][u'image'] - self.mainDisplay.frameView(LiveFrame) - - def addServiceItem(self, serviceitem): - """ - Loads a ServiceItem. + Loads a ServiceItem into the system from plugins + Display the first slide """ log.debug(u'add Service Item') - self.serviceitem = serviceitem - self.serviceitem.render() - self.PreviewListData.clear() - framenumber = 0 - for frame in self.serviceitem.frames: - self.PreviewListData.addRow(frame[u'image'], framenumber) - framenumber += 1 - row = self.PreviewListData.createIndex(0, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + serviceitem.render() + self.addServiceManagerItem(serviceitem, 0) def addServiceManagerItem(self, serviceitem, slideno): """ - Loads a ServiceManagerItem. + Loads a ServiceItem into the system from ServiceManager + Display the Slide Passed """ log.debug(u'add Service Manager Item') - self.PreviewListData.clear() + self.PreviewListWidget.clear() + self.PreviewListWidget.setRowCount(0) self.serviceitem = serviceitem framenumber = 0 for frame in self.serviceitem.frames: - self.PreviewListData.addRow(frame[u'image'], framenumber) + self.PreviewListWidget.setRowCount(self.PreviewListWidget.rowCount() + 1) + pixmap = QtGui.QPixmap.fromImage(frame[u'image']) + item = QtGui.QTableWidgetItem() + label = QtGui.QLabel() + label.setMargin(15) + label.setScaledContents(True) + width = 300 + height = width * pixmap.height() / pixmap.width() + label.setPixmap(pixmap) + self.PreviewListWidget.setCellWidget(framenumber, 0,label) + self.PreviewListWidget.setItem( framenumber, 0, item) + self.PreviewListWidget.setRowHeight(framenumber, height) + self.PreviewListWidget.setColumnWidth(0, width) framenumber += 1 - row = self.PreviewListData.createIndex(slideno, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + if slideno > self.PreviewListWidget.rowCount(): + self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) + else: + self.PreviewListWidget.selectRow(slideno) + self.onSlideSelected() diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 177075eaa..602f85bb9 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -177,7 +177,6 @@ class ThemeManager(QtGui.QWidget): items = self.ThemeListView.selectedIndexes() if len(items) > 0: for item in items: - print item data = self.themeData.getValue(item) self.amendThemeForm.loadTheme(data[3]) self.amendThemeForm.exec_() @@ -222,7 +221,10 @@ class ThemeManager(QtGui.QWidget): for root, dirs, files in os.walk(self.path): for name in files: if name.endswith(u'.png'): - self.themeData.addRow(os.path.join(self.path, name)) + #check to see file is in route directory + theme = os.path.join(self.path, name) + if os.path.exists(theme): + self.themeData.addRow(theme) self.parent.EventManager.post_event(Event(EventType.ThemeListChanged)) self.parent.ServiceManagerContents.updateThemeList(self.getThemes()) self.parent.settingsForm.ThemesTab.updateThemeList(self.getThemes()) diff --git a/openlp/plugins/images/lib/imageslidecontroller.py b/openlp/plugins/images/lib/imageslidecontroller.py index 3c2f8b510..008f25b19 100644 --- a/openlp/plugins/images/lib/imageslidecontroller.py +++ b/openlp/plugins/images/lib/imageslidecontroller.py @@ -29,7 +29,6 @@ class ImageToolbar(BaseToolbar): def __init__(self, isLive): self.Toolbar = None self.PreviewListView = QtGui.QListWidget() - self.PreviewListData = None self.isLive = isLive self.defineToolbar() @@ -84,20 +83,10 @@ class ImageToolbar(BaseToolbar): """ Go to the last slide. """ - row = self.PreviewListData.createIndex( - self.PreviewListData.rowCount() - 1, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + pass def onStopLoop(self): """ Go to the last slide. """ - row = self.PreviewListData.createIndex( - self.PreviewListData.rowCount() - 1, 0) - if row.isValid(): - self.PreviewListView.selectionModel().setCurrentIndex(row, - QtGui.QItemSelectionModel.SelectCurrent) - self.onSlideSelected(row) + pass diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 286670756..60d7a3d59 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -55,7 +55,6 @@ class ImageMediaItem(MediaManagerItem): self.ListViewWithDnD_class = ImageListView MediaManagerItem.__init__(self, parent, icon, title) #create and install our own slide controllers - #a=c # live_controller = ImageSlideController(self.parent.slideManager.parent, True) # preview_controller = ImageSlideController(self.parent.slideManager.parent) # self.parent.slideManager.add_controllers(u'image', preview_controller, live_controller) diff --git a/openlp/plugins/presentations/lib/impresscom.py b/openlp/plugins/presentations/lib/impresscom.py index 59c7366f8..99e2f2c46 100644 --- a/openlp/plugins/presentations/lib/impresscom.py +++ b/openlp/plugins/presentations/lib/impresscom.py @@ -57,7 +57,7 @@ class Openoffice(object): self.createApp() def startOpenoffice(self): - cmd = u'openoffice.org -nologo -norestore -minimized -impress' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"' + cmd = u'openoffice.org -nologo -norestore -invisible -minimized -impress' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"' retval = subprocess.Popen(cmd, shell=True) self.oopid = retval.pid From 2e818e8fd646fb6fae7e4f477d0861603f04e613 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 2 Jul 2009 20:10:14 +0100 Subject: [PATCH 6/9] Better fix for quotes --- cnvdb.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cnvdb.py b/cnvdb.py index cba3018cc..a1e200ea8 100644 --- a/cnvdb.py +++ b/cnvdb.py @@ -31,8 +31,7 @@ class Convert(): writefile = codecs.open(outname, 'w', encoding='utf-8') for line in infile: #replace the quotes with quotes - line, replace(u'\x93', "'") - line, replace(u'\x94', "'") + line, replace("''", "'") writefile.write(line) infile.close() writefile.close() From f586d9bf5edeee9eec751a5e372b80a7abbabb6c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 3 Jul 2009 20:08:21 +0100 Subject: [PATCH 7/9] Update images and rename some. More changes to slidecontroller and friends --- openlp/core/lib/mediamanageritem.py | 2 +- openlp/core/ui/__init__.py | 4 +- openlp/core/ui/maindisplay.py | 2 +- openlp/core/ui/mainwindow.py | 4 +- openlp/core/ui/slidecontroller.py | 55 ++++++++++++++---- .../images/lib/imageslidecontroller.py | 24 ++++---- openlp/plugins/images/lib/mediaitem.py | 7 +-- .../{media_verse.png => media_bible.png} | Bin resources/images/media_stop.png | Bin 0 -> 722 bytes resources/images/media_time.png | Bin 0 -> 975 bytes resources/images/openlp-2.qrc | 4 +- 11 files changed, 65 insertions(+), 37 deletions(-) rename resources/images/{media_verse.png => media_bible.png} (100%) create mode 100644 resources/images/media_stop.png create mode 100644 resources/images/media_time.png diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 1f86dfe93..decea277c 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -257,7 +257,7 @@ class MediaManagerItem(QtGui.QWidget): raise NotImplementedError(u'MediaManagerItem.generateSlideData needs to be defined by the plugin') def onPreviewClick(self): - log.debug(self.PluginTextShort+u'Preview Requested') + log.debug(self.PluginTextShort+u' Preview Requested') service_item = ServiceItem(self.parent) service_item.addIcon(u':/media/media_'+self.PluginTextShort.lower()+u'.png') self.generateSlideData(service_item) diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 48d1af59a..8fcef14ae 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -17,7 +17,7 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ -from slidecontroller import BaseToolbar +from slidecontroller import MasterToolbar from slidecontrollermanager import SlideControllerManager from maindisplay import MainDisplay from amendthemeform import AmendThemeForm @@ -33,5 +33,5 @@ from servicemanager import ServiceManager from thememanager import ThemeManager from mainwindow import MainWindow -__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'BaseToolbar' +__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MasterToolbar' 'MainWindow', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeManager', 'AmendThemeForm'] diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index dc3bb6625..afa4da931 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -78,7 +78,7 @@ class MainDisplay(QtGui.QWidget): def blankDisplay(self): if not self.displayBlank: self.displayBlank = True - self.display.setPixmap(self.blankFrame) + self.display.setPixmap(QtGui.QPixmap.fromImage(self.blankFrame)) else: self.displayBlank = False self.frameView(self.frame) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index e942ec3ea..7b56a09c8 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -205,7 +205,7 @@ class MainWindow(object): self.MediaManagerDock.setWindowIcon(icon) self.MediaManagerDock.setFloating(False) self.MediaManagerDock.setObjectName(u'MediaManagerDock') - self.MediaManagerDock.setMinimumWidth(250) + self.MediaManagerDock.setMinimumWidth(300) self.MediaManagerContents = QtGui.QWidget() self.MediaManagerContents.setObjectName(u'MediaManagerContents') self.MediaManagerLayout = QtGui.QHBoxLayout(self.MediaManagerContents) @@ -227,7 +227,7 @@ class MainWindow(object): self.ServiceManagerDock.setFeatures( QtGui.QDockWidget.AllDockWidgetFeatures) self.ServiceManagerDock.setObjectName(u'ServiceManagerDock') - self.ServiceManagerDock.setMinimumWidth(250) + self.ServiceManagerDock.setMinimumWidth(300) self.ServiceManagerContents = ServiceManager(self) self.ServiceManagerDock.setWidget(self.ServiceManagerContents) self.mainWindow.addDockWidget( diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 0863242fd..07137e2b7 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -33,16 +33,16 @@ class SlideList(QtGui.QTableWidget): if type(event) == QtGui.QKeyEvent: #here accept the event and do something if event.key() == QtCore.Qt.Key_Up: - self.parent.onSlideSelectedPrevious() + self.parent.BaseToolbar.onSlideSelectedPrevious() event.accept() elif event.key() == QtCore.Qt.Key_Down: - self.parent.onSlideSelectedNext() + self.parent.BaseToolbar.onSlideSelectedNext() event.accept() elif event.key() == QtCore.Qt.Key_PageUp: - self.parent.onSlideSelectedFirst() + self.parent.BaseToolbar.onSlideSelectedFirst() event.accept() elif event.key() == QtCore.Qt.Key_PageDown: - self.parent.onSlideSelectedLast() + self.parent.BaseToolbar.onSlideSelectedLast() event.accept() event.ignore() else: @@ -60,6 +60,7 @@ class SlideController(QtGui.QWidget): """ Set up the Slide Controller. """ + self.toolbarList = {} QtGui.QWidget.__init__(self, parent.mainWindow) self.isLive = isLive self.parent = parent @@ -90,7 +91,8 @@ class SlideController(QtGui.QWidget): self.PreviewListWidget.setObjectName(u'PreviewListWidget') self.ControllerLayout.addWidget(self.PreviewListWidget) # Plugin the Base Toolbar class - self.BaseToolbar = BaseToolbar(self.isLive) + self.BaseToolbar = MasterToolbar(self.isLive) + self.registerToolbar(u'master', self.BaseToolbar) self.Toolbar = self.BaseToolbar.getToolbar() self.ControllerLayout.addWidget(self.Toolbar) sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, @@ -137,16 +139,46 @@ class SlideController(QtGui.QWidget): self.BaseToolbar.SlidePreview = self.SlidePreview self.BaseToolbar.mainDisplay = self.parent.mainDisplay + def registerToolbar(self, handle,controller): + #store the handle name in lower case so no probems later + self.toolbarList[handle.lower()] = controller + + def retrieveToolbar(self, handle): + print handle + print self.toolbarList + try: + toolbar = self.toolbarList[handle.lower()] + except: + toolbar = self.toolbarList[u'master'] + toolbar.PreviewListWidget = self.PreviewListWidget + toolbar.SlidePreview = self.SlidePreview + toolbar.mainDisplay = self.parent.mainDisplay + print toolbar + return toolbar + def addServiceItem(self, item): + """ + helper method to pass item to correct toolbar + """ + self.BaseToolbar = self.retrieveToolbar(item.shortname) + self.ControllerLayout.removeWidget(self.Toolbar) + self.Toolbar = self.BaseToolbar.getToolbar() + self.ControllerLayout.addWidget(self.Toolbar) self.BaseToolbar.addServiceItem(item) def addServiceManagerItem(self, item, slideno): + """ + helper method to pass item to correct toolbar + """ self.BaseToolbar.addServiceManagerItem(item, slideno) -class BaseToolbar(object): - +class MasterToolbar(QtCore.QObject): + """ + Class from which all tollbars should extend + """ def __init__(self, isLive): self.Toolbar = None + QtCore.QObject.__init__(self) self.PreviewListWidget = QtGui.QListWidget() self.isLive = isLive self.defineToolbar() @@ -156,7 +188,6 @@ class BaseToolbar(object): def defineToolbar(self): # Controller toolbar - #self.Toolbar = OpenLPToolbar(self.Controller) self.Toolbar = OpenLPToolbar(self) sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) @@ -171,11 +202,11 @@ class BaseToolbar(object): u':/slides/slide_first.png', translate(u'SlideController', u'Move to first'), self.onSlideSelectedFirst) - self.Toolbar.addToolbarButton(u'Last Slide', + self.Toolbar.addToolbarButton(u'Previous Slide', u':/slides/slide_previous.png', translate(u'SlideController', u'Move to previous'), self.onSlideSelectedPrevious) - self.Toolbar.addToolbarButton(u'First Slide', + self.Toolbar.addToolbarButton(u'Next Slide', u':/slides/slide_next.png', translate(u'SlideController', u'Move to next'), self.onSlideSelectedNext) @@ -221,7 +252,7 @@ class BaseToolbar(object): """ Go to the last slide. """ - self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) + self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1) self.onSlideSelected() def onBlankScreen(self): @@ -244,7 +275,7 @@ class BaseToolbar(object): if self.isLive: self.mainDisplay.frameView(frame) - def addServiceItem(self, serviceitem, slideno= 1): + def addServiceItem(self, serviceitem, slideno = 1): """ Loads a ServiceItem into the system from plugins Display the first slide diff --git a/openlp/plugins/images/lib/imageslidecontroller.py b/openlp/plugins/images/lib/imageslidecontroller.py index 008f25b19..007407ac5 100644 --- a/openlp/plugins/images/lib/imageslidecontroller.py +++ b/openlp/plugins/images/lib/imageslidecontroller.py @@ -22,22 +22,19 @@ import os from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, translate -from openlp.core.ui.slidecontroller import BaseToolbar +from openlp.core.ui.slidecontroller import MasterToolbar -class ImageToolbar(BaseToolbar): +class ImageToolbar(MasterToolbar): def __init__(self, isLive): + MasterToolbar.__init__(self, isLive) self.Toolbar = None - self.PreviewListView = QtGui.QListWidget() self.isLive = isLive self.defineToolbar() - def getToolbar(self): - return self.Toolbar - def defineToolbar(self): # Controller toolbar - #self.Toolbar = OpenLPToolbar(self.Controller) + self.Toolbar = OpenLPToolbar(self) sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizeToolbarPolicy.setHorizontalStretch(0) @@ -49,11 +46,11 @@ class ImageToolbar(BaseToolbar): u':/slides/slide_first.png', translate(u'SlideController', u'Move to first'), self.onSlideSelectedFirst) - self.Toolbar.addToolbarButton(u'Last Slide', + self.Toolbar.addToolbarButton(u'Previous Slide', u':/slides/slide_previous.png', translate(u'SlideController', u'Move to previous'), self.onSlideSelectedPrevious) - self.Toolbar.addToolbarButton(u'First Slide', + self.Toolbar.addToolbarButton(u'Next Slide', u':/slides/slide_next.png', translate(u'SlideController', u'Move to next'), self.onSlideSelectedNext) @@ -69,24 +66,23 @@ class ImageToolbar(BaseToolbar): self.onBlankScreen) self.Toolbar.addSeparator() self.Toolbar.addToolbarButton(u'Start Loop', - u':/slides/slide_last.png', + u':/media/media_time.png', translate(u'SlideController', u'Start continuous loop'), self.onStartLoop) self.Toolbar.addToolbarButton(u'Stop Loop', - u':/slides/slide_last.png', + u':/media/media_stop.png', translate(u'SlideController', u'Start continuous loop'), self.onStopLoop) self.Toolbar.setSizePolicy(sizeToolbarPolicy) - self.ControllerLayout.addWidget(self.Toolbar) def onStartLoop(self): """ Go to the last slide. """ - pass + print "onStartLoop" def onStopLoop(self): """ Go to the last slide. """ - pass + print "onStopLoop" diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 60d7a3d59..e0ef07260 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -54,10 +54,9 @@ class ImageMediaItem(MediaManagerItem): # be instanced by the base MediaManagerItem self.ListViewWithDnD_class = ImageListView MediaManagerItem.__init__(self, parent, icon, title) - #create and install our own slide controllers -# live_controller = ImageSlideController(self.parent.slideManager.parent, True) -# preview_controller = ImageSlideController(self.parent.slideManager.parent) -# self.parent.slideManager.add_controllers(u'image', preview_controller, live_controller) + #create and install our own slide controller toolbar + imageToolbar = ImageToolbar(True) + parent.live_controller.registerToolbar(self.ConfigSection, imageToolbar) def initialise(self): self.ListView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) diff --git a/resources/images/media_verse.png b/resources/images/media_bible.png similarity index 100% rename from resources/images/media_verse.png rename to resources/images/media_bible.png diff --git a/resources/images/media_stop.png b/resources/images/media_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..5b4c488bdfde337177a0fa697d72b92c91bfb4ff GIT binary patch literal 722 zcmV;@0xkWCP)T3ZYmz(SzqVG|c5sBvYC8;yxO zSMFq|3m+?&Il=G#E*49tb+=foJF~O)o2zJAzY&PF{ zcQn;xSqPzlrXf8Sr($<54-e-N;#i|37$JfeySwr|H*TiPjViKU2hYP-r|-JdeIIGH zvULAmHS=RRl4$?nxsLQ$&+S_&y<9>lNLMW?6?D~xf(rKqNMIPx zd#_(jYV!-|zE9h^AzFuq)IAV+w4c8~=fz8y0^G?-dasQn115Tdn&%~|A0}vNX+xMM zI1WZ8gLU}|!H6++cMEgqtE(6)(Z>6UZ6-?KfMBzVR#`_c{$geH4(`G{Mt4TRS=_}1 z)}K5ku0+iP0~os4W}*Zhh?V?Xnv7=Z$s~F<8$KdoN!Mj#`V-#t6m{EXEfF$}36PsM z{9MLeU!(oOL(IN@{(Swi-DdxO(vP0vC*p_z(nBUnAYrSfv!k{YxOn;`zVFlX@->=i zA^`zZ^pJ`6U`mLC?_!J(Hk0VGLEG0J+JjFDxRwQa41O0`O2Ldx?YPU)!&1&fixf!S zn2aCUOCnPtj4HxY0=|T$7Qx3gSv%o`aN{OMl2=M{z*k99Nn-Ihx?xcFJjw_rSIV_h z4e)M3BpHVn>L*IXElUe#_ZPV#qs)L)#4b{$^%peJ8WC;Ge_}L0 zua~!wcF_YL?=8N2?mg$8kBOp)@1eQ5*)TUZcYv=jFfi~?tycdSiA3U5d;1%L>FH^? z+wGnS1On%Cxm^QS~GI5=qC z+1Z(YaPK~Q`}Y5=QKysTt5ncvGzf)4h(@DWTVKyy?(gS)UY|HQIXNdn932}QdnOS$ z9FFL%8#fERn;T+7eLXA8WS}Z9$0-=Y$E77KE-vPN76fi@Z*QfeqvIS1Tw7b)qii-? z7zqW_7X^VSlu9TJ2E^9Zz{zCN3DOh_g#wN%SGd1kzC3BNHr2Jax1R?=*4o-S?C5vs zs;W#fp63w_29Zy?V=F7rn$6fhI6#=ZI7+3k{pk~`tE<@?x106#^>Ot7nh%G=<(X_o zG#ZU89*?7#bStS_>g-uOzj_rqyB#}zKlFM%ac~?b znU*2_d|n>bcXyE}D?=WU_Vo0iw6s)`kxr-K@p$m+pI1edm6bUzl}hbWDA*y5&WJ>w zpD&S>S5zRS)1kAo6E!t8n3|eGB9Q=P1LPYl77Mf6?G@bN;o*OYL=x{87EWYj*zxhP zM6k8Bg_4pIsk4%d^?JP+8XCgL$Ove32!a4=eu3ZE*tkhXUZWt%KL-Nf7=yZ?0Mt#o zNMzEPot?$<^0JhPmX;RD6OyavK=Awhj(9AN-=97eL*a0S3ScDt`}_NnCzKV5i~@&= zi3ylYCalq#$q&zIl+9-ILy@*fuTU!3=H{j}GD$>NR~NKeEml`oF*-U5Dtmedia_presentation.png media_image.png media_song.png - media_verse.png + media_bible.png media_video.png + media_time.png + media_stop.png messagebox_critical.png From 11107135294e889885ef8b737136aa8f0f78369b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 3 Jul 2009 21:32:33 +0100 Subject: [PATCH 8/9] Fix bug in bibles with invalid method name Add Image Tab to get loop delay Fix loss of Bible Icons Add Loop delay to ImageController Get Controllers to swap correctly --- openlp/core/ui/slidecontroller.py | 19 +++++++++++++++---- openlp/plugins/bibles/bibleplugin.py | 2 +- openlp/plugins/bibles/lib/manager.py | 2 +- openlp/plugins/images/imageplugin.py | 6 +++++- openlp/plugins/images/lib/__init__.py | 1 + .../images/lib/imageslidecontroller.py | 15 +++++++++++---- openlp/plugins/images/lib/mediaitem.py | 2 +- 7 files changed, 35 insertions(+), 12 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 07137e2b7..5679b76e1 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -144,8 +144,10 @@ class SlideController(QtGui.QWidget): self.toolbarList[handle.lower()] = controller def retrieveToolbar(self, handle): - print handle - print self.toolbarList + """ + Find the toolbar and return master if none present + Add extra information back into toolbar class + """ try: toolbar = self.toolbarList[handle.lower()] except: @@ -153,7 +155,6 @@ class SlideController(QtGui.QWidget): toolbar.PreviewListWidget = self.PreviewListWidget toolbar.SlidePreview = self.SlidePreview toolbar.mainDisplay = self.parent.mainDisplay - print toolbar return toolbar def addServiceItem(self, item): @@ -162,6 +163,8 @@ class SlideController(QtGui.QWidget): """ self.BaseToolbar = self.retrieveToolbar(item.shortname) self.ControllerLayout.removeWidget(self.Toolbar) + #remove the old toolbar + self.Toolbar.clear() self.Toolbar = self.BaseToolbar.getToolbar() self.ControllerLayout.addWidget(self.Toolbar) self.BaseToolbar.addServiceItem(item) @@ -170,6 +173,12 @@ class SlideController(QtGui.QWidget): """ helper method to pass item to correct toolbar """ + self.BaseToolbar = self.retrieveToolbar(item.shortname) + self.ControllerLayout.removeWidget(self.Toolbar) + #remove the old toolbar + self.Toolbar.clear() + self.Toolbar = self.BaseToolbar.getToolbar() + self.ControllerLayout.addWidget(self.Toolbar) self.BaseToolbar.addServiceManagerItem(item, slideno) class MasterToolbar(QtCore.QObject): @@ -181,9 +190,11 @@ class MasterToolbar(QtCore.QObject): QtCore.QObject.__init__(self) self.PreviewListWidget = QtGui.QListWidget() self.isLive = isLive - self.defineToolbar() def getToolbar(self): + #define toolbar here as it needs to be redefined each time + #as the clear destroys it. + self.defineToolbar() return self.Toolbar def defineToolbar(self): diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 0a1347fae..4dd42b9e9 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -37,7 +37,7 @@ class BiblePlugin(Plugin): self.weight = -9 # Create the plugin icon self.icon = QtGui.QIcon() - self.icon.addPixmap(QtGui.QPixmap(u':/media/media_verse.png'), + self.icon.addPixmap(QtGui.QPixmap(u':/media/media_bible.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) #Register the bible Manager self.biblemanager = BibleManager(self.config) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 23f58c013..8c261d32f 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -245,7 +245,7 @@ class BibleManager(): log.debug(u'get_verse_text : new book') for chapter in range(schapter, echapter+1): search_results = self.bible_http_cache [bible].get_bible_chapter(bible, 0, bookname, chapter) - if search_results.has_verse_list() : + if search_results.has_verselist() : ## We have found a book of the bible lets check to see if it was there. ## By reusing the returned book name we get a correct book. ## For example it is possible to request ac and get Acts back. diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index e46cb6a2b..8a49b8c74 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -22,7 +22,7 @@ import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, Event, EventType -from openlp.plugins.images.lib import ImageMediaItem +from openlp.plugins.images.lib import ImageMediaItem, ImageTab class ImagePlugin(Plugin): global log @@ -40,6 +40,10 @@ class ImagePlugin(Plugin): # passed with drag and drop messages self.dnd_id = u'Image' + def get_settings_tab(self): + self.ImageTab = ImageTab() + return self.ImageTab + def get_media_manager_item(self): # Create the MediaManagerItem object self.media_item = ImageMediaItem(self, self.icon, u'Images') diff --git a/openlp/plugins/images/lib/__init__.py b/openlp/plugins/images/lib/__init__.py index ac20c9f45..8ffdca25f 100644 --- a/openlp/plugins/images/lib/__init__.py +++ b/openlp/plugins/images/lib/__init__.py @@ -19,3 +19,4 @@ Place, Suite 330, Boston, MA 02111-1307 USA """ from mediaitem import ImageMediaItem from imageslidecontroller import ImageToolbar +from imagetab import ImageTab diff --git a/openlp/plugins/images/lib/imageslidecontroller.py b/openlp/plugins/images/lib/imageslidecontroller.py index 007407ac5..68f7da815 100644 --- a/openlp/plugins/images/lib/imageslidecontroller.py +++ b/openlp/plugins/images/lib/imageslidecontroller.py @@ -26,8 +26,9 @@ from openlp.core.ui.slidecontroller import MasterToolbar class ImageToolbar(MasterToolbar): - def __init__(self, isLive): + def __init__(self, parent, isLive): MasterToolbar.__init__(self, isLive) + self.parent = parent self.Toolbar = None self.isLive = isLive self.defineToolbar() @@ -71,7 +72,7 @@ class ImageToolbar(MasterToolbar): self.onStartLoop) self.Toolbar.addToolbarButton(u'Stop Loop', u':/media/media_stop.png', - translate(u'SlideController', u'Start continuous loop'), + translate(u'SlideController', u'Stop continuous loop'), self.onStopLoop) self.Toolbar.setSizePolicy(sizeToolbarPolicy) @@ -79,10 +80,16 @@ class ImageToolbar(MasterToolbar): """ Go to the last slide. """ - print "onStartLoop" + delay = self.parent.parent.ImageTab.loop_delay + self.timer_id = self.startTimer(delay * 1000) def onStopLoop(self): """ Go to the last slide. """ - print "onStopLoop" + self.killTimer(self.timer_id) + + def timerEvent(self, event): + if event.timerId() == self.timer_id: + self.onSlideSelectedNext() + diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index e0ef07260..c8d40c49e 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -55,7 +55,7 @@ class ImageMediaItem(MediaManagerItem): self.ListViewWithDnD_class = ImageListView MediaManagerItem.__init__(self, parent, icon, title) #create and install our own slide controller toolbar - imageToolbar = ImageToolbar(True) + imageToolbar = ImageToolbar(self, True) parent.live_controller.registerToolbar(self.ConfigSection, imageToolbar) def initialise(self): From 4e089225286947092842f7a30d8d74f1fc5e4440 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 3 Jul 2009 21:33:41 +0100 Subject: [PATCH 9/9] OOPs missed file --- openlp/plugins/images/lib/imagetab.py | 69 +++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 openlp/plugins/images/lib/imagetab.py diff --git a/openlp/plugins/images/lib/imagetab.py b/openlp/plugins/images/lib/imagetab.py new file mode 100644 index 000000000..d1e58c4c6 --- /dev/null +++ b/openlp/plugins/images/lib/imagetab.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 +""" +OpenLP - Open Source Lyrics Projection +Copyright (c) 2008 Raoul Snyman +Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley, + +This program is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free Software +Foundation; version 2 of the License. + +This program is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License along with +this program; if not, write to the Free Software Foundation, Inc., 59 Temple +Place, Suite 330, Boston, MA 02111-1307 USA +""" + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import SettingsTab, str_to_bool, translate + +class ImageTab(SettingsTab): + """ + ImageTab is the Image settings tab in the settings dialog. + """ + def __init__(self): + SettingsTab.__init__(self, translate(u'ImageTab', u'Image'), u'Image') + + def setupUi(self): + self.setObjectName(u'ImageTab') + self.ImageLayout = QtGui.QFormLayout(self) + self.ImageLayout.setObjectName(u'ImageLayout') + self.ImageModeGroupBox = QtGui.QGroupBox(self) + self.ImageModeGroupBox.setObjectName(u'ImageModeGroupBox') + self.TimeoutLayout = QtGui.QHBoxLayout(self.ImageModeGroupBox) + self.TimeoutLayout.setSpacing(8) + self.TimeoutLayout.setMargin(0) + self.TimeoutLayout.setObjectName(u'TimeoutLayout') + self.TimeoutLabel = QtGui.QLabel(self.ImageModeGroupBox) + self.TimeoutLabel.setObjectName(u'TimeoutLabel') + self.TimeoutLayout.addWidget(self.TimeoutLabel) + self.TimeoutSpinBox = QtGui.QSpinBox(self.ImageModeGroupBox) + self.TimeoutSpinBox.setMaximum(180) + self.TimeoutSpinBox.setObjectName(u'TimeoutSpinBox') + self.TimeoutLayout.addWidget(self.TimeoutSpinBox) + self.TimeoutSpacer = QtGui.QSpacerItem(147, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.TimeoutLayout.addItem(self.TimeoutSpacer) + + self.ImageLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.ImageModeGroupBox) + # Signals and slots + QtCore.QObject.connect(self.TimeoutSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), self.onTimeoutSpinBoxChanged) + + def retranslateUi(self): + self.TimeoutLabel.setText(translate(u'ImageTab', u'Slide Loop Delay:')) + + def onTimeoutSpinBoxChanged(self): + self.loop_delay = self.TimeoutSpinBox.value() + + def load(self): + self.loop_delay = int(self.config.get_config(u'loop delay', 5)) + self.TimeoutSpinBox.setValue(self.loop_delay) + + def save(self): + self.config.set_config(u'loop delay', self.loop_delay)