forked from openlp/openlp
Add ability to set colours around borders of images and in themes.
May not be to all tastes ;-) bzr-revno: 1722
This commit is contained in:
commit
dec8ce3a8d
@ -137,7 +137,7 @@ def image_to_byte(image):
|
|||||||
# convert to base64 encoding so does not get missed!
|
# convert to base64 encoding so does not get missed!
|
||||||
return byte_array.toBase64()
|
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.
|
Resize an image to fit on the current screen.
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ import Queue
|
|||||||
|
|
||||||
from PyQt4 import QtCore
|
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
|
from openlp.core.ui import ScreenList
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -100,12 +100,14 @@ class Image(object):
|
|||||||
variables ``image`` and ``image_bytes`` to ``None`` and add the image object
|
variables ``image`` and ``image_bytes`` to ``None`` and add the image object
|
||||||
to the queue of images to process.
|
to the queue of images to process.
|
||||||
"""
|
"""
|
||||||
def __init__(self, name='', path=''):
|
def __init__(self, name, path, source, background):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.path = path
|
self.path = path
|
||||||
self.image = None
|
self.image = None
|
||||||
self.image_bytes = None
|
self.image_bytes = None
|
||||||
self.priority = Priority.Normal
|
self.priority = Priority.Normal
|
||||||
|
self.source = source
|
||||||
|
self.background = background
|
||||||
|
|
||||||
|
|
||||||
class PriorityQueue(Queue.PriorityQueue):
|
class PriorityQueue(Queue.PriorityQueue):
|
||||||
@ -151,6 +153,8 @@ class ImageManager(QtCore.QObject):
|
|||||||
self._cache = {}
|
self._cache = {}
|
||||||
self._imageThread = ImageThread(self)
|
self._imageThread = ImageThread(self)
|
||||||
self._conversion_queue = PriorityQueue()
|
self._conversion_queue = PriorityQueue()
|
||||||
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
|
QtCore.SIGNAL(u'config_updated'), self.process_updates)
|
||||||
|
|
||||||
def update_display(self):
|
def update_display(self):
|
||||||
"""
|
"""
|
||||||
@ -162,12 +166,42 @@ class ImageManager(QtCore.QObject):
|
|||||||
self.height = current_screen[u'size'].height()
|
self.height = current_screen[u'size'].height()
|
||||||
# Mark the images as dirty for a rebuild by setting the image and byte
|
# Mark the images as dirty for a rebuild by setting the image and byte
|
||||||
# stream to None.
|
# stream to None.
|
||||||
self._conversion_queue = PriorityQueue()
|
|
||||||
for key, image in self._cache.iteritems():
|
for key, image in self._cache.iteritems():
|
||||||
image.priority = Priority.Normal
|
self._reset_image(image)
|
||||||
image.image = None
|
|
||||||
image.image_bytes = None
|
def update_images(self, image_type, background):
|
||||||
self._conversion_queue.put((image.priority, image))
|
"""
|
||||||
|
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.
|
||||||
|
for key, image in self._cache.iteritems():
|
||||||
|
if image.source == image_type:
|
||||||
|
image.background = background
|
||||||
|
self._reset_image(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.
|
||||||
|
for key, image in self._cache.iteritems():
|
||||||
|
if image.source == image_type and image.name == name:
|
||||||
|
image.background = background
|
||||||
|
self._reset_image(image)
|
||||||
|
|
||||||
|
def _reset_image(self, image):
|
||||||
|
image.image = None
|
||||||
|
image.image_bytes = None
|
||||||
|
self._conversion_queue.modify_priority(image, Priority.Normal)
|
||||||
|
|
||||||
|
def process_updates(self):
|
||||||
|
"""
|
||||||
|
Flush the queue to updated any data to update
|
||||||
|
"""
|
||||||
# We want only one thread.
|
# We want only one thread.
|
||||||
if not self._imageThread.isRunning():
|
if not self._imageThread.isRunning():
|
||||||
self._imageThread.start()
|
self._imageThread.start()
|
||||||
@ -215,13 +249,13 @@ class ImageManager(QtCore.QObject):
|
|||||||
self._conversion_queue.remove(self._cache[name])
|
self._conversion_queue.remove(self._cache[name])
|
||||||
del 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.
|
Add image to cache if it is not already there.
|
||||||
"""
|
"""
|
||||||
log.debug(u'add_image %s:%s' % (name, path))
|
log.debug(u'add_image %s:%s' % (name, path))
|
||||||
if not name in self._cache:
|
if not name in self._cache:
|
||||||
image = Image(name, path)
|
image = Image(name, path, source, background)
|
||||||
self._cache[name] = image
|
self._cache[name] = image
|
||||||
self._conversion_queue.put((image.priority, image))
|
self._conversion_queue.put((image.priority, image))
|
||||||
else:
|
else:
|
||||||
@ -247,7 +281,8 @@ class ImageManager(QtCore.QObject):
|
|||||||
image = self._conversion_queue.get()[1]
|
image = self._conversion_queue.get()[1]
|
||||||
# Generate the QImage for the image.
|
# Generate the QImage for the image.
|
||||||
if image.image is None:
|
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
|
# Set the priority to Lowest and stop here as we need to process
|
||||||
# more important images first.
|
# more important images first.
|
||||||
if image.priority == Priority.Normal:
|
if image.priority == Priority.Normal:
|
||||||
|
@ -27,7 +27,7 @@
|
|||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtWebKit
|
from PyQt4 import QtGui, QtCore, QtWebKit
|
||||||
|
|
||||||
from openlp.core.lib import ServiceItem, expand_tags, \
|
from openlp.core.lib import ServiceItem, expand_tags, \
|
||||||
build_lyrics_format_css, build_lyrics_outline_css, Receiver, \
|
build_lyrics_format_css, build_lyrics_outline_css, Receiver, \
|
||||||
@ -166,7 +166,8 @@ class Renderer(object):
|
|||||||
# if No file do not update cache
|
# if No file do not update cache
|
||||||
if self.theme_data.background_filename:
|
if self.theme_data.background_filename:
|
||||||
self.imageManager.add_image(self.theme_data.theme_name,
|
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
|
return self._rect, self._rect_footer
|
||||||
|
|
||||||
def generate_preview(self, theme_data, force_page=False):
|
def generate_preview(self, theme_data, force_page=False):
|
||||||
|
@ -115,6 +115,7 @@ class ServiceItem(object):
|
|||||||
self.end_time = 0
|
self.end_time = 0
|
||||||
self.media_length = 0
|
self.media_length = 0
|
||||||
self.from_service = False
|
self.from_service = False
|
||||||
|
self.image_border = u'#000000'
|
||||||
self._new_item()
|
self._new_item()
|
||||||
|
|
||||||
def _new_item(self):
|
def _new_item(self):
|
||||||
@ -195,7 +196,7 @@ class ServiceItem(object):
|
|||||||
self.foot_text = \
|
self.foot_text = \
|
||||||
u'<br>'.join([footer for footer in self.raw_footer if footer])
|
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.
|
Add an image slide to the service item.
|
||||||
|
|
||||||
@ -205,9 +206,12 @@ class ServiceItem(object):
|
|||||||
``title``
|
``title``
|
||||||
A title for the slide in the service item.
|
A title for the slide in the service item.
|
||||||
"""
|
"""
|
||||||
|
if background:
|
||||||
|
self.image_border = background
|
||||||
self.service_item_type = ServiceItemType.Image
|
self.service_item_type = ServiceItemType.Image
|
||||||
self._raw_frames.append({u'title': title, u'path': path})
|
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()
|
self._new_item()
|
||||||
|
|
||||||
def add_from_text(self, title, raw_slide, verse_tag=None):
|
def add_from_text(self, title, raw_slide, verse_tag=None):
|
||||||
|
@ -44,6 +44,7 @@ BLANK_THEME_XML = \
|
|||||||
<name> </name>
|
<name> </name>
|
||||||
<background type="image">
|
<background type="image">
|
||||||
<filename></filename>
|
<filename></filename>
|
||||||
|
<borderColor>#000000</borderColor>
|
||||||
</background>
|
</background>
|
||||||
<background type="gradient">
|
<background type="gradient">
|
||||||
<startColor>#000000</startColor>
|
<startColor>#000000</startColor>
|
||||||
@ -282,7 +283,7 @@ class ThemeXML(object):
|
|||||||
# Create direction element
|
# Create direction element
|
||||||
self.child_element(background, u'direction', unicode(direction))
|
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.
|
Add a image background.
|
||||||
|
|
||||||
@ -294,6 +295,8 @@ class ThemeXML(object):
|
|||||||
self.theme.appendChild(background)
|
self.theme.appendChild(background)
|
||||||
# Create Filename element
|
# Create Filename element
|
||||||
self.child_element(background, u'filename', filename)
|
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',
|
def add_font(self, name, color, size, override, fonttype=u'main',
|
||||||
bold=u'False', italics=u'False', line_adjustment=0,
|
bold=u'False', italics=u'False', line_adjustment=0,
|
||||||
@ -597,7 +600,7 @@ class ThemeXML(object):
|
|||||||
self.background_direction)
|
self.background_direction)
|
||||||
else:
|
else:
|
||||||
filename = os.path.split(self.background_filename)[1]
|
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.add_font(self.font_main_name,
|
||||||
self.font_main_color,
|
self.font_main_color,
|
||||||
self.font_main_size,
|
self.font_main_size,
|
||||||
|
@ -228,11 +228,11 @@ class MainDisplay(QtGui.QGraphicsView):
|
|||||||
shrinkItem.setVisible(False)
|
shrinkItem.setVisible(False)
|
||||||
self.setGeometry(self.screen[u'size'])
|
self.setGeometry(self.screen[u'size'])
|
||||||
|
|
||||||
def directImage(self, name, path):
|
def directImage(self, name, path, background):
|
||||||
"""
|
"""
|
||||||
API for replacement backgrounds so Images are added directly to cache
|
API for replacement backgrounds so Images are added directly to cache
|
||||||
"""
|
"""
|
||||||
self.imageManager.add_image(name, path)
|
self.imageManager.add_image(name, path, u'image', background)
|
||||||
if hasattr(self, u'serviceItem'):
|
if hasattr(self, u'serviceItem'):
|
||||||
self.override[u'image'] = name
|
self.override[u'image'] = name
|
||||||
self.override[u'theme'] = self.serviceItem.themedata.theme_name
|
self.override[u'theme'] = self.serviceItem.themedata.theme_name
|
||||||
|
@ -31,7 +31,7 @@ import os
|
|||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
from lxml import html
|
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.lib.ui import UiStrings
|
||||||
from openlp.core.ui.printservicedialog import Ui_PrintServiceDialog, ZoomSize
|
from openlp.core.ui.printservicedialog import Ui_PrintServiceDialog, ZoomSize
|
||||||
from openlp.core.utils import AppLocation
|
from openlp.core.utils import AppLocation
|
||||||
@ -327,12 +327,14 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
|
|||||||
"""
|
"""
|
||||||
Copies the display text to the clipboard as plain text
|
Copies the display text to the clipboard as plain text
|
||||||
"""
|
"""
|
||||||
|
self.update_song_usage()
|
||||||
self.mainWindow.clipboard.setText(self.document.toPlainText())
|
self.mainWindow.clipboard.setText(self.document.toPlainText())
|
||||||
|
|
||||||
def copyHtmlText(self):
|
def copyHtmlText(self):
|
||||||
"""
|
"""
|
||||||
Copies the display text to the clipboard as Html
|
Copies the display text to the clipboard as Html
|
||||||
"""
|
"""
|
||||||
|
self.update_song_usage()
|
||||||
self.mainWindow.clipboard.setText(self.document.toHtml())
|
self.mainWindow.clipboard.setText(self.document.toHtml())
|
||||||
|
|
||||||
def printServiceOrder(self):
|
def printServiceOrder(self):
|
||||||
@ -341,6 +343,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
|
|||||||
"""
|
"""
|
||||||
if not self.printDialog.exec_():
|
if not self.printDialog.exec_():
|
||||||
return
|
return
|
||||||
|
self.update_song_usage()
|
||||||
# Print the document.
|
# Print the document.
|
||||||
self.document.print_(self.printer)
|
self.document.print_(self.printer)
|
||||||
|
|
||||||
@ -397,3 +400,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
|
|||||||
settings.setValue(u'print notes',
|
settings.setValue(u'print notes',
|
||||||
QtCore.QVariant(self.notesCheckBox.isChecked()))
|
QtCore.QVariant(self.notesCheckBox.isChecked()))
|
||||||
settings.endGroup()
|
settings.endGroup()
|
||||||
|
|
||||||
|
def update_song_usage(self):
|
||||||
|
for index, item in enumerate(self.serviceManager.serviceItems):
|
||||||
|
# Trigger Audit requests
|
||||||
|
Receiver.send_message(u'print_service_started',
|
||||||
|
[item[u'service_item']])
|
||||||
|
@ -66,6 +66,8 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
|
|||||||
self.onGradientComboBoxCurrentIndexChanged)
|
self.onGradientComboBoxCurrentIndexChanged)
|
||||||
QtCore.QObject.connect(self.colorButton,
|
QtCore.QObject.connect(self.colorButton,
|
||||||
QtCore.SIGNAL(u'clicked()'), self.onColorButtonClicked)
|
QtCore.SIGNAL(u'clicked()'), self.onColorButtonClicked)
|
||||||
|
QtCore.QObject.connect(self.imageColorButton,
|
||||||
|
QtCore.SIGNAL(u'clicked()'), self.onImageColorButtonClicked)
|
||||||
QtCore.QObject.connect(self.gradientStartButton,
|
QtCore.QObject.connect(self.gradientStartButton,
|
||||||
QtCore.SIGNAL(u'clicked()'), self.onGradientStartButtonClicked)
|
QtCore.SIGNAL(u'clicked()'), self.onGradientStartButtonClicked)
|
||||||
QtCore.QObject.connect(self.gradientEndButton,
|
QtCore.QObject.connect(self.gradientEndButton,
|
||||||
@ -330,6 +332,8 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
|
|||||||
self.theme.background_end_color)
|
self.theme.background_end_color)
|
||||||
self.setField(u'background_type', QtCore.QVariant(1))
|
self.setField(u'background_type', QtCore.QVariant(1))
|
||||||
else:
|
else:
|
||||||
|
self.imageColorButton.setStyleSheet(u'background-color: %s' %
|
||||||
|
self.theme.background_border_color)
|
||||||
self.imageFileEdit.setText(self.theme.background_filename)
|
self.imageFileEdit.setText(self.theme.background_filename)
|
||||||
self.setField(u'background_type', QtCore.QVariant(2))
|
self.setField(u'background_type', QtCore.QVariant(2))
|
||||||
if self.theme.background_direction == \
|
if self.theme.background_direction == \
|
||||||
@ -464,6 +468,14 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
|
|||||||
self._colorButton(self.theme.background_color)
|
self._colorButton(self.theme.background_color)
|
||||||
self.setBackgroundPageValues()
|
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):
|
def onGradientStartButtonClicked(self):
|
||||||
"""
|
"""
|
||||||
Gradient 2 Color button pushed.
|
Gradient 2 Color button pushed.
|
||||||
@ -564,7 +576,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
|
|||||||
|
|
||||||
def accept(self):
|
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
|
# Save the theme name
|
||||||
self.theme.theme_name = unicode(self.field(u'name').toString())
|
self.theme.theme_name = unicode(self.field(u'name').toString())
|
||||||
|
@ -610,6 +610,11 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
and to trigger the reload of the theme list
|
and to trigger the reload of the theme list
|
||||||
"""
|
"""
|
||||||
self._writeTheme(theme, imageFrom, imageTo)
|
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()
|
self.loadThemes()
|
||||||
|
|
||||||
def _writeTheme(self, theme, imageFrom, imageTo):
|
def _writeTheme(self, theme, imageFrom, imageTo):
|
||||||
|
@ -105,6 +105,11 @@ class Ui_ThemeWizard(object):
|
|||||||
self.imageLayout = QtGui.QFormLayout(self.imageWidget)
|
self.imageLayout = QtGui.QFormLayout(self.imageWidget)
|
||||||
self.imageLayout.setMargin(0)
|
self.imageLayout.setMargin(0)
|
||||||
self.imageLayout.setObjectName(u'ImageLayout')
|
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 = QtGui.QLabel(self.imageWidget)
|
||||||
self.imageLabel.setObjectName(u'ImageLabel')
|
self.imageLabel.setObjectName(u'ImageLabel')
|
||||||
self.imageFileLayout = QtGui.QHBoxLayout()
|
self.imageFileLayout = QtGui.QHBoxLayout()
|
||||||
@ -118,7 +123,7 @@ class Ui_ThemeWizard(object):
|
|||||||
build_icon(u':/general/general_open.png'))
|
build_icon(u':/general/general_open.png'))
|
||||||
self.imageFileLayout.addWidget(self.imageBrowseButton)
|
self.imageFileLayout.addWidget(self.imageBrowseButton)
|
||||||
self.imageLayout.addRow(self.imageLabel, self.imageFileLayout)
|
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.backgroundStack.addWidget(self.imageWidget)
|
||||||
self.backgroundLayout.addLayout(self.backgroundStack)
|
self.backgroundLayout.addLayout(self.backgroundStack)
|
||||||
themeWizard.addPage(self.backgroundPage)
|
themeWizard.addPage(self.backgroundPage)
|
||||||
@ -443,6 +448,8 @@ class Ui_ThemeWizard(object):
|
|||||||
translate('OpenLP.ThemeWizard', 'Top Left - Bottom Right'))
|
translate('OpenLP.ThemeWizard', 'Top Left - Bottom Right'))
|
||||||
self.gradientComboBox.setItemText(BackgroundGradientType.LeftBottom,
|
self.gradientComboBox.setItemText(BackgroundGradientType.LeftBottom,
|
||||||
translate('OpenLP.ThemeWizard', 'Bottom Left - Top Right'))
|
translate('OpenLP.ThemeWizard', 'Bottom Left - Top Right'))
|
||||||
|
self.imageColorLabel.setText(
|
||||||
|
translate(u'OpenLP.ThemeWizard', 'Background color:'))
|
||||||
self.imageLabel.setText(u'%s:' % UiStrings().Image)
|
self.imageLabel.setText(u'%s:' % UiStrings().Image)
|
||||||
self.mainAreaPage.setTitle(
|
self.mainAreaPage.setTitle(
|
||||||
translate('OpenLP.ThemeWizard', 'Main Area Font Details'))
|
translate('OpenLP.ThemeWizard', 'Main Area Font Details'))
|
||||||
|
@ -25,10 +25,13 @@
|
|||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from openlp.core.lib import Plugin, StringContent, build_icon, translate
|
from openlp.core.lib import Plugin, StringContent, build_icon, translate, \
|
||||||
from openlp.plugins.images.lib import ImageMediaItem
|
Receiver
|
||||||
|
from openlp.plugins.images.lib import ImageMediaItem, ImageTab
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -36,10 +39,13 @@ class ImagePlugin(Plugin):
|
|||||||
log.info(u'Image Plugin loaded')
|
log.info(u'Image Plugin loaded')
|
||||||
|
|
||||||
def __init__(self, plugin_helpers):
|
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.weight = -7
|
||||||
self.icon_path = u':/plugins/plugin_images.png'
|
self.icon_path = u':/plugins/plugin_images.png'
|
||||||
self.icon = build_icon(self.icon_path)
|
self.icon = build_icon(self.icon_path)
|
||||||
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
|
QtCore.SIGNAL(u'image_updated'), self.image_updated)
|
||||||
|
|
||||||
def about(self):
|
def about(self):
|
||||||
about_text = translate('ImagePlugin', '<strong>Image Plugin</strong>'
|
about_text = translate('ImagePlugin', '<strong>Image Plugin</strong>'
|
||||||
@ -81,3 +87,13 @@ class ImagePlugin(Plugin):
|
|||||||
'Add the selected image to the service.')
|
'Add the selected image to the service.')
|
||||||
}
|
}
|
||||||
self.setPluginUiTextStrings(tooltips)
|
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)
|
||||||
|
@ -26,3 +26,4 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
from mediaitem import ImageMediaItem
|
from mediaitem import ImageMediaItem
|
||||||
|
from imagetab import ImageTab
|
||||||
|
101
openlp/plugins/images/lib/imagetab.py
Normal file
101
openlp/plugins/images/lib/imagetab.py
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
# -*- 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.bgColorGroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||||
|
self.bgColorGroupBox.setObjectName(u'FontGroupBox')
|
||||||
|
self.formLayout = QtGui.QFormLayout(self.bgColorGroupBox)
|
||||||
|
self.formLayout.setObjectName(u'FormLayout')
|
||||||
|
self.colorLayout = QtGui.QHBoxLayout()
|
||||||
|
self.backgroundColorLabel = QtGui.QLabel(self.bgColorGroupBox)
|
||||||
|
self.backgroundColorLabel.setObjectName(u'BackgroundColorLabel')
|
||||||
|
self.colorLayout.addWidget(self.backgroundColorLabel)
|
||||||
|
self.backgroundColorButton = QtGui.QPushButton(self.bgColorGroupBox)
|
||||||
|
self.backgroundColorButton.setObjectName(u'BackgroundColorButton')
|
||||||
|
self.colorLayout.addWidget(self.backgroundColorButton)
|
||||||
|
self.formLayout.addRow(self.colorLayout)
|
||||||
|
self.informationLabel = QtGui.QLabel(self.bgColorGroupBox)
|
||||||
|
self.informationLabel.setObjectName(u'InformationLabel')
|
||||||
|
self.formLayout.addRow(self.informationLabel)
|
||||||
|
self.leftLayout.addWidget(self.bgColorGroupBox)
|
||||||
|
self.leftLayout.addStretch()
|
||||||
|
self.rightColumn.setSizePolicy(
|
||||||
|
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
|
||||||
|
self.rightLayout.addStretch()
|
||||||
|
# Signals and slots
|
||||||
|
QtCore.QObject.connect(self.backgroundColorButton,
|
||||||
|
QtCore.SIGNAL(u'pressed()'), self.onbackgroundColorButtonClicked)
|
||||||
|
|
||||||
|
def retranslateUi(self):
|
||||||
|
self.bgColorGroupBox.setTitle(
|
||||||
|
translate('ImagesPlugin.ImageTab', 'Background Color'))
|
||||||
|
self.backgroundColorLabel.setText(
|
||||||
|
translate('ImagesPlugin.ImageTab', 'Default 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')
|
||||||
|
|
@ -140,6 +140,8 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
self.plugin.formparent.finishedProgressBar()
|
self.plugin.formparent.finishedProgressBar()
|
||||||
|
|
||||||
def generateSlideData(self, service_item, item=None, xmlVersion=False):
|
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:
|
if item:
|
||||||
items = [item]
|
items = [item]
|
||||||
else:
|
else:
|
||||||
@ -183,7 +185,7 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
for bitem in items:
|
for bitem in items:
|
||||||
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
||||||
(path, name) = os.path.split(filename)
|
(path, name) = os.path.split(filename)
|
||||||
service_item.add_from_image(filename, name)
|
service_item.add_from_image(filename, name, background)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def onResetClick(self):
|
def onResetClick(self):
|
||||||
@ -206,13 +208,16 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
if check_item_selected(self.listView,
|
if check_item_selected(self.listView,
|
||||||
translate('ImagePlugin.MediaItem',
|
translate('ImagePlugin.MediaItem',
|
||||||
'You must select an image to replace the background with.')):
|
'You must select an image to replace the background with.')):
|
||||||
|
background = QtGui.QColor(QtCore.QSettings().value(
|
||||||
|
self.settingsSection + u'/background color',
|
||||||
|
QtCore.QVariant(u'#000000')))
|
||||||
item = self.listView.selectedIndexes()[0]
|
item = self.listView.selectedIndexes()[0]
|
||||||
bitem = self.listView.item(item.row())
|
bitem = self.listView.item(item.row())
|
||||||
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
||||||
if os.path.exists(filename):
|
if os.path.exists(filename):
|
||||||
(path, name) = os.path.split(filename)
|
(path, name) = os.path.split(filename)
|
||||||
if self.plugin.liveController.display.directImage(name,
|
if self.plugin.liveController.display.directImage(name,
|
||||||
filename):
|
filename, background):
|
||||||
self.resetAction.setVisible(True)
|
self.resetAction.setVisible(True)
|
||||||
else:
|
else:
|
||||||
critical_error_message_box(UiStrings().LiveBGError,
|
critical_error_message_box(UiStrings().LiveBGError,
|
||||||
|
@ -122,6 +122,9 @@ class SongUsagePlugin(Plugin):
|
|||||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
QtCore.SIGNAL(u'slidecontroller_live_started'),
|
QtCore.SIGNAL(u'slidecontroller_live_started'),
|
||||||
self.onReceiveSongUsage)
|
self.onReceiveSongUsage)
|
||||||
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
|
QtCore.SIGNAL(u'print_service_started'),
|
||||||
|
self.onReceiveSongUsage)
|
||||||
self.songUsageActive = QtCore.QSettings().value(
|
self.songUsageActive = QtCore.QSettings().value(
|
||||||
self.settingsSection + u'/active',
|
self.settingsSection + u'/active',
|
||||||
QtCore.QVariant(False)).toBool()
|
QtCore.QVariant(False)).toBool()
|
||||||
|
Loading…
Reference in New Issue
Block a user