Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Out of curiosity, why have you made all the files executable? -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/15118 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Review: Approve Looks good! Nice catch on the .append! I think you might even be able to lose the \'s... verse = u'Amazing Grace!\n' u'How sweet the sound\n' u'To save a wretch like me;\n' u'I once was lost but now am found,\n' u'Was blind, but now I see.' -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14880 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14880 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Review: Approve I see we're still going with multiple toolbars, but they seem to be sane :-) -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14684 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) More slidecontroller cleanups. Stop Preview of media splatting the display. Make the live toolbar a sensible size again. -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14650 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/ui/maindisplay.py' --- openlp/core/ui/maindisplay.py 2009-11-05 23:21:23 + +++ openlp/core/ui/maindisplay.py 2009-11-09 16:45:26 + @@ -130,7 +130,6 @@ QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_stop'), self.onMediaStop) - def setup(self, screenNumber): Sets up the screen on a particular screen. @@ -264,18 +263,19 @@ self.firstTime = False else: self.mediaObject.enqueue(Phonon.MediaSource(file)) -self.onMediaPlay() +self.onMediaPlay(message[3]) -def onMediaPlay(self): -log.debug(u'Play the new media') -if not self.mediaLoaded and not self.displayBlank: +def onMediaPlay(self, live=True): +log.debug(u'Play the new media, Live %s', live) +if not self.mediaLoaded and not self.displayBlank and live: self.blankDisplay() self.firstTime = True self.mediaLoaded = True -self.display.hide() -self.video.setFullScreen(True) +if live: +self.display.hide() +self.video.setFullScreen(True) self.mediaObject.play() -if self.primary: +if self.primary and live: self.setVisible(True) def onMediaPaws(self): === modified file 'openlp/core/ui/mainwindow.py' --- openlp/core/ui/mainwindow.py 2009-11-08 17:40:43 + +++ openlp/core/ui/mainwindow.py 2009-11-09 16:45:26 + @@ -536,6 +536,9 @@ self.settingsForm.postSetUp() def versionCheck(self): + +Checks the version of the Application called from openlp.pyw + applicationVersion = self.applicationVersion[u'Full'] version = check_latest_version(self.generalConfig, applicationVersion) if applicationVersion != version: === modified file 'openlp/core/ui/slidecontroller.py' --- openlp/core/ui/slidecontroller.py 2009-11-08 17:40:43 + +++ openlp/core/ui/slidecontroller.py 2009-11-09 16:45:26 + @@ -26,6 +26,8 @@ import time from PyQt4 import QtCore, QtGui +from PyQt4.phonon import Phonon + from openlp.core.lib import OpenLPToolbar, Receiver, ServiceItemType, \ str_to_bool, PluginConfig @@ -80,20 +82,9 @@ u'Loop Separator', u'Image SpinBox' ] -self.media_list = [ -u'Media Start', -u'Media Stop', -u'Media Pause' -] self.song_edit_list = [ u'Edit Song', ] -self.song_list = [ -u'First Slide', -u'Previous Slide', -u'Next Slide', -u'Last Slide', -] self.timer_id = 0 self.commandItem = None self.songEdit = False @@ -109,10 +100,12 @@ self.TypeLabel.setText(u'strong%s/strong' % self.trUtf8(u'Live')) self.split = 1 +prefix = u'live_slidecontroller' else: self.TypeLabel.setText(u'strong%s/strong' % self.trUtf8(u'Preview')) self.split = 0 +prefix = u'preview_slidecontroller' self.TypeLabel.setAlignment(QtCore.Qt.AlignCenter) self.PanelLayout.addWidget(self.TypeLabel) # Splitter @@ -190,16 +183,24 @@ u'Image SpinBox', self.DelaySpinBox) self.DelaySpinBox.setSuffix(self.trUtf8(u's')) self.DelaySpinBox.setToolTip(self.trUtf8(u'Delay between slides in seconds')) -self.Toolbar.addToolbarButton( -u'Media Start', u':/slides/media_playback_start.png', -self.trUtf8(u'Start playing media'), self.onMediaPlay) -self.Toolbar.addToolbarButton( -u'Media Pause', u':/slides/media_playback_pause.png', -self.trUtf8(u'Start playing media'), self.onMediaPause) -self.Toolbar.addToolbarButton( -u'Media Stop', u':/slides/media_playback_stop.png', -self.trUtf8(u'Start playing media'), self.onMediaStop) self.ControllerLayout.addWidget(self.Toolbar) +#Build a Media ToolBar +self.Mediabar = OpenLPToolbar(self) +self.Mediabar.addToolbarButton( +u'Media Start', u':/slides/media_playback_start.png', +self.trUtf8(u'Start playing media'), self.onMediaPlay) +self.Mediabar.addToolbarButton( +u'Media Pause', u':/slides/media_playback_pause.png', +self.trUtf8(u'Start playing media'), self.onMediaPause) +self.Mediabar.addToolbarButton( +
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Added code to allow media previews -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14650 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14662 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/ui/maindisplay.py' --- openlp/core/ui/maindisplay.py 2009-11-05 23:21:23 + +++ openlp/core/ui/maindisplay.py 2009-11-09 20:35:23 + @@ -107,7 +107,6 @@ self.blankFrame = None self.frame = None self.alertactive = False -self.alertTab = None self.timer_id = 0 self.firstTime = True self.mediaLoaded = False @@ -130,7 +129,6 @@ QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_stop'), self.onMediaStop) - def setup(self, screenNumber): Sets up the screen on a particular screen. @@ -264,18 +262,19 @@ self.firstTime = False else: self.mediaObject.enqueue(Phonon.MediaSource(file)) -self.onMediaPlay() +self.onMediaPlay(message[3]) -def onMediaPlay(self): -log.debug(u'Play the new media') -if not self.mediaLoaded and not self.displayBlank: +def onMediaPlay(self, live=True): +log.debug(u'Play the new media, Live %s', live) +if not self.mediaLoaded and not self.displayBlank and live: self.blankDisplay() self.firstTime = True self.mediaLoaded = True -self.display.hide() -self.video.setFullScreen(True) +if live: +self.display.hide() +self.video.setFullScreen(True) self.mediaObject.play() -if self.primary: +if self.primary and live: self.setVisible(True) def onMediaPaws(self): === modified file 'openlp/core/ui/mainwindow.py' --- openlp/core/ui/mainwindow.py 2009-11-08 17:40:43 + +++ openlp/core/ui/mainwindow.py 2009-11-09 20:35:23 + @@ -536,6 +536,9 @@ self.settingsForm.postSetUp() def versionCheck(self): + +Checks the version of the Application called from openlp.pyw + applicationVersion = self.applicationVersion[u'Full'] version = check_latest_version(self.generalConfig, applicationVersion) if applicationVersion != version: === modified file 'openlp/core/ui/slidecontroller.py' --- openlp/core/ui/slidecontroller.py 2009-11-08 17:40:43 + +++ openlp/core/ui/slidecontroller.py 2009-11-09 20:35:23 + @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - ### # OpenLP - Open Source Lyrics Projection # # --- # @@ -24,8 +23,11 @@ import logging import time +import os from PyQt4 import QtCore, QtGui +from PyQt4.phonon import Phonon + from openlp.core.lib import OpenLPToolbar, Receiver, ServiceItemType, \ str_to_bool, PluginConfig @@ -80,20 +82,9 @@ u'Loop Separator', u'Image SpinBox' ] -self.media_list = [ -u'Media Start', -u'Media Stop', -u'Media Pause' -] self.song_edit_list = [ u'Edit Song', ] -self.song_list = [ -u'First Slide', -u'Previous Slide', -u'Next Slide', -u'Last Slide', -] self.timer_id = 0 self.commandItem = None self.songEdit = False @@ -109,10 +100,12 @@ self.TypeLabel.setText(u'strong%s/strong' % self.trUtf8(u'Live')) self.split = 1 +prefix = u'live_slidecontroller' else: self.TypeLabel.setText(u'strong%s/strong' % self.trUtf8(u'Preview')) self.split = 0 +prefix = u'preview_slidecontroller' self.TypeLabel.setAlignment(QtCore.Qt.AlignCenter) self.PanelLayout.addWidget(self.TypeLabel) # Splitter @@ -190,16 +183,24 @@ u'Image SpinBox', self.DelaySpinBox) self.DelaySpinBox.setSuffix(self.trUtf8(u's')) self.DelaySpinBox.setToolTip(self.trUtf8(u'Delay between slides in seconds')) -self.Toolbar.addToolbarButton( -u'Media Start', u':/slides/media_playback_start.png', -self.trUtf8(u'Start playing media'), self.onMediaPlay) -self.Toolbar.addToolbarButton( -u'Media Pause', u':/slides/media_playback_pause.png', -self.trUtf8(u'Start playing media'), self.onMediaPause) -self.Toolbar.addToolbarButton( -u'Media Stop', u':/slides/media_playback_stop.png', -self.trUtf8(u'Start playing media'), self.onMediaStop)
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Review: Approve Well, if I could see more than the resource file, I might have had some issues, but since I can't, you're fortunate to have evaded the Fly Eye. -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14616 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Should that \xf5 about three quarters of the way down be \xf6? ;) -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14616 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14616 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) Fix bugs in previous merges and set the size policy correctly. -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14620 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/lib/__init__.py' --- openlp/core/lib/__init__.py 2009-11-03 18:14:25 + +++ openlp/core/lib/__init__.py 2009-11-08 14:00:29 + @@ -60,7 +60,7 @@ file = open(xmlfile, u'r') xml = file.read() except IOError: -log.exception(u'Failed to open XML file') +print(u'Failed to open XML file') finally: if file: file.close() === modified file 'openlp/core/lib/rendermanager.py' --- openlp/core/lib/rendermanager.py 2009-11-04 01:16:15 + +++ openlp/core/lib/rendermanager.py 2009-11-08 14:00:29 + @@ -253,7 +253,7 @@ newImage = QtGui.QImage(w, h, QtGui.QImage.Format_ARGB32_Premultiplied) newImage.fill(QtCore.Qt.black) painter = QtGui.QPainter(newImage) -painter.drawImage((w-realw) / 2, (h-realh) / 2, preview) +painter.drawImage((w - realw) / 2, (h - realh) / 2, preview) return newImage def calculate_default(self, screen): === modified file 'openlp/core/ui/slidecontroller.py' --- openlp/core/ui/slidecontroller.py 2009-11-08 09:09:23 + +++ openlp/core/ui/slidecontroller.py 2009-11-08 14:00:29 + @@ -219,7 +219,7 @@ self.PreviewFrame = QtGui.QFrame(self.Splitter) self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 300, 225)) self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy( -QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)) +QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Label)) self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel) self.PreviewFrame.setFrameShadow(QtGui.QFrame.Sunken) self.PreviewFrame.setObjectName(u'PreviewFrame') @@ -319,7 +319,7 @@ if item.verse_order: verses = item.verse_order.split(u' ') for verse in verses: -if int(verse) 12: +if not verse or int(verse) 12: break try: self.Songbar.actions[verse].setVisible(True) === modified file 'openlp/core/ui/thememanager.py' --- openlp/core/ui/thememanager.py 2009-11-07 06:45:25 + +++ openlp/core/ui/thememanager.py 2009-11-08 14:00:29 + @@ -271,7 +271,6 @@ return self.themelist def getThemeData(self, themename): -assert(themename) log.debug(u'getthemedata for theme %s', themename) xml_file = os.path.join(self.path, unicode(themename), unicode(themename) + u'.xml') ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: Raoul Snyman (raoul-snyman): -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14621 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/lib/__init__.py' --- openlp/core/lib/__init__.py 2009-11-03 18:14:25 + +++ openlp/core/lib/__init__.py 2009-11-08 14:20:24 + @@ -26,11 +26,13 @@ The :mod:`lib` module contains most of the components and libraries that make OpenLP work. - +import logging import types from PyQt4 import QtCore, QtGui +log = logging.getLogger(__name__) + def translate(context, text): A special shortcut method to wrap around the Qt4 translation functions. @@ -60,7 +62,9 @@ file = open(xmlfile, u'r') xml = file.read() except IOError: -log.exception(u'Failed to open XML file') +#This may not be an error as this is also used to check +#that a file exist +log.error(u'Failed to open XML file %s' % xmlfile) finally: if file: file.close() === modified file 'openlp/core/lib/rendermanager.py' --- openlp/core/lib/rendermanager.py 2009-11-04 01:16:15 + +++ openlp/core/lib/rendermanager.py 2009-11-08 14:20:24 + @@ -253,7 +253,7 @@ newImage = QtGui.QImage(w, h, QtGui.QImage.Format_ARGB32_Premultiplied) newImage.fill(QtCore.Qt.black) painter = QtGui.QPainter(newImage) -painter.drawImage((w-realw) / 2, (h-realh) / 2, preview) +painter.drawImage((w - realw) / 2, (h - realh) / 2, preview) return newImage def calculate_default(self, screen): === modified file 'openlp/core/ui/mainwindow.py' --- openlp/core/ui/mainwindow.py 2009-11-05 17:33:38 + +++ openlp/core/ui/mainwindow.py 2009-11-08 14:20:24 + @@ -300,8 +300,14 @@ # Connect up some signals and slots QtCore.QObject.connect(self.FileExitItem, QtCore.SIGNAL(u'triggered()'), MainWindow.close) +QtCore.QObject.connect(self.ControlSplitter, +QtCore.SIGNAL(u'splitterMoved(int, int)'), self.trackSplitter) QtCore.QMetaObject.connectSlotsByName(MainWindow) +def trackSplitter(self, tab, pos): +#print tab, pos +pass + def retranslateUi(self, MainWindow): Set up the translation system === modified file 'openlp/core/ui/slidecontroller.py' --- openlp/core/ui/slidecontroller.py 2009-11-08 09:09:23 + +++ openlp/core/ui/slidecontroller.py 2009-11-08 14:20:24 + @@ -219,7 +219,7 @@ self.PreviewFrame = QtGui.QFrame(self.Splitter) self.PreviewFrame.setGeometry(QtCore.QRect(0, 0, 300, 225)) self.PreviewFrame.setSizePolicy(QtGui.QSizePolicy( -QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum)) +QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Label)) self.PreviewFrame.setFrameShape(QtGui.QFrame.StyledPanel) self.PreviewFrame.setFrameShadow(QtGui.QFrame.Sunken) self.PreviewFrame.setObjectName(u'PreviewFrame') @@ -319,7 +319,7 @@ if item.verse_order: verses = item.verse_order.split(u' ') for verse in verses: -if int(verse) 12: +if not verse or int(verse) 12: break try: self.Songbar.actions[verse].setVisible(True) === modified file 'openlp/core/ui/thememanager.py' --- openlp/core/ui/thememanager.py 2009-11-07 06:45:25 + +++ openlp/core/ui/thememanager.py 2009-11-08 14:20:24 + @@ -271,7 +271,6 @@ return self.themelist def getThemeData(self, themename): -assert(themename) log.debug(u'getthemedata for theme %s', themename) xml_file = os.path.join(self.path, unicode(themename), unicode(themename) + u'.xml') ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14621 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) Remove Can_be_disabled as no longer require Sort out status handling in plugin form. -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14579 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/lib/plugin.py' --- openlp/core/lib/plugin.py 2009-11-03 18:14:25 + +++ openlp/core/lib/plugin.py 2009-11-07 08:00:40 + @@ -139,14 +139,6 @@ return True -def can_be_disabled(self): - -Indicates whether the plugin can be disabled by the plugin list. - -Returns True or False. - -return False - def set_status(self): Sets the status of the plugin === modified file 'openlp/core/lib/pluginmanager.py' --- openlp/core/lib/pluginmanager.py 2009-11-03 18:14:25 + +++ openlp/core/lib/pluginmanager.py 2009-11-07 08:00:40 + @@ -105,10 +105,7 @@ for plugin in plugins_list: if plugin.check_pre_conditions(): log.debug(u'Plugin %s active', unicode(plugin.name)) -if plugin.can_be_disabled(): -plugin.set_status() -else: -plugin.status = PluginStatus.Active +plugin.set_status() else: plugin.status = PluginStatus.Disabled self.plugins.append(plugin) === modified file 'openlp/core/ui/pluginform.py' --- openlp/core/ui/pluginform.py 2009-11-03 18:14:25 + +++ openlp/core/ui/pluginform.py 2009-11-07 08:00:40 + @@ -79,17 +79,16 @@ self.StatusComboBox.setCurrentIndex(-1) self.VersionNumberLabel.setText(u'') self.AboutTextBrowser.setHtml(u'') +self.StatusComboBox.setEnabled(False) def _setDetails(self): log.debug('PluginStatus: %s', str(self.activePlugin.status)) self.VersionNumberLabel.setText(self.activePlugin.version) self.AboutTextBrowser.setHtml(self.activePlugin.about()) -if self.activePlugin.can_be_disabled(): -self.programaticChange = True -self.StatusComboBox.setCurrentIndex(int(self.activePlugin.status)) -self.StatusComboBox.setEnabled(True) -else: -self.StatusComboBox.setEnabled(False) +self.programaticChange = True +self.StatusComboBox.setCurrentIndex(int(self.activePlugin.status)) +self.StatusComboBox.setEnabled(True) +self.programaticChange = False def onPluginListWidgetSelectionChanged(self): if self.PluginListWidget.currentItem() is None: @@ -107,9 +106,6 @@ self._clearDetails() def onStatusComboBoxChanged(self, status): -if self.programaticChange: -self.programaticChange = False -return self.activePlugin.toggle_status(status) if status == PluginStatus.Active: self.activePlugin.initialise() === modified file 'openlp/plugins/bibles/bibleplugin.py' --- openlp/plugins/bibles/bibleplugin.py 2009-11-03 19:01:53 + +++ openlp/plugins/bibles/bibleplugin.py 2009-11-07 08:00:40 + @@ -41,9 +41,6 @@ #Register the bible Manager self.biblemanager = None -def can_be_disabled(self): -return True - def initialise(self): log.info(u'bibles Initialising') if self.biblemanager is None: === modified file 'openlp/plugins/custom/customplugin.py' --- openlp/plugins/custom/customplugin.py 2009-10-30 20:34:11 + +++ openlp/plugins/custom/customplugin.py 2009-11-07 08:00:40 + @@ -54,9 +54,6 @@ # Create the CustomManagerItem object return CustomMediaItem(self, self.icon, self.name) -def can_be_disabled(self): -return True - def initialise(self): log.info(u'Plugin Initialising') Plugin.initialise(self) === modified file 'openlp/plugins/images/imageplugin.py' --- openlp/plugins/images/imageplugin.py 2009-10-30 20:34:11 + +++ openlp/plugins/images/imageplugin.py 2009-11-07 08:00:40 + @@ -37,9 +37,6 @@ self.weight = -7 self.icon = buildIcon(u':/media/media_image.png') -def can_be_disabled(self): -return True - def initialise(self): log.info(u'Plugin Initialising') Plugin.initialise(self) @@ -60,7 +57,7 @@ about_text = self.trUtf8(u'bImage Plugin/bbrAllows images of ' u'all types to be displayed. If a number of images are selected ' u'together and presented on the live controller it is possible ' -u'to turn them into a timed loop.brFrom the plugin if the ' +u'to turn them into a timed loop.brbrFrom the plugin if the ' u'iOverride background/i is chosen and an image is selected ' u'any somgs which are rendered will use the selected image from ' u'the background instead of
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Review: Approve Looks good and works for me. -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14586 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: Jon Tibble (meths) Fix remote song editing generation of error messages -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14433 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/lib/mediamanageritem.py' --- openlp/core/lib/mediamanageritem.py 2009-11-03 01:12:35 + +++ openlp/core/lib/mediamanageritem.py 2009-11-04 18:15:24 + @@ -24,7 +24,6 @@ import types import os -import uuid from PyQt4 import QtCore, QtGui @@ -113,6 +112,7 @@ if title is not None: self.title = title self.Toolbar = None +self.remoteTriggered = None self.ServiceItemIconName = None self.PageLayout = QtGui.QVBoxLayout(self) self.PageLayout.setSpacing(0) @@ -358,13 +358,13 @@ u'to be defined by the plugin') def onPreviewClick(self): -if not self.ListView.selectedIndexes(): +if not self.ListView.selectedIndexes() and not self.remoteTriggered: QtGui.QMessageBox.information(self, self.trUtf8(u'No items selected...'), self.trUtf8(u'You must select one or more items')) log.debug(self.PluginNameShort + u' Preview Requested') service_item = self.buildServiceItem() -if service_item is not None: +if service_item: service_item.fromPlugin = True self.parent.preview_controller.addServiceItem(service_item) @@ -375,21 +375,20 @@ self.trUtf8(u'You must select one or more items')) log.debug(self.PluginNameShort + u' Live Requested') service_item = self.buildServiceItem() -if service_item is not None: +if service_item: service_item.fromPlugin = True service_item.uuid = unicode(uuid.uuid1()) self.parent.live_controller.addServiceItem(service_item) def onAddClick(self): -if not self.ListView.selectedIndexes(): +if not self.ListView.selectedIndexes() and not self.remoteTriggered: QtGui.QMessageBox.information(self, self.trUtf8(u'No items selected...'), self.trUtf8(u'You must select one or more items')) log.debug(self.PluginNameShort + u' Add Requested') service_item = self.buildServiceItem() -if service_item is not None: +if service_item: service_item.fromPlugin = False -service_item.uuid = unicode(uuid.uuid1()) self.parent.service_manager.addServiceItem(service_item) def buildServiceItem(self): @@ -397,7 +396,7 @@ Common method for generating a service item service_item = ServiceItem(self.parent) -if self.ServiceItemIconName is not None: +if self.ServiceItemIconName: service_item.addIcon(self.ServiceItemIconName) else: service_item.addIcon( === modified file 'openlp/core/lib/serviceitem.py' --- openlp/core/lib/serviceitem.py 2009-11-01 16:06:59 + +++ openlp/core/lib/serviceitem.py 2009-11-04 18:15:24 + @@ -25,6 +25,7 @@ import logging import os import time +import uuid from PyQt4 import QtGui @@ -73,6 +74,7 @@ self.service_item_type = None self.editEnabled = False self.service_frames = [] +self.uuid = unicode(uuid.uuid1()) def addIcon(self, icon): === modified file 'openlp/plugins/songs/lib/mediaitem.py' --- openlp/plugins/songs/lib/mediaitem.py 2009-11-03 06:15:35 + +++ openlp/plugins/songs/lib/mediaitem.py 2009-11-04 18:15:24 + @@ -55,7 +55,6 @@ self.parent.songmanager, self) #Holds information about whether the edit is remotly triggered and which #Song is required. -self.remoteTriggered = None self.remoteSong = -1 def initPluginNameVisible(self): @@ -180,7 +179,6 @@ def displayResultsSong(self, searchresults): log.debug(u'display results Song') self.ListView.clear() -#log.debug(u'Records returned from search %s, len(searchresults)) for song in searchresults: author_list = u'' for author in song.authors: ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) Clean up song editing Fix wonky expansion in service manager -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14378 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/lib/eventreceiver.py' --- openlp/core/lib/eventreceiver.py 2009-10-29 15:57:58 + +++ openlp/core/lib/eventreceiver.py 2009-11-03 18:50:27 + @@ -93,9 +93,6 @@ ``config_updated`` Informs components the config has changed -``edit_song`` -Requests the current song on the preview display be loaded for edit - ``preview_song`` Tells the song plugin the edit has finished and the song can be previewed Only available if the edit was triggered by the Preview button. === modified file 'openlp/core/ui/servicemanager.py' --- openlp/core/ui/servicemanager.py 2009-11-03 01:37:08 + +++ openlp/core/ui/servicemanager.py 2009-11-03 18:50:27 + @@ -162,6 +162,7 @@ QtGui.QAbstractItemView.DragDrop) self.ServiceManagerList.setAlternatingRowColors(True) self.ServiceManagerList.setHeaderHidden(True) +self.ServiceManagerList.setExpandsOnDoubleClick(False) self.ServiceManagerList.setObjectName(u'ServiceManagerList') # enable drop self.ServiceManagerList.__class__.dragEnterEvent = self.dragEnterEvent @@ -584,7 +585,7 @@ item, count = self.findServiceItem() if self.serviceItems[item][u'data'].editEnabled: self.remoteEditTriggered = True -Receiver().send_message(u'%s_edit' % self.serviceItems[item][u'data'].name, +Receiver().send_message(u'%s_edit' % self.serviceItems[item][u'data'].name, u'L:%s' % self.serviceItems[item][u'data'].editId ) def onRemoteEditClear(self): === modified file 'openlp/core/ui/slidecontroller.py' --- openlp/core/ui/slidecontroller.py 2009-11-02 01:03:27 + +++ openlp/core/ui/slidecontroller.py 2009-11-03 18:50:27 + @@ -323,7 +323,7 @@ Allows the Preview toolbar to be customised -if item.name == u'Songs' and item.fromPlugin: +if (item.name == u'Songs' or item.name == u'Custom') and item.fromPlugin: self.Toolbar.makeWidgetsVisible(self.song_list) else: self.Toolbar.makeWidgetsInvisible(self.song_list) @@ -561,7 +561,8 @@ def onEditSong(self): self.songEdit = True -Receiver().send_message(u'edit_song') +Receiver().send_message(u'%s_edit' % self.commandItem.name, u'P:%s' % +self.commandItem.editId ) def onGoLive(self): === modified file 'openlp/plugins/songs/lib/mediaitem.py' --- openlp/plugins/songs/lib/mediaitem.py 2009-11-01 09:07:10 + +++ openlp/plugins/songs/lib/mediaitem.py 2009-11-03 18:50:27 + @@ -53,12 +53,10 @@ self.edit_song_form = EditSongForm(self.parent.songmanager, self) self.song_maintenance_form = SongMaintenanceForm( self.parent.songmanager, self) -#fromPreview holds the id of the item if the song editor needs to trigger a preview -#without closing. It is set to -1 if this function is inactive -self.fromPreview = -1 -#fromServiceManager holds the id of the item if the song editor needs to trigger posting -#to the servicemanager without closing. It is set to -1 if this function is inactive -self.fromServiceManager = -1 +#Holds information about whether the edit is remotly triggered and which +#Song is required. +self.remoteTriggered = None +self.remoteSong = -1 def initPluginNameVisible(self): self.PluginNameVisible = self.trUtf8(u'Song') @@ -129,8 +127,6 @@ QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.configUpdated) QtCore.QObject.connect(Receiver.get_receiver(), -QtCore.SIGNAL(u'edit_song'), self.onEventEditSong) -QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'preview_song'), self.onPreviewClick) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_edit' % self.parent.name), self.onRemoteEdit) @@ -172,6 +168,14 @@ search_results = self.parent.songmanager.get_song_from_author( search_keywords) self.displayResultsAuthor(search_results) +#Called to redisplay the song list screen edith from a search +#or from the exit of the Song edit dialog. If remote editing is active +#Trigger it and clean up so it will not update again. +if self.remoteTriggered == u'L': +self.onAddClick() +if self.remoteTriggered == u'P': +self.onPreviewClick() +self.onRemoteEditClear() def displayResultsSong(self,
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14308 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Review: Approve Nice! -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14284 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) Fixes Amend theme file handing works better Renderer cleans up on change of images better Save Preview is now optional - this makes ServiceItem editing work better Error Message for new ServiceItem with unsaved one. Move message for Splash screen till later. -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14242 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp.pyw' --- openlp.pyw 2009-10-18 18:15:20 + +++ openlp.pyw 2009-10-30 21:55:19 + @@ -105,6 +105,7 @@ if show_splash: # now kill the splashscreen self.splash.finish(self.mainWindow) +self.mainWindow.versionCheck() return self.exec_() def main(): === modified file 'openlp/core/lib/renderer.py' --- openlp/core/lib/renderer.py 2009-10-23 17:09:09 + +++ openlp/core/lib/renderer.py 2009-10-30 21:55:19 + @@ -72,9 +72,11 @@ self._theme = theme self.bg_frame = None self.bg_image = None +self._bg_image_filename = None self.theme_name = theme.theme_name self._set_theme_font() if theme.background_type == u'image': +print theme.background_filename if theme.background_filename is not None: self.set_bg_image(theme.background_filename) @@ -110,8 +112,8 @@ painter.begin(self.bg_image) self.background_offsetx = (width - realwidth) / 2 self.background_offsety = (height - realheight) / 2 -painter.drawImage(self.background_offsetx, self.background_offsety, -preview) +painter.drawImage(self.background_offsetx, +self.background_offsety, preview) painter.end() def set_frame_dest(self, frame_width, frame_height, preview=False): === modified file 'openlp/core/ui/amendthemeform.py' --- openlp/core/ui/amendthemeform.py 2009-10-29 23:27:45 + +++ openlp/core/ui/amendthemeform.py 2009-10-30 21:55:19 + @@ -431,7 +431,6 @@ QtGui.QColor(self.theme.background_endColor), self).name() self.Color2PushButton.setStyleSheet( u'background-color: %s' % unicode(self.theme.background_endColor)) - self.previewTheme(self.theme) # #Other Tab @@ -486,12 +485,14 @@ self.BackgroundComboBox.setCurrentIndex(0) else: self.BackgroundComboBox.setCurrentIndex(1) +self.ImageLineEdit.setText(u'') if theme.background_type == u'solid': self.BackgroundTypeComboBox.setCurrentIndex(0) elif theme.background_type == u'gradient': self.BackgroundTypeComboBox.setCurrentIndex(1) else: self.BackgroundTypeComboBox.setCurrentIndex(2) +self.ImageLineEdit.setText(self.theme.background_filename) if self.theme.background_direction == u'horizontal': self.GradientComboBox.setCurrentIndex(0) elif self.theme.background_direction == u'vertical': === modified file 'openlp/core/ui/generaltab.py' --- openlp/core/ui/generaltab.py 2009-10-30 17:44:16 + +++ openlp/core/ui/generaltab.py 2009-10-30 21:55:19 + @@ -76,6 +76,18 @@ self.ShowSplashCheckBox.setObjectName(u'ShowSplashCheckBox') self.StartupLayout.addWidget(self.ShowSplashCheckBox) self.GeneralLeftLayout.addWidget(self.StartupGroupBox) + +self.SettingsGroupBox = QtGui.QGroupBox(self.GeneralLeftWidget) +self.SettingsGroupBox.setObjectName(u'SettingsGroupBox') +self.SettingsLayout = QtGui.QVBoxLayout(self.SettingsGroupBox) +self.SettingsLayout.setSpacing(8) +self.SettingsLayout.setMargin(8) +self.SettingsLayout.setObjectName(u'SettingsLayout') +self.SaveCheckOOSCheckBox = QtGui.QCheckBox(self.SettingsGroupBox) +self.SaveCheckOOSCheckBox.setObjectName(u'SaveCheckOOSCheckBox') +self.SettingsLayout.addWidget(self.SaveCheckOOSCheckBox) +self.GeneralLeftLayout.addWidget(self.SettingsGroupBox) + self.GeneralLeftSpacer = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.GeneralLeftLayout.addItem(self.GeneralLeftSpacer) @@ -124,6 +136,8 @@ QtCore.SIGNAL(u'stateChanged(int)'), self.onAutoOpenCheckBoxChanged) QtCore.QObject.connect(self.ShowSplashCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onShowSplashCheckBoxChanged) +QtCore.QObject.connect(self.SaveCheckOOSCheckBox, +QtCore.SIGNAL(u'stateChanged(int)'), self.onSaveCheckOOSCheckBox) QtCore.QObject.connect(self.NumberEdit, QtCore.SIGNAL(u'editingFinished()'), self.onNumberEditLostFocus) QtCore.QObject.connect(self.UsernameEdit, @@ -138,6 +152,8 @@ self.WarningCheckBox.setText(self.trUtf8(u'Show blank screen warning'))
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Superseded -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14242 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14243 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Review: Approve Looks fine to me. -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14138 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14139 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) Initial version of edit songs and custom from service item. Works fine but unable to hide edit menu item as it messes up all mouse events. Code commented out till we can understand what I have done wrong. Rest of the code is code is fine though. -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14165 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/lib/eventreceiver.py' --- openlp/core/lib/eventreceiver.py 2009-10-27 08:38:02 + +++ openlp/core/lib/eventreceiver.py 2009-10-29 13:55:18 + @@ -78,6 +78,9 @@ ``{plugin}_stop`` Requests a plugin to handle a stop event +``{plugin}_edit`` +Requests a plugin edit a database item with the key as the payload + ``songusage_live`` Sends live song audit requests to the audit component @@ -93,10 +96,14 @@ ``preview_song`` Tells the song plugin the edit has finished and the song can be previewed Only available if the edit was triggered by the Preview button. - + ``slidecontroller_change`` Informs the slidecontroller that a slide change has occurred + +``remote_edite_clear`` +Informs all components that remote edit has been aborted. + global log log = logging.getLogger(u'EventReceiver') @@ -154,4 +161,4 @@ Get the global ``eventreceiver`` instance. -return Receiver.eventreceiver \ No newline at end of file +return Receiver.eventreceiver === modified file 'openlp/core/lib/serviceitem.py' --- openlp/core/lib/serviceitem.py 2009-10-16 23:34:56 + +++ openlp/core/lib/serviceitem.py 2009-10-29 13:55:18 + @@ -70,6 +70,7 @@ self.theme = None self.service_item_path = None self.service_item_type = None +self.editEnabled = False self.service_frames = [] def addIcon(self, icon): === modified file 'openlp/core/ui/servicemanager.py' --- openlp/core/ui/servicemanager.py 2009-10-25 18:07:23 + +++ openlp/core/ui/servicemanager.py 2009-10-29 13:55:18 + @@ -38,6 +38,24 @@ QtGui.QTreeWidget.__init__(self,parent) self.parent = parent +#def mousePressEvent(self, event): +#if event.button() == QtCore.Qt.RightButton: +#item = self.itemAt(event.pos()) +#parentitem = item.parent() +#if parentitem is None: +#pos = item.data(0, QtCore.Qt.UserRole).toInt()[0] +#else: +#pos = parentitem.data(0, QtCore.Qt.UserRole).toInt()[0] +#serviceItem = self.parent.serviceItems[pos - 1] +#if serviceItem[u'data'].editEnabled: +#self.parent.editAction.setVisible(True) +#else: +#self.parent.editAction.setVisible(False) +#event.accept() +#else: +#event.ignore() + + def keyPressEvent(self, event): if type(event) == QtGui.QKeyEvent: #here accept the event and do something @@ -111,6 +129,7 @@ self.serviceItems = [] self.serviceName = u'' self.isNew = True +self.remoteEditTriggered = False self.Layout = QtGui.QVBoxLayout(self) self.Layout.setSpacing(0) self.Layout.setMargin(0) @@ -157,6 +176,12 @@ # Add a context menu to the service manager list self.ServiceManagerList.setContextMenuPolicy( QtCore.Qt.ActionsContextMenu) +self.editAction = contextMenuAction( +self.ServiceManagerList, ':/system/system_live.png', +self.trUtf8(u'Edit Item'), self.remoteEdit) +self.ServiceManagerList.addAction(self.editAction) +self.ServiceManagerList.addAction(contextMenuSeparator( +self.ServiceManagerList)) self.ServiceManagerList.addAction(contextMenuAction( self.ServiceManagerList, ':/system/system_preview.png', self.trUtf8(u'Preview Verse'), self.makePreview)) @@ -205,6 +230,8 @@ QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'), self.expanded) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'update_themes'), self.updateThemeList) +QtCore.QObject.connect(Receiver.get_receiver(), +QtCore.SIGNAL(u'remote_edit_clear'), self.onRemoteEditClear) # Last little bits of setting up self.config = PluginConfig(u'ServiceManager') self.servicePath = self.config.get_data_path() @@ -510,14 +537,19 @@ sitem, count = self.findServiceItem() item.render() -if sitem == -1: -self.serviceItems.append({u'data': item, -u'order': len(self.serviceItems) + 1, u'expanded':True}) -self.repaintServiceList(len(self.serviceItems) + 1, 0) -else: -
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14166 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/lib/eventreceiver.py' --- openlp/core/lib/eventreceiver.py 2009-10-27 08:38:02 + +++ openlp/core/lib/eventreceiver.py 2009-10-29 14:05:22 + @@ -78,6 +78,9 @@ ``{plugin}_stop`` Requests a plugin to handle a stop event +``{plugin}_edit`` +Requests a plugin edit a database item with the key as the payload + ``songusage_live`` Sends live song audit requests to the audit component @@ -93,10 +96,14 @@ ``preview_song`` Tells the song plugin the edit has finished and the song can be previewed Only available if the edit was triggered by the Preview button. - + ``slidecontroller_change`` Informs the slidecontroller that a slide change has occurred + +``remote_edite_clear`` +Informs all components that remote edit has been aborted. + global log log = logging.getLogger(u'EventReceiver') @@ -154,4 +161,4 @@ Get the global ``eventreceiver`` instance. -return Receiver.eventreceiver \ No newline at end of file +return Receiver.eventreceiver === modified file 'openlp/core/lib/serviceitem.py' --- openlp/core/lib/serviceitem.py 2009-10-16 23:34:56 + +++ openlp/core/lib/serviceitem.py 2009-10-29 14:05:22 + @@ -70,6 +70,7 @@ self.theme = None self.service_item_path = None self.service_item_type = None +self.editEnabled = False self.service_frames = [] def addIcon(self, icon): === modified file 'openlp/core/ui/servicemanager.py' --- openlp/core/ui/servicemanager.py 2009-10-25 18:07:23 + +++ openlp/core/ui/servicemanager.py 2009-10-29 14:05:22 + @@ -38,6 +38,24 @@ QtGui.QTreeWidget.__init__(self,parent) self.parent = parent +#def mousePressEvent(self, event): +#if event.button() == QtCore.Qt.RightButton: +#item = self.itemAt(event.pos()) +#parentitem = item.parent() +#if parentitem is None: +#pos = item.data(0, QtCore.Qt.UserRole).toInt()[0] +#else: +#pos = parentitem.data(0, QtCore.Qt.UserRole).toInt()[0] +#serviceItem = self.parent.serviceItems[pos - 1] +#if serviceItem[u'data'].editEnabled: +#self.parent.editAction.setVisible(True) +#else: +#self.parent.editAction.setVisible(False) +#event.accept() +#else: +#event.ignore() + + def keyPressEvent(self, event): if type(event) == QtGui.QKeyEvent: #here accept the event and do something @@ -111,6 +129,7 @@ self.serviceItems = [] self.serviceName = u'' self.isNew = True +self.remoteEditTriggered = False self.Layout = QtGui.QVBoxLayout(self) self.Layout.setSpacing(0) self.Layout.setMargin(0) @@ -157,6 +176,12 @@ # Add a context menu to the service manager list self.ServiceManagerList.setContextMenuPolicy( QtCore.Qt.ActionsContextMenu) +self.editAction = contextMenuAction( +self.ServiceManagerList, ':/system/system_live.png', +self.trUtf8(u'Edit Item'), self.remoteEdit) +self.ServiceManagerList.addAction(self.editAction) +self.ServiceManagerList.addAction(contextMenuSeparator( +self.ServiceManagerList)) self.ServiceManagerList.addAction(contextMenuAction( self.ServiceManagerList, ':/system/system_preview.png', self.trUtf8(u'Preview Verse'), self.makePreview)) @@ -205,6 +230,8 @@ QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'), self.expanded) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'update_themes'), self.updateThemeList) +QtCore.QObject.connect(Receiver.get_receiver(), +QtCore.SIGNAL(u'remote_edit_clear'), self.onRemoteEditClear) # Last little bits of setting up self.config = PluginConfig(u'ServiceManager') self.servicePath = self.config.get_data_path() @@ -510,14 +537,19 @@ sitem, count = self.findServiceItem() item.render() -if sitem == -1: -self.serviceItems.append({u'data': item, -u'order': len(self.serviceItems) + 1, u'expanded':True}) -self.repaintServiceList(len(self.serviceItems) + 1, 0) -else: -self.serviceItems.insert(sitem + 1, {u'data': item, -u'order': len(self.serviceItems)+1, u'expanded':True}) +if self.remoteEditTriggered: +self.serviceItems[sitem][u'data'] = item +self.remoteEditTriggered =
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Review: Approve Looks okay. Note typo in doctext for future patch. -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14166 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14166 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) Minor fixes to improve usage -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14178 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/lib/eventreceiver.py' --- openlp/core/lib/eventreceiver.py 2009-10-29 09:18:26 + +++ openlp/core/lib/eventreceiver.py 2009-10-29 16:05:20 + @@ -53,6 +53,9 @@ ``load_song_list`` Tells the the song plugin to reload the song list +``load_custom_list`` +Tells the the custom plugin to reload the custom list + ``update_spin_delay`` Pushes out the Image loop delay @@ -100,8 +103,7 @@ ``slidecontroller_change`` Informs the slidecontroller that a slide change has occurred - -``remote_edite_clear`` +``remote_edit_clear`` Informs all components that remote edit has been aborted. === modified file 'openlp/core/ui/slidecontroller.py' --- openlp/core/ui/slidecontroller.py 2009-10-27 08:38:02 + +++ openlp/core/ui/slidecontroller.py 2009-10-29 16:05:20 + @@ -276,19 +276,17 @@ Allows the live toolbar to be customised +self.Songbar.setVisible(False) +self.Toolbar.makeWidgetsInvisible(self.image_list) if item.service_item_type == ServiceType.Text: self.Toolbar.makeWidgetsInvisible(self.image_list) if item.name == u'Songs' and \ str_to_bool(self.songsconfig.get_config(u'display songbar', True)): self.Songbar.setVisible(True) -else: -self.Songbar.setVisible(False) elif item.service_item_type == ServiceType.Image: #Not sensible to allow loops with 1 frame if len(item.frames) 1: self.Toolbar.makeWidgetsVisible(self.image_list) -else: -self.Toolbar.makeWidgetsInvisible(self.image_list) def enablePreviewToolBar(self, item): === modified file 'openlp/plugins/songs/lib/mediaitem.py' --- openlp/plugins/songs/lib/mediaitem.py 2009-10-29 15:20:28 + +++ openlp/plugins/songs/lib/mediaitem.py 2009-10-29 16:05:20 + @@ -281,7 +281,9 @@ item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] else: item_id = self.fromServiceManager -self.fromServiceManager = -1 +#if we are in preview mode do not reset the servicemanage id +if self.fromPreview != -1: +self.fromServiceManager = -1 song = self.parent.songmanager.get_song(item_id) service_item.theme = song.theme_name service_item.editEnabled = True ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/14178 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Superseded -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13899 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13911 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp-1to2-converter.py' (properties changed: -x to +x) --- openlp-1to2-converter.py 2009-10-24 07:14:11 + +++ openlp-1to2-converter.py 2009-10-25 08:15:23 + @@ -25,7 +25,13 @@ import sys import os -import sqlite +try: +import sqlite +except: +try: +import pysqlite2 +except: +print 'No Sqlite2 package available' import sqlite3 import re from optparse import OptionParser === modified file 'openlp/core/lib/eventreceiver.py' --- openlp/core/lib/eventreceiver.py 2009-10-17 05:47:17 + +++ openlp/core/lib/eventreceiver.py 2009-10-25 08:15:23 + @@ -86,6 +86,13 @@ ``config_updated`` Informs components the config has changed + +``edit_song`` +Requests the current song on the preview display be loaded for edit + +``preview_song`` +Tells the song plugin the edit has finished and the song can be previewed +Only available if the edit was triggered by the Preview button. global log log = logging.getLogger(u'EventReceiver') === modified file 'openlp/core/ui/slidecontroller.py' --- openlp/core/ui/slidecontroller.py 2009-10-24 16:40:36 + +++ openlp/core/ui/slidecontroller.py 2009-10-25 08:15:23 + @@ -97,6 +97,8 @@ ] self.timer_id = 0 self.commandItem = None +self.songEdit = False +self.row = 0 self.Panel = QtGui.QWidget(parent.ControlSplitter) # Layout for holding panel self.PanelLayout = QtGui.QVBoxLayout(self.Panel) @@ -180,6 +182,7 @@ self.Toolbar.addToolbarWidget( u'Image SpinBox', self.DelaySpinBox) self.DelaySpinBox.setSuffix(self.trUtf8(u's')) +self.DelaySpinBox.setToolTip(self.trUtf8(u'Delay between slides in seconds')) self.ControllerLayout.addWidget(self.Toolbar) # Screen preview area @@ -289,7 +292,12 @@ Receiver().send_message(u'%s_start' % item.name.lower(), \ [item.shortname, item.service_item_path, item.service_frames[0][u'title']]) -self.displayServiceManagerItems(item, 0) +slideno = 0 +if self.songEdit: +slideno = self.row +self.songEdit = False +self.displayServiceManagerItems(item, slideno) + def addServiceManagerItem(self, item, slideno): @@ -297,7 +305,7 @@ request the correct the toolbar of the plugin Called by ServiceManager -log.debug(u'addServiceItem') +log.debug(u'addServiceManagerItem') #If old item was a command tell it to stop if self.commandItem is not None and \ self.commandItem.service_item_type == ServiceType.Command: @@ -387,12 +395,13 @@ if this is the Live Controller also display on the screen row = self.PreviewListWidget.currentRow() +self.row = 0 if row -1 and row self.PreviewListWidget.rowCount(): if self.commandItem.service_item_type == ServiceType.Command: Receiver().send_message(u'%s_slide'% self.commandItem.name.lower(), [row]) -QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) +if isLive: +QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) else: -#label = self.PreviewListWidget.cellWidget(row, 0) frame = self.serviceitem.frames[row][u'image'] before = time.time() if frame is None: @@ -401,6 +410,7 @@ log.info(u'Slide Rendering took %4s' % (time.time() - before)) if self.isLive: self.parent.mainDisplay.frameView(frame) +self.row = row def grabMainDisplay(self): winid = QtGui.QApplication.desktop().winId() @@ -474,6 +484,7 @@ self.onSlideSelectedNext() def onEditSong(self): +self.songEdit = True Receiver().send_message(u'edit_song') def onGoLive(self): === modified file 'openlp/plugins/songs/lib/mediaitem.py' --- openlp/plugins/songs/lib/mediaitem.py 2009-10-24 16:40:36 + +++ openlp/plugins/songs/lib/mediaitem.py 2009-10-25 08:15:23 + @@ -125,7 +125,7 @@ QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'edit_song'), self.onEventEditSong) QtCore.QObject.connect(Receiver.get_receiver(), -QtCore.SIGNAL(u'proview_song'), self.onPreviewClick) +QtCore.SIGNAL(u'preview_song'), self.onPreviewClick) def configUpdated(self): self.searchAsYouType = str_to_bool( @@ -181,7 +181,6 @@ if song.id == self.fromPreview:
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13911 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) Clean up conversion code changed in error More audit work but still incomplete New Context menu for ServiveItems allowing themes to the changed at run time. Handles reload of themes from ThemeManager as well -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13917 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp-1to2-converter.py' --- openlp-1to2-converter.py 2009-10-24 19:43:16 + +++ openlp-1to2-converter.py 2009-10-25 16:35:19 + @@ -25,13 +25,7 @@ import sys import os -try: -import sqlite -except: -try: -import pysqlite2 -except: -print 'No Sqlite2 package available' +import sqlite import sqlite3 import re from optparse import OptionParser === modified file 'openlp/core/lib/__init__.py' --- openlp/core/lib/__init__.py 2009-10-01 23:43:16 + +++ openlp/core/lib/__init__.py 2009-10-25 16:35:19 + @@ -110,12 +110,21 @@ Utility method to help build context menus for plugins action = QtGui.QAction(text, base) +if icon is not None: +action.setIcon(buildIcon(icon)) +QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) +return action + +def contextMenu(base, icon, text): + +Utility method to help build context menus for plugins + +action = QtGui.QMenu(text, base) action.setIcon(buildIcon(icon)) -QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) return action def contextMenuSeparator(base): -action = QtGui.QAction(, base) +action = QtGui.QAction(u'', base) action.setSeparator(True) return action === modified file 'openlp/core/ui/servicemanager.py' --- openlp/core/ui/servicemanager.py 2009-10-24 16:40:36 + +++ openlp/core/ui/servicemanager.py 2009-10-25 16:35:19 + @@ -30,7 +30,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import PluginConfig, OpenLPToolbar, ServiceItem, \ -ServiceType, contextMenuAction, contextMenuSeparator, Receiver +ServiceType, contextMenuAction, contextMenuSeparator, Receiver, contextMenu class ServiceManagerList(QtGui.QTreeWidget): @@ -168,6 +168,12 @@ self.ServiceManagerList.addAction(contextMenuAction( self.ServiceManagerList, ':/services/service_delete', self.trUtf8(u'Remove from Service'), self.onDeleteFromService)) +self.ServiceManagerList.addAction(contextMenuSeparator( +self.ServiceManagerList)) +self.ThemeMenu = contextMenu( +self.ServiceManagerList, '', +self.trUtf8(u'Change Item Theme')) +self.ServiceManagerList.addAction(self.ThemeMenu.menuAction()) self.Layout.addWidget(self.ServiceManagerList) # Add the bottom toolbar self.OrderToolbar = OpenLPToolbar(self) @@ -602,9 +608,15 @@ self.ThemeComboBox.clear() +self.ThemeMenu.clear() self.ThemeComboBox.addItem(u'') for theme in theme_list: self.ThemeComboBox.addItem(theme) +action = contextMenuAction( +self.ServiceManagerList, +None, +theme , self.onThemeChangeAction) +self.ThemeMenu.addAction(action) id = self.ThemeComboBox.findText(self.service_theme, QtCore.Qt.MatchExactly) # Not Found @@ -614,3 +626,9 @@ self.ThemeComboBox.setCurrentIndex(id) self.parent.RenderManager.set_service_theme(self.service_theme) self.regenerateServiceItems() + +def onThemeChangeAction(self): +theme = unicode(self.sender().text()) +item, count = self.findServiceItem() +self.serviceItems[item][u'data'].theme = theme +self.regenerateServiceItems() === modified file 'openlp/core/ui/thememanager.py' --- openlp/core/ui/thememanager.py 2009-10-24 16:40:36 + +++ openlp/core/ui/thememanager.py 2009-10-25 16:35:19 + @@ -198,7 +198,7 @@ return theme = unicode(item.data(QtCore.Qt.UserRole).toString()) path = QtGui.QFileDialog.getExistingDirectory(self, -self.trUtf8(u'Save Theme - (%s)') % theme, +unicode(self.trUtf8(u'Save Theme - (%s)')) % theme, self.config.get_last_dir(1) ) path = unicode(path) if path != u'': === modified file 'openlp/plugins/audit/auditplugin.py' --- openlp/plugins/audit/auditplugin.py 2009-10-24 16:40:36 + +++ openlp/plugins/audit/auditplugin.py 2009-10-25 16:35:19 + @@ -160,6 +160,7 @@ self.auditdeleteform.exec_() def onAuditReport(self): +self.auditdetailform.initialise() self.auditdetailform.exec_() def about(self): === modified file 'openlp/plugins/audit/forms/auditdetailform.py' --- openlp/plugins/audit/forms/auditdetailform.py 2009-10-19 14:56:44 + +++
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Review: Approve -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13917 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13921 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Superseded -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13886 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Tim Bentley has proposed merging lp:~trb143/openlp/fixes into lp:openlp. Requested reviews: OpenLP Core (openlp-core) Maintain position on slidecontroller when editing and redisplaying songs -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13899 Your team OpenLP Core is subscribed to branch lp:openlp. === modified file 'openlp/core/ui/slidecontroller.py' --- openlp/core/ui/slidecontroller.py 2009-10-24 16:40:36 + +++ openlp/core/ui/slidecontroller.py 2009-10-24 18:20:26 + @@ -97,6 +97,8 @@ ] self.timer_id = 0 self.commandItem = None +self.songEdit = False +self.row = 0 self.Panel = QtGui.QWidget(parent.ControlSplitter) # Layout for holding panel self.PanelLayout = QtGui.QVBoxLayout(self.Panel) @@ -180,6 +182,7 @@ self.Toolbar.addToolbarWidget( u'Image SpinBox', self.DelaySpinBox) self.DelaySpinBox.setSuffix(self.trUtf8(u's')) +self.DelaySpinBox.setToolTip(self.trUtf8(u'Delay between slides in seconds')) self.ControllerLayout.addWidget(self.Toolbar) # Screen preview area @@ -289,7 +292,12 @@ Receiver().send_message(u'%s_start' % item.name.lower(), \ [item.shortname, item.service_item_path, item.service_frames[0][u'title']]) -self.displayServiceManagerItems(item, 0) +slideno = 0 +if self.songEdit: +slideno = self.row +self.songEdit = False +self.displayServiceManagerItems(item, slideno) + def addServiceManagerItem(self, item, slideno): @@ -387,6 +395,7 @@ if this is the Live Controller also display on the screen row = self.PreviewListWidget.currentRow() +self.row = 0 if row -1 and row self.PreviewListWidget.rowCount(): if self.commandItem.service_item_type == ServiceType.Command: Receiver().send_message(u'%s_slide'% self.commandItem.name.lower(), [row]) @@ -401,6 +410,7 @@ log.info(u'Slide Rendering took %4s' % (time.time() - before)) if self.isLive: self.parent.mainDisplay.frameView(frame) +self.row = row def grabMainDisplay(self): winid = QtGui.QApplication.desktop().winId() @@ -474,6 +484,7 @@ self.onSlideSelectedNext() def onEditSong(self): +self.songEdit = True Receiver().send_message(u'edit_song') def onGoLive(self): ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
Re: [Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp
Review: Approve This might just break that biggest merge evar! :-P -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13857 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp
[Openlp-core] [Merge] lp:~trb143/openlp/fixes into lp:openlp updated
The proposal to merge lp:~trb143/openlp/fixes into lp:openlp has been updated. Status: Needs review = Merged -- https://code.launchpad.net/~trb143/openlp/fixes/+merge/13857 Your team OpenLP Core is subscribed to branch lp:openlp. ___ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp