Cleanups and ratio changes

This commit is contained in:
Tim Bentley 2010-07-24 17:55:06 +01:00
parent b76a946bff
commit 63b4696621
5 changed files with 164 additions and 107 deletions

View File

@ -174,13 +174,14 @@ def image_to_byte(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)
# use buffer to store pixmap into byteArray
buffie = QtCore.QBuffer(byte_array)
buffie.open(QtCore.QIODevice.WriteOnly)
if isinstance(image, QtGui.QImage):
pixmap = QtGui.QPixmap.fromImage(image)
else:
pixmap = QtGui.QPixmap(image)
pixmap.save(buffer, "PNG")
pixmap.save(buffie, "PNG")
#convert to base64 encoding so does not get missed!
return byte_array.toBase64()

View File

@ -40,6 +40,7 @@ HTMLSRC = u"""
%s
%s
%s
%s
</style>
<script language="javascript">
var t = null;
@ -74,6 +75,7 @@ HTMLSRC = u"""
<div id="footer" class="footer"></div>
<div id="alert"></div>
<video id="video"></video>
<blank id="blank"></blank>
%s
</body>
</html>
@ -83,11 +85,13 @@ def build_html(item, screen, alert):
height = screen[u'size'].height()
html = HTMLSRC % (build_video(width, height),
build_image(width, height),
build_lyrics(item, width, height),
build_footer(item, width, height),
build_alert(width, height, alert),
build_lyrics(item),
build_footer(item),
build_alert(width, alert),
build_image(width, height),
build_blank(width, height),
build_image_src(item.bg_frame))
print html
return html
def build_video(width, height):
@ -103,6 +107,18 @@ def build_video(width, height):
"""
return video % (width, height)
def build_blank(width, height):
blank = """
#blank {
position: absolute;
left: 0px;
top: 0px;
width: %spx
height: %spx;
z-index:10;
}
"""
return blank % (width, height)
def build_image(width, height):
image = """
@ -124,7 +140,7 @@ def build_image_src(image):
"""
return image_src % image_to_byte(image)
def build_lyrics(item, width, height):
def build_lyrics(item):
lyrics = """
#lyrics {position: absolute; %s z-index:3; %s; %s %s }
table {border=0;margin=0padding=0;}
@ -136,9 +152,10 @@ def build_lyrics(item, width, height):
font = u''
text = u''
if theme:
position = u' left: %spx; top: %spx; width: %spx; height: %spx; ' %\
(item.main.x(), item.main.y(), item.main.width(), item.main.height())
font = u' font-family %s; font-size: %spx;' %\
position = u' left: %spx; top: %spx; width: %spx; height: %spx; ' % \
(item.main.x(), item.main.y(), item.main.width(),
item.main.height())
font = u' font-family %s; font-size: %spx;' % \
(theme.font_main_name, theme.font_main_proportion)
align = u''
if theme.display_horizontalAlign == 2:
@ -153,7 +170,8 @@ def build_lyrics(item, width, height):
valign = u'vertical-align=bottom;'
text = u'color:%s; %s %s' % (theme.font_main_color, align, valign)
if theme.display_shadow and theme.display_outline:
fontworks = u'text-shadow: -%spx 0 %s, 0 %spx %s, %spx 0 %s, 0 -%spx %s, %spx %spx %spx %s' %\
fontworks = u'text-shadow: -%spx 0 %s, 0 %spx %s, %spx 0 %s, 0 ' \
'-%spx %s, %spx %spx %spx %s' % \
(theme.display_outline_size, theme.display_outline_color,
theme.display_outline_size, theme.display_outline_color,
theme.display_outline_size, theme.display_outline_color,
@ -161,11 +179,12 @@ def build_lyrics(item, width, height):
theme.display_shadow_size, theme.display_shadow_size,
theme.display_shadow_size, theme.display_shadow_color)
elif theme.display_shadow:
fontworks = u'text-shadow: %spx %spx %spx %s' %\
fontworks = u'text-shadow: %spx %spx %spx %s' % \
(theme.display_shadow_size, theme.display_shadow_size,
theme.display_shadow_size, theme.display_shadow_color)
elif theme.display_outline:
fontworks = u'text-shadow: -%spx 0 %s, 0 %spx %s, %spx 0 %s, 0 -%spx %s' %\
fontworks = u'text-shadow: -%spx 0 %s, 0 %spx %s,' \
' %spx 0 %s, 0 -%spx %s' % \
(theme.display_outline_size, theme.display_outline_color,
theme.display_outline_size, theme.display_outline_color,
theme.display_outline_size, theme.display_outline_color,
@ -174,7 +193,7 @@ def build_lyrics(item, width, height):
print lyrics_html
return lyrics_html
def build_footer(item, width, height):
def build_footer(item):
lyrics = """
#footer {position: absolute; %s z-index:3; %s; %s }
"""
@ -184,9 +203,10 @@ def build_footer(item, width, height):
font = u''
text = u''
if theme:
position = u' left: %spx; top: %spx; width: %spx; height: %spx; ' %\
(item.footer.x(), item.footer.y(), item.footer.width(), item.footer.height())
font = u' font-family %s; font-size: %spx;' %\
position = u' left: %spx; top: %spx; width: %spx; height: %spx; ' % \
(item.footer.x(), item.footer.y(), item.footer.width(),
item.footer.height())
font = u' font-family %s; font-size: %spx;' % \
(theme.font_footer_name, theme.font_footer_proportion)
align = u''
if theme.display_horizontalAlign == 2:
@ -205,7 +225,7 @@ def build_footer(item, width, height):
return lyrics_html
def build_alert(width, height, alert):
def build_alert(width, alert):
alert = """
#alert {
position: absolute;

View File

@ -36,18 +36,6 @@ log = logging.getLogger(__name__)
#http://www.steveheffernan.com/html5-video-player/demo-video-player.html
## QtCore.QObject.connect(Receiver.get_receiver(),
## QtCore.SIGNAL(u'maindisplay_hide'), self.hideDisplay)
## QtCore.QObject.connect(Receiver.get_receiver(),
## QtCore.SIGNAL(u'maindisplay_show'), self.showDisplay)
## QtCore.QObject.connect(Receiver.get_receiver(),
## QtCore.SIGNAL(u'videodisplay_start'), self.onStartVideo)
## QtCore.QObject.connect(Receiver.get_receiver(),
## QtCore.SIGNAL(u'videodisplay_stop'), self.onStopVideo)
## QtCore.QObject.connect(Receiver.get_receiver(),
## QtCore.SIGNAL(u'config_updated'), self.setup)
class DisplayWidget(QtGui.QGraphicsView):
"""
Customised version of QTableWidget which can respond to keyboard
@ -55,44 +43,44 @@ class DisplayWidget(QtGui.QGraphicsView):
"""
log.info(u'Display Widget loaded')
def __init__(self, live, parent=None, name=None):
def __init__(self, live, parent=None):
QtGui.QGraphicsView.__init__(self)
self.parent = parent
self.live = live
# 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'}
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):
# Key events only needed for live
if not self.live:
return
# 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()
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()
class MainDisplay(DisplayWidget):
@ -104,14 +92,18 @@ class MainDisplay(DisplayWidget):
self.setWindowTitle(u'OpenLP Display')
self.setWindowFlags(QtCore.Qt.FramelessWindowHint |
QtCore.Qt.WindowStaysOnTopHint)
self.currvideo = False
self.video1 = "c:\\users\\jonathan\\Desktop\\Wildlife.wmv"
self.video2 = "c:\\users\\jonathan\\Desktop\\movie.ogg"
self.currslide = False
self.slide1 = "<sup>[1:1]</sup> In the beginning God created the heavens and the earth.<br/><br/><sup> [1:2]</sup> 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.<br/><br/><sup>[1:3]</sup> And God said, \"Let there be light,\" and there was light.<br/><br/><sup>[1:4]</sup> God saw that the light was good, and he separated the light from the darkness.<br/><br/>"
self.slide2 = "<br /><br />This is the chorus<br />Blah Blah Blah<br />Blah Blah Blah<br />Blah Blah Blah<br />Blah Blah Blah<br />Blah Blah Blah"
self.alerttext = "<p>Red Alert! Raise Shields!</p>"
if self.isLive:
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'maindisplay_hide'), self.hideDisplay)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'maindisplay_show'), self.showDisplay)
## QtCore.QObject.connect(Receiver.get_receiver(),
## QtCore.SIGNAL(u'videodisplay_start'), self.onStartVideo)
## QtCore.QObject.connect(Receiver.get_receiver(),
## QtCore.SIGNAL(u'videodisplay_stop'), self.onStopVideo)
## QtCore.QObject.connect(Receiver.get_receiver(),
## QtCore.SIGNAL(u'config_updated'), self.setup)
def setup(self):
log.debug(u'Setup %s for %s ' % (
@ -130,6 +122,14 @@ class MainDisplay(DisplayWidget):
self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal,
QtCore.Qt.ScrollBarAlwaysOff)
if self.isLive:
# Build the initial frame.
self.black = QtGui.QImage(
self.screens.current[u'size'].width(),
self.screens.current[u'size'].height(),
QtGui.QImage.Format_ARGB32_Premultiplied)
painter_image = QtGui.QPainter()
painter_image.begin(self.black)
painter_image.fillRect(self.black.rect(), QtCore.Qt.black)
#Build the initial frame.
initialFrame = QtGui.QImage(
self.screens.current[u'size'].width(),
@ -147,6 +147,11 @@ class MainDisplay(DisplayWidget):
serviceItem.bg_frame = initialFrame
self.webView.setHtml(build_html(serviceItem, self.screen, None))
self.show()
# To display or not to display?
if not self.screen[u'primary']:
self.primary = False
else:
self.primary = True
def next(self):
if self.currslide:
@ -158,14 +163,33 @@ class MainDisplay(DisplayWidget):
self.currslide = not self.currslide
def text(self, slide):
"""
Add the slide text from slideController
`slide`
The slide text to be displayed
"""
print slide
self.frame.findFirstElement('div#lyrics').setInnerXml(slide)
return self.preview()
def alert(self):
"""
Add the alert text
`slide`
The slide text to be displayed
"""
self.frame.findFirstElement('div#alert').setInnerXml(self.alerttext)
def image(self, image):
"""
Add an image as the background. The image is converted to a
bytestream on route.
`Image`
The Image to be displayed can be QImage or QPixmap
"""
image = resize_image(image, self.screen[u'size'].width(),
self.screen[u'size'].height())
self.frame.evaluateJavaScript(
@ -180,14 +204,14 @@ class MainDisplay(DisplayWidget):
'src', unicode('data:image/png;base64,%s' % image_to_byte(self.serviceItem.bg_frame)))
def video(self, videoPath, noSound=False):
if self.currimage:
self.frame.findFirstElement('video').setAttribute('src', videoPath)
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
if noSound:
self.frame.evaluateJavaScript("document.getElementById('video').mute()")
def loaded(self):
self.loaded = True
@ -227,20 +251,20 @@ class MainDisplay(DisplayWidget):
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))
self.frame.findFirstElement('img').setAttribute(
'src', unicode('data:image/png;base64,%s' \
% image_to_byte(self.black)))
else:
if self.parent.renderManager.renderer.bg_frame:
if self.serviceItem:
self.displayBlank.setPixmap(QtGui.QPixmap.fromImage(
self.parent.renderManager.renderer.bg_frame))
else:
self.displayBlank.setPixmap(
QtGui.QPixmap.fromImage(self.blankFrame))
self.frame.findFirstElement('img').setAttribute(
'src', unicode('data:image/png;base64,%s' \
% image_to_byte(self.black)))
if mode != HideMode.Screen and self.isHidden():
self.setVisible(True)
@ -251,10 +275,10 @@ class MainDisplay(DisplayWidget):
Make the stored images None to release memory.
"""
log.debug(u'showDisplay')
self.displayBlank.setPixmap(self.transparent)
self.frame.findFirstElement('img').setAttribute('src', u'')
if self.isHidden():
self.setVisible(True)
#Trigger actions when display is active again
# Trigger actions when display is active again
Receiver.send_message(u'maindisplay_active')
class AudioPlayer(QtCore.QObject):

View File

@ -786,7 +786,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
their locations
"""
self.RenderManager.update_display()
#self.displayManager.setup()
self.setFocus()
self.activateWindow()

View File

@ -36,23 +36,23 @@ from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \
log = logging.getLogger(__name__)
class SlideThread(QtCore.QThread):
"""
A special Qt thread class to speed up the display of text based frames.
This is threaded so it loads the frames in background
"""
def __init__(self, parent, prefix, count):
QtCore.QThread.__init__(self, parent)
self.prefix = prefix
self.count = count
def run(self):
"""
Run the thread.
"""
time.sleep(1)
for i in range(0, self.count):
Receiver.send_message(u'%s_slide_cache' % self.prefix, i)
#class SlideThread(QtCore.QThread):
# """
# A special Qt thread class to speed up the display of text based frames.
# This is threaded so it loads the frames in background
# """
# def __init__(self, parent, prefix, count):
# QtCore.QThread.__init__(self, parent)
# self.prefix = prefix
# self.count = count
#
# def run(self):
# """
# Run the thread.
# """
# time.sleep(1)
# for i in range(0, self.count):
# Receiver.send_message(u'%s_slide_cache' % self.prefix, i)
class SlideList(QtGui.QTableWidget):
"""
@ -105,8 +105,9 @@ class SlideController(QtGui.QWidget):
self.isLive = isLive
self.parent = parent
self.screens = screens
self.ratio = float(self.screens.current[u'size'].width()) / \
float(self.screens.current[u'size'].height())
self.display = MainDisplay(self, screens, isLive)
#self.displayManager = self.parent.displayManager
self.loopList = [
u'Start Loop',
u'Loop Separator',
@ -322,7 +323,7 @@ class SlideController(QtGui.QWidget):
self.SlidePreview.setSizePolicy(sizePolicy)
self.SlidePreview.setFixedSize(
QtCore.QSize(self.settingsmanager.slidecontroller_image,
self.settingsmanager.slidecontroller_image / 1.3 ))
self.settingsmanager.slidecontroller_image / self.ratio ))
self.SlidePreview.setFrameShape(QtGui.QFrame.Box)
self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain)
self.SlidePreview.setLineWidth(1)
@ -389,9 +390,21 @@ class SlideController(QtGui.QWidget):
QtCore.SIGNAL(u'splitterMoved(int, int)'), self.trackSplitter)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'config_updated'), self.refreshServiceItem)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'%s_slide_cache' % self.typePrefix), self.slideCache)
def screenSizeChanged(self):
# rebuild display as screen size changed
self.display = MainDisplay(self, self.screens, self.isLive)
self.ratio = float(self.screens.current[u'size'].width()) / \
float(self.screens.current[u'size'].height())
self.display.setup()
self.SlidePreview.setFixedSize(
QtCore.QSize(self.settingsmanager.slidecontroller_image,
self.settingsmanager.slidecontroller_image / (self.ratio )))
def widthChanged(self):
"""
Handle changes of width from the splitter between the live and preview
@ -606,10 +619,10 @@ class SlideController(QtGui.QWidget):
self.PreviewListWidget.setFocus()
Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix,
[serviceItem])
if self.serviceItem.is_text():
st = SlideThread(
self, self.typePrefix, len(self.serviceItem.get_frames()))
st.start()
# if self.serviceItem.is_text():
# st = SlideThread(
# self, self.typePrefix, len(self.serviceItem.get_frames()))
# st.start()
log.log(15, u'Display Rendering took %4s' % (time.time() - before))
def onTextRequest(self):
@ -632,7 +645,7 @@ class SlideController(QtGui.QWidget):
Receiver.send_message(u'slidecontroller_%s_text_response'
% self.typePrefix, data)
#Screen event methods
# Screen event methods
def onSlideSelectedFirst(self):
"""
Go to the first slide.
@ -667,8 +680,8 @@ class SlideController(QtGui.QWidget):
Allow the main display to blank the main display at startup time
"""
log.debug(u'mainDisplaySetBackground')
if not self.mainDisplay.primary:
self.onBlankDisplay(True)
if not self.display.primary:
self.display.hideDisplay()
def onSlideBlank(self):
"""
@ -986,4 +999,4 @@ class SlideController(QtGui.QWidget):
text = text.replace(u'<br>', u'\n').replace(u'<p>', u'')\
.replace(u'</p>', u'').replace(u'<sup>', u'')\
.replace(u'</sup>', u'')
return text
return text