diff --git a/openlp.pyw b/openlp.pyw index 10bacc564..4eda4d1e2 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -52,7 +52,7 @@ class OpenLP(QtGui.QApplication): pass #provide a listener for widgets to reqest a screen update. QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'openlpprocessevents'), self.processEvents) + QtCore.SIGNAL(u'process_events'), self.processEvents) self.setApplicationName(u'openlp.org') self.setApplicationVersion(u'1.9.0') self.splash = SplashScreen(self.applicationVersion()) diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index 73a908a2d..ef8e0d97f 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -32,10 +32,6 @@ class EventReceiver(QtCore.QObject): def send_message(self, event, msg=None): self.emit(QtCore.SIGNAL(event), msg) - def received(self, msg=None): - print msg - - class Receiver(): """ Class to allow events to be passed from different parts of the system. @@ -55,10 +51,6 @@ class Receiver(): def send_message(event, msg=None): Receiver.eventreceiver.send_message(event, msg) - @staticmethod - def receive(): - Receiver.eventreceiver.receive() - @staticmethod def get_receiver(): return Receiver.eventreceiver diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 78f0caa2b..bf5cfaa77 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -21,7 +21,7 @@ import logging from PyQt4 import QtCore, QtGui from time import sleep -from openlp.core.lib import translate, EventManager, Event, EventType +from openlp.core.lib import translate, EventManager, Event, EventType, Receiver class MainDisplay(QtGui.QWidget): """ @@ -60,6 +60,8 @@ class MainDisplay(QtGui.QWidget): self.timer_id = 0 # Register the main form as an event consumer. self.parent.EventManager.register(self) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'live_slide_blank'), self.blankDisplay) def handle_event(self, event): """ diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index b869a96c2..2ca39f30c 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -21,7 +21,7 @@ import logging import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, translate, buildIcon +from openlp.core.lib import OpenLPToolbar, translate, buildIcon, Receiver class SlideList(QtGui.QTableWidget): """ @@ -64,9 +64,11 @@ class SlideController(QtGui.QWidget): Set up the Slide Controller. """ self.toolbarList = {} - self.previewList = {} QtGui.QWidget.__init__(self, parent) self.isLive = isLive + self.prefix = u'preview_' + if isLive: + self.prefix = u'live_' self.parent = parent self.Panel = QtGui.QWidget(parent.ControlSplitter) self.Splitter = QtGui.QSplitter(self.Panel) @@ -118,118 +120,6 @@ class SlideController(QtGui.QWidget): self.grid.setMargin(8) self.grid.setObjectName(u'grid') # Actual preview screen - masterPreview = MasterPreview(self.PreviewFrame).getPreview() - self.registerPreview(u'master', masterPreview) - self.SlidePreview = self.retrievePreview(u'master') - self.grid.addWidget(self.SlidePreview, 0, 0, 1, 1) - # Signals - QtCore.QObject.connect(self.PreviewListWidget, - QtCore.SIGNAL(u'clicked(QModelIndex)'), self.BaseToolbar.onSlideSelected) - QtCore.QObject.connect(self.PreviewListWidget, - QtCore.SIGNAL(u'activated(QModelIndex)'), self.BaseToolbar.onSlideSelected) - # Add Late Arrivals - self.BaseToolbar.PreviewListWidget = self.PreviewListWidget - self.BaseToolbar.SlidePreview = self.SlidePreview - self.BaseToolbar.mainDisplay = self.parent.mainDisplay - - def registerToolbar(self, handle,controller): - """ - Register a new toolbar with the controller - ``handle`` - Identifier for the toolbar being stored this should equal the - plugins name. - ``controller`` - The toolbar class which should extend MasterToolbar - """ - #store the handle name in lower case so no probems later - self.toolbarList[handle.lower()] = controller - - def registerPreview(self, handle,controller): - """ - Register a new preview with the controller - ``handle`` - Identifier for the preview being stored this should equal the - plugins name. - ``controller`` - The preview class which should extend MasterToolbar - """ - #store the handle name in lower case so no probems later - self.previewList[handle.lower()] = controller - - def retrieveToolbar(self, handle): - """ - Find the toolbar and return master if none present - Add extra information back into toolbar class - ``handle`` - Identifier for the toolbar being requested - """ - 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 - return toolbar - - def retrievePreview(self, handle): - """ - Find the preview and return master if none present - Add extra information back into toolbar class - ``handle`` - Identifier for the toolbar being requested - """ - try: - preview = self.previewList[handle.lower()] - except: - preview = self.previewList[u'master'] - return preview - - def addServiceItem(self, item): - """ - Method to install the service item into the controller and - request the correct the toolbar of the plugin - Called by plugins - """ - self.SlidePreview = self.retrievePreview(item.shortname) - 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) - - def addServiceManagerItem(self, item, slideno): - """ - Method to install the service item into the controller and - request the correct the toolbar of the plugin - Called by ServiceManager - """ - self.SlidePreview = self.retrievePreview(item.shortname) - 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 MasterPreview(QtCore.QObject): - """ - Class from which all Previews should extend allowing plugins to - have their own previews - """ - def __init__(self, parent): - self.parent = parent - QtCore.QObject.__init__(self) - self.definePreview() - - def getPreview(self): - return self.SlidePreview - - def definePreview(self): self.SlidePreview = QtGui.QLabel(self.parent) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) @@ -244,130 +134,82 @@ class MasterPreview(QtCore.QObject): self.SlidePreview.setLineWidth(1) self.SlidePreview.setScaledContents(True) self.SlidePreview.setObjectName(u'SlidePreview') + self.grid.addWidget(self.SlidePreview, 0, 0, 1, 1) + # Signals + QtCore.QObject.connect(self.PreviewListWidget, + QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) + QtCore.QObject.connect(self.PreviewListWidget, + QtCore.SIGNAL(u'activated(QModelIndex)'), self.onSlideSelected) + # Window Event Handlers + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'%sslide_first'% self.prefix), self.onSlideSelectedFirst) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'%sslide_previous'% self.prefix), self.onSlideSelectedPrevious) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'%sslide_next'% self.prefix), self.onSlideSelectedNext) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'%sslide_last'% self.prefix), self.onSlideSelectedLast) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'%sslide_start_loop'% self.prefix), self.onStartLoop) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'%sslide_stop_loop'% self.prefix), self.onStopLoop) -class MasterToolbar(QtCore.QObject): - """ - Class from which all toolbars should extend - """ - def __init__(self, isLive): - self.Toolbar = None - QtCore.QObject.__init__(self) - self.PreviewListWidget = QtGui.QListWidget() - self.isLive = isLive + def registerToolbar(self, handle,controller): + """ + Register a new toolbar with the controller + ``handle`` + Identifier for the toolbar being stored this should equal the + plugins name. + ``controller`` + The toolbar class which should extend MasterToolbar + """ + #store the handle name in lower case so no probems later + self.toolbarList[handle.lower()] = controller - 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 retrieveToolbar(self, handle): + """ + Find the toolbar and return master if none present + Add extra information back into toolbar class + ``handle`` + Identifier for the toolbar being requested + """ + try: + toolbar = self.toolbarList[handle.lower()] + except: + toolbar = self.toolbarList[u'master'] + return toolbar - def defineToolbar(self): - # Controller toolbar - self.Toolbar = OpenLPToolbar(self) - sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) - sizeToolbarPolicy.setHorizontalStretch(0) - sizeToolbarPolicy.setVerticalStretch(0) - sizeToolbarPolicy.setHeightForWidth( - self.Toolbar.sizePolicy().hasHeightForWidth()) - self.Toolbar.setSizePolicy(sizeToolbarPolicy) + def addServiceItem(self, item): + """ + Method to install the service item into the controller and + request the correct the toolbar of the plugin + Called by plugins + """ + 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) + item.render() + self.displayServiceManagerItems(item, 0) - if self.isLive: - self.Toolbar.addToolbarButton(u'First Slide', - u':/slides/slide_first.png', - translate(u'SlideController', u'Move to first'), - self.onSlideSelectedFirst) - self.Toolbar.addToolbarButton(u'Previous Slide', - u':/slides/slide_previous.png', - translate(u'SlideController', u'Move to previous'), - self.onSlideSelectedPrevious) - self.Toolbar.addToolbarButton(u'Next Slide', - u':/slides/slide_next.png', - translate(u'SlideController', u'Move to next'), - self.onSlideSelectedNext) - if self.isLive: - self.Toolbar.addToolbarButton(u'Last Slide', - u':/slides/slide_last.png', - translate(u'SlideController', u'Move to last'), - self.onSlideSelectedLast) - self.Toolbar.addSeparator() - self.Toolbar.addToolbarButton(u'Close Screen', - u':/slides/slide_close.png', - translate(u'SlideController', u'Close Screen'), - self.onBlankScreen) + def addServiceManagerItem(self, item, slideno): + """ + Method to install the service item into the controller and + request the correct the toolbar of the plugin + Called by ServiceManager + """ + 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.displayServiceManagerItems(item, slideno) - def serviceLoaded(self): - """ - method to allow toolbars to know when the service item - is fully in place - """ - pass - - def onSlideSelectedFirst(self): - """ - Go to the first slide. - """ - self.PreviewListWidget.selectRow(0) - self.onSlideSelected() - - def onSlideSelectedNext(self): - """ - Go to the next slide. - """ - 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. - """ - 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. - """ - self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1) - self.onSlideSelected() - - def onBlankScreen(self): - """ - Blank the screen. - """ - self.mainDisplay.blankDisplay() - - def onSlideSelected(self): - """ - Generate the preview when you click on a slide. - if this is the Live Controller also display on the screen - """ - 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 addServiceItem(self, serviceitem, slideno = 1): - """ - Loads a ServiceItem into the system from plugins - Display the first slide - """ - log.debug(u'add Service Item') - serviceitem.render() - self.addServiceManagerItem(serviceitem, 0) - - def addServiceManagerItem(self, serviceitem, slideno): + def displayServiceManagerItems(self, serviceitem, slideno): """ Loads a ServiceItem into the system from ServiceManager Display the slide number passed @@ -398,5 +240,177 @@ class MasterToolbar(QtCore.QObject): else: self.PreviewListWidget.selectRow(slideno) self.onSlideSelected() - self.serviceLoaded() self.PreviewListWidget.setFocus() + + #Screen event methods + def onSlideSelected(self): + """ + Generate the preview when you click on a slide. + if this is the Live Controller also display on the screen + """ + 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.parent.mainDisplay.frameView(frame) + + def onSlideSelectedFirst(self): + """ + Go to the first slide. + """ + print "oSSF" + self.PreviewListWidget.selectRow(0) + self.onSlideSelected() + + def onBlankScreen(self): + """ + Blank the screen. + """ + self.parent.mainDisplay.blankDisplay() + + def onSlideSelected(self): + """ + Generate the preview when you click on a slide. + if this is the Live Controller also display on the screen + """ + 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.parent.mainDisplay.frameView(frame) + + def onSlideSelectedNext(self): + """ + Go to the next slide. + """ + 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. + """ + 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. + """ + self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1) + self.onSlideSelected() + + def onStartLoop(self, value): + """ + Go to the last slide. + """ + if self.PreviewListWidget.rowCount() > 1: + self.timer_id = self.startTimer(int(value) * 1000) + + def onStopLoop(self): + """ + Go to the last slide. + """ + self.killTimer(self.timer_id) + + def timerEvent(self, event): + if event.timerId() == self.timer_id: + self.onSlideSelectedNext() + +class MasterToolbar(QtCore.QObject): + """ + Class from which all toolbars should extend + """ + def __init__(self, isLive): + self.Toolbar = None + QtCore.QObject.__init__(self) + self.PreviewListWidget = QtGui.QListWidget() + self.isLive = isLive + self.prefix = u'preview_' + if isLive: + self.prefix = u'live_' + + def getToolbar(self): + #define toolbar here as it needs to be redefined each time + #as the clear destroys it. + self.defineToolbar() + self.defineZone1() + self.defineZone2() + self.defineZone3() + self.defineZone4() + self.defineZone5() + return self.Toolbar + + def defineToolbar(self): + # Controller toolbar + self.Toolbar = OpenLPToolbar(self) + sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) + sizeToolbarPolicy.setHorizontalStretch(0) + sizeToolbarPolicy.setVerticalStretch(0) + sizeToolbarPolicy.setHeightForWidth( + self.Toolbar.sizePolicy().hasHeightForWidth()) + self.Toolbar.setSizePolicy(sizeToolbarPolicy) + + def defineZone1(self): + #Dummy Zone + pass + + def defineZone2(self): + if self.isLive: + self.Toolbar.addToolbarButton(u'First Slide', + u':/slides/slide_first.png', + translate(u'SlideController', u'Move to first'), + self.onSlideFirst) + self.Toolbar.addToolbarButton(u'Previous Slide', + u':/slides/slide_previous.png', + translate(u'SlideController', u'Move to previous'), + self.onSlidePrevious) + self.Toolbar.addToolbarButton(u'Next Slide', + u':/slides/slide_next.png', + translate(u'SlideController', u'Move to next'), + self.onSlideNext) + if self.isLive: + self.Toolbar.addToolbarButton(u'Last Slide', + u':/slides/slide_last.png', + translate(u'SlideController', u'Move to last'), + self.onSlideLast) + + def defineZone3(self): + #Dummy Zone + pass + + def defineZone4(self): + if self.isLive: + self.Toolbar.addSeparator() + self.Toolbar.addToolbarButton(u'Close Screen', + u':/slides/slide_close.png', + translate(u'SlideController', u'Close Screen'), + self.onSlideBlank) + + def defineZone5(self): + #Dummy Zone + pass + + def onSlideFirst(self): + Receiver().send_message(u'%sslide_first'% self.prefix) + def onSlidePrevious(self): + Receiver().send_message(u'%sslide_previous'% self.prefix) + def onSlideNext(self): + Receiver().send_message(u'%sslide_next'% self.prefix) + def onSlideLast(self): + Receiver().send_message(u'%sslide_last' % self.prefix) + def onSlideBlank(self): + Receiver().send_message(u'%sslide_blank' % self.prefix) diff --git a/openlp/plugins/bibles/lib/bibleCSVimpl.py b/openlp/plugins/bibles/lib/bibleCSVimpl.py index e97c4173c..763044a6f 100644 --- a/openlp/plugins/bibles/lib/bibleCSVimpl.py +++ b/openlp/plugins/bibles/lib/bibleCSVimpl.py @@ -60,7 +60,7 @@ class BibleCSVImpl(BibleCommon): count += 1 #Flush the screen events if count % 3 == 0: - Receiver().send_message(u'openlpprocessevents') + Receiver().send_message(u'process_events') count = 0 count = 0 @@ -83,5 +83,5 @@ class BibleCSVImpl(BibleCommon): count += 1 #Every x verses repaint the screen if count % 3 == 0: - Receiver().send_message(u'openlpprocessevents') + Receiver().send_message(u'process_events') count = 0 diff --git a/openlp/plugins/bibles/lib/bibleOSISimpl.py b/openlp/plugins/bibles/lib/bibleOSISimpl.py index b59e7e5f3..68be69662 100644 --- a/openlp/plugins/bibles/lib/bibleOSISimpl.py +++ b/openlp/plugins/bibles/lib/bibleOSISimpl.py @@ -149,13 +149,13 @@ class BibleOSISImpl(): self.abbrevOfBible[p[0]], testament) dialogobject.incrementProgressBar( self.booksOfBible[p[0]]) - Receiver().send_message(u'openlpprocessevents') + Receiver().send_message(u'process_events') count = 0 self.bibledb.add_verse(book.id, p[1], p[2], text) count += 1 #Every 3 verses repaint the screen if count % 3 == 0: - Receiver().send_message(u'openlpprocessevents') + Receiver().send_message(u'process_events') count = 0 def remove_block(self, start_tag, end_tag, text): diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index ebb55b578..791a8f54b 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -252,7 +252,7 @@ class BibleMediaItem(MediaManagerItem): def setQuickMsg2(self, text): self.QuickMsg2.setText(translate(u'BibleMediaItem', unicode(text))) - Receiver().send_message(u'openlpprocessevents') + Receiver().send_message(u'process_events') #minor delay to get the events processed time.sleep(0.5) diff --git a/openlp/plugins/images/lib/__init__.py b/openlp/plugins/images/lib/__init__.py index 8ffdca25f..8d037bd80 100644 --- a/openlp/plugins/images/lib/__init__.py +++ b/openlp/plugins/images/lib/__init__.py @@ -18,5 +18,5 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA """ from mediaitem import ImageMediaItem -from imageslidecontroller import ImageToolbar +from imagetoolbar import ImageToolbar from imagetab import ImageTab diff --git a/openlp/plugins/images/lib/imageslidecontroller.py b/openlp/plugins/images/lib/imageslidecontroller.py deleted file mode 100644 index f065b78d2..000000000 --- a/openlp/plugins/images/lib/imageslidecontroller.py +++ /dev/null @@ -1,106 +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-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 -""" -import logging -import os - -from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, translate -from openlp.core.ui.slidecontroller import MasterToolbar - -class ImageToolbar(MasterToolbar): - - def __init__(self, parent, isLive): - MasterToolbar.__init__(self, isLive) - self.parent = parent - self.Toolbar = None - self.isLive = isLive - self.defineToolbar() - - def defineToolbar(self): - # Controller toolbar - self.Toolbar = OpenLPToolbar(self) - sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) - sizeToolbarPolicy.setHorizontalStretch(0) - sizeToolbarPolicy.setVerticalStretch(0) - sizeToolbarPolicy.setHeightForWidth( - self.Toolbar.sizePolicy().hasHeightForWidth()) - if self.isLive: - self.Toolbar.addToolbarButton(u'First Slide', - u':/slides/slide_first.png', - translate(u'SlideController', u'Move to first'), - self.onSlideSelectedFirst) - self.Toolbar.addToolbarButton(u'Previous Slide', - u':/slides/slide_previous.png', - translate(u'SlideController', u'Move to previous'), - self.onSlideSelectedPrevious) - self.Toolbar.addToolbarButton(u'Next Slide', - u':/slides/slide_next.png', - translate(u'SlideController', u'Move to next'), - self.onSlideSelectedNext) - if self.isLive: - self.Toolbar.addToolbarButton(u'Last Slide', - u':/slides/slide_last.png', - translate(u'SlideController', u'Move to last'), - self.onSlideSelectedLast) - self.Toolbar.addSeparator() - self.Toolbar.addToolbarButton(u'Close Screen', - u':/slides/slide_close.png', - translate(u'SlideController', u'Close Screen'), - self.onBlankScreen) - self.Toolbar.addSeparator() - self.Toolbar.addToolbarButton(u'Start Loop', - u':/media/media_time.png', - translate(u'SlideController', u'Start continuous loop'), - self.onStartLoop) - self.Toolbar.addToolbarButton(u'Stop Loop', - u':/media/media_stop.png', - translate(u'SlideController', u'Stop continuous loop'), - self.onStopLoop) - self.Toolbar.addSeparator() - self.DelaySpinBox = QtGui.QSpinBox(self.Toolbar) - self.SpinWidget = QtGui.QWidgetAction(self.Toolbar) - self.SpinWidget.setDefaultWidget(self.DelaySpinBox) - self.Toolbar.addAction(self.SpinWidget) - #self.Layout.addWidget(self.Toolbar) - self.Toolbar.setSizePolicy(sizeToolbarPolicy) - self.DelaySpinBox.setSuffix(translate(u'ImageSlideController', u's')) - - def serviceLoaded(self): - self.DelaySpinBox.setValue(self.parent.parent.ImageTab.loop_delay) - if self.PreviewListWidget.rowCount() == 1: - self.DelaySpinBox.setEnabled(False) - - def onStartLoop(self): - """ - Go to the last slide. - """ - if self.PreviewListWidget.rowCount() > 1: - self.timer_id = self.startTimer(int(self.TimeoutSpinBox.value()) * 1000) - - def onStopLoop(self): - """ - Go to the last slide. - """ - self.killTimer(self.timer_id) - - def timerEvent(self, event): - if event.timerId() == self.timer_id: - self.onSlideSelectedNext() diff --git a/openlp/plugins/images/lib/imagetoolbar.py b/openlp/plugins/images/lib/imagetoolbar.py new file mode 100644 index 000000000..7d37bfe81 --- /dev/null +++ b/openlp/plugins/images/lib/imagetoolbar.py @@ -0,0 +1,63 @@ +# -*- 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 +""" +import logging +import os + +from PyQt4 import QtCore, QtGui +from openlp.core.lib import OpenLPToolbar, translate, Receiver +from openlp.core.ui.slidecontroller import MasterToolbar + +class ImageToolbar(MasterToolbar): + + def __init__(self, parent, isLive): + MasterToolbar.__init__(self, isLive) + self.parent = parent + self.Toolbar = None + self.isLive = isLive + + def defineZone5(self): + self.Toolbar.addSeparator() + self.Toolbar.addToolbarButton(u'Start Loop', + u':/media/media_time.png', + translate(u'SlideController', u'Start continuous loop'), + self.onStartLoop) + self.Toolbar.addToolbarButton(u'Stop Loop', + u':/media/media_stop.png', + translate(u'SlideController', u'Stop continuous loop'), + self.onStopLoop) + self.Toolbar.addSeparator() + self.DelaySpinBox = QtGui.QSpinBox(self.Toolbar) + self.SpinWidget = QtGui.QWidgetAction(self.Toolbar) + self.SpinWidget.setDefaultWidget(self.DelaySpinBox) + self.Toolbar.addAction(self.SpinWidget) + self.DelaySpinBox.setValue(self.parent.parent.ImageTab.loop_delay) + self.DelaySpinBox.setSuffix(translate(u'ImageSlideController', u's')) + + def onStartLoop(self): + """ + Trigger the slide controller to start to loop passing the delay + """ + Receiver().send_message(u'%sslide_start_loop' % self.prefix, self.DelaySpinBox.value()) + + def onStopLoop(self): + """ + Trigger the slide controller to stop the loop + """ + Receiver().send_message(u'%sslide_stop_loop' % self.prefix) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index db9629401..443372b7a 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -22,7 +22,7 @@ import os from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, ServiceItem, translate, BaseListWithDnD, buildIcon -from openlp.plugins.images.lib.imageslidecontroller import ImageToolbar +from openlp.plugins.images.lib.imagetoolbar import ImageToolbar # We have to explicitly create separate classes for each plugin # in order for DnD to the Service manager to work correctly. @@ -54,7 +54,7 @@ class ImageMediaItem(MediaManagerItem): # be instanced by the base MediaManagerItem self.ListViewWithDnD_class = ImageListView self.ServiceItemIconName = u':/media/media_image.png' - + self.servicePath = None MediaManagerItem.__init__(self, parent, icon, title) #create and install our own slide controller toolbar imageToolbar = ImageToolbar(self, True) @@ -63,21 +63,37 @@ class ImageMediaItem(MediaManagerItem): def initialise(self): self.ListView.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection) self.ListView.setIconSize(QtCore.QSize(88,50)) + self.servicePath = os.path.join(self.parent.config.get_data_path(), u'.thumbnails') + if os.path.exists(self.servicePath) == False: + os.mkdir(self.servicePath) self.loadList(self.parent.config.load_list(self.ConfigSection)) def onDeleteClick(self): item = self.ListView.currentItem() if item is not None: + try: + os.remove(os.path.join(self.servicePath, unicode(item.text()))) + except: + #if not present do not worry + pass item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] row = self.ListView.row(item) self.ListView.takeItem(row) - self.parent.config.set_list(self.ConfigSection, self.ListData.getFileList()) + self.parent.config.set_list(self.ConfigSection, self.getFileList()) def loadList(self, list): for file in list: (path, filename) = os.path.split(unicode(file)) + thumb = os.path.join(self.servicePath, filename) + if os.path.exists(thumb): + icon = buildIcon(thumb) + else: + icon = buildIcon(unicode(file)) + pixmap = icon.pixmap(QtCore.QSize(88,50)) + ext = os.path.splitext(thumb)[1].lower() + pixmap.save(thumb, ext[1:]) item_name = QtGui.QListWidgetItem(filename) - item_name.setIcon(buildIcon(file)) + item_name.setIcon(icon) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) self.ListView.addItem(item_name) diff --git a/openlp/plugins/remotes/remoteclient-cli.py b/openlp/plugins/remotes/remoteclient-cli.py index 7228d1d0a..1186414c4 100755 --- a/openlp/plugins/remotes/remoteclient-cli.py +++ b/openlp/plugins/remotes/remoteclient-cli.py @@ -51,6 +51,8 @@ def main(): help="Action to be undertaken") parser.add_option("-m", "--message", help="Message to be passed for the action") + parser.add_option("-n", "--slidenext", + help="Trigger the next slide") (options, args) = parser.parse_args() if len(args) > 0: @@ -62,6 +64,11 @@ def main(): elif options.address is None: parser.print_help() parser.error("IP address missing") + elif options.slidenext is not None: + options.event = u'next_slide' + options.message = u'' + text = format_message(options) + sendData(options, text) else: text = format_message(options) sendData(options, text) diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index 40b68cf36..601deec66 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -22,7 +22,7 @@ import sys from PyQt4 import QtNetwork, QtGui, QtCore -from openlp.core.lib import Plugin, Event, EventType +from openlp.core.lib import Plugin, Event, EventType, Receiver from openlp.plugins.remotes.lib import RemoteTab class RemotesPlugin(Plugin): @@ -59,7 +59,8 @@ class RemotesPlugin(Plugin): if event == u'alert': self.event_manager.post_event(Event(u'RemotePlugin', EventType.TriggerAlert , unicode(datagram[pos + 1:]))) - + if event == u'next_slide': + Receiver().send_message(u'live_slide_next')