Keep item in slidecontroller in sync with presentation, and detect external slide changes.

This commit is contained in:
Jonathan Corwin 2009-10-24 20:22:00 +01:00
parent a94f5c9e0d
commit e0f9f3f09e
4 changed files with 48 additions and 12 deletions

View File

@ -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')

View File

@ -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.

View File

@ -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():

View File

@ -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)