← Back to team overview

openlp-core team mailing list archive

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

 

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

Requested reviews:
    openlp.org Core (openlp-core)

File and Function cleanups
Improvements from last merge
OOS saving required now.
-- 
https://code.launchpad.net/~trb143/openlp/servicing2/+merge/8325
Your team openlp.org Core is subscribed to branch lp:openlp.
=== modified file 'cnvdb.py'
--- cnvdb.py	2009-07-02 19:10:14 +0000
+++ cnvdb.py	2009-07-06 16:34:13 +0000
@@ -31,7 +31,7 @@
         writefile = codecs.open(outname, 'w', encoding='utf-8')
         for line in infile:
             #replace the quotes with quotes
-            line, replace("''", "'")
+            line = line.replace(u'\'\'', u'\'')
             writefile.write(line)
         infile.close()
         writefile.close()

=== modified file 'openlp/core/lib/plugin.py'
--- openlp/core/lib/plugin.py	2009-06-28 06:54:12 +0000
+++ openlp/core/lib/plugin.py	2009-07-06 16:34:13 +0000
@@ -102,7 +102,6 @@
         self.render_manager = plugin_helpers[u'render']
         self.service_manager = plugin_helpers[u'service']
         self.settings = plugin_helpers[u'settings']
-        self.slideManager = plugin_helpers[u'slideManager']
         self.dnd_id=None
 
     def check_pre_conditions(self):

=== modified file 'openlp/core/ui/__init__.py'
--- openlp/core/ui/__init__.py	2009-07-03 19:08:21 +0000
+++ openlp/core/ui/__init__.py	2009-07-06 16:34:13 +0000
@@ -18,7 +18,6 @@
 Place, Suite 330, Boston, MA 02111-1307 USA
 """
 from slidecontroller import MasterToolbar
-from slidecontrollermanager import SlideControllerManager
 from maindisplay import MainDisplay
 from amendthemeform import AmendThemeForm
 from slidecontroller import SlideController

=== modified file 'openlp/core/ui/amendthemeform.py'
--- openlp/core/ui/amendthemeform.py	2009-06-16 18:21:24 +0000
+++ openlp/core/ui/amendthemeform.py	2009-07-06 16:34:13 +0000
@@ -128,9 +128,7 @@
                 unicode(self.theme.display_outline), unicode(self.theme.display_outline_color),
                 unicode(self.theme.display_horizontalAlign), unicode(self.theme.display_verticalAlign),
                 unicode(self.theme.display_wrapStyle))
-
         theme = new_theme.extract_xml()
-
         self.thememanager.saveTheme(theme_name, theme, save_from, save_to)
         return QtGui.QDialog.accept(self)
 
@@ -526,4 +524,4 @@
     def previewTheme(self, theme):
         if self.allowPreview:
             frame = self.thememanager.generateImage(theme)
-            self.ThemePreview.setPixmap(QtGui.QPixmap.fromImage(frame))
\ No newline at end of file
+            self.ThemePreview.setPixmap(QtGui.QPixmap.fromImage(frame))

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2009-07-03 19:08:21 +0000
+++ openlp/core/ui/mainwindow.py	2009-07-07 16:35:01 +0000
@@ -23,7 +23,7 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.ui import AboutForm, SettingsForm, AlertForm, ServiceManager, \
-    ThemeManager, MainDisplay, SlideController, SlideControllerManager
+    ThemeManager, MainDisplay, SlideController
 from openlp.core.lib import translate, Plugin, MediaManagerItem, SettingsTab, \
     EventManager, RenderManager, PluginConfig
 from openlp.core import PluginManager
@@ -41,6 +41,7 @@
         This constructor sets up the interface, the various managers, and the
         plugins.
         """
+        self.oosNotSaved = False
         self.mainWindow = QtGui.QMainWindow()
         self.mainWindow.__class__.closeEvent = self.onCloseEvent
         self.mainDisplay = MainDisplay(None, screens)
@@ -50,7 +51,6 @@
         self.alertForm = AlertForm(self)
         self.aboutForm = AboutForm()
         self.settingsForm = SettingsForm(self.screenList, self)
