← Back to team overview

openlp-core team mailing list archive

[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