diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index f62778820..235e98163 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -165,15 +165,41 @@ def context_menu_separator(base): action.setSeparator(True) return action -def resize_image(image, width, height): +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) + if isinstance(image, QtGui.QImage): + pixmap = QtGui.QPixmap.fromImage(image) + else: + pixmap = QtGui.QPixmap(image) + pixmap.save(buffer, "PNG") + #convert to base64 encoding so does not get missed! + return byte_array.toBase64() + +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(): + #Only resize if different size if preview.width() == width and preview.height == height: return preview preview = preview.scaled(width, height, QtCore.Qt.KeepAspectRatio, @@ -183,7 +209,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 @@ -212,6 +238,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/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py new file mode 100644 index 000000000..005416f73 --- /dev/null +++ b/openlp/core/lib/htmlbuilder.py @@ -0,0 +1,171 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# 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 # +############################################################################### + +from openlp.core.lib import image_to_byte + +HTMLSRC = u""" + +
+%s
" + elif self._theme.display_horizontalAlign == 1: + shell = "%s
" + else: + shell = "%s
" + temp_text = u'' + old_html_text = u'' + page = [] + for line in text: + # mark line ends + temp_text = temp_text + line + u'Red Alert! Raise Shields!
" - 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() + 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: - event.ignore() + print "1" + self.frame.evaluateJavaScript("startfade('" + self.slide1 + "')") + #self.frame.findFirstElement('div#lyrics').setInnerXml(self.slide1) + self.currslide = not self.currslide + + def text(self, slide): + print slide + self.frame.findFirstElement('div#lyrics').setInnerXml(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 setup(self): - """ - Sets up the screen on a particular screen. - """ - log.debug(u'VideoDisplay Setup %s for %s ' % (self.screens, - self.screens.monitor_number)) + log.debug(u'Setup %s for %s ' % ( + self.screens, self.screens.monitor_number)) self.screen = self.screens.current - #Sort out screen locations and sizes + self.setVisible(False) 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 + self.webView = QtWebKit.QWebView(self) + self.webView.setGeometry(0, 0, self.screen[u'size'].width(), self.screen[u'size'].height()) + self.page = self.webView.page() + self.frame = self.page.mainFrame() + self.frame.setScrollBarPolicy(QtCore.Qt.Vertical, + QtCore.Qt.ScrollBarAlwaysOff) + self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal, + QtCore.Qt.ScrollBarAlwaysOff) + + def preview(self, image, text, theme): + self.setVisible(False) + html = build_html(theme, self.screen, None, image) + self.webView.setHtml(html) + self.frame.findFirstElement('div#lyrics').setInnerXml(text) + preview = QtGui.QImage(self.screen[u'size'].width(), + self.screen[u'size'].height(), + QtGui.QImage.Format_ARGB32_Premultiplied) + painter = QtGui.QPainter(preview) + painter.setRenderHint(QtGui.QPainter.Antialiasing) + self.frame.render(painter) + painter.end() + #save preview for debugging + preview.save("temp.png", "png") + return preview + + def initialDisplay(self, image, video=False): + if not video: + html = build_html(self.parent.renderManager.themedata, self.screen, None, image) + self.webView.setHtml(html) + + def buildHtml(self, image=None): + if not image: + html = build_html(self.parent.renderManager.themedata, self.screen, None, self.parent.renderManager.renderer.bg_frame) else: - self.setVisible(False) - self.primary = True + html = build_html(self.parent.renderManager.themedata, self.screen, None, image) + self.webView.setHtml(html) - def closeEvent(self, event): - """ - Shutting down so clean up connections - """ - self.onMediaStop() - for path in self.outputPaths(): - path.disconnect() - -# def onMediaBackground(self, message=None): +#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): # """ -# 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 +# The constructor for the display form. +# +# ``parent`` +# The parent widget. +# +# ``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 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.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') diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index ec34a483b..45a77bb7a 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -527,7 +527,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.songsSettingsSection = u'songs' self.serviceNotSaved = False self.settingsmanager = SettingsManager(screens) - self.displayManager = DisplayManager(screens) + self.displayManager = DisplayManager(self, screens) self.aboutForm = AboutForm(self, applicationVersion) self.settingsForm = SettingsForm(self.screens, self, self) self.recentFiles = QtCore.QStringList() diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 8f9242764..f8e9f2fae 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -590,6 +590,7 @@ class SlideController(QtGui.QWidget): else: self.PreviewListWidget.selectRow(slideno) self.enableToolBar(serviceItem) + #Reset the display html self.onSlideSelected() self.PreviewListWidget.setFocus() Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, @@ -769,23 +770,19 @@ class SlideController(QtGui.QWidget): self.updatePreview() else: before = time.time() - frame = self.serviceItem.get_rendered_frame(row) + changed, frame, raw_html = self.serviceItem.get_rendered_frame(row) if isinstance(frame, QtGui.QImage): self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) else: - if isinstance(frame[u'main'], basestring): - self.SlidePreview.setPixmap( - QtGui.QPixmap(frame[u'main'])) - else: - self.SlidePreview.setPixmap( - QtGui.QPixmap.fromImage(frame[u'main'])) + self.SlidePreview.setPixmap(QtGui.QPixmap(frame)) log.log( 15, u'Slide Rendering took %4s' % (time.time() - before)) if self.isLive: if self.serviceItem.is_text(): - self.mainDisplay.frameView(frame, True) + self.displayManager.buildHtml(changed) + self.displayManager.text(raw_html) else: - self.displayManager.displayImage(frame[u'main']) + self.displayManager.displayImage(frame) self.selectedRow = row Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, row) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 9324e74ce..8c0b03cb2 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -521,16 +521,16 @@ class BibleMediaItem(MediaManagerItem): permission = self._decodeQtObject(reference, 'permission') if self.parent.settings_tab.display_style == 1: verse_text = self.formatVerse(old_chapter, chapter, verse, - u'(u', u')') + u'(u', u')') elif self.parent.settings_tab.display_style == 2: verse_text = self.formatVerse(old_chapter, chapter, verse, - u'{', u'}') + u'{', u'}') elif self.parent.settings_tab.display_style == 3: verse_text = self.formatVerse(old_chapter, chapter, verse, - u'[', u']') + u'[', u']') else: verse_text = self.formatVerse(old_chapter, chapter, verse, - u'', u'') + u'', u'') old_chapter = chapter footer = u'%s (%s %s)' % (book, version, copyright) #If not found add to footer diff --git a/resources/Fedora/191/OpenLP.spec b/resources/Fedora/191/OpenLP.spec new file mode 100644 index 000000000..7e9ccc1cc --- /dev/null +++ b/resources/Fedora/191/OpenLP.spec @@ -0,0 +1,91 @@ +%{!?python_sitelib:%global python_sitelib %(%{__python} -c "from distutils.sysconfig import get_python_lib; print get_python_lib()")} + +Summary: Open source Church presentation and lyrics projection application +Name: OpenLP +Version: 1.9.1.1 +Release: 1%{?dist} +Source0: http://downloads.sourceforge.net/openlp/openlp/%{version}/%{name}-%{version}.tar.gz +License: GPLv2 +Group: Applications/Multimedia +BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) +BuildArch: noarch + +URL: http://openlp.org/ + +BuildRequires: desktop-file-utils +BuildRequires: python2-devel +BuildRequires: python-setuptools + +Requires: PyQt4 +Requires: phonon +Requires: python-BeautifulSoup +Requires: python-chardet +Requires: python-lxml +Requires: python-sqlalchemy +Requires: hicolor-icon-theme + +%description +OpenLP is a church presentation software, for lyrics projection software, +used to display slides of Songs, Bible verses, videos, images, and +presentations (if OpenOffice.org is installed) using a computer and projector. + +%prep +%setup -q + +%build +python setup.py build + +%install +rm -rf %{buildroot} +python setup.py install --skip-build -O1 --root %{buildroot} + +install -m644 -p -D resources/images/openlp-logo-16x16.png \ + %{buildroot}%{_datadir}/icons/hicolor/16x16/apps/openlp.png +install -m644 -p -D resources/images/openlp-logo-32x32.png \ + %{buildroot}%{_datadir}/icons/hicolor/32x32/apps/openlp.png +install -m644 -p -D resources/images/openlp-logo-48x48.png \ + %{buildroot}%{_datadir}/icons/hicolor/48x48/apps/openlp.png +install -m644 -p -D resources/images/openlp-logo.svg \ + %{buildroot}%{_datadir}/icons/hicolor/scalable/apps/openlp.svg + +desktop-file-install \ + --dir %{buildroot}/%{_datadir}/applications \ + resources/openlp.desktop + +mv %{buildroot}%{_bindir}/bible-1to2-converter.py \ + %{buildroot}%{_bindir}/bible-1to2-converter +mv %{buildroot}%{_bindir}/openlp-1to2-converter.py \ + %{buildroot}%{_bindir}/openlp-1to2-converter +mv %{buildroot}%{_bindir}/openlp-remoteclient.py \ + %{buildroot}%{_bindir}/openlp-remoteclient +mv %{buildroot}%{_bindir}/openlp.pyw %{buildroot}%{_bindir}/openlp + + +%post +touch --no-create %{_datadir}/icons/hicolor ||: +gtk-update-icon-cache -q %{_datadir}/icons/hicolor 2> /dev/null ||: + +%postun +touch --no-create %{_datadir}/icons/hicolor ||: +gtk-update-icon-cache -q %{_datadir}/icons/hicolor 2> /dev/null ||: + + +%clean +rm -rf %{buildroot} + +%files +%defattr(-,root,root) +%doc copyright.txt LICENSE +%{_bindir}/bible-1to2-converter +%{_bindir}/openlp-1to2-converter +%{_bindir}/openlp-remoteclient +%{_bindir}/openlp +%{_datadir}/applications/openlp.desktop +%{_datadir}/icons/hicolor/*/apps/openlp.* +%{python_sitelib}/openlp/ +%{python_sitelib}/OpenLP-%{version}*.egg-info +%doc documentation/*.txt + +%changelog +* Sun Mar 28 2010 Tim Bentley