-        self.slideControllerManager = SlideControllerManager(self)
         # Set up the path with plugins
         pluginpath = os.path.split(os.path.abspath(__file__))[0]
         pluginpath = os.path.abspath(
@@ -73,7 +73,6 @@
         self.plugin_helpers[u'render'] = self.RenderManager
         self.plugin_helpers[u'service'] = self.ServiceManagerContents
         self.plugin_helpers[u'settings'] = self.settingsForm
-        self.plugin_helpers[u'slideManager'] = self.slideControllerManager
         self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers,
             self.EventManager)
         # hook methods have to happen after find_plugins. Find plugins needs the
@@ -129,8 +128,46 @@
         """
         Hook to close the main window and display windows on exit
         """
-        self.mainDisplay.close()
-        event.accept()
+        if self.oosNotSaved == True:
+            box = QtGui.QMessageBox()
+            box.setWindowTitle(translate(u'mainWindow', u'Question?'))
+            box.setText(translate(u'mainWindow', u'Save changes to Order of Service?'))
+            box.setIcon(QtGui.QMessageBox.Question)
+            box.setStandardButtons(QtGui.QMessageBox.Save | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Cancel);
+            box.setDefaultButton(QtGui.QMessageBox.Save);
+            ret = box.exec_()
+            if ret == QtGui.QMessageBox.Save:
+                self.ServiceManagerContents.onSaveService()
+                self.mainDisplay.close()
+                event.accept()
+            elif ret == QtGui.QMessageBox.Discard:
+                self.mainDisplay.close()
+                event.accept()
+            else:
+                event.ignore()
+        else:
+            self.mainDisplay.close()
+            event.accept()
+
+    def OosChanged(self, reset = False, oosName = None):
+        """
+        Hook to change the title if the OOS has been changed
+        reset - tells if the OOS has been cleared or saved
+        oosName - is the name of the OOS (if it has one)
+        """
+        if reset == True:
+            self.oosNotSaved = False
+            if oosName is None:
+                title = self.mainTitle
+            else:
+                title = self.mainTitle + u' - (' + oosName + u')'
+        else:
+            self.oosNotSaved = True
+            if oosName is None:
+                title = self.mainTitle + u' - *'
+            else:
+                title = self.mainTitle + u' - *(' + oosName + u')'
+        self.mainWindow.setWindowTitle(title)
 
     def setupUi(self):
         """
@@ -411,7 +448,8 @@
         """
         Set up the translation system
         """
-        self.mainWindow.setWindowTitle(translate(u'mainWindow', u'OpenLP 2.0'))
+        self.mainTitle = translate(u'mainWindow', u'OpenLP 2.0')
+        self.mainWindow.setWindowTitle(self.mainTitle)
         self.FileMenu.setTitle(translate(u'mainWindow', u'&File'))
         self.FileImportMenu.setTitle(translate(u'mainWindow', u'&Import'))
         self.FileExportMenu.setTitle(translate(u'mainWindow', u'&Export'))

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2009-06-29 17:37:46 +0000
+++ openlp/core/ui/servicemanager.py	2009-07-07 16:35:01 +0000
@@ -63,6 +63,7 @@
         QtGui.QWidget.__init__(self)
         self.parent = parent
         self.serviceItems = []
+        self.serviceName = u''
         self.Layout = QtGui.QVBoxLayout(self)
         self.Layout.setSpacing(0)
         self.Layout.setMargin(0)
@@ -151,6 +152,7 @@
             self.serviceItems.remove(self.serviceItems[item])
             self.serviceItems.insert(0, temp)
             self.repaintServiceList()
+        self.parent.OosChanged(False, self.serviceName)
 
     def onServiceUp(self):
         """
@@ -163,6 +165,7 @@
             self.serviceItems.remove(self.serviceItems[item])
             self.serviceItems.insert(item - 1, temp)
             self.repaintServiceList()
+        self.parent.OosChanged(False, self.serviceName)
 
     def onServiceDown(self):
         """
@@ -175,6 +178,7 @@
             self.serviceItems.remove(self.serviceItems[item])
             self.serviceItems.insert(item + 1, temp)
             self.repaintServiceList()
+        self.parent.OosChanged(False, self.serviceName)
 
     def onServiceEnd(self):
         """
@@ -186,6 +190,7 @@
             self.serviceItems.remove(self.serviceItems[item])
             self.serviceItems.insert(len(self.serviceItems), temp)
             self.repaintServiceList()
