From 02c0fe9e896838600c9352b0a4844bb829a7b036 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 11 Jul 2010 08:45:49 +0100 Subject: [PATCH] Renderer replacement started --- openlp/core/lib/__init__.py | 44 +- openlp/core/lib/renderer.py | 18 +- openlp/core/ui/__init__.py | 2 - openlp/core/ui/maindisplay.py | 1028 +++++++++++++++++++-------------- 4 files changed, 637 insertions(+), 455 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index f3c9c4494..088ac6e7a 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -165,12 +165,51 @@ def context_menu_separator(base): action.setSeparator(True) return action -def resize_image(image, width, height): +def resize_image_for_web(image, width, height, background=QtCore.Qt.black): + """ + Resize an image to fit on the current screen for the web and retuns + it as a byte stream. + + ``image`` + The image to resize. + ``width`` + The new image width. + ``height`` + The new image height. + ``background `` + The background colour defaults to black. + """ + new_image = resize_image(image, width, height, background) + return image_to_byte(image) + +def image_to_byte(image): + """ + Resize an image to fit on the current screen for the web and retuns + it as a byte stream. + + ``image`` + The image to converted. + """ + byte_array = QtCore.QByteArray() + buffer = QtCore.QBuffer(byte_array) #// use buffer to store pixmap into byteArray + buffer.open(QtCore.QIODevice.WriteOnly) + pixmap = QtGui.QPixmap(image) + pixmap.save(buffer, "PNG") + #convert to base64 encoding so does not get missed! + return byte_array + +def resize_image(image, width, height, background=QtCore.Qt.black): """ Resize an image to fit on the current screen. ``image`` The image to resize. + ``width`` + The new image width. + ``height`` + The new image height. + ``background `` + The background colour defaults to black. """ preview = QtGui.QImage(image) if not preview.isNull(): @@ -186,7 +225,7 @@ def resize_image(image, width, height): # and move it to the centre of the preview space new_image = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32_Premultiplied) - new_image.fill(QtCore.Qt.black) + new_image.fill(background) painter = QtGui.QPainter(new_image) painter.drawImage((width - realw) / 2, (height - realh) / 2, preview) return new_image @@ -215,6 +254,7 @@ from settingstab import SettingsTab from serviceitem import ServiceItem from serviceitem import ServiceItemType from serviceitem import ItemCapabilities +from htmlbuilder import build_html from toolbar import OpenLPToolbar from dockwidget import OpenLPDockWidget from theme import ThemeLevel, ThemeXML diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index ece02031a..ab4ce3d74 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -167,21 +167,25 @@ class Renderer(object): shell = "

%s

" temp_text = u'' old_html_text = u'' + page = [] for line in text: - #do we need a
here? - temp_text = temp_text + line + # mark line ends + temp_text = temp_text + line + u'
' html_text = shell % temp_text doc.setHtml(html_text) + #Text too long so gone to next mage if layout.pageCount() != 1: - formatted.append(old_html_text) + page.append(shell % old_html_text) + formatted.append(page) temp_text = line old_html_text = temp_text - formatted.append(old_html_text) - for f in formatted: - print "f", f + page.append(shell % old_html_text) + formatted.append(page) + print "ft", formatted print "st", split_text log.debug(u'format_slide - End') - return split_text + #return split_text + return formatted def pre_render_text(self, text): metrics = QtGui.QFontMetrics(self.main_font) diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index e93108da7..c4955daff 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -40,8 +40,6 @@ from slidecontroller import HideMode from servicenoteform import ServiceNoteForm from serviceitemeditform import ServiceItemEditForm from screen import ScreenList -from maindisplay import MainDisplay -from maindisplay import VideoDisplay from maindisplay import DisplayManager from amendthemeform import AmendThemeForm from slidecontroller import SlideController diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 575038f77..9284b2d49 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -30,7 +30,7 @@ import time from PyQt4 import QtCore, QtGui, QtWebKit from PyQt4.phonon import Phonon -from openlp.core.lib import Receiver, resize_image +from openlp.core.lib import Receiver, resize_image, image_to_byte, build_html from openlp.core.ui import HideMode log = logging.getLogger(__name__) @@ -68,9 +68,9 @@ class DisplayManager(QtGui.QWidget): def __init__(self, screens): QtGui.QWidget.__init__(self) self.screens = screens - self.videoDisplay = VideoDisplay(self, screens) + #self.videoDisplay = VideoDisplay(self, screens) self.audioPlayer = AudioPlayer(self) - self.mainDisplay = MainDisplay(self, screens) + self.mainDisplay = WebViewer(self, screens) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'maindisplay_hide'), self.hideDisplay) QtCore.QObject.connect(Receiver.get_receiver(), @@ -82,9 +82,10 @@ class DisplayManager(QtGui.QWidget): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.setup) + def setup(self): log.debug(u'mainDisplay - setup') - self.videoDisplay.setup() + #self.videoDisplay.setup() self.mainDisplay.setup() #Build the initial frame. self.initialFrame = QtGui.QImage( @@ -100,20 +101,19 @@ class DisplayManager(QtGui.QWidget): (self.screens.current[u'size'].width() - splash_image.width()) / 2, (self.screens.current[u'size'].height() - splash_image.height()) / 2, splash_image) - self.mainDisplay.displayImage(self.initialFrame) + self.mainDisplay.newDisplay(image_to_byte(QtGui.QPixmap.fromImage(self.initialFrame)), None, None) + self.mainDisplay.show() def hideDisplay(self, message): """ Hide the output displays """ - self.videoDisplay.mediaHide(message) self.mainDisplay.hideDisplay(message) def showDisplay(self, message): """ Hide the output displays """ - self.videoDisplay.mediaShow(message) self.mainDisplay.showDisplay(message) def addAlert(self, alertMessage, location): @@ -144,498 +144,638 @@ class DisplayManager(QtGui.QWidget): """ Handles the Starting of a Video and Display Management """ - self.videoDisplay.setVisible(True) self.mainDisplay.setVisible(False) - self.videoDisplay.onMediaQueue(item) def onStopVideo(self): """ Handles the Stopping of a Video and Display Management """ self.mainDisplay.setVisible(True) - self.videoDisplay.setVisible(False) - self.videoDisplay.onMediaStop() def close(self): """ Handles the closure of the displays """ - self.videoDisplay.close() - self.audioPlayer.close() - self.mainDisplay.close() + self.mainDisplay.close() class DisplayWidget(QtGui.QGraphicsView): """ Customised version of QTableWidget which can respond to keyboard events. """ - log.info(u'MainDisplay loaded') + log.info(u'Display Widget loaded') - def __init__(self, parent=None, name=None, primary=False): - QtGui.QWidget.__init__(self, None) + def __init__(self, parent=None, name=None): + QtGui.QGraphicsView.__init__(self) self.parent = parent - self.primary = primary - self.hotkey_map = { - QtCore.Qt.Key_Return: 'servicemanager_next_item', - QtCore.Qt.Key_Space: 'slidecontroller_live_next_noloop', - QtCore.Qt.Key_Enter: 'slidecontroller_live_next_noloop', - QtCore.Qt.Key_0: 'servicemanager_next_item', - QtCore.Qt.Key_Backspace: 'slidecontroller_live_previous_noloop'} def keyPressEvent(self, event): - if isinstance(event, QtGui.QKeyEvent): + if type(event) == QtGui.QKeyEvent: #here accept the event and do something - if event.key() == QtCore.Qt.Key_Up: - Receiver.send_message(u'slidecontroller_live_previous') - event.accept() - elif event.key() == QtCore.Qt.Key_Down: - Receiver.send_message(u'slidecontroller_live_next') - event.accept() - elif event.key() == QtCore.Qt.Key_PageUp: - Receiver.send_message(u'slidecontroller_live_first') - event.accept() - elif event.key() == QtCore.Qt.Key_PageDown: - Receiver.send_message(u'slidecontroller_live_last') - event.accept() - elif event.key() in self.hotkey_map: - Receiver.send_message(self.hotkey_map[event.key()]) + if event.key() == QtCore.Qt.Key_Down: + print "down" + self.next() event.accept() elif event.key() == QtCore.Qt.Key_Escape: - self.resetDisplay() + print "esc" + self.close() event.accept() - event.ignore() + elif event.key() == QtCore.Qt.Key_V: + print "v" + self.video() + event.accept() + elif event.key() == QtCore.Qt.Key_I: + print "I" + self.image() + event.accept() + elif event.key() == QtCore.Qt.Key_P: + print "p" + self.preview() + event.accept() + elif event.key() == QtCore.Qt.Key_A: + print "a" + self.alert() + event.accept() + elif event.key() == QtCore.Qt.Key_S: + print "s" + self.shadow() + event.accept() + else: + event.ignore() else: event.ignore() - def resetDisplay(self): - log.debug(u'resetDisplay') - Receiver.send_message(u'slidecontroller_live_stop_loop') - if self.primary: - self.setVisible(False) - else: - self.setVisible(True) - -class MainDisplay(DisplayWidget): - """ - This is the form that is used to display things on the projector. - """ - log.info(u'MainDisplay Loaded') +class WebViewer(DisplayWidget): def __init__(self, parent, screens): - """ - The constructor for the display form. + DisplayWidget.__init__(self, parent=None) + self.screen = screens + self.setupSelf() + self.currimage = False +# self.byteArray = QtCore.QByteArray() +# buffer = QtCore.QBuffer(self.byteArray) #// use buffer to store pixmap into byteArray +# buffer.open(QtCore.QIODevice.WriteOnly) +# pixmap = QtGui.QPixmap("/home/timali/Pictures/IMG_0726.jpg") +# pixmap.save(buffer, "PNG") +# self.byteArray2 = QtCore.QByteArray() +# buffer = QtCore.QBuffer(self.byteArray) #// use buffer to store pixmap into byteArray +# buffer.open(QtCore.QIODevice.WriteOnly) +# pixmap = QtGui.QPixmap("file:///home/timali/Pictures/out.png") +# pixmap.save(buffer, "PNG") + self.setup() +# self.image1 = "file:///home/timali/Pictures/IMG_0726.jpg" +# self.image2 = "file:///home/timali/Pictures/out.png" + self.currvideo = False + self.video1 = "c:\\users\\jonathan\\Desktop\\Wildlife.wmv" + self.video2 = "c:\\users\\jonathan\\Desktop\\movie.ogg" + self.currslide = False + self.slide1 = "[1:1] In the beginning God created the heavens and the earth.

[1:2] Now the earth was formless and empty, darkness was over the surface of the deep, and the Spirit of God was hovering over the waters.

[1:3] And God said, \"Let there be light,\" and there was light.

[1:4] God saw that the light was good, and he separated the light from the darkness.

" + self.slide2 = "

This is the chorus
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah
Blah Blah Blah" + self.alerttext = "

Red Alert! Raise Shields!

" - ``parent`` - The parent widget. + def next(self): + print "next" + if self.currslide: + print "2" + self.frame.evaluateJavaScript("startfade('" + self.slide2 + "')") + #self.frame.findFirstElement('div#lyrics').setInnerXml(self.slide2) + else: + print "1" + self.frame.evaluateJavaScript("startfade('" + self.slide1 + "')") + #self.frame.findFirstElement('div#lyrics').setInnerXml(self.slide1) + self.currslide = not self.currslide - ``screens`` - The list of screens. - """ - log.debug(u'Initialisation started') - DisplayWidget.__init__(self, parent, primary=True) - self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint) - self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - # WA_TranslucentBackground is not available in QT4.4 - try: - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - except AttributeError: - pass - self.screens = screens - self.setupScene() - self.setupVideo() - self.setupImage() - self.setupText() - self.setupAlert() - self.setupBlank() - self.blankFrame = None - self.frame = None - #Hide desktop for now until we know where to put it - #and what size it should be. - self.setVisible(False) + def text(self, slide): + self.frame.findFirstElement('div#lyrics').setInnerXml(self.slides(slide)) + + def alert(self): + self.frame.findFirstElement('div#alert').setInnerXml(self.alerttext) + + def image(self, byteImage): + self.frame.evaluateJavaScript( + "document.getElementById('video').style.visibility = 'hidden'") + self.frame.evaluateJavaScript( + "document.getElementById('image').style.visibility = 'visible'") + if self.currimage: + self.frame.findFirstElement('img').setAttribute( + 'src', unicode('data:image/png;base64,%s' % byteImage.toBase64())) + self.currimage = not self.currimage + + def video(self, videoPath, noSound=False): + if self.currimage: + self.frame.findFirstElement('video').setAttribute('src', videoPath) + self.frame.evaluateJavaScript( + "document.getElementById('video').style.visibility = 'visible'") + self.frame.evaluateJavaScript( + "document.getElementById('image').style.visibility = 'hidden'") + self.frame.evaluateJavaScript("document.getElementById('video').play()") + self.currimage = not self.currimage + + def setupSelf(self): + self.setWindowTitle(u'OpenLP Display') + self.setWindowFlags(QtCore.Qt.FramelessWindowHint | + QtCore.Qt.WindowStaysOnTopHint) + self.setGeometry(1440, 0, self.screen.current[u'size'].width(), self.screen.current[u'size'].height()) def setup(self): - """ - Sets up the screen on a particular screen. - """ - log.debug(u'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.scene.setSceneRect(0, 0, self.size().width(), - self.size().height()) - self.webView.setGeometry(0, 0, self.size().width(), - self.size().height()) - #Build a custom splash screen - self.repaint() - #Build a Black screen - painter = QtGui.QPainter() - self.blankFrame = QtGui.QImage( - self.screen[u'size'].width(), - self.screen[u'size'].height(), - QtGui.QImage.Format_ARGB32_Premultiplied) - painter.begin(self.blankFrame) - painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black) - #build a blank transparent image - self.transparent = QtGui.QPixmap( - self.screen[u'size'].width(), self.screen[u'size'].height()) - self.transparent.fill(QtCore.Qt.transparent) -# self.displayText.setPixmap(self.transparent) - #self.frameView(self.transparent) - # To display or not to display? - if not self.screen[u'primary']: - self.setVisible(True) - self.primary = False - else: - self.setVisible(False) - self.primary = True - - def setupScene(self): - self.scene = QtGui.QGraphicsScene(self) - self.scene.setSceneRect(0, 0, self.size().width(), self.size().height()) - self.setScene(self.scene) - - def setupVideo(self): - self.webView = QtWebKit.QWebView() + self.webView = QtWebKit.QWebView(self) + self.webView.setGeometry(0, 0, self.screen.current[u'size'].width(), self.screen.current[u'size'].height()) self.page = self.webView.page() - self.videoDisplay = self.page.mainFrame() - self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Vertical, +# html = build_html(None, self.screen, None, self.byteArray) +# self.webView.setHtml(html) + self.frame = self.page.mainFrame() + self.frame.setScrollBarPolicy(QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff) - self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Horizontal, + self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff) - self.proxy = QtGui.QGraphicsProxyWidget() - self.proxy.setWidget(self.webView) - self.proxy.setWindowFlags(QtCore.Qt.Window | - QtCore.Qt.FramelessWindowHint) - self.proxy.setZValue(1) - self.scene.addItem(self.proxy) - def setupImage(self): - self.imageDisplay = QtGui.QGraphicsPixmapItem() - self.imageDisplay.setZValue(2) - self.scene.addItem(self.imageDisplay) + def preview(self): + self.setVisible(False) + preview = QtGui.QImage(QtCore.QSize(640, 480), QtGui.QImage.Format_ARGB32_Premultiplied) + painter = QtGui.QPainter(preview) + painter.setRenderHint(QtGui.QPainter.Antialiasing) + self.frame.render(painter) + painter.end() + preview.save("temp.png", "png") + return preview - def setupText(self): - #self.displayText = QtGui.QGraphicsTextItem() - self.displayText = QtGui.QGraphicsPixmapItem() - #self.displayText.setPos(0,0) - #self.displayText.setTextWidth(self.size().width()) - self.displayText.setZValue(4) - self.scene.addItem(self.displayText) + def newDisplay(self, image, text, video=None): + if not video: + html = build_html(None, self.screen.current, None, image) + self.webView.setHtml(html) - def setupAlert(self): - self.alertText = QtGui.QGraphicsTextItem() - self.alertText.setTextWidth(self.size().width()) - self.alertText.setZValue(8) - self.scene.addItem(self.alertText) - - def setupBlank(self): - self.displayBlank = QtGui.QGraphicsPixmapItem() - self.displayBlank.setZValue(10) - self.scene.addItem(self.displayBlank) - -# def hideDisplayForVideo(self): +#class DisplayWidget(QtGui.QGraphicsView): +# """ +# Customised version of QTableWidget which can respond to keyboard +# events. +# """ +# log.info(u'MainDisplay loaded') +# +# def __init__(self, parent=None, name=None, primary=False): +# QtGui.QWidget.__init__(self, None) +# self.parent = parent +# self.primary = primary +# self.hotkey_map = { +# QtCore.Qt.Key_Return: 'servicemanager_next_item', +# QtCore.Qt.Key_Space: 'slidecontroller_live_next_noloop', +# QtCore.Qt.Key_Enter: 'slidecontroller_live_next_noloop', +# QtCore.Qt.Key_0: 'servicemanager_next_item', +# QtCore.Qt.Key_Backspace: 'slidecontroller_live_previous_noloop'} +# +# def keyPressEvent(self, event): +# if isinstance(event, QtGui.QKeyEvent): +# #here accept the event and do something +# if event.key() == QtCore.Qt.Key_Up: +# Receiver.send_message(u'slidecontroller_live_previous') +# event.accept() +# elif event.key() == QtCore.Qt.Key_Down: +# Receiver.send_message(u'slidecontroller_live_next') +# event.accept() +# elif event.key() == QtCore.Qt.Key_PageUp: +# Receiver.send_message(u'slidecontroller_live_first') +# event.accept() +# elif event.key() == QtCore.Qt.Key_PageDown: +# Receiver.send_message(u'slidecontroller_live_last') +# event.accept() +# elif event.key() in self.hotkey_map: +# Receiver.send_message(self.hotkey_map[event.key()]) +# event.accept() +# elif event.key() == QtCore.Qt.Key_Escape: +# self.resetDisplay() +# event.accept() +# event.ignore() +# else: +# event.ignore() +# +# def resetDisplay(self): +# log.debug(u'resetDisplay') +# Receiver.send_message(u'slidecontroller_live_stop_loop') +# if self.primary: +# self.setVisible(False) +# else: +# self.setVisible(True) +# +#class MainDisplay(DisplayWidget): +# """ +# This is the form that is used to display things on the projector. +# """ +# log.info(u'MainDisplay Loaded') +# +# def __init__(self, parent, screens): # """ -# Hides the main display if for the video to be played +# The constructor for the display form. +# +# ``parent`` +# The parent widget. +# +# ``screens`` +# The list of screens. # """ -# self.hideDisplay(HideMode.Screen) - - def hideDisplay(self, mode=HideMode.Screen): - """ - Hide the display by making all layers transparent - Store the images so they can be replaced when required - """ - log.debug(u'hideDisplay mode = %d', mode) - #self.displayText.setPixmap(self.transparent) - if mode == HideMode.Screen: - #self.display_image.setPixmap(self.transparent) - self.setVisible(False) - elif mode == HideMode.Blank: - self.displayBlank.setPixmap( - QtGui.QPixmap.fromImage(self.blankFrame)) - else: - if self.parent.renderManager.renderer.bg_frame: - self.displayBlank.setPixmap(QtGui.QPixmap.fromImage( - self.parent.renderManager.renderer.bg_frame)) - else: - self.displayBlank.setPixmap( - QtGui.QPixmap.fromImage(self.blankFrame)) - - def showDisplay(self, message=u''): - """ - Show the stored layers so the screen reappears as it was - originally. - Make the stored images None to release memory. - """ - log.debug(u'showDisplay') - self.displayBlank.setPixmap(self.transparent) - #Trigger actions when display is active again - Receiver.send_message(u'maindisplay_active') - - def addImageWithText(self, frame): - log.debug(u'addImageWithText') - frame = resize_image( - frame, self.screen[u'size'].width(), self.screen[u'size'].height()) - self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) - self.videoDisplay.setHtml(u'') - - def addAlert(self, message, location): - """ - Places the Alert text on the display at the correct location - ``message`` - Text to be displayed - ``location`` - Where on the screen the text should be. From the AlertTab - Combo box. - """ - log.debug(u'addAlertImage') - if location == 0: - self.alertText.setPos(0, 0) - elif location == 1: - self.alertText.setPos(0, self.size().height() / 2) - else: - self.alertText.setPos(0, self.size().height() - 76) - self.alertText.setHtml(message) - - def displayImage(self, frame): - """ - Places the Image passed on the display screen - ``frame`` - The image to be displayed - """ - log.debug(u'adddisplayImage') - if isinstance(frame, QtGui.QImage): - self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) - else: - self.imageDisplay.setPixmap(frame) - self.videoDisplay.setHtml(u'') - - def displayVideo(self, path): - """ - Places the Video passed on the display screen - ``path`` - The path to the image to be displayed - """ - log.debug(u'adddisplayVideo') - self.displayImage(self.transparent) - self.videoDisplay.setHtml(HTMLVIDEO % - (path, self.screen[u'size'].width(), - self.screen[u'size'].height())) - - def frameView(self, frame, transition=False): - """ - 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 - ``transition`` - Are transitions required. - """ - log.debug(u'frameView') - if transition: - if self.frame is not None: - self.displayText.setPixmap( - QtGui.QPixmap.fromImage(self.frame)) - self.repaint() - Receiver.send_message(u'openlp_process_events') - time.sleep(0.1) - self.frame = None - if frame[u'trans'] is not None: - self.displayText.setPixmap( - QtGui.QPixmap.fromImage(frame[u'trans'])) - self.repaint() - Receiver.send_message(u'openlp_process_events') - time.sleep(0.1) - self.frame = frame[u'trans'] - self.displayText.setPixmap( - QtGui.QPixmap.fromImage(frame[u'main'])) - else: - if isinstance(frame, QtGui.QPixmap): - self.displayText.setPixmap(frame) - else: - self.displayText.setPixmap(QtGui.QPixmap.fromImage(frame)) - if not self.isVisible() and self.screens.display: - self.setVisible(True) - -class VideoDisplay(Phonon.VideoWidget): - """ - This is the form that is used to display videos on the projector. - """ - log.info(u'VideoDisplay Loaded') - - def __init__(self, parent, screens, - aspect=Phonon.VideoWidget.AspectRatioWidget): - """ - The constructor for the display form. - - ``parent`` - The parent widget. - - ``screens`` - The list of screens. - """ - log.debug(u'VideoDisplay Initialisation started') - Phonon.VideoWidget.__init__(self) - self.setWindowTitle(u'OpenLP Video Display') - self.parent = parent - self.screens = screens - self.hidden = False - self.message = None - self.mediaActive = False - self.mediaObject = Phonon.MediaObject() - self.setAspectRatio(aspect) - self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory) - Phonon.createPath(self.mediaObject, self) - Phonon.createPath(self.mediaObject, self.audioObject) - flags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Dialog -## # WindowsStaysOnBottomHint is not available in QT4.4 +# log.debug(u'Initialisation started') +# DisplayWidget.__init__(self, parent, primary=True) +# self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint) +# self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) +# self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) +# # WA_TranslucentBackground is not available in QT4.4 # try: -# flags = flags | QtCore.Qt.WindowStaysOnBottomHint +# self.setAttribute(QtCore.Qt.WA_TranslucentBackground) # except AttributeError: # pass - self.setWindowFlags(flags) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'videodisplay_play'), self.onMediaPlay) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'videodisplay_pause'), self.onMediaPause) -# QtCore.QObject.connect(Receiver.get_receiver(), -# QtCore.SIGNAL(u'videodisplay_background'), self.onMediaBackground) - - QtCore.QObject.connect(self.mediaObject, - QtCore.SIGNAL(u'finished()'), self.onMediaStop) - self.setVisible(False) - - def keyPressEvent(self, event): - if isinstance(event, QtGui.QKeyEvent): - #here accept the event and do something - if event.key() == QtCore.Qt.Key_Escape: - self.onMediaStop() - event.accept() - event.ignore() - else: - event.ignore() - - 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.screen = self.screens.current - #Sort out screen locations and sizes - self.setGeometry(self.screen[u'size']) - # To display or not to display? - if not self.screen[u'primary']: # and self.isVisible(): - #self.showFullScreen() - self.setVisible(False) - self.primary = False - else: - self.setVisible(False) - self.primary = True - - def closeEvent(self, event): - """ - Shutting down so clean up connections - """ - self.onMediaStop() - for path in self.outputPaths(): - path.disconnect() - -# def onMediaBackground(self, message=None): +# self.screens = screens +# self.setupScene() +# self.setupVideo() +# self.setupImage() +# self.setupText() +# self.setupAlert() +# self.setupBlank() +# self.blankFrame = None +# self.frame = None +# #Hide desktop for now until we know where to put it +# #and what size it should be. +# self.setVisible(False) +# +# def setup(self): # """ -# Play a video triggered from the video plugin with the -# file name passed in on the event. -# Also triggered from the Finish event so the video will loop -# if it is triggered from the plugin +# Sets up the screen on a particular screen. +# """ +# log.debug(u'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.scene.setSceneRect(0, 0, self.size().width(), +# self.size().height()) +# self.webView.setGeometry(0, 0, self.size().width(), +# self.size().height()) +# #Build a custom splash screen +# self.repaint() +# #Build a Black screen +# painter = QtGui.QPainter() +# self.blankFrame = QtGui.QImage( +# self.screen[u'size'].width(), +# self.screen[u'size'].height(), +# QtGui.QImage.Format_ARGB32_Premultiplied) +# painter.begin(self.blankFrame) +# painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black) +# #build a blank transparent image +# self.transparent = QtGui.QPixmap( +# self.screen[u'size'].width(), self.screen[u'size'].height()) +# self.transparent.fill(QtCore.Qt.transparent) +## self.displayText.setPixmap(self.transparent) +# #self.frameView(self.transparent) +# # To display or not to display? +# if not self.screen[u'primary']: +# self.setVisible(True) +# self.primary = False +# else: +# self.setVisible(False) +# self.primary = True +# +# def setupScene(self): +# self.scene = QtGui.QGraphicsScene(self) +# self.scene.setSceneRect(0, 0, self.size().width(), self.size().height()) +# self.setScene(self.scene) +# +# def setupVideo(self): +# self.webView = QtWebKit.QWebView() +# self.page = self.webView.page() +# self.videoDisplay = self.page.mainFrame() +# self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Vertical, +# QtCore.Qt.ScrollBarAlwaysOff) +# self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Horizontal, +# QtCore.Qt.ScrollBarAlwaysOff) +# self.proxy = QtGui.QGraphicsProxyWidget() +# self.proxy.setWidget(self.webView) +# self.proxy.setWindowFlags(QtCore.Qt.Window | +# QtCore.Qt.FramelessWindowHint) +# self.proxy.setZValue(1) +# self.scene.addItem(self.proxy) +# +# def setupImage(self): +# self.imageDisplay = QtGui.QGraphicsPixmapItem() +# self.imageDisplay.setZValue(2) +# self.scene.addItem(self.imageDisplay) +# +# def setupText(self): +# #self.displayText = QtGui.QGraphicsTextItem() +# self.displayText = QtGui.QGraphicsPixmapItem() +# #self.displayText.setPos(0,0) +# #self.displayText.setTextWidth(self.size().width()) +# self.displayText.setZValue(4) +# self.scene.addItem(self.displayText) +# +# def setupAlert(self): +# self.alertText = QtGui.QGraphicsTextItem() +# self.alertText.setTextWidth(self.size().width()) +# self.alertText.setZValue(8) +# self.scene.addItem(self.alertText) +# +# def setupBlank(self): +# self.displayBlank = QtGui.QGraphicsPixmapItem() +# self.displayBlank.setZValue(10) +# self.scene.addItem(self.displayBlank) +# +## def hideDisplayForVideo(self): +## """ +## Hides the main display if for the video to be played +## """ +## self.hideDisplay(HideMode.Screen) +# +# def hideDisplay(self, mode=HideMode.Screen): +# """ +# Hide the display by making all layers transparent +# Store the images so they can be replaced when required +# """ +# log.debug(u'hideDisplay mode = %d', mode) +# #self.displayText.setPixmap(self.transparent) +# if mode == HideMode.Screen: +# #self.display_image.setPixmap(self.transparent) +# self.setVisible(False) +# elif mode == HideMode.Blank: +# self.displayBlank.setPixmap( +# QtGui.QPixmap.fromImage(self.blankFrame)) +# else: +# if self.parent.renderManager.renderer.bg_frame: +# self.displayBlank.setPixmap(QtGui.QPixmap.fromImage( +# self.parent.renderManager.renderer.bg_frame)) +# else: +# self.displayBlank.setPixmap( +# QtGui.QPixmap.fromImage(self.blankFrame)) +# +# def showDisplay(self, message=u''): +# """ +# Show the stored layers so the screen reappears as it was +# originally. +# Make the stored images None to release memory. +# """ +# log.debug(u'showDisplay') +# self.displayBlank.setPixmap(self.transparent) +# #Trigger actions when display is active again +# Receiver.send_message(u'maindisplay_active') +# +# def addImageWithText(self, frame): +# log.debug(u'addImageWithText') +# frame = resize_image( +# frame, self.screen[u'size'].width(), self.screen[u'size'].height()) +# self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) +# self.videoDisplay.setHtml(u'') +# +# def addAlert(self, message, location): +# """ +# Places the Alert text on the display at the correct location +# ``message`` +# Text to be displayed +# ``location`` +# Where on the screen the text should be. From the AlertTab +# Combo box. +# """ +# log.debug(u'addAlertImage') +# if location == 0: +# self.alertText.setPos(0, 0) +# elif location == 1: +# self.alertText.setPos(0, self.size().height() / 2) +# else: +# self.alertText.setPos(0, self.size().height() - 76) +# self.alertText.setHtml(message) +# +# def displayImage(self, frame): +# """ +# Places the Image passed on the display screen +# ``frame`` +# The image to be displayed +# """ +# log.debug(u'adddisplayImage') +# if isinstance(frame, QtGui.QImage): +# self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) +# else: +# self.imageDisplay.setPixmap(frame) +# self.videoDisplay.setHtml(u'') +# +# def displayVideo(self, path): +# """ +# Places the Video passed on the display screen +# ``path`` +# The path to the image to be displayed +# """ +# log.debug(u'adddisplayVideo') +# self.displayImage(self.transparent) +# self.videoDisplay.setHtml(HTMLVIDEO % +# (path, self.screen[u'size'].width(), +# self.screen[u'size'].height())) +# +# def frameView(self, frame, transition=False): +# """ +# 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 +# ``transition`` +# Are transitions required. +# """ +# log.debug(u'frameView') +# if transition: +# if self.frame is not None: +# self.displayText.setPixmap( +# QtGui.QPixmap.fromImage(self.frame)) +# self.repaint() +# Receiver.send_message(u'openlp_process_events') +# time.sleep(0.1) +# self.frame = None +# if frame[u'trans'] is not None: +# self.displayText.setPixmap( +# QtGui.QPixmap.fromImage(frame[u'trans'])) +# self.repaint() +# Receiver.send_message(u'openlp_process_events') +# time.sleep(0.1) +# self.frame = frame[u'trans'] +# self.displayText.setPixmap( +# QtGui.QPixmap.fromImage(frame[u'main'])) +# else: +# if isinstance(frame, QtGui.QPixmap): +# self.displayText.setPixmap(frame) +# else: +# self.displayText.setPixmap(QtGui.QPixmap.fromImage(frame)) +# if not self.isVisible() and self.screens.display: +# self.setVisible(True) +# +#class VideoDisplay(Phonon.VideoWidget): +# """ +# This is the form that is used to display videos on the projector. +# """ +# log.info(u'VideoDisplay Loaded') +# +# def __init__(self, parent, screens, +# aspect=Phonon.VideoWidget.AspectRatioWidget): +# """ +# The constructor for the display form. +# +# ``parent`` +# The parent widget. +# +# ``screens`` +# The list of screens. +# """ +# log.debug(u'VideoDisplay Initialisation started') +# Phonon.VideoWidget.__init__(self) +# self.setWindowTitle(u'OpenLP Video Display') +# self.parent = parent +# self.screens = screens +# self.hidden = False +# self.message = None +# self.mediaActive = False +# self.mediaObject = Phonon.MediaObject() +# self.setAspectRatio(aspect) +# self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory) +# Phonon.createPath(self.mediaObject, self) +# Phonon.createPath(self.mediaObject, self.audioObject) +# flags = QtCore.Qt.FramelessWindowHint | QtCore.Qt.Dialog +### # WindowsStaysOnBottomHint is not available in QT4.4 +## try: +## flags = flags | QtCore.Qt.WindowStaysOnBottomHint +## except AttributeError: +## pass +# self.setWindowFlags(flags) +# QtCore.QObject.connect(Receiver.get_receiver(), +# QtCore.SIGNAL(u'videodisplay_play'), self.onMediaPlay) +# QtCore.QObject.connect(Receiver.get_receiver(), +# QtCore.SIGNAL(u'videodisplay_pause'), self.onMediaPause) +## QtCore.QObject.connect(Receiver.get_receiver(), +## QtCore.SIGNAL(u'videodisplay_background'), self.onMediaBackground) +# +# QtCore.QObject.connect(self.mediaObject, +# QtCore.SIGNAL(u'finished()'), self.onMediaStop) +# self.setVisible(False) +# +# def keyPressEvent(self, event): +# if isinstance(event, QtGui.QKeyEvent): +# #here accept the event and do something +# if event.key() == QtCore.Qt.Key_Escape: +# self.onMediaStop() +# event.accept() +# event.ignore() +# else: +# event.ignore() +# +# 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.screen = self.screens.current +# #Sort out screen locations and sizes +# self.setGeometry(self.screen[u'size']) +# # To display or not to display? +# if not self.screen[u'primary']: # and self.isVisible(): +# #self.showFullScreen() +# self.setVisible(False) +# self.primary = False +# else: +# self.setVisible(False) +# self.primary = True +# +# def closeEvent(self, event): +# """ +# Shutting down so clean up connections +# """ +# self.onMediaStop() +# for path in self.outputPaths(): +# path.disconnect() +# +## def onMediaBackground(self, message=None): +## """ +## Play a video triggered from the video plugin with the +## file name passed in on the event. +## Also triggered from the Finish event so the video will loop +## if it is triggered from the plugin +## """ +## log.debug(u'VideoDisplay Queue new media message %s' % message) +## #If not file take the stored one +## if not message: +## message = self.message +## # still no file name then stop as it was a normal video stopping +## if message: +## self.mediaObject.setCurrentSource(Phonon.MediaSource(message)) +## self.message = message +## self._play() +# +# def onMediaQueue(self, message): +# """ +# Set up a video to play from the serviceitem. # """ # log.debug(u'VideoDisplay Queue new media message %s' % message) -# #If not file take the stored one -# if not message: -# message = self.message -# # still no file name then stop as it was a normal video stopping -# if message: -# self.mediaObject.setCurrentSource(Phonon.MediaSource(message)) -# self.message = message +# file = os.path.join(message.get_frame_path(), +# message.get_frame_title()) +# self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) +# self.mediaActive = True +# self._play() +# +# def onMediaPlay(self): +# """ +# Respond to the Play button on the slide controller unless the display +# has been hidden by the slidecontroller +# """ +# if not self.hidden: +# log.debug(u'VideoDisplay Play the new media, Live ') # self._play() - - def onMediaQueue(self, message): - """ - Set up a video to play from the serviceitem. - """ - log.debug(u'VideoDisplay Queue new media message %s' % message) - file = os.path.join(message.get_frame_path(), - message.get_frame_title()) - self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) - self.mediaActive = True - self._play() - - def onMediaPlay(self): - """ - Respond to the Play button on the slide controller unless the display - has been hidden by the slidecontroller - """ - if not self.hidden: - log.debug(u'VideoDisplay Play the new media, Live ') - self._play() - - def _play(self): - """ - We want to play the video so start it and display the screen - """ - log.debug(u'VideoDisplay _play called') - self.mediaObject.play() - self.setVisible(True) - - def onMediaPause(self): - """ - Pause the video and refresh the screen - """ - log.debug(u'VideoDisplay Media paused by user') - self.mediaObject.pause() - self.show() - - def onMediaStop(self): - """ - Stop the video and clean up - """ - log.debug(u'VideoDisplay Media stopped by user') - self.message = None - self.mediaActive = False - self.mediaObject.stop() - self.onMediaFinish() - - def onMediaFinish(self): - """ - Clean up the Object queue - """ - log.debug(u'VideoDisplay Reached end of media playlist') - self.mediaObject.clearQueue() - self.setVisible(False) - - def mediaHide(self, message=u''): - """ - Hide the video display - """ - self.mediaObject.pause() - self.hidden = True - self.setVisible(False) - - def mediaShow(self, message=''): - """ - Show the video display if it was already hidden - """ - if self.hidden: - self.hidden = False - if self.mediaActive: - self._play() +# +# def _play(self): +# """ +# We want to play the video so start it and display the screen +# """ +# log.debug(u'VideoDisplay _play called') +# self.mediaObject.play() +# self.setVisible(True) +# +# def onMediaPause(self): +# """ +# Pause the video and refresh the screen +# """ +# log.debug(u'VideoDisplay Media paused by user') +# self.mediaObject.pause() +# self.show() +# +# def onMediaStop(self): +# """ +# Stop the video and clean up +# """ +# log.debug(u'VideoDisplay Media stopped by user') +# self.message = None +# self.mediaActive = False +# self.mediaObject.stop() +# self.onMediaFinish() +# +# def onMediaFinish(self): +# """ +# Clean up the Object queue +# """ +# log.debug(u'VideoDisplay Reached end of media playlist') +# self.mediaObject.clearQueue() +# self.setVisible(False) +# +# def mediaHide(self, message=u''): +# """ +# Hide the video display +# """ +# self.mediaObject.pause() +# self.hidden = True +# self.setVisible(False) +# +# def mediaShow(self, message=''): +# """ +# Show the video display if it was already hidden +# """ +# if self.hidden: +# self.hidden = False +# if self.mediaActive: +# self._play() class AudioPlayer(QtCore.QObject): """ This Class will play audio only allowing components to work with a - soundtrack which does not take over the user interface. + soundtrack independent of the user interface. """ log.info(u'AudioPlayer Loaded')