openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #04074
[Merge] lp:~j-corwin/openlp/render into lp:openlp
Jonathan Corwin has proposed merging lp:~j-corwin/openlp/render into lp:openlp.
Requested reviews:
Tim Bentley (trb143)
Related bugs:
#616955 Theme Footer position in regard to its font size
https://bugs.launchpad.net/bugs/616955
#630233 Bars at the top and bottom of the projection screen show desktop
https://bugs.launchpad.net/bugs/630233
#633524 Song footer cannot be left aligned/justified when the lyrics aren't horizontally aligned to the left
https://bugs.launchpad.net/bugs/633524
#633527 Footer text wraps off the screen
https://bugs.launchpad.net/bugs/633527
1. Option to use Phonon for video instead of webkit
2. Fix blank to image
--
https://code.launchpad.net/~j-corwin/openlp/render/+merge/38016
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/core/lib/htmlbuilder.py'
--- openlp/core/lib/htmlbuilder.py 2010-09-27 18:34:40 +0000
+++ openlp/core/lib/htmlbuilder.py 2010-10-08 20:48:46 +0000
@@ -55,14 +55,17 @@
background-color: black;
display: none;
}
+#bgimage {
+ z-index:1;
+}
#image {
- z-index:1;
+ z-index:2;
}
#video1 {
- z-index:2;
+ z-index:3;
}
#video2 {
- z-index:2;
+ z-index:3;
}
#alert {
position: absolute;
@@ -73,7 +76,7 @@
}
#footer {
position: absolute;
- z-index:5;
+ z-index:6;
%s
}
/* lyric css */
@@ -112,7 +115,7 @@
vid2.volume = volume;
}
switch(state){
- case 'init':
+ case 'init':
vid.src = path;
vid2.src = path;
if(loop == null) loop = false;
@@ -294,7 +297,8 @@
</script>
</head>
<body>
-<img id="image" class="size" %s />
+<img id="bgimage" class="size" %s />
+<img id="image" class="size" style="display:none" />
<video id="video1" class="size" style="visibility:hidden" autobuffer preload>
</video>
<video id="video2" class="size" style="visibility:hidden" autobuffer preload>
@@ -397,7 +401,7 @@
"""
style = """
.lyricstable {
- z-index:4;
+ z-index:5;
position: absolute;
display: table;
%s
=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py 2010-10-07 17:52:40 +0000
+++ openlp/core/lib/serviceitem.py 2010-10-08 20:48:46 +0000
@@ -155,15 +155,15 @@
line_break = True
if self.is_capable(ItemCapabilities.NoLineBreaks):
line_break = False
+ theme = None
+ if self.theme:
+ theme = self.theme
+ self.main, self.footer = \
+ self.render_manager.set_override_theme(theme, useOverride)
+ self.bg_image_bytes = self.render_manager.renderer.bg_image_bytes
+ self.themedata = self.render_manager.renderer._theme
if self.service_item_type == ServiceItemType.Text:
log.debug(u'Formatting slides')
- theme = None
- if self.theme:
- theme = self.theme
- self.main, self.footer = \
- self.render_manager.set_override_theme(theme, useOverride)
- self.bg_image_bytes = self.render_manager.renderer.bg_image_bytes
- self.themedata = self.render_manager.renderer._theme
for slide in self._raw_frames:
before = time.time()
formatted = self.render_manager \
@@ -176,7 +176,6 @@
u'verseTag': slide[u'verseTag'] })
log.log(15, u'Formatting took %4s' % (time.time() - before))
elif self.service_item_type == ServiceItemType.Image:
- self.themedata = self.render_manager.global_theme_data
for slide in self._raw_frames:
slide[u'image'] = resize_image(slide[u'image'],
self.render_manager.width, self.render_manager.height)
=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py 2010-09-30 05:04:43 +0000
+++ openlp/core/ui/maindisplay.py 2010-10-08 20:48:46 +0000
@@ -114,21 +114,23 @@
"""
log.debug(u'Setup live = %s for %s ' % (self.isLive,
self.screens.monitor_number))
+ self.usePhonon = QtCore.QSettings().value(
+ u'media/use phonon', QtCore.QVariant(True)).toBool()
+ self.phononActive = False
self.screen = self.screens.current
self.setVisible(False)
self.setGeometry(self.screen[u'size'])
- try:
- self.webView = QtWebKit.QGraphicsWebView()
- self.scene = QtGui.QGraphicsScene(self)
- self.setScene(self.scene)
- self.scene.addItem(self.webView)
- self.webView.setGeometry(QtCore.QRectF(0, 0,
- self.screen[u'size'].width(), self.screen[u'size'].height()))
- except AttributeError:
- # QGraphicsWebView a recent addition, so fall back to QWebView
- self.webView = QtWebKit.QWebView(self)
- self.webView.setGeometry(0, 0,
- self.screen[u'size'].width(), self.screen[u'size'].height())
+ self.videoWidget = Phonon.VideoWidget(self)
+ self.videoWidget.setVisible(False)
+ self.videoWidget.setGeometry(QtCore.QRect(0, 0,
+ self.screen[u'size'].width(), self.screen[u'size'].height()))
+ self.mediaObject = Phonon.MediaObject(self)
+ self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self.mediaObject)
+ Phonon.createPath(self.mediaObject, self.videoWidget)
+ Phonon.createPath(self.mediaObject, self.audio)
+ 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()
QtCore.QObject.connect(self.webView,
@@ -199,7 +201,7 @@
"""
log.debug(u'alert')
if self.height() != self.screen[u'size'].height() \
- or not self.isVisible():
+ or not self.isVisible() or self.videoWidget.isVisible():
shrink = True
else:
shrink = False
@@ -208,12 +210,17 @@
u'top' if shrink else u'')
height = self.frame.evaluateJavaScript(js)
if shrink:
+ if self.phononActive:
+ shrinkItem = self.webView
+ else:
+ shrinkItem = self
if text:
- self.resize(self.width(), int(height.toString()))
- self.setVisible(True)
+ shrinkItem.resize(self.width(), int(height.toString()))
+ shrinkItem.setVisible(True)
else:
- self.setGeometry(self.screen[u'size'])
- self.setVisible(False)
+ shrinkItem.setVisible(False)
+ shrinkItem.resize(self.screen[u'size'].width(),
+ self.screen[u'size'].height())
def image(self, image):
"""
@@ -259,14 +266,24 @@
Used after Video plugin has changed the background
"""
log.debug(u'resetVideo')
- self.frame.evaluateJavaScript(u'show_video("close");')
+ if self.phononActive:
+ self.mediaObject.stop()
+ self.mediaObject.clearQueue()
+ self.webView.setVisible(True)
+ self.videoWidget.setVisible(False)
+ self.phononActive = False
+ else:
+ self.frame.evaluateJavaScript(u'show_video("close");')
def videoPlay(self):
"""
Responds to the request to play a loaded video
"""
log.debug(u'videoPlay')
- self.frame.evaluateJavaScript(u'show_video("play");')
+ if self.phononActive:
+ self.mediaObject.play()
+ else:
+ self.frame.evaluateJavaScript(u'show_video("play");')
# show screen
if self.isLive:
self.setVisible(True)
@@ -276,32 +293,54 @@
Responds to the request to pause a loaded video
"""
log.debug(u'videoPause')
- self.frame.evaluateJavaScript(u'show_video("pause");')
+ if self.phononActive:
+ self.mediaObject.pause()
+ else:
+ self.frame.evaluateJavaScript(u'show_video("pause");')
def videoStop(self):
"""
Responds to the request to stop a loaded video
"""
log.debug(u'videoStop')
- self.frame.evaluateJavaScript(u'show_video("stop");')
+ if self.phononActive:
+ self.mediaObject.stop()
+ else:
+ self.frame.evaluateJavaScript(u'show_video("stop");')
def videoVolume(self, volume):
"""
Changes the volume of a running video
"""
log.debug(u'videoVolume %d' % volume)
- self.frame.evaluateJavaScript(u'show_video(null, null, %s);' %
- str(float(volume)/float(10)))
+ vol = float(volume)/float(10)
+ if self.phononActive:
+ self.audio.setVolume(vol)
+ else:
+ self.frame.evaluateJavaScript(u'show_video(null, null, %s);' %
+ str(vol))
- def video(self, videoPath, volume):
+ def video(self, videoPath, volume, isBackground=False):
"""
Loads and starts a video to run with the option of sound
"""
log.debug(u'video')
self.loaded = True
- js = u'show_video("init", "%s", %s, true); show_video("play");' % \
- (videoPath.replace(u'\\', u'\\\\'), str(float(volume)/float(10)))
- self.frame.evaluateJavaScript(js)
+ vol = float(volume)/float(10)
+ if isBackground or not self.usePhonon:
+ js = u'show_video("init", "%s", %s, true); show_video("play");' % \
+ (videoPath.replace(u'\\', u'\\\\'), \
+ str(vol))
+ self.frame.evaluateJavaScript(js)
+ else:
+ self.phononActive = True
+ self.mediaObject.stop()
+ self.mediaObject.clearQueue()
+ self.mediaObject.setCurrentSource(Phonon.MediaSource(videoPath))
+ self.mediaObject.play()
+ self.webView.setVisible(False)
+ self.videoWidget.setVisible(True)
+ self.audio.setVolume(vol)
return self.preview()
def isLoaded(self):
@@ -382,6 +421,8 @@
Store the images so they can be replaced when required
"""
log.debug(u'hideDisplay mode = %d', mode)
+ if self.phononActive:
+ self.videoPause()
if mode == HideMode.Screen:
self.frame.evaluateJavaScript(u'show_blank("desktop");')
self.setVisible(False)
@@ -389,8 +430,11 @@
self.frame.evaluateJavaScript(u'show_blank("black");')
else:
self.frame.evaluateJavaScript(u'show_blank("theme");')
- if mode != HideMode.Screen and self.isHidden():
- self.setVisible(True)
+ if mode != HideMode.Screen:
+ if self.isHidden():
+ self.setVisible(True)
+ if self.phononActive:
+ self.webView.setVisible(True)
self.hide_mode = mode
def showDisplay(self):
@@ -403,6 +447,9 @@
self.frame.evaluateJavaScript('show_blank("show");')
if self.isHidden():
self.setVisible(True)
+ if self.phononActive:
+ self.webView.setVisible(False)
+ self.videoPlay()
# Trigger actions when display is active again
Receiver.send_message(u'maindisplay_active')
self.hide_mode = None
@@ -484,3 +531,4 @@
"""
log.debug(u'AudioPlayer Reached end of media playlist')
self.mediaObject.clearQueue()
+
=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py 2010-09-30 05:04:43 +0000
+++ openlp/core/ui/slidecontroller.py 2010-10-08 20:48:46 +0000
@@ -543,7 +543,7 @@
Receiver.send_message(u'%s_stop' %
self.serviceItem.name.lower(), [serviceItem, self.isLive])
if self.serviceItem.is_media():
- self.onMediaStop()
+ self.onMediaClose()
if self.isLive:
blanked = self.BlankScreen.isChecked()
else:
@@ -931,14 +931,13 @@
Respond to the arrival of a media service item
"""
log.debug(u'SlideController onMediaStart')
+ file = os.path.join(item.get_frame_path(), item.get_frame_title())
if self.isLive:
- file = os.path.join(item.get_frame_path(), item.get_frame_title())
self.display.video(file, self.volume)
self.volumeSlider.setValue(self.volume)
else:
self.mediaObject.stop()
self.mediaObject.clearQueue()
- file = os.path.join(item.get_frame_path(), item.get_frame_title())
self.mediaObject.setCurrentSource(Phonon.MediaSource(file))
self.seekSlider.setMediaObject(self.mediaObject)
self.seekSlider.show()
@@ -986,3 +985,18 @@
self.video.hide()
self.SlidePreview.clear()
self.SlidePreview.show()
+
+ def onMediaClose(self):
+ """
+ Respond to a request to close the Video
+ """
+ log.debug(u'SlideController onMediaStop')
+ if self.isLive:
+ self.display.resetVideo()
+ else:
+ self.mediaObject.stop()
+ self.mediaObject.clearQueue()
+ self.video.hide()
+ self.SlidePreview.clear()
+ self.SlidePreview.show()
+
=== modified file 'openlp/plugins/media/lib/__init__.py'
--- openlp/plugins/media/lib/__init__.py 2010-09-14 18:18:47 +0000
+++ openlp/plugins/media/lib/__init__.py 2010-10-08 20:48:46 +0000
@@ -25,5 +25,6 @@
###############################################################################
from mediaitem import MediaMediaItem
+from mediatab import MediaTab
__all__ = ['MediaMediaItem']
=== modified file 'openlp/plugins/media/lib/mediaitem.py'
--- openlp/plugins/media/lib/mediaitem.py 2010-09-27 18:15:55 +0000
+++ openlp/plugins/media/lib/mediaitem.py 2010-10-08 20:48:46 +0000
@@ -113,7 +113,7 @@
'You must select a media file to replace the background with.')):
item = self.listView.currentItem()
filename = unicode(item.data(QtCore.Qt.UserRole).toString())
- self.parent.liveController.display.video(filename, 0)
+ self.parent.liveController.display.video(filename, 0, True)
self.resetButton.setVisible(True)
def generateSlideData(self, service_item, item=None):
=== added file 'openlp/plugins/media/lib/mediatab.py'
--- openlp/plugins/media/lib/mediatab.py 1970-01-01 00:00:00 +0000
+++ openlp/plugins/media/lib/mediatab.py 2010-10-08 20:48:46 +0000
@@ -0,0 +1,84 @@
+# -*- 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, Meinert Jordan, Andreas Preikschat, Christian #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
+# Carsten Tinggaard, Frode Woldsund #
+# --------------------------------------------------------------------------- #
+# 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 PyQt4 import QtCore, QtGui
+
+from openlp.core.lib import SettingsTab, translate, Receiver
+
+class MediaTab(SettingsTab):
+ """
+ MediaTab is the Media settings tab in the settings dialog.
+ """
+ def __init__(self, title):
+ SettingsTab.__init__(self, title)
+
+ def setupUi(self):
+ self.setObjectName(u'MediaTab')
+ self.tabTitleVisible = translate('MediaPlugin.MediaTab', 'Media')
+ self.mediaLayout = QtGui.QFormLayout(self)
+ self.mediaLayout.setSpacing(8)
+ self.mediaLayout.setMargin(8)
+ self.mediaLayout.setObjectName(u'mediaLayout')
+ self.mediaModeGroupBox = QtGui.QGroupBox(self)
+ self.mediaModeGroupBox.setObjectName(u'mediaModeGroupBox')
+ self.mediaModeLayout = QtGui.QVBoxLayout(self.mediaModeGroupBox)
+ self.mediaModeLayout.setSpacing(8)
+ self.mediaModeLayout.setMargin(8)
+ self.mediaModeLayout.setObjectName(u'mediaModeLayout')
+ self.usePhononCheckBox = QtGui.QCheckBox(self.mediaModeGroupBox)
+ self.usePhononCheckBox.setObjectName(u'usePhononCheckBox')
+ self.mediaModeLayout.addWidget(self.usePhononCheckBox)
+ self.mediaLayout.setWidget(
+ 0, QtGui.QFormLayout.LabelRole, self.mediaModeGroupBox)
+ QtCore.QObject.connect(self.usePhononCheckBox,
+ QtCore.SIGNAL(u'stateChanged(int)'),
+ self.onUsePhononCheckBoxChanged)
+
+ def retranslateUi(self):
+ self.mediaModeGroupBox.setTitle(translate('MediaPlugin.MediaTab',
+ 'Media Display'))
+ self.usePhononCheckBox.setText(
+ translate('MediaPlugin.MediaTab', 'Use Phonon for video playback'))
+
+ def onUsePhononCheckBoxChanged(self, check_state):
+ self.usePhonon = (check_state == QtCore.Qt.Checked)
+ self.usePhononChanged = True
+
+ def load(self):
+ self.usePhonon = QtCore.QSettings().value(
+ self.settingsSection + u'/use phonon',
+ QtCore.QVariant(True)).toBool()
+ self.usePhononCheckBox.setChecked(self.usePhonon)
+
+ def save(self):
+ oldUsePhonon = QtCore.QSettings().value(
+ u'media/use phonon', QtCore.QVariant(True)).toBool()
+ if oldUsePhonon != self.usePhonon:
+ QtCore.QSettings().setValue(self.settingsSection + u'/use phonon',
+ QtCore.QVariant(self.usePhonon))
+ Receiver.send_message(u'config_screen_changed')
+
+
=== modified file 'openlp/plugins/media/mediaplugin.py'
--- openlp/plugins/media/mediaplugin.py 2010-10-05 16:09:48 +0000
+++ openlp/plugins/media/mediaplugin.py 2010-10-08 20:48:46 +0000
@@ -29,7 +29,7 @@
from PyQt4.phonon import Phonon
from openlp.core.lib import Plugin, StringContent, build_icon, translate
-from openlp.plugins.media.lib import MediaMediaItem
+from openlp.plugins.media.lib import MediaMediaItem, MediaTab
log = logging.getLogger(__name__)
@@ -68,6 +68,9 @@
type = u''
return list, type
+ def getSettingsTab(self):
+ return MediaTab(self.name)
+
def getMediaManagerItem(self):
# Create the MediaManagerItem object
return MediaMediaItem(self, self, self.icon)
@@ -132,4 +135,4 @@
u'title': translate('MediaPlugin', 'Service'),
u'tooltip': translate('MediaPlugin',
'Add the selected Media to the service')
- }
\ No newline at end of file
+ }
Follow ups