From e0f9f3f09ed7a0565913c6a19551fa561ca8ce6f Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 24 Oct 2009 20:22:00 +0100 Subject: [PATCH] Keep item in slidecontroller in sync with presentation, and detect external slide changes. --- openlp/core/lib/eventreceiver.py | 3 +++ openlp/core/ui/slidecontroller.py | 27 ++++++++++++++----- .../presentations/lib/messagelistener.py | 12 +++++---- .../lib/presentationcontroller.py | 18 +++++++++++++ 4 files changed, 48 insertions(+), 12 deletions(-) diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index 923e228de..e61e0d655 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -86,6 +86,9 @@ class EventReceiver(QtCore.QObject): ``config_updated`` Informs components the config has changed + + ``slidecontroller_change`` + Informs the slidecontroller that a slide change has occurred """ global log log = logging.getLogger(u'EventReceiver') diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 0c3d737ad..c9c411583 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -224,6 +224,8 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'slidecontroller_previous'), self.onSlideSelectedPrevious) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'slidecontroller_last'), self.onSlideSelectedLast) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_change'), self.onSlideChange) def receiveSpinDelay(self, value): self.DelaySpinBox.setValue(int(value)) @@ -389,14 +391,25 @@ class SlideController(QtGui.QWidget): log.info(u'Slide Rendering took %4s' % (time.time() - before)) if self.isLive: self.parent.mainDisplay.frameView(frame) - - def grabMainDisplay(self): - winid = QtGui.QApplication.desktop().winId() - rm = self.parent.RenderManager - rect = rm.screen_list[rm.current_display][u'size'] - winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), rect.y(), rect.width(), rect.height()) - self.SlidePreview.setPixmap(winimg) + def onSlideChange(self, row): + """ + The slide has been changed. Update the slidecontroller accordingly + """ + self.PreviewListWidget.selectRow(row) + QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) + + def grabMainDisplay(self): + rm = self.parent.RenderManager + if not rm.screen_list[rm.current_display][u'primary']: + winid = QtGui.QApplication.desktop().winId() + rect = rm.screen_list[rm.current_display][u'size'] + winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), rect.y(), rect.width(), rect.height()) + self.SlidePreview.setPixmap(winimg) + else: + label = self.PreviewListWidget.cellWidget(self.PreviewListWidget.currentRow(), 0) + self.SlidePreview.setPixmap(label.pixmap()) + def onSlideSelectedNext(self): """ Go to the next slide. diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 6a1c611f5..ca30b5564 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -68,6 +68,7 @@ class MessageListener(object): self.controller.load_presentation(file) self.controller.start_presentation() self.controller.slidenumber = 0 + self.controller.timer.start() def activate(self): if self.controller.is_active(): @@ -82,7 +83,7 @@ class MessageListener(object): self.activate() if message is not None: self.controller.goto_slide(message[0]+1) - self.controller.slidenumber = self.controller.get_slide_number() + self.controller.poll_slidenumber() def first(self, message): """ @@ -90,7 +91,7 @@ class MessageListener(object): """ self.activate() self.controller.start_presentation() - self.controller.slidenumber = self.controller.get_slide_number() + self.controller.poll_slidenumber() def last(self, message): """ @@ -98,7 +99,7 @@ class MessageListener(object): """ self.activate() self.controller.goto_slide(self.controller.get_slide_count()) - self.controller.slidenumber = self.controller.get_slide_number() + self.controller.poll_slidenumber() def next(self, message): """ @@ -106,7 +107,7 @@ class MessageListener(object): """ self.activate() self.controller.next_step() - self.controller.slidenumber = self.controller.get_slide_number() + self.controller.poll_slidenumber() def previous(self, message): """ @@ -114,7 +115,7 @@ class MessageListener(object): """ self.activate() self.controller.previous_step() - self.controller.slidenumber = self.controller.get_slide_number() + self.controller.poll_slidenumber() def shutdown(self, message): """ @@ -122,6 +123,7 @@ class MessageListener(object): """ self.controller.close_presentation() self.controller.slidenumber = 0 + self.controller.timer.shutdown() def blank(self): if not self.controller.is_loaded(): diff --git a/openlp/plugins/presentations/lib/presentationcontroller.py b/openlp/plugins/presentations/lib/presentationcontroller.py index 53c6e84d0..bb26da442 100644 --- a/openlp/plugins/presentations/lib/presentationcontroller.py +++ b/openlp/plugins/presentations/lib/presentationcontroller.py @@ -24,6 +24,8 @@ import shutil from PyQt4 import QtCore +from openlp.core.lib import Receiver + class PresentationController(object): """ Base class for presentation controllers to inherit from @@ -143,6 +145,9 @@ class PresentationController(object): self.thumbnailprefix = u'slide' if not os.path.isdir(self.thumbnailroot): os.makedirs(self.thumbnailroot) + self.timer = QtCore.QTimer() + self.timer.setInterval(500) + QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.poll_slidenumber) def check_available(self): """ @@ -291,3 +296,16 @@ class PresentationController(object): The slide an image is required for, starting at 1 """ return None + + def poll_slidenumber(self): + """ + Check the current slide number + """ + if not self.is_active(): + return + current = self.get_slide_number() + if current == self.slidenumber: + return + self.slidenumber = current + Receiver().send_message(u'slidecontroller_change', self.slidenumber - 1) + \ No newline at end of file