More refactoring and improvements

This commit is contained in:
Tim Bentley 2010-07-17 09:59:15 +01:00
parent 53c6e93d08
commit 443ff3fecd
7 changed files with 166 additions and 142 deletions

View File

@ -77,31 +77,32 @@ HTMLSRC = u"""
</body> </body>
</html> </html>
""" """
def build_html(theme, screen, alert, image): def build_html(item, screen, alert):
width = screen[u'size'].width() width = screen[u'size'].width()
height = screen[u'size'].height() height = screen[u'size'].height()
html = HTMLSRC % (build_video(theme, width, height, alert), html = HTMLSRC % (build_video(width, height),
build_image(theme, width, height, alert), build_image(width, height),
build_lyrics(theme, width, height, alert), build_lyrics(item, width, height),
build_alert(theme, width, height, alert), build_alert(width, height, alert),
build_image(theme, width, height, alert), build_image(width, height),
build_image_src(theme, width, height, alert, image)) build_image_src(item.bg_frame))
return html return html
def build_video(theme, width, height, alert): def build_video(width, height):
video = """ video = """
#video { #video {
position: absolute; position: absolute;
left: 0px; left: 0px;
top: 0px; top: 0px;
width: 640px width: %spx
height: 480px; height: %spx;
z-index:1; z-index:1;
} }
""" """
return video return video % (width, height)
def build_image(theme, width, height, alert):
def build_image(width, height):
image = """ image = """
#image { #image {
position: absolute; position: absolute;
@ -114,14 +115,14 @@ def build_image(theme, width, height, alert):
""" """
return image % (width, height) return image % (width, height)
def build_image_src(theme, width, height, alert, image): def build_image_src(image):
# <img src="" height="480" width="640" /> # <img src="" height="480" width="640" />
image_src = """ image_src = """
<img src="data:image/png;base64,%s">"; <img src="data:image/png;base64,%s">";
""" """
return image_src % image_to_byte(image) return image_src % image_to_byte(image)
def build_lyrics(theme, width, height, alert): def build_lyrics(item, width, height):
lyrics = """ lyrics = """
#lyrics { #lyrics {
position: absolute; position: absolute;
@ -136,6 +137,7 @@ def build_lyrics(theme, width, height, alert):
font-size: %spx; font-size: %spx;
} }
""" """
theme = item.themedata
lyrics_html = u'' lyrics_html = u''
shadow = u'' shadow = u''
outline = u'' outline = u''
@ -150,10 +152,10 @@ def build_lyrics(theme, width, height, alert):
(theme.display_outline_size, theme.display_outline_color) (theme.display_outline_size, theme.display_outline_color)
outline = u'text-shadow: -1px 0 white, 0 1px white, 1px 0 white, 0 -1px white' outline = u'text-shadow: -1px 0 white, 0 1px white, 1px 0 white, 0 -1px white'
lyrics_html = lyrics % (shadow, outline, theme.font_main_name, theme.font_main_proportion) lyrics_html = lyrics % (shadow, outline, theme.font_main_name, theme.font_main_proportion)
print lyrics_html print lyrics_html
return lyrics_html return lyrics_html
def build_alert(theme, width, height, alert): def build_alert(width, height, alert):
alert = """ alert = """
#alert { #alert {
position: absolute; position: absolute;

View File

@ -130,7 +130,7 @@ class RenderManager(object):
self.renderer.set_theme(self.themedata) self.renderer.set_theme(self.themedata)
self.build_text_rectangle(self.themedata) self.build_text_rectangle(self.themedata)
self.renderer.set_frame_dest(self.width, self.height) self.renderer.set_frame_dest(self.width, self.height)
return self.renderer.bg_frame return self.renderer._rect, self.renderer._rect_footer
def build_text_rectangle(self, theme): def build_text_rectangle(self, theme):
""" """

View File

@ -92,6 +92,7 @@ class ServiceItem(object):
self.is_valid = True self.is_valid = True
self.cache = {} self.cache = {}
self.icon = None self.icon = None
self.themedata = None
def add_capability(self, capability): def add_capability(self, capability):
""" """
@ -136,10 +137,12 @@ class ServiceItem(object):
self.just_rendered = True self.just_rendered = True
if self.service_item_type == ServiceItemType.Text: if self.service_item_type == ServiceItemType.Text:
log.debug(u'Formatting slides') log.debug(u'Formatting slides')
if self.theme is None: theme = None;
self.render_manager.set_override_theme(None) if not self.theme:
else: theme = self.theme
self.render_manager.set_override_theme(self.theme) self.main, self.footer = self.render_manager.set_override_theme(theme)
self.bg_frame = self.render_manager.renderer.bg_frame
self.themedata = self.render_manager.themedata
for slide in self._raw_frames: for slide in self._raw_frames:
before = time.time() before = time.time()
formated = self.render_manager.format_slide(slide[u'raw_slide']) formated = self.render_manager.format_slide(slide[u'raw_slide'])
@ -156,8 +159,6 @@ class ServiceItem(object):
if len(self._display_frames) in self.cache.keys(): if len(self._display_frames) in self.cache.keys():
del self.cache[len(self._display_frames)] del self.cache[len(self._display_frames)]
log.log(15, u'Formatting took %4s' % (time.time() - before)) log.log(15, u'Formatting took %4s' % (time.time() - before))
self.bg_frame = self.render_manager.renderer.bg_frame
self.themedata = self.render_manager.themedata
elif self.service_item_type == ServiceItemType.Image: elif self.service_item_type == ServiceItemType.Image:
for slide in self._raw_frames: for slide in self._raw_frames:
slide[u'image'] = resize_image(slide[u'image'], slide[u'image'] = resize_image(slide[u'image'],
@ -182,11 +183,12 @@ class ServiceItem(object):
# if self.cache.get(row): # if self.cache.get(row):
# frame = self.cache[row] # frame = self.cache[row]
# else: # else:
if raw_html[0]: # if raw_html[0]:
frame = self.render_manager.generate_slide(raw_html, # frame = self.render_manager.generate_slide(raw_html,
self.raw_footer) # self.raw_footer)
else: # else:
frame = self.render_manager.generate_slide(raw_html, u'') # frame = self.render_manager.generate_slide(raw_html, u'')
frame = None
self.cache[row] = frame self.cache[row] = frame
return frame, raw_html[0] return frame, raw_html[0]

View File

@ -36,10 +36,12 @@ class HideMode(object):
Theme = 2 Theme = 2
Screen = 3 Screen = 3
from maindisplay import WebViewer
from slidecontroller import HideMode from slidecontroller import HideMode
from servicenoteform import ServiceNoteForm from servicenoteform import ServiceNoteForm
from serviceitemeditform import ServiceItemEditForm from serviceitemeditform import ServiceItemEditForm
from screen import ScreenList from screen import ScreenList
from maindisplay import WebViewer
from maindisplay import DisplayManager from maindisplay import DisplayManager
from amendthemeform import AmendThemeForm from amendthemeform import AmendThemeForm
from slidecontroller import SlideController from slidecontroller import SlideController

View File

@ -30,7 +30,7 @@ import time
from PyQt4 import QtCore, QtGui, QtWebKit from PyQt4 import QtCore, QtGui, QtWebKit
from PyQt4.phonon import Phonon from PyQt4.phonon import Phonon
from openlp.core.lib import Receiver, resize_image, build_html from openlp.core.lib import Receiver, resize_image, build_html, ServiceItem
from openlp.core.ui import HideMode from openlp.core.ui import HideMode
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -59,6 +59,7 @@ HTMLVIDEO = u"""<html>
""" """
class DisplayManager(QtGui.QWidget): class DisplayManager(QtGui.QWidget):
pass
""" """
Wrapper class to hold the display widgets. Wrapper class to hold the display widgets.
I will provide API's in future to access the screens allow for I will provide API's in future to access the screens allow for
@ -71,24 +72,24 @@ class DisplayManager(QtGui.QWidget):
self.screens = screens self.screens = screens
self.audioPlayer = AudioPlayer(self) self.audioPlayer = AudioPlayer(self)
# Live display # Live display
self.mainDisplay = WebViewer(self, screens, True) #self.mainDisplay = WebViewer(self, screens, True)
# Display for Preview and Theme previews # Display for Preview and Theme previews
self.previewDisplay = WebViewer(self, screens, False) #self.previewDisplay = WebViewer(self, screens, False)
QtCore.QObject.connect(Receiver.get_receiver(), # QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'maindisplay_hide'), self.hideDisplay) # QtCore.SIGNAL(u'maindisplay_hide'), self.hideDisplay)
QtCore.QObject.connect(Receiver.get_receiver(), # QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'maindisplay_show'), self.showDisplay) # QtCore.SIGNAL(u'maindisplay_show'), self.showDisplay)
QtCore.QObject.connect(Receiver.get_receiver(), # QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'videodisplay_start'), self.onStartVideo) # QtCore.SIGNAL(u'videodisplay_start'), self.onStartVideo)
QtCore.QObject.connect(Receiver.get_receiver(), # QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'videodisplay_stop'), self.onStopVideo) # QtCore.SIGNAL(u'videodisplay_stop'), self.onStopVideo)
QtCore.QObject.connect(Receiver.get_receiver(), # QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'config_updated'), self.setup) # QtCore.SIGNAL(u'config_updated'), self.setup)
def setup(self): def setup(self):
log.debug(u'mainDisplay - setup') log.debug(u'mainDisplay - setup')
# let the render manager have the preview display. # let the render manager have the preview display.
self.parent.RenderManager.previewDisplay = self.previewDisplay #self.parent.RenderManager.previewDisplay = self.previewDisplay
#Build the initial frame. #Build the initial frame.
self.initialFrame = QtGui.QImage( self.initialFrame = QtGui.QImage(
self.screens.current[u'size'].width(), self.screens.current[u'size'].width(),
@ -102,77 +103,78 @@ class DisplayManager(QtGui.QWidget):
(self.screens.current[u'size'].width() - splash_image.width()) / 2, (self.screens.current[u'size'].width() - splash_image.width()) / 2,
(self.screens.current[u'size'].height() - splash_image.height()) / 2, (self.screens.current[u'size'].height() - splash_image.height()) / 2,
splash_image) splash_image)
self.mainDisplay.setup() # self.mainDisplay.setup()
self.previewDisplay.setup() # self.previewDisplay.setup()
self.mainDisplay.buildHtml(self.initialFrame) # if self.isLive
self.mainDisplay.show() # self.mainDisplay.buildHtml(self.initialFrame)
# self.mainDisplay.show()
def hideDisplay(self, message): # def hideDisplay(self, message):
""" # """
Hide the output displays # Hide the output displays
""" # """
self.mainDisplay.hideDisplay(message) # self.mainDisplay.hideDisplay(message)
#
def showDisplay(self, message): # def showDisplay(self, message):
""" # """
Hide the output displays # Hide the output displays
""" # """
self.mainDisplay.showDisplay(message) # self.mainDisplay.showDisplay(message)
#
def addAlert(self, alertMessage, location): # def addAlert(self, alertMessage, location):
""" # """
Handles the addition of an Alert Message to the Displays # Handles the addition of an Alert Message to the Displays
""" # """
self.mainDisplay.addAlert(alertMessage, location) # self.mainDisplay.addAlert(alertMessage, location)
#
def displayImageWithText(self, frame): # def displayImageWithText(self, frame):
""" # """
Handles the addition of a background Image to the displays # Handles the addition of a background Image to the displays
""" # """
self.mainDisplay.addImageWithText(frame) # self.mainDisplay.addImageWithText(frame)
#
def buildHtml(self, image=None): # def buildHtml(self, image=None):
""" # """
Handles the addition of a background Image to the displays # Handles the addition of a background Image to the displays
""" # """
self.mainDisplay.buildHtml(image) # self.mainDisplay.buildHtml(image)
#
def text(self, text): # def text(self, text):
""" # """
Handles the addition of a background Image to the displays # Handles the addition of a background Image to the displays
""" # """
self.mainDisplay.text(text) # self.mainDisplay.text(text)
#
def displayImage(self, frame): # def displayImage(self, frame):
""" # """
Handles the addition of a background Image to the displays # Handles the addition of a background Image to the displays
""" # """
self.mainDisplay.displayImage(frame) # self.mainDisplay.displayImage(frame)
#
def displayVideo(self, path): # def displayVideo(self, path):
""" # """
Handles the addition of a background Video to the displays # Handles the addition of a background Video to the displays
""" # """
self.mainDisplay.displayVideo(path) # self.mainDisplay.displayVideo(path)
#
def onStartVideo(self, item): # def onStartVideo(self, item):
""" # """
Handles the Starting of a Video and Display Management # Handles the Starting of a Video and Display Management
""" # """
self.mainDisplay.setVisible(False) # self.mainDisplay.setVisible(False)
#
def onStopVideo(self): # def onStopVideo(self):
""" # """
Handles the Stopping of a Video and Display Management # Handles the Stopping of a Video and Display Management
""" # """
self.mainDisplay.setVisible(True) # self.mainDisplay.setVisible(True)
#
def close(self): # def close(self):
""" # """
Handles the closure of the displays # Handles the closure of the displays
""" # """
#
self.mainDisplay.close() # self.mainDisplay.close()
class DisplayWidget(QtGui.QGraphicsView): class DisplayWidget(QtGui.QGraphicsView):
""" """
@ -230,6 +232,7 @@ class WebViewer(DisplayWidget):
DisplayWidget.__init__(self, live, parent=None) DisplayWidget.__init__(self, live, parent=None)
self.parent = parent self.parent = parent
self.screens = screens self.screens = screens
self.isLive = live
self.setWindowTitle(u'OpenLP Display') self.setWindowTitle(u'OpenLP Display')
self.setWindowFlags(QtCore.Qt.FramelessWindowHint | self.setWindowFlags(QtCore.Qt.FramelessWindowHint |
QtCore.Qt.WindowStaysOnTopHint) QtCore.Qt.WindowStaysOnTopHint)
@ -266,6 +269,7 @@ class WebViewer(DisplayWidget):
def text(self, slide): def text(self, slide):
print slide print slide
self.frame.findFirstElement('div#lyrics').setInnerXml(slide) self.frame.findFirstElement('div#lyrics').setInnerXml(slide)
return self.preview()
def alert(self): def alert(self):
self.frame.findFirstElement('div#alert').setInnerXml(self.alerttext) self.frame.findFirstElement('div#alert').setInnerXml(self.alerttext)
@ -304,12 +308,26 @@ class WebViewer(DisplayWidget):
QtCore.Qt.ScrollBarAlwaysOff) QtCore.Qt.ScrollBarAlwaysOff)
self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal, self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal,
QtCore.Qt.ScrollBarAlwaysOff) QtCore.Qt.ScrollBarAlwaysOff)
if self.isLive:
#Build the initial frame.
initialFrame = QtGui.QImage(
self.screens.current[u'size'].width(),
self.screens.current[u'size'].height(),
QtGui.QImage.Format_ARGB32_Premultiplied)
splash_image = QtGui.QImage(u':/graphics/openlp-splash-screen.png')
painter_image = QtGui.QPainter()
painter_image.begin(initialFrame)
painter_image.fillRect(initialFrame.rect(), QtCore.Qt.white)
painter_image.drawImage(
(self.screens.current[u'size'].width() - splash_image.width()) / 2,
(self.screens.current[u'size'].height() - splash_image.height()) / 2,
splash_image)
item = ServiceItem()
item.bg_frame = initialFrame
self.webView.setHtml(build_html(item, self.screen, None))
self.show()
def preview(self, image, text, theme): def preview(self):
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(), preview = QtGui.QImage(self.screen[u'size'].width(),
self.screen[u'size'].height(), self.screen[u'size'].height(),
QtGui.QImage.Format_ARGB32_Premultiplied) QtGui.QImage.Format_ARGB32_Premultiplied)
@ -326,11 +344,13 @@ class WebViewer(DisplayWidget):
html = build_html(self.parent.renderManager.themedata, self.screen, None, image) html = build_html(self.parent.renderManager.themedata, self.screen, None, image)
self.webView.setHtml(html) self.webView.setHtml(html)
def buildHtml(self, image=None): def buildHtml(self, serviceItem):
if not image: """
html = build_html(self.parent.renderManager.themedata, self.screen, None, self.parent.renderManager.renderer.bg_frame) Store the serviceItem and build the new HTML from it. Add the
else: HTML to the display
html = build_html(self.parent.renderManager.themedata, self.screen, None, image) """
self.serviceItem = serviceItem
html = build_html(self.serviceItem, self.screen, None)
self.webView.setHtml(html) self.webView.setHtml(html)
#class DisplayWidget(QtGui.QGraphicsView): #class DisplayWidget(QtGui.QGraphicsView):

View File

@ -135,8 +135,8 @@ class Ui_MainWindow(object):
self.ControlSplitter.setObjectName(u'ControlSplitter') self.ControlSplitter.setObjectName(u'ControlSplitter')
self.MainContentLayout.addWidget(self.ControlSplitter) self.MainContentLayout.addWidget(self.ControlSplitter)
# Create slide controllers # Create slide controllers
self.PreviewController = SlideController(self, self.settingsmanager) self.PreviewController = SlideController(self, self.settingsmanager, self.screens)
self.LiveController = SlideController(self, self.settingsmanager, True) self.LiveController = SlideController(self, self.settingsmanager, self.screens, True)
# Create menu # Create menu
self.MenuBar = QtGui.QMenuBar(MainWindow) self.MenuBar = QtGui.QMenuBar(MainWindow)
self.MenuBar.setGeometry(QtCore.QRect(0, 0, 1087, 27)) self.MenuBar.setGeometry(QtCore.QRect(0, 0, 1087, 27))
@ -692,10 +692,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
Show the main form, as well as the display form Show the main form, as well as the display form
""" """
QtGui.QWidget.show(self) QtGui.QWidget.show(self)
#screen_number = self.getMonitorNumber() self.LiveController.display.setup()
self.displayManager.setup() if self.LiveController.display.isVisible():
if self.displayManager.mainDisplay.isVisible(): self.LiveController.display.setFocus()
self.displayManager.mainDisplay.setFocus()
self.activateWindow() self.activateWindow()
if QtCore.QSettings().value( if QtCore.QSettings().value(
self.generalSettingsSection + u'/auto open', self.generalSettingsSection + u'/auto open',
@ -835,8 +834,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
self.plugin_manager.finalise_plugins() self.plugin_manager.finalise_plugins()
# Save settings # Save settings
self.saveSettings() self.saveSettings()
#Close down the displays #Close down the display
self.displayManager.close() self.LiveController.display.close()
def serviceChanged(self, reset=False, serviceName=None): def serviceChanged(self, reset=False, serviceName=None):
""" """

View File

@ -30,7 +30,7 @@ import os
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from PyQt4.phonon import Phonon from PyQt4.phonon import Phonon
from openlp.core.ui import HideMode from openlp.core.ui import HideMode, WebViewer
from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \
ItemCapabilities, translate ItemCapabilities, translate
@ -96,7 +96,7 @@ class SlideController(QtGui.QWidget):
SlideController is the slide controller widget. This widget is what the SlideController is the slide controller widget. This widget is what the
user uses to control the displaying of verses/slides/etc on the screen. user uses to control the displaying of verses/slides/etc on the screen.
""" """
def __init__(self, parent, settingsmanager, isLive=False): def __init__(self, parent, settingsmanager, screens, isLive=False):
""" """
Set up the Slide Controller. Set up the Slide Controller.
""" """
@ -104,8 +104,9 @@ class SlideController(QtGui.QWidget):
self.settingsmanager = settingsmanager self.settingsmanager = settingsmanager
self.isLive = isLive self.isLive = isLive
self.parent = parent self.parent = parent
self.mainDisplay = self.parent.displayManager.mainDisplay self.screens = screens
self.displayManager = self.parent.displayManager self.display = WebViewer(self, screens, isLive)
#self.displayManager = self.parent.displayManager
self.loopList = [ self.loopList = [
u'Start Loop', u'Start Loop',
u'Loop Separator', u'Loop Separator',
@ -599,7 +600,8 @@ class SlideController(QtGui.QWidget):
else: else:
self.PreviewListWidget.selectRow(slideno) self.PreviewListWidget.selectRow(slideno)
self.enableToolBar(serviceItem) self.enableToolBar(serviceItem)
#Reset the display html # Pass to display for viewing
self.display.buildHtml(self.serviceItem)
self.onSlideSelected() self.onSlideSelected()
self.PreviewListWidget.setFocus() self.PreviewListWidget.setFocus()
Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix,
@ -781,20 +783,17 @@ class SlideController(QtGui.QWidget):
before = time.time() before = time.time()
if self.serviceItem.just_rendered: if self.serviceItem.just_rendered:
self.serviceItem.just_rendered = False self.serviceItem.just_rendered = False
if self.isLive:
self.displayManager.buildHtml(self.serviceItem.bg_frame)
frame, raw_html = self.serviceItem.get_rendered_frame(row) frame, raw_html = self.serviceItem.get_rendered_frame(row)
if self.serviceItem.is_text():
frame = self.display.text(raw_html)
else:
self.displayManager.displayImage(frame)
if isinstance(frame, QtGui.QImage): if isinstance(frame, QtGui.QImage):
self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame))
else: else:
self.SlidePreview.setPixmap(QtGui.QPixmap(frame)) self.SlidePreview.setPixmap(QtGui.QPixmap(frame))
log.log( log.log(
15, u'Slide Rendering took %4s' % (time.time() - before)) 15, u'Slide Rendering took %4s' % (time.time() - before))
if self.isLive:
if self.serviceItem.is_text():
self.displayManager.text(raw_html)
else:
self.displayManager.displayImage(frame)
self.selectedRow = row self.selectedRow = row
Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix,
row) row)