+        self.parent.OosChanged(False, self.serviceName)
 
     def onNewService(self):
         """
@@ -193,6 +198,8 @@
         """
         self.ServiceManagerList.clear()
         self.serviceItems = []
+        self.serviceName = u''
+        self.parent.OosChanged(True, self.serviceName)
 
     def onDeleteFromService(self):
         """
@@ -202,6 +209,7 @@
         if item is not -1:
             self.serviceItems.remove(self.serviceItems[item])
             self.repaintServiceList()
+        self.parent.OosChanged(False, self.serviceName)
 
     def repaintServiceList(self):
         #Correct order of idems in array
@@ -252,6 +260,7 @@
                 os.remove(servicefile)
             except:
                 pass #if not present do not worry
+        self.parent.OosChanged(True, self.serviceName)
 
     def onLoadService(self):
         """
@@ -260,6 +269,7 @@
         filename = QtGui.QFileDialog.getOpenFileName(self, u'Open Order of Service',self.config.get_last_dir(),
             u'Services (*.oos)')
         filename = unicode(filename)
+        name = filename.split(os.path.sep)
         if filename != u'':
             self.config.set_last_dir(filename)
             zip = zipfile.ZipFile(unicode(filename))
@@ -279,7 +289,6 @@
             f.close()
             self.onNewService()
             for item in items:
-                #print item
                 serviceitem = ServiceItem()
                 serviceitem.RenderManager = self.parent.RenderManager
                 serviceitem.set_from_oos(item, self.servicePath )
@@ -287,7 +296,10 @@
             try:
                 os.remove(p_file)
             except:
-                pass #if not present do not worry
+                #if not present do not worry
+                pass
+        self.serviceName = name[len(name) - 1]
+        self.parent.OosChanged(True, self.serviceName)
 
     def onThemeComboBoxSelected(self, currentIndex):
         """
@@ -323,6 +335,7 @@
             treewidgetitem1.setText(0,text[:40])
             treewidgetitem1.setData(0, QtCore.Qt.UserRole,QtCore.QVariant(count))
             count = count + 1
+        self.parent.OosChanged(False, self.serviceName)
 
     def makePreview(self):
         """

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2009-07-03 20:32:33 +0000
+++ openlp/core/ui/slidecontroller.py	2009-07-06 16:34:13 +0000
@@ -183,7 +183,7 @@
 
 class MasterToolbar(QtCore.QObject):
     """
-    Class from which all tollbars should extend
+    Class from which all toolbars should extend
     """
     def __init__(self, isLive):
         self.Toolbar = None
@@ -232,6 +232,13 @@
                 translate(u'SlideController', u'Close Screen'),
                 self.onBlankScreen)
 
+    def serviceLoaded(self):
+        """
+        method to allow toolbars to know when the service item
+        is fully in place
+        """
+        pass
+
     def onSlideSelectedFirst(self):
         """
         Go to the first slide.
@@ -325,3 +332,4 @@
         else:
             self.PreviewListWidget.selectRow(slideno)
         self.onSlideSelected()
+        self.serviceLoaded()

=== removed file 'openlp/core/ui/slidecontrollermanager.py'
--- openlp/core/ui/slidecontrollermanager.py	2009-06-28 06:54:12 +0000
+++ openlp/core/ui/slidecontrollermanager.py	1970-01-01 00:00:00 +0000
@@ -1,52 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
-"""
-OpenLP - Open Source Lyrics Projection
-Copyright (c) 2008 Raoul Snyman
-Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley,
-
-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
-"""
-import logging
-import os
-
-class SlideControllerManager():
-    """
-    This class controls which SlideController is availabe to the
-    main window
-    """
-    global log
-    log = logging.getLogger(u'SlideControllerManager')
-
-    def __init__(self, parent):
-        """
-        Set up the Slide Controller. Manager
-        """
-        self.parent = parent
-        self.live = {}
-        self.preview = {}
-
-    def add_controllers(self, handle, preview, live):
-        self.live[handle] = live
-        self.preview[handle] = preview
-        print self.live
-
-    def getPreviewController(self, handle):
-        return self.preview[handle]
-
-    def getLiveController(self, handle):
-        print "---"
-        print self.live
-        print handle
-        print self.live[handle]
-        return self.live[handle]

=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py	2009-07-02 19:04:50 +0000
+++ openlp/core/ui/thememanager.py	2009-07-06 16:34:13 +0000
@@ -21,109 +21,16 @@
 import sys
 import zipfile
 import shutil
+import logging
 
-from time import sleep
 from xml.etree.ElementTree import ElementTree, XML
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.ui import AmendThemeForm, ServiceManager
 from openlp.core.theme import Theme
-from openlp.core.lib import Event, EventType, EventManager, OpenLPToolbar, ThemeXML, Renderer,  translate,  file_to_xml
+from openlp.core.lib import Event, EventType, EventManager, OpenLPToolbar, ThemeXML, Renderer,  translate,  file_to_xml,  buildIcon
 from openlp.core.utils import ConfigHelper
 
-import logging
-
-class ThemeData(QtCore.QAbstractListModel):
-    """
-    Tree of items for an order of Theme.
-    Includes methods for reading and writing the contents to an OOS file
-    Root contains a list of ThemeItems
-    """
-    global log
-    log = logging.getLogger(u'ThemeData')
-
-    def __init__(self):
-        QtCore.QAbstractListModel.__init__(self)
-        self.items = []
-        self.rowheight = 50
-        self.maximagewidth = self.rowheight * 16 / 9.0;
-        log.info(u'Starting')
-
-    def clearItems(self):
-        self.items = []
-
-    def rowCount(self, parent):
-        return len(self.items)
-
-    def insertRow(self, row, filename):
-        self.beginInsertRows(QtCore.QModelIndex(), row, row)
-        log.debug(u'insert row %d:%s' % (row, filename))
-        (prefix, shortfilename) = os.path.split(unicode(filename))
-        log.debug(u'shortfilename = %s' % shortfilename)
-        theme = shortfilename.split(u'.')
-        # create a preview image
-        if os.path.exists(filename):
-            preview = QtGui.QImage(unicode(filename))
-            width = self.maximagewidth
-            height = self.rowheight
-            preview = preview.scaled(width, height, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation)
-            realwidth = preview.width()
-            realheight = preview.height()
-            # and move it to the centre of the preview space
-            pixmap = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32_Premultiplied)
-            pixmap.fill(QtCore.Qt.black)
-            painter = QtGui.QPainter(pixmap)
-            painter.drawImage((width - realwidth) / 2, (height - realheight) / 2, preview)
-        else:
-            width = self.maximagewidth
-            height = self.rowheight
-            pixmap = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32_Premultiplied)
-            pixmap.fill(QtCore.Qt.black)
-        # finally create the row
-        self.items.insert(row, (filename, pixmap, shortfilename, theme[0]))
-        log.debug(u'Items: %s' % self.items)
-        self.endInsertRows()
-
-    def removeRow(self, row):
-        self.beginRemoveRows(QtCore.QModelIndex(), row, row)
-        self.items.pop(row)
-        self.endRemoveRows()
-
-    def addRow(self, item):
-        self.insertRow(len(self.items), item)
-
-    def data(self, index, role):
-        row = index.row()
-        if row > len(self.items):
-            # if the last row is selected and deleted, we then get called with an empty row!
-            return QtCore.QVariant()
-        if role == QtCore.Qt.DisplayRole:
-            retval = self.items[row][3]
-        elif role == QtCore.Qt.DecorationRole:
-            retval = self.items[row][1]
-        else:
-            retval = QtCore.QVariant()
-        if type(retval) is not type(QtCore.QVariant):
-            return QtCore.QVariant(retval)
-        else:
-            return retval
-
-    def __iter__(self):
-        for item in self.items:
-            yield item
-
-    def getValue(self, index):
-        row = index.row()
-        return self.items[row]
-
-    def getItem(self, row):
-        log.info(u'Get Item:%d -> %s' % (row, unicode(self.items)))
-        return self.items[row]
-
-    def getList(self):
-        filelist = [item[3] for item in self.items]
-        return filelist
-
 class ThemeManager(QtGui.QWidget):
     """
     Manages the orders of Theme.
@@ -157,13 +64,10 @@
             translate(u'ThemeManager', u'Export a theme'), self.onExportTheme)
         self.ThemeWidget = QtGui.QWidgetAction(self.Toolbar)
         self.Layout.addWidget(self.Toolbar)
-
-        self.ThemeListView = QtGui.QListView(self)
-        self.themeData = ThemeData()
-        self.ThemeListView.setModel(self.themeData)
-        self.ThemeListView.setAlternatingRowColors(True)
-        self.Layout.addWidget(self.ThemeListView)
-
+        self.ThemeListWidget = QtGui.QListWidget(self)
+        self.ThemeListWidget.setAlternatingRowColors(True)
+        self.ThemeListWidget.setIconSize(QtCore.QSize(88,50))
+        self.Layout.addWidget(self.ThemeListWidget)
         self.themelist = []
         self.path = os.path.join(ConfigHelper.get_data_path(), u'themes')
         self.checkThemesExists(self.path)
@@ -174,21 +78,18 @@
         self.amendThemeForm.exec_()
 
     def onEditTheme(self):
-        items = self.ThemeListView.selectedIndexes()
-        if len(items) > 0:
-            for item in items:
-                data = self.themeData.getValue(item)
-                self.amendThemeForm.loadTheme(data[3])
+        item = self.ThemeListWidget.currentItem()
+        if item is not None:
+            self.amendThemeForm.loadTheme(unicode(item.text()))
             self.amendThemeForm.exec_()
 
     def onDeleteTheme(self):
-        items = self.ThemeListView.selectedIndexes()
-        if len(items) > 0:
-            theme = u''
-            for item in items:
-                data = self.themeData.getValue(item)
-                theme = data[3]
+        item = self.ThemeListWidget.currentItem()
+        if item is not None:
+            theme = unicode(item.text())
             th = theme +  u'.png'
+            row = self.ThemeListWidget.row(item)
+            self.ThemeListWidget.takeItem(row)
             try:
                 os.remove(os.path.join(self.path, th))
             except:
@@ -199,8 +100,6 @@
             except:
                 #if not present do not worry
                 pass
-            self.themeData.clearItems()
-            self.loadThemes()
 
     def onExportTheme(self):
         pass
@@ -213,24 +112,37 @@
         if len(files) > 0:
             for file in files:
                 self.unzipTheme(file, self.path)
-        self.themeData.clearItems()
         self.loadThemes()
 
     def loadThemes(self):
+        """
+        Loads the theme lists and triggers updates accross
+        the whole system using direct calls or core functions
+        and events for the plugins.
+        The plugins will call back in to get the real list if they want it.
+        """
         log.debug(u'Load themes from dir')
+        self.themelist = []
+        self.ThemeListWidget.clear()
         for root, dirs, files in os.walk(self.path):
             for name in files:
                 if name.endswith(u'.png'):
-                    #check to see file is in route directory
+                    #check to see file is in theme root directory
                     theme =  os.path.join(self.path, name)
                     if os.path.exists(theme):
-                        self.themeData.addRow(theme)
+                        (path, filename) = os.path.split(unicode(file))
+                        textName = os.path.splitext(name)[0]
+                        item_name = QtGui.QListWidgetItem(textName)
+                        item_name.setIcon(buildIcon(theme))
+                        item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(textName))
+                        self.ThemeListWidget.addItem(item_name)
+                        self.themelist.append(textName)
         self.parent.EventManager.post_event(Event(EventType.ThemeListChanged))
         self.parent.ServiceManagerContents.updateThemeList(self.getThemes())
         self.parent.settingsForm.ThemesTab.updateThemeList(self.getThemes())
 
     def getThemes(self):
-        return self.themeData.getList()
+        return self.themelist
 
     def getThemeData(self, themename):
         log.debug(u'getthemedata for theme %s', themename)
@@ -337,6 +249,10 @@
         return newtheme.extract_xml()
 
     def saveTheme(self, name, theme_xml, image_from, image_to) :
+        """
+        Called by thememaintenance Dialog to save the theme
+        and to trigger the reload of the theme list
+        """
         log.debug(u'saveTheme %s %s', name, theme_xml)
         theme_dir = os.path.join(self.path, name)
         if os.path.exists(theme_dir) == False:
@@ -348,7 +264,6 @@
         if image_from is not None and image_from != image_to:
             shutil.copyfile(image_from,  image_to)
         self.generateAndSaveImage(self.path, name, theme_xml)
