2009-04-28 19:19:20 +00:00
|
|
|
# -*- coding: utf-8 -*-
|
|
|
|
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
|
|
|
|
2009-09-08 19:58:05 +00:00
|
|
|
###############################################################################
|
|
|
|
# OpenLP - Open Source Lyrics Projection #
|
|
|
|
# --------------------------------------------------------------------------- #
|
2009-12-31 12:52:01 +00:00
|
|
|
# Copyright (c) 2008-2010 Raoul Snyman #
|
|
|
|
# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
|
2010-03-21 23:58:01 +00:00
|
|
|
# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin #
|
|
|
|
# Thompson, Jon Tibble, Carsten Tinggaard #
|
2009-09-08 19:58:05 +00:00
|
|
|
# --------------------------------------------------------------------------- #
|
|
|
|
# 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 #
|
|
|
|
###############################################################################
|
2009-04-28 19:19:20 +00:00
|
|
|
|
2009-08-10 20:10:20 +00:00
|
|
|
import logging
|
2009-11-01 19:22:51 +00:00
|
|
|
import os
|
2009-10-19 17:51:21 +00:00
|
|
|
|
2009-07-19 07:40:31 +00:00
|
|
|
from PyQt4 import QtCore, QtGui
|
2009-10-19 17:51:21 +00:00
|
|
|
from PyQt4.phonon import Phonon
|
2009-04-28 19:19:20 +00:00
|
|
|
|
2010-01-26 19:16:47 +00:00
|
|
|
from openlp.core.lib import Receiver, resize_image
|
2010-03-28 15:56:49 +00:00
|
|
|
from openlp.core.ui import HideMode
|
2009-04-28 19:19:20 +00:00
|
|
|
|
2010-02-27 15:31:23 +00:00
|
|
|
log = logging.getLogger(__name__)
|
|
|
|
|
2010-04-13 15:53:00 +00:00
|
|
|
|
|
|
|
class DisplayManager(QtGui.QWidget):
|
|
|
|
def __init__(self, screens):
|
|
|
|
QtGui.QWidget.__init__(self)
|
|
|
|
self.screens = screens
|
|
|
|
self.videoDisplay = VideoDisplay(self, screens)
|
|
|
|
self.mainDisplay = MainDisplay(self, screens)
|
|
|
|
|
|
|
|
|
2009-11-05 06:06:43 +00:00
|
|
|
class DisplayWidget(QtGui.QWidget):
|
2009-10-17 16:11:41 +00:00
|
|
|
"""
|
|
|
|
Customised version of QTableWidget which can respond to keyboard
|
|
|
|
events.
|
|
|
|
"""
|
2009-11-01 21:02:31 +00:00
|
|
|
log.info(u'MainDisplay loaded')
|
|
|
|
|
2009-10-17 16:11:41 +00:00
|
|
|
def __init__(self, parent=None, name=None):
|
2010-04-13 15:53:00 +00:00
|
|
|
QtGui.QWidget.__init__(self, None, QtCore.Qt.WindowStaysOnTopHint \
|
|
|
|
| QtCore.Qt.FramelessWindowHint)
|
2009-10-17 16:11:41 +00:00
|
|
|
self.parent = parent
|
2010-02-04 19:25:32 +00:00
|
|
|
self.hotkey_map = {QtCore.Qt.Key_Return: 'servicemanager_next_item',
|
|
|
|
QtCore.Qt.Key_Space: 'live_slidecontroller_next_noloop',
|
|
|
|
QtCore.Qt.Key_Enter: 'live_slidecontroller_next_noloop',
|
|
|
|
QtCore.Qt.Key_0: 'servicemanager_next_item',
|
|
|
|
QtCore.Qt.Key_Backspace: 'live_slidecontroller_previous_noloop'}
|
2009-10-17 16:11:41 +00:00
|
|
|
|
|
|
|
def keyPressEvent(self, event):
|
|
|
|
if type(event) == QtGui.QKeyEvent:
|
|
|
|
#here accept the event and do something
|
|
|
|
if event.key() == QtCore.Qt.Key_Up:
|
2009-11-13 21:24:59 +00:00
|
|
|
Receiver.send_message(u'live_slidecontroller_previous')
|
2009-10-17 16:11:41 +00:00
|
|
|
event.accept()
|
|
|
|
elif event.key() == QtCore.Qt.Key_Down:
|
2009-11-13 21:24:59 +00:00
|
|
|
Receiver.send_message(u'live_slidecontroller_next')
|
2009-10-17 16:11:41 +00:00
|
|
|
event.accept()
|
|
|
|
elif event.key() == QtCore.Qt.Key_PageUp:
|
2009-11-13 21:24:59 +00:00
|
|
|
Receiver.send_message(u'live_slidecontroller_first')
|
2009-10-17 16:11:41 +00:00
|
|
|
event.accept()
|
|
|
|
elif event.key() == QtCore.Qt.Key_PageDown:
|
2009-11-13 21:24:59 +00:00
|
|
|
Receiver.send_message(u'live_slidecontroller_last')
|
2009-10-17 16:11:41 +00:00
|
|
|
event.accept()
|
2010-02-04 19:25:32 +00:00
|
|
|
elif event.key() in self.hotkey_map:
|
2010-02-26 23:47:59 +00:00
|
|
|
Receiver.send_message(self.hotkey_map[event.key()])
|
2010-02-04 19:25:32 +00:00
|
|
|
event.accept()
|
2009-10-17 16:11:41 +00:00
|
|
|
elif event.key() == QtCore.Qt.Key_Escape:
|
|
|
|
self.resetDisplay()
|
|
|
|
event.accept()
|
|
|
|
event.ignore()
|
|
|
|
else:
|
|
|
|
event.ignore()
|
|
|
|
|
2009-11-05 06:06:43 +00:00
|
|
|
class MainDisplay(DisplayWidget):
|
2009-08-06 13:17:36 +00:00
|
|
|
"""
|
|
|
|
This is the form that is used to display things on the projector.
|
|
|
|
"""
|
2009-08-10 20:10:20 +00:00
|
|
|
log.info(u'MainDisplay Loaded')
|
2009-04-28 19:19:20 +00:00
|
|
|
|
2010-04-13 15:53:00 +00:00
|
|
|
def __init__(self, parent, screens):
|
2009-08-06 13:17:36 +00:00
|
|
|
"""
|
|
|
|
The constructor for the display form.
|
|
|
|
|
|
|
|
``parent``
|
|
|
|
The parent widget.
|
|
|
|
|
|
|
|
``screens``
|
|
|
|
The list of screens.
|
|
|
|
"""
|
2009-08-10 20:10:20 +00:00
|
|
|
log.debug(u'Initilisation started')
|
2010-04-13 15:53:00 +00:00
|
|
|
DisplayWidget.__init__(self, parent)
|
2009-08-10 20:10:20 +00:00
|
|
|
self.parent = parent
|
2009-05-01 11:50:09 +00:00
|
|
|
self.setWindowTitle(u'OpenLP Display')
|
2010-04-07 19:09:13 +00:00
|
|
|
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
|
2009-05-01 11:50:09 +00:00
|
|
|
self.screens = screens
|
2010-01-25 20:34:47 +00:00
|
|
|
self.display_image = QtGui.QLabel(self)
|
|
|
|
self.display_image.setScaledContents(True)
|
|
|
|
self.display_text = QtGui.QLabel(self)
|
|
|
|
self.display_text.setScaledContents(True)
|
2010-01-28 17:36:13 +00:00
|
|
|
self.display_alert = QtGui.QLabel(self)
|
|
|
|
self.display_alert.setScaledContents(True)
|
2009-11-03 00:04:41 +00:00
|
|
|
self.primary = True
|
2009-05-04 13:48:12 +00:00
|
|
|
self.displayBlank = False
|
2009-08-06 13:17:36 +00:00
|
|
|
self.blankFrame = None
|
2009-10-17 16:11:41 +00:00
|
|
|
self.frame = None
|
2009-11-01 19:22:51 +00:00
|
|
|
self.firstTime = True
|
2009-11-28 09:12:22 +00:00
|
|
|
self.hasTransition = False
|
2010-01-09 09:34:06 +00:00
|
|
|
self.mediaBackground = False
|
2009-10-17 16:11:41 +00:00
|
|
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
2009-11-05 23:21:23 +00:00
|
|
|
QtCore.SIGNAL(u'live_slide_hide'), self.hideDisplay)
|
2009-10-17 16:11:41 +00:00
|
|
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
2009-11-05 23:21:23 +00:00
|
|
|
QtCore.SIGNAL(u'live_slide_show'), self.showDisplay)
|
2009-11-01 19:22:51 +00:00
|
|
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
|
|
|
QtCore.SIGNAL(u'media_start'), self.onMediaQueue)
|
|
|
|
|
2010-04-02 18:12:54 +00:00
|
|
|
def setup(self):
|
2009-05-01 11:50:09 +00:00
|
|
|
"""
|
|
|
|
Sets up the screen on a particular screen.
|
|
|
|
"""
|
2010-04-02 18:12:54 +00:00
|
|
|
log.debug(u'Setup %s for %s ' %(self.screens,
|
|
|
|
self.screens.monitor_number))
|
2009-11-04 20:06:46 +00:00
|
|
|
self.setVisible(False)
|
2010-01-16 07:22:50 +00:00
|
|
|
self.screen = self.screens.current
|
2010-01-10 19:03:52 +00:00
|
|
|
#Sort out screen locations and sizes
|
|
|
|
self.setGeometry(self.screen[u'size'])
|
2010-02-13 07:37:03 +00:00
|
|
|
self.display_alert.setGeometry(self.screen[u'size'])
|
2010-01-25 20:34:47 +00:00
|
|
|
self.display_image.resize(self.screen[u'size'].width(),
|
|
|
|
self.screen[u'size'].height())
|
|
|
|
self.display_text.resize(self.screen[u'size'].width(),
|
2010-01-10 19:03:52 +00:00
|
|
|
self.screen[u'size'].height())
|
2009-07-21 18:10:14 +00:00
|
|
|
#Build a custom splash screen
|
2009-11-04 20:06:46 +00:00
|
|
|
self.InitialFrame = QtGui.QImage(
|
2010-01-09 09:34:06 +00:00
|
|
|
self.screen[u'size'].width(),
|
|
|
|
self.screen[u'size'].height(),
|
2009-11-04 20:06:46 +00:00
|
|
|
QtGui.QImage.Format_ARGB32_Premultiplied)
|
|
|
|
splash_image = QtGui.QImage(u':/graphics/openlp-splash-screen.png')
|
|
|
|
painter_image = QtGui.QPainter()
|
|
|
|
painter_image.begin(self.InitialFrame)
|
|
|
|
painter_image.fillRect(self.InitialFrame.rect(), QtCore.Qt.white)
|
|
|
|
painter_image.drawImage(
|
2010-01-09 09:34:06 +00:00
|
|
|
(self.screen[u'size'].width() - splash_image.width()) / 2,
|
|
|
|
(self.screen[u'size'].height() - splash_image.height()) / 2,
|
2009-11-04 20:06:46 +00:00
|
|
|
splash_image)
|
2010-01-26 19:16:47 +00:00
|
|
|
self.display_image.setPixmap(QtGui.QPixmap.fromImage(self.InitialFrame))
|
2010-01-28 17:36:13 +00:00
|
|
|
self.repaint()
|
2009-07-21 18:10:14 +00:00
|
|
|
#Build a Black screen
|
2009-06-05 18:53:50 +00:00
|
|
|
painter = QtGui.QPainter()
|
2009-08-09 12:05:54 +00:00
|
|
|
self.blankFrame = QtGui.QImage(
|
2010-01-09 09:34:06 +00:00
|
|
|
self.screen[u'size'].width(),
|
|
|
|
self.screen[u'size'].height(),
|
2009-08-09 12:05:54 +00:00
|
|
|
QtGui.QImage.Format_ARGB32_Premultiplied)
|
2009-05-04 13:48:12 +00:00
|
|
|
painter.begin(self.blankFrame)
|
2010-03-14 17:05:50 +00:00
|
|
|
painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black)
|
2010-01-26 19:16:47 +00:00
|
|
|
#build a blank transparent image
|
2010-01-09 09:34:06 +00:00
|
|
|
self.transparent = QtGui.QPixmap(self.screen[u'size'].width(),
|
|
|
|
self.screen[u'size'].height())
|
|
|
|
self.transparent.fill(QtCore.Qt.transparent)
|
2010-01-28 17:36:13 +00:00
|
|
|
self.display_alert.setPixmap(self.transparent)
|
2010-04-08 07:37:01 +00:00
|
|
|
self.display_text.setPixmap(self.transparent)
|
2010-01-26 19:16:47 +00:00
|
|
|
self.frameView(self.transparent)
|
2009-11-05 06:06:43 +00:00
|
|
|
# To display or not to display?
|
2010-01-09 09:34:06 +00:00
|
|
|
if not self.screen[u'primary']:
|
2009-11-05 06:06:43 +00:00
|
|
|
self.showFullScreen()
|
|
|
|
self.primary = False
|
|
|
|
else:
|
|
|
|
self.setVisible(False)
|
|
|
|
self.primary = True
|
2009-05-04 13:48:12 +00:00
|
|
|
|
2009-10-17 16:11:41 +00:00
|
|
|
def resetDisplay(self):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'resetDisplay')
|
2010-03-02 19:44:55 +00:00
|
|
|
Receiver.send_message(u'stop_display_loop')
|
2009-10-17 16:11:41 +00:00
|
|
|
if self.primary:
|
|
|
|
self.setVisible(False)
|
2010-01-28 11:46:25 +00:00
|
|
|
else:
|
|
|
|
self.showFullScreen()
|
2009-10-17 16:11:41 +00:00
|
|
|
|
|
|
|
def hideDisplay(self):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'hideDisplay')
|
2010-04-08 16:00:04 +00:00
|
|
|
self.display_image.setPixmap(self.transparent)
|
|
|
|
self.display_alert.setPixmap(self.transparent)
|
|
|
|
self.display_text.setPixmap(self.transparent)
|
2009-10-17 16:11:41 +00:00
|
|
|
|
|
|
|
def showDisplay(self):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'showDisplay')
|
2009-10-17 16:11:41 +00:00
|
|
|
if not self.primary:
|
|
|
|
self.setVisible(True)
|
2010-01-28 11:46:25 +00:00
|
|
|
self.showFullScreen()
|
2010-02-17 20:17:33 +00:00
|
|
|
Receiver.send_message(u'flush_alert')
|
2009-10-17 16:11:41 +00:00
|
|
|
|
2010-01-26 19:16:47 +00:00
|
|
|
def addImageWithText(self, frame):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'addImageWithText')
|
2010-01-26 19:16:47 +00:00
|
|
|
frame = resize_image(frame,
|
|
|
|
self.screen[u'size'].width(),
|
|
|
|
self.screen[u'size'].height() )
|
|
|
|
self.display_image.setPixmap(QtGui.QPixmap.fromImage(frame))
|
2009-10-17 16:11:41 +00:00
|
|
|
|
2010-02-13 07:30:00 +00:00
|
|
|
def setAlertSize(self, top, height):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'setAlertSize')
|
2010-02-13 07:30:00 +00:00
|
|
|
self.display_alert.setGeometry(
|
|
|
|
QtCore.QRect(0, top,
|
|
|
|
self.screen[u'size'].width(), height))
|
|
|
|
|
2010-02-11 18:39:28 +00:00
|
|
|
def addAlertImage(self, frame, blank=False):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'addAlertImage')
|
2010-02-11 18:39:28 +00:00
|
|
|
if blank:
|
|
|
|
self.display_alert.setPixmap(self.transparent)
|
|
|
|
else:
|
|
|
|
self.display_alert.setPixmap(frame)
|
|
|
|
|
2009-11-28 06:49:53 +00:00
|
|
|
def frameView(self, frame, transition=False):
|
2009-07-19 07:40:31 +00:00
|
|
|
"""
|
|
|
|
Called from a slide controller to display a frame
|
|
|
|
if the alert is in progress the alert is added on top
|
|
|
|
``frame``
|
|
|
|
Image frame to be rendered
|
|
|
|
"""
|
2010-03-19 23:02:23 +00:00
|
|
|
log.debug(u'frameView %d' % (self.displayBlank))
|
2010-01-10 19:03:52 +00:00
|
|
|
if not self.displayBlank:
|
2009-11-28 06:49:53 +00:00
|
|
|
if transition:
|
2010-01-10 19:03:52 +00:00
|
|
|
if self.frame is not None:
|
2010-01-25 20:34:47 +00:00
|
|
|
self.display_text.setPixmap(QtGui.QPixmap.fromImage(self.frame))
|
2010-01-10 19:03:52 +00:00
|
|
|
self.repaint()
|
|
|
|
self.frame = None
|
|
|
|
if frame[u'trans'] is not None:
|
2010-01-25 20:34:47 +00:00
|
|
|
self.display_text.setPixmap(QtGui.QPixmap.fromImage(frame[u'trans']))
|
2010-01-10 19:03:52 +00:00
|
|
|
self.repaint()
|
|
|
|
self.frame = frame[u'trans']
|
2010-01-25 20:34:47 +00:00
|
|
|
self.display_text.setPixmap(QtGui.QPixmap.fromImage(frame[u'main']))
|
2010-01-24 13:58:39 +00:00
|
|
|
self.display_frame = frame[u'main']
|
2009-11-28 09:12:22 +00:00
|
|
|
self.repaint()
|
2009-11-28 06:49:53 +00:00
|
|
|
else:
|
2010-01-26 19:16:47 +00:00
|
|
|
if isinstance(frame, QtGui.QPixmap):
|
|
|
|
self.display_text.setPixmap(frame)
|
|
|
|
else:
|
|
|
|
self.display_text.setPixmap(QtGui.QPixmap.fromImage(frame))
|
2010-01-24 13:58:39 +00:00
|
|
|
self.display_frame = frame
|
2010-04-03 07:10:31 +00:00
|
|
|
if not self.isVisible() and self.screens.display:
|
2009-10-17 16:11:41 +00:00
|
|
|
self.setVisible(True)
|
|
|
|
self.showFullScreen()
|
2010-03-19 23:02:23 +00:00
|
|
|
else:
|
|
|
|
self.waitingFrame = frame
|
|
|
|
self.waitingFrameTrans = transition
|
2009-11-11 19:10:38 +00:00
|
|
|
|
2010-03-28 15:56:49 +00:00
|
|
|
def blankDisplay(self, blankType=HideMode.Blank, blanked=True):
|
2010-03-19 23:02:23 +00:00
|
|
|
log.debug(u'Blank main Display %d' % blanked)
|
2009-11-13 21:24:59 +00:00
|
|
|
if blanked:
|
2009-05-04 13:48:12 +00:00
|
|
|
self.displayBlank = True
|
2010-03-28 15:56:49 +00:00
|
|
|
if blankType == HideMode.Blank:
|
2010-03-25 21:53:52 +00:00
|
|
|
self.display_text.setPixmap(QtGui.QPixmap.fromImage(self.blankFrame))
|
2010-03-28 15:56:49 +00:00
|
|
|
elif blankType == HideMode.Theme:
|
2010-03-25 21:53:52 +00:00
|
|
|
theme = self.parent.RenderManager.renderer.bg_frame
|
|
|
|
if not theme:
|
|
|
|
theme = self.blankFrame
|
|
|
|
self.display_text.setPixmap(QtGui.QPixmap.fromImage(theme))
|
2010-03-19 23:02:23 +00:00
|
|
|
self.waitingFrame = None
|
|
|
|
self.waitingFrameTrans = False
|
2009-05-04 13:48:12 +00:00
|
|
|
else:
|
|
|
|
self.displayBlank = False
|
2010-03-19 23:02:23 +00:00
|
|
|
if self.waitingFrame:
|
|
|
|
self.frameView(self.waitingFrame, self.waitingFrameTrans)
|
|
|
|
elif self.display_frame:
|
2010-01-24 13:58:39 +00:00
|
|
|
self.frameView(self.display_frame)
|
2009-06-01 17:50:37 +00:00
|
|
|
|
2009-11-01 19:22:51 +00:00
|
|
|
def onMediaQueue(self, message):
|
2009-11-01 21:02:31 +00:00
|
|
|
log.debug(u'Queue new media message %s' % message)
|
2010-04-08 16:00:04 +00:00
|
|
|
self.activateWindow()
|
2010-04-12 08:13:27 +00:00
|
|
|
self.hideDisplay()
|
2010-04-08 07:37:01 +00:00
|
|
|
|
2010-04-08 09:15:40 +00:00
|
|
|
class VideoWidget(QtGui.QWidget):
|
|
|
|
"""
|
|
|
|
Customised version of QTableWidget which can respond to keyboard
|
|
|
|
events.
|
|
|
|
"""
|
|
|
|
log.info(u'MainDisplay loaded')
|
|
|
|
|
|
|
|
def __init__(self, parent=None, name=None):
|
2010-04-13 15:53:00 +00:00
|
|
|
QtGui.QWidget.__init__(self, None, QtCore.Qt.WindowStaysOnBottomHint \
|
|
|
|
| QtCore.Qt.FramelessWindowHint)
|
2010-04-08 09:15:40 +00:00
|
|
|
self.parent = parent
|
|
|
|
|
|
|
|
def keyPressEvent(self, event):
|
|
|
|
if type(event) == QtGui.QKeyEvent:
|
|
|
|
#here accept the event and do something
|
2010-04-12 08:13:27 +00:00
|
|
|
if event.key() == QtCore.Qt.Key_Escape:
|
2010-04-08 09:15:40 +00:00
|
|
|
self.resetDisplay()
|
|
|
|
event.accept()
|
|
|
|
event.ignore()
|
|
|
|
else:
|
|
|
|
event.ignore()
|
|
|
|
|
|
|
|
class VideoDisplay(VideoWidget):
|
2010-04-08 07:37:01 +00:00
|
|
|
"""
|
|
|
|
This is the form that is used to display videos on the projector.
|
|
|
|
"""
|
|
|
|
log.info(u'VideoDisplay Loaded')
|
|
|
|
|
|
|
|
def __init__(self, parent, screens):
|
|
|
|
"""
|
|
|
|
The constructor for the display form.
|
|
|
|
|
|
|
|
``parent``
|
|
|
|
The parent widget.
|
|
|
|
|
|
|
|
``screens``
|
|
|
|
The list of screens.
|
|
|
|
"""
|
|
|
|
log.debug(u'VideoDisplay Initilisation started')
|
2010-04-08 09:15:40 +00:00
|
|
|
VideoWidget.__init__(self, parent)
|
2010-04-08 07:37:01 +00:00
|
|
|
self.setWindowTitle(u'OpenLP Video Display')
|
|
|
|
self.parent = parent
|
|
|
|
self.screens = screens
|
2010-04-08 16:00:04 +00:00
|
|
|
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
|
2010-04-08 07:37:01 +00:00
|
|
|
self.mediaObject = Phonon.MediaObject(self)
|
2010-04-13 15:53:00 +00:00
|
|
|
self.video = Phonon.VideoWidget(parent)
|
2010-04-08 07:37:01 +00:00
|
|
|
self.video.setVisible(False)
|
|
|
|
self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self.mediaObject)
|
|
|
|
Phonon.createPath(self.mediaObject, self.video)
|
|
|
|
Phonon.createPath(self.mediaObject, self.audio)
|
|
|
|
self.firstTime = True
|
|
|
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
|
|
|
QtCore.SIGNAL(u'media_start'), self.onMediaQueue)
|
|
|
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
|
|
|
QtCore.SIGNAL(u'media_play'), self.onMediaPlay)
|
|
|
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
|
|
|
QtCore.SIGNAL(u'media_pause'), self.onMediaPause)
|
|
|
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
|
|
|
QtCore.SIGNAL(u'media_stop'), self.onMediaStop)
|
|
|
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
|
|
|
QtCore.SIGNAL(u'update_config'), self.setup)
|
|
|
|
|
|
|
|
def setup(self):
|
|
|
|
"""
|
|
|
|
Sets up the screen on a particular screen.
|
|
|
|
"""
|
|
|
|
log.debug(u'VideoDisplay Setup %s for %s ' %(self.screens,
|
|
|
|
self.screens.monitor_number))
|
|
|
|
self.setVisible(False)
|
|
|
|
self.screen = self.screens.current
|
|
|
|
#Sort out screen locations and sizes
|
|
|
|
self.setGeometry(self.screen[u'size'])
|
|
|
|
self.video.setGeometry(self.screen[u'size'])
|
|
|
|
|
|
|
|
def onMediaQueue(self, message):
|
|
|
|
log.debug(u'VideoDisplay Queue new media message %s' % message)
|
2009-11-01 19:22:51 +00:00
|
|
|
file = os.path.join(message[1], message[2])
|
|
|
|
if self.firstTime:
|
2010-04-08 09:15:40 +00:00
|
|
|
source = self.mediaObject.setCurrentSource(Phonon.MediaSource(file))
|
2009-11-01 19:22:51 +00:00
|
|
|
self.firstTime = False
|
2009-10-19 17:51:21 +00:00
|
|
|
else:
|
2009-11-01 19:22:51 +00:00
|
|
|
self.mediaObject.enqueue(Phonon.MediaSource(file))
|
2009-11-10 20:44:02 +00:00
|
|
|
self.onMediaPlay()
|
2009-10-19 17:51:21 +00:00
|
|
|
|
2009-11-10 20:44:02 +00:00
|
|
|
def onMediaPlay(self):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'VideoDisplay Play the new media, Live ')
|
2009-11-02 01:03:27 +00:00
|
|
|
self.firstTime = True
|
2010-04-08 07:37:01 +00:00
|
|
|
self.setWindowState(QtCore.Qt.WindowMinimized)
|
2009-11-10 20:44:02 +00:00
|
|
|
self.video.setFullScreen(True)
|
2009-10-19 17:51:21 +00:00
|
|
|
self.mediaObject.play()
|
2010-01-28 17:36:13 +00:00
|
|
|
self.setVisible(True)
|
2010-04-13 15:53:00 +00:00
|
|
|
self.video.lower()
|
2009-10-19 17:51:21 +00:00
|
|
|
|
2010-01-25 20:34:47 +00:00
|
|
|
def onMediaPause(self):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'VideoDisplay Media paused by user')
|
2009-11-01 19:41:13 +00:00
|
|
|
self.mediaObject.pause()
|
2009-10-19 17:51:21 +00:00
|
|
|
|
2009-11-02 01:03:27 +00:00
|
|
|
def onMediaStop(self):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'VideoDisplay Media stopped by user')
|
2009-11-02 01:03:27 +00:00
|
|
|
self.mediaObject.stop()
|
2010-01-24 13:58:39 +00:00
|
|
|
self.onMediaFinish()
|
2009-11-02 01:03:27 +00:00
|
|
|
|
2009-10-19 17:51:21 +00:00
|
|
|
def onMediaFinish(self):
|
2010-04-08 07:37:01 +00:00
|
|
|
log.debug(u'VideoDisplay Reached end of media playlist')
|
2009-10-19 17:51:21 +00:00
|
|
|
self.mediaObject.stop()
|
2009-11-01 19:41:13 +00:00
|
|
|
self.mediaObject.clearQueue()
|
2009-11-03 00:04:41 +00:00
|
|
|
self.video.setVisible(False)
|
2010-04-08 07:37:01 +00:00
|
|
|
self.setVisible(False)
|