← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~trb143/openlp/cleanups into lp:openlp

 

Tim Bentley has proposed merging lp:~trb143/openlp/cleanups into lp:openlp.

    Requested reviews:
    OpenLP Core (openlp-core)


Changes and fixes
Fix up presentations so Live and Preview do not get mixed up.
Add option to turn of Footers for Custom plugin.
Fix up Alerts as they were broken
Fix Verse Tagging on screen repainting. Tags got lost!
1024x768 previews look OK now.
-- 
https://code.launchpad.net/~trb143/openlp/cleanups/+merge/16146
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp/core/lib/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py	2009-12-06 13:55:07 +0000
+++ openlp/core/lib/mediamanageritem.py	2009-12-14 17:12:15 +0000
@@ -357,7 +357,7 @@
                 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 @@
                 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 @@
                 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

=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py	2009-12-08 17:52:45 +0000
+++ openlp/core/lib/renderer.py	2009-12-14 17:12:15 +0000
@@ -578,7 +578,7 @@
             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);

=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py	2009-12-08 17:04:27 +0000
+++ openlp/core/lib/serviceitem.py	2009-12-14 17:12:15 +0000
@@ -112,6 +112,8 @@
             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)
 

=== modified file 'openlp/core/ui/alertform.py'
--- openlp/core/ui/alertform.py	2009-11-30 20:29:26 +0000
+++ openlp/core/ui/alertform.py	2009-12-14 17:12:15 +0000
@@ -99,4 +99,4 @@
         self.CancelButton.setText(self.trUtf8('Cancel'))
 
     def onDisplayClicked(self):
-        self.parent.mainDisplay.displayAlert(self.AlertEntryEditItem.text())
+        self.parent.mainDisplay.displayAlert(unicode(self.AlertEntryEditItem.text()))

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2009-12-05 08:05:11 +0000
+++ openlp/core/ui/maindisplay.py	2009-12-14 17:12:15 +0000
@@ -234,8 +234,12 @@
         ``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 +265,10 @@
 
     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
 

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2009-12-11 19:02:45 +0000
+++ openlp/core/ui/slidecontroller.py	2009-12-14 17:12:16 +0000
@@ -246,7 +246,7 @@
             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)
@@ -390,14 +390,12 @@
         #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 @@
         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 @@
         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 @@
         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 @@
             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 @@
         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 @@
                 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:

=== modified file 'openlp/plugins/bibles/lib/bibleOSISimpl.py'
--- openlp/plugins/bibles/lib/bibleOSISimpl.py	2009-12-11 19:02:45 +0000
+++ openlp/plugins/bibles/lib/bibleOSISimpl.py	2009-12-14 17:12:16 +0000
@@ -28,6 +28,7 @@
 import logging
 import chardet
 import codecs
+import time
 
 from PyQt4 import QtCore
 
@@ -174,12 +175,17 @@
                             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')

=== modified file 'openlp/plugins/custom/customplugin.py'
--- openlp/plugins/custom/customplugin.py	2009-11-30 20:29:26 +0000
+++ openlp/plugins/custom/customplugin.py	2009-12-14 17:12:16 +0000
@@ -27,7 +27,7 @@
 
 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 @@
         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)

=== modified file 'openlp/plugins/custom/lib/__init__.py'
--- openlp/plugins/custom/lib/__init__.py	2009-11-30 20:29:26 +0000
+++ openlp/plugins/custom/lib/__init__.py	2009-12-14 17:12:16 +0000
@@ -25,3 +25,4 @@
 
 from manager import CustomManager
 from mediaitem import CustomMediaItem
+from customtab import CustomTab

=== added file 'openlp/plugins/custom/lib/customtab.py'
--- openlp/plugins/custom/lib/customtab.py	1970-01-01 00:00:00 +0000
+++ openlp/plugins/custom/lib/customtab.py	2009-12-14 17:12:16 +0000
@@ -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))

=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py	2009-11-30 20:29:26 +0000
+++ openlp/plugins/custom/lib/mediaitem.py	2009-12-14 17:12:16 +0000
@@ -27,7 +27,8 @@
 
 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 @@
         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

=== modified file 'openlp/plugins/presentations/lib/messagelistener.py'
--- openlp/plugins/presentations/lib/messagelistener.py	2009-11-30 20:29:26 +0000
+++ openlp/plugins/presentations/lib/messagelistener.py	2009-12-14 17:12:16 +0000
@@ -30,6 +30,122 @@
 
 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, slide, live):
+        log.debug(u'Live = %s, slide' % live)
+#        if not isLive:
+#            return
+        self.activate()
+        self.controller.goto_slide(int(slide) + 1)
+        self.controller.poll_slidenumber(live)
+
+    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 +157,9 @@
 
     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 +188,84 @@
         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.slide(slide, live)
+        else:
+            self.previewHandler.slide(slide, live)
 
     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)

=== modified file 'openlp/plugins/songs/forms/editsongform.py'
--- openlp/plugins/songs/forms/editsongform.py	2009-12-05 08:05:11 +0000
+++ openlp/plugins/songs/forms/editsongform.py	2009-12-14 17:12:16 +0000
@@ -336,14 +336,19 @@
             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)


Follow ups