-        self.themeData.clearItems()
         self.loadThemes()
 
     def generateAndSaveImage(self, dir, name, theme_xml):
@@ -357,7 +272,6 @@
         theme.parse(theme_xml)
         theme.extend_image_filename(dir)
         frame = self.generateImage(theme)
-        #im = frame.toImage()
         samplepathname = os.path.join(self.path, name + u'.png')
         if os.path.exists(samplepathname):
             os.unlink(samplepathname)
@@ -365,6 +279,9 @@
         log.debug(u'Theme image written to %s', samplepathname)
 
     def generateImage(self, themedata):
+        """
+        Call the RenderManager to build a Sample Image
+        """
         log.debug(u'generateImage %s ', themedata)
         frame = self.parent.RenderManager.generate_preview(themedata)
         return frame

=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py	2009-07-04 05:52:30 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2009-07-07 16:35:01 +0000
@@ -494,7 +494,7 @@
         if end_verse == '':
             end_verse = 99
         if start_chapter == '':
-            message = u'No chapter found for search'
+            message = u'No chapter found for search criteria'
         #print 'message = ' + unicode(message)
         #print 'search = ' + unicode(original)
         #print 'results = ' + unicode(book) + ' @ '+ unicode(start_chapter)+' @ '+ unicode(end_chapter)+' @ '+ unicode(start_verse)+ ' @ '+ unicode(end_verse)

=== modified file 'openlp/plugins/images/lib/imageslidecontroller.py'
--- openlp/plugins/images/lib/imageslidecontroller.py	2009-07-03 20:32:33 +0000
+++ openlp/plugins/images/lib/imageslidecontroller.py	2009-07-06 16:34:13 +0000
@@ -74,14 +74,26 @@
             u':/media/media_stop.png',
             translate(u'SlideController', u'Stop continuous loop'),
             self.onStopLoop)
+        self.Toolbar.addSeparator()
+        self.DelaySpinBox = QtGui.QSpinBox(self.Toolbar)
+        self.SpinWidget = QtGui.QWidgetAction(self.Toolbar)
+        self.SpinWidget.setDefaultWidget(self.DelaySpinBox)
+        self.Toolbar.addAction(self.SpinWidget)
+        #self.Layout.addWidget(self.Toolbar)
         self.Toolbar.setSizePolicy(sizeToolbarPolicy)
+        self.DelaySpinBox.setSuffix(translate(u'ImageSlideController', u's'))
+
+    def serviceLoaded(self):
+        self.DelaySpinBox.setValue(self.parent.parent.ImageTab.loop_delay)
+        if self.PreviewListWidget.rowCount() == 1:
+            self.DelaySpinBox.setEnabled(False)
 
     def onStartLoop(self):
         """
         Go to the last slide.
         """
-        delay = self.parent.parent.ImageTab.loop_delay
-        self.timer_id =  self.startTimer(delay * 1000)
+        if self.PreviewListWidget.rowCount() > 1:
+            self.timer_id =  self.startTimer(int(self.TimeoutSpinBox.value()) * 1000)
 
     def onStopLoop(self):
         """
@@ -92,4 +104,3 @@
     def timerEvent(self, event):
         if event.timerId() == self.timer_id:
             self.onSlideSelectedNext()
-

=== modified file 'openlp/plugins/images/lib/imagetab.py'
--- openlp/plugins/images/lib/imagetab.py	2009-07-03 20:33:41 +0000
+++ openlp/plugins/images/lib/imagetab.py	2009-07-06 16:34:13 +0000
@@ -49,7 +49,6 @@
         self.TimeoutSpacer = QtGui.QSpacerItem(147, 20,
             QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
         self.TimeoutLayout.addItem(self.TimeoutSpacer)
-
         self.ImageLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.ImageModeGroupBox)
         # Signals and slots
         QtCore.QObject.connect(self.TimeoutSpinBox,
@@ -57,6 +56,7 @@
 
     def retranslateUi(self):
         self.TimeoutLabel.setText(translate(u'ImageTab', u'Slide Loop Delay:'))
+        self.TimeoutSpinBox.setSuffix(translate(u'ImageTab', u's'))
 
     def onTimeoutSpinBoxChanged(self):
         self.loop_delay = self.TimeoutSpinBox.value()


Follow ups