From 57f04820f064d974583bdbef3a3ae28082d6ed2a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 23 Aug 2009 21:15:05 +0100 Subject: [PATCH 1/6] SlideController clean up part 1 --- openlp.pyw | 2 +- openlp/core/lib/eventreceiver.py | 3 +- openlp/core/ui/slidecontroller.py | 424 +++++++++--------- .../images/lib/imageslidecontroller.py | 63 +-- 4 files changed, 237 insertions(+), 255 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 10bacc564..81c631fdf 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -28,7 +28,7 @@ from openlp.core.lib import Receiver from openlp.core.resources import * from openlp.core.ui import MainWindow, SplashScreen -logging.basicConfig(level=logging.DEBUG, +logging.basicConfig(level=logging.INFO, format=u'%(asctime)s:%(msecs)3d %(name)-15s %(levelname)-8s %(message)s', datefmt=u'%m-%d %H:%M:%S', filename=u'openlp.log', filemode=u'w') diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index 73a908a2d..cc1178d11 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -30,10 +30,11 @@ class EventReceiver(QtCore.QObject): QtCore.QObject.__init__(self) def send_message(self, event, msg=None): + print "send_message ", event , msg self.emit(QtCore.SIGNAL(event), msg) def received(self, msg=None): - print msg + print "received ", msg class Receiver(): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index b869a96c2..50d0e211d 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,7 +64,6 @@ class SlideController(QtGui.QWidget): Set up the Slide Controller. """ self.toolbarList = {} - self.previewList = {} QtGui.QWidget.__init__(self, parent) self.isLive = isLive self.parent = parent @@ -118,118 +117,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,6 +131,192 @@ 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'slide_first'), self.onSlideSelectedFirst) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slide_previous'), self.onSlideSelectedPrevious) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slide_next'), self.onSlideSelectedNext) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slide_last'), self.onSlideSelectedLast) + + # 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 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 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) + + 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 displayServiceManagerItems(self, serviceitem, slideno): + """ + Loads a ServiceItem into the system from ServiceManager + Display the slide number passed + """ + log.debug(u'add Service Manager Item') + self.serviceitem = serviceitem + slide_pixmap = QtGui.QPixmap.fromImage(self.serviceitem.frames[0][u'image']) + slide_width = 300 + slide_height = slide_width * slide_pixmap.height() / slide_pixmap.width() + self.PreviewListWidget.clear() + self.PreviewListWidget.setRowCount(0) + self.PreviewListWidget.setColumnWidth(0, slide_width) + for framenumber, frame in enumerate(self.serviceitem.frames): + self.PreviewListWidget.setRowCount(self.PreviewListWidget.rowCount() + 1) + pixmap = QtGui.QPixmap.fromImage(frame[u'image']) + item = QtGui.QTableWidgetItem() + label = QtGui.QLabel() + label.setMargin(8) + label.setScaledContents(True) + label.setPixmap(pixmap) + self.PreviewListWidget.setCellWidget(framenumber, 0, label) + self.PreviewListWidget.setItem(framenumber, 0, item) + self.PreviewListWidget.setRowHeight(framenumber, slide_height) + slide_width = self.PreviewListWidget.viewport().size().width() + self.PreviewListWidget.setColumnWidth(0, slide_width) + if slideno > self.PreviewListWidget.rowCount(): + self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) + else: + self.PreviewListWidget.selectRow(slideno) + self.onSlideSelected() + self.PreviewListWidget.setFocus() + + #Screen event methods + 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.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() class MasterToolbar(QtCore.QObject): @@ -277,126 +350,33 @@ class MasterToolbar(QtCore.QObject): self.Toolbar.addToolbarButton(u'First Slide', u':/slides/slide_first.png', translate(u'SlideController', u'Move to first'), - self.onSlideSelectedFirst) + self.onSlideFirst) self.Toolbar.addToolbarButton(u'Previous Slide', u':/slides/slide_previous.png', translate(u'SlideController', u'Move to previous'), - self.onSlideSelectedPrevious) + self.onSlidePrevious) self.Toolbar.addToolbarButton(u'Next Slide', u':/slides/slide_next.png', translate(u'SlideController', u'Move to next'), - self.onSlideSelectedNext) + self.onSlideNext) if self.isLive: self.Toolbar.addToolbarButton(u'Last Slide', u':/slides/slide_last.png', translate(u'SlideController', u'Move to last'), - self.onSlideSelectedLast) + self.onSlideLast) self.Toolbar.addSeparator() self.Toolbar.addToolbarButton(u'Close Screen', u':/slides/slide_close.png', translate(u'SlideController', u'Close Screen'), - self.onBlankScreen) + self.onSlideBlank) - 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): - """ - Loads a ServiceItem into the system from ServiceManager - Display the slide number passed - """ - log.debug(u'add Service Manager Item') - self.serviceitem = serviceitem - slide_pixmap = QtGui.QPixmap.fromImage(self.serviceitem.frames[0][u'image']) - slide_width = 300 - slide_height = slide_width * slide_pixmap.height() / slide_pixmap.width() - self.PreviewListWidget.clear() - self.PreviewListWidget.setRowCount(0) - self.PreviewListWidget.setColumnWidth(0, slide_width) - for framenumber, frame in enumerate(self.serviceitem.frames): - self.PreviewListWidget.setRowCount(self.PreviewListWidget.rowCount() + 1) - pixmap = QtGui.QPixmap.fromImage(frame[u'image']) - item = QtGui.QTableWidgetItem() - label = QtGui.QLabel() - label.setMargin(8) - label.setScaledContents(True) - label.setPixmap(pixmap) - self.PreviewListWidget.setCellWidget(framenumber, 0, label) - self.PreviewListWidget.setItem(framenumber, 0, item) - self.PreviewListWidget.setRowHeight(framenumber, slide_height) - slide_width = self.PreviewListWidget.viewport().size().width() - self.PreviewListWidget.setColumnWidth(0, slide_width) - if slideno > self.PreviewListWidget.rowCount(): - self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount()) - else: - self.PreviewListWidget.selectRow(slideno) - self.onSlideSelected() - self.serviceLoaded() - self.PreviewListWidget.setFocus() + def onSlideFirst(self): + Receiver().send_message(u'slide_first') + def onSlidePrevious(self): + Receiver().send_message(u'slide_previous') + def onSlideNext(self): + Receiver().send_message(u'slide_next') + def onSlideLast(self): + Receiver().send_message(u'slide_last') + def onSlideBlank(self): + Receiver().send_message(u'slide_blank') diff --git a/openlp/plugins/images/lib/imageslidecontroller.py b/openlp/plugins/images/lib/imageslidecontroller.py index f065b78d2..bc179c652 100644 --- a/openlp/plugins/images/lib/imageslidecontroller.py +++ b/openlp/plugins/images/lib/imageslidecontroller.py @@ -43,37 +43,38 @@ class ImageToolbar(MasterToolbar): 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) + pass +# 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) From 7ec0a53d77e66c0908eecf8ea9ad9e6713813dfe Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 24 Aug 2009 05:30:04 +0100 Subject: [PATCH 2/6] SlideController clean up part 2 --- openlp.pyw | 4 +- openlp/core/lib/eventreceiver.py | 10 ++-- openlp/core/ui/maindisplay.py | 4 +- openlp/core/ui/slidecontroller.py | 59 +++++++++++++--------- openlp/plugins/bibles/lib/bibleCSVimpl.py | 4 +- openlp/plugins/bibles/lib/bibleOSISimpl.py | 4 +- openlp/plugins/bibles/lib/mediaitem.py | 2 +- 7 files changed, 51 insertions(+), 36 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 81c631fdf..4eda4d1e2 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -28,7 +28,7 @@ from openlp.core.lib import Receiver from openlp.core.resources import * from openlp.core.ui import MainWindow, SplashScreen -logging.basicConfig(level=logging.INFO, +logging.basicConfig(level=logging.DEBUG, format=u'%(asctime)s:%(msecs)3d %(name)-15s %(levelname)-8s %(message)s', datefmt=u'%m-%d %H:%M:%S', filename=u'openlp.log', filemode=u'w') @@ -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 cc1178d11..eb78aa445 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -33,8 +33,8 @@ class EventReceiver(QtCore.QObject): print "send_message ", event , msg self.emit(QtCore.SIGNAL(event), msg) - def received(self, msg=None): - print "received ", msg +# def received(self, msg=None): +# print "received ", msg class Receiver(): @@ -56,9 +56,9 @@ class Receiver(): def send_message(event, msg=None): Receiver.eventreceiver.send_message(event, msg) - @staticmethod - def receive(): - Receiver.eventreceiver.receive() +# @staticmethod +# def receive(): +# Receiver.eventreceiver.receive() @staticmethod def get_receiver(): 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 50d0e211d..8df86d7a5 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -66,6 +66,9 @@ class SlideController(QtGui.QWidget): self.toolbarList = {} 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) @@ -139,18 +142,13 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'activated(QModelIndex)'), self.onSlideSelected) # Window Event Handlers QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slide_first'), self.onSlideSelectedFirst) + QtCore.SIGNAL(u'%sslide_first'% self.prefix), self.onSlideSelectedFirst) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slide_previous'), self.onSlideSelectedPrevious) + QtCore.SIGNAL(u'%sslide_previous'% self.prefix), self.onSlideSelectedPrevious) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slide_next'), self.onSlideSelectedNext) + QtCore.SIGNAL(u'%sslide_next'% self.prefix), self.onSlideSelectedNext) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slide_last'), self.onSlideSelectedLast) - - # Add Late Arrivals -# self.BaseToolbar.PreviewListWidget = self.PreviewListWidget -# self.BaseToolbar.SlidePreview = self.SlidePreview -# self.BaseToolbar.mainDisplay = self.parent.mainDisplay + QtCore.SIGNAL(u'%sslide_last'% self.prefix), self.onSlideSelectedLast) def registerToolbar(self, handle,controller): """ @@ -175,9 +173,6 @@ class SlideController(QtGui.QWidget): 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 addServiceItem(self, item): @@ -243,12 +238,6 @@ class SlideController(QtGui.QWidget): self.PreviewListWidget.setFocus() #Screen event methods - def onBlankScreen(self): - """ - Blank the screen. - """ - self.mainDisplay.blankDisplay() - def onSlideSelected(self): """ Generate the preview when you click on a slide. @@ -328,11 +317,19 @@ class MasterToolbar(QtCore.QObject): 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): @@ -346,6 +343,11 @@ class MasterToolbar(QtCore.QObject): 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', @@ -364,19 +366,30 @@ class MasterToolbar(QtCore.QObject): 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'slide_first') + Receiver().send_message(u'%sslide_first'% self.prefix) def onSlidePrevious(self): - Receiver().send_message(u'slide_previous') + Receiver().send_message(u'%sslide_previous'% self.prefix) def onSlideNext(self): - Receiver().send_message(u'slide_next') + Receiver().send_message(u'%sslide_next'% self.prefix) def onSlideLast(self): - Receiver().send_message(u'slide_last') + Receiver().send_message(u'%sslide_last' % self.prefix) def onSlideBlank(self): - Receiver().send_message(u'slide_blank') + 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) From 41782ae8a76e35a83403a00cbfc3059ef17f0f41 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 24 Aug 2009 06:10:04 +0100 Subject: [PATCH 3/6] SlideController clean up part 3 --- openlp/core/lib/eventreceiver.py | 9 --- openlp/core/ui/slidecontroller.py | 21 +++++ .../images/lib/imageslidecontroller.py | 76 ++++--------------- openlp/plugins/remotes/remoteclient-cli.py | 7 ++ openlp/plugins/remotes/remoteplugin.py | 5 +- 5 files changed, 47 insertions(+), 71 deletions(-) diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index eb78aa445..ef8e0d97f 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -30,13 +30,8 @@ class EventReceiver(QtCore.QObject): QtCore.QObject.__init__(self) def send_message(self, event, msg=None): - print "send_message ", event , msg self.emit(QtCore.SIGNAL(event), msg) -# def received(self, msg=None): -# print "received ", msg - - class Receiver(): """ Class to allow events to be passed from different parts of the system. @@ -56,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/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 8df86d7a5..2ca39f30c 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -149,6 +149,11 @@ class SlideController(QtGui.QWidget): 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) + def registerToolbar(self, handle,controller): """ @@ -307,6 +312,22 @@ class SlideController(QtGui.QWidget): 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): """ diff --git a/openlp/plugins/images/lib/imageslidecontroller.py b/openlp/plugins/images/lib/imageslidecontroller.py index bc179c652..7d37bfe81 100644 --- a/openlp/plugins/images/lib/imageslidecontroller.py +++ b/openlp/plugins/images/lib/imageslidecontroller.py @@ -21,7 +21,7 @@ import logging import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, translate +from openlp.core.lib import OpenLPToolbar, translate, Receiver from openlp.core.ui.slidecontroller import MasterToolbar class ImageToolbar(MasterToolbar): @@ -31,77 +31,33 @@ class ImageToolbar(MasterToolbar): 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: - pass -# 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) + 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.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) + self.DelaySpinBox.setSuffix(translate(u'ImageSlideController', u's')) def onStartLoop(self): """ - Go to the last slide. + Trigger the slide controller to start to loop passing the delay """ - if self.PreviewListWidget.rowCount() > 1: - self.timer_id = self.startTimer(int(self.TimeoutSpinBox.value()) * 1000) + Receiver().send_message(u'%sslide_start_loop' % self.prefix, self.DelaySpinBox.value()) def onStopLoop(self): """ - Go to the last slide. + Trigger the slide controller to stop the loop """ - self.killTimer(self.timer_id) - - def timerEvent(self, event): - if event.timerId() == self.timer_id: - self.onSlideSelectedNext() + Receiver().send_message(u'%sslide_stop_loop' % self.prefix) 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') From 7dea8a37a17ebb93aff99a6753b59b9b20a0f6a5 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 24 Aug 2009 06:13:27 +0100 Subject: [PATCH 4/6] SlideController clean up part 4 --- openlp/plugins/images/lib/__init__.py | 2 +- .../images/lib/{imageslidecontroller.py => imagetoolbar.py} | 0 openlp/plugins/images/lib/mediaitem.py | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename openlp/plugins/images/lib/{imageslidecontroller.py => imagetoolbar.py} (100%) 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/imagetoolbar.py similarity index 100% rename from openlp/plugins/images/lib/imageslidecontroller.py rename to openlp/plugins/images/lib/imagetoolbar.py diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index db9629401..6e6058256 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. From b3f45c21c43fd49eae281a46d46402af26172522 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 24 Aug 2009 18:01:55 +0100 Subject: [PATCH 5/6] Image Plugin Performance improvements part 1 --- openlp/plugins/images/lib/mediaitem.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 6e6058256..0aa6516e0 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -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,6 +63,9 @@ 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): @@ -76,8 +79,19 @@ class ImageMediaItem(MediaManagerItem): 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): + print "found ", thumb + icon = buildIcon(thumb) + else: + print "not found ", thumb + icon = buildIcon(unicode(file)) + pixmap = icon.pixmap(QtCore.QSize(88,50)) + ext = os.path.splitext(thumb)[1].lower() + print ext [1:] + 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) From 8b1425d163649a50587ea683db81066932bc0ddb Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 24 Aug 2009 18:43:15 +0100 Subject: [PATCH 6/6] Image Plugin Performance improvements part 2 --- openlp/plugins/images/lib/mediaitem.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 0aa6516e0..443372b7a 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -71,24 +71,26 @@ class ImageMediaItem(MediaManagerItem): 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): - print "found ", thumb icon = buildIcon(thumb) else: - print "not found ", thumb icon = buildIcon(unicode(file)) pixmap = icon.pixmap(QtCore.QSize(88,50)) ext = os.path.splitext(thumb)[1].lower() - print ext [1:] pixmap.save(thumb, ext[1:]) item_name = QtGui.QListWidgetItem(filename) item_name.setIcon(icon)