From 14837d6efa3841df4128b3cf606a99471bf18a3c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 12 Dec 2009 09:24:12 +0000 Subject: [PATCH 01/11] Fix up preview in 1024x764 so looks sensible --- openlp/core/ui/slidecontroller.py | 2 +- openlp/plugins/bibles/lib/bibleOSISimpl.py | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 21c0e4d2a..3fa0bf557 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -246,7 +246,7 @@ class SlideController(QtGui.QWidget): self.SlidePreview.sizePolicy().hasHeightForWidth()) self.SlidePreview.setSizePolicy(sizePolicy) self.SlidePreview.setFixedSize( - QtCore.QSize(self.settingsmanager.slidecontroller_image, 225)) + QtCore.QSize(self.settingsmanager.slidecontroller_image,self.settingsmanager.slidecontroller_image / 1.3 )) self.SlidePreview.setFrameShape(QtGui.QFrame.Box) self.SlidePreview.setFrameShadow(QtGui.QFrame.Plain) self.SlidePreview.setLineWidth(1) diff --git a/openlp/plugins/bibles/lib/bibleOSISimpl.py b/openlp/plugins/bibles/lib/bibleOSISimpl.py index 089649b89..276846c16 100644 --- a/openlp/plugins/bibles/lib/bibleOSISimpl.py +++ b/openlp/plugins/bibles/lib/bibleOSISimpl.py @@ -28,6 +28,7 @@ import os.path import logging import chardet import codecs +import time from PyQt4 import QtCore @@ -174,12 +175,17 @@ class BibleOSISImpl(): testament) dialogobject.incrementProgressBar( self.booksOfBible[p[0]]) + Receiver.send_message(u'process_events') + #minor delay to get the events processed + time.sleep(0.1) count = 0 self.bibledb.add_verse(book.id, p[1], p[2], text) count += 1 #Every 3 verses repaint the screen - if count % 3 == 0: + if count % 30 == 0: Receiver.send_message(u'process_events') + #minor delay to get the events processed + time.sleep(0.1) count = 0 except: log.exception(u'Loading bible from OSIS file failed') From f7f0f1814277a03b782f66b03095c1b30110ff8d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 13 Dec 2009 08:28:51 +0000 Subject: [PATCH 02/11] Fix bug with Verse Tags being lost when expanding or contracting the verse edit list --- openlp/plugins/songs/forms/editsongform.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index dc5b522b4..3d04c7cb1 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -336,14 +336,19 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): data = u'%s:%s' %(verse, subVerse) item.setData(QtCore.Qt.UserRole, QtCore.QVariant(data)) item.setText(afterText) - #number of lines has change + #number of lines has change so repaint the list moving the data if len(tempText.split(u'\n')) != len(afterText.split(u'\n')): tempList = {} + tempId = {} for row in range(0, self.VerseListWidget.count()): tempList[row] = self.VerseListWidget.item(row).text() + tempId[row] = self.VerseListWidget.item(row).\ + data(QtCore.Qt.UserRole) self.VerseListWidget.clear() for row in range (0, len(tempList)): - self.VerseListWidget.addItem(tempList[row]) + item = QtGui.QListWidgetItem(tempList[row]) + item.setData(QtCore.Qt.UserRole, tempId[row]) + self.VerseListWidget.addItem(item) self.VerseListWidget.repaint() self.VerseEditButton.setEnabled(False) self.VerseDeleteButton.setEnabled(False) From d676430ffadbec1cc86ff3e67d4784e7387c01a1 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 13 Dec 2009 08:57:58 +0000 Subject: [PATCH 03/11] Add option to Custom to suppress the footer. Not always needed for Copyright. Default Required --- openlp/plugins/custom/customplugin.py | 5 +- openlp/plugins/custom/lib/__init__.py | 1 + openlp/plugins/custom/lib/customtab.py | 74 ++++++++++++++++++++++++++ openlp/plugins/custom/lib/mediaitem.py | 8 ++- 4 files changed, 85 insertions(+), 3 deletions(-) create mode 100644 openlp/plugins/custom/lib/customtab.py diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index a1828efa3..8cb90deaf 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -27,7 +27,7 @@ import logging from forms import EditCustomForm from openlp.core.lib import Plugin, build_icon -from openlp.plugins.custom.lib import CustomManager, CustomMediaItem +from openlp.plugins.custom.lib import CustomManager, CustomMediaItem, CustomTab class CustomPlugin(Plugin): @@ -51,6 +51,9 @@ class CustomPlugin(Plugin): self.edit_custom_form = EditCustomForm(self.custommanager) self.icon = build_icon(u':/media/media_custom.png') + def get_settings_tab(self): + return CustomTab(self.name) + def get_media_manager_item(self): # Create the CustomManagerItem object return CustomMediaItem(self, self.icon, self.name) diff --git a/openlp/plugins/custom/lib/__init__.py b/openlp/plugins/custom/lib/__init__.py index f780fc6b8..8141d7f58 100644 --- a/openlp/plugins/custom/lib/__init__.py +++ b/openlp/plugins/custom/lib/__init__.py @@ -25,3 +25,4 @@ from manager import CustomManager from mediaitem import CustomMediaItem +from customtab import CustomTab diff --git a/openlp/plugins/custom/lib/customtab.py b/openlp/plugins/custom/lib/customtab.py new file mode 100644 index 000000000..c4e0c6ee9 --- /dev/null +++ b/openlp/plugins/custom/lib/customtab.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2009 Raoul Snyman # +# Portions copyright (c) 2008-2009 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # +# Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# 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, str_to_bool + +class CustomTab(SettingsTab): + """ + CustomTab is the Custom settings tab in the settings dialog. + """ + def __init__(self, title, section=None): + SettingsTab.__init__(self, title, section) + + def setupUi(self): + self.setObjectName(u'CustomTab') + self.tabTitleVisible = self.trUtf8('Custom') + self.CustomLayout = QtGui.QFormLayout(self) + self.CustomLayout.setObjectName(u'CustomLayout') + self.CustomModeGroupBox = QtGui.QGroupBox(self) + self.CustomModeGroupBox.setObjectName(u'CustomModeGroupBox') + self.CustomModeLayout = QtGui.QVBoxLayout(self.CustomModeGroupBox) + self.CustomModeLayout.setSpacing(8) + self.CustomModeLayout.setMargin(8) + self.CustomModeLayout.setObjectName(u'CustomModeLayout') + self.DisplayFooterCheckBox = QtGui.QCheckBox(self.CustomModeGroupBox) + self.DisplayFooterCheckBox.setObjectName(u'DisplayFooterCheckBox') + self.CustomModeLayout.addWidget(self.DisplayFooterCheckBox) + self.CustomLayout.setWidget( + 0, QtGui.QFormLayout.LabelRole, self.CustomModeGroupBox) + QtCore.QObject.connect(self.DisplayFooterCheckBox, + QtCore.SIGNAL(u'stateChanged(int)'), + self.onDisplayFooterCheckBoxChanged) + + def retranslateUi(self): + self.CustomModeGroupBox.setTitle(self.trUtf8('Custom Display')) + self.DisplayFooterCheckBox.setText( + self.trUtf8('Suppress display of footer:')) + + def onDisplayFooterCheckBoxChanged(self, check_state): + self.displayFooter = False + # we have a set value convert to True/False + if check_state == QtCore.Qt.Checked: + self.displayFooter = True + + def load(self): + self.displayFooter = str_to_bool( + self.config.get_config(u'display footer', True)) + self.DisplayFooterCheckBox.setChecked(self.displayFooter) + + def save(self): + self.config.set_config(u'display footer', unicode(self.displayFooter)) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 995278f98..989e9ecf4 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -27,7 +27,8 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD, Receiver +from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD,\ +Receiver, str_to_bool class CustomListView(BaseListWithDnD): def __init__(self, parent=None): @@ -155,9 +156,12 @@ class CustomMediaItem(MediaManagerItem): verseList = songXML.get_verses() for verse in verseList: raw_slides.append(verse[1]) - raw_footer.append(title + u' '+ credit) service_item.title = title for slide in raw_slides: service_item.add_from_text(slide[:30], slide) + if str_to_bool(self.parent.config.get_config(u'display footer', True)): + raw_footer.append(title + u' '+ credit) + else: + raw_footer.append(u'') service_item.raw_footer = raw_footer return True From fe959f451f546d98f28443bb25b4cfa2886b19e4 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 13 Dec 2009 14:20:24 +0000 Subject: [PATCH 04/11] Fix up Alert generation (needs to be tested on duel screen) --- openlp/core/ui/alertform.py | 2 +- openlp/core/ui/maindisplay.py | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/alertform.py b/openlp/core/ui/alertform.py index fd4380700..96dc88dc5 100644 --- a/openlp/core/ui/alertform.py +++ b/openlp/core/ui/alertform.py @@ -99,4 +99,4 @@ class AlertForm(QtGui.QDialog): self.CancelButton.setText(self.trUtf8('Cancel')) def onDisplayClicked(self): - self.parent.mainDisplay.displayAlert(self.AlertEntryEditItem.text()) + self.parent.mainDisplay.displayAlert(unicode(self.AlertEntryEditItem.text())) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 7a621a8ae..f63dd373d 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -214,6 +214,7 @@ class MainDisplay(DisplayWidget): self.setVisible(True) self.showFullScreen() self.frame = frame + print type(self.frame) def blankDisplay(self, blanked=True): if blanked: @@ -234,8 +235,12 @@ class MainDisplay(DisplayWidget): ``text`` display text """ + log.debug(u'display alert called %s' % text) alertTab = self.parent.settingsForm.AlertsTab - alertframe = QtGui.QPixmap.fromImage(self.frame) + if isinstance(self.frame, QtGui.QImage): + alertframe = QtGui.QPixmap.fromImage(self.frame) + else: + alertframe = QtGui.QPixmap.fromImage(self.frame[u'main']) painter = QtGui.QPainter(alertframe) top = alertframe.rect().height() * 0.9 painter.fillRect( @@ -261,7 +266,10 @@ class MainDisplay(DisplayWidget): def timerEvent(self, event): if event.timerId() == self.timer_id: - self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame)) + if isinstance(self.frame, QtGui.QImage): + self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame)) + else: + self.display.setPixmap(QtGui.QPixmap.fromImage(self.frame[u'main'])) self.killTimer(self.timer_id) self.timer_id = 0 From be3fecac2095eb5ae54289bc9d3813dae8a6a6b7 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 13 Dec 2009 22:08:10 +0000 Subject: [PATCH 05/11] Sort out Presentation plugin Handler * Allow 2 presentations to work at same time * Sort out live / preview issues to stop cross messaging --- openlp/core/lib/mediamanageritem.py | 6 +- openlp/core/lib/serviceitem.py | 2 + openlp/core/ui/maindisplay.py | 1 - openlp/core/ui/slidecontroller.py | 53 ++-- .../presentations/lib/messagelistener.py | 253 ++++++++++++------ 5 files changed, 210 insertions(+), 105 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 5ec87b1bc..3652bae20 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -357,7 +357,7 @@ class MediaManagerItem(QtGui.QWidget): self.trUtf8('No items selected...'), self.trUtf8('You must select one or more items')) else: - log.debug(self.PluginNameShort + u' Preview Requested') + log.debug(self.PluginNameShort + u' Preview requested') service_item = self.buildServiceItem() if service_item: service_item.fromPlugin = True @@ -369,7 +369,7 @@ class MediaManagerItem(QtGui.QWidget): self.trUtf8('No items selected...'), self.trUtf8('You must select one or more items')) else: - log.debug(self.PluginNameShort + u' Live Requested') + log.debug(self.PluginNameShort + u' Live requested') service_item = self.buildServiceItem() if service_item: service_item.fromPlugin = True @@ -381,7 +381,7 @@ class MediaManagerItem(QtGui.QWidget): self.trUtf8('No items selected...'), self.trUtf8('You must select one or more items')) else: - log.debug(self.PluginNameShort + u' Add Requested') + log.debug(self.PluginNameShort + u' Add requested') service_item = self.buildServiceItem() if service_item: service_item.fromPlugin = False diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index f8fe7d539..d1afa556b 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -112,6 +112,8 @@ class ServiceItem(object): for slide in self._raw_frames: slide[u'image'] = \ self.RenderManager.resize_image(slide[u'image']) + elif self.service_item_type == ServiceItemType.Command: + pass else: log.error(u'Invalid value renderer :%s' % self.service_item_type) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index f63dd373d..edbf41de8 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -214,7 +214,6 @@ class MainDisplay(DisplayWidget): self.setVisible(True) self.showFullScreen() self.frame = frame - print type(self.frame) def blankDisplay(self, blanked=True): if blanked: diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 3fa0bf557..4b599a3e0 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -390,14 +390,12 @@ class SlideController(QtGui.QWidget): #If old item was a command tell it to stop if self.serviceItem and self.serviceItem.is_command(): self.onMediaStop() - if item.is_command(): - if self.isLive: - Receiver.send_message(u'%s_start' % item.name.lower(), \ - [item.title, item.service_item_path, - item.get_frame_title(), slideno, self.isLive]) - else: - if item.is_media(): - self.onMediaStart(item) + if item.is_media(): + self.onMediaStart(item) + elif item.is_command(): + Receiver.send_message(u'%s_start' % item.name.lower(), \ + [item.title, item.service_item_path, + item.get_frame_title(), slideno, self.isLive]) self.displayServiceManagerItems(item, slideno) def displayServiceManagerItems(self, serviceItem, slideno): @@ -475,7 +473,8 @@ class SlideController(QtGui.QWidget): if not self.serviceItem: return if self.serviceItem.is_command(): - Receiver.send_message(u'%s_first'% self.serviceItem.name.lower()) + Receiver.send_message(u'%s_first'% \ + self.serviceItem.name.lower(), self.isLive) self.updatePreview() else: self.PreviewListWidget.selectRow(0) @@ -504,17 +503,20 @@ class SlideController(QtGui.QWidget): row = self.PreviewListWidget.currentRow() self.selectedRow = 0 if row > -1 and row < self.PreviewListWidget.rowCount(): - if self.serviceItem.is_command(): - Receiver.send_message(u'%s_slide'% self.serviceItem.name.lower(), [row]) - if self.isLive: - self.updatePreview() + if self.serviceItem.is_command() and self.isLive: + Receiver.send_message(u'%s_slide'% \ + self.serviceItem.name.lower(), u'%s:%s' % (row, self.isLive)) + self.updatePreview() else: before = time.time() frame = self.serviceItem.get_rendered_frame(row) if isinstance(frame, QtGui.QImage): self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) else: - self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[u'main'])) + if isinstance(frame[u'main'], basestring): + self.SlidePreview.setPixmap(QtGui.QPixmap(frame[u'main'])) + else: + self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[u'main'])) log.log(15, u'Slide Rendering took %4s' % (time.time() - before)) if self.isLive: self.parent.mainDisplay.frameView(frame, True) @@ -553,7 +555,8 @@ class SlideController(QtGui.QWidget): if not self.serviceItem: return if self.serviceItem.is_command(): - Receiver.send_message(u'%s_next'% self.serviceItem.name.lower()) + Receiver.send_message(u'%s_next' % \ + self.serviceItem.name.lower(), self.isLive) self.updatePreview() else: row = self.PreviewListWidget.currentRow() + 1 @@ -570,7 +573,7 @@ class SlideController(QtGui.QWidget): return if self.serviceItem.is_command(): Receiver.send_message( - u'%s_previous'% self.serviceItem.name.lower()) + u'%s_previous'% self.serviceItem.name.lower(), self.isLive) self.updatePreview() else: row = self.PreviewListWidget.currentRow() - 1 @@ -586,7 +589,8 @@ class SlideController(QtGui.QWidget): if not self.serviceItem: return if self.serviceItem.is_command(): - Receiver.send_message(u'%s_last'% self.serviceItem.name.lower()) + Receiver.send_message(u'%s_last' % \ + self.serviceItem.name.lower(), self.isLive) self.updatePreview() else: self.PreviewListWidget.selectRow(self.PreviewListWidget.rowCount() - 1) @@ -628,11 +632,16 @@ class SlideController(QtGui.QWidget): self.serviceItem, row) def onMediaStart(self, item): - self.mediaObject.stop() - self.mediaObject.clearQueue() - file = os.path.join(item.service_item_path, item.get_frame_title()) - self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) - self.onMediaPlay() + if self.isLive: + Receiver.send_message(u'%s_start' % item.name.lower(), \ + [item.title, item.service_item_path, + item.get_frame_title(), slideno, self.isLive]) + else: + self.mediaObject.stop() + self.mediaObject.clearQueue() + file = os.path.join(item.service_item_path, item.get_frame_title()) + self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) + self.onMediaPlay() def onMediaPause(self): if self.isLive: diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 833cac360..9e9a0047c 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -30,6 +30,124 @@ from PyQt4 import QtCore from openlp.core.lib import Receiver +class Controller(object): + """ + This is the Presentation listener who acts on events from the slide + controller and passes the messages on the the correct presentation handlers + """ + global log + log = logging.getLogger(u'Controller') + log.info(u'Controller loaded') + + def __init__(self, live): + self.isLive = live + log.info(u'%s controller loaded' % live) + + def addHandler(self, controller, file): + log.debug(u'Live = %s, addHandler %s' % (self.isLive, file)) + self.controller = controller + if self.controller.is_loaded(): + self.shutdown(None) + self.controller.load_presentation(file) + if self.isLive: + self.controller.start_presentation() + Receiver.send_message(u'live_slide_hide') + self.controller.slidenumber = 0 + + def activate(self): + log.debug(u'Live = %s, activate' % self.isLive) + if self.controller.is_active(): + return + if not self.controller.is_loaded(): + self.controller.load_presentation(self.controller.filepath) + if self.isLive: + self.controller.start_presentation() + if self.controller.slidenumber > 1: + self.controller.goto_slide(self.controller.slidenumber) + + def slide(self, message): + log.debug(u'Live = %s, slide' % self.isLive) + print "slide ", message + if not self.isLive: + return + self.activate() + if message: + self.controller.goto_slide(message[0] + 1) + self.controller.poll_slidenumber(self.isLive) + + def first(self, message): + """ + Based on the handler passed at startup triggers the first slide + """ + log.debug(u'Live = %s, first' % self.isLive) + print "first ", message + if not self.isLive: + return + self.activate() + self.controller.start_presentation() + self.controller.poll_slidenumber(self.isLive) + + def last(self, message): + """ + Based on the handler passed at startup triggers the first slide + """ + log.debug(u'Live = %s, last' % self.isLive) + print "last ", message + if not self.isLive: + return + self.activate() + self.controller.goto_slide(self.controller.get_slide_count()) + self.controller.poll_slidenumber(self.isLive) + + def next(self, message): + """ + Based on the handler passed at startup triggers the next slide event + """ + log.debug(u'Live = %s, next' % self.isLive) + print "next ", message + if not self.isLive: + return + self.activate() + self.controller.next_step() + self.controller.poll_slidenumber(self.isLive) + + def previous(self, message): + """ + Based on the handler passed at startup triggers the previous slide event + """ + log.debug(u'Live = %s, previous' % self.isLive) + if not self.isLive: + return + print "previous ", message + self.activate() + self.controller.previous_step() + self.controller.poll_slidenumber(self.isLive) + + def shutdown(self, message): + """ + Based on the handler passed at startup triggers slide show to shut down + """ + log.debug(u'Live = %s, shutdown' % self.isLive) + self.controller.close_presentation() + self.controller.slidenumber = 0 + #self.timer.stop() + + def blank(self): + if not self.isLive: + return + if not self.controller.is_loaded(): + return + if not self.controller.is_active(): + return + self.controller.blank_screen() + + def unblank(self): + if not self.is_live: + return + self.activate() + self.controller.unblank_screen() + + class MessageListener(object): """ This is the Presentation listener who acts on events from the slide @@ -41,8 +159,9 @@ class MessageListener(object): def __init__(self, controllers): self.controllers = controllers - self.handler = None - self.is_live = None + self.previewHandler = Controller(False) + self.liveHandler = Controller(True) + self.isLive = None # messages are sent from core.ui.slidecontroller QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'presentations_start'), self.startup) @@ -71,108 +190,84 @@ class MessageListener(object): Start of new presentation Save the handler as any new presentations start here """ - self.handler, file, self.is_live = self.decodeMessage(message) - self.controller = self.controllers[self.handler] - if self.controller.is_loaded(): - self.shutdown(None) - self.controller.load_presentation(file) - if self.is_live: - self.controller.start_presentation() - Receiver.send_message(u'live_slide_hide') - self.controller.slidenumber = 0 - self.timer.start() - - def activate(self): - if self.controller.is_active(): - return - if not self.controller.is_loaded(): - self.controller.load_presentation(self.controller.filepath) - self.controller.start_presentation() - if self.controller.slidenumber > 1: - self.controller.goto_slide(self.controller.slidenumber) + log.debug(u'Startup called with message %s' % message) + self.handler, file, isLive = self.decodeMessage(message) + if isLive: + self.liveHandler.addHandler(self.controllers[self.handler], file) + else: + self.previewHandler.addHandler(self.controllers[self.handler], file) def slide(self, message): - if not self.is_live: - return - self.activate() - if message: - self.controller.goto_slide(message[0]+1) - self.controller.poll_slidenumber(self.is_live) + slide, live = self.splitMessage(message) + if live: + self.liveHandler.activate() + else: + self.previewHandler.activate() def first(self, message): - """ - Based on the handler passed at startup triggers the first slide - """ - if not self.is_live: - return - self.activate() - self.controller.start_presentation() - self.controller.poll_slidenumber(self.is_live) + if self.isLive: + self.liveHandler.first(message) + else: + self.previewHandler.first(message) def last(self, message): - """ - Based on the handler passed at startup triggers the first slide - """ - if not self.is_live: - return - self.activate() - self.controller.goto_slide(self.controller.get_slide_count()) - self.controller.poll_slidenumber(self.is_live) + if self.isLive: + self.liveHandler.last(message) + else: + self.previewHandler.last(message) def next(self, message): - """ - Based on the handler passed at startup triggers the next slide event - """ - if not self.is_live: - return - self.activate() - self.controller.next_step() - self.controller.poll_slidenumber(self.is_live) + if self.isLive: + self.liveHandler.next(message) + else: + self.previewHandler.next(message) def previous(self, message): - """ - Based on the handler passed at startup triggers the previous slide event - """ - if not self.is_live: - return - self.activate() - self.controller.previous_step() - self.controller.poll_slidenumber(self.is_live) + if self.isLive: + self.liveHandler.previous(message) + else: + self.previewHandler.previous(message) def shutdown(self, message): - """ - Based on the handler passed at startup triggers slide show to shut down - """ - if self.is_live: + if self.isLive: + self.liveHandler.shutdown(message) Receiver.send_message(u'live_slide_show') - self.controller.close_presentation() - self.controller.slidenumber = 0 - self.timer.stop() + else: + self.previewHandler.shutdown(message) def blank(self): - if not self.is_live: - return - if not self.controller.is_loaded(): - return - if not self.controller.is_active(): - return - self.controller.blank_screen() + if self.isLive: + self.liveHandler.blank() + else: + self.previewHandler.blank() def unblank(self): - if not self.is_live: - return - self.activate() - self.controller.unblank_screen() + if self.isLive: + self.liveHandler.unblank() + else: + self.previewHandler.unblank() + + def splitMessage(self, message): + """ + Splits the selection messages + into it's component parts + + ``message`` + Message containing Presentaion handler name and file to be presented. + """ + bits = message.split(u':') + return bits[0], bits[1] def decodeMessage(self, message): """ - Splits the message from the SlideController into it's component parts + Splits the initial message from the SlideController + into it's component parts ``message`` Message containing Presentaion handler name and file to be presented. """ file = os.path.join(message[1], message[2]) - return message[0], file, message[3] + return message[0], file, message[4] def timeout(self): self.controller.poll_slidenumber(self.is_live) From 1271eac76ec55033c45a5ca4082002daf4c7e1b8 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 14 Dec 2009 16:55:58 +0000 Subject: [PATCH 06/11] Correct comment --- openlp/core/lib/renderer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 3d6198419..78e37a76a 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -578,7 +578,7 @@ class Renderer(object): painter.drawText(x, y + metrics.ascent(), line) painter.end() if self._theme.display_slideTransition: - # Print 2nd image with 50% weight + # Print 2nd image with 70% weight painter = QtGui.QPainter() painter.begin(self._frameOp) painter.setRenderHint(QtGui.QPainter.Antialiasing); From 2f09c70274662dc93c99e183db31405a855e785e Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 14 Dec 2009 17:05:53 +0000 Subject: [PATCH 07/11] Presentation cleanup - finished for now --- .../presentations/lib/messagelistener.py | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 9e9a0047c..31e1a86c2 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -65,15 +65,13 @@ class Controller(object): if self.controller.slidenumber > 1: self.controller.goto_slide(self.controller.slidenumber) - def slide(self, message): - log.debug(u'Live = %s, slide' % self.isLive) - print "slide ", message - if not self.isLive: - return + def slide(self, slide, live): + log.debug(u'Live = %s, slide' % live) +# if not isLive: +# return self.activate() - if message: - self.controller.goto_slide(message[0] + 1) - self.controller.poll_slidenumber(self.isLive) + self.controller.goto_slide(int(slide) + 1) + self.controller.poll_slidenumber(live) def first(self, message): """ @@ -200,9 +198,9 @@ class MessageListener(object): def slide(self, message): slide, live = self.splitMessage(message) if live: - self.liveHandler.activate() + self.liveHandler.slide(slide, live) else: - self.previewHandler.activate() + self.previewHandler.slide(slide, live) def first(self, message): if self.isLive: From 1b1b811cb7d91bb8a62d35483b41879713ddb103 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 14 Dec 2009 18:10:00 +0000 Subject: [PATCH 08/11] Custom display footer if Credit required --- openlp/plugins/custom/lib/customtab.py | 2 +- openlp/plugins/custom/lib/mediaitem.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/custom/lib/customtab.py b/openlp/plugins/custom/lib/customtab.py index c4e0c6ee9..642381f2f 100644 --- a/openlp/plugins/custom/lib/customtab.py +++ b/openlp/plugins/custom/lib/customtab.py @@ -57,7 +57,7 @@ class CustomTab(SettingsTab): def retranslateUi(self): self.CustomModeGroupBox.setTitle(self.trUtf8('Custom Display')) self.DisplayFooterCheckBox.setText( - self.trUtf8('Suppress display of footer:')) + self.trUtf8('Display Footer:')) def onDisplayFooterCheckBoxChanged(self, check_state): self.displayFooter = False diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 989e9ecf4..556c89918 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -159,7 +159,8 @@ class CustomMediaItem(MediaManagerItem): service_item.title = title for slide in raw_slides: service_item.add_from_text(slide[:30], slide) - if str_to_bool(self.parent.config.get_config(u'display footer', True)): + if str_to_bool(self.parent.config.get_config(u'display footer', True)) or \ + len(credit) > 0: raw_footer.append(title + u' '+ credit) else: raw_footer.append(u'') From 43a99451a33154a8d55ce16b4161e50390e3a570 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 15 Dec 2009 20:11:52 +0000 Subject: [PATCH 09/11] Add Outline and Shadow size options --- openlp/core/lib/renderer.py | 38 +++++++++++++------------- openlp/core/lib/themexmlhandler.py | 8 ++++-- openlp/core/ui/amendthemedialog.py | 44 ++++++++++++++++++++++++------ 3 files changed, 59 insertions(+), 31 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 78e37a76a..1a6350b16 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -43,9 +43,8 @@ class Renderer(object): self._rect = None self._debug = 0 self._right_margin = 64 # the amount of right indent - self._shadow_offset = 5 - self._shadow_offset_footer = 3 - self._outline_offset = 2 + self._display_shadow_size_footer = 3 + _display_outline_size = 2 self.theme_name = None self._theme = None self._bg_image_filename = None @@ -426,23 +425,24 @@ class Renderer(object): # dont allow alignment messing with footers if footer: align = 0 - shadow_offset = self._shadow_offset_footer + display_shadow_size = self._display_shadow_size_footer else: align = self._theme.display_horizontalAlign - shadow_offset = self._shadow_offset + display_shadow_size = int(self._theme.display_shadow_size) + _display_outline_size = int(self._theme.display_outline_size) for linenum in range(len(lines)): line = lines[linenum] #find out how wide line is w, h = self._get_extent_and_render(line, footer, tlcorner=(x, y), draw=False) if self._theme.display_shadow: - w += shadow_offset - h += shadow_offset + w += display_shadow_size + h += display_shadow_size if self._theme.display_outline: # pixels either side - w += 2 * self._outline_offset + w += 2 * _display_outline_size # pixels top/bottom - h += 2 * self._outline_offset + h += 2 * _display_outline_size if align == 0: # left align rightextent = x + w # shift right from last line's rh edge @@ -464,36 +464,36 @@ class Renderer(object): # now draw the text, and any outlines/shadows if self._theme.display_shadow: self._get_extent_and_render(line, footer, - tlcorner=(x + shadow_offset, y + shadow_offset), + tlcorner=(x + display_shadow_size, y + display_shadow_size), draw=True, color = self._theme.display_shadow_color) if self._theme.display_outline: self._get_extent_and_render(line, footer, - (x + self._outline_offset, y), draw=True, + (x + _display_outline_size, y), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x, y + self._outline_offset), draw=True, + (x, y + _display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x, y - self._outline_offset), draw=True, + (x, y - _display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x - self._outline_offset, y), draw=True, + (x - _display_outline_size, y), draw=True, color = self._theme.display_outline_color) - if self._outline_offset > 1: + if _display_outline_size > 1: self._get_extent_and_render(line, footer, - (x + self._outline_offset, y + self._outline_offset), + (x + _display_outline_size, y + _display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x - self._outline_offset, y + self._outline_offset), + (x - _display_outline_size, y + _display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x + self._outline_offset, y - self._outline_offset), + (x + _display_outline_size, y - _display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x - self._outline_offset, y - self._outline_offset), + (x - _display_outline_size, y - _display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer,tlcorner=(x, y), diff --git a/openlp/core/lib/themexmlhandler.py b/openlp/core/lib/themexmlhandler.py index 42743d1bd..6b12f50dc 100644 --- a/openlp/core/lib/themexmlhandler.py +++ b/openlp/core/lib/themexmlhandler.py @@ -65,8 +65,8 @@ blankthemexml=\ - True - False + True + False 0 0 0 @@ -238,7 +238,7 @@ class ThemeXML(object): background.appendChild(element) def add_display(self, shadow, shadow_color, outline, outline_color, - horizontal, vertical, wrap, transition): + horizontal, vertical, wrap, transition, shadow_pixel=5, outline_pixel=2): """ Add a Display options. @@ -272,12 +272,14 @@ class ThemeXML(object): # Shadow element = self.theme_xml.createElement(u'shadow') element.setAttribute(u'color', shadow_color) + element.setAttribute(u'size', unicode(shadow_pixel)) value = self.theme_xml.createTextNode(shadow) element.appendChild(value) background.appendChild(element) # Outline element = self.theme_xml.createElement(u'outline') element.setAttribute(u'color', outline_color) + element.setAttribute(u'size', unicode(outline_pixel)) value = self.theme_xml.createTextNode(outline) element.appendChild(value) background.appendChild(element) diff --git a/openlp/core/ui/amendthemedialog.py b/openlp/core/ui/amendthemedialog.py index ad5fbe65f..dffd1dedf 100644 --- a/openlp/core/ui/amendthemedialog.py +++ b/openlp/core/ui/amendthemedialog.py @@ -410,13 +410,13 @@ class Ui_AmendThemeDialog(object): self.OptionsLeftLayout.setSpacing(8) self.OptionsLeftLayout.setMargin(0) self.OptionsLeftLayout.setObjectName(u'OptionsLeftLayout') - self.ShadowGroupBox = QtGui.QGroupBox(self.OptionsLeftWidget) - self.ShadowGroupBox.setObjectName(u'ShadowGroupBox') - self.verticalLayout = QtGui.QVBoxLayout(self.ShadowGroupBox) + self.OutlineGroupBox = QtGui.QGroupBox(self.OptionsLeftWidget) + self.OutlineGroupBox.setObjectName(u'OutlineGroupBox') + self.verticalLayout = QtGui.QVBoxLayout(self.OutlineGroupBox) self.verticalLayout.setSpacing(8) self.verticalLayout.setMargin(8) self.verticalLayout.setObjectName(u'verticalLayout') - self.OutlineWidget = QtGui.QWidget(self.ShadowGroupBox) + self.OutlineWidget = QtGui.QWidget(self.OutlineGroupBox) self.OutlineWidget.setObjectName(u'OutlineWidget') self.OutlineLayout = QtGui.QFormLayout(self.OutlineWidget) self.OutlineLayout.setMargin(0) @@ -425,16 +425,30 @@ class Ui_AmendThemeDialog(object): self.OutlineCheckBox = QtGui.QCheckBox(self.OutlineWidget) self.OutlineCheckBox.setObjectName(u'OutlineCheckBox') self.OutlineLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.OutlineCheckBox) + self.OutlineSpinBox = QtGui.QSpinBox(self.OutlineWidget) + self.OutlineSpinBox.setObjectName("OutlineSpinBox") + self.OutlineSpinBox.setMaximum(10) + self.OutlineLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.OutlineSpinBox) + self.OutlineSpinBoxLabel = QtGui.QLabel(self.OutlineWidget) + self.OutlineSpinBoxLabel.setObjectName(u'OutlineSpinBoxLabel') + self.OutlineLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.OutlineSpinBoxLabel) self.OutlineColorLabel = QtGui.QLabel(self.OutlineWidget) self.OutlineColorLabel.setObjectName(u'OutlineColorLabel') - self.OutlineLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.OutlineColorLabel) + self.OutlineLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.OutlineColorLabel) self.OutlineColorPushButton = QtGui.QPushButton(self.OutlineWidget) self.OutlineColorPushButton.setObjectName(u'OutlineColorPushButton') - self.OutlineLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.OutlineColorPushButton) + self.OutlineLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.OutlineColorPushButton) self.OutlineEnabledLabel = QtGui.QLabel(self.OutlineWidget) self.OutlineEnabledLabel.setObjectName(u'OutlineEnabledLabel') self.OutlineLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.OutlineEnabledLabel) self.verticalLayout.addWidget(self.OutlineWidget) + self.OptionsLeftLayout.addWidget(self.OutlineGroupBox) + self.ShadowGroupBox = QtGui.QGroupBox(self.OptionsLeftWidget) + self.ShadowGroupBox.setObjectName(u'ShadowGroupBox') + self.verticalLayout = QtGui.QVBoxLayout(self.ShadowGroupBox) + self.verticalLayout.setSpacing(8) + self.verticalLayout.setMargin(8) + self.verticalLayout.setObjectName(u'verticalLayout') self.ShadowWidget = QtGui.QWidget(self.ShadowGroupBox) self.ShadowWidget.setObjectName(u'ShadowWidget') self.ShadowLayout = QtGui.QFormLayout(self.ShadowWidget) @@ -444,12 +458,19 @@ class Ui_AmendThemeDialog(object): self.ShadowCheckBox = QtGui.QCheckBox(self.ShadowWidget) self.ShadowCheckBox.setObjectName(u'ShadowCheckBox') self.ShadowLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.ShadowCheckBox) + self.ShadowSpinBox = QtGui.QSpinBox(self.OutlineWidget) + self.ShadowSpinBox.setObjectName("ShadowSpinBox") + self.ShadowSpinBox.setMaximum(10) + self.ShadowLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.ShadowSpinBox) + self.ShadowSpinBoxLabel = QtGui.QLabel(self.OutlineWidget) + self.ShadowSpinBoxLabel.setObjectName(u'ShadowSpinBoxLabel') + self.ShadowLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.ShadowSpinBoxLabel) self.ShadowColorLabel = QtGui.QLabel(self.ShadowWidget) self.ShadowColorLabel.setObjectName(u'ShadowColorLabel') - self.ShadowLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.ShadowColorLabel) + self.ShadowLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.ShadowColorLabel) self.ShadowColorPushButton = QtGui.QPushButton(self.ShadowWidget) self.ShadowColorPushButton.setObjectName(u'ShadowColorPushButton') - self.ShadowLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.ShadowColorPushButton) + self.ShadowLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.ShadowColorPushButton) self.ShadowEnabledLabel = QtGui.QLabel(self.ShadowWidget) self.ShadowEnabledLabel.setObjectName(u'ShadowEnabledLabel') self.ShadowLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.ShadowEnabledLabel) @@ -640,9 +661,14 @@ class Ui_AmendThemeDialog(object): self.ThemeTabWidget.setTabText( self.ThemeTabWidget.indexOf(self.FontFooterTab), self.trUtf8('Font Footer')) - self.ShadowGroupBox.setTitle(self.trUtf8('Shadow && Outline')) + self.OutlineGroupBox.setTitle(self.trUtf8('Outline')) + self.OutlineSpinBoxLabel.setText(self.trUtf8('Outline Size:')) + self.OutlineSpinBox.setSuffix(self.trUtf8('px')) self.OutlineColorLabel.setText(self.trUtf8('Outline Color:')) self.OutlineEnabledLabel.setText(self.trUtf8('Show Outline:')) + self.ShadowGroupBox.setTitle(self.trUtf8('Shadow')) + self.ShadowSpinBoxLabel.setText(self.trUtf8('Shadow Size:')) + self.ShadowSpinBox.setSuffix(self.trUtf8('px')) self.ShadowColorLabel.setText(self.trUtf8('Shadow Color:')) self.ShadowEnabledLabel.setText(self.trUtf8('Show Shadow:')) self.AlignmentGroupBox.setTitle(self.trUtf8('Alignment')) From a7833f900f1a6ffe5ffaa8a47bb6faab777fa0f6 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 15 Dec 2009 20:36:15 +0000 Subject: [PATCH 10/11] Add Outline and Shadow size options and make editable --- openlp/core/lib/renderer.py | 29 +++++++++++++++-------------- openlp/core/ui/amendthemeform.py | 22 +++++++++++++++++++++- 2 files changed, 36 insertions(+), 15 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 1a6350b16..3cb38bfa0 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -43,8 +43,8 @@ class Renderer(object): self._rect = None self._debug = 0 self._right_margin = 64 # the amount of right indent - self._display_shadow_size_footer = 3 - _display_outline_size = 2 + self._display_shadow_size_footer = 0 + self._display_outline_size_footer = 0 self.theme_name = None self._theme = None self._bg_image_filename = None @@ -426,10 +426,11 @@ class Renderer(object): if footer: align = 0 display_shadow_size = self._display_shadow_size_footer + display_outline_size = self._display_outline_size_footer else: align = self._theme.display_horizontalAlign display_shadow_size = int(self._theme.display_shadow_size) - _display_outline_size = int(self._theme.display_outline_size) + display_outline_size = int(self._theme.display_outline_size) for linenum in range(len(lines)): line = lines[linenum] #find out how wide line is @@ -440,9 +441,9 @@ class Renderer(object): h += display_shadow_size if self._theme.display_outline: # pixels either side - w += 2 * _display_outline_size + w += 2 * display_outline_size # pixels top/bottom - h += 2 * _display_outline_size + h += 2 * display_outline_size if align == 0: # left align rightextent = x + w # shift right from last line's rh edge @@ -468,32 +469,32 @@ class Renderer(object): draw=True, color = self._theme.display_shadow_color) if self._theme.display_outline: self._get_extent_and_render(line, footer, - (x + _display_outline_size, y), draw=True, + (x + display_outline_size, y), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x, y + _display_outline_size), draw=True, + (x, y + display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x, y - _display_outline_size), draw=True, + (x, y - display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x - _display_outline_size, y), draw=True, + (x - display_outline_size, y), draw=True, color = self._theme.display_outline_color) - if _display_outline_size > 1: + if display_outline_size > 1: self._get_extent_and_render(line, footer, - (x + _display_outline_size, y + _display_outline_size), + (x + display_outline_size, y + display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x - _display_outline_size, y + _display_outline_size), + (x - display_outline_size, y + display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x + _display_outline_size, y - _display_outline_size), + (x + display_outline_size, y - display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer, - (x - _display_outline_size, y - _display_outline_size), + (x - display_outline_size, y - display_outline_size), draw=True, color = self._theme.display_outline_color) self._get_extent_and_render(line, footer,tlcorner=(x, y), diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py index da56ce3c4..a00a25d72 100644 --- a/openlp/core/ui/amendthemeform.py +++ b/openlp/core/ui/amendthemeform.py @@ -121,8 +121,14 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.onFontFooterHeightSpinBoxChanged) QtCore.QObject.connect(self.OutlineCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onOutlineCheckBoxChanged) + QtCore.QObject.connect(self.ShadowSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onShadowSpinBoxChanged) QtCore.QObject.connect(self.ShadowCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onShadowCheckBoxChanged) + QtCore.QObject.connect(self.OutlineSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onOutlineSpinBoxChanged) QtCore.QObject.connect(self.SlideTransitionCheckedBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onSlideTransitionCheckedBoxChanged) @@ -179,7 +185,9 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): unicode(self.theme.display_horizontalAlign), unicode(self.theme.display_verticalAlign), unicode(self.theme.display_wrapStyle), - unicode(self.theme.display_slideTransition)) + unicode(self.theme.display_slideTransition), + unicode(self.theme.display_shadow_size), + unicode(self.theme.display_outline_size)) theme = new_theme.extract_xml() pretty_theme = new_theme.extract_formatted_xml() if self.thememanager.saveTheme(theme_name, theme, pretty_theme, @@ -434,6 +442,16 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.stateChanging(self.theme) self.previewTheme() + def onOutlineSpinBoxChanged(self): + if self.theme.display_outline_size != self.OutlineSpinBox.value(): + self.theme.display_outline_size = self.OutlineSpinBox.value() + self.previewTheme() + + def onShadowSpinBoxChanged(self): + if self.theme.display_shadow_size != self.ShadowSpinBox.value(): + self.theme.display_shadow_size = self.ShadowSpinBox.value() + self.previewTheme() + def onOutlineColorPushButtonClicked(self): self.theme.display_outline_color = QtGui.QColorDialog.getColor( QtGui.QColor(self.theme.display_outline_color), self).name() @@ -565,6 +583,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): else: self.OutlineCheckBox.setChecked(False) self.OutlineColorPushButton.setEnabled(False) + self.OutlineSpinBox.setValue(int(self.theme.display_outline_size)) if self.theme.display_shadow: self.ShadowCheckBox.setChecked(True) @@ -572,6 +591,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): else: self.ShadowCheckBox.setChecked(False) self.ShadowColorPushButton.setEnabled(False) + self.ShadowSpinBox.setValue(int(self.theme.display_shadow_size)) if self.theme.display_slideTransition: self.SlideTransitionCheckedBox.setCheckState(QtCore.Qt.Checked) From 0cdc827a1d8fcedae38014dcbb26f05bafa14d6f Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 16 Dec 2009 17:54:45 +0000 Subject: [PATCH 11/11] Fix up custom plugin issues --- openlp/core/lib/songxmlhandler.py | 1 + openlp/plugins/custom/forms/editcustomform.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/core/lib/songxmlhandler.py b/openlp/core/lib/songxmlhandler.py index d079c305c..78c7b1e98 100644 --- a/openlp/core/lib/songxmlhandler.py +++ b/openlp/core/lib/songxmlhandler.py @@ -134,6 +134,7 @@ class SongXMLParser(object): ``xml`` The XML of the song to be parsed. """ + self.song_xml = None try: self.song_xml = ElementTree( element=XML(unicode(xml).encode('unicode-escape'))) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index e238b42c7..7c810e727 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -106,7 +106,7 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): for themename in themelist: self.ThemeComboBox.addItem(themename) - def loadCustom(self, id, preview): + def loadCustom(self, id, preview=False): self.customSlide = CustomSlide() self.initialise() if id != 0: