← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~raoul-snyman/openlp/cleanups into lp:openlp

 

Raoul Snyman has proposed merging lp:~raoul-snyman/openlp/cleanups into lp:openlp.

Requested reviews:
  Tim Bentley (trb143)

For more details, see:
https://code.launchpad.net/~raoul-snyman/openlp/cleanups/+merge/146301

Some code cleanups to help with linting. Takes our PyLint score from 9.36/10 to 9.46/10
-- 
https://code.launchpad.net/~raoul-snyman/openlp/cleanups/+merge/146301
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file '.bzrignore'
--- .bzrignore	2013-01-20 19:33:14 +0000
+++ .bzrignore	2013-02-03 14:47:18 +0000
@@ -25,3 +25,5 @@
 openlp.pro
 .kdev4
 tests.kdev4
+*.nja
+*.orig

=== renamed file 'openlp.pyw' => 'openlp.py'
=== modified file 'openlp/__init__.py'
--- openlp/__init__.py	2012-12-29 20:56:56 +0000
+++ openlp/__init__.py	2013-02-03 14:47:18 +0000
@@ -34,4 +34,3 @@
 import plugins
 
 __all__ = [u'core', u'plugins']
-

=== modified file 'openlp/core/__init__.py'
--- openlp/core/__init__.py	2013-01-27 22:07:30 +0000
+++ openlp/core/__init__.py	2013-02-03 14:47:18 +0000
@@ -43,7 +43,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, check_directory_exists, ScreenList, UiStrings, Registry
+from openlp.core.lib import Receiver, Settings, ScreenList, UiStrings, Registry, check_directory_exists
 from openlp.core.resources import qInitResources
 from openlp.core.ui.mainwindow import MainWindow
 from openlp.core.ui.firsttimelanguageform import FirstTimeLanguageForm
@@ -92,15 +92,16 @@
         """
         Override exec method to allow the shared memory to be released on exit
         """
-        self.eventLoopIsActive = True
-        QtGui.QApplication.exec_()
-        self.sharedMemory.detach()
+        self.is_event_loop_active = True
+        result = QtGui.QApplication.exec_()
+        self.shared_memory.detach()
+        return result
 
     def run(self, args, testing=False):
         """
         Run the OpenLP application.
         """
-        self.eventLoopIsActive = False
+        self.is_event_loop_active = False
         # On Windows, the args passed into the constructor are ignored. Not
         # very handy, so set the ones we want to use. On Linux and FreeBSD, in
         # order to set the WM_CLASS property for X11, we pass "OpenLP" in as a
@@ -111,8 +112,8 @@
         self.args.extend(args)
         # provide a listener for widgets to reqest a screen update.
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_process_events'), self.processEvents)
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_busy'), self.setBusyCursor)
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_normal'), self.setNormalCursor)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_busy'), self.set_busy_cursor)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_normal'), self.set_normal_cursor)
         # Decide how many screens we have and their size
         screens = ScreenList.create(self.desktop())
         # First time checks in settings
@@ -138,61 +139,74 @@
         # make sure Qt really display the splash screen
         self.processEvents()
         # start the main app window
-        self.mainWindow = MainWindow(self)
-        self.mainWindow.show()
+        self.main_window = MainWindow(self)
+        self.main_window.show()
         if show_splash:
             # now kill the splashscreen
-            self.splash.finish(self.mainWindow)
+            self.splash.finish(self.main_window)
             log.debug(u'Splashscreen closed')
         # make sure Qt really display the splash screen
         self.processEvents()
-        self.mainWindow.repaint()
+        self.main_window.repaint()
         self.processEvents()
         if not has_run_wizard:
-            self.mainWindow.firstTime()
+            self.main_window.first_time()
         update_check = Settings().value(u'general/update check')
         if update_check:
-            VersionThread(self.mainWindow).start()
+            VersionThread(self.main_window).start()
         Receiver.send_message(u'live_display_blank_check')
-        self.mainWindow.appStartup()
+        self.main_window.app_startup()
         # Skip exec_() for gui tests
         if not testing:
             return self.exec_()
 
-    def isAlreadyRunning(self):
+    def is_already_running(self):
         """
         Look to see if OpenLP is already running and ask if a 2nd copy
         is to be started.
         """
-        self.sharedMemory = QtCore.QSharedMemory('OpenLP')
-        if self.sharedMemory.attach():
+        self.shared_memory = QtCore.QSharedMemory('OpenLP')
+        if self.shared_memory.attach():
             status = QtGui.QMessageBox.critical(None, UiStrings().Error, UiStrings().OpenLPStart,
                 QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No))
             if status == QtGui.QMessageBox.No:
                 return True
             return False
         else:
-            self.sharedMemory.create(1)
+            self.shared_memory.create(1)
             return False
 
-    def hookException(self, exctype, value, traceback):
+    def hook_exception(self, exctype, value, traceback):
+        """
+        Add an exception hook so that any uncaught exceptions are displayed in this window rather than somewhere where
+        users cannot see it and cannot report when we encounter these problems.
+
+        ``exctype``
+            The class of exception.
+
+        ``value``
+            The actual exception object.
+
+        ``traceback``
+            A traceback object with the details of where the exception occurred.
+        """
         if not hasattr(self, u'mainWindow'):
             log.exception(''.join(format_exception(exctype, value, traceback)))
             return
         if not hasattr(self, u'exceptionForm'):
-            self.exceptionForm = ExceptionForm(self.mainWindow)
-        self.exceptionForm.exceptionTextEdit.setPlainText(''.join(format_exception(exctype, value, traceback)))
-        self.setNormalCursor()
-        self.exceptionForm.exec_()
+            self.exception_form = ExceptionForm(self.main_window)
+        self.exception_form.exceptionTextEdit.setPlainText(''.join(format_exception(exctype, value, traceback)))
+        self.set_normal_cursor()
+        self.exception_form.exec_()
 
-    def setBusyCursor(self):
+    def set_busy_cursor(self):
         """
         Sets the Busy Cursor for the Application
         """
         self.setOverrideCursor(QtCore.Qt.BusyCursor)
         self.processEvents()
 
-    def setNormalCursor(self):
+    def set_normal_cursor(self):
         """
         Sets the Normal Cursor for the Application
         """
@@ -287,12 +301,12 @@
     else:
         app.setApplicationName(u'OpenLP')
         set_up_logging(AppLocation.get_directory(AppLocation.CacheDir))
-    registry = Registry.create()
+    Registry.create()
     app.setApplicationVersion(get_application_version()[u'version'])
     # Instance check
     if not options.testing:
         # Instance check
-        if app.isAlreadyRunning():
+        if app.is_already_running():
             sys.exit()
     # First time checks in settings
     if not Settings().value(u'general/has run wizard'):
@@ -309,7 +323,7 @@
     else:
         log.debug(u'Could not find default_translator.')
     if not options.no_error_form:
-        sys.excepthook = app.hookException
+        sys.excepthook = app.hook_exception
     # Do not run method app.exec_() when running gui tests
     if options.testing:
         app.run(qt_args, testing=True)

=== modified file 'openlp/core/lib/__init__.py'
--- openlp/core/lib/__init__.py	2013-01-24 20:08:52 +0000
+++ openlp/core/lib/__init__.py	2013-02-03 14:47:18 +0000
@@ -90,9 +90,8 @@
     Next = 3
 
 
-def translate(context, text, comment=None,
-    encoding=QtCore.QCoreApplication.CodecForTr, n=-1,
-    translate=QtCore.QCoreApplication.translate):
+def translate(context, text, comment=None, encoding=QtCore.QCoreApplication.CodecForTr, n=-1,
+              translate=QtCore.QCoreApplication.translate):
     """
     A special shortcut method to wrap around the Qt4 translation functions.
     This abstracts the translation procedure so that we can change it if at a

=== modified file 'openlp/core/lib/db.py'
--- openlp/core/lib/db.py	2013-01-20 12:23:22 +0000
+++ openlp/core/lib/db.py	2013-02-03 14:47:18 +0000
@@ -45,6 +45,7 @@
 
 log = logging.getLogger(__name__)
 
+
 def init_db(url, auto_flush=True, auto_commit=False):
     """
     Initialise and return the session and metadata for a database
@@ -109,14 +110,17 @@
         while hasattr(upgrade, u'upgrade_%d' % version):
             log.debug(u'Running upgrade_%d', version)
             try:
-                getattr(upgrade, u'upgrade_%d' % version) (session, metadata, tables)
+                upgrade_func = getattr(upgrade, u'upgrade_%d' % version)
+                upgrade_func(session, metadata, tables)
+                session.commit()
+                # Update the version number AFTER a commit so that we are sure the previous transaction happened
+                version_meta.value = unicode(version)
+                session.commit()
+                version += 1
             except (SQLAlchemyError, DBAPIError):
                 log.exception(u'Could not run database upgrade script '
                     '"upgrade_%s", upgrade process has been halted.', version)
                 break
-            version_meta.value = unicode(version)
-            session.commit()
-            version += 1
     else:
         version_meta = Metadata.populate(key=u'version', value=int(upgrade.__version__))
         session.commit()
@@ -156,6 +160,7 @@
             instance.__setattr__(key, value)
         return instance
 
+
 class Manager(object):
     """
     Provide generic object persistence management
@@ -205,19 +210,17 @@
             if db_ver > up_ver:
                 critical_error_message_box(
                     translate('OpenLP.Manager', 'Database Error'),
-                    translate('OpenLP.Manager', 'The database being '
-                        'loaded was created in a more recent version of '
-                        'OpenLP. The database is version %d, while OpenLP '
-                        'expects version %d. The database will not be loaded.'
-                        '\n\nDatabase: %s') % \
-                        (db_ver, up_ver, self.db_url)
+                    translate('OpenLP.Manager', 'The database being loaded was created in a more recent version of '
+                        'OpenLP. The database is version %d, while OpenLP expects version %d. The database will not '
+                        'be loaded.\n\nDatabase: %s') % (db_ver, up_ver, self.db_url)
                 )
                 return
         try:
             self.session = init_schema(self.db_url)
         except (SQLAlchemyError, DBAPIError):
             log.exception(u'Error loading database: %s', self.db_url)
-            critical_error_message_box(translate('OpenLP.Manager', 'Database Error'),
+            critical_error_message_box(
+                translate('OpenLP.Manager', 'Database Error'),
                 translate('OpenLP.Manager', 'OpenLP cannot load your database.\n\nDatabase: %s') % self.db_url
             )
 

=== modified file 'openlp/core/lib/dockwidget.py'
--- openlp/core/lib/dockwidget.py	2013-01-10 23:07:48 +0000
+++ openlp/core/lib/dockwidget.py	2013-02-03 14:47:18 +0000
@@ -39,6 +39,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class OpenLPDockWidget(QtGui.QDockWidget):
     """
     Custom DockWidget class to handle events

=== modified file 'openlp/core/lib/eventreceiver.py'
--- openlp/core/lib/eventreceiver.py	2013-01-27 09:57:03 +0000
+++ openlp/core/lib/eventreceiver.py	2013-02-03 14:47:18 +0000
@@ -35,6 +35,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class EventReceiver(QtCore.QObject):
     """
     Class to allow events to be passed from different parts of the system. This

=== modified file 'openlp/core/lib/formattingtags.py'
--- openlp/core/lib/formattingtags.py	2013-01-20 12:23:22 +0000
+++ openlp/core/lib/formattingtags.py	2013-02-03 14:47:18 +0000
@@ -33,6 +33,7 @@
 
 from openlp.core.lib import translate, Settings
 
+
 class FormattingTags(object):
     """
     Static Class to HTML Tags to be access around the code the list is managed

=== modified file 'openlp/core/lib/htmlbuilder.py'
--- openlp/core/lib/htmlbuilder.py	2013-01-22 21:09:43 +0000
+++ openlp/core/lib/htmlbuilder.py	2013-02-03 14:47:18 +0000
@@ -207,8 +207,8 @@
 </html>
 """
 
-def build_html(item, screen, islive, background, image=None,
-    plugins=None):
+
+def build_html(item, screen, is_live, background, image=None, plugins=None):
     """
     Build the full web paged structure for display
 
@@ -233,7 +233,7 @@
     width = screen[u'size'].width()
     height = screen[u'size'].height()
     theme = item.themedata
-    webkitvers = webkit_version()
+    webkit_ver = webkit_version()
     # Image generated and poked in
     if background:
         bgimage_src = u'src="data:image/png;base64,%s"' % background
@@ -253,28 +253,32 @@
             css_additions += plugin.getDisplayCss()
             js_additions += plugin.getDisplayJavaScript()
             html_additions += plugin.getDisplayHtml()
-    html = HTMLSRC % (build_background_css(item, width, height),
+    html = HTMLSRC % (
+        build_background_css(item, width, height),
         css_additions,
         build_footer_css(item, height),
-        build_lyrics_css(item, webkitvers),
-        u'true' if theme and theme.display_slide_transition and islive else u'false',
+        build_lyrics_css(item, webkit_ver),
+        u'true' if theme and theme.display_slide_transition and is_live else u'false',
         js_additions,
         bgimage_src, image_src,
         html_additions,
-        build_lyrics_html(item, webkitvers))
+        build_lyrics_html(item, webkit_ver)
+    )
     return html
 
+
 def webkit_version():
     """
     Return the Webkit version in use.
     Note method added relatively recently, so return 0 if prior to this
     """
     try:
-        webkitvers = float(QtWebKit.qWebKitVersion())
-        log.debug(u'Webkit version = %s' % webkitvers)
+        webkit_ver = float(QtWebKit.qWebKitVersion())
+        log.debug(u'Webkit version = %s' % webkit_ver)
     except AttributeError:
-        webkitvers = 0
-    return webkitvers
+        webkit_ver = 0
+    return webkit_ver
+
 
 def build_background_css(item, width, height):
     """
@@ -310,7 +314,8 @@
                     % (width, width, width, theme.background_start_color, theme.background_end_color)
     return background
 
-def build_lyrics_css(item, webkitvers):
+
+def build_lyrics_css(item, webkit_ver):
     """
     Build the lyrics display css
 
@@ -367,12 +372,12 @@
         # Up to 534.3 the text-shadow didn't get displayed when
         # webkit-text-stroke was used. So use an offset text layer underneath.
         # https://bugs.webkit.org/show_bug.cgi?id=19728
-        if webkitvers >= 533.3:
+        if webkit_ver >= 533.3:
             lyricsmain += build_lyrics_outline_css(theme)
         else:
             outline = build_lyrics_outline_css(theme)
         if theme.font_main_shadow:
-            if theme.font_main_outline and webkitvers <= 534.3:
+            if theme.font_main_outline and webkit_ver <= 534.3:
                 shadow = u'padding-left: %spx; padding-top: %spx;' % \
                     (int(theme.font_main_shadow_size) + (int(theme.font_main_outline_size) * 2),
                      theme.font_main_shadow_size)
@@ -384,6 +389,7 @@
     lyrics_css = style % (lyricstable, lyrics, lyricsmain, outline, shadow)
     return lyrics_css
 
+
 def build_lyrics_outline_css(theme, is_shadow=False):
     """
     Build the css which controls the theme outline
@@ -407,6 +413,7 @@
     else:
         return u''
 
+
 def build_lyrics_format_css(theme, width, height):
     """
     Build the css which controls the theme format
@@ -451,6 +458,7 @@
         lyrics += u' font-weight:bold; '
     return lyrics
 
+
 def build_lyrics_html(item, webkitvers):
     """
     Build the HTML required to show the lyrics
@@ -480,6 +488,7 @@
         u'class="lyricscell lyricsmain"></div></div>'
     return lyrics
 
+
 def build_footer_css(item, height):
     """
     Build the display of the item footer

=== modified file 'openlp/core/lib/imagemanager.py'
--- openlp/core/lib/imagemanager.py	2013-01-23 21:05:25 +0000
+++ openlp/core/lib/imagemanager.py	2013-02-03 14:47:18 +0000
@@ -43,20 +43,27 @@
 
 log = logging.getLogger(__name__)
 
+
 class ImageThread(QtCore.QThread):
     """
     A special Qt thread class to speed up the display of images. This is
     threaded so it loads the frames and generates byte stream in background.
     """
     def __init__(self, manager):
+        """
+        Constructor for the thread class.
+
+        ``manager``
+            The image manager.
+        """
         QtCore.QThread.__init__(self, None)
-        self.imageManager = manager
+        self.image_manager = manager
 
     def run(self):
         """
         Run the thread.
         """
-        self.imageManager._process()
+        self.image_manager._process()
 
 
 class Priority(object):
@@ -181,72 +188,75 @@
     log.info(u'Image Manager loaded')
 
     def __init__(self):
+        """
+        Constructor for the image manager.
+        """
         QtCore.QObject.__init__(self)
         Registry().register(u'image_manager', self)
-        currentScreen = ScreenList().current
-        self.width = currentScreen[u'size'].width()
-        self.height = currentScreen[u'size'].height()
+        current_screen = ScreenList().current
+        self.width = current_screen[u'size'].width()
+        self.height = current_screen[u'size'].height()
         self._cache = {}
-        self.imageThread = ImageThread(self)
-        self._conversionQueue = PriorityQueue()
-        self.stopManager = False
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.processUpdates)
+        self.image_thread = ImageThread(self)
+        self._conversion_queue = PriorityQueue()
+        self.stop_manager = False
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.process_updates)
 
-    def updateDisplay(self):
+    def update_display(self):
         """
         Screen has changed size so rebuild the cache to new size.
         """
-        log.debug(u'updateDisplay')
-        currentScreen = ScreenList().current
-        self.width = currentScreen[u'size'].width()
-        self.height = currentScreen[u'size'].height()
+        log.debug(u'update_display')
+        current_screen = ScreenList().current
+        self.width = current_screen[u'size'].width()
+        self.height = current_screen[u'size'].height()
         # Mark the images as dirty for a rebuild by setting the image and byte
         # stream to None.
         for image in self._cache.values():
-            self._resetImage(image)
+            self._reset_image(image)
 
-    def updateImagesBorder(self, source, background):
+    def update_images_border(self, source, background):
         """
         Border has changed so update all the images affected.
         """
-        log.debug(u'updateImages')
+        log.debug(u'update_images_border')
         # Mark the images as dirty for a rebuild by setting the image and byte
         # stream to None.
         for image in self._cache.values():
             if image.source == source:
                 image.background = background
-                self._resetImage(image)
+                self._reset_image(image)
 
-    def updateImageBorder(self, path, source, background):
+    def update_image_border(self, path, source, background):
         """
         Border has changed so update the image affected.
         """
-        log.debug(u'updateImage')
+        log.debug(u'update_image_border')
         # Mark the image as dirty for a rebuild by setting the image and byte
         # stream to None.
         image = self._cache[(path, source)]
         if image.source == source:
             image.background = background
-            self._resetImage(image)
+            self._reset_image(image)
 
-    def _resetImage(self, image):
+    def _reset_image(self, image):
         """
         Mark the given :class:`Image` instance as dirty by setting its ``image``
         and ``image_bytes`` attributes to None.
         """
         image.image = None
         image.image_bytes = None
-        self._conversionQueue.modify_priority(image, Priority.Normal)
+        self._conversion_queue.modify_priority(image, Priority.Normal)
 
-    def processUpdates(self):
+    def process_updates(self):
         """
         Flush the queue to updated any data to update
         """
         # We want only one thread.
-        if not self.imageThread.isRunning():
-            self.imageThread.start()
+        if not self.image_thread.isRunning():
+            self.image_thread.start()
 
-    def getImage(self, path, source):
+    def get_image(self, path, source):
         """
         Return the ``QImage`` from the cache. If not present wait for the
         background thread to process it.
@@ -254,9 +264,9 @@
         log.debug(u'getImage %s' % path)
         image = self._cache[(path, source)]
         if image.image is None:
-            self._conversionQueue.modify_priority(image, Priority.High)
+            self._conversion_queue.modify_priority(image, Priority.High)
             # make sure we are running and if not give it a kick
-            self.processUpdates()
+            self.process_updates()
             while image.image is None:
                 log.debug(u'getImage - waiting')
                 time.sleep(0.1)
@@ -265,74 +275,74 @@
             # byte stream was not generated yet. However, we only need to do
             # this, when the image was generated before it was requested
             # (otherwise this is already taken care of).
-            self._conversionQueue.modify_priority(image, Priority.Low)
+            self._conversion_queue.modify_priority(image, Priority.Low)
         return image.image
 
-    def getImageBytes(self, path, source):
+    def get_image_bytes(self, path, source):
         """
         Returns the byte string for an image. If not present wait for the
         background thread to process it.
         """
-        log.debug(u'getImageBytes %s' % path)
+        log.debug(u'get_image_bytes %s' % path)
         image = self._cache[(path, source)]
         if image.image_bytes is None:
-            self._conversionQueue.modify_priority(image, Priority.Urgent)
+            self._conversion_queue.modify_priority(image, Priority.Urgent)
             # make sure we are running and if not give it a kick
-            self.processUpdates()
+            self.process_updates()
             while image.image_bytes is None:
                 log.debug(u'getImageBytes - waiting')
                 time.sleep(0.1)
         return image.image_bytes
 
-    def addImage(self, path, source, background):
+    def add_image(self, path, source, background):
         """
         Add image to cache if it is not already there.
         """
-        log.debug(u'addImage %s' % path)
+        log.debug(u'add_image %s' % path)
         if not (path, source) in self._cache:
             image = Image(path, source, background)
             self._cache[(path, source)] = image
-            self._conversionQueue.put((image.priority, image.secondary_priority, image))
+            self._conversion_queue.put((image.priority, image.secondary_priority, image))
         # Check if the there are any images with the same path and check if the
         # timestamp has changed.
         for image in self._cache.values():
             if os.path.exists(path):
                 if image.path == path and image.timestamp != os.stat(path).st_mtime:
                     image.timestamp = os.stat(path).st_mtime
-                    self._resetImage(image)
+                    self._reset_image(image)
         # We want only one thread.
-        if not self.imageThread.isRunning():
-            self.imageThread.start()
+        if not self.image_thread.isRunning():
+            self.image_thread.start()
 
     def _process(self):
         """
         Controls the processing called from a ``QtCore.QThread``.
         """
         log.debug(u'_process - started')
-        while not self._conversionQueue.empty() and not self.stopManager:
-            self._processCache()
+        while not self._conversion_queue.empty() and not self.stop_manager:
+            self._process_cache()
         log.debug(u'_process - ended')
 
-    def _processCache(self):
+    def _process_cache(self):
         """
         Actually does the work.
         """
         log.debug(u'_processCache')
-        image = self._conversionQueue.get()[2]
+        image = self._conversion_queue.get()[2]
         # Generate the QImage for the image.
         if image.image is None:
             image.image = resize_image(image.path, self.width, self.height, image.background)
             # Set the priority to Lowest and stop here as we need to process
             # more important images first.
             if image.priority == Priority.Normal:
-                self._conversionQueue.modify_priority(image, Priority.Lowest)
+                self._conversion_queue.modify_priority(image, Priority.Lowest)
                 return
             # For image with high priority we set the priority to Low, as the
             # byte stream might be needed earlier the byte stream of image with
             # Normal priority. We stop here as we need to process more important
             # images first.
             elif image.priority == Priority.High:
-                self._conversionQueue.modify_priority(image, Priority.Low)
+                self._conversion_queue.modify_priority(image, Priority.Low)
                 return
         # Generate the byte stream for the image.
         if image.image_bytes is None:

=== modified file 'openlp/core/lib/listwidgetwithdnd.py'
--- openlp/core/lib/listwidgetwithdnd.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/listwidgetwithdnd.py	2013-02-03 14:47:18 +0000
@@ -35,6 +35,7 @@
 
 from openlp.core.lib import Receiver
 
+
 class ListWidgetWithDnD(QtGui.QListWidget):
     """
     Provide a list widget to store objects and handle drag and drop events
@@ -58,9 +59,8 @@
 
     def mouseMoveEvent(self, event):
         """
-        Drag and drop event does not care what data is selected
-        as the recipient will use events to request the data move
-        just tell it what plugin to call
+        Drag and drop event does not care what data is selected as the recipient will use events to request the data
+        move just tell it what plugin to call
         """
         if event.buttons() != QtCore.Qt.LeftButton:
             event.ignore()
@@ -75,12 +75,18 @@
         drag.start(QtCore.Qt.CopyAction)
 
     def dragEnterEvent(self, event):
+        """
+        When something is dragged into this object, check if you should be able to drop it in here.
+        """
         if event.mimeData().hasUrls():
             event.accept()
         else:
             event.ignore()
 
     def dragMoveEvent(self, event):
+        """
+        Make an object droppable, and set it to copy the contents of the object, not move it.
+        """
         if event.mimeData().hasUrls():
             event.setDropAction(QtCore.Qt.CopyAction)
             event.accept()

=== modified file 'openlp/core/lib/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py	2013-02-02 07:34:42 +0000
+++ openlp/core/lib/mediamanageritem.py	2013-02-03 14:47:18 +0000
@@ -35,14 +35,14 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import OpenLPToolbar, ServiceItem, StringContent, build_icon, translate, Receiver, \
-    ListWidgetWithDnD, ServiceItemContext, Settings, Registry, UiStrings
+from openlp.core.lib import OpenLPToolbar, ServiceItem, StringContent, Receiver, ListWidgetWithDnD, \
+    ServiceItemContext, Settings, Registry, UiStrings, build_icon, translate
 from openlp.core.lib.searchedit import SearchEdit
 from openlp.core.lib.ui import create_widget_action, critical_error_message_box
 
-
 log = logging.getLogger(__name__)
 
+
 class MediaManagerItem(QtGui.QWidget):
     """
     MediaManagerItem is a helper widget for plugins.
@@ -345,15 +345,15 @@
         """
         new_files = []
         error_shown = False
-        for file in files:
-            type = file.split(u'.')[-1]
-            if type.lower() not in self.onNewFileMasks:
+        for file_name in files:
+            file_type = file_name.split(u'.')[-1]
+            if file_type.lower() not in self.onNewFileMasks:
                 if not error_shown:
                     critical_error_message_box(translate('OpenLP.MediaManagerItem', 'Invalid File Type'),
-                        translate('OpenLP.MediaManagerItem', 'Invalid File %s.\nSuffix not supported') % file)
+                        translate('OpenLP.MediaManagerItem', 'Invalid File %s.\nSuffix not supported') % file_name)
                     error_shown = True
             else:
-                new_files.append(file)
+                new_files.append(file_name)
         if new_files:
             self.validateAndLoad(new_files)
 
@@ -390,6 +390,9 @@
                 translate('OpenLP.MediaManagerItem', 'Duplicate files were found on import and were ignored.'))
 
     def contextMenu(self, point):
+        """
+        Display a context menu
+        """
         item = self.listView.itemAt(point)
         # Decide if we have to show the context menu or not.
         if item is None:
@@ -412,6 +415,9 @@
         return file_list
 
     def loadList(self, list):
+        """
+        Load a list. Needs to be implemented by the plugin.
+        """
         raise NotImplementedError(u'MediaManagerItem.loadList needs to be defined by the plugin')
 
     def onNewClick(self):
@@ -427,6 +433,9 @@
         pass
 
     def onDeleteClick(self):
+        """
+        Delete an item. Needs to be implemented by the plugin.
+        """
         raise NotImplementedError(u'MediaManagerItem.onDeleteClick needs to be defined by the plugin')
 
     def onFocus(self):
@@ -438,6 +447,9 @@
 
     def generateSlideData(self, serviceItem, item=None, xmlVersion=False, remote=False,
             context=ServiceItemContext.Live):
+        """
+        Generate the slide data. Needs to be implemented by the plugin.
+        """
         raise NotImplementedError(u'MediaManagerItem.generateSlideData needs to be defined by the plugin')
 
     def onDoubleClicked(self):
@@ -486,6 +498,9 @@
             self.goLive()
 
     def goLive(self, item_id=None, remote=False):
+        """
+        Make the currently selected item go live.
+        """
         log.debug(u'%s Live requested', self.plugin.name)
         item = None
         if item_id:
@@ -499,6 +514,9 @@
             self.live_controller.add_service_item(serviceItem)
 
     def createItemFromId(self, item_id):
+        """
+        Create a media item from an item id.
+        """
         item = QtGui.QListWidgetItem()
         item.setData(QtCore.Qt.UserRole, item_id)
         return item
@@ -522,6 +540,9 @@
                     self.addToService(item)
 
     def addToService(self, item=None, replace=None, remote=False):
+        """
+        Add this item to the current service.
+        """
         serviceItem = self.buildServiceItem(item, True, remote=remote, context=ServiceItemContext.Service)
         if serviceItem:
             serviceItem.from_plugin = False
@@ -697,4 +718,3 @@
         return self._theme_manager
 
     theme_manager = property(_get_theme_manager)
-

=== modified file 'openlp/core/lib/plugin.py'
--- openlp/core/lib/plugin.py	2013-01-23 21:05:25 +0000
+++ openlp/core/lib/plugin.py	2013-02-03 14:47:18 +0000
@@ -38,6 +38,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class PluginStatus(object):
     """
     Defines the status of the plugin
@@ -294,7 +295,7 @@
         if self.mediaItem:
             self.main_window.mediaDockManager.remove_dock(self.mediaItem)
 
-    def appStartup(self):
+    def app_startup(self):
         """
         Perform tasks on application startup
         """
@@ -320,7 +321,6 @@
                 Settings().setValue(u'%s/%s files' % (self.settingsSection, self.name), loaded_list)
             settings.endGroup()
 
-
     def usesTheme(self, theme):
         """
         Called to find out if a plugin is currently using a theme.
@@ -418,4 +418,3 @@
         return self._main_window
 
     main_window = property(_get_main_window)
-

=== modified file 'openlp/core/lib/pluginmanager.py'
--- openlp/core/lib/pluginmanager.py	2013-01-23 21:05:25 +0000
+++ openlp/core/lib/pluginmanager.py	2013-02-03 14:47:18 +0000
@@ -37,6 +37,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class PluginManager(object):
     """
     This is the Plugin manager, which loads all the plugins,

=== modified file 'openlp/core/lib/registry.py'
--- openlp/core/lib/registry.py	2013-02-01 20:09:47 +0000
+++ openlp/core/lib/registry.py	2013-02-03 14:47:18 +0000
@@ -34,6 +34,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class Registry(object):
     """
     This is the Component Registry.  It is a singleton object and is used to provide a
@@ -43,6 +44,9 @@
     __instance__ = None
 
     def __new__(cls):
+        """
+        Re-implement the __new__ method to make sure we create a true singleton.
+        """
         if not cls.__instance__:
             cls.__instance__ = object.__new__(cls)
         return cls.__instance__
@@ -61,7 +65,6 @@
             registry.running_under_test = True
         return registry
 
-
     def get(self, key):
         """
         Extracts the registry value from the list based on the key passed in
@@ -87,10 +90,9 @@
         Removes the registry value from the list based on the key passed in
         (Only valid and active for testing framework)
         """
-        if self.running_under_test == False:
+        if self.running_under_test is False:
             log.error(u'Invalid Method call for key %s' % key)
             raise KeyError(u'Invalid Method call for key %s' % key)
             return
         if key in self.service_list:
             del self.service_list[key]
-

=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py	2013-02-02 07:34:42 +0000
+++ openlp/core/lib/renderer.py	2013-02-03 14:47:18 +0000
@@ -136,7 +136,7 @@
             theme_data, main_rect, footer_rect = self._theme_dimensions[theme_name]
         # if No file do not update cache
         if theme_data.background_filename:
-            self.image_manager.addImage(theme_data.background_filename,
+            self.image_manager.add_image(theme_data.background_filename,
                 ImageSource.Theme, QtGui.QColor(theme_data.background_border_color))
 
     def pre_render(self, override_theme_data=None):
@@ -238,7 +238,7 @@
         serviceItem.raw_footer = FOOTER
         # if No file do not update cache
         if theme_data.background_filename:
-            self.image_manager.addImage(theme_data.background_filename,
+            self.image_manager.add_image(theme_data.background_filename,
                 ImageSource.Theme,
                 QtGui.QColor(theme_data.background_border_color))
         theme_data, main, footer = self.pre_render(theme_data)

=== modified file 'openlp/core/lib/screen.py'
--- openlp/core/lib/screen.py	2013-01-20 11:46:19 +0000
+++ openlp/core/lib/screen.py	2013-02-03 14:47:18 +0000
@@ -37,7 +37,6 @@
 
 from openlp.core.lib import Receiver, translate
 
-
 log = logging.getLogger(__name__)
 
 
@@ -51,6 +50,9 @@
     __instance__ = None
 
     def __new__(cls):
+        """
+        Re-implement __new__ to create a true singleton.
+        """
         if not cls.__instance__:
             cls.__instance__ = object.__new__(cls)
         return cls.__instance__

=== modified file 'openlp/core/lib/searchedit.py'
--- openlp/core/lib/searchedit.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/searchedit.py	2013-02-03 14:47:18 +0000
@@ -36,6 +36,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class SearchEdit(QtGui.QLineEdit):
     """
     This is a specialised QLineEdit with a "clear" button inside for searches.

=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py	2013-01-24 20:08:52 +0000
+++ openlp/core/lib/serviceitem.py	2013-02-03 14:47:18 +0000
@@ -43,6 +43,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class ServiceItemType(object):
     """
     Defines the type of service item
@@ -292,7 +293,7 @@
             self.image_border = background
         self.service_item_type = ServiceItemType.Image
         self._raw_frames.append({u'title': title, u'path': path})
-        self.image_manager.addImage(path, ImageSource.ImagePlugin, self.image_border)
+        self.image_manager.add_image(path, ImageSource.ImagePlugin, self.image_border)
         self._new_item()
 
     def add_from_text(self, raw_slide, verse_tag=None):
@@ -607,7 +608,7 @@
         ``theme``
             The new theme to be replaced in the service item
         """
-        self.theme_overwritten = (theme == None)
+        self.theme_overwritten = (theme is None)
         self.theme = theme
         self._new_item()
         self.render()
@@ -662,4 +663,4 @@
             self._image_manager = Registry().get(u'image_manager')
         return self._image_manager
 
-    image_manager = property(_get_image_manager)
\ No newline at end of file
+    image_manager = property(_get_image_manager)

=== modified file 'openlp/core/lib/settings.py'
--- openlp/core/lib/settings.py	2013-01-31 19:09:52 +0000
+++ openlp/core/lib/settings.py	2013-02-03 14:47:18 +0000
@@ -128,8 +128,8 @@
         u'general/enable slide loop': True,
         u'general/show splash': True,
         u'general/screen blank': False,
-        # The oder display settings (display position and dimensions) are defined in the ScreenList class due to crycle
-        # dependency.
+        # The other display settings (display position and dimensions) are defined in the ScreenList class due to a
+        # circular dependency.
         u'general/override position': False,
         u'general/loop delay': 5,
         u'general/songselect username': u'',
@@ -277,6 +277,9 @@
         Settings.__default_settings__[u'advanced/default service name'] = UiStrings().DefaultServiceName
 
     def __init__(self, *args):
+        """
+        Constructor which checks if this should be a native settings object, or an INI file.
+        """
         if not args and Settings.__file_path__ and Settings.defaultFormat() == Settings.IniFormat:
             QtCore.QSettings.__init__(self, Settings.__file_path__, Settings.IniFormat)
         else:
@@ -341,4 +344,3 @@
         if isinstance(default_value, int):
             return int(setting)
         return setting
-

=== modified file 'openlp/core/lib/settingsmanager.py'
--- openlp/core/lib/settingsmanager.py	2013-01-18 18:50:46 +0000
+++ openlp/core/lib/settingsmanager.py	2013-02-03 14:47:18 +0000
@@ -33,9 +33,6 @@
 """
 import os
 
-from PyQt4 import QtCore
-
-from openlp.core.lib import Settings
 from openlp.core.utils import AppLocation
 
 

=== modified file 'openlp/core/lib/settingstab.py'
--- openlp/core/lib/settingstab.py	2013-02-02 07:34:42 +0000
+++ openlp/core/lib/settingstab.py	2013-02-03 14:47:18 +0000
@@ -26,9 +26,14 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The :mod:`~openlp.core.lib.settingstab` module contains the base SettingsTab class which plugins use for adding their
+own tab to the settings dialog.
+"""
 
 from PyQt4 import QtGui
 
+
 from openlp.core.lib import Registry
 
 class SettingsTab(QtGui.QWidget):

=== modified file 'openlp/core/lib/spelltextedit.py'
--- openlp/core/lib/spelltextedit.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/spelltextedit.py	2013-02-03 14:47:18 +0000
@@ -26,6 +26,10 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The :mod:`~openlp.core.lib.spelltextedit` module contains a classes to add spell checking to an edit widget.
+"""
+
 import logging
 import re
 
@@ -47,11 +51,15 @@
 
 log = logging.getLogger(__name__)
 
+
 class SpellTextEdit(QtGui.QPlainTextEdit):
     """
     Spell checking widget based on QPlanTextEdit.
     """
     def __init__(self, parent=None, formattingTagsAllowed=True):
+        """
+        Constructor.
+        """
         global ENCHANT_AVAILABLE
         QtGui.QPlainTextEdit.__init__(self, parent)
         self.formattingTagsAllowed = formattingTagsAllowed
@@ -171,6 +179,9 @@
     WORDS = u'(?iu)[\w\']+'
 
     def __init__(self, *args):
+        """
+        Constructor
+        """
         QtGui.QSyntaxHighlighter.__init__(self, *args)
         self.spellingDictionary = None
 
@@ -197,5 +208,8 @@
     correct = QtCore.pyqtSignal(unicode)
 
     def __init__(self, *args):
+        """
+        Constructor
+        """
         QtGui.QAction.__init__(self, *args)
         self.triggered.connect(lambda x: self.correct.emit(self.text()))

=== modified file 'openlp/core/lib/theme.py'
--- openlp/core/lib/theme.py	2013-02-01 20:09:47 +0000
+++ openlp/core/lib/theme.py	2013-02-03 14:47:18 +0000
@@ -86,6 +86,7 @@
  </theme>
 '''
 
+
 class ThemeLevel(object):
     """
     Provides an enumeration for the level a theme applies to
@@ -609,13 +610,15 @@
             self.add_background_gradient(
                 self.background_start_color,
                 self.background_end_color,
-                self.background_direction)
+                self.background_direction
+            )
         elif self.background_type == BackgroundType.to_string(BackgroundType.Image):
             filename = os.path.split(self.background_filename)[1]
             self.add_background_image(filename, self.background_border_color)
         elif self.background_type == BackgroundType.to_string(BackgroundType.Transparent):
             self.add_background_transparent()
-        self.add_font(self.font_main_name,
+        self.add_font(
+            self.font_main_name,
             self.font_main_color,
             self.font_main_size,
             self.font_main_override, u'main',
@@ -631,14 +634,16 @@
             self.font_main_outline_size,
             self.font_main_shadow,
             self.font_main_shadow_color,
-            self.font_main_shadow_size)
-        self.add_font(self.font_footer_name,
+            self.font_main_shadow_size
+        )
+        self.add_font(
+            self.font_footer_name,
             self.font_footer_color,
             self.font_footer_size,
             self.font_footer_override, u'footer',
             self.font_footer_bold,
             self.font_footer_italics,
-            0, # line adjustment
+            0,  # line adjustment
             self.font_footer_x,
             self.font_footer_y,
             self.font_footer_width,
@@ -648,7 +653,10 @@
             self.font_footer_outline_size,
             self.font_footer_shadow,
             self.font_footer_shadow_color,
-            self.font_footer_shadow_size)
-        self.add_display(self.display_horizontal_align,
+            self.font_footer_shadow_size
+        )
+        self.add_display(
+            self.display_horizontal_align,
             self.display_vertical_align,
-            self.display_slide_transition)
+            self.display_slide_transition
+        )

=== modified file 'openlp/core/lib/toolbar.py'
--- openlp/core/lib/toolbar.py	2012-12-29 20:56:56 +0000
+++ openlp/core/lib/toolbar.py	2013-02-03 14:47:18 +0000
@@ -37,6 +37,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class OpenLPToolbar(QtGui.QToolBar):
     """
     Lots of toolbars around the place, so it makes sense to have a common way
@@ -85,4 +86,3 @@
                 self.actions[handle].setVisible(visible)
             else:
                 log.warn(u'No handle "%s" in actions list.', unicode(handle))
-

=== modified file 'openlp/core/lib/uistrings.py'
--- openlp/core/lib/uistrings.py	2013-01-16 20:23:02 +0000
+++ openlp/core/lib/uistrings.py	2013-02-03 14:47:18 +0000
@@ -111,8 +111,8 @@
         self.OLPV2x = translate('OpenLP.Ui', 'OpenLP 2.1')
         self.OpenLPStart = translate('OpenLP.Ui', 'OpenLP is already running. Do you wish to continue?')
         self.OpenService = translate('OpenLP.Ui', 'Open service.')
-        self.PlaySlidesInLoop = translate('OpenLP.Ui','Play Slides in Loop')
-        self.PlaySlidesToEnd = translate('OpenLP.Ui','Play Slides to End')
+        self.PlaySlidesInLoop = translate('OpenLP.Ui', 'Play Slides in Loop')
+        self.PlaySlidesToEnd = translate('OpenLP.Ui', 'Play Slides to End')
         self.Preview = translate('OpenLP.Ui', 'Preview')
         self.PrintService = translate('OpenLP.Ui', 'Print Service')
         self.ReplaceBG = translate('OpenLP.Ui', 'Replace Background')
@@ -144,4 +144,3 @@
         self.Version = translate('OpenLP.Ui', 'Version')
         self.View = translate('OpenLP.Ui', 'View')
         self.ViewMode = translate('OpenLP.Ui', 'View Mode')
-

=== modified file 'openlp/core/theme/__init__.py'
--- openlp/core/theme/__init__.py	2013-01-16 21:03:01 +0000
+++ openlp/core/theme/__init__.py	2013-02-03 14:47:18 +0000
@@ -32,3 +32,5 @@
 """
 
 from openlp.core.theme.theme import Theme
+
+__all__ = ['Theme']

=== modified file 'openlp/core/theme/theme.py'
--- openlp/core/theme/theme.py	2013-02-01 20:09:47 +0000
+++ openlp/core/theme/theme.py	2013-02-03 14:47:18 +0000
@@ -37,11 +37,21 @@
 from PyQt4 import QtGui
 
 DELPHI_COLORS = {
-    u'clAqua': 0x00FFFF,    u'clBlack': 0x000000,   u'clBlue': 0x0000FF,
-    u'clFuchsia': 0xFF00FF, u'clGray': 0x808080,    u'clGreen': 0x008000,
-    u'clLime': 0x00FF00,    u'clMaroon': 0x800000,  u'clNavy': 0x000080,
-    u'clOlive': 0x808000,   u'clPurple': 0x800080,  u'clRed': 0xFF0000,
-    u'clSilver': 0xC0C0C0,  u'clTeal': 0x008080,    u'clWhite': 0xFFFFFF,
+    u'clAqua': 0x00FFFF,
+    u'clBlack': 0x000000,
+    u'clBlue': 0x0000FF,
+    u'clFuchsia': 0xFF00FF,
+    u'clGray': 0x808080,
+    u'clGreen': 0x008000,
+    u'clLime': 0x00FF00,
+    u'clMaroon': 0x800000,
+    u'clNavy': 0x000080,
+    u'clOlive': 0x808000,
+    u'clPurple': 0x800080,
+    u'clRed': 0xFF0000,
+    u'clSilver': 0xC0C0C0,
+    u'clTeal': 0x008080,
+    u'clWhite': 0xFFFFFF,
     u'clYellow': 0xFFFF00
 }
 
@@ -66,6 +76,7 @@
 </Theme>
 '''
 
+
 class Theme(object):
     """
     Provide a class wrapper storing data from an XML theme
@@ -206,10 +217,12 @@
                     val = element_text
                 # strings need special handling to sort the colours out
                 if isinstance(element_text, basestring):
-                    if element_text[0] == u'$': # might be a hex number
+                    if element_text[0] == u'$':
+                        # might be a hex number
                         try:
                             val = int(element_text[1:], 16)
-                        except ValueError: # nope
+                        except ValueError:
+                            # nope
                             pass
                     elif element_text in DELPHI_COLORS:
                         val = DELPHI_COLORS[element_text]
@@ -223,9 +236,9 @@
                     isinstance(val, int))):
                     # convert to a wx.Colour
                     if not delphi_color_change:
-                        val = QtGui.QColor(val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF)
+                        val = QtGui.QColor(val & 0xFF, (val >> 8) & 0xFF, (val >> 16) & 0xFF)
                     else:
-                        val = QtGui.QColor((val>>16)&0xFF, (val>>8)&0xFF, val&0xFF)
+                        val = QtGui.QColor((val >> 16) & 0xFF, (val >> 8) & 0xFF, val & 0xFF)
                 setattr(self, element.tag, val)
 
     def __str__(self):

=== modified file 'openlp/core/ui/__init__.py'
--- openlp/core/ui/__init__.py	2013-02-02 19:49:56 +0000
+++ openlp/core/ui/__init__.py	2013-02-03 14:47:18 +0000
@@ -31,7 +31,6 @@
 """
 
 
-
 class HideMode(object):
     """
     This is an enumeration class which specifies the different modes of hiding the display.
@@ -101,6 +100,8 @@
 from servicemanager import ServiceManager
 from thememanager import ThemeManager
 
-__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay',
-    'SlideController', 'ServiceManager', 'ThemeManager', 'MediaDockManager',
-    'ServiceItemEditForm', 'FirstTimeForm' ]
+__all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay', 'SlideController', 'ServiceManager',
+    'ThemeManager', 'MediaDockManager', 'ServiceItemEditForm', 'FirstTimeForm', 'FirstTimeLanguageForm', 'ThemeForm',
+    'ThemeLayoutForm', 'FileRenameForm', 'StartTimeForm', 'MainDisplay', 'Display', 'ServiceNoteForm',
+    'SlideController', 'DisplayController', 'GeneralTab', 'ThemesTab', 'AdvancedTab', 'PluginForm',
+    'FormattingTagForm', 'ShortcutListForm']

=== modified file 'openlp/core/ui/aboutdialog.py'
--- openlp/core/ui/aboutdialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/aboutdialog.py	2013-02-03 14:47:18 +0000
@@ -34,7 +34,14 @@
 
 
 class Ui_AboutDialog(object):
+    """
+    The actual GUI widgets for the About form.
+    """
+
     def setupUi(self, aboutDialog):
+        """
+        Set up the UI for the dialog.
+        """
         aboutDialog.setObjectName(u'aboutDialog')
         aboutDialog.setWindowIcon(build_icon(u':/icon/openlp-logo-16x16.png'))
         self.aboutDialogLayout = QtGui.QVBoxLayout(aboutDialog)
@@ -80,6 +87,9 @@
         self.aboutNotebook.setCurrentIndex(0)
 
     def retranslateUi(self, aboutDialog):
+        """
+        Dynamically translate the UI.
+        """
         aboutDialog.setWindowTitle(u'%s OpenLP' % UiStrings().About)
         self.aboutTextEdit.setPlainText(translate('OpenLP.AboutForm',
             'OpenLP <version><revision> - Open Source Lyrics '
@@ -134,17 +144,17 @@
             u'en_ZA': [u'Raoul "superfly" Snyman',
                        u'Johan "nuvolari" Mynhardt'],
             u'el': [u'Alexander Siozos'],
-            u'es': [u'Josu\xe9 Z\xfa\xf1iga',u'Christian Gonzalez'],
+            u'es': [u'Josu\xe9 Z\xfa\xf1iga', u'Christian Gonzalez'],
             u'et': [u'Mattias "mahfiaz" P\xf5ldaru'],
             u'fi': [u'Jori "joribu" Brander', u'Tobbe "tobbeb" Bildo'],
             u'fr': [u'Stephan\xe9 "stbrunner" Brunner', u'Jeremie "jnau05"',
                     u'Carl "carl.fischer" Fischer'],
             u'hu': [u'Gyuris Gell\xe9rt'],
-            u'id': [u'Mico "bangmico" Siahaan' ,u' ign_christian'],
+            u'id': [u'Mico "bangmico" Siahaan', u' ign_christian'],
             u'ja': [u'Kunio "Kunio" Nakamaru', u'Chris Haris'],
             u'nb': [u'Atle "pendlaren" Weibell', u'Frode "frodus" Woldsund'],
             u'nl': [u'Arjen "typovar" van Voorst'],
-            u'pt_BR': [u'David Mederiros',u'Rafael "rafaellerm" Lerm',
+            u'pt_BR': [u'David Mederiros', u'Rafael "rafaellerm" Lerm',
                        u'Eduardo Levi Chaves',
                        u'Gustavo Bim', u'Rog\xeanio Bel\xe9m', u'Samuel'
                 u'Simon "samscudder" Scudder', u'Van Der Fran'],
@@ -260,7 +270,7 @@
             u'\n    '.join(documentors)))
         self.aboutNotebook.setTabText(self.aboutNotebook.indexOf(self.creditsTab),
             translate('OpenLP.AboutForm', 'Credits'))
-        copyright = translate('OpenLP.AboutForm',
+        copyright_note = translate('OpenLP.AboutForm',
             'Copyright \xa9 2004-2013 %s\n'
             'Portions copyright \xa9 2004-2013 %s') % (u'Raoul Snyman',
             u'Tim Bentley, Gerald Britton, Jonathan Corwin, Samuel Findlay, '
@@ -652,7 +662,7 @@
             'linking proprietary applications with the library. If this is '
             'what you want to do, use the GNU Lesser General Public License '
             'instead of this License.')
-        self.licenseTextEdit.setPlainText(u'%s\n\n%s\n\n%s\n\n\n%s' % (copyright, licence, disclaimer, gpltext))
+        self.licenseTextEdit.setPlainText(u'%s\n\n%s\n\n%s\n\n\n%s' % (copyright_note, licence, disclaimer, gpltext))
         self.aboutNotebook.setTabText(self.aboutNotebook.indexOf(self.licenseTab),
             translate('OpenLP.AboutForm', 'License'))
         self.volunteerButton.setText(translate('OpenLP.AboutForm', 'Volunteer'))

=== modified file 'openlp/core/ui/aboutform.py'
--- openlp/core/ui/aboutform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/aboutform.py	2013-02-03 14:47:18 +0000
@@ -26,6 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The About dialog.
+"""
 
 from PyQt4 import QtCore, QtGui
 
@@ -33,6 +36,7 @@
 from openlp.core.lib import translate
 from openlp.core.utils import get_application_version
 
+
 class AboutForm(QtGui.QDialog, Ui_AboutDialog):
     """
     The About dialog

=== modified file 'openlp/core/ui/advancedtab.py'
--- openlp/core/ui/advancedtab.py	2013-02-02 20:21:14 +0000
+++ openlp/core/ui/advancedtab.py	2013-02-03 14:47:18 +0000
@@ -36,7 +36,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, translate, build_icon,  Receiver, Settings, UiStrings
+from openlp.core.lib import SettingsTab, Receiver, Settings, UiStrings, translate, build_icon
 from openlp.core.utils import get_images_filter, AppLocation, format_time
 from openlp.core.lib import SlideLimits
 
@@ -137,7 +137,7 @@
         self.data_directory_layout = QtGui.QFormLayout(self.data_directory_group_box)
         self.data_directory_layout.setObjectName(u'data_directory_layout')
         self.data_directory_current_label = QtGui.QLabel(self.data_directory_group_box)
-        self.data_directory_current_label.setObjectName(            u'data_directory_current_label')
+        self.data_directory_current_label.setObjectName(u'data_directory_current_label')
         self.data_directory_label = QtGui.QLabel(self.data_directory_group_box)
         self.data_directory_label.setObjectName(u'data_directory_label')
         self.data_directory_new_label = QtGui.QLabel(self.data_directory_group_box)
@@ -314,7 +314,7 @@
         self.service_name_edit.setToolTip(translate('OpenLP.AdvancedTab', 'Consult the OpenLP manual for usage.'))
         self.service_name_revert_button.setToolTip(
             translate('OpenLP.AdvancedTab', 'Revert to the default service name "%s".') %
-            UiStrings().DefaultServiceName)
+                UiStrings().DefaultServiceName)
         self.service_name_example_label.setText(translate('OpenLP.AdvancedTab', 'Example:'))
         self.hide_mouse_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Mouse Cursor'))
         self.hide_mouse_check_box.setText(translate('OpenLP.AdvancedTab', 'Hide mouse cursor when over display window'))
@@ -461,9 +461,8 @@
 
     def cancel(self):
         """
-        Cancel Pressed.
+        Dialogue was cancelled, remove any pending data path change.
         """
-        # Dialogue was cancelled, remove any pending data path change.
         self.on_data_directory_cancel_button_clicked()
         SettingsTab.cancel(self)
 
@@ -490,8 +489,10 @@
             if day_delta < 0:
                 day_delta += 7
             time = now + timedelta(days=day_delta)
-            local_time = time.replace(hour = self.service_name_time.time().hour(),
-                minute = self.service_name_time.time().minute())
+            local_time = time.replace(
+                hour=self.service_name_time.time().hour(),
+                minute=self.service_name_time.time().minute()
+            )
         try:
             service_name_example = format_time(unicode(self.service_name_edit.text()), local_time)
         except ValueError:
@@ -501,7 +502,7 @@
 
     def update_service_name_example(self, returned_value):
         """
-        Example Updated
+        Update the example service name.
         """
         if not self.should_update_service_name_example:
             return
@@ -510,21 +511,21 @@
 
     def on_service_name_day_changed(self, service_day):
         """
-        Service Name day changed
+        React to the day of the service name changing.
         """
         self.service_name_time.setEnabled(service_day is not 7)
         self.update_service_name_example(None)
 
     def on_service_name_revert_button_clicked(self):
         """
-        Service Name reverted
+        Revert to the default service name.
         """
         self.service_name_edit.setText(UiStrings().DefaultServiceName)
         self.service_name_edit.setFocus()
 
     def on_default_color_button_clicked(self):
         """
-        Changed the default color
+        Select the background colour of the default display screen.
         """
         new_color = QtGui.QColorDialog.getColor(
             QtGui.QColor(self.default_color), self)
@@ -534,7 +535,7 @@
 
     def on_default_browse_button_clicked(self):
         """
-        Service Name options changed
+        Select an image for the default display screen.
         """
         file_filters = u'%s;;%s (*.*) (*)' % (get_images_filter(), UiStrings().AllFiles)
         filename = QtGui.QFileDialog.getOpenFileName(self,
@@ -549,9 +550,9 @@
         """
         old_root_path = unicode(self.data_directory_label.text())
         # Get the new directory location.
-        new_data_path = QtGui.QFileDialog.getExistingDirectory(self,
-            translate('OpenLP.AdvancedTab', 'Select Data Directory Location'), old_root_path,
-            options = QtGui.QFileDialog.ShowDirsOnly)
+        new_data_path = QtGui.QFileDialog.getExistingDirectory(
+            self, translate('OpenLP.AdvancedTab', 'Select Data Directory Location'), old_root_path,
+            options=QtGui.QFileDialog.ShowDirsOnly)
         # Set the new data path.
         if new_data_path:
             new_data_path = os.path.normpath(new_data_path)
@@ -602,8 +603,8 @@
 
     def on_data_directory_copy_check_box_toggled(self):
         """
-        Service Name options changed
-        """        
+        Copy existing data when you change your data directory.
+        """
         Receiver.send_message(u'set_copy_data',
             self.data_directory_copy_check_box.isChecked())
         if self.data_exists:
@@ -614,8 +615,8 @@
 
     def check_data_overwrite(self, data_path ):
         """
-        Service Name options changed
-        """        
+        Check if there's already data in the target directory.
+        """
         test_path = os.path.join(data_path, u'songs')
         self.data_directory_copy_check_box.show()
         if os.path.exists(test_path):
@@ -652,8 +653,8 @@
 
     def on_default_revert_button_clicked(self):
         """
-        Service Name options changed
-        """        
+        Revert the default screen back to the default settings.
+        """
         self.default_file_edit.setText(u':/graphics/openlp-splash-screen.png')
         self.default_file_edit.setFocus()
 

=== modified file 'openlp/core/ui/exceptiondialog.py'
--- openlp/core/ui/exceptiondialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/exceptiondialog.py	2013-02-03 14:47:18 +0000
@@ -26,14 +26,24 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The GUI widgets of the exception dialog.
+"""
 
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate
 from openlp.core.lib.ui import create_button, create_button_box
 
+
 class Ui_ExceptionDialog(object):
+    """
+    The GUI widgets of the exception dialog.
+    """
     def setupUi(self, exceptionDialog):
+        """
+        Set up the UI.
+        """
         exceptionDialog.setObjectName(u'exceptionDialog')
         self.exceptionLayout = QtGui.QVBoxLayout(exceptionDialog)
         self.exceptionLayout.setObjectName(u'exceptionLayout')
@@ -66,7 +76,7 @@
         self.exceptionLayout.addWidget(self.exceptionTextEdit)
         self.sendReportButton = create_button(exceptionDialog, u'sendReportButton',
             icon=u':/general/general_email.png', click=self.onSendReportButtonClicked)
-        self.saveReportButton = create_button(exceptionDialog,u'saveReportButton',
+        self.saveReportButton = create_button(exceptionDialog, u'saveReportButton',
             icon=u':/general/general_save.png', click=self.onSaveReportButtonClicked)
         self.attachFileButton = create_button(exceptionDialog, u'attachFileButton',
             icon=u':/general/general_open.png', click=self.onAttachFileButtonClicked)
@@ -79,6 +89,9 @@
             QtCore.SIGNAL(u'textChanged()'), self.onDescriptionUpdated)
 
     def retranslateUi(self, exceptionDialog):
+        """
+        Translate the widgets on the fly.
+        """
         exceptionDialog.setWindowTitle(translate('OpenLP.ExceptionDialog', 'Error Occurred'))
         self.descriptionExplanation.setText(translate('OpenLP.ExceptionDialog',
             'Please enter a description of what you were doing to cause this '

=== modified file 'openlp/core/ui/exceptionform.py'
--- openlp/core/ui/exceptionform.py	2013-01-17 22:14:06 +0000
+++ openlp/core/ui/exceptionform.py	2013-02-03 14:47:18 +0000
@@ -26,6 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The actual exception dialog form.
+"""
 import logging
 import re
 import os
@@ -92,22 +95,32 @@
 
 log = logging.getLogger(__name__)
 
+
 class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
     """
     The exception dialog
     """
     def __init__(self, parent):
+        """
+        Constructor.
+        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
         self.settingsSection = u'crashreport'
 
     def exec_(self):
+        """
+        Show the dialog.
+        """
         self.descriptionTextEdit.setPlainText(u'')
         self.onDescriptionUpdated()
         self.fileAttachment = None
         return QtGui.QDialog.exec_(self)
 
     def _createReport(self):
+        """
+        Create an exception report.
+        """
         openlp_version = get_application_version()
         description = self.descriptionTextEdit.toPlainText()
         traceback = self.exceptionTextEdit.toPlainText()
@@ -199,6 +212,9 @@
         QtGui.QDesktopServices.openUrl(mailto_url)
 
     def onDescriptionUpdated(self):
+        """
+        Update the minimum number of characters needed in the description.
+        """
         count = int(20 - len(self.descriptionTextEdit.toPlainText()))
         if count < 0:
             count = 0
@@ -209,6 +225,9 @@
             translate('OpenLP.ExceptionDialog', 'Description characters to enter : %s') % count)
 
     def onAttachFileButtonClicked(self):
+        """
+        Attache files to the bug report e-mail.
+        """
         files = QtGui.QFileDialog.getOpenFileName(
             self, translate('ImagePlugin.ExceptionDialog', 'Select Attachment'),
                 Settings().value(self.settingsSection + u'/last directory'), u'%s (*.*) (*)' % UiStrings().AllFiles)
@@ -217,6 +236,8 @@
             self.fileAttachment = unicode(files)
 
     def __buttonState(self, state):
+        """
+        Toggle the button state.
+        """
         self.saveReportButton.setEnabled(state)
         self.sendReportButton.setEnabled(state)
-

=== modified file 'openlp/core/ui/filerenamedialog.py'
--- openlp/core/ui/filerenamedialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/filerenamedialog.py	2013-02-03 14:47:18 +0000
@@ -26,14 +26,23 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The UI widgets for the rename dialog
+"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate
 from openlp.core.lib.ui import create_button_box
 
+
 class Ui_FileRenameDialog(object):
+    """
+    The UI widgets for the rename dialog
+    """
     def setupUi(self, fileRenameDialog):
+        """
+        Set up the UI
+        """
         fileRenameDialog.setObjectName(u'fileRenameDialog')
         fileRenameDialog.resize(300, 10)
         self.dialogLayout = QtGui.QGridLayout(fileRenameDialog)
@@ -51,4 +60,7 @@
         self.setMaximumHeight(self.sizeHint().height())
 
     def retranslateUi(self, fileRenameDialog):
+        """
+        Translate the UI on the fly.
+        """
         self.fileNameLabel.setText(translate('OpenLP.FileRenameForm', 'New File Name:'))

=== modified file 'openlp/core/ui/filerenameform.py'
--- openlp/core/ui/filerenameform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/filerenameform.py	2013-02-03 14:47:18 +0000
@@ -26,6 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The file rename dialog.
+"""
 
 from PyQt4 import QtGui
 
@@ -33,11 +36,15 @@
 
 from openlp.core.lib import translate
 
+
 class FileRenameForm(QtGui.QDialog, Ui_FileRenameDialog):
     """
-    The exception dialog
+    The file rename dialog
     """
     def __init__(self, parent):
+        """
+        Constructor
+        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
 

=== modified file 'openlp/core/ui/firsttimeform.py'
--- openlp/core/ui/firsttimeform.py	2013-02-02 07:34:42 +0000
+++ openlp/core/ui/firsttimeform.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+This module contains the first time wizard.
+"""
 import io
 import logging
 import os
@@ -45,14 +47,15 @@
 
 log = logging.getLogger(__name__)
 
+
 class ThemeScreenshotThread(QtCore.QThread):
     """
     This thread downloads the theme screenshots.
     """
-    def __init__(self, parent):
-        QtCore.QThread.__init__(self, parent)
-
     def run(self):
+        """
+        Overridden method to run the thread.
+        """
         themes = self.parent().config.get(u'themes', u'files')
         themes = themes.split(u',')
         config = self.parent().config
@@ -79,7 +82,10 @@
     log.info(u'ThemeWizardForm loaded')
 
     def __init__(self, screens, parent=None):
-        QtGui.QWizard.__init__(self, parent)
+        """
+        Create and set up the first time wizard.
+        """
+        super(FirstTimeForm, self).__init__(parent)
         self.setupUi(self)
         self.screens = screens
         # check to see if we have web access
@@ -90,7 +96,7 @@
             files = self.webAccess.read()
             self.config.readfp(io.BytesIO(files))
         self.updateScreenListCombo()
-        self.downloadCancelled = False
+        self.was_download_cancelled = False
         self.downloading = translate('OpenLP.FirstTimeWizard', 'Downloading %s...')
         QtCore.QObject.connect(self.cancelButton, QtCore.SIGNAL('clicked()'),
             self.onCancelButtonClicked)
@@ -241,7 +247,7 @@
                 (self.lastId <= FirstTimePage.Plugins and not self.hasRunWizard):
             QtCore.QCoreApplication.exit()
             sys.exit()
-        self.downloadCancelled = True
+        self.was_download_cancelled = True
         while self.themeScreenshotThread.isRunning():
             time.sleep(0.1)
         Receiver.send_message(u'cursor_normal')
@@ -267,7 +273,7 @@
         urlfile = urllib2.urlopen(url)
         filename = open(fpath, "wb")
         # Download until finished or canceled.
-        while not self.downloadCancelled:
+        while not self.was_download_cancelled:
             data = urlfile.read(block_size)
             if not data:
                 break
@@ -276,7 +282,7 @@
             self._downloadProgress(block_count, block_size)
         filename.close()
         # Delete file if cancelled, it may be a partial file.
-        if self.downloadCancelled:
+        if self.was_download_cancelled:
             os.remove(fpath)
 
     def _buildThemeScreenshots(self):
@@ -297,11 +303,20 @@
                 screenshot)))
 
     def _getFileSize(self, url):
+        """
+        Get the size of a file.
+
+        ``url``
+            The URL of the file we want to download.
+        """
         site = urllib.urlopen(url)
         meta = site.info()
         return int(meta.getheaders("Content-Length")[0])
 
     def _downloadProgress(self, count, block_size):
+        """
+        Calculate and display the download progress.
+        """
         increment = (count * block_size) - self.previous_size
         self._incrementProgressBar(None, increment)
         self.previous_size = count * block_size
@@ -459,6 +474,9 @@
             Settings().setValue(u'themes/global theme', self.themeComboBox.currentText())
 
     def _setPluginStatus(self, field, tag):
+        """
+        Set the status of a plugin.
+        """
         status = PluginStatus.Active if field.checkState() == QtCore.Qt.Checked else PluginStatus.Inactive
         Settings().setValue(tag, status)
 

=== modified file 'openlp/core/ui/firsttimelanguagedialog.py'
--- openlp/core/ui/firsttimelanguagedialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/firsttimelanguagedialog.py	2013-02-03 14:47:18 +0000
@@ -26,14 +26,23 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The UI widgets of the language selection dialog.
+"""
 from PyQt4 import QtGui
 
 from openlp.core.lib import translate
 from openlp.core.lib.ui import create_button_box
 
+
 class Ui_FirstTimeLanguageDialog(object):
+    """
+    The UI widgets of the language selection dialog.
+    """
     def setupUi(self, languageDialog):
+        """
+        Set up the UI.
+        """
         languageDialog.setObjectName(u'languageDialog')
         languageDialog.resize(300, 50)
         self.dialogLayout = QtGui.QVBoxLayout(languageDialog)
@@ -59,6 +68,9 @@
         self.setMaximumHeight(self.sizeHint().height())
 
     def retranslateUi(self, languageDialog):
+        """
+        Translate the UI on the fly.
+        """
         self.setWindowTitle(translate('OpenLP.FirstTimeLanguageForm', 'Select Translation'))
         self.infoLabel.setText(
             translate('OpenLP.FirstTimeLanguageForm', 'Choose the translation you\'d like to use in OpenLP.'))

=== modified file 'openlp/core/ui/firsttimelanguageform.py'
--- openlp/core/ui/firsttimelanguageform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/firsttimelanguageform.py	2013-02-03 14:47:18 +0000
@@ -26,18 +26,24 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The language selection dialog.
+"""
 from PyQt4 import QtGui
 
 from openlp.core.lib.ui import create_action
 from openlp.core.utils import LanguageManager
 from firsttimelanguagedialog import Ui_FirstTimeLanguageDialog
 
+
 class FirstTimeLanguageForm(QtGui.QDialog, Ui_FirstTimeLanguageDialog):
     """
-    The exception dialog
+    The language selection dialog.
     """
     def __init__(self, parent=None):
+        """
+        Constructor
+        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
         self.qmList = LanguageManager.get_qm_list()
@@ -52,6 +58,9 @@
         return QtGui.QDialog.exec_(self)
 
     def accept(self):
+        """
+        Run when the dialog is OKed.
+        """
         # It's the first row so must be Automatic
         if self.languageComboBox.currentIndex() == 0:
             LanguageManager.auto_language = True
@@ -63,6 +72,9 @@
         return QtGui.QDialog.accept(self)
 
     def reject(self):
+        """
+        Run when the dialog is canceled.
+        """
         LanguageManager.auto_language = True
         LanguageManager.set_language(False, False)
         return QtGui.QDialog.reject(self)

=== modified file 'openlp/core/ui/firsttimewizard.py'
--- openlp/core/ui/firsttimewizard.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/firsttimewizard.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The UI widgets for the first time wizard.
+"""
 from PyQt4 import QtCore, QtGui
 
 import sys
@@ -34,7 +36,11 @@
 from openlp.core.lib import translate
 from openlp.core.lib.ui import add_welcome_page
 
+
 class FirstTimePage(object):
+    """
+    An enumeration class with each of the pages of the wizard.
+    """
     Welcome = 0
     Plugins = 1
     NoInternet = 2
@@ -46,13 +52,19 @@
 
 
 class Ui_FirstTimeWizard(object):
+    """
+    The UI widgets for the first time wizard.
+    """
     def setupUi(self, FirstTimeWizard):
+        """
+        Set up the UI.
+        """
         FirstTimeWizard.setObjectName(u'FirstTimeWizard')
         FirstTimeWizard.resize(550, 386)
         FirstTimeWizard.setModal(True)
         FirstTimeWizard.setWizardStyle(QtGui.QWizard.ModernStyle)
         FirstTimeWizard.setOptions(QtGui.QWizard.IndependentPages | QtGui.QWizard.NoBackButtonOnStartPage |
-            QtGui.QWizard.NoBackButtonOnLastPage |QtGui.QWizard.HaveCustomButton1)
+            QtGui.QWizard.NoBackButtonOnLastPage | QtGui.QWizard.HaveCustomButton1)
         self.finishButton = self.button(QtGui.QWizard.FinishButton)
         self.noInternetFinishButton = self.button(QtGui.QWizard.CustomButton1)
         self.cancelButton = self.button(QtGui.QWizard.CancelButton)
@@ -193,17 +205,20 @@
         self.retranslateUi(FirstTimeWizard)
 
     def retranslateUi(self, FirstTimeWizard):
+        """
+        Translate the UI on the fly
+        """
         FirstTimeWizard.setWindowTitle(translate(
             'OpenLP.FirstTimeWizard', 'First Time Wizard'))
-        self.titleLabel.setText(u'<span style="font-size:14pt; font-weight:600;">%s</span>' % \
+        self.titleLabel.setText(u'<span style="font-size:14pt; font-weight:600;">%s</span>' %
             translate('OpenLP.FirstTimeWizard', 'Welcome to the First Time Wizard'))
         self.informationLabel.setText(translate('OpenLP.FirstTimeWizard',
             'This wizard will help you to configure OpenLP for initial use.'
             ' Click the next button below to start.'))
         self.pluginPage.setTitle(translate('OpenLP.FirstTimeWizard', 'Activate required Plugins'))
-        self.pluginPage.setSubTitle(translate('OpenLP.FirstTimeWizard','Select the Plugins you wish to use. '))
+        self.pluginPage.setSubTitle(translate('OpenLP.FirstTimeWizard', 'Select the Plugins you wish to use. '))
         self.songsCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Songs'))
-        self.customCheckBox.setText(translate('OpenLP.FirstTimeWizard','Custom Slides'))
+        self.customCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Custom Slides'))
         self.bibleCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Bible'))
         self.imageCheckBox.setText(translate('OpenLP.FirstTimeWizard', 'Images'))
         # TODO Presentation plugin is not yet working on Mac OS X.

=== modified file 'openlp/core/ui/formattingtagdialog.py'
--- openlp/core/ui/formattingtagdialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/formattingtagdialog.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The UI widgets for the formatting tags window.
+"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, UiStrings
@@ -34,8 +36,13 @@
 
 
 class Ui_FormattingTagDialog(object):
-
+    """
+    The UI widgets for the formatting tags window.
+    """
     def setupUi(self, formattingTagDialog):
+        """
+        Set up the UI
+        """
         formattingTagDialog.setObjectName(u'formattingTagDialog')
         formattingTagDialog.resize(725, 548)
         self.listdataGridLayout = QtGui.QGridLayout(formattingTagDialog)
@@ -116,6 +123,9 @@
         self.retranslateUi(formattingTagDialog)
 
     def retranslateUi(self, formattingTagDialog):
+        """
+        Translate the UI on the fly
+        """
         formattingTagDialog.setWindowTitle(translate('OpenLP.FormattingTagDialog', 'Configure Formatting Tags'))
         self.editGroupBox.setTitle(translate('OpenLP.FormattingTagDialog', 'Edit Selection'))
         self.savePushButton.setText(translate('OpenLP.FormattingTagDialog', 'Save'))

=== modified file 'openlp/core/ui/formattingtagform.py'
--- openlp/core/ui/formattingtagform.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/formattingtagform.py	2013-02-03 14:47:18 +0000
@@ -27,10 +27,9 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 """
-The :mod:`formattingtagform` provides an Tag Edit facility. The Base set are
-protected and included each time loaded. Custom tags can be defined and saved.
-The Custom Tag arrays are saved in a pickle so QSettings works on them. Base
-Tags cannot be changed.
+The :mod:`formattingtagform` provides an Tag Edit facility. The Base set are protected and included each time loaded.
+Custom tags can be defined and saved. The Custom Tag arrays are saved in a pickle so QSettings works on them. Base Tags
+cannot be changed.
 """
 from PyQt4 import QtCore, QtGui
 
@@ -49,7 +48,7 @@
         """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
-        QtCore.QObject.connect(self.tagTableWidget, QtCore.SIGNAL(u'itemSelectionChanged()'),self.onRowSelected)
+        QtCore.QObject.connect(self.tagTableWidget, QtCore.SIGNAL(u'itemSelectionChanged()'), self.onRowSelected)
         QtCore.QObject.connect(self.newPushButton, QtCore.SIGNAL(u'clicked()'), self.onNewClicked)
         QtCore.QObject.connect(self.savePushButton, QtCore.SIGNAL(u'clicked()'), self.onSavedClicked)
         QtCore.QObject.connect(self.deletePushButton, QtCore.SIGNAL(u'clicked()'), self.onDeleteClicked)

=== modified file 'openlp/core/ui/generaltab.py'
--- openlp/core/ui/generaltab.py	2013-01-11 00:19:11 +0000
+++ openlp/core/ui/generaltab.py	2013-02-03 14:47:18 +0000
@@ -26,6 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The general tab of the configuration dialog.
+"""
 import logging
 
 from PyQt4 import QtCore, QtGui
@@ -34,6 +37,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class GeneralTab(SettingsTab):
     """
     GeneralTab is the general settings tab in the settings dialog.

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2013-01-23 21:05:25 +0000
+++ openlp/core/ui/maindisplay.py	2013-02-03 14:47:18 +0000
@@ -27,12 +27,16 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 """
-The :mod:`maindisplay` module provides the functionality to display screens
-and play multimedia within OpenLP.
+The :mod:`maindisplay` module provides the functionality to display screens and play multimedia within OpenLP.
+
+Some of the code for this form is based on the examples at:
+
+* `http://www.steveheffernan.com/html5-video-player/demo-video-player.html`_
+* `http://html5demos.com/two-videos`_
+
 """
 import cgi
 import logging
-import os
 import sys
 
 from PyQt4 import QtCore, QtGui, QtWebKit, QtOpenGL
@@ -47,8 +51,6 @@
 
 log = logging.getLogger(__name__)
 
-#http://www.steveheffernan.com/html5-video-player/demo-video-player.html
-#http://html5demos.com/two-videos
 
 class Display(QtGui.QGraphicsView):
     """
@@ -57,6 +59,9 @@
     Preview display.
     """
     def __init__(self, parent, live, controller):
+        """
+        Constructor
+        """
         if live:
             QtGui.QGraphicsView.__init__(self)
             # Overwrite the parent() method.
@@ -101,6 +106,9 @@
             QtCore.Qt.ScrollBarAlwaysOff)
 
     def resizeEvent(self, event):
+        """
+        React to resizing of this display
+        """
         self.webView.setGeometry(0, 0, self.width(), self.height())
 
     def isWebLoaded(self):
@@ -116,6 +124,9 @@
     This is the display screen as a specialized class from the Display class
     """
     def __init__(self, parent, live, controller):
+        """
+        Constructor
+        """
         Display.__init__(self, parent, live, controller)
         self.screens = ScreenList()
         self.rebuildCSS = False
@@ -153,6 +164,9 @@
             QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_updated'), self.configChanged)
 
     def setTransparency(self, enabled):
+        """
+        Set the transparency of the window
+        """
         if enabled:
             self.setAutoFillBackground(False)
         else:
@@ -278,7 +292,7 @@
         """
         API for replacement backgrounds so Images are added directly to cache.
         """
-        self.image_manager.addImage(path, ImageSource.ImagePlugin, background)
+        self.image_manager.add_image(path, ImageSource.ImagePlugin, background)
         if not hasattr(self, u'serviceItem'):
             return False
         self.override[u'image'] = path
@@ -300,7 +314,7 @@
             re-added to the image manager.
         """
         log.debug(u'image to display')
-        image = self.image_manager.getImageBytes(path, ImageSource.ImagePlugin)
+        image = self.image_manager.get_image_bytes(path, ImageSource.ImagePlugin)
         self.controller.media_controller.media_reset(self.controller)
         self.displayImage(image)
 
@@ -381,14 +395,16 @@
                 self.override = {}
             else:
                 # replace the background
-                background = self.image_manager.getImageBytes(self.override[u'image'], ImageSource.ImagePlugin)
+                background = self.image_manager.get_image_bytes(self.override[u'image'], ImageSource.ImagePlugin)
         self.setTransparency(self.serviceItem.themedata.background_type ==
             BackgroundType.to_string(BackgroundType.Transparent))
         if self.serviceItem.themedata.background_filename:
-            self.serviceItem.bg_image_bytes = self.image_manager.getImageBytes(
-                self.serviceItem.themedata.background_filename,ImageSource.Theme)
+            self.serviceItem.bg_image_bytes = self.image_manager.get_image_bytes(
+                self.serviceItem.themedata.background_filename,
+                ImageSource.Theme
+            )
         if image_path:
-            image_bytes = self.image_manager.getImageBytes(image_path, ImageSource.ImagePlugin)
+            image_bytes = self.image_manager.get_image_bytes(image_path, ImageSource.ImagePlugin)
         else:
             image_bytes = None
         html = build_html(self.serviceItem, self.screen, self.isLive, background, image_bytes,
@@ -532,6 +548,9 @@
             self.mediaObject.enqueue(self.playlist[self.currentIndex])
 
     def onFinished(self):
+        """
+        When the audio track finishes.
+        """
         if self.repeat:
             log.debug(u'Repeat is enabled... here we go again!')
             self.mediaObject.clearQueue()
@@ -540,6 +559,9 @@
             self.play()
 
     def connectVolumeSlider(self, slider):
+        """
+        Connect the volume slider to the output channel.
+        """
         slider.setAudioOutput(self.audioObject)
 
     def reset(self):
@@ -586,6 +608,9 @@
         self.playlist.extend(map(Phonon.MediaSource, filenames))
 
     def next(self):
+        """
+        Skip forward to the next track in the list
+        """
         if not self.repeat and self.currentIndex + 1 >= len(self.playlist):
             return
         isPlaying = self.mediaObject.state() == Phonon.PlayingState
@@ -599,6 +624,9 @@
             self.mediaObject.play()
 
     def goTo(self, index):
+        """
+        Go to a particular track in the list
+        """
         isPlaying = self.mediaObject.state() == Phonon.PlayingState
         self.mediaObject.clearQueue()
         self.mediaObject.clear()
@@ -609,5 +637,7 @@
 
     #@todo is this used?
     def connectSlot(self, signal, slot):
+        """
+        Connect a slot to a signal on the media object
+        """
         QtCore.QObject.connect(self.mediaObject, signal, slot)
-

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2013-02-01 21:48:06 +0000
+++ openlp/core/ui/mainwindow.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+This is the main window, where all the action happens.
+"""
 import logging
 import os
 import sys
@@ -80,21 +82,24 @@
 
 
 class Ui_MainWindow(object):
-    def setupUi(self, mainWindow):
+    """
+    This is the UI part of the main window.
+    """
+    def setupUi(self, main_window):
         """
         Set up the user interface
         """
-        mainWindow.setObjectName(u'MainWindow')
-        mainWindow.setWindowIcon(build_icon(u':/icon/openlp-logo-64x64.png'))
-        mainWindow.setDockNestingEnabled(True)
+        main_window.setObjectName(u'MainWindow')
+        main_window.setWindowIcon(build_icon(u':/icon/openlp-logo-64x64.png'))
+        main_window.setDockNestingEnabled(True)
         # Set up the main container, which contains all the other form widgets.
-        self.mainContent = QtGui.QWidget(mainWindow)
+        self.mainContent = QtGui.QWidget(main_window)
         self.mainContent.setObjectName(u'mainContent')
         self.mainContentLayout = QtGui.QHBoxLayout(self.mainContent)
         self.mainContentLayout.setSpacing(0)
         self.mainContentLayout.setMargin(0)
         self.mainContentLayout.setObjectName(u'mainContentLayout')
-        mainWindow.setCentralWidget(self.mainContent)
+        main_window.setCentralWidget(self.mainContent)
         self.controlSplitter = QtGui.QSplitter(self.mainContent)
         self.controlSplitter.setOrientation(QtCore.Qt.Horizontal)
         self.controlSplitter.setObjectName(u'controlSplitter')
@@ -108,7 +113,7 @@
         panelLocked = Settings().value(u'user interface/lock panel')
         self.liveController.panel.setVisible(liveVisible)
         # Create menu
-        self.menuBar = QtGui.QMenuBar(mainWindow)
+        self.menuBar = QtGui.QMenuBar(main_window)
         self.menuBar.setObjectName(u'menuBar')
         self.fileMenu = QtGui.QMenu(self.menuBar)
         self.fileMenu.setObjectName(u'fileMenu')
@@ -134,10 +139,10 @@
         # Help Menu
         self.helpMenu = QtGui.QMenu(self.menuBar)
         self.helpMenu.setObjectName(u'helpMenu')
-        mainWindow.setMenuBar(self.menuBar)
-        self.statusBar = QtGui.QStatusBar(mainWindow)
+        main_window.setMenuBar(self.menuBar)
+        self.statusBar = QtGui.QStatusBar(main_window)
         self.statusBar.setObjectName(u'statusBar')
-        mainWindow.setStatusBar(self.statusBar)
+        main_window.setStatusBar(self.statusBar)
         self.loadProgressBar = QtGui.QProgressBar(self.statusBar)
         self.loadProgressBar.setObjectName(u'loadProgressBar')
         self.statusBar.addPermanentWidget(self.loadProgressBar)
@@ -148,142 +153,142 @@
         self.defaultThemeLabel.setObjectName(u'defaultThemeLabel')
         self.statusBar.addPermanentWidget(self.defaultThemeLabel)
         # Create the MediaManager
-        self.mediaManagerDock = OpenLPDockWidget(mainWindow,u'mediaManagerDock', u':/system/system_mediamanager.png')
+        self.mediaManagerDock = OpenLPDockWidget(main_window, u'mediaManagerDock', u':/system/system_mediamanager.png')
         self.mediaManagerDock.setStyleSheet(MEDIA_MANAGER_STYLE)
         # Create the media toolbox
         self.mediaToolBox = QtGui.QToolBox(self.mediaManagerDock)
         self.mediaToolBox.setObjectName(u'mediaToolBox')
         self.mediaManagerDock.setWidget(self.mediaToolBox)
-        mainWindow.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.mediaManagerDock)
+        main_window.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.mediaManagerDock)
         # Create the service manager
-        self.serviceManagerDock = OpenLPDockWidget(mainWindow, u'serviceManagerDock',
+        self.serviceManagerDock = OpenLPDockWidget(main_window, u'serviceManagerDock',
             u':/system/system_servicemanager.png')
         self.serviceManagerContents = ServiceManager(self.serviceManagerDock)
         self.serviceManagerDock.setWidget(self.serviceManagerContents)
-        mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.serviceManagerDock)
+        main_window.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.serviceManagerDock)
         # Create the theme manager
-        self.themeManagerDock = OpenLPDockWidget(mainWindow, u'themeManagerDock', u':/system/system_thememanager.png')
+        self.themeManagerDock = OpenLPDockWidget(main_window, u'themeManagerDock', u':/system/system_thememanager.png')
         self.themeManagerContents = ThemeManager(self.themeManagerDock)
         self.themeManagerContents.setObjectName(u'themeManagerContents')
         self.themeManagerDock.setWidget(self.themeManagerContents)
-        mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.themeManagerDock)
+        main_window.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.themeManagerDock)
         # Create the menu items
         action_list = ActionList.get_instance()
         action_list.add_category(UiStrings().File, CategoryOrder.standardMenu)
-        self.fileNewItem = create_action(mainWindow, u'fileNewItem',
+        self.fileNewItem = create_action(main_window, u'fileNewItem',
             icon=u':/general/general_new.png',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+N')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.on_new_service_clicked)
-        self.fileOpenItem = create_action(mainWindow, u'fileOpenItem',
+        self.fileOpenItem = create_action(main_window, u'fileOpenItem',
             icon=u':/general/general_open.png',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+O')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.on_load_service_clicked)
-        self.fileSaveItem = create_action(mainWindow, u'fileSaveItem',
+        self.fileSaveItem = create_action(main_window, u'fileSaveItem',
             icon=u':/general/general_save.png',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+S')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.save_file)
-        self.fileSaveAsItem = create_action(mainWindow, u'fileSaveAsItem',
+        self.fileSaveAsItem = create_action(main_window, u'fileSaveAsItem',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+Shift+S')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.save_file_as)
-        self.printServiceOrderItem = create_action(mainWindow,
+        self.printServiceOrderItem = create_action(main_window,
             u'printServiceItem', shortcuts=[QtGui.QKeySequence(u'Ctrl+P')],
             category=UiStrings().File,
             triggers=self.serviceManagerContents.print_service_order)
-        self.fileExitItem = create_action(mainWindow, u'fileExitItem',
+        self.fileExitItem = create_action(main_window, u'fileExitItem',
             icon=u':/system/system_exit.png',
             shortcuts=[QtGui.QKeySequence(u'Alt+F4')],
-            category=UiStrings().File, triggers=mainWindow.close)
+            category=UiStrings().File, triggers=main_window.close)
         # Give QT Extra Hint that this is the Exit Menu Item
         self.fileExitItem.setMenuRole(QtGui.QAction.QuitRole)
         action_list.add_category(UiStrings().Import, CategoryOrder.standardMenu)
-        self.importThemeItem = create_action(mainWindow, u'importThemeItem', category=UiStrings().Import)
-        self.importLanguageItem = create_action(mainWindow, u'importLanguageItem')
+        self.importThemeItem = create_action(main_window, u'importThemeItem', category=UiStrings().Import)
+        self.importLanguageItem = create_action(main_window, u'importLanguageItem')
         action_list.add_category(UiStrings().Export, CategoryOrder.standardMenu)
-        self.exportThemeItem = create_action(mainWindow, u'exportThemeItem', category=UiStrings().Export)
-        self.exportLanguageItem = create_action(mainWindow, u'exportLanguageItem')
+        self.exportThemeItem = create_action(main_window, u'exportThemeItem', category=UiStrings().Export)
+        self.exportLanguageItem = create_action(main_window, u'exportLanguageItem')
         action_list.add_category(UiStrings().View, CategoryOrder.standardMenu)
-        self.viewMediaManagerItem = create_action(mainWindow,
+        self.viewMediaManagerItem = create_action(main_window,
             u'viewMediaManagerItem', shortcuts=[QtGui.QKeySequence(u'F8')],
             icon=u':/system/system_mediamanager.png',
             checked=self.mediaManagerDock.isVisible(),
             category=UiStrings().View, triggers=self.toggleMediaManager)
-        self.viewThemeManagerItem = create_action(mainWindow,
+        self.viewThemeManagerItem = create_action(main_window,
             u'viewThemeManagerItem', shortcuts=[QtGui.QKeySequence(u'F10')],
             icon=u':/system/system_thememanager.png',
             checked=self.themeManagerDock.isVisible(),
             category=UiStrings().View, triggers=self.toggleThemeManager)
-        self.viewServiceManagerItem = create_action(mainWindow,
+        self.viewServiceManagerItem = create_action(main_window,
             u'viewServiceManagerItem', shortcuts=[QtGui.QKeySequence(u'F9')],
             icon=u':/system/system_servicemanager.png',
             checked=self.serviceManagerDock.isVisible(),
             category=UiStrings().View, triggers=self.toggleServiceManager)
-        self.viewPreviewPanel = create_action(mainWindow, u'viewPreviewPanel',
+        self.viewPreviewPanel = create_action(main_window, u'viewPreviewPanel',
             shortcuts=[QtGui.QKeySequence(u'F11')], checked=previewVisible,
             category=UiStrings().View, triggers=self.setPreviewPanelVisibility)
-        self.viewLivePanel = create_action(mainWindow, u'viewLivePanel',
+        self.viewLivePanel = create_action(main_window, u'viewLivePanel',
             shortcuts=[QtGui.QKeySequence(u'F12')], checked=liveVisible,
             category=UiStrings().View, triggers=self.setLivePanelVisibility)
-        self.lockPanel = create_action(mainWindow, u'lockPanel',
+        self.lockPanel = create_action(main_window, u'lockPanel',
             checked=panelLocked, triggers=self.setLockPanel)
         action_list.add_category(UiStrings().ViewMode,
             CategoryOrder.standardMenu)
-        self.modeDefaultItem = create_action(mainWindow, u'modeDefaultItem', checked=False,
+        self.modeDefaultItem = create_action(main_window, u'modeDefaultItem', checked=False,
             category=UiStrings().ViewMode)
-        self.modeSetupItem = create_action(mainWindow, u'modeSetupItem', checked=False, category=UiStrings().ViewMode)
-        self.modeLiveItem = create_action(mainWindow, u'modeLiveItem', checked=True, category=UiStrings().ViewMode)
-        self.modeGroup = QtGui.QActionGroup(mainWindow)
+        self.modeSetupItem = create_action(main_window, u'modeSetupItem', checked=False, category=UiStrings().ViewMode)
+        self.modeLiveItem = create_action(main_window, u'modeLiveItem', checked=True, category=UiStrings().ViewMode)
+        self.modeGroup = QtGui.QActionGroup(main_window)
         self.modeGroup.addAction(self.modeDefaultItem)
         self.modeGroup.addAction(self.modeSetupItem)
         self.modeGroup.addAction(self.modeLiveItem)
         self.modeDefaultItem.setChecked(True)
         action_list.add_category(UiStrings().Tools, CategoryOrder.standardMenu)
-        self.toolsAddToolItem = create_action(mainWindow,
+        self.toolsAddToolItem = create_action(main_window,
             u'toolsAddToolItem', icon=u':/tools/tools_add.png',
             category=UiStrings().Tools)
-        self.toolsOpenDataFolder = create_action(mainWindow,
+        self.toolsOpenDataFolder = create_action(main_window,
             u'toolsOpenDataFolder', icon=u':/general/general_open.png',
             category=UiStrings().Tools)
-        self.toolsFirstTimeWizard = create_action(mainWindow,
+        self.toolsFirstTimeWizard = create_action(main_window,
             u'toolsFirstTimeWizard', icon=u':/general/general_revert.png',
             category=UiStrings().Tools)
-        self.updateThemeImages = create_action(mainWindow,
+        self.updateThemeImages = create_action(main_window,
             u'updateThemeImages', category=UiStrings().Tools)
         action_list.add_category(UiStrings().Settings,
             CategoryOrder.standardMenu)
-        self.settingsPluginListItem = create_action(mainWindow,
+        self.settingsPluginListItem = create_action(main_window,
             u'settingsPluginListItem',
             icon=u':/system/settings_plugin_list.png',
             shortcuts=[QtGui.QKeySequence(u'Alt+F7')],
             category=UiStrings().Settings, triggers=self.onPluginItemClicked)
         # i18n Language Items
-        self.autoLanguageItem = create_action(mainWindow, u'autoLanguageItem',
+        self.autoLanguageItem = create_action(main_window, u'autoLanguageItem',
             checked=LanguageManager.auto_language)
-        self.languageGroup = QtGui.QActionGroup(mainWindow)
+        self.languageGroup = QtGui.QActionGroup(main_window)
         self.languageGroup.setExclusive(True)
         self.languageGroup.setObjectName(u'languageGroup')
         add_actions(self.languageGroup, [self.autoLanguageItem])
         qmList = LanguageManager.get_qm_list()
         savedLanguage = LanguageManager.get_language()
         for key in sorted(qmList.keys()):
-            languageItem = create_action(mainWindow, key, checked=qmList[key] == savedLanguage)
+            languageItem = create_action(main_window, key, checked=qmList[key] == savedLanguage)
             add_actions(self.languageGroup, [languageItem])
-        self.settingsShortcutsItem = create_action(mainWindow, u'settingsShortcutsItem',
+        self.settingsShortcutsItem = create_action(main_window, u'settingsShortcutsItem',
             icon=u':/system/system_configure_shortcuts.png', category=UiStrings().Settings)
         # Formatting Tags were also known as display tags.
-        self.formattingTagItem = create_action(mainWindow, u'displayTagItem',
+        self.formattingTagItem = create_action(main_window, u'displayTagItem',
             icon=u':/system/tag_editor.png', category=UiStrings().Settings)
-        self.settingsConfigureItem = create_action(mainWindow, u'settingsConfigureItem',
+        self.settingsConfigureItem = create_action(main_window, u'settingsConfigureItem',
             icon=u':/system/system_settings.png', category=UiStrings().Settings)
         # Give QT Extra Hint that this is the Preferences Menu Item
         self.settingsConfigureItem.setMenuRole(QtGui.QAction.PreferencesRole)
-        self.settingsImportItem = create_action(mainWindow, u'settingsImportItem', category=UiStrings().Settings)
-        self.settingsExportItem = create_action(mainWindow, u'settingsExportItem', category=UiStrings().Settings)
+        self.settingsImportItem = create_action(main_window, u'settingsImportItem', category=UiStrings().Settings)
+        self.settingsExportItem = create_action(main_window, u'settingsExportItem', category=UiStrings().Settings)
         action_list.add_category(UiStrings().Help, CategoryOrder.standardMenu)
-        self.aboutItem = create_action(mainWindow, u'aboutItem', icon=u':/system/system_about.png',
+        self.aboutItem = create_action(main_window, u'aboutItem', icon=u':/system/system_about.png',
             shortcuts=[QtGui.QKeySequence(u'Ctrl+F1')],
             category=UiStrings().Help, triggers=self.onAboutItemClicked)
         # Give QT Extra Hint that this is an About Menu Item
@@ -291,15 +296,15 @@
         if os.name == u'nt':
             self.localHelpFile = os.path.join(
                 AppLocation.get_directory(AppLocation.AppDir), 'OpenLP.chm')
-            self.offlineHelpItem = create_action(mainWindow, u'offlineHelpItem',
+            self.offlineHelpItem = create_action(main_window, u'offlineHelpItem',
                 icon=u':/system/system_help_contents.png',
                 shortcuts=[QtGui.QKeySequence(u'F1')],
                 category=UiStrings().Help, triggers=self.onOfflineHelpClicked)
-        self.onlineHelpItem = create_action(mainWindow, u'onlineHelpItem',
+        self.onlineHelpItem = create_action(main_window, u'onlineHelpItem',
             icon=u':/system/system_online_help.png',
             shortcuts=[QtGui.QKeySequence(u'Alt+F1')],
             category=UiStrings().Help, triggers=self.onOnlineHelpClicked)
-        self.webSiteItem = create_action(mainWindow, u'webSiteItem', category=UiStrings().Help)
+        self.webSiteItem = create_action(main_window, u'webSiteItem', category=UiStrings().Help)
         add_actions(self.fileImportMenu, (self.settingsImportItem, None, self.importThemeItem, self.importLanguageItem))
         add_actions(self.fileExportMenu, (self.settingsExportItem, None, self.exportThemeItem, self.exportLanguageItem))
         add_actions(self.fileMenu, (self.fileNewItem, self.fileOpenItem,
@@ -333,7 +338,7 @@
         add_actions(self.menuBar, (self.fileMenu.menuAction(), self.viewMenu.menuAction(), self.toolsMenu.menuAction(),
             self.settingsMenu.menuAction(), self.helpMenu.menuAction()))
         # Initialise the translation
-        self.retranslateUi(mainWindow)
+        self.retranslateUi(main_window)
         self.mediaToolBox.setCurrentIndex(0)
         # Connect up some signals and slots
         QtCore.QObject.connect(self.fileMenu, QtCore.SIGNAL(u'aboutToShow()'), self.updateRecentFilesMenu)
@@ -406,7 +411,8 @@
             'Toggle the visibility of the service manager.'))
         self.viewPreviewPanel.setText(translate('OpenLP.MainWindow', '&Preview Panel'))
         self.viewPreviewPanel.setToolTip(translate('OpenLP.MainWindow', 'Toggle Preview Panel'))
-        self.viewPreviewPanel.setStatusTip(translate('OpenLP.MainWindow', 'Toggle the visibility of the preview panel.'))
+        self.viewPreviewPanel.setStatusTip(
+            translate('OpenLP.MainWindow', 'Toggle the visibility of the preview panel.'))
         self.viewLivePanel.setText(translate('OpenLP.MainWindow', '&Live Panel'))
         self.viewLivePanel.setToolTip(translate('OpenLP.MainWindow', 'Toggle Live Panel'))
         self.lockPanel.setText(translate('OpenLP.MainWindow', 'L&ock Panels'))
@@ -517,7 +523,7 @@
             self.onSettingsShortcutsItemClicked)
         QtCore.QObject.connect(self.settingsImportItem, QtCore.SIGNAL(u'triggered()'),
             self.onSettingsImportItemClicked)
-        QtCore.QObject.connect(self.settingsExportItem,QtCore.SIGNAL(u'triggered()'), self.onSettingsExportItemClicked)
+        QtCore.QObject.connect(self.settingsExportItem, QtCore.SIGNAL(u'triggered()'), self.onSettingsExportItemClicked)
         # i18n set signals for languages
         self.languageGroup.triggered.connect(LanguageManager.set_language)
         QtCore.QObject.connect(self.modeDefaultItem, QtCore.SIGNAL(u'triggered()'), self.onModeDefaultItemClicked)
@@ -527,7 +533,8 @@
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_version_check'), self.versionNotice)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'live_display_blank_check'), self.blankCheck)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged)
-        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mainwindow_status_text'), self.showStatusMessage)
+        QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mainwindow_status_text'),
+            self.showStatusMessage)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cleanup'), self.clean_up)
         # Media Manager
         QtCore.QObject.connect(self.mediaToolBox, QtCore.SIGNAL(u'currentChanged(int)'), self.onMediaToolBoxChanged)
@@ -583,11 +590,17 @@
         Receiver.send_message(u'cursor_normal')
 
     def setAutoLanguage(self, value):
+        """
+        Set the language to automatic.
+        """
         self.languageGroup.setDisabled(value)
         LanguageManager.auto_language = value
         LanguageManager.set_language(self.languageGroup.checkedAction())
 
     def onMediaToolBoxChanged(self, index):
+        """
+        Focus a widget when the media toolbox changes.
+        """
         widget = self.mediaToolBox.widget(index)
         if widget:
             widget.onFocus()
@@ -631,23 +644,25 @@
             self.setViewMode(False, True, False, False, True)
             self.modeLiveItem.setChecked(True)
 
-    def appStartup(self):
+    def app_startup(self):
         """
         Give all the plugins a chance to perform some tasks at startup
         """
         Receiver.send_message(u'openlp_process_events')
         for plugin in self.pluginManager.plugins:
             if plugin.isActive():
-                plugin.appStartup()
+                plugin.app_startup()
                 Receiver.send_message(u'openlp_process_events')
 
-    def firstTime(self):
-        # Import themes if first time
+    def first_time(self):
+        """
+        Import themes if first time
+        """
         Receiver.send_message(u'openlp_process_events')
         for plugin in self.pluginManager.plugins:
-            if hasattr(plugin, u'firstTime'):
+            if hasattr(plugin, u'first_time'):
                 Receiver.send_message(u'openlp_process_events')
-                plugin.firstTime()
+                plugin.first_time()
         Receiver.send_message(u'openlp_process_events')
         temp_dir = os.path.join(unicode(gettempdir()), u'openlp')
         shutil.rmtree(temp_dir, True)
@@ -671,11 +686,11 @@
             return
         Receiver.send_message(u'cursor_busy')
         screens = ScreenList()
-        firstTime = FirstTimeForm(screens, self)
-        firstTime.exec_()
-        if firstTime.downloadCancelled:
+        first_run_wizard = FirstTimeForm(screens, self)
+        first_run_wizard.exec_()
+        if first_run_wizard.was_download_cancelled:
             return
-        self.firstTime()
+        self.first_time()
         for plugin in self.pluginManager.plugins:
             self.activePlugin = plugin
             oldStatus = self.activePlugin.status
@@ -683,7 +698,7 @@
             if oldStatus != self.activePlugin.status:
                 if self.activePlugin.status == PluginStatus.Active:
                     self.activePlugin.toggleStatus(PluginStatus.Active)
-                    self.activePlugin.appStartup()
+                    self.activePlugin.app_startup()
                 else:
                     self.activePlugin.toggleStatus(PluginStatus.Inactive)
         self.themeManagerContents.configUpdated()
@@ -705,14 +720,23 @@
                     translate('OpenLP.MainWindow', 'The Main Display has been blanked out'))
 
     def onErrorMessage(self, data):
+        """
+        Display an error message
+        """
         Receiver.send_message(u'close_splash')
         QtGui.QMessageBox.critical(self, data[u'title'], data[u'message'])
 
     def onWarningMessage(self, data):
+        """
+        Display a warning message
+        """
         Receiver.send_message(u'close_splash')
         QtGui.QMessageBox.warning(self, data[u'title'], data[u'message'])
 
     def onInformationMessage(self, data):
+        """
+        Display an informational message
+        """
         Receiver.send_message(u'close_splash')
         QtGui.QMessageBox.information(self, data[u'title'], data[u'message'])
 
@@ -800,8 +824,8 @@
                 QtGui.QMessageBox.No)
         if answer == QtGui.QMessageBox.No:
             return
-        import_file_name = QtGui.QFileDialog.getOpenFileName(self,translate('OpenLP.MainWindow', 'Open File'), '',
-                translate('OpenLP.MainWindow', 'OpenLP Export Settings Files (*.conf)'))
+        import_file_name = QtGui.QFileDialog.getOpenFileName(self, translate('OpenLP.MainWindow', 'Open File'), '',
+            translate('OpenLP.MainWindow', 'OpenLP Export Settings Files (*.conf)'))
         if not import_file_name:
             return
         setting_sections = []
@@ -980,7 +1004,7 @@
         """
         log.debug(u'screenChanged')
         Receiver.send_message(u'cursor_busy')
-        self.imageManager.updateDisplay()
+        self.imageManager.update_display()
         self.renderer.update_display()
         self.previewController.screenSizeChanged()
         self.liveController.screenSizeChanged()
@@ -994,7 +1018,7 @@
         """
         # The MainApplication did not even enter the event loop (this happens
         # when OpenLP is not fully loaded). Just ignore the event.
-        if not self.application.eventLoopIsActive:
+        if not self.application.is_event_loop_active:
             event.ignore()
             return
         # If we just did a settings import, close without saving changes.
@@ -1036,8 +1060,8 @@
         ``save_settings``
             Switch to prevent saving settings. Defaults to **True**.
         """
-        self.imageManager.stopManager = True
-        while self.imageManager.imageThread.isRunning():
+        self.imageManager.stop_manager = True
+        while self.imageManager.image_thread.isRunning():
             time.sleep(0.1)
         # Clean temporary files used by services
         self.serviceManagerContents.clean_up()
@@ -1100,18 +1124,33 @@
         self.setWindowTitle(title)
 
     def showStatusMessage(self, message):
+        """
+        Show a message in the status bar
+        """
         self.statusBar.showMessage(message)
 
     def defaultThemeChanged(self, theme):
+        """
+        Update the default theme indicator in the status bar
+        """
         self.defaultThemeLabel.setText(translate('OpenLP.MainWindow', 'Default Theme: %s') % theme)
 
     def toggleMediaManager(self):
+        """
+        Toggle the visibility of the media manager
+        """
         self.mediaManagerDock.setVisible(not self.mediaManagerDock.isVisible())
 
     def toggleServiceManager(self):
+        """
+        Toggle the visibility of the service manager
+        """
         self.serviceManagerDock.setVisible(not self.serviceManagerDock.isVisible())
 
     def toggleThemeManager(self):
+        """
+        Toggle the visibility of the theme manager
+        """
         self.themeManagerDock.setVisible(not self.themeManagerDock.isVisible())
 
     def setPreviewPanelVisibility(self, visible):
@@ -1295,13 +1334,22 @@
             Receiver.send_message(u'openlp_process_events')
 
     def setNewDataPath(self, new_data_path):
+        """
+        Set the new data path
+        """
         self.newDataPath = new_data_path
 
     def setCopyData(self, copy_data):
+        """
+        Set the flag to copy the data
+        """
         self.copyData = copy_data
 
     def changeDataDirectory(self):
-        log.info(u'Changing data path to %s' % self.newDataPath )
+        """
+        Change the data directory.
+        """
+        log.info(u'Changing data path to %s' % self.newDataPath)
         old_data_path = unicode(AppLocation.get_data_path())
         # Copy OpenLP data to new location if requested.
         if self.copyData:
@@ -1330,4 +1378,3 @@
         # Check if the new data path is our default.
         if self.newDataPath == AppLocation.get_directory(AppLocation.DataDir):
             settings.remove(u'advanced/data path')
-

=== modified file 'openlp/core/ui/media/__init__.py'
--- openlp/core/ui/media/__init__.py	2013-01-23 21:18:38 +0000
+++ openlp/core/ui/media/__init__.py	2013-02-03 14:47:18 +0000
@@ -26,6 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The :mod:`~openlp.core.ui.media` module contains classes and objects for media player integration.
+"""
 import logging
 
 from openlp.core.lib import Settings
@@ -34,6 +37,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class MediaState(object):
     """
     An enumeration for possible States of the Media Player
@@ -70,6 +74,7 @@
     end_time = 0
     media_type = MediaType()
 
+
 def get_media_players():
     """
     This method extracts the configured media players and overridden player
@@ -85,7 +90,7 @@
             overridden_player = u'auto'
     else:
         overridden_player = u''
-    saved_players_list = saved_players.replace(u'[', u'').replace(u']',u'').split(u',')
+    saved_players_list = saved_players.replace(u'[', u'').replace(u']', u'').split(u',')
     return saved_players_list, overridden_player
 
 
@@ -108,3 +113,5 @@
 
 from mediacontroller import MediaController
 from playertab import PlayerTab
+
+__all__ = [u'MediaController', u'PlayerTab']

=== modified file 'openlp/core/ui/media/mediacontroller.py'
--- openlp/core/ui/media/mediacontroller.py	2013-01-27 07:36:04 +0000
+++ openlp/core/ui/media/mediacontroller.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,10 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The :mod:`~openlp.core.ui.media.mediacontroller` module contains a base class for media components and other widgets
+related to playing media, such as sliders.
+"""
 import logging
 import os
 import datetime
@@ -41,11 +44,15 @@
 
 log = logging.getLogger(__name__)
 
+
 class MediaSlider(QtGui.QSlider):
     """
     Allows the mouse events of a slider to be overridden and extra functionality added
     """
     def __init__(self, direction, manager, controller, parent=None):
+        """
+        Constructor
+        """
         QtGui.QSlider.__init__(self, direction)
         self.manager = manager
         self.controller = controller
@@ -55,7 +62,7 @@
         Override event to allow hover time to be displayed.
         """
         timevalue = QtGui.QStyle.sliderValueFromPosition(self.minimum(), self.maximum(), event.x(), self.width())
-        self.setToolTip(u'%s' % datetime.timedelta(seconds=int(timevalue/1000)))
+        self.setToolTip(u'%s' % datetime.timedelta(seconds=int(timevalue / 1000)))
         QtGui.QSlider.mouseMoveEvent(self, event)
 
     def mousePressEvent(self, event):
@@ -87,6 +94,9 @@
 
     """
     def __init__(self, parent):
+        """
+        Constructor
+        """
         self.mainWindow = parent
         Registry().register(u'media_controller', self)
         self.mediaPlayers = {}
@@ -96,7 +106,7 @@
         self.timer = QtCore.QTimer()
         self.timer.setInterval(200)
         # Signals
-        QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.media_state)
+        self.timer.timeout.connect(self.media_state)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPlay'), self.media_play_msg)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackPause'), self.media_pause_msg)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'playbackStop'), self.media_stop_msg)
@@ -298,7 +308,6 @@
         QtCore.QObject.connect(controller.seekSlider, QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins)
         QtCore.QObject.connect(controller.volumeSlider, QtCore.SIGNAL(u'valueChanged(int)'), controller.sendToPlugins)
 
-
     def setup_display(self, display, preview):
         """
         After a new display is configured, all media related widget will be
@@ -428,7 +437,7 @@
         ``serviceItem``
             The ServiceItem containing the details to be played.
         """
-        controller =  self.displayControllers[DisplayControllerType.Plugin]
+        controller = self.displayControllers[DisplayControllerType.Plugin]
         log.debug(u'media_length')
         # stop running videos
         self.media_reset(controller)
@@ -500,8 +509,7 @@
             First element is the controller which should be used
         """
         log.debug(u'media_play_msg')
-        self.media_play(msg[0],status)
-
+        self.media_play(msg[0], status)
 
     def media_play(self, controller, status=True):
         """
@@ -551,7 +559,7 @@
             First element is the controller which should be used
         """
         log.debug(u'media_pause_msg')
-        self.media_pause( msg[0])
+        self.media_pause(msg[0])
 
     def media_pause(self, controller):
         """
@@ -716,6 +724,9 @@
                     self.timer.start()
 
     def finalise(self):
+        """
+        Reset all the media controllers when OpenLP shuts down
+        """
         self.timer.stop()
         for controller in self.displayControllers:
             self.media_reset(self.displayControllers[controller])

=== modified file 'openlp/core/ui/media/mediaplayer.py'
--- openlp/core/ui/media/mediaplayer.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/media/mediaplayer.py	2013-02-03 14:47:18 +0000
@@ -26,9 +26,12 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The :mod:`~openlp.core.ui.media.mediaplayer` module contains the MediaPlayer class.
+"""
 from openlp.core.ui.media import MediaState
 
+
 class MediaPlayer(object):
     """
     This is the base class media Player class to provide OpenLP with a
@@ -36,6 +39,9 @@
     """
 
     def __init__(self, parent, name=u'media_player'):
+        """
+        Constructor
+        """
         self.parent = parent
         self.name = name
         self.available = self.check_available()

=== modified file 'openlp/core/ui/media/phononplayer.py'
--- openlp/core/ui/media/phononplayer.py	2013-01-20 12:23:22 +0000
+++ openlp/core/ui/media/phononplayer.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The :mod:`~openlp.core.ui.media.phononplayer` contains the Phonon player component.
+"""
 import logging
 import mimetypes
 from datetime import datetime
@@ -56,24 +58,25 @@
         u'video/x-matroska': [u'.mpv', u'.mkv'],
         u'video/x-wmv': [u'.wmv'],
         u'video/x-mpg': [u'.mpg'],
-        u'video/mpeg' : [u'.mp4', u'.mts', u'.mov'],
+        u'video/mpeg': [u'.mp4', u'.mts', u'.mov'],
         u'video/x-ms-wmv': [u'.wmv']}
 
 VIDEO_CSS = u"""
 #videobackboard {
     z-index:3;
-    background-color: %s;
+    background-color: %(bgcolor)s;
 }
 #video1 {
-    background-color: %s;
+    background-color: %(bgcolor)s;
     z-index:4;
 }
 #video2 {
-    background-color: %s;
+    background-color: %(bgcolor)s;
     z-index:4;
 }
 """
 
+
 class PhononPlayer(MediaPlayer):
     """
     A specialised version of the MediaPlayer class, which provides a Phonon
@@ -81,6 +84,9 @@
     """
 
     def __init__(self, parent):
+        """
+        Constructor
+        """
         MediaPlayer.__init__(self, parent, u'phonon')
         self.original_name = u'Phonon'
         self.display_name = u'&Phonon'
@@ -94,13 +100,16 @@
             elif mimetype.startswith(u'video/'):
                 self._addToList(self.video_extensions_list, mimetype)
 
-    def _addToList(self, list, mimetype):
+    def _addToList(self, mimetype_list, mimetype):
+        """
+        Add mimetypes to the provided list
+        """
         # Add all extensions which mimetypes provides us for supported types.
         extensions = mimetypes.guess_all_extensions(unicode(mimetype))
         for extension in extensions:
             ext = u'*%s' % extension
-            if ext not in list:
-                list.append(ext)
+            if ext not in mimetype_list:
+                mimetype_list.append(ext)
         log.info(u'MediaPlugin: %s extensions: %s' % (mimetype, u' '.join(extensions)))
         # Add extensions for this mimetype from self.additional_extensions.
         # This hack clears mimetypes' and operating system's shortcomings
@@ -108,12 +117,15 @@
         if mimetype in self.additional_extensions.keys():
             for extension in self.additional_extensions[mimetype]:
                 ext = u'*%s' % extension
-                if ext not in list:
-                    list.append(ext)
+                if ext not in mimetype_list:
+                    mimetype_list.append(ext)
             log.info(u'MediaPlugin: %s additional extensions: %s' %
                 (mimetype, u' '.join(self.additional_extensions[mimetype])))
 
     def setup(self, display):
+        """
+        Set up the player widgets
+        """
         display.phononWidget = Phonon.VideoWidget(display)
         display.phononWidget.resize(display.size())
         display.mediaObject = Phonon.MediaObject(display)
@@ -126,9 +138,15 @@
         self.hasOwnWidget = True
 
     def check_available(self):
+        """
+        Check if the player is available
+        """
         return True
 
     def load(self, display):
+        """
+        Load a video into the display
+        """
         log.debug(u'load vid in Phonon Controller')
         controller = display.controller
         volume = controller.media_info.volume
@@ -156,9 +174,15 @@
         return True
 
     def resize(self, display):
+        """
+        Resize the display
+        """
         display.phononWidget.resize(display.size())
 
     def play(self, display):
+        """
+        Play the current media item
+        """
         controller = display.controller
         start_time = 0
         if display.mediaObject.state() != Phonon.PausedState and \
@@ -177,25 +201,40 @@
         return True
 
     def pause(self, display):
+        """
+        Pause the current media item
+        """
         display.mediaObject.pause()
         if self.media_state_wait(display, Phonon.PausedState):
             self.state = MediaState.Paused
 
     def stop(self, display):
+        """
+        Stop the current media item
+        """
         display.mediaObject.stop()
         self.set_visible(display, False)
         self.state = MediaState.Stopped
 
     def volume(self, display, vol):
+        """
+        Set the volume
+        """
         # 1.0 is the highest value
         if display.hasAudio:
             vol = float(vol) / float(100)
             display.audio.setVolume(vol)
 
     def seek(self, display, seekVal):
+        """
+        Go to a particular point in the current media item
+        """
         display.mediaObject.seek(seekVal)
 
     def reset(self, display):
+        """
+        Reset the media player
+        """
         display.mediaObject.stop()
         display.mediaObject.clearQueue()
         self.set_visible(display, False)
@@ -203,10 +242,16 @@
         self.state = MediaState.Off
 
     def set_visible(self, display, status):
+        """
+        Set the visibility of the widget
+        """
         if self.hasOwnWidget:
             display.phononWidget.setVisible(status)
 
     def update_ui(self, display):
+        """
+        Update the UI
+        """
         if display.mediaObject.state() == Phonon.PausedState and self.state != MediaState.Paused:
             self.stop(display)
         controller = display.controller
@@ -224,9 +269,12 @@
         Add css style sheets to htmlbuilder
         """
         background = QtGui.QColor(Settings().value(u'players/background color')).name()
-        return VIDEO_CSS % (background,background,background)
+        return VIDEO_CSS % {u'bgcolor': background}
 
     def get_info(self):
+        """
+        Return some info about this player
+        """
         return(translate('Media.player', 'Phonon is a media player which '
             'interacts with the operating system to provide media capabilities.') +
             u'<br/> <strong>' + translate('Media.player', 'Audio') +

=== modified file 'openlp/core/ui/media/playertab.py'
--- openlp/core/ui/media/playertab.py	2013-02-02 07:34:42 +0000
+++ openlp/core/ui/media/playertab.py	2013-02-03 14:47:18 +0000
@@ -26,18 +26,24 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The :mod:`~openlp.core.ui.media.playertab` module holds the configuration tab for the media stuff.
+"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import SettingsTab, translate, Receiver, Settings, UiStrings
 from openlp.core.lib.ui import create_button
 from openlp.core.ui.media import get_media_players, set_media_players
 
+
 class MediaQCheckBox(QtGui.QCheckBox):
     """
     MediaQCheckBox adds an extra property, playerName to the QCheckBox class.
     """
     def setPlayerName(self, name):
+        """
+        Set the player name
+        """
         self.playerName = name
 
 
@@ -46,6 +52,9 @@
     MediaTab is the Media settings tab in the settings dialog.
     """
     def __init__(self, parent):
+        """
+        Constructor
+        """
         self.mediaPlayers = self.media_controller.mediaPlayers
         self.savedUsedPlayers = None
         self.iconPath = u':/media/multimedia-player.png'
@@ -53,6 +62,9 @@
         SettingsTab.__init__(self, parent, u'Players', player_translated)
 
     def setupUi(self):
+        """
+        Set up the UI
+        """
         self.setObjectName(u'MediaTab')
         SettingsTab.setupUi(self)
         self.bgColorGroupBox = QtGui.QGroupBox(self.leftColumn)
@@ -114,6 +126,9 @@
             self.onbackgroundColorButtonClicked)
 
     def retranslateUi(self):
+        """
+        Translate the UI on the fly
+        """
         self.mediaPlayerGroupBox.setTitle(translate('OpenLP.PlayerTab', 'Available Media Players'))
         self.playerOrderGroupBox.setTitle(translate('OpenLP.PlayerTab', 'Player Search Order'))
         self.bgColorGroupBox.setTitle(UiStrings().BackgroundColor)
@@ -123,12 +138,18 @@
         self.retranslatePlayers()
 
     def onbackgroundColorButtonClicked(self):
+        """
+        Set the background color
+        """
         new_color = QtGui.QColorDialog.getColor(QtGui.QColor(self.bg_color), self)
         if new_color.isValid():
             self.bg_color = new_color.name()
             self.backgroundColorButton.setStyleSheet(u'background-color: %s' % self.bg_color)
 
     def onPlayerCheckBoxChanged(self, check_state):
+        """
+        Add or remove players depending on their status
+        """
         player = self.sender().playerName
         if check_state == QtCore.Qt.Checked:
             if player not in self.usedPlayers:
@@ -139,6 +160,9 @@
         self.updatePlayerList()
 
     def updatePlayerList(self):
+        """
+        Update the list of media players
+        """
         self.playerOrderlistWidget.clear()
         for player in self.usedPlayers:
             if player in self.playerCheckBoxes.keys():
@@ -150,6 +174,9 @@
                 self.playerOrderlistWidget.addItem(self.mediaPlayers[unicode(player)].original_name)
 
     def onUpButtonClicked(self):
+        """
+        Move a media player up in the order
+        """
         row = self.playerOrderlistWidget.currentRow()
         if row <= 0:
             return
@@ -159,6 +186,9 @@
         self.usedPlayers.insert(row - 1, self.usedPlayers.pop(row))
 
     def onDownButtonClicked(self):
+        """
+        Move a media player down in the order
+        """
         row = self.playerOrderlistWidget.currentRow()
         if row == -1 or row > self.playerOrderlistWidget.count() - 1:
             return
@@ -168,6 +198,9 @@
         self.usedPlayers.insert(row + 1, self.usedPlayers.pop(row))
 
     def load(self):
+        """
+        Load the settings
+        """
         if self.savedUsedPlayers:
             self.usedPlayers = self.savedUsedPlayers
         self.usedPlayers = get_media_players()[0]
@@ -181,6 +214,9 @@
         self.backgroundColorButton.setStyleSheet(u'background-color: %s' % self.bg_color)
 
     def save(self):
+        """
+        Save the settings
+        """
         player_string_changed = False
         settings = Settings()
         settings.beginGroup(self.settingsSection)
@@ -209,7 +245,7 @@
             checkbox.setToolTip(player.get_info())
             checkbox.setPlayerName(player.name)
             self.playerCheckBoxes[player.name] = checkbox
-            QtCore.QObject.connect(checkbox,QtCore.SIGNAL(u'stateChanged(int)'), self.onPlayerCheckBoxChanged)
+            QtCore.QObject.connect(checkbox, QtCore.SIGNAL(u'stateChanged(int)'), self.onPlayerCheckBoxChanged)
             self.mediaPlayerLayout.addWidget(checkbox)
             if player.available and player.name in self.usedPlayers:
                 checkbox.setChecked(True)

=== modified file 'openlp/core/ui/media/vlcplayer.py'
--- openlp/core/ui/media/vlcplayer.py	2013-01-20 12:23:22 +0000
+++ openlp/core/ui/media/vlcplayer.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The :mod:`~openlp.core.ui.media.vlcplayer` module contains our VLC component wrapper
+"""
 from datetime import datetime
 from distutils.version import LooseVersion
 import logging
@@ -80,8 +82,8 @@
     u'*.nsc',
     u'*.nsv',
     u'*.nut',
-    u'*.ra', u'*.ram', u'*.rm', u'*.rv' ,u'*.rmbv',
-    u'*.a52', u'*.dts', u'*.aac', u'*.flac' ,u'*.dv', u'*.vid',
+    u'*.ra', u'*.ram', u'*.rm', u'*.rv', u'*.rmbv',
+    u'*.a52', u'*.dts', u'*.aac', u'*.flac', u'*.dv', u'*.vid',
     u'*.tta', u'*.tac',
     u'*.ty',
     u'*.dts',
@@ -99,6 +101,9 @@
     """
 
     def __init__(self, parent):
+        """
+        Constructor
+        """
         MediaPlayer.__init__(self, parent, u'vlc')
         self.original_name = u'VLC'
         self.display_name = u'&VLC'
@@ -108,6 +113,9 @@
         self.video_extensions_list = VIDEO_EXT
 
     def setup(self, display):
+        """
+        Set up the media player
+        """
         display.vlcWidget = QtGui.QFrame(display)
         display.vlcWidget.setFrameStyle(QtGui.QFrame.NoFrame)
         # creating a basic vlc instance
@@ -141,9 +149,15 @@
         self.hasOwnWidget = True
 
     def check_available(self):
+        """
+        Return the availability of VLC
+        """
         return VLC_AVAILABLE
 
     def load(self, display):
+        """
+        Load a video into VLC
+        """
         log.debug(u'load vid in Vlc Controller')
         controller = display.controller
         volume = controller.media_info.volume
@@ -179,9 +193,15 @@
         return True
 
     def resize(self, display):
+        """
+        Resize the player
+        """
         display.vlcWidget.resize(display.size())
 
     def play(self, display):
+        """
+        Play the current item
+        """
         controller = display.controller
         start_time = 0
         if self.state != MediaState.Paused and controller.media_info.start_time > 0:
@@ -199,6 +219,9 @@
         return True
 
     def pause(self, display):
+        """
+        Pause the current item
+        """
         if display.vlcMedia.get_state() != vlc.State.Playing:
             return
         display.vlcMediaPlayer.pause()
@@ -206,27 +229,45 @@
             self.state = MediaState.Paused
 
     def stop(self, display):
+        """
+        Stop the current item
+        """
         display.vlcMediaPlayer.stop()
         self.state = MediaState.Stopped
 
     def volume(self, display, vol):
+        """
+        Set the volume
+        """
         if display.hasAudio:
             display.vlcMediaPlayer.audio_set_volume(vol)
 
     def seek(self, display, seekVal):
+        """
+        Go to a particular position
+        """
         if display.vlcMediaPlayer.is_seekable():
             display.vlcMediaPlayer.set_time(seekVal)
 
     def reset(self, display):
+        """
+        Reset the player
+        """
         display.vlcMediaPlayer.stop()
         display.vlcWidget.setVisible(False)
         self.state = MediaState.Off
 
     def set_visible(self, display, status):
+        """
+        Set the visibility
+        """
         if self.hasOwnWidget:
             display.vlcWidget.setVisible(status)
 
     def update_ui(self, display):
+        """
+        Update the UI
+        """
         # Stop video if playback is finished.
         if display.vlcMedia.get_state() == vlc.State.Ended:
             self.stop(display)
@@ -241,6 +282,9 @@
             controller.seekSlider.blockSignals(False)
 
     def get_info(self):
+        """
+        Return some information about this player
+        """
         return(translate('Media.player', 'VLC is an external player which '
             'supports a number of different formats.') +
             u'<br/> <strong>' + translate('Media.player', 'Audio') +

=== modified file 'openlp/core/ui/media/webkitplayer.py'
--- openlp/core/ui/media/webkitplayer.py	2013-01-23 19:53:02 +0000
+++ openlp/core/ui/media/webkitplayer.py	2013-02-03 14:47:18 +0000
@@ -26,8 +26,10 @@
 # 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
+"""
+The :mod:`~openlp.core.ui.media.webkit` module contains our WebKit video player
+"""
+from PyQt4 import QtGui
 
 import logging
 
@@ -40,14 +42,14 @@
 VIDEO_CSS = u"""
 #videobackboard {
     z-index:3;
-    background-color: %s;
+    background-color: %(bgcolor)s;
 }
 #video1 {
-    background-color: %s;
+    background-color: %(bgcolor)s;
     z-index:4;
 }
 #video2 {
-    background-color: %s;
+    background-color: %(bgcolor)s;
     z-index:4;
 }
 """
@@ -234,33 +236,33 @@
 """
 
 VIDEO_EXT = [
-        u'*.3gp'
-        , u'*.3gpp'
-        , u'*.3g2'
-        , u'*.3gpp2'
-        , u'*.aac'
-        , u'*.flv'
-        , u'*.f4a'
-        , u'*.f4b'
-        , u'*.f4p'
-        , u'*.f4v'
-        , u'*.mov'
-        , u'*.m4a'
-        , u'*.m4b'
-        , u'*.m4p'
-        , u'*.m4v'
-        , u'*.mkv'
-        , u'*.mp4'
-        , u'*.ogv'
-        , u'*.webm'
-        , u'*.mpg', u'*.wmv', u'*.mpeg', u'*.avi'
-        , u'*.swf'
-    ]
+    u'*.3gp',
+    u'*.3gpp',
+    u'*.3g2',
+    u'*.3gpp2',
+    u'*.aac',
+    u'*.flv',
+    u'*.f4a',
+    u'*.f4b',
+    u'*.f4p',
+    u'*.f4v',
+    u'*.mov',
+    u'*.m4a',
+    u'*.m4b',
+    u'*.m4p',
+    u'*.m4v',
+    u'*.mkv',
+    u'*.mp4',
+    u'*.ogv',
+    u'*.webm',
+    u'*.mpg', u'*.wmv', u'*.mpeg', u'*.avi',
+    u'*.swf'
+]
 
 AUDIO_EXT = [
-        u'*.mp3'
-        , u'*.ogg'
-    ]
+    u'*.mp3',
+    u'*.ogg'
+]
 
 
 class WebkitPlayer(MediaPlayer):
@@ -270,6 +272,9 @@
     """
 
     def __init__(self, parent):
+        """
+        Constructor
+        """
         MediaPlayer.__init__(self, parent, u'webkit')
         self.original_name = u'WebKit'
         self.display_name = u'&WebKit'
@@ -283,7 +288,7 @@
         Add css style sheets to htmlbuilder
         """
         background = QtGui.QColor(Settings().value(u'players/background color')).name()
-        css = VIDEO_CSS % (background,background,background)
+        css = VIDEO_CSS % {u'bgcolor': background}
         return css + FLASH_CSS
 
     def get_media_display_javascript(self):
@@ -299,14 +304,23 @@
         return VIDEO_HTML + FLASH_HTML
 
     def setup(self, display):
+        """
+        Set up the player
+        """
         display.webView.resize(display.size())
         display.webView.raise_()
         self.hasOwnWidget = False
 
     def check_available(self):
+        """
+        Check the availability of the media player
+        """
         return True
 
     def load(self, display):
+        """
+        Load a video
+        """
         log.debug(u'load vid in Webkit Controller')
         controller = display.controller
         if display.hasAudio and not controller.media_info.is_background:
@@ -329,9 +343,15 @@
         return True
 
     def resize(self, display):
+        """
+        Resize the player
+        """
         display.webView.resize(display.size())
 
     def play(self, display):
+        """
+        Play a video
+        """
         controller = display.controller
         display.webLoaded = True
         length = 0
@@ -352,6 +372,9 @@
         return True
 
     def pause(self, display):
+        """
+        Pause a video
+        """
         controller = display.controller
         if controller.media_info.is_flash:
             display.frame.evaluateJavaScript(u'show_flash("pause");')
@@ -360,6 +383,9 @@
         self.state = MediaState.Paused
 
     def stop(self, display):
+        """
+        Stop a video
+        """
         controller = display.controller
         if controller.media_info.is_flash:
             display.frame.evaluateJavaScript(u'show_flash("stop");')
@@ -368,6 +394,9 @@
         self.state = MediaState.Stopped
 
     def volume(self, display, vol):
+        """
+        Set the volume
+        """
         controller = display.controller
         # 1.0 is the highest value
         if display.hasAudio:
@@ -376,6 +405,9 @@
                 display.frame.evaluateJavaScript(u'show_video(null, null, %s);' % str(vol))
 
     def seek(self, display, seekVal):
+        """
+        Go to a position in the video
+        """
         controller = display.controller
         if controller.media_info.is_flash:
             seek = seekVal
@@ -385,6 +417,9 @@
             display.frame.evaluateJavaScript(u'show_video("seek", null, null, null, "%f");' % (seek))
 
     def reset(self, display):
+        """
+        Reset the player
+        """
         controller = display.controller
         if controller.media_info.is_flash:
             display.frame.evaluateJavaScript(u'show_flash("close");')
@@ -393,6 +428,9 @@
         self.state = MediaState.Off
 
     def set_visible(self, display, status):
+        """
+        Set the visibility
+        """
         controller = display.controller
         if status:
             is_visible = "visible"
@@ -404,6 +442,9 @@
             display.frame.evaluateJavaScript(u'show_video("setVisible", null, null, null, "%s");' % (is_visible))
 
     def update_ui(self, display):
+        """
+        Update the UI
+        """
         controller = display.controller
         if controller.media_info.is_flash:
             currentTime = display.frame.evaluateJavaScript(u'show_flash("currentTime");')
@@ -428,6 +469,9 @@
                 controller.seekSlider.blockSignals(False)
 
     def get_info(self):
+        """
+        Return some information about this player
+        """
         return(translate('Media.player', 'Webkit is a media player which runs '
             'inside a web browser. This player allows text over video to be '
             'rendered.') +

=== modified file 'openlp/core/ui/mediadockmanager.py'
--- openlp/core/ui/mediadockmanager.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/mediadockmanager.py	2013-02-03 14:47:18 +0000
@@ -26,13 +26,16 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The media manager dock.
+"""
 import logging
 
 from openlp.core.lib import StringContent
 
 log = logging.getLogger(__name__)
 
+
 class MediaDockManager(object):
     """
     Provide a repository for MediaManagerItems

=== modified file 'openlp/core/ui/plugindialog.py'
--- openlp/core/ui/plugindialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/plugindialog.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The UI widgets of the plugin view dialog
+#"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, UiStrings
@@ -34,7 +36,13 @@
 
 
 class Ui_PluginViewDialog(object):
+    """
+    The UI of the plugin view dialog
+    """
     def setupUi(self, pluginViewDialog):
+        """
+        Set up the UI
+        """
         pluginViewDialog.setObjectName(u'pluginViewDialog')
         pluginViewDialog.setWindowModality(QtCore.Qt.ApplicationModal)
         self.pluginLayout = QtGui.QVBoxLayout(pluginViewDialog)
@@ -72,6 +80,9 @@
         self.retranslateUi(pluginViewDialog)
 
     def retranslateUi(self, pluginViewDialog):
+        """
+        Translate the UI on the fly
+        """
         pluginViewDialog.setWindowTitle(translate('OpenLP.PluginForm', 'Plugin List'))
         self.pluginInfoGroupBox.setTitle(translate('OpenLP.PluginForm', 'Plugin Details'))
         self.versionLabel.setText(u'%s:' % UiStrings().Version)

=== modified file 'openlp/core/ui/pluginform.py'
--- openlp/core/ui/pluginform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/pluginform.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The actual plugin view form
+"""
 import logging
 
 from PyQt4 import QtCore, QtGui
@@ -36,11 +38,15 @@
 
 log = logging.getLogger(__name__)
 
+
 class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
     """
     The plugin form provides user control over the plugins OpenLP uses.
     """
     def __init__(self, parent=None):
+        """
+        Constructor
+        """
         QtGui.QDialog.__init__(self, parent)
         self.activePlugin = None
         self.programaticChange = False
@@ -85,12 +91,18 @@
         self.pluginListWidget.setFixedWidth(pluginListWidth + self.pluginListWidget.iconSize().width() + 48)
 
     def _clearDetails(self):
+        """
+        Clear the plugin details widgets
+        """
         self.statusComboBox.setCurrentIndex(-1)
         self.versionNumberLabel.setText(u'')
         self.aboutTextBrowser.setHtml(u'')
         self.statusComboBox.setEnabled(False)
 
     def _setDetails(self):
+        """
+        Set the details of the currently selected plugin
+        """
         log.debug(u'PluginStatus: %s', str(self.activePlugin.status))
         self.versionNumberLabel.setText(self.activePlugin.version)
         self.aboutTextBrowser.setHtml(self.activePlugin.about())
@@ -103,6 +115,9 @@
         self.programaticChange = False
 
     def onPluginListWidgetSelectionChanged(self):
+        """
+        If the selected plugin changes, update the form
+        """
         if self.pluginListWidget.currentItem() is None:
             self._clearDetails()
             return
@@ -120,13 +135,16 @@
             self._clearDetails()
 
     def onStatusComboBoxChanged(self, status):
+        """
+        If the status of a plugin is altered, apply the change
+        """
         if self.programaticChange or status == PluginStatus.Disabled:
             return
         if status == PluginStatus.Inactive:
             Receiver.send_message(u'cursor_busy')
             self.activePlugin.toggleStatus(PluginStatus.Active)
             Receiver.send_message(u'cursor_normal')
-            self.activePlugin.appStartup()
+            self.activePlugin.app_startup()
         else:
             self.activePlugin.toggleStatus(PluginStatus.Inactive)
         status_text = translate('OpenLP.PluginForm', '%s (Inactive)')

=== modified file 'openlp/core/ui/printservicedialog.py'
--- openlp/core/ui/printservicedialog.py	2013-01-11 00:19:11 +0000
+++ openlp/core/ui/printservicedialog.py	2013-02-03 14:47:18 +0000
@@ -26,11 +26,14 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The UI widgets of the print service dialog.
+"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import build_icon, translate, SpellTextEdit, UiStrings
 
+
 class ZoomSize(object):
     """
     Type enumeration for Combo Box sizes
@@ -44,7 +47,13 @@
 
 
 class Ui_PrintServiceDialog(object):
+    """
+    The UI of the print service dialog
+    """
     def setupUi(self, printServiceDialog):
+        """
+        Set up the UI
+        """
         printServiceDialog.setObjectName(u'printServiceDialog')
         printServiceDialog.resize(664, 594)
         self.mainLayout = QtGui.QVBoxLayout(printServiceDialog)
@@ -121,9 +130,12 @@
         self.optionsLayout.addWidget(self.optionsGroupBox)
 
         self.retranslateUi(printServiceDialog)
-        QtCore.QObject.connect(self.optionsButton,QtCore.SIGNAL(u'toggled(bool)'), self.toggleOptions)
+        QtCore.QObject.connect(self.optionsButton, QtCore.SIGNAL(u'toggled(bool)'), self.toggleOptions)
 
     def retranslateUi(self, printServiceDialog):
+        """
+        Translate the UI on the fly
+        """
         printServiceDialog.setWindowTitle(UiStrings().PrintService)
         self.zoomOutButton.setToolTip(translate('OpenLP.PrintServiceForm', 'Zoom Out'))
         self.zoomOriginalButton.setToolTip(translate('OpenLP.PrintServiceForm', 'Zoom Original'))
@@ -131,7 +143,7 @@
         self.optionsButton.setText(translate('OpenLP.PrintServiceForm', 'Options'))
         self.titleLabel.setText(translate('OpenLP.PrintServiceForm', 'Title:'))
         self.footerLabel.setText(translate('OpenLP.PrintServiceForm', 'Custom Footer Text:'))
-        self.optionsGroupBox.setTitle(translate('OpenLP.PrintServiceForm','Other Options'))
+        self.optionsGroupBox.setTitle(translate('OpenLP.PrintServiceForm', 'Other Options'))
         self.slideTextCheckBox.setText(translate('OpenLP.PrintServiceForm', 'Include slide text if available'))
         self.pageBreakAfterText.setText(translate('OpenLP.PrintServiceForm', 'Add page break before each text item'))
         self.notesCheckBox.setText(translate('OpenLP.PrintServiceForm', 'Include service item notes'))
@@ -144,6 +156,5 @@
             u'100%',
             u'75%',
             u'50%',
-            u'25%']
-        )
-
+            u'25%'
+        ])

=== modified file 'openlp/core/ui/printserviceform.py'
--- openlp/core/ui/printserviceform.py	2013-01-27 07:36:04 +0000
+++ openlp/core/ui/printserviceform.py	2013-02-03 14:47:18 +0000
@@ -26,6 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The actual print service dialog
+"""
 import cgi
 import datetime
 import os
@@ -106,8 +109,11 @@
 }
 """
 
+
 class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
-
+    """
+    The :class:`~openlp.core.ui.printserviceform.PrintServiceForm` class displays a dialog for printing the service.
+    """
     def __init__(self):
         """
         Constructor
@@ -143,6 +149,9 @@
         self.updatePreviewText()
 
     def toggleOptions(self, checked):
+        """
+        Toggle various options
+        """
         self.optionsWidget.setVisible(checked)
         if checked:
             left = self.optionsButton.pos().x()
@@ -181,6 +190,9 @@
         self.previewWidget.updatePreview()
 
     def _addPreviewItem(self, body, item, index):
+        """
+        Add a preview item
+        """
         div = self._addElement(u'div', classId=u'item', parent=body)
         # Add the title of the service item.
         item_title = self._addElement(u'h2', parent=div, classId=u'itemTitle')
@@ -388,6 +400,9 @@
         settings.endGroup()
 
     def update_song_usage(self):
+        """
+        Update the song usage
+        """
         # Only continue when we include the song's text.
         if not self.slideTextCheckBox.isChecked():
             return

=== modified file 'openlp/core/ui/serviceitemeditdialog.py'
--- openlp/core/ui/serviceitemeditdialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/serviceitemeditdialog.py	2013-02-03 14:47:18 +0000
@@ -26,14 +26,23 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The UI widgets for the service item edit dialog
+"""
 from PyQt4 import QtGui
 
 from openlp.core.lib import translate
 from openlp.core.lib.ui import create_button_box, create_button
 
+
 class Ui_ServiceItemEditDialog(object):
+    """
+    The UI widgets for the service item edit dialog
+    """
     def setupUi(self, serviceItemEditDialog):
+        """
+        Set up the UI
+        """
         serviceItemEditDialog.setObjectName(u'serviceItemEditDialog')
         self.dialog_layout = QtGui.QGridLayout(serviceItemEditDialog)
         self.dialog_layout.setContentsMargins(8, 8, 8, 8)
@@ -61,4 +70,7 @@
         self.retranslateUi(serviceItemEditDialog)
 
     def retranslateUi(self, serviceItemEditDialog):
+        """
+        Translate the UI on the fly
+        """
         serviceItemEditDialog.setWindowTitle(translate('OpenLP.ServiceItemEditForm', 'Reorder Service Item'))

=== modified file 'openlp/core/ui/serviceitemeditform.py'
--- openlp/core/ui/serviceitemeditform.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/serviceitemeditform.py	2013-02-03 14:47:18 +0000
@@ -26,12 +26,15 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The service item edit dialog
+"""
 from PyQt4 import QtCore, QtGui
 from openlp.core.lib import Registry
 
 from serviceitemeditdialog import Ui_ServiceItemEditDialog
 
+
 class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog):
     """
     This is the form that is used to edit the verses of the song.
@@ -47,6 +50,9 @@
             self.on_current_row_changed)
 
     def set_service_item(self, item):
+        """
+        Set the service item to be edited.
+        """
         self.item = item
         self.item_list = []
         if self.item.is_image():
@@ -57,6 +63,9 @@
         self.list_widget.setCurrentItem(self.list_widget.currentItem())
 
     def get_service_item(self):
+        """
+        Get the modified service item.
+        """
         if self.data:
             self.item._raw_frames = []
             if self.item.is_image():

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2013-02-02 19:49:56 +0000
+++ openlp/core/ui/servicemanager.py	2013-02-03 14:47:18 +0000
@@ -26,6 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The service manager sets up, loads, saves and manages services.
+"""
 import cgi
 import cPickle
 import logging
@@ -48,11 +51,15 @@
 from openlp.core.utils import AppLocation, delete_file, split_filename, format_time
 from openlp.core.utils.actions import ActionList, CategoryOrder
 
+
 class ServiceManagerList(QtGui.QTreeWidget):
     """
     Set up key bindings and mouse behaviour for the service list
     """
     def __init__(self, serviceManager, parent=None):
+        """
+        Constructor
+        """
         QtGui.QTreeWidget.__init__(self, parent)
         self.serviceManager = serviceManager
 
@@ -93,6 +100,7 @@
         mime_data.setText(u'ServiceManager')
         drag.start(QtCore.Qt.CopyAction)
 
+
 class ServiceManagerDialog(object):
     """
     UI part of the Service Manager
@@ -409,10 +417,12 @@
             elif result == QtGui.QMessageBox.Save:
                 self.decide_save_method()
         if not load_file:
-            file_name = QtGui.QFileDialog.getOpenfile_name(self.main_window,
+            file_name = QtGui.QFileDialog.getOpenFileName(
+                self.main_window,
                 translate('OpenLP.ServiceManager', 'Open File'),
-                    SettingsManager.get_last_dir(self.main_window.serviceManagerSettingsSection),
-                    translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz *.oszl)'))
+                Settings().value(self.main_window.serviceManagerSettingsSection + u'/last directory'),
+                translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz *.oszl)')
+            )
             if not file_name:
                 return False
         else:
@@ -817,8 +827,8 @@
                 delay_suffix = u' %s s' % unicode(service_item[u'service_item'].timed_slide_interval)
             else:
                 delay_suffix = u' ...'
-            self.timed_slide_interval.setText(translate('OpenLP.ServiceManager', '&Delay between slides') +
-                delay_suffix)
+            self.timed_slide_interval.setText(
+                translate('OpenLP.ServiceManager', '&Delay between slides') + delay_suffix)
             # TODO for future: make group explains itself more visually
         else:
             self.auto_play_slides_group.menuAction().setVisible(False)
@@ -827,7 +837,7 @@
         if service_item[u'service_item'].is_capable(ItemCapabilities.CanAutoStartForLive):
             self.auto_start_action.setVisible(True)
             self.auto_start_action.setIcon(self.inactive)
-            self.auto_start_action.setText(translate('OpenLP.ServiceManager','&Auto Start - inactive'))
+            self.auto_start_action.setText(translate('OpenLP.ServiceManager', '&Auto Start - inactive'))
             if service_item[u'service_item'].will_auto_start:
                 self.auto_start_action.setText(translate('OpenLP.ServiceManager', '&Auto Start - active'))
                 self.auto_start_action.setIcon(self.active)
@@ -885,7 +895,6 @@
                 self.main_window.generalSettingsSection + u'/loop delay')
         self.set_modified()
 
-
     def toggle_auto_play_slides_loop(self):
         """
         Toggle Auto play slide loop.
@@ -901,7 +910,6 @@
                 self.main_window.generalSettingsSection + u'/loop delay')
         self.set_modified()
 
-
     def on_timed_slide_interval(self):
         """
         Shows input dialog for enter interval in seconds for delay
@@ -1621,4 +1629,4 @@
             self._main_window = Registry().get(u'main_window')
         return self._main_window
 
-    main_window = property(_get_main_window)
\ No newline at end of file
+    main_window = property(_get_main_window)

=== modified file 'openlp/core/ui/servicenoteform.py'
--- openlp/core/ui/servicenoteform.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/servicenoteform.py	2013-02-03 14:47:18 +0000
@@ -26,12 +26,15 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The :mod:`~openlp.core.ui.servicenoteform` module contains the `ServiceNoteForm` class.
+"""
 from PyQt4 import QtGui
 
 from openlp.core.lib import translate, SpellTextEdit, Registry
 from openlp.core.lib.ui import create_button_box
 
+
 class ServiceNoteForm(QtGui.QDialog):
     """
     This is the form that is used to edit the verses of the song.
@@ -45,10 +48,16 @@
         self.retranslateUi()
 
     def exec_(self):
+        """
+        Execute the form and return the result.
+        """
         self.text_edit.setFocus()
         return QtGui.QDialog.exec_(self)
 
     def setupUi(self):
+        """
+        Set up the UI of the dialog
+        """
         self.setObjectName(u'serviceNoteEdit')
         self.dialog_layout = QtGui.QVBoxLayout(self)
         self.dialog_layout.setContentsMargins(8, 8, 8, 8)
@@ -61,6 +70,9 @@
         self.dialog_layout.addWidget(self.button_box)
 
     def retranslateUi(self):
+        """
+        Translate the UI on the fly
+        """
         self.setWindowTitle(translate('OpenLP.ServiceNoteForm', 'Service Item Notes'))
 
     def _get_main_window(self):

=== modified file 'openlp/core/ui/settingsdialog.py'
--- openlp/core/ui/settingsdialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/settingsdialog.py	2013-02-03 14:47:18 +0000
@@ -26,14 +26,23 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The UI widgets of the settings dialog.
+"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, build_icon
 from openlp.core.lib.ui import create_button_box
 
+
 class Ui_SettingsDialog(object):
+    """
+    The UI widgets of the settings dialog.
+    """
     def setupUi(self, settingsDialog):
+        """
+        Set up the UI
+        """
         settingsDialog.setObjectName(u'settingsDialog')
         settingsDialog.resize(800, 500)
         settingsDialog.setWindowIcon(build_icon(u':/system/system_settings.png'))
@@ -55,4 +64,7 @@
         QtCore.QObject.connect(self.settingListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.tabChanged)
 
     def retranslateUi(self, settingsDialog):
+        """
+        Translate the UI on the fly
+        """
         settingsDialog.setWindowTitle(translate('OpenLP.SettingsForm', 'Configure OpenLP'))

=== modified file 'openlp/core/ui/settingsform.py'
--- openlp/core/ui/settingsform.py	2013-02-01 20:09:47 +0000
+++ openlp/core/ui/settingsform.py	2013-02-03 14:47:18 +0000
@@ -40,6 +40,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class SettingsForm(QtGui.QDialog, Ui_SettingsDialog):
     """
     Provide the form to manipulate the settings for OpenLP
@@ -61,6 +62,9 @@
         self.playerTab = PlayerTab(self)
 
     def exec_(self):
+        """
+        Execute the form
+        """
         # load all the settings
         self.settingListWidget.clear()
         while self.stackedLayout.count():

=== modified file 'openlp/core/ui/shortcutlistdialog.py'
--- openlp/core/ui/shortcutlistdialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/shortcutlistdialog.py	2013-02-03 14:47:18 +0000
@@ -26,17 +26,23 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The list of shortcuts within a dialog.
+"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, build_icon
 from openlp.core.lib.ui import create_button_box
 
+
 class CaptureShortcutButton(QtGui.QPushButton):
     """
     A class to encapsulate a ``QPushButton``.
     """
     def __init__(self, *args):
+        """
+        Constructor
+        """
         QtGui.QPushButton.__init__(self, *args)
         self.setCheckable(True)
 
@@ -51,7 +57,13 @@
 
 
 class Ui_ShortcutListDialog(object):
+    """
+    The UI widgets for the shortcut dialog.
+    """
     def setupUi(self, shortcutListDialog):
+        """
+        Set up the UI
+        """
         shortcutListDialog.setObjectName(u'shortcutListDialog')
         shortcutListDialog.resize(500, 438)
         self.shortcutListLayout = QtGui.QVBoxLayout(shortcutListDialog)
@@ -113,6 +125,9 @@
         self.retranslateUi(shortcutListDialog)
 
     def retranslateUi(self, shortcutListDialog):
+        """
+        Translate the UI on the fly
+        """
         shortcutListDialog.setWindowTitle(translate('OpenLP.ShortcutListDialog', 'Configure Shortcuts'))
         self.descriptionLabel.setText(
             translate('OpenLP.ShortcutListDialog', 'Select an action and click one of the buttons below to start '

=== modified file 'openlp/core/ui/shortcutlistform.py'
--- openlp/core/ui/shortcutlistform.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/shortcutlistform.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,8 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The :mod:`~openlp.core.ui.shortcutlistform` module contains the form class"""
 import logging
 import re
 
@@ -48,6 +49,9 @@
     """
 
     def __init__(self, parent=None):
+        """
+        Constructor
+        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
         self.changedActions = {}
@@ -72,6 +76,9 @@
             self.onCustomRadioButtonClicked)
 
     def keyPressEvent(self, event):
+        """
+        Respond to certain key presses
+        """
         if event.key() == QtCore.Qt.Key_Space:
             self.keyReleaseEvent(event)
         elif self.primaryPushButton.isChecked() or self.alternatePushButton.isChecked():
@@ -81,6 +88,9 @@
             self.close()
 
     def keyReleaseEvent(self, event):
+        """
+        Respond to certain key presses
+        """
         if not self.primaryPushButton.isChecked() and not self.alternatePushButton.isChecked():
             return
         key = event.key()
@@ -106,6 +116,9 @@
                     False, text=key_sequence.toString())
 
     def exec_(self):
+        """
+        Execute the dialog
+        """
         self.changedActions = {}
         self.reloadShortcutList()
         self._adjustButton(self.primaryPushButton, False, False, u'')
@@ -422,7 +435,7 @@
                 if action.shortcutContext() in [QtCore.Qt.WindowShortcut,
                     QtCore.Qt.ApplicationShortcut]:
                     is_valid = False
-                if changing_action.shortcutContext() in  [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]:
+                if changing_action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]:
                     is_valid = False
         if not is_valid:
             Receiver.send_message(u'openlp_warning_message', {

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2013-01-31 19:06:53 +0000
+++ openlp/core/ui/slidecontroller.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The :mod:`slidecontroller` module contains argubly the most important part of OpenLP - the slide controller
+"""
 import os
 import logging
 import copy
@@ -278,7 +280,7 @@
             self.audioMenu.addAction(self.nextTrackItem)
             self.trackMenu = self.audioMenu.addMenu(translate('OpenLP.SlideController', 'Tracks'))
             self.audioTimeLabel = QtGui.QLabel(u' 00:00 ', self.toolbar)
-            self.audioTimeLabel.setAlignment(QtCore.Qt.AlignCenter|QtCore.Qt.AlignHCenter)
+            self.audioTimeLabel.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignHCenter)
             self.audioTimeLabel.setStyleSheet(
                 u'background-color: palette(background); '
                 u'border-top-color: palette(shadow); '
@@ -309,7 +311,7 @@
         self.slideLayout.setObjectName(u'SlideLayout')
         self.previewDisplay = Display(self, self.isLive, self)
         self.previewDisplay.setGeometry(QtCore.QRect(0, 0, 300, 300))
-        self.previewDisplay.screen = {u'size':self.previewDisplay.geometry()}
+        self.previewDisplay.screen = {u'size': self.previewDisplay.geometry()}
         self.previewDisplay.setup()
         self.slideLayout.insertWidget(0, self.previewDisplay)
         self.previewDisplay.hide()
@@ -454,6 +456,9 @@
             self.current_shortcut = u''
 
     def setLiveHotkeys(self, parent=None):
+        """
+        Set the live hotkeys
+        """
         self.previousService = create_action(parent, u'previousService',
             text=translate('OpenLP.SlideController', 'Previous Service'),
             shortcuts=[QtCore.Qt.Key_Left], context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
@@ -464,10 +469,13 @@
             triggers=self.serviceNext)
         self.escapeItem = create_action(parent, 'escapeItem',
             text=translate('OpenLP.SlideController', 'Escape Item'),
-            shortcuts=[QtCore.Qt.Key_Escape],context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
+            shortcuts=[QtCore.Qt.Key_Escape], context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
             triggers=self.liveEscape)
 
     def liveEscape(self):
+        """
+        If you press ESC on the live screen it should close the display temporarily.
+        """
         self.display.setVisible(False)
         self.media_controller.media_stop(self)
 
@@ -542,11 +550,14 @@
         serviceItem = ServiceItem()
         self.previewDisplay.webView.setHtml(build_html(serviceItem, self.previewDisplay.screen, None, self.isLive,
             plugins=self.plugin_manager.plugins))
-        self.media_controller.setup_display(self.previewDisplay,True)
+        self.media_controller.setup_display(self.previewDisplay, True)
         if self.serviceItem:
             self.refreshServiceItem()
 
     def __addActionsToWidget(self, widget):
+        """
+        Add actions to the widget specified by `widget`
+        """
         widget.addActions([
             self.previousItem, self.nextItem,
             self.previousService, self.nextService,
@@ -599,6 +610,9 @@
                 self.toolbar.setWidgetVisible(self.hideMenuList)
                 
     def onSongBarHandler(self):
+        """
+        Some song handler
+        """
         request = self.sender().text()
         slide_no = self.slideList[request]
         self.__updatePreviewSelection(slide_no)
@@ -725,7 +739,7 @@
                 self.playSlidesLoop.setChecked(item.auto_play_slides_loop)
                 self.delaySpinBox.setValue(int(item.timed_slide_interval))
                 self.onPlaySlidesLoop()
-            elif self.isLive and  item.auto_play_slides_once and item.timed_slide_interval > 0:
+            elif self.isLive and item.auto_play_slides_once and item.timed_slide_interval > 0:
                 self.playSlidesOnce.setChecked(item.auto_play_slides_once)
                 self.delaySpinBox.setValue(int(item.timed_slide_interval))
                 self.onPlaySlidesOnce()
@@ -805,9 +819,9 @@
                 else:
                     # If current slide set background to image
                     if framenumber == slideno:
-                        self.serviceItem.bg_image_bytes = self.image_manager.getImageBytes(frame[u'path'],
+                        self.serviceItem.bg_image_bytes = self.image_manager.get_image_bytes(frame[u'path'],
                             ImageSource.ImagePlugin)
-                    image = self.image_manager.getImage(frame[u'path'], ImageSource.ImagePlugin)
+                    image = self.image_manager.get_image(frame[u'path'], ImageSource.ImagePlugin)
                     label.setPixmap(QtGui.QPixmap.fromImage(image))
                 self.previewListWidget.setCellWidget(framenumber, 0, label)
                 slideHeight = width * (1 / self.ratio)
@@ -1123,6 +1137,9 @@
             self.slideSelected()
 
     def __checkUpdateSelectedSlide(self, row):
+        """
+        Check if this slide has been updated
+        """
         if row + 1 < self.previewListWidget.rowCount():
             self.previewListWidget.scrollToItem(self.previewListWidget.item(row + 1, 0))
         self.previewListWidget.selectRow(row)
@@ -1195,9 +1212,15 @@
         self.onToggleLoop()
 
     def setAudioItemsVisibility(self, visible):
+        """
+        Set the visibility of the audio stuff
+        """
         self.toolbar.setWidgetVisible(self.audioList, visible)
 
     def onAudioPauseClicked(self, checked):
+        """
+        Pause the audio player
+        """
         if not self.audioPauseItem.isVisible():
             return
         if checked:
@@ -1303,15 +1326,24 @@
             return None
 
     def onNextTrackClicked(self):
+        """
+        Go to the next track when next is clicked
+        """
         self.display.audioPlayer.next()
 
     def onAudioTimeRemaining(self, time):
+        """
+        Update how much time is remaining
+        """
         seconds = self.display.audioPlayer.mediaObject.remainingTime() // 1000
         minutes = seconds // 60
         seconds %= 60
         self.audioTimeLabel.setText(u' %02d:%02d ' % (minutes, seconds))
 
     def onTrackTriggered(self):
+        """
+        Start playing a track
+        """
         action = self.sender()
         self.display.audioPlayer.goTo(action.data())
 
@@ -1363,4 +1395,4 @@
             self._live_controller = Registry().get(u'live_controller')
         return self._live_controller
 
-    live_controller = property(_get_live_controller)
\ No newline at end of file
+    live_controller = property(_get_live_controller)

=== modified file 'openlp/core/ui/splashscreen.py'
--- openlp/core/ui/splashscreen.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/splashscreen.py	2013-02-03 14:47:18 +0000
@@ -26,17 +26,30 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
+"""
+The splash screen
+"""
 from openlp.core.lib import Receiver
 
 from PyQt4 import QtCore, QtGui
 
+
 class SplashScreen(QtGui.QSplashScreen):
+    """
+    The splash screen
+    """
     def __init__(self):
+        """
+        Constructor
+        """
         QtGui.QSplashScreen.__init__(self)
         self.setupUi()
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'close_splash'), self.close)
 
     def setupUi(self):
+        """
+        Set up the UI
+        """
         self.setObjectName(u'splashScreen')
         self.setContextMenuPolicy(QtCore.Qt.PreventContextMenu)
         splash_image = QtGui.QPixmap(u':/graphics/openlp-splash-screen.png')

=== modified file 'openlp/core/ui/starttimedialog.py'
--- openlp/core/ui/starttimedialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/starttimedialog.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The UI widgets for the time dialog
+"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, UiStrings
@@ -34,7 +36,13 @@
 
 
 class Ui_StartTimeDialog(object):
+    """
+    The UI widgets for the time dialog
+    """
     def setupUi(self, StartTimeDialog):
+        """
+        Set up the UI
+        """
         StartTimeDialog.setObjectName(u'StartTimeDialog')
         StartTimeDialog.resize(350, 10)
         self.dialogLayout = QtGui.QGridLayout(StartTimeDialog)
@@ -108,6 +116,9 @@
         self.setMaximumHeight(self.sizeHint().height())
 
     def retranslateUi(self, StartTimeDialog):
+        """
+        Update the translations on the fly
+        """
         self.setWindowTitle(translate('OpenLP.StartTimeForm', 'Item Start and Finish Time'))
         self.hourSpinBox.setSuffix(UiStrings().Hours)
         self.minuteSpinBox.setSuffix(UiStrings().Minutes)

=== modified file 'openlp/core/ui/starttimeform.py'
--- openlp/core/ui/starttimeform.py	2013-01-27 07:36:04 +0000
+++ openlp/core/ui/starttimeform.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The actual start time form.
+"""
 from PyQt4 import QtGui
 
 from starttimedialog import Ui_StartTimeDialog
@@ -34,11 +36,15 @@
 from openlp.core.lib import translate, UiStrings, Registry
 from openlp.core.lib.ui import critical_error_message_box
 
+
 class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog):
     """
-    The exception dialog
+    The start time dialog
     """
     def __init__(self):
+        """
+        Constructor
+        """
         QtGui.QDialog.__init__(self, self.main_window)
         self.setupUi(self)
 
@@ -60,6 +66,9 @@
         return QtGui.QDialog.exec_(self)
 
     def accept(self):
+        """
+        When the dialog succeeds, this is run
+        """
         start = self.hourSpinBox.value() * 3600 + \
             self.minuteSpinBox.value() * 60 + \
             self.secondSpinBox.value()
@@ -79,6 +88,9 @@
         return QtGui.QDialog.accept(self)
 
     def _time_split(self, seconds):
+        """
+        Split time up into hours minutes and seconds from secongs
+        """
         hours = seconds / 3600
         seconds -= 3600 * hours
         minutes = seconds / 60

=== modified file 'openlp/core/ui/themeform.py'
--- openlp/core/ui/themeform.py	2013-02-02 07:34:42 +0000
+++ openlp/core/ui/themeform.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The Theme wizard
+"""
 import logging
 import os
 
@@ -41,6 +43,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
     """
     This is the Theme Import Wizard, which allows easy creation and editing of
@@ -71,14 +74,14 @@
             self.onGradientStartButtonClicked)
         QtCore.QObject.connect(self.gradientEndButton, QtCore.SIGNAL(u'clicked()'), self.onGradientEndButtonClicked)
         QtCore.QObject.connect(self.imageBrowseButton, QtCore.SIGNAL(u'clicked()'), self.onImageBrowseButtonClicked)
-        QtCore.QObject.connect(self.mainColorButton,  QtCore.SIGNAL(u'clicked()'), self.onMainColorButtonClicked)
+        QtCore.QObject.connect(self.mainColorButton, QtCore.SIGNAL(u'clicked()'), self.onMainColorButtonClicked)
         QtCore.QObject.connect(self.outlineColorButton, QtCore.SIGNAL(u'clicked()'), self.onOutlineColorButtonClicked)
         QtCore.QObject.connect(self.shadowColorButton, QtCore.SIGNAL(u'clicked()'), self.onShadowColorButtonClicked)
         QtCore.QObject.connect(self.outlineCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
             self.onOutlineCheckCheckBoxStateChanged)
         QtCore.QObject.connect(self.shadowCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
             self.onShadowCheckCheckBoxStateChanged)
-        QtCore.QObject.connect(self.footerColorButton,QtCore.SIGNAL(u'clicked()'), self.onFooterColorButtonClicked)
+        QtCore.QObject.connect(self.footerColorButton, QtCore.SIGNAL(u'clicked()'), self.onFooterColorButtonClicked)
         QtCore.QObject.connect(self, QtCore.SIGNAL(u'customButtonClicked(int)'), self.onCustom1ButtonClicked)
         QtCore.QObject.connect(self.mainPositionCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
             self.onMainPositionCheckBoxStateChanged)
@@ -177,6 +180,9 @@
                 pixmapHeight + 2 * frameWidth)
 
     def validateCurrentPage(self):
+        """
+        Validate the current page
+        """
         background_image = BackgroundType.to_string(BackgroundType.Image)
         if self.page(self.currentId()) == self.backgroundPage and \
                 self.theme.background_type == background_image and not self.imageFileEdit.text():
@@ -443,18 +449,30 @@
         self.setBackgroundPageValues()
 
     def onMainColorButtonClicked(self):
+        """
+        Set the main colour value
+        """
         self.theme.font_main_color = self._colorButton(self.theme.font_main_color)
         self.setMainAreaPageValues()
 
     def onOutlineColorButtonClicked(self):
+        """
+        Set the outline colour value
+        """
         self.theme.font_main_outline_color = self._colorButton(self.theme.font_main_outline_color)
         self.setMainAreaPageValues()
 
     def onShadowColorButtonClicked(self):
+        """
+        Set the shadow colour value
+        """
         self.theme.font_main_shadow_color = self._colorButton(self.theme.font_main_shadow_color)
         self.setMainAreaPageValues()
 
     def onFooterColorButtonClicked(self):
+        """
+        Set the footer colour value
+        """
         self.theme.font_footer_color = self._colorButton(self.theme.font_footer_color)
         self.setFooterAreaPageValues()
 

=== modified file 'openlp/core/ui/themelayoutdialog.py'
--- openlp/core/ui/themelayoutdialog.py	2013-01-27 20:36:18 +0000
+++ openlp/core/ui/themelayoutdialog.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The layout of the theme
+"""
 from PyQt4 import QtGui
 
 from openlp.core.lib import translate
@@ -34,7 +36,13 @@
 
 
 class Ui_ThemeLayoutDialog(object):
+    """
+    The layout of the theme
+    """
     def setupUi(self, themeLayoutDialog):
+        """
+        Set up the UI
+        """
         themeLayoutDialog.setObjectName(u'themeLayoutDialogDialog')
         #themeLayoutDialog.resize(300, 200)
         self.previewLayout = QtGui.QVBoxLayout(themeLayoutDialog)
@@ -63,7 +71,9 @@
         self.retranslateUi(themeLayoutDialog)
 
     def retranslateUi(self, themeLayoutDialog):
+        """
+        Translate the UI on the fly
+        """
         themeLayoutDialog.setWindowTitle(translate('OpenLP.StartTimeForm', 'Theme Layout'))
         self.mainColourLabel.setText(translate('OpenLP.StartTimeForm', 'The blue box shows the main area.'))
         self.footerColourLabel.setText(translate('OpenLP.StartTimeForm', 'The red box shows the footer.'))
-

=== modified file 'openlp/core/ui/themelayoutform.py'
--- openlp/core/ui/themelayoutform.py	2012-12-29 20:56:56 +0000
+++ openlp/core/ui/themelayoutform.py	2013-02-03 14:47:18 +0000
@@ -26,16 +26,22 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The form layout
+"""
 from PyQt4 import QtGui, QtCore
 
 from themelayoutdialog import Ui_ThemeLayoutDialog
 
+
 class ThemeLayoutForm(QtGui.QDialog, Ui_ThemeLayoutDialog):
     """
     The exception dialog
     """
     def __init__(self, parent):
+        """
+        Constructor
+        """
         QtGui.QDialog.__init__(self, parent)
         self.setupUi(self)
 
@@ -44,11 +50,7 @@
         Run the Dialog with correct heading.
         """
         pixmap = image.scaledToHeight(400, QtCore.Qt.SmoothTransformation)
-        self.themeDisplayLabel.setPixmap(image)
+        self.themeDisplayLabel.setPixmap(pixmap)
         displayAspectRatio = float(image.width()) / image.height()
-        self.themeDisplayLabel.setFixedSize(400, 400 / displayAspectRatio )
+        self.themeDisplayLabel.setFixedSize(400, 400 / displayAspectRatio)
         return QtGui.QDialog.exec_(self)
-
-    def accept(self):
-        return QtGui.QDialog.accept(self)
-

=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py	2013-02-01 21:48:06 +0000
+++ openlp/core/ui/thememanager.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The Theme Manager manages adding, deleteing and modifying of themes.
+"""
 import os
 import zipfile
 import shutil
@@ -47,11 +49,15 @@
 
 log = logging.getLogger(__name__)
 
+
 class ThemeManager(QtGui.QWidget):
     """
     Manages the orders of Theme.
     """
     def __init__(self, parent=None):
+        """
+        Constructor
+        """
         QtGui.QWidget.__init__(self, parent)
         Registry().register(u'theme_manager', self)
         self.settingsSection = u'themes'
@@ -149,10 +155,10 @@
         """
         Receiver.send_message(u'cursor_busy')
         files = SettingsManager.get_files(self.settingsSection, u'.otz')
-        for file_name in files:
-            file_name = os.path.join(self.path, file_name)
-            self.unzip_theme(file_name, self.path)
-            delete_file(file)
+        for theme_file in files:
+            theme_file = os.path.join(self.path, theme_file)
+            self.unzipTheme(theme_file, self.path)
+            delete_file(theme_file)
         Receiver.send_message(u'cursor_normal')
 
     def config_updated(self):
@@ -197,7 +203,7 @@
         tab
         """
         log.debug(u'change_global_from_tab %s', theme_name)
-        for count in range (0, self.theme_list_widget.count()):
+        for count in range(0, self.theme_list_widget.count()):
             # reset the old name
             item = self.theme_list_widget.item(count)
             old_name = item.text()
@@ -218,7 +224,7 @@
         """
         log.debug(u'changeGlobalFromScreen %s', index)
         selected_row = self.theme_list_widget.currentRow()
-        for count in range (0, self.theme_list_widget.count()):
+        for count in range(0, self.theme_list_widget.count()):
             item = self.theme_list_widget.item(count)
             old_name = item.text()
             # reset the old name
@@ -365,24 +371,26 @@
         if path:
             Settings().setValue(self.settingsSection + u'/last directory export', path)
             theme_path = os.path.join(path, theme + u'.otz')
-            # FIXME: Do not overwrite build-in.
-            zip_file = None
+            theme_zip = None
             try:
-                zip_file = zipfile.ZipFile(theme_path, u'w')
+                theme_zip = zipfile.ZipFile(theme_path, u'w')
                 source = os.path.join(self.path, theme)
                 for files in os.walk(source):
                     for name in files[2]:
-                        zip_file.write(os.path.join(source, name).encode(u'utf-8'),
-                            os.path.join(theme, name).encode(u'utf-8'))
-                QtGui.QMessageBox.information(self, translate('OpenLP.ThemeManager', 'Theme Exported'),
+                        theme_zip.write(
+                            os.path.join(source, name).encode(u'utf-8'),
+                            os.path.join(theme, name).encode(u'utf-8')
+                        )
+                QtGui.QMessageBox.information(self,
+                    translate('OpenLP.ThemeManager', 'Theme Exported'),
                     translate('OpenLP.ThemeManager', 'Your theme has been successfully exported.'))
             except (IOError, OSError):
                 log.exception(u'Export Theme Failed')
                 critical_error_message_box(translate('OpenLP.ThemeManager', 'Theme Export Failed'),
                     translate('OpenLP.ThemeManager', 'Your theme could not be exported due to an error.'))
             finally:
-                if zip_file:
-                    zip_file.close()
+                if theme_zip:
+                    theme_zip.close()
         Receiver.send_message(u'cursor_normal')
 
     def on_import_theme(self):
@@ -480,7 +488,7 @@
 
     def over_write_message_box(self, theme_name):
         """
-        Check before overwriting the theme
+        Display a warning box to the user that a theme already exists
         """
         ret = QtGui.QMessageBox.question(self, translate('OpenLP.ThemeManager', 'Theme Already Exists'),
             translate('OpenLP.ThemeManager',
@@ -489,7 +497,7 @@
             QtGui.QMessageBox.No)
         return ret == QtGui.QMessageBox.Yes
 
-    def unzip_theme(self, file_name, dir):
+    def unzip_theme(self, file_name, directory):
         """
         Unzip the theme, remove the preview file if stored
         Generate a new preview file. Check the XML theme version and upgrade if
@@ -497,32 +505,31 @@
         """
         log.debug(u'Unzipping theme %s', file_name)
         file_name = unicode(file_name)
-        zip_file = None
+        theme_zip = None
         out_file = None
         file_xml = None
         abort_import = True
         try:
-            zip_file = zipfile.ZipFile(file_name)
-            xml_file = filter(lambda name:
-                os.path.splitext(name)[1].lower() == u'.xml', zip_file.namelist())
+            theme_zip = zipfile.ZipFile(file_name)
+            xml_file = filter(lambda name: os.path.splitext(name)[1].lower() == u'.xml', theme_zip.namelist())
             if len(xml_file) != 1:
                 log.exception(u'Theme contains "%s" XML files' % len(xml_file))
                 raise Exception('validation')
-            xml_tree = ElementTree(element=XML(zip_file.read(xml_file[0]))).getroot()
+            xml_tree = ElementTree(element=XML(theme_zip.read(xml_file[0]))).getroot()
             v1_background = xml_tree.find(u'BackgroundType')
             if v1_background is not None:
                 theme_name, file_xml, out_file, abort_import = self.unzip_version_122(
-                    dir, zip_file, xml_file[0], xml_tree, v1_background, out_file)
+                    directory, theme_zip, xml_file[0], xml_tree, v1_background, out_file)
             else:
                 theme_name = xml_tree.find(u'name').text.strip()
-                theme_folder = os.path.join(dir, theme_name)
+                theme_folder = os.path.join(directory, theme_name)
                 theme_exists = os.path.exists(theme_folder)
                 if theme_exists and not self.over_write_message_box(theme_name):
                     abort_import = True
                     return
                 else:
                     abort_import = False
-                for name in zip_file.namelist():
+                for name in theme_zip.namelist():
                     try:
                         uname = unicode(name, u'utf-8')
                     except UnicodeDecodeError:
@@ -534,15 +541,15 @@
                     if split_name[-1] == u'' or len(split_name) == 1:
                         # is directory or preview file
                         continue
-                    full_name = os.path.join(dir, uname)
+                    full_name = os.path.join(directory, uname)
                     check_directory_exists(os.path.dirname(full_name))
                     if os.path.splitext(uname)[1].lower() == u'.xml':
-                        file_xml = unicode(zip_file.read(name), u'utf-8')
+                        file_xml = unicode(theme_zip.read(name), u'utf-8')
                         out_file = open(full_name, u'w')
                         out_file.write(file_xml.encode(u'utf-8'))
                     else:
                         out_file = open(full_name, u'wb')
-                        out_file.write(zip_file.read(name))
+                        out_file.write(theme_zip.read(name))
                     out_file.close()
         except (IOError, zipfile.BadZipfile):
             log.exception(u'Importing theme from zip failed %s' % file_name)
@@ -555,18 +562,18 @@
                 raise
         finally:
             # Close the files, to be able to continue creating the theme.
-            if zip_file:
-                zip_file.close()
+            if theme_zip:
+                theme_zip.close()
             if out_file:
                 out_file.close()
             if not abort_import:
                 # As all files are closed, we can create the Theme.
                 if file_xml:
                     theme = self._create_theme_fom_Xml(file_xml, self.path)
-                    self.generate_and_save_image(dir, theme_name, theme)
+                    self.generate_and_save_image(directory, theme_name, theme)
                 # Only show the error message, when IOError was not raised (in
                 # this case the error message has already been shown).
-                elif zip is not None:
+                elif theme_zip is not None:
                     critical_error_message_box(
                         translate('OpenLP.ThemeManager', 'Validation Error'),
                         translate('OpenLP.ThemeManager', 'File is not a valid theme.'))
@@ -626,9 +633,9 @@
         """
         self._write_theme(theme, image_from, image_to)
         if theme.background_type == BackgroundType.to_string(BackgroundType.Image):
-            self.image_manager.updateImageBorder(theme.background_filename,
+            self.image_manager.update_image_border(theme.background_filename,
                 ImageSource.Theme, QtGui.QColor(theme.background_border_color))
-            self.image_manager.processUpdates()
+            self.image_manager.process_updates()
 
     def _write_theme(self, theme, image_from, image_to):
         """
@@ -660,11 +667,11 @@
                 log.exception(u'Failed to save theme image')
         self.generate_and_save_image(self.path, name, theme)
 
-    def generate_and_save_image(self, dir, name, theme):
-        """
-        Generate and Save the theme image.
-        """
-        log.debug(u'generate_and_save_image %s %s', dir, name)
+    def generate_and_save_image(self, directory, name, theme):
+        """
+        Generate and save a preview image
+        """
+        log.debug(u'generate_and_save_image %s %s', directory, name)
         frame = self.generate_image(theme)
         sample_path_name = os.path.join(self.path, name + u'.png')
         if os.path.exists(sample_path_name):

=== modified file 'openlp/core/ui/themestab.py'
--- openlp/core/ui/themestab.py	2013-02-02 07:08:28 +0000
+++ openlp/core/ui/themestab.py	2013-02-03 14:47:18 +0000
@@ -26,7 +26,9 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The Themes configuration tab
+"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import Receiver, Settings, SettingsTab, translate, UiStrings
@@ -39,11 +41,17 @@
     ThemesTab is the theme settings tab in the settings dialog.
     """
     def __init__(self, parent):
+        """
+        Constructor
+        """
         generalTranslated = translate('OpenLP.ThemesTab', 'Themes')
         SettingsTab.__init__(self, parent, u'Themes', generalTranslated)
         self.iconPath = u':/themes/theme_new.png'
 
     def setupUi(self):
+        """
+        Set up the UI
+        """
         self.setObjectName(u'ThemesTab')
         SettingsTab.setupUi(self)
         self.GlobalGroupBox = QtGui.QGroupBox(self.leftColumn)
@@ -99,6 +107,9 @@
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList)
 
     def retranslateUi(self):
+        """
+        Translate the UI on the fly
+        """
         self.tabTitleVisible = UiStrings().Themes
         self.GlobalGroupBox.setTitle(translate('OpenLP.ThemesTab', 'Global Theme'))
         self.LevelGroupBox.setTitle(translate('OpenLP.ThemesTab', 'Theme Level'))
@@ -116,6 +127,9 @@
             'any themes associated with either the service or the songs.'))
 
     def load(self):
+        """
+        Load the theme settings into the tab
+        """
         settings = Settings()
         settings.beginGroup(self.settingsSection)
         self.theme_level = settings.value(u'theme level')
@@ -129,6 +143,9 @@
             self.SongLevelRadioButton.setChecked(True)
 
     def save(self):
+        """
+        Save the settings
+        """
         settings = Settings()
         settings.beginGroup(self.settingsSection)
         settings.setValue(u'theme level', self.theme_level)
@@ -139,18 +156,33 @@
         Receiver.send_message(u'theme_update_global', self.global_theme)
 
     def postSetUp(self):
+        """
+        After setting things up...
+        """
         Receiver.send_message(u'theme_update_global', self.global_theme)
 
     def onSongLevelButtonClicked(self):
+        """
+        Set the theme level
+        """
         self.theme_level = ThemeLevel.Song
 
     def onServiceLevelButtonClicked(self):
+        """
+        Set the theme level
+        """
         self.theme_level = ThemeLevel.Service
 
     def onGlobalLevelButtonClicked(self):
+        """
+        Set the theme level
+        """
         self.theme_level = ThemeLevel.Global
 
     def onDefaultComboBoxChanged(self, value):
+        """
+        Set the global default theme
+        """
         self.global_theme = self.DefaultComboBox.currentText()
         self.renderer.set_global_theme(self.global_theme)
         self.__previewGlobalTheme()

=== modified file 'openlp/core/ui/themewizard.py'
--- openlp/core/ui/themewizard.py	2013-01-11 00:19:11 +0000
+++ openlp/core/ui/themewizard.py	2013-02-03 14:47:18 +0000
@@ -26,15 +26,24 @@
 # with this program; if not, write to the Free Software Foundation, Inc., 59  #
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
-
+"""
+The Create/Edit theme wizard
+"""
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import translate, build_icon, UiStrings
 from openlp.core.lib.theme import HorizontalType, BackgroundType, BackgroundGradientType
 from openlp.core.lib.ui import add_welcome_page, create_valign_selection_widgets
 
+
 class Ui_ThemeWizard(object):
+    """
+    The Create/Edit theme wizard
+    """
     def setupUi(self, themeWizard):
+        """
+        Set up the UI
+        """
         themeWizard.setObjectName(u'OpenLP.ThemeWizard')
         themeWizard.setModal(True)
         themeWizard.setWizardStyle(QtGui.QWizard.ModernStyle)
@@ -372,7 +381,7 @@
             QtCore.SLOT(u'setDisabled(bool)'))
         QtCore.QObject.connect(self.mainPositionCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.mainHeightSpinBox,
             QtCore.SLOT(u'setDisabled(bool)'))
-        QtCore.QObject.connect(self.footerPositionCheckBox,QtCore.SIGNAL(u'toggled(bool)'), self.footerXSpinBox,
+        QtCore.QObject.connect(self.footerPositionCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.footerXSpinBox,
             QtCore.SLOT(u'setDisabled(bool)'))
         QtCore.QObject.connect(self.footerPositionCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.footerYSpinBox,
             QtCore.SLOT(u'setDisabled(bool)'))
@@ -382,8 +391,11 @@
             QtCore.SLOT(u'setDisabled(bool)'))
 
     def retranslateUi(self, themeWizard):
+        """
+        Translate the UI on the fly
+        """
         themeWizard.setWindowTitle(translate('OpenLP.ThemeWizard', 'Theme Wizard'))
-        self.titleLabel.setText(u'<span style="font-size:14pt; font-weight:600;">%s</span>' % \
+        self.titleLabel.setText(u'<span style="font-size:14pt; font-weight:600;">%s</span>' %
             translate('OpenLP.ThemeWizard', 'Welcome to the Theme Wizard'))
         self.informationLabel.setText(
             translate('OpenLP.ThemeWizard', 'This wizard will help you to '

=== modified file 'openlp/core/ui/wizard.py'
--- openlp/core/ui/wizard.py	2013-01-18 21:06:09 +0000
+++ openlp/core/ui/wizard.py	2013-02-03 14:47:18 +0000
@@ -39,6 +39,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class WizardStrings(object):
     """
     Provide standard strings for wizards to use.
@@ -80,6 +81,9 @@
     and feel.
     """
     def __init__(self, parent, plugin, name, image):
+        """
+        Constructor
+        """
         QtGui.QWizard.__init__(self, parent)
         self.plugin = plugin
         self.setObjectName(name)

=== modified file 'openlp/core/utils/__init__.py'
--- openlp/core/utils/__init__.py	2013-01-23 21:01:45 +0000
+++ openlp/core/utils/__init__.py	2013-02-03 14:47:18 +0000
@@ -29,7 +29,7 @@
 """
 The :mod:`openlp.core.utils` module provides the utility libraries for OpenLP.
 """
-from datetime import datetime, timedelta
+from datetime import datetime
 from distutils.version import LooseVersion
 import logging
 import locale
@@ -61,14 +61,12 @@
 CONTROL_CHARS = re.compile(r'[\x00-\x1F\x7F-\x9F]', re.UNICODE)
 INVALID_FILE_CHARS = re.compile(r'[\\/:\*\?"<>\|\+\[\]%]', re.UNICODE)
 
+
 class VersionThread(QtCore.QThread):
     """
     A special Qt thread class to fetch the version of OpenLP from the website.
     This is threaded so that it doesn't affect the loading time of OpenLP.
     """
-    def __init__(self, parent):
-        QtCore.QThread.__init__(self, parent)
-
     def run(self):
         """
         Run the thread.
@@ -157,7 +155,8 @@
         return os.path.join(unicode(os.getenv(u'APPDATA'), encoding), u'openlp')
     elif sys.platform == u'darwin':
         if dir_type == AppLocation.DataDir:
-            return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'Library', u'Application Support', u'openlp', u'Data')
+            return os.path.join(unicode(os.getenv(u'HOME'), encoding),
+                                u'Library', u'Application Support', u'openlp', u'Data')
         elif dir_type == AppLocation.LanguageDir:
             return os.path.split(openlp.__file__)[0]
         return os.path.join(unicode(os.getenv(u'HOME'), encoding), u'Library', u'Application Support', u'openlp')
@@ -472,6 +471,9 @@
         The time to be used to add to the string.  This is a time object
     """
     def match_formatting(match):
+        """
+        Format the match
+        """
         return local_time.strftime(match.group())
     return re.sub('\%[a-zA-Z]', match_formatting, text)
 
@@ -488,17 +490,14 @@
     return locale.strcoll(string1.lower(), string2.lower())
 
 
-# For performance reasons provide direct reference to compare function
-# without wrapping it in another function making te string lowercase.
-# This is needed for sorting songs.
+# For performance reasons provide direct reference to compare function without wrapping it in another function making
+# the string lowercase. This is needed for sorting songs.
 locale_direct_compare = locale.strcoll
 
 
 from languagemanager import LanguageManager
 from actions import ActionList
 
-__all__ = [u'AppLocation', u'get_application_version', u'check_latest_version',
-    u'add_actions', u'get_filesystem_encoding', u'LanguageManager',
-    u'ActionList', u'get_web_page', u'get_uno_command', u'get_uno_instance',
-    u'delete_file', u'clean_filename', u'format_time', u'locale_compare',
-    u'locale_direct_compare']
+__all__ = [u'AppLocation', u'ActionList', u'LanguageManager', u'get_application_version', u'check_latest_version',
+    u'add_actions', u'get_filesystem_encoding', u'get_web_page', u'get_uno_command', u'get_uno_instance',
+    u'delete_file', u'clean_filename', u'format_time', u'locale_compare', u'locale_direct_compare']

=== modified file 'openlp/core/utils/actions.py'
--- openlp/core/utils/actions.py	2013-01-10 23:07:48 +0000
+++ openlp/core/utils/actions.py	2013-02-03 14:47:18 +0000
@@ -41,6 +41,9 @@
     category for the :class:`~openlp.core.utils.CategoryList` class.
     """
     def __init__(self, name, weight=0):
+        """
+        Constructor
+        """
         self.name = name
         self.weight = weight
         self.actions = CategoryActionList()
@@ -52,22 +55,37 @@
     list of actions within a category.
     """
     def __init__(self):
+        """
+        Constructor
+        """
         self.index = 0
         self.actions = []
 
     def __getitem__(self, key):
+        """
+        Implement the __getitem__() method to make this class a dictionary type
+        """
         for weight, action in self.actions:
             if action.text() == key:
                 return action
         raise KeyError(u'Action "%s" does not exist.' % key)
 
     def __contains__(self, item):
+        """
+        Implement the __contains__() method to make this class a dictionary type
+        """
         return self.has_key(item)
 
     def __len__(self):
+        """
+        Implement the __len__() method to make this class a dictionary type
+        """
         return len(self.actions)
 
     def __iter__(self):
+        """
+        Implement the __getitem__() method to make this class iterable
+        """
         return self
 
     def __next__(self):
@@ -88,22 +106,34 @@
         return self.__next__()
 
     def has_key(self, key):
+        """
+        Implement the has_key() method to make this class a dictionary type
+        """
         for weight, action in self.actions:
             if action.text() == key:
                 return True
         return False
 
     def append(self, name):
+        """
+        Append an action
+        """
         weight = 0
         if self.actions:
             weight = self.actions[-1][0] + 1
         self.add(name, weight)
 
     def add(self, action, weight=0):
+        """
+        Add an action.
+        """
         self.actions.append((weight, action))
         self.actions.sort(key=lambda act: act[0])
 
     def remove(self, remove_action):
+        """
+        Remove an action
+        """
         for action in self.actions:
             if action[1] == remove_action:
                 self.actions.remove(action)
@@ -118,22 +148,37 @@
     """
 
     def __init__(self):
+        """
+        Constructor
+        """
         self.index = 0
         self.categories = []
 
     def __getitem__(self, key):
+        """
+        Implement the __getitem__() method to make this class like a dictionary
+        """
         for category in self.categories:
             if category.name == key:
                 return category
         raise KeyError(u'Category "%s" does not exist.' % key)
 
     def __contains__(self, item):
+        """
+        Implement the __contains__() method to make this class like a dictionary
+        """
         return self.has_key(item)
 
     def __len__(self):
+        """
+        Implement the __len__() method to make this class like a dictionary
+        """
         return len(self.categories)
 
     def __iter__(self):
+        """
+        Implement the __iter__() method to make this class like a dictionary
+        """
         return self
 
     def __next__(self):
@@ -154,12 +199,18 @@
         return self.__next__()
 
     def has_key(self, key):
+        """
+        Implement the has_key() method to make this class like a dictionary
+        """
         for category in self.categories:
             if category.name == key:
                 return True
         return False
 
     def append(self, name, actions=None):
+        """
+        Append a category
+        """
         weight = 0
         if self.categories:
             weight = self.categories[-1].weight + 1
@@ -169,6 +220,9 @@
             self.add(name, weight)
 
     def add(self, name, weight=0, actions=None):
+        """
+        Add a category
+        """
         category = ActionCategory(name, weight)
         if actions:
             for action in actions:
@@ -180,6 +234,9 @@
         self.categories.sort(key=lambda cat: cat.weight)
 
     def remove(self, name):
+        """
+        Remove a category
+        """
         for category in self.categories:
             if category.name == name:
                 self.categories.remove(category)
@@ -196,10 +253,16 @@
     shortcut_map = {}
 
     def __init__(self):
+        """
+        Constructor
+        """
         self.categories = CategoryList()
 
     @staticmethod
     def get_instance():
+        """
+        Get the instance of this class.
+        """
         if ActionList.instance is None:
             ActionList.instance = ActionList()
         return ActionList.instance

=== modified file 'openlp/core/utils/languagemanager.py'
--- openlp/core/utils/languagemanager.py	2013-01-10 23:07:48 +0000
+++ openlp/core/utils/languagemanager.py	2013-02-03 14:47:18 +0000
@@ -27,8 +27,7 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 """
-The :mod:`languagemanager` module provides all the translation settings and
-language file loading for OpenLP.
+The :mod:`languagemanager` module provides all the translation settings and language file loading for OpenLP.
 """
 import logging
 import re
@@ -41,6 +40,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class LanguageManager(object):
     """
     Helper for Language selection

=== modified file 'openlp/plugins/alerts/forms/alertform.py'
--- openlp/plugins/alerts/forms/alertform.py	2013-01-23 19:28:47 +0000
+++ openlp/plugins/alerts/forms/alertform.py	2013-02-03 14:47:18 +0000
@@ -34,6 +34,7 @@
 
 from alertdialog import Ui_AlertDialog
 
+
 class AlertForm(QtGui.QDialog, Ui_AlertDialog):
     """
     Provide UI for the alert system
@@ -45,7 +46,7 @@
         self.manager = plugin.manager
         self.plugin = plugin
         self.item_id = None
-        QtGui.QDialog.__init__(self, self.plugin.main_window)
+        super(AlertForm, self).__init__(self.plugin.main_window)
         self.setupUi(self)
         QtCore.QObject.connect(self.displayButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayClicked)
         QtCore.QObject.connect(self.displayCloseButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayCloseClicked)
@@ -57,6 +58,9 @@
         QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.onCurrentRowChanged)
 
     def exec_(self):
+        """
+        Execute the dialog and return the exit code.
+        """
         self.displayButton.setEnabled(False)
         self.displayCloseButton.setEnabled(False)
         self.alertTextEdit.setText(u'')
@@ -77,9 +81,15 @@
                 self.alertListWidget.setCurrentRow(self.alertListWidget.row(item_name))
 
     def onDisplayClicked(self):
+        """
+        Display the current alert text.
+        """
         self.triggerAlert(self.alertTextEdit.text())
 
     def onDisplayCloseClicked(self):
+        """
+        Close the alert preview.
+        """
         if self.triggerAlert(self.alertTextEdit.text()):
             self.close()
 
@@ -97,6 +107,9 @@
         self.alertTextEdit.setText(u'')
 
     def onNewClick(self):
+        """
+        Create a new alert.
+        """
         if not self.alertTextEdit.text():
             QtGui.QMessageBox.information(self,
                 translate('AlertsPlugin.AlertForm', 'New Alert'),

=== modified file 'openlp/plugins/bibles/bibleplugin.py'
--- openlp/plugins/bibles/bibleplugin.py	2013-01-23 21:05:25 +0000
+++ openlp/plugins/bibles/bibleplugin.py	2013-02-03 14:47:18 +0000
@@ -102,11 +102,11 @@
         #action_list.remove_action(self.exportBibleItem, UiStrings().Export)
         self.exportBibleItem.setVisible(False)
 
-    def appStartup(self):
+    def app_startup(self):
         """
         Perform tasks on application startup
         """
-        Plugin.appStartup(self)
+        Plugin.app_startup(self)
         if self.manager.old_bible_databases:
             if QtGui.QMessageBox.information(self.main_window,
                 translate('OpenLP', 'Information'),

=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py	2013-01-23 20:29:43 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2013-02-03 14:47:18 +0000
@@ -349,7 +349,7 @@
         self.loadBibles()
         # If called from first time wizard re-run, process any new bibles.
         if process:
-            self.plugin.appStartup()
+            self.plugin.app_startup()
         self.updateAutoCompleter()
 
     def initialiseAdvancedBible(self, bible, last_book_id=None):

=== modified file 'openlp/plugins/custom/forms/editcustomform.py'
--- openlp/plugins/custom/forms/editcustomform.py	2013-01-27 09:57:03 +0000
+++ openlp/plugins/custom/forms/editcustomform.py	2013-02-03 14:47:18 +0000
@@ -41,35 +41,42 @@
 
 log = logging.getLogger(__name__)
 
+
 class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog):
     """
     Class documentation goes here.
     """
     log.info(u'Custom Editor loaded')
+
     def __init__(self, mediaitem, parent, manager):
         """
         Constructor
         """
-        QtGui.QDialog.__init__(self, parent)
+        super(EditCustomForm, self).__init__(parent)
         self.manager = manager
         self.mediaitem = mediaitem
         self.setupUi(self)
         # Create other objects and forms.
         self.editSlideForm = EditCustomSlideForm(self)
         # Connecting signals and slots
-        QtCore.QObject.connect(self.previewButton, QtCore.SIGNAL(u'clicked()'), self.onPreviewButtonClicked)
-        QtCore.QObject.connect(self.addButton, QtCore.SIGNAL(u'clicked()'), self.onAddButtonClicked)
-        QtCore.QObject.connect(self.editButton, QtCore.SIGNAL(u'clicked()'), self.onEditButtonClicked)
-        QtCore.QObject.connect(self.editAllButton, QtCore.SIGNAL(u'clicked()'), self.onEditAllButtonClicked)
+        self.previewButton.clicked.connect(self.on_preview_button_clicked)
+        self.addButton.clicked.connect(self.on_add_button_clicked)
+        self.editButton.clicked.connect(self.on_edit_button_clicked)
+        self.editAllButton.clicked.connect(self.on_edit_all_button_clicked)
+        self.slideListView.currentRowChanged.connect(self.on_current_row_changed)
+        self.slideListView.doubleClicked.connect(self.on_edit_button_clicked)
         QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.loadThemes)
-        QtCore.QObject.connect(self.slideListView, QtCore.SIGNAL(u'currentRowChanged(int)'), self.onCurrentRowChanged)
-        QtCore.QObject.connect(self.slideListView, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'),
-            self.onEditButtonClicked)
-
-    def loadThemes(self, themelist):
+
+    def loadThemes(self, theme_list):
+        """
+        Load a list of themes into the themes combo box.
+
+        ``theme_list``
+            The list of themes to load.
+        """
         self.themeComboBox.clear()
         self.themeComboBox.addItem(u'')
-        self.themeComboBox.addItems(themelist)
+        self.themeComboBox.addItems(theme_list)
 
     def loadCustom(self, id, preview=False):
         """
@@ -103,6 +110,9 @@
         self.previewButton.setVisible(preview)
 
     def accept(self):
+        """
+        Override the QDialog method to check if the custom slide has been saved before closing the dialog.
+        """
         log.debug(u'accept')
         if self.saveCustom():
             QtGui.QDialog.accept(self)
@@ -125,6 +135,9 @@
         return success
 
     def onUpButtonClicked(self):
+        """
+        Move a slide up in the list when the "Up" button is clicked.
+        """
         selectedRow = self.slideListView.currentRow()
         if selectedRow != 0:
             qw = self.slideListView.takeItem(selectedRow)
@@ -132,6 +145,9 @@
             self.slideListView.setCurrentRow(selectedRow - 1)
 
     def onDownButtonClicked(self):
+        """
+        Move a slide down in the list when the "Down" button is clicked.
+        """
         selectedRow = self.slideListView.currentRow()
         # zero base arrays
         if selectedRow != self.slideListView.count() - 1:
@@ -139,17 +155,23 @@
             self.slideListView.insertItem(selectedRow + 1, qw)
             self.slideListView.setCurrentRow(selectedRow + 1)
 
-    def onAddButtonClicked(self):
+    def on_add_button_clicked(self):
+        """
+        Add a new blank slide.
+        """
         self.editSlideForm.setText(u'')
         if self.editSlideForm.exec_():
             self.slideListView.addItems(self.editSlideForm.getText())
 
-    def onEditButtonClicked(self):
+    def on_edit_button_clicked(self):
+        """
+        Edit the currently selected slide.
+        """
         self.editSlideForm.setText(self.slideListView.currentItem().text())
         if self.editSlideForm.exec_():
             self.updateSlideList(self.editSlideForm.getText())
 
-    def onEditAllButtonClicked(self):
+    def on_edit_all_button_clicked(self):
         """
         Edits all slides.
         """
@@ -163,7 +185,7 @@
         if self.editSlideForm.exec_():
             self.updateSlideList(self.editSlideForm.getText(), True)
 
-    def onPreviewButtonClicked(self):
+    def on_preview_button_clicked(self):
         """
         Save the custom item and preview it.
         """
@@ -203,9 +225,9 @@
         Removes the current row from the list.
         """
         self.slideListView.takeItem(self.slideListView.currentRow())
-        self.onCurrentRowChanged(self.slideListView.currentRow())
+        self.on_current_row_changed(self.slideListView.currentRow())
 
-    def onCurrentRowChanged(self, row):
+    def on_current_row_changed(self, row):
         """
         Called when the *slideListView*'s current row has been changed. This
         enables or disables buttons which require an slide to act on.

=== modified file 'openlp/plugins/custom/forms/editcustomslideform.py'
--- openlp/plugins/custom/forms/editcustomslideform.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/custom/forms/editcustomslideform.py	2013-02-03 14:47:18 +0000
@@ -1,3 +1,4 @@
+#lint:disable
 # -*- coding: utf-8 -*-
 # vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
 
@@ -35,16 +36,18 @@
 
 log = logging.getLogger(__name__)
 
+
 class EditCustomSlideForm(QtGui.QDialog, Ui_CustomSlideEditDialog):
     """
     Class documentation goes here.
     """
     log.info(u'Custom Verse Editor loaded')
+
     def __init__(self, parent=None):
         """
         Constructor
         """
-        QtGui.QDialog.__init__(self, parent)
+        super(EditCustomSlideForm, self).__init__(parent)
         self.setupUi(self)
         # Connecting signals and slots
         QtCore.QObject.connect(self.insertButton, QtCore.SIGNAL(u'clicked()'), self.onInsertButtonClicked)
@@ -88,9 +91,10 @@
         """
         full_text = self.slideTextEdit.toPlainText()
         position = self.slideTextEdit.textCursor().position()
-        if position and full_text[position-1] != u'\n':
-             text = u'\n' + text
-        if position ==  len(full_text) or full_text[position] != u'\n':
-             text += u'\n'
+        if position and full_text[position - 1] != u'\n':
+            text = u'\n' + text
+        if position == len(full_text) or full_text[position] != u'\n':
+            text += u'\n'
         self.slideTextEdit.insertPlainText(text)
 
+#lint:enable

=== modified file 'openlp/plugins/images/imageplugin.py'
--- openlp/plugins/images/imageplugin.py	2013-01-23 21:05:25 +0000
+++ openlp/plugins/images/imageplugin.py	2013-02-03 14:47:18 +0000
@@ -98,4 +98,4 @@
         last part of saving the config.
         """
         background = QtGui.QColor(Settings().value(self.settingsSection + u'/background color'))
-        self.liveController.imageManager.updateImagesBorder(ImageSource.ImagePlugin, background)
+        self.liveController.imageManager.update_images_border(ImageSource.ImagePlugin, background)

=== modified file 'openlp/plugins/media/mediaplugin.py'
--- openlp/plugins/media/mediaplugin.py	2013-01-23 21:05:25 +0000
+++ openlp/plugins/media/mediaplugin.py	2013-02-03 14:47:18 +0000
@@ -118,13 +118,13 @@
         """
         return self.media_controller.get_media_display_html()
 
-    def appStartup(self):
+    def app_startup(self):
         """
         Do a couple of things when the app starts up. In this particular case
         we want to check if we have the old "Use Phonon" setting, and convert
         it to "enable Phonon" and "make it the first one in the list".
         """
-        Plugin.appStartup(self)
+        Plugin.app_startup(self)
         settings = Settings()
         settings.beginGroup(self.settingsSection)
         if settings.contains(u'use phonon'):

=== modified file 'openlp/plugins/songs/forms/songbookform.py'
--- openlp/plugins/songs/forms/songbookform.py	2013-01-05 22:17:30 +0000
+++ openlp/plugins/songs/forms/songbookform.py	2013-02-03 14:47:18 +0000
@@ -33,6 +33,7 @@
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.plugins.songs.forms.songbookdialog import Ui_SongBookDialog
 
+
 class SongBookForm(QtGui.QDialog, Ui_SongBookDialog):
     """
     Class documentation goes here.
@@ -41,10 +42,16 @@
         """
         Constructor
         """
-        QtGui.QDialog.__init__(self, parent)
+        super(SongBookForm, self).__init__(parent)
         self.setupUi(self)
 
     def exec_(self, clear=True):
+        """
+        Execute the song book form.
+
+        ``clear``
+            Clear the fields on the form before displaying it.
+        """
         if clear:
             self.nameEdit.clear()
             self.publisherEdit.clear()
@@ -52,6 +59,9 @@
         return QtGui.QDialog.exec_(self)
 
     def accept(self):
+        """
+        Override the inherited method to check that the name of the book has been typed in.
+        """
         if not self.nameEdit.text():
             critical_error_message_box(
                 message=translate('SongsPlugin.SongBookForm', 'You need to type in a name for the book.'))

=== modified file 'openlp/plugins/songs/forms/songimportform.py'
--- openlp/plugins/songs/forms/songimportform.py	2013-01-23 20:29:43 +0000
+++ openlp/plugins/songs/forms/songimportform.py	2013-02-03 14:47:18 +0000
@@ -35,13 +35,14 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Receiver, Settings, SettingsManager, translate, UiStrings
+from openlp.core.lib import Receiver, Settings, UiStrings, translate
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
 from openlp.plugins.songs.lib.importer import SongFormat, SongFormatSelect
 
 log = logging.getLogger(__name__)
 
+
 class SongImportForm(OpenLPWizard):
     """
     This is the Song Import Wizard, which allows easy importing of Songs
@@ -211,17 +212,17 @@
         if self.currentPage() == self.welcomePage:
             return True
         elif self.currentPage() == self.sourcePage:
-            format = self.currentFormat
-            Settings().setValue(u'songs/last import type', format)
-            select_mode, class_, error_msg = SongFormat.get(format, u'selectMode', u'class', u'invalidSourceMsg')
+            this_format = self.currentFormat
+            Settings().setValue(u'songs/last import type', this_format)
+            select_mode, class_, error_msg = SongFormat.get(this_format, u'selectMode', u'class', u'invalidSourceMsg')
             if select_mode == SongFormatSelect.MultipleFiles:
-                import_source = self.getListOfFiles(self.formatWidgets[format][u'fileListWidget'])
+                import_source = self.getListOfFiles(self.formatWidgets[this_format][u'fileListWidget'])
                 error_title = UiStrings().IFSp
-                focus_button = self.formatWidgets[format][u'addButton']
+                focus_button = self.formatWidgets[this_format][u'addButton']
             else:
-                import_source = self.formatWidgets[format][u'filepathEdit'].text()
+                import_source = self.formatWidgets[this_format][u'filepathEdit'].text()
                 error_title = (UiStrings().IFSs if select_mode == SongFormatSelect.SingleFile else UiStrings().IFdSs)
-                focus_button = self.formatWidgets[format][u'browseButton']
+                focus_button = self.formatWidgets[this_format][u'browseButton']
             if not class_.isValidSource(import_source):
                 critical_error_message_box(error_title, error_msg)
                 focus_button.setFocus()
@@ -271,25 +272,35 @@
             del item
 
     def onBrowseButtonClicked(self):
-        format = self.currentFormat
-        select_mode, format_name, filter = SongFormat.get(format, u'selectMode',
+        """
+        Browse for files or a directory.
+        """
+        this_format = self.currentFormat
+        select_mode, format_name, ext_filter = SongFormat.get(this_format, u'selectMode',
             u'name', u'filter')
-        filepathEdit = self.formatWidgets[format][u'filepathEdit']
+        filepathEdit = self.formatWidgets[this_format][u'filepathEdit']
         if select_mode == SongFormatSelect.SingleFile:
-            self.getFileName(WizardStrings.OpenTypeFile % format_name, filepathEdit, u'last directory import', filter)
+            self.getFileName(WizardStrings.OpenTypeFile % format_name, filepathEdit,
+                u'last directory import', ext_filter)
         elif select_mode == SongFormatSelect.SingleFolder:
             self.getFolder(WizardStrings.OpenTypeFolder % format_name, filepathEdit, u'last directory import')
 
     def onAddButtonClicked(self):
-        format = self.currentFormat
-        select_mode, format_name, filter, custom_title = \
-            SongFormat.get(format, u'selectMode', u'name', u'filter', u'getFilesTitle')
+        """
+        Add a file or directory.
+        """
+        this_format = self.currentFormat
+        select_mode, format_name, ext_filter, custom_title = \
+            SongFormat.get(this_format, u'selectMode', u'name', u'filter', u'getFilesTitle')
         title = custom_title if custom_title else WizardStrings.OpenTypeFile % format_name
         if select_mode == SongFormatSelect.MultipleFiles:
-            self.getFiles(title, self.formatWidgets[format][u'fileListWidget'], filter)
+            self.getFiles(title, self.formatWidgets[this_format][u'fileListWidget'], ext_filter)
             self.sourcePage.emit(QtCore.SIGNAL(u'completeChanged()'))
 
     def onRemoveButtonClicked(self):
+        """
+        Remove a file from the list.
+        """
         self.removeSelectedItems(
             self.formatWidgets[self.currentFormat][u'fileListWidget'])
         self.sourcePage.emit(QtCore.SIGNAL(u'completeChanged()'))
@@ -340,10 +351,10 @@
         select_mode = SongFormat.get(source_format, u'selectMode')
         if select_mode == SongFormatSelect.SingleFile:
             importer = self.plugin.importSongs(source_format,
-                filename = self.formatWidgets[source_format][u'filepathEdit'].text())
+                filename=self.formatWidgets[source_format][u'filepathEdit'].text())
         elif select_mode == SongFormatSelect.SingleFolder:
             importer = self.plugin.importSongs(source_format,
-                folder = self.formatWidgets[source_format][u'filepathEdit'].text())
+                folder=self.formatWidgets[source_format][u'filepathEdit'].text())
         else:
             importer = self.plugin.importSongs(source_format,
                 filenames=self.getListOfFiles(self.formatWidgets[source_format][u'fileListWidget']))
@@ -369,9 +380,12 @@
         report_file.close()
 
     def addFileSelectItem(self):
-        format = self.currentFormat
+        """
+        Add a file selection page.
+        """
+        this_format = self.currentFormat
         prefix, can_disable, description_text, select_mode = \
-            SongFormat.get(format, u'prefix', u'canDisable', u'descriptionText', u'selectMode')
+            SongFormat.get(this_format, u'prefix', u'canDisable', u'descriptionText', u'selectMode')
         page = QtGui.QWidget()
         page.setObjectName(prefix + u'Page')
         if can_disable:
@@ -392,8 +406,8 @@
             descriptionLabel.setObjectName(prefix + u'DescriptionLabel')
             descriptionLayout.addWidget(descriptionLabel)
             importLayout.addLayout(descriptionLayout)
-            self.formatWidgets[format][u'descriptionLabel'] = descriptionLabel
-            self.formatWidgets[format][u'descriptionSpacer'] = descriptionSpacer
+            self.formatWidgets[this_format][u'descriptionLabel'] = descriptionLabel
+            self.formatWidgets[this_format][u'descriptionSpacer'] = descriptionSpacer
         if select_mode == SongFormatSelect.SingleFile or select_mode == SongFormatSelect.SingleFolder:
             filepathLayout = QtGui.QHBoxLayout()
             filepathLayout.setObjectName(prefix + u'FilepathLayout')
@@ -412,11 +426,11 @@
             filepathLayout.addWidget(browseButton)
             importLayout.addLayout(filepathLayout)
             importLayout.addSpacerItem(self.stackSpacer)
-            self.formatWidgets[format][u'filepathLabel'] = filepathLabel
-            self.formatWidgets[format][u'filepathSpacer'] = filepathSpacer
-            self.formatWidgets[format][u'filepathLayout'] = filepathLayout
-            self.formatWidgets[format][u'filepathEdit'] = filepathEdit
-            self.formatWidgets[format][u'browseButton'] = browseButton
+            self.formatWidgets[this_format][u'filepathLabel'] = filepathLabel
+            self.formatWidgets[this_format][u'filepathSpacer'] = filepathSpacer
+            self.formatWidgets[this_format][u'filepathLayout'] = filepathLayout
+            self.formatWidgets[this_format][u'filepathEdit'] = filepathEdit
+            self.formatWidgets[this_format][u'browseButton'] = browseButton
         elif select_mode == SongFormatSelect.MultipleFiles:
             fileListWidget = QtGui.QListWidget(importWidget)
             fileListWidget.setSelectionMode(QtGui.QAbstractItemView.ExtendedSelection)
@@ -434,18 +448,21 @@
             removeButton.setObjectName(prefix + u'RemoveButton')
             buttonLayout.addWidget(removeButton)
             importLayout.addLayout(buttonLayout)
-            self.formatWidgets[format][u'fileListWidget'] = fileListWidget
-            self.formatWidgets[format][u'buttonLayout'] = buttonLayout
-            self.formatWidgets[format][u'addButton'] = addButton
-            self.formatWidgets[format][u'removeButton'] = removeButton
+            self.formatWidgets[this_format][u'fileListWidget'] = fileListWidget
+            self.formatWidgets[this_format][u'buttonLayout'] = buttonLayout
+            self.formatWidgets[this_format][u'addButton'] = addButton
+            self.formatWidgets[this_format][u'removeButton'] = removeButton
         self.formatStack.addWidget(page)
-        self.formatWidgets[format][u'page'] = page
-        self.formatWidgets[format][u'importLayout'] = importLayout
+        self.formatWidgets[this_format][u'page'] = page
+        self.formatWidgets[this_format][u'importLayout'] = importLayout
         self.formatComboBox.addItem(u'')
 
     def disablableWidget(self, page, prefix):
-        format = self.currentFormat
-        self.disablableFormats.append(format)
+        """
+        Disable a widget.
+        """
+        this_format = self.currentFormat
+        self.disablableFormats.append(this_format)
         layout = QtGui.QVBoxLayout(page)
         layout.setMargin(0)
         layout.setSpacing(0)
@@ -465,11 +482,11 @@
         importWidget = QtGui.QWidget(page)
         importWidget.setObjectName(prefix + u'ImportWidget')
         layout.addWidget(importWidget)
-        self.formatWidgets[format][u'layout'] = layout
-        self.formatWidgets[format][u'disabledWidget'] = disabledWidget
-        self.formatWidgets[format][u'disabledLayout'] = disabledLayout
-        self.formatWidgets[format][u'disabledLabel'] = disabledLabel
-        self.formatWidgets[format][u'importWidget'] = importWidget
+        self.formatWidgets[this_format][u'layout'] = layout
+        self.formatWidgets[this_format][u'disabledWidget'] = disabledWidget
+        self.formatWidgets[this_format][u'disabledLayout'] = disabledLayout
+        self.formatWidgets[this_format][u'disabledLabel'] = disabledLabel
+        self.formatWidgets[this_format][u'importWidget'] = importWidget
         return importWidget
 
 
@@ -489,14 +506,14 @@
         When this method returns True, the wizard's Next button is enabled.
         """
         wizard = self.wizard()
-        format = wizard.currentFormat
-        select_mode, format_available = SongFormat.get(format, u'selectMode', u'availability')
+        this_format = wizard.currentFormat
+        select_mode, format_available = SongFormat.get(this_format, u'selectMode', u'availability')
         if format_available:
             if select_mode == SongFormatSelect.MultipleFiles:
-                if wizard.formatWidgets[format][u'fileListWidget'].count() > 0:
+                if wizard.formatWidgets[this_format][u'fileListWidget'].count() > 0:
                     return True
             else:
-                filepath = unicode(wizard.formatWidgets[format][u'filepathEdit'].text())
+                filepath = unicode(wizard.formatWidgets[this_format][u'filepathEdit'].text())
                 if filepath:
                     if select_mode == SongFormatSelect.SingleFile and os.path.isfile(filepath):
                         return True

=== modified file 'openlp/plugins/songs/forms/songmaintenanceform.py'
--- openlp/plugins/songs/forms/songmaintenanceform.py	2013-01-11 00:19:11 +0000
+++ openlp/plugins/songs/forms/songmaintenanceform.py	2013-02-03 14:47:18 +0000
@@ -39,6 +39,7 @@
 
 log = logging.getLogger(__name__)
 
+
 class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
     """
     Class documentation goes here.
@@ -47,7 +48,7 @@
         """
         Constructor
         """
-        QtGui.QDialog.__init__(self, parent)
+        super(SongMaintenanceForm, self).__init__(parent)
         self.setupUi(self)
         self.manager = manager
         self.authorform = AuthorsForm(self)
@@ -93,8 +94,14 @@
         self.typeListWidget.setFocus()
         return QtGui.QDialog.exec_(self)
 
-    def _getCurrentItemId(self, listWidget):
-        item = listWidget.currentItem()
+    def _getCurrentItemId(self, list_widget):
+        """
+        Get the ID of the currently selected item.
+
+        ``list_widget``
+            The list widget to examine.
+        """
+        item = list_widget.currentItem()
         if item:
             item_id = (item.data(QtCore.Qt.UserRole))
             return item_id
@@ -102,6 +109,9 @@
             return -1
 
     def _deleteItem(self, itemClass, listWidget, resetFunc, dlgTitle, del_text, err_text):
+        """
+        Delete an item.
+        """
         item_id = self._getCurrentItemId(listWidget)
         if item_id != -1:
             item = self.manager.get_object(itemClass, item_id)
@@ -196,6 +206,9 @@
             return True
 
     def onAuthorAddButtonClicked(self):
+        """
+        Add an author to the list.
+        """
         self.authorform.setAutoDisplayName(True)
         if self.authorform.exec_():
             author = Author.populate(
@@ -213,6 +226,9 @@
                     message=translate('SongsPlugin.SongMaintenanceForm', 'This author already exists.'))
 
     def onTopicAddButtonClicked(self):
+        """
+        Add a topic to the list.
+        """
         if self.topicform.exec_():
             topic = Topic.populate(name=self.topicform.nameEdit.text())
             if self.checkTopic(topic):
@@ -226,6 +242,9 @@
                     message=translate('SongsPlugin.SongMaintenanceForm', 'This topic already exists.'))
 
     def onBookAddButtonClicked(self):
+        """
+        Add a book to the list.
+        """
         if self.bookform.exec_():
             book = Book.populate(name=self.bookform.nameEdit.text(),
                 publisher=self.bookform.publisherEdit.text())
@@ -240,6 +259,9 @@
                     message=translate('SongsPlugin.SongMaintenanceForm', 'This book already exists.'))
 
     def onAuthorEditButtonClicked(self):
+        """
+        Edit an author.
+        """
         author_id = self._getCurrentItemId(self.authorsListWidget)
         if author_id == -1:
             return
@@ -283,6 +305,9 @@
                     'Could not save your modified author, because the author already exists.'))
 
     def onTopicEditButtonClicked(self):
+        """
+        Edit a topic.
+        """
         topic_id = self._getCurrentItemId(self.topicsListWidget)
         if topic_id == -1:
             return
@@ -311,6 +336,9 @@
                     'Could not save your modified topic, because it already exists.'))
 
     def onBookEditButtonClicked(self):
+        """
+        Edit a book.
+        """
         book_id = self._getCurrentItemId(self.booksListWidget)
         if book_id == -1:
             return

=== modified file 'openlp/plugins/songs/forms/topicsform.py'
--- openlp/plugins/songs/forms/topicsform.py	2013-01-06 17:25:49 +0000
+++ openlp/plugins/songs/forms/topicsform.py	2013-02-03 14:47:18 +0000
@@ -33,6 +33,7 @@
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.plugins.songs.forms.topicsdialog import Ui_TopicsDialog
 
+
 class TopicsForm(QtGui.QDialog, Ui_TopicsDialog):
     """
     Class documentation goes here.
@@ -41,16 +42,22 @@
         """
         Constructor
         """
-        QtGui.QDialog.__init__(self, parent)
+        super(TopicsForm, self).__init__(parent)
         self.setupUi(self)
 
     def exec_(self, clear=True):
+        """
+        Execute the dialog.
+        """
         if clear:
             self.nameEdit.clear()
         self.nameEdit.setFocus()
         return QtGui.QDialog.exec_(self)
 
     def accept(self):
+        """
+        Override the inherited method to check before we close.
+        """
         if not self.nameEdit.text():
             critical_error_message_box(message=translate('SongsPlugin.TopicsForm',
                 'You need to type in a topic name.'))

=== modified file 'openlp/plugins/songs/songsplugin.py'
--- openlp/plugins/songs/songsplugin.py	2013-01-23 21:05:25 +0000
+++ openlp/plugins/songs/songsplugin.py	2013-02-03 14:47:18 +0000
@@ -239,7 +239,7 @@
         }
         self.setPluginUiTextStrings(tooltips)
 
-    def firstTime(self):
+    def first_time(self):
         """
         If the first time wizard has run, this function is run to import all the
         new songs into the database.


Follow ups