openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #11448
[Merge] lp:~trb143/openlp/features4 into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/features4 into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
Related bugs:
Bug #825812 in OpenLP: "SongUsage plugin should record printed songs, etc."
https://bugs.launchpad.net/openlp/+bug/825812
For more details, see:
https://code.launchpad.net/~trb143/openlp/features4/+merge/72324
Add ability to set colours around borders of images and in themes.
May not be to all tastes ;-)
--
https://code.launchpad.net/~trb143/openlp/features4/+merge/72324
Your team OpenLP Core is requested to review the proposed merge of lp:~trb143/openlp/features4 into lp:openlp.
=== modified file 'openlp/core/lib/__init__.py'
--- openlp/core/lib/__init__.py 2011-08-04 04:51:41 +0000
+++ openlp/core/lib/__init__.py 2011-08-21 05:49:23 +0000
@@ -137,7 +137,7 @@
# convert to base64 encoding so does not get missed!
return byte_array.toBase64()
-def resize_image(image_path, width, height, background=QtCore.Qt.black):
+def resize_image(image_path, width, height, background):
"""
Resize an image to fit on the current screen.
=== modified file 'openlp/core/lib/imagemanager.py'
--- openlp/core/lib/imagemanager.py 2011-07-07 15:37:43 +0000
+++ openlp/core/lib/imagemanager.py 2011-08-21 05:49:23 +0000
@@ -36,7 +36,7 @@
from PyQt4 import QtCore
-from openlp.core.lib import resize_image, image_to_byte
+from openlp.core.lib import resize_image, image_to_byte, Receiver
from openlp.core.ui import ScreenList
log = logging.getLogger(__name__)
@@ -100,12 +100,14 @@
variables ``image`` and ``image_bytes`` to ``None`` and add the image object
to the queue of images to process.
"""
- def __init__(self, name='', path=''):
+ def __init__(self, name, path, source, background):
self.name = name
self.path = path
self.image = None
self.image_bytes = None
self.priority = Priority.Normal
+ self.source = source
+ self.background = background
class PriorityQueue(Queue.PriorityQueue):
@@ -151,6 +153,8 @@
self._cache = {}
self._imageThread = ImageThread(self)
self._conversion_queue = PriorityQueue()
+ QtCore.QObject.connect(Receiver.get_receiver(),
+ QtCore.SIGNAL(u'config_updated'), self.process_updates)
def update_display(self):
"""
@@ -168,6 +172,43 @@
image.image = None
image.image_bytes = None
self._conversion_queue.put((image.priority, image))
+
+ def update_images(self, image_type, background):
+ """
+ Border has changed so update all the images affected.
+ """
+ log.debug(u'update_images')
+ # Mark the images as dirty for a rebuild by setting the image and byte
+ # stream to None.
+ self._conversion_queue = PriorityQueue()
+ for key, image in self._cache.iteritems():
+ if image.source == image_type:
+ image.background = background
+ image.priority = Priority.Normal
+ image.image = None
+ image.image_bytes = None
+ self._conversion_queue.put((image.priority, image))
+
+ def update_image(self, name, image_type, background):
+ """
+ Border has changed so update the image affected.
+ """
+ log.debug(u'update_images')
+ # Mark the images as dirty for a rebuild by setting the image and byte
+ # stream to None.
+ self._conversion_queue = PriorityQueue()
+ for key, image in self._cache.iteritems():
+ if image.source == image_type and image.name == name:
+ image.background = background
+ image.priority = Priority.Normal
+ image.image = None
+ image.image_bytes = None
+ self._conversion_queue.put((image.priority, image))
+
+ def process_updates(self):
+ """
+ Flush the queue to updated any data to update
+ """
# We want only one thread.
if not self._imageThread.isRunning():
self._imageThread.start()
@@ -215,13 +256,13 @@
self._conversion_queue.remove(self._cache[name])
del self._cache[name]
- def add_image(self, name, path):
+ def add_image(self, name, path, source, background):
"""
Add image to cache if it is not already there.
"""
log.debug(u'add_image %s:%s' % (name, path))
if not name in self._cache:
- image = Image(name, path)
+ image = Image(name, path, source, background)
self._cache[name] = image
self._conversion_queue.put((image.priority, image))
else:
@@ -247,7 +288,8 @@
image = self._conversion_queue.get()[1]
# Generate the QImage for the image.
if image.image is None:
- image.image = resize_image(image.path, self.width, self.height)
+ image.image = resize_image(image.path, self.width, self.height,
+ image.background)
# Set the priority to Lowest and stop here as we need to process
# more important images first.
if image.priority == Priority.Normal:
=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py 2011-08-05 08:47:31 +0000
+++ openlp/core/lib/renderer.py 2011-08-21 05:49:23 +0000
@@ -27,7 +27,7 @@
import logging
-from PyQt4 import QtCore, QtWebKit
+from PyQt4 import QtGui, QtCore, QtWebKit
from openlp.core.lib import ServiceItem, expand_tags, \
build_lyrics_format_css, build_lyrics_outline_css, Receiver, \
@@ -166,7 +166,8 @@
# if No file do not update cache
if self.theme_data.background_filename:
self.imageManager.add_image(self.theme_data.theme_name,
- self.theme_data.background_filename)
+ self.theme_data.background_filename, u'theme',
+ QtGui.QColor(self.theme_data.background_border_color))
return self._rect, self._rect_footer
def generate_preview(self, theme_data, force_page=False):
=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py 2011-07-18 13:24:58 +0000
+++ openlp/core/lib/serviceitem.py 2011-08-21 05:49:23 +0000
@@ -115,6 +115,7 @@
self.end_time = 0
self.media_length = 0
self.from_service = False
+ self.image_border = u'#000000'
self._new_item()
def _new_item(self):
@@ -195,7 +196,7 @@
self.foot_text = \
u'<br>'.join([footer for footer in self.raw_footer if footer])
- def add_from_image(self, path, title):
+ def add_from_image(self, path, title, background=None):
"""
Add an image slide to the service item.
@@ -205,9 +206,12 @@
``title``
A title for the slide in the service item.
"""
+ if background:
+ self.image_border = background
self.service_item_type = ServiceItemType.Image
self._raw_frames.append({u'title': title, u'path': path})
- self.renderer.imageManager.add_image(title, path)
+ self.renderer.imageManager.add_image(title, path, u'image',
+ self.image_border)
self._new_item()
def add_from_text(self, title, raw_slide, verse_tag=None):
=== modified file 'openlp/core/lib/theme.py'
--- openlp/core/lib/theme.py 2011-07-07 18:03:12 +0000
+++ openlp/core/lib/theme.py 2011-08-21 05:49:23 +0000
@@ -44,6 +44,7 @@
<name> </name>
<background type="image">
<filename></filename>
+ <borderColor>#000000</borderColor>
</background>
<background type="gradient">
<startColor>#000000</startColor>
@@ -282,7 +283,7 @@
# Create direction element
self.child_element(background, u'direction', unicode(direction))
- def add_background_image(self, filename):
+ def add_background_image(self, filename, borderColor):
"""
Add a image background.
@@ -294,6 +295,8 @@
self.theme.appendChild(background)
# Create Filename element
self.child_element(background, u'filename', filename)
+ # Create endColor element
+ self.child_element(background, u'borderColor', unicode(borderColor))
def add_font(self, name, color, size, override, fonttype=u'main',
bold=u'False', italics=u'False', line_adjustment=0,
@@ -597,7 +600,7 @@
self.background_direction)
else:
filename = os.path.split(self.background_filename)[1]
- self.add_background_image(filename)
+ self.add_background_image(filename, self.background_border_color)
self.add_font(self.font_main_name,
self.font_main_color,
self.font_main_size,
=== modified file 'openlp/core/ui/printserviceform.py'
--- openlp/core/ui/printserviceform.py 2011-08-14 13:05:39 +0000
+++ openlp/core/ui/printserviceform.py 2011-08-21 05:49:23 +0000
@@ -31,7 +31,7 @@
from PyQt4 import QtCore, QtGui
from lxml import html
-from openlp.core.lib import translate, get_text_file_string
+from openlp.core.lib import translate, get_text_file_string, Receiver
from openlp.core.lib.ui import UiStrings
from openlp.core.ui.printservicedialog import Ui_PrintServiceDialog, ZoomSize
from openlp.core.utils import AppLocation
@@ -188,6 +188,9 @@
html_data.body, classId=u'serviceTitle')
for index, item in enumerate(self.serviceManager.serviceItems):
self._addPreviewItem(html_data.body, item[u'service_item'], index)
+ # Trigger Audit requests
+ Receiver.send_message(u'print_service_started',
+ [item[u'service_item']])
# Add the custom service notes:
if self.footerTextEdit.toPlainText():
div = self._addElement(u'div', parent=html_data.body,
=== modified file 'openlp/core/ui/themeform.py'
--- openlp/core/ui/themeform.py 2011-06-12 16:02:52 +0000
+++ openlp/core/ui/themeform.py 2011-08-21 05:49:23 +0000
@@ -66,6 +66,8 @@
self.onGradientComboBoxCurrentIndexChanged)
QtCore.QObject.connect(self.colorButton,
QtCore.SIGNAL(u'clicked()'), self.onColorButtonClicked)
+ QtCore.QObject.connect(self.imageColorButton,
+ QtCore.SIGNAL(u'clicked()'), self.onImageColorButtonClicked)
QtCore.QObject.connect(self.gradientStartButton,
QtCore.SIGNAL(u'clicked()'), self.onGradientStartButtonClicked)
QtCore.QObject.connect(self.gradientEndButton,
@@ -330,6 +332,8 @@
self.theme.background_end_color)
self.setField(u'background_type', QtCore.QVariant(1))
else:
+ self.imageColorButton.setStyleSheet(u'background-color: %s' %
+ self.theme.background_border_color)
self.imageFileEdit.setText(self.theme.background_filename)
self.setField(u'background_type', QtCore.QVariant(2))
if self.theme.background_direction == \
@@ -464,6 +468,14 @@
self._colorButton(self.theme.background_color)
self.setBackgroundPageValues()
+ def onImageColorButtonClicked(self):
+ """
+ Background / Gradient 1 Color button pushed.
+ """
+ self.theme.background_border_color = \
+ self._colorButton(self.theme.background_border_color)
+ self.setBackgroundPageValues()
+
def onGradientStartButtonClicked(self):
"""
Gradient 2 Color button pushed.
@@ -564,7 +576,7 @@
def accept(self):
"""
- Lets save the them as Finish has been pressed
+ Lets save the theme as Finish has been pressed
"""
# Save the theme name
self.theme.theme_name = unicode(self.field(u'name').toString())
=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py 2011-07-01 08:26:26 +0000
+++ openlp/core/ui/thememanager.py 2011-08-21 05:49:23 +0000
@@ -610,6 +610,11 @@
and to trigger the reload of the theme list
"""
self._writeTheme(theme, imageFrom, imageTo)
+ if theme.background_type == \
+ BackgroundType.to_string(BackgroundType.Image):
+ self.mainwindow.imageManager.update_image(theme.theme_name,
+ u'theme', QtGui.QColor(theme.background_border_color))
+ self.mainwindow.imageManager.process_updates()
self.loadThemes()
def _writeTheme(self, theme, imageFrom, imageTo):
=== modified file 'openlp/core/ui/themewizard.py'
--- openlp/core/ui/themewizard.py 2011-06-12 16:02:52 +0000
+++ openlp/core/ui/themewizard.py 2011-08-21 05:49:23 +0000
@@ -105,6 +105,11 @@
self.imageLayout = QtGui.QFormLayout(self.imageWidget)
self.imageLayout.setMargin(0)
self.imageLayout.setObjectName(u'ImageLayout')
+ self.imageColorLabel = QtGui.QLabel(self.colorWidget)
+ self.imageColorLabel.setObjectName(u'ImageColorLabel')
+ self.imageColorButton = QtGui.QPushButton(self.colorWidget)
+ self.imageColorButton.setObjectName(u'ImageColorButton')
+ self.imageLayout.addRow(self.imageColorLabel, self.imageColorButton)
self.imageLabel = QtGui.QLabel(self.imageWidget)
self.imageLabel.setObjectName(u'ImageLabel')
self.imageFileLayout = QtGui.QHBoxLayout()
@@ -118,7 +123,7 @@
build_icon(u':/general/general_open.png'))
self.imageFileLayout.addWidget(self.imageBrowseButton)
self.imageLayout.addRow(self.imageLabel, self.imageFileLayout)
- self.imageLayout.setItem(1, QtGui.QFormLayout.LabelRole, self.spacer)
+ self.imageLayout.setItem(2, QtGui.QFormLayout.LabelRole, self.spacer)
self.backgroundStack.addWidget(self.imageWidget)
self.backgroundLayout.addLayout(self.backgroundStack)
themeWizard.addPage(self.backgroundPage)
@@ -443,6 +448,8 @@
translate('OpenLP.ThemeWizard', 'Top Left - Bottom Right'))
self.gradientComboBox.setItemText(BackgroundGradientType.LeftBottom,
translate('OpenLP.ThemeWizard', 'Bottom Left - Top Right'))
+ self.imageColorLabel.setText(
+ translate(u'OpenLP.ThemeWizard', 'Border color:'))
self.imageLabel.setText(u'%s:' % UiStrings().Image)
self.mainAreaPage.setTitle(
translate('OpenLP.ThemeWizard', 'Main Area Font Details'))
=== modified file 'openlp/plugins/images/imageplugin.py'
--- openlp/plugins/images/imageplugin.py 2011-07-23 21:29:24 +0000
+++ openlp/plugins/images/imageplugin.py 2011-08-21 05:49:23 +0000
@@ -25,10 +25,13 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
+from PyQt4 import QtCore, QtGui
+
import logging
-from openlp.core.lib import Plugin, StringContent, build_icon, translate
-from openlp.plugins.images.lib import ImageMediaItem
+from openlp.core.lib import Plugin, StringContent, build_icon, translate, \
+ Receiver
+from openlp.plugins.images.lib import ImageMediaItem, ImageTab
log = logging.getLogger(__name__)
@@ -36,10 +39,13 @@
log.info(u'Image Plugin loaded')
def __init__(self, plugin_helpers):
- Plugin.__init__(self, u'images', plugin_helpers, ImageMediaItem)
+ Plugin.__init__(self, u'images', plugin_helpers, ImageMediaItem,
+ ImageTab)
self.weight = -7
self.icon_path = u':/plugins/plugin_images.png'
self.icon = build_icon(self.icon_path)
+ QtCore.QObject.connect(Receiver.get_receiver(),
+ QtCore.SIGNAL(u'image_updated'), self.image_updated)
def about(self):
about_text = translate('ImagePlugin', '<strong>Image Plugin</strong>'
@@ -81,3 +87,13 @@
'Add the selected image to the service.')
}
self.setPluginUiTextStrings(tooltips)
+
+ def image_updated(self):
+ """
+ Triggered by saving and changing the image border. Sets the images in
+ image manager to require updates. Actual update is triggered by the
+ last part of saving the config.
+ """
+ background = QtGui.QColor(QtCore.QSettings().value(self.settingsSection
+ + u'/background color', QtCore.QVariant(u'#000000')))
+ self.liveController.imageManager.update_images(u'image', background)
=== modified file 'openlp/plugins/images/lib/__init__.py'
--- openlp/plugins/images/lib/__init__.py 2011-06-12 16:02:52 +0000
+++ openlp/plugins/images/lib/__init__.py 2011-08-21 05:49:23 +0000
@@ -26,3 +26,4 @@
###############################################################################
from mediaitem import ImageMediaItem
+from imagetab import ImageTab
=== added file 'openlp/plugins/images/lib/imagetab.py'
--- openlp/plugins/images/lib/imagetab.py 1970-01-01 00:00:00 +0000
+++ openlp/plugins/images/lib/imagetab.py 2011-08-21 05:49:23 +0000
@@ -0,0 +1,99 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2011 Raoul Snyman #
+# Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan #
+# Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, #
+# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias #
+# Põldaru, Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
+# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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
+from openlp.core.lib.ui import UiStrings, create_valign_combo
+
+class ImageTab(SettingsTab):
+ """
+ ImageTab is the images settings tab in the settings dialog.
+ """
+ def __init__(self, parent, name, visible_title, icon_path):
+ SettingsTab.__init__(self, parent, name, visible_title, icon_path)
+
+ def setupUi(self):
+ self.setObjectName(u'ImagesTab')
+ SettingsTab.setupUi(self)
+ self.fontGroupBox = QtGui.QGroupBox(self.leftColumn)
+ self.fontGroupBox.setObjectName(u'FontGroupBox')
+ self.formLayout = QtGui.QFormLayout(self.fontGroupBox)
+ self.formLayout.setObjectName(u'FormLayout')
+ self.colorLayout = QtGui.QHBoxLayout()
+ self.backgroundColorLabel = QtGui.QLabel(self.fontGroupBox)
+ self.backgroundColorLabel.setObjectName(u'BackgroundColorLabel')
+ self.colorLayout.addWidget(self.backgroundColorLabel)
+ self.backgroundColorButton = QtGui.QPushButton(self.fontGroupBox)
+ self.backgroundColorButton.setObjectName(u'BackgroundColorButton')
+ self.colorLayout.addWidget(self.backgroundColorButton)
+ self.formLayout.addRow(self.colorLayout)
+ self.informationLabel = QtGui.QLabel(self.fontGroupBox)
+ self.informationLabel.setObjectName(u'InformationLabel')
+ self.formLayout.addRow(self.informationLabel)
+ self.leftLayout.addWidget(self.fontGroupBox)
+ self.leftLayout.addStretch()
+ self.rightLayout.addStretch()
+ # Signals and slots
+ QtCore.QObject.connect(self.backgroundColorButton,
+ QtCore.SIGNAL(u'pressed()'), self.onbackgroundColorButtonClicked)
+
+ def retranslateUi(self):
+ self.fontGroupBox.setTitle(
+ translate('ImagesPlugin.ImageTab', 'Background Font'))
+ self.backgroundColorLabel.setText(
+ translate('ImagesPlugin.ImageTab', 'Background color:'))
+ self.informationLabel.setText(
+ translate('ImagesPlugin.ImageTab', 'Provides border where image '
+ 'is not the correct dimensions for the screen when resized.'))
+
+ def onbackgroundColorButtonClicked(self):
+ new_color = QtGui.QColorDialog.getColor(
+ QtGui.QColor(self.bg_color), self)
+ if new_color.isValid():
+ self.bg_color = new_color.name()
+ self.backgroundColorButton.setStyleSheet(
+ u'background-color: %s' % self.bg_color)
+
+ def load(self):
+ settings = QtCore.QSettings()
+ settings.beginGroup(self.settingsSection)
+ self.bg_color = unicode(settings.value(
+ u'background color', QtCore.QVariant(u'#000000')).toString())
+ self.initial_color = self.bg_color
+ settings.endGroup()
+ self.backgroundColorButton.setStyleSheet(
+ u'background-color: %s' % self.bg_color)
+
+ def save(self):
+ settings = QtCore.QSettings()
+ settings.beginGroup(self.settingsSection)
+ settings.setValue(u'background color', QtCore.QVariant(self.bg_color))
+ settings.endGroup()
+ if self.initial_color != self.bg_color:
+ Receiver.send_message(u'image_updated')
+
=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py 2011-08-02 05:07:09 +0000
+++ openlp/plugins/images/lib/mediaitem.py 2011-08-21 05:49:23 +0000
@@ -140,6 +140,8 @@
self.plugin.formparent.finishedProgressBar()
def generateSlideData(self, service_item, item=None, xmlVersion=False):
+ background = QtGui.QColor(QtCore.QSettings().value(self.settingsSection
+ + u'/background color', QtCore.QVariant(u'#000000')))
if item:
items = [item]
else:
@@ -183,7 +185,7 @@
for bitem in items:
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
(path, name) = os.path.split(filename)
- service_item.add_from_image(filename, name)
+ service_item.add_from_image(filename, name, background)
return True
def onResetClick(self):
=== modified file 'openlp/plugins/songusage/songusageplugin.py'
--- openlp/plugins/songusage/songusageplugin.py 2011-08-16 19:53:52 +0000
+++ openlp/plugins/songusage/songusageplugin.py 2011-08-21 05:49:23 +0000
@@ -122,6 +122,9 @@
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'slidecontroller_live_started'),
self.onReceiveSongUsage)
+ QtCore.QObject.connect(Receiver.get_receiver(),
+ QtCore.SIGNAL(u'print_service_started'),
+ self.onReceiveSongUsage)
self.songUsageActive = QtCore.QSettings().value(
self.settingsSection + u'/active',
QtCore.QVariant(False)).toBool()
Follow ups