← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~meths/openlp/testing into lp:openlp

 

Jon Tibble has proposed merging lp:~meths/openlp/testing into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)


Conversion:
- Config files to QSettings

Add:
- UI settings saving
- Recent service files listing

Fix:
- Imports, whitespace, spelling
- Presentation events
- Some DisplayManager fallout
-- 
https://code.launchpad.net/~meths/openlp/testing/+merge/24281
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file '.bzrignore'
--- .bzrignore	2010-03-05 18:34:19 +0000
+++ .bzrignore	2010-04-28 03:18:16 +0000
@@ -14,3 +14,4 @@
 OpenLP.egg-info
 build
 resources/innosetup/Output
+_eric4project

=== modified file 'documentation/source/core/lib.rst'
--- documentation/source/core/lib.rst	2009-09-08 20:13:02 +0000
+++ documentation/source/core/lib.rst	2010-04-28 03:18:16 +0000
@@ -36,12 +36,6 @@
 .. autoclass:: openlp.core.lib.plugin.Plugin
    :members:
 
-:mod:`PluginConfig`
--------------------
-
-.. autoclass:: openlp.core.lib.pluginconfig.PluginConfig
-   :members:
-
 :mod:`PluginManager`
 --------------------
 

=== modified file 'openlp.pyw'
--- openlp.pyw	2010-04-20 22:12:04 +0000
+++ openlp.pyw	2010-04-28 03:18:16 +0000
@@ -34,10 +34,10 @@
 
 log = logging.getLogger()
 
-from openlp.core.lib import Receiver, str_to_bool
+from openlp.core.lib import Receiver
 from openlp.core.resources import qInitResources
 from openlp.core.ui import MainWindow, SplashScreen, ScreenList
-from openlp.core.utils import AppLocation, ConfigHelper
+from openlp.core.utils import AppLocation
 
 application_stylesheet = u"""
 QMainWindow::separator
@@ -110,20 +110,17 @@
         finally:
             if fversion:
                 fversion.close()
-        #set the default string encoding
-        try:
-            sys.setappdefaultencoding(u'utf-8')
-        except:
-            pass
         #provide a listener for widgets to reqest a screen update.
         QtCore.QObject.connect(Receiver.get_receiver(),
             QtCore.SIGNAL(u'openlp_process_events'), self.processEvents)
+        self.setOrganizationName(u'OpenLP')
+        self.setOrganizationDomain(u'openlp.org')
         self.setApplicationName(u'OpenLP')
         self.setApplicationVersion(app_version[u'version'])
         if os.name == u'nt':
             self.setStyleSheet(application_stylesheet)
-        show_splash = str_to_bool(ConfigHelper.get_registry().get_value(
-            u'general', u'show splash', True))
+        show_splash = QtCore.QSettings().value(
+            u'general/show splash', True).toBool()
         if show_splash:
             self.splash = SplashScreen(self.applicationVersion())
             self.splash.show()

=== modified file 'openlp/core/lib/__init__.py'
--- openlp/core/lib/__init__.py	2010-04-03 07:10:31 +0000
+++ openlp/core/lib/__init__.py	2010-04-28 03:18:16 +0000
@@ -164,7 +164,6 @@
 
 from eventreceiver import Receiver
 from settingsmanager import SettingsManager
-from pluginconfig import PluginConfig
 from plugin import PluginStatus, Plugin
 from pluginmanager import PluginManager
 from settingstab import SettingsTab

=== modified file 'openlp/core/lib/dockwidget.py'
--- openlp/core/lib/dockwidget.py	2010-03-21 23:58:01 +0000
+++ openlp/core/lib/dockwidget.py	2010-04-28 03:18:16 +0000
@@ -43,8 +43,3 @@
             self.setObjectName(name)
         self.setFloating(False)
         log.debug(u'Init done')
-
-    def closeEvent(self, event):
-        self.parent.settingsmanager.setUIItemVisibility(
-            self.objectName(), False)
-        event.accept()

=== modified file 'openlp/core/lib/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py	2010-04-22 21:23:14 +0000
+++ openlp/core/lib/mediamanageritem.py	2010-04-28 03:18:16 +0000
@@ -29,7 +29,8 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib.toolbar import *
-from openlp.core.lib import contextMenuAction, contextMenuSeparator
+from openlp.core.lib import contextMenuAction, contextMenuSeparator, \
+    SettingsManager
 from serviceitem import ServiceItem
 
 log = logging.getLogger(__name__)
@@ -334,13 +335,15 @@
     def onFileClick(self):
         files = QtGui.QFileDialog.getOpenFileNames(
             self, self.OnNewPrompt,
-            self.parent.config.get_last_dir(), self.OnNewFileMasks)
+            SettingsManager.get_last_dir(self.ConfigSection),
+            self.OnNewFileMasks)
         log.info(u'New files(s) %s', unicode(files))
         if files:
             self.loadList(files)
             dir, filename = os.path.split(unicode(files[0]))
-            self.parent.config.set_last_dir(dir)
-            self.parent.config.set_list(self.ConfigSection, self.getFileList())
+            SettingsManager.set_last_dir(self.ConfigSection, dir)
+            SettingsManager.set_list(
+                self.ConfigSection, self.ConfigSection, self.getFileList())
 
     def getFileList(self):
         count = 0

=== modified file 'openlp/core/lib/plugin.py'
--- openlp/core/lib/plugin.py	2010-03-21 23:58:01 +0000
+++ openlp/core/lib/plugin.py	2010-04-28 03:18:16 +0000
@@ -24,9 +24,10 @@
 ###############################################################################
 
 import logging
+
 from PyQt4 import QtCore
 
-from openlp.core.lib import PluginConfig, Receiver
+from openlp.core.lib import Receiver
 
 log = logging.getLogger(__name__)
 
@@ -53,10 +54,6 @@
     ``icon``
         An instance of QIcon, which holds an icon for this plugin.
 
-    ``config``
-        An instance of PluginConfig, which allows plugins to read and write to
-        openlp.org's configuration. This is pre-instantiated.
-
     ``log``
         A log object used to log debugging messages. This is pre-instantiated.
 
@@ -78,7 +75,8 @@
         Add an item to the Export menu.
 
     ``get_settings_tab()``
-        Returns an instance of SettingsTabItem to be used in the Settings dialog.
+        Returns an instance of SettingsTabItem to be used in the Settings
+        dialog.
 
     ``add_to_menu(menubar)``
         A method to add a menu item to anywhere in the menu, given the menu bar.
@@ -116,7 +114,6 @@
         if version:
             self.version = version
         self.icon = None
-        self.config = PluginConfig(self.name)
         self.weight = 0
         self.status = PluginStatus.Inactive
         # Set up logging
@@ -125,7 +122,7 @@
         self.live_controller = plugin_helpers[u'live']
         self.render_manager = plugin_helpers[u'render']
         self.service_manager = plugin_helpers[u'service']
-        self.settings = plugin_helpers[u'settings']
+        self.settings_form = plugin_helpers[u'settings form']
         self.mediadock = plugin_helpers[u'toolbox']
         self.maindisplay = plugin_helpers[u'maindisplay']
         QtCore.QObject.connect(Receiver.get_receiver(),
@@ -145,15 +142,16 @@
         """
         Sets the status of the plugin
         """
-        self.status = int(self.config.get_config(u'status',
-            PluginStatus.Inactive))
+        self.status = QtCore.QSettings().value(
+            self.name.lower() + u'/status', PluginStatus.Inactive).toInt()[0]
 
     def toggle_status(self, new_status):
         """
         Changes the status of the plugin and remembers it
         """
         self.status = new_status
-        self.config.set_config(u'status', self.status)
+        QtCore.QSettings().setValue(
+            self.name.lower() + u'/status', QtCore.QVariant(self.status))
 
     def is_active(self):
         """
@@ -216,7 +214,8 @@
         """
         Generic Drag and drop handler triggered from service_manager.
         """
-        log.debug(u'process_add_service_event event called for plugin %s' % self.name)
+        log.debug(u'process_add_service_event event called for plugin %s' %
+            self.name)
         self.media_item.onAddClick()
 
     def about(self):
@@ -244,7 +243,7 @@
         Called by the plugin to remove toolbar
         """
         self.mediadock.remove_dock(self.name)
-        self.settings.removeTab(self.name)
+        self.settings_form.removeTab(self.name)
 
     def insert_toolbox_item(self):
         """
@@ -253,7 +252,7 @@
         if self.media_item:
             self.mediadock.insert_dock(self.media_item, self.icon, self.weight)
         if self.settings_tab:
-            self.settings.insertTab(self.settings_tab, self.weight)
+            self.settings_form.insertTab(self.settings_tab, self.weight)
 
     def can_delete_theme(self, theme):
         """

=== removed file 'openlp/core/lib/pluginconfig.py'
--- openlp/core/lib/pluginconfig.py	2010-04-14 16:58:22 +0000
+++ openlp/core/lib/pluginconfig.py	1970-01-01 00:00:00 +0000
@@ -1,194 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
-
-###############################################################################
-# OpenLP - Open Source Lyrics Projection                                      #
-# --------------------------------------------------------------------------- #
-# Copyright (c) 2008-2010 Raoul Snyman                                        #
-# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
-# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin      #
-# Thompson, Jon Tibble, Carsten Tinggaard                                     #
-# --------------------------------------------------------------------------- #
-# This program is free software; you can redistribute it and/or modify it     #
-# under the terms of the GNU General Public License as published by the Free  #
-# Software Foundation; version 2 of the License.                              #
-#                                                                             #
-# This program is distributed in the hope that it will be useful, but WITHOUT #
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
-# more details.                                                               #
-#                                                                             #
-# You should have received a copy of the GNU General Public License along     #
-# with this program; if not, write to the Free Software Foundation, Inc., 59  #
-# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
-###############################################################################
-
-import os
-
-from openlp.core.utils import ConfigHelper
-
-class PluginConfig(object):
-    """
-    This is a generic config helper for plugins.
-    """
-    def __init__(self, plugin_name):
-        """
-        Initialise the plugin config object, setting the section name to the
-        plugin name.
-
-        ``plugin_name``
-            The name of the plugin to use as a section name.
-        """
-        self.section = plugin_name.lower()
-
-    def get_config(self, key, default=None):
-        """
-        Get a configuration value from the configuration registry.
-
-        ``key``
-            The name of configuration to load.
-
-        ``default``
-            Defaults to *None*. The default value to return if there is no
-            other value.
-        """
-        return ConfigHelper.get_config(self.section, key, default)
-
-    def delete_config(self, key):
-        """
-        Delete a configuration value from the configuration registry.
-
-        ``key``
-            The name of the configuration to remove.
-        """
-        return ConfigHelper.delete_config(self.section, key)
-
-    def set_config(self, key, value):
-        """
-        Set a configuration value in the configuration registry.
-
-        ``key``
-            The name of the configuration to save.
-
-        ``value``
-            The value of the configuration to save.
-        """
-        return ConfigHelper.set_config(self.section, key, value)
-
-    def get_data_path(self):
-        """
-        Dynamically build the data file path for a plugin.
-        """
-        #app_data = ConfigHelper.get_data_path()
-        app_data = ConfigHelper.get_data_path()
-        safe_name = self.section.replace(u' ',u'-')
-        plugin_data = self.get_config(u'data path', safe_name)
-        path = os.path.join(app_data, plugin_data)
-        if not os.path.exists(path):
-            os.makedirs(path)
-        return path
-
-    def set_data_path(self, path):
-        """
-        Set the data file path.
-
-        ``path``
-            The path to save.
-        """
-        return self.set_config(u'data path', os.path.basename(path))
-
-    def get_files(self, suffix=None):
-        """
-        Get a list of files from the data files path.
-
-        ``suffix``
-            Defaults to *None*. The extension to search for.
-        """
-        try:
-            files = os.listdir(self.get_data_path())
-        except:
-            return []
-        if suffix:
-            return_files = []
-            for file in files:
-                if file.find(u'.') != -1:
-                    filename = file.split(u'.')
-                    #bname = nme[0]
-                    filesuffix = filename[1].lower()
-                    filesuffix = filesuffix.lower()
-                    # only load files with the correct suffix
-                    if suffix.find(filesuffix) > -1 :
-                        return_files.append(file)
-            return return_files
-        else:
-            # no filtering required
-            return files
-
-    def load_list(self, name):
-        """
-        Load a list from the config file.
-
-        ``name``
-            The name of the list.
-        """
-        list_count = self.get_config(u'%s count' % name)
-        if list_count:
-            list_count = int(list_count)
-        else:
-            list_count = 0
-        list = []
-        if list_count > 0:
-            for counter in range(0, list_count):
-                item = self.get_config(u'%s %d' % (name, counter))
-                if item:
-                    list.append(item)
-        return list
-
-    def set_list(self, name, list):
-        """
-        Save a list to the config file.
-
-        ``name``
-            The name of the list to save.
-
-        ``list``
-            The list of values to save.
-        """
-        old_count = int(self.get_config(u'%s count' % name, int(0)))
-        new_count = len(list)
-        self.set_config(u'%s count' % name, new_count)
-        for counter in range (0, new_count):
-            self.set_config(u'%s %d' % (name, counter), list[counter-1])
-        if old_count > new_count:
-            # Tidy up any old list itrms if list is smaller now
-            for counter in range(new_count, old_count):
-                self.delete_config(u'%s %d' % (name, counter))
-
-    def get_last_dir(self, num=None):
-        """
-        Read the last directory used for plugin.
-
-        ``num``
-            Defaults to *None*. A further qualifier.
-        """
-        if num:
-            name = u'last directory %d' % num
-        else:
-            name = u'last directory'
-        last_dir = self.get_config(name)
-        if not last_dir:
-            last_dir = u''
-        return last_dir
-
-    def set_last_dir(self, directory, num=None):
-        """
-        Save the last directory used for plugin.
-
-        ``num``
-            Defaults to *None*. A further qualifier.
-        """
-        if num:
-            name = u'last directory %d' % num
-        else:
-            name = u'last directory'
-        self.set_config(name, directory)

=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py	2010-04-16 07:31:01 +0000
+++ openlp/core/lib/serviceitem.py	2010-04-28 03:18:16 +0000
@@ -30,7 +30,7 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import build_icon, Receiver, resize_image
+from openlp.core.lib import build_icon, resize_image
 
 log = logging.getLogger(__name__)
 

=== modified file 'openlp/core/lib/settingsmanager.py'
--- openlp/core/lib/settingsmanager.py	2010-03-21 23:58:01 +0000
+++ openlp/core/lib/settingsmanager.py	2010-04-28 03:18:16 +0000
@@ -23,14 +23,16 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 
-from openlp.core.lib import str_to_bool
-from openlp.core.utils import ConfigHelper
+import os
+
+from PyQt4 import QtCore
+
+from openlp.core.utils import AppLocation
 
 class SettingsManager(object):
     """
-    Class to control the size of the UI components so they size correctly.
-    This class is created by the main window and then calculates the size of
-    individual components.
+    Class to control the initial settings for the UI and provide helper
+    functions for the loading and saving of application settings.
     """
     def __init__(self, screen):
         self.screen = screen.current
@@ -50,26 +52,128 @@
             self.mainwindow_left + self.mainwindow_right) - 100 ) / 2
         self.slidecontroller_image = self.slidecontroller - 50
 
-        self.showMediaManager = str_to_bool(ConfigHelper.get_config(
-            u'user interface', u'media manager', True))
-        self.showServiceManager = str_to_bool(ConfigHelper.get_config(
-            u'user interface', u'service manager', True))
-        self.showThemeManager = str_to_bool(ConfigHelper.get_config(
-            u'user interface', u'theme manager', True))
-        self.showPreviewPanel = str_to_bool(ConfigHelper.get_config(
-            u'user interface', u'preview panel', True))
-
-    def setUIItemVisibility(self, item=u'', isVisible=True):
-        if item:
-            if item == u'ThemeManagerDock':
-                ConfigHelper.set_config(u'user interface',
-                    u'theme manager', isVisible)
-            elif item == u'ServiceManagerDock':
-                ConfigHelper.set_config(u'user interface',
-                    u'service manager', isVisible)
-            elif item == u'MediaManagerDock':
-                ConfigHelper.set_config(u'user interface',
-                    u'media manager', isVisible)
+        self.showPreviewPanel = QtCore.QSettings().value(
+            u'user interface/preview panel', True).toBool()
 
     def togglePreviewPanel(self, isVisible):
-        ConfigHelper.set_config(u'user interface', u'preview panel', isVisible)
+        QtCore.QSettings().setValue(u'user interface/preview panel',
+            QtCore.QVariant(isVisible))
+
+    @staticmethod
+    def get_last_dir(section, num=None):
+        """
+        Read the last directory used for plugin.
+
+        ``section``
+            The section of code calling the method.  This is used in the
+            settings key.
+
+        ``num``
+            Defaults to *None*. A further qualifier.
+        """
+        if num:
+            name = u'last directory %d' % num
+        else:
+            name = u'last directory'
+        last_dir = unicode(QtCore.QSettings().value(
+            section + u'/' + name, u'').toString())
+        return last_dir
+
+    @staticmethod
+    def set_last_dir(section, directory, num=None):
+        """
+        Save the last directory used for plugin.
+
+        ``section``
+            The section of code calling the method.  This is used in the
+            settings key.
+
+        ``directory``
+            The directory being stored in the settings.
+
+        ``num``
+            Defaults to *None*. A further qualifier.
+        """
+        if num:
+            name = u'last directory %d' % num
+        else:
+            name = u'last directory'
+        QtCore.QSettings().setValue(
+            section + u'/' + name, QtCore.QVariant(directory))
+
+    @staticmethod
+    def set_list(section, name, list):
+        """
+        Save a list to application settings.
+
+        ``section``
+            The section of the settings to store this list.
+
+        ``name``
+            The name of the list to save.
+
+        ``list``
+            The list of values to save.
+        """
+        settings = QtCore.QSettings()
+        old_count = settings.value(
+            u'%s/%s count' % (section, name), 0).toInt()[0]
+        new_count = len(list)
+        settings.setValue(
+            u'%s/%s count' % (section, name), QtCore.QVariant(new_count))
+        for counter in range (0, new_count):
+            settings.setValue(
+                u'%s/%s %d' % (section, name, counter), list[counter-1])
+        if old_count > new_count:
+            # Tidy up any old list items
+            for counter in range(new_count, old_count):
+                settings.remove(u'%s/%s %d' % (section, name, counter))
+
+    @staticmethod
+    def load_list(section, name):
+        """
+        Load a list from the config file.
+
+        ``section``
+            The section of the settings to load the list from.
+
+        ``name``
+            The name of the list.
+        """
+        settings = QtCore.QSettings()
+        list_count = settings.value(
+            u'%s/%s count' % (section, name), 0).toInt()[0]
+        list = []
+        if list_count:
+            for counter in range(0, list_count):
+                item = unicode(settings.value(
+                    u'%s/%s %d' % (section, name, counter)).toString())
+                if item:
+                    list.append(item)
+        return list
+
+    @staticmethod
+    def get_files(section=None, extension=None):
+        """
+        Get a list of files from the data files path.
+
+        ``section``
+            Defaults to *None*.  The section of code getting the files - used
+            to load from a section's data subdirectory.
+
+        ``extension``
+            Defaults to *None*.  The extension to search for.
+        """
+        path = AppLocation.get_data_path()
+        if section:
+            path = os.path.join(path, section)
+        try:
+            files = os.listdir(path)
+        except:
+            return []
+        if extension:
+            return [file for file in files
+                if extension == os.path.splitext(file)[1]]
+        else:
+            # no filtering required
+            return files

=== modified file 'openlp/core/lib/settingstab.py'
--- openlp/core/lib/settingstab.py	2010-04-02 18:12:54 +0000
+++ openlp/core/lib/settingstab.py	2010-04-28 03:18:16 +0000
@@ -25,24 +25,17 @@
 
 from PyQt4 import QtGui
 
-from openlp.core.lib import PluginConfig
-
 class SettingsTab(QtGui.QWidget):
     """
     SettingsTab is a helper widget for plugins to define Tabs for the settings
     dialog.
     """
-    def __init__(self, title, section=None):
+    def __init__(self, title):
         """
         Constructor to create the Settings tab item.
 
         ``title``
-            Defaults to *None*. The title of the tab, which is usually
-            displayed on the tab.
-
-        ``section``
-            Defaults to *None*. This is the section in the configuration file
-            to write to when the ``save`` method is called.
+            The title of the tab, which is usually displayed on the tab.
         """
         QtGui.QWidget.__init__(self)
         self.tabTitle = title
@@ -50,10 +43,6 @@
         self.setupUi()
         self.retranslateUi()
         self.initialise()
-        if section is None:
-            self.config = PluginConfig(title)
-        else:
-            self.config = PluginConfig(section)
         self.preLoad()
         self.load()
 

=== modified file 'openlp/core/ui/generaltab.py'
--- openlp/core/ui/generaltab.py	2010-04-16 07:31:01 +0000
+++ openlp/core/ui/generaltab.py	2010-04-28 03:18:16 +0000
@@ -25,7 +25,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, str_to_bool, Receiver
+from openlp.core.lib import SettingsTab, Receiver
 
 class GeneralTab(SettingsTab):
     """
@@ -41,11 +41,13 @@
         values.
         If not set before default to last screen.
         """
-        self.MonitorNumber = int(self.config.get_config(u'monitor',
-                                                self.screens.monitor_number))
+        settings = QtCore.QSettings()
+        self.MonitorNumber = settings.value(
+            u'general/monitor', self.screens.monitor_number).toInt()[0]
         self.screens.set_current_display(self.MonitorNumber)
         self.screens.monitor_number = self.MonitorNumber
-        self.DisplayOnMonitor = str_to_bool(self.config.get_config(u'display on monitor', u'True'))
+        self.DisplayOnMonitor = settings.value(
+            u'general/display on monitor', True).toBool()
         self.screens.display = self.DisplayOnMonitor
 
     def setupUi(self):
@@ -151,15 +153,18 @@
         QtCore.QObject.connect(self.MonitorComboBox,
             QtCore.SIGNAL(u'activated(int)'), self.onMonitorComboBoxChanged)
         QtCore.QObject.connect(self.DisplayOnMonitorCheck,
-            QtCore.SIGNAL(u'stateChanged(int)'), self.onDisplayOnMonitorCheckChanged)
+            QtCore.SIGNAL(u'stateChanged(int)'),
+            self.onDisplayOnMonitorCheckChanged)
         QtCore.QObject.connect(self.WarningCheckBox,
             QtCore.SIGNAL(u'stateChanged(int)'), self.onWarningCheckBoxChanged)
         QtCore.QObject.connect(self.AutoOpenCheckBox,
             QtCore.SIGNAL(u'stateChanged(int)'), self.onAutoOpenCheckBoxChanged)
         QtCore.QObject.connect(self.ShowSplashCheckBox,
-            QtCore.SIGNAL(u'stateChanged(int)'), self.onShowSplashCheckBoxChanged)
+            QtCore.SIGNAL(u'stateChanged(int)'),
+            self.onShowSplashCheckBoxChanged)
         QtCore.QObject.connect(self.SaveCheckServiceCheckBox,
-            QtCore.SIGNAL(u'stateChanged(int)'), self.onSaveCheckServiceCheckBox)
+            QtCore.SIGNAL(u'stateChanged(int)'),
+            self.onSaveCheckServiceCheckBox)
         QtCore.QObject.connect(self.AutoPreviewCheckBox,
             QtCore.SIGNAL(u'stateChanged(int)'), self.onAutoPreviewCheckBox)
         QtCore.QObject.connect(self.NumberEdit,
@@ -171,15 +176,20 @@
 
     def retranslateUi(self):
         self.MonitorGroupBox.setTitle(self.trUtf8('Monitors'))
-        self.MonitorLabel.setText(self.trUtf8('Select monitor for output display:'))
-        self.DisplayOnMonitorCheck.setText(self.trUtf8('Display if in single screen'))
+        self.MonitorLabel.setText(
+            self.trUtf8('Select monitor for output display:'))
+        self.DisplayOnMonitorCheck.setText(
+            self.trUtf8('Display if in single screen'))
         self.StartupGroupBox.setTitle(self.trUtf8('Application Startup'))
         self.WarningCheckBox.setText(self.trUtf8('Show blank screen warning'))
-        self.AutoOpenCheckBox.setText(self.trUtf8('Automatically open the last service'))
+        self.AutoOpenCheckBox.setText(
+            self.trUtf8('Automatically open the last service'))
         self.ShowSplashCheckBox.setText(self.trUtf8('Show the splash screen'))
         self.SettingsGroupBox.setTitle(self.trUtf8('Application Settings'))
-        self.SaveCheckServiceCheckBox.setText(self.trUtf8('Prompt to save Service before starting New'))
-        self.AutoPreviewCheckBox.setText(self.trUtf8('Preview Next Song from Service Manager'))
+        self.SaveCheckServiceCheckBox.setText(
+            self.trUtf8('Prompt to save Service before starting New'))
+        self.AutoPreviewCheckBox.setText(
+            self.trUtf8('Preview Next Song from Service Manager'))
         self.CCLIGroupBox.setTitle(self.trUtf8('CCLI Details'))
         self.NumberLabel.setText(self.trUtf8('CCLI Number:'))
         self.UsernameLabel.setText(self.trUtf8('SongSelect Username:'))
@@ -216,20 +226,30 @@
         self.Password = self.PasswordEdit.displayText()
 
     def load(self):
+        settings = QtCore.QSettings()
         for screen in self.screens.screen_list:
-            screen_name = u'%s %d' % (self.trUtf8('Screen'), screen[u'number'] + 1)
+            screen_name = u'%s %d' % (self.trUtf8('Screen'),
+                screen[u'number'] + 1)
             if screen[u'primary']:
                 screen_name = u'%s (%s)' % (screen_name, self.trUtf8('primary'))
             self.MonitorComboBox.addItem(screen_name)
         # Get the configs
-        self.Warning = str_to_bool(self.config.get_config(u'blank warning', u'False'))
-        self.AutoOpen = str_to_bool(self.config.get_config(u'auto open', u'False'))
-        self.ShowSplash = str_to_bool(self.config.get_config(u'show splash', u'True'))
-        self.PromptSaveService = str_to_bool(self.config.get_config(u'save prompt', u'False'))
-        self.AutoPreview = str_to_bool(self.config.get_config(u'auto preview', u'False'))
-        self.CCLINumber = unicode(self.config.get_config(u'ccli number', u''))
-        self.Username = unicode(self.config.get_config(u'songselect username', u''))
-        self.Password = unicode(self.config.get_config(u'songselect password', u''))
+        self.Warning = settings.value(
+            u'general/blank warning', QtCore.QVariant(False)).toBool()
+        self.AutoOpen = settings.value(
+            u'general/auto open', QtCore.QVariant(False)).toBool()
+        self.ShowSplash = settings.value(
+            u'general/show splash', QtCore.QVariant(True)).toBool()
+        self.PromptSaveService = settings.value(
+            u'general/save prompt', QtCore.QVariant(False)).toBool()
+        self.AutoPreview = settings.value(
+            u'general/auto preview', QtCore.QVariant(False)).toBool()
+        self.CCLINumber = unicode(settings.value(
+            u'general/ccli number', QtCore.QVariant(u'')).toString())
+        self.Username = unicode(settings.value(
+            u'general/songselect username', QtCore.QVariant(u'')).toString())
+        self.Password = unicode(settings.value(
+            u'general/songselect password', QtCore.QVariant(u'')).toString())
         self.SaveCheckServiceCheckBox.setChecked(self.PromptSaveService)
         # Set a few things up
         self.MonitorComboBox.setCurrentIndex(self.MonitorNumber)
@@ -243,16 +263,27 @@
         self.PasswordEdit.setText(self.Password)
 
     def save(self):
-        self.config.set_config(u'monitor', self.MonitorNumber)
-        self.config.set_config(u'display on monitor', self.DisplayOnMonitor)
-        self.config.set_config(u'blank warning', self.Warning)
-        self.config.set_config(u'auto open', self.AutoOpen)
-        self.config.set_config(u'show splash', self.ShowSplash)
-        self.config.set_config(u'save prompt', self.PromptSaveService)
-        self.config.set_config(u'auto preview', self.AutoPreview)
-        self.config.set_config(u'ccli number', self.CCLINumber)
-        self.config.set_config(u'songselect username', self.Username)
-        self.config.set_config(u'songselect password', self.Password)
+        settings = QtCore.QSettings()
+        settings.setValue(u'general/monitor',
+            QtCore.QVariant(self.MonitorNumber))
+        settings.setValue(u'general/display on monitor',
+            QtCore.QVariant(self.DisplayOnMonitor))
+        settings.setValue(u'general/blank warning',
+            QtCore.QVariant(self.Warning))
+        settings.setValue(u'general/auto open',
+            QtCore.QVariant(self.AutoOpen))
+        settings.setValue(u'general/show splash',
+            QtCore.QVariant(self.ShowSplash))
+        settings.setValue(u'general/save prompt',
+            QtCore.QVariant(self.PromptSaveService))
+        settings.setValue(u'general/auto preview',
+            QtCore.QVariant(self.AutoPreview))
+        settings.setValue(u'general/ccli number',
+            QtCore.QVariant(self.CCLINumber))
+        settings.setValue(u'general/songselect username',
+            QtCore.QVariant(self.Username))
+        settings.setValue(u'general/songselect password',
+            QtCore.QVariant(self.Password))
         self.screens.display = self.DisplayOnMonitor
         #Monitor Number has changed.
         if self.screens.monitor_number != self.MonitorNumber:

=== modified file 'openlp/core/ui/maindisplay.py'
--- openlp/core/ui/maindisplay.py	2010-04-22 21:22:09 +0000
+++ openlp/core/ui/maindisplay.py	2010-04-28 03:18:16 +0000
@@ -254,14 +254,17 @@
         if not self.displayBlank:
             if transition:
                 if self.frame is not None:
-                    self.display_text.setPixmap(QtGui.QPixmap.fromImage(self.frame))
+                    self.display_text.setPixmap(
+                        QtGui.QPixmap.fromImage(self.frame))
                     self.repaint()
                 self.frame = None
                 if frame[u'trans'] is not None:
-                    self.display_text.setPixmap(QtGui.QPixmap.fromImage(frame[u'trans']))
+                    self.display_text.setPixmap(
+                        QtGui.QPixmap.fromImage(frame[u'trans']))
                     self.repaint()
                     self.frame = frame[u'trans']
-                self.display_text.setPixmap(QtGui.QPixmap.fromImage(frame[u'main']))
+                self.display_text.setPixmap(
+                    QtGui.QPixmap.fromImage(frame[u'main']))
                 self.display_frame = frame[u'main']
                 self.repaint()
             else:
@@ -282,7 +285,8 @@
         if blanked:
             self.displayBlank = True
             if blankType == HideMode.Blank:
-                self.display_text.setPixmap(QtGui.QPixmap.fromImage(self.blankFrame))
+                self.display_text.setPixmap(
+                    QtGui.QPixmap.fromImage(self.blankFrame))
             elif blankType == HideMode.Theme:
                 theme = self.parent.RenderManager.renderer.bg_frame
                 if not theme:

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2010-04-21 21:56:48 +0000
+++ openlp/core/ui/mainwindow.py	2010-04-28 03:18:16 +0000
@@ -28,12 +28,11 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.ui import AboutForm, SettingsForm,  \
-    ServiceManager, ThemeManager, SlideController, \
-    PluginForm, MediaDockManager, DisplayManager
-from openlp.core.lib import RenderManager, PluginConfig, build_icon, \
-    OpenLPDockWidget, SettingsManager, PluginManager, Receiver, str_to_bool
-from openlp.core.utils import check_latest_version, AppLocation
+from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \
+    ThemeManager, SlideController, PluginForm, MediaDockManager, DisplayManager
+from openlp.core.lib import RenderManager, build_icon, OpenLPDockWidget, \
+    SettingsManager, PluginManager, Receiver
+from openlp.core.utils import check_latest_version, AppLocation, add_actions
 
 log = logging.getLogger(__name__)
 
@@ -57,11 +56,10 @@
     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, app_version, generalConfig):
+    def __init__(self, parent, app_version):
         QtCore.QThread.__init__(self, parent)
         self.parent = parent
         self.app_version = app_version
-        self.generalConfig = generalConfig
 
     def run(self):
         """
@@ -69,7 +67,7 @@
         """
         time.sleep(1)
         Receiver.send_message(u'maindisplay_blank_check')
-        version = check_latest_version(self.generalConfig, self.app_version)
+        version = check_latest_version(self.app_version)
         #new version has arrived
         if version != self.app_version[u'full']:
             Receiver.send_message(u'openlp_version_check', u'%s' % version)
@@ -163,7 +161,6 @@
         self.MediaManagerDock.setWidget(self.MediaManagerContents)
         MainWindow.addDockWidget(
             QtCore.Qt.DockWidgetArea(1), self.MediaManagerDock)
-        self.MediaManagerDock.setVisible(self.settingsmanager.showMediaManager)
         # Create the service manager
         self.ServiceManagerDock = OpenLPDockWidget(MainWindow)
         ServiceManagerIcon = build_icon(u':/system/system_servicemanager.png')
@@ -175,18 +172,17 @@
         self.ServiceManagerDock.setWidget(self.ServiceManagerContents)
         MainWindow.addDockWidget(
             QtCore.Qt.DockWidgetArea(2), self.ServiceManagerDock)
-        self.ServiceManagerDock.setVisible(
-            self.settingsmanager.showServiceManager)
         # Create the theme manager
         self.ThemeManagerDock = OpenLPDockWidget(MainWindow)
         ThemeManagerIcon = build_icon(u':/system/system_thememanager.png')
         self.ThemeManagerDock.setWindowIcon(ThemeManagerIcon)
         self.ThemeManagerDock.setObjectName(u'ThemeManagerDock')
+        self.ThemeManagerDock.setMinimumWidth(
+            self.settingsmanager.mainwindow_right)
         self.ThemeManagerContents = ThemeManager(self)
         self.ThemeManagerDock.setWidget(self.ThemeManagerContents)
         MainWindow.addDockWidget(
             QtCore.Qt.DockWidgetArea(2), self.ThemeManagerDock)
-        self.ThemeManagerDock.setVisible(self.settingsmanager.showThemeManager)
         # Create the menu items
         self.FileNewItem = QtGui.QAction(MainWindow)
         self.FileNewItem.setIcon(
@@ -225,20 +221,18 @@
         self.OptionsSettingsItem.setObjectName(u'OptionsSettingsItem')
         self.ViewMediaManagerItem = QtGui.QAction(MainWindow)
         self.ViewMediaManagerItem.setCheckable(True)
-        self.ViewMediaManagerItem.setChecked(
-            self.settingsmanager.showMediaManager)
+        self.ViewMediaManagerItem.setChecked(self.MediaManagerDock.isVisible())
         self.ViewMediaManagerItem.setIcon(MediaManagerIcon)
         self.ViewMediaManagerItem.setObjectName(u'ViewMediaManagerItem')
         self.ViewThemeManagerItem = QtGui.QAction(MainWindow)
         self.ViewThemeManagerItem.setCheckable(True)
-        self.ViewThemeManagerItem.setChecked(
-            self.settingsmanager.showThemeManager)
+        self.ViewThemeManagerItem.setChecked(self.ThemeManagerDock.isVisible())
         self.ViewThemeManagerItem.setIcon(ThemeManagerIcon)
         self.ViewThemeManagerItem.setObjectName(u'ViewThemeManagerItem')
         self.ViewServiceManagerItem = QtGui.QAction(MainWindow)
         self.ViewServiceManagerItem.setCheckable(True)
         self.ViewServiceManagerItem.setChecked(
-            self.settingsmanager.showServiceManager)
+            self.ServiceManagerDock.isVisible())
         self.ViewServiceManagerItem.setIcon(ServiceManagerIcon)
         self.ViewServiceManagerItem.setObjectName(u'ViewServiceManagerItem')
         self.PluginItem = QtGui.QAction(MainWindow)
@@ -273,50 +267,36 @@
             self.settingsmanager.showPreviewPanel)
         self.ModeLiveItem = QtGui.QAction(MainWindow)
         self.ModeLiveItem.setObjectName(u'ModeLiveItem')
-        self.FileImportMenu.addAction(self.ImportThemeItem)
-        self.FileImportMenu.addAction(self.ImportLanguageItem)
-        self.FileExportMenu.addAction(self.ExportThemeItem)
-        self.FileExportMenu.addAction(self.ExportLanguageItem)
-        self.FileMenu.addAction(self.FileNewItem)
-        self.FileMenu.addAction(self.FileOpenItem)
-        self.FileMenu.addAction(self.FileSaveItem)
-        self.FileMenu.addAction(self.FileSaveAsItem)
-        self.FileMenu.addSeparator()
-        self.FileMenu.addAction(self.FileImportMenu.menuAction())
-        self.FileMenu.addAction(self.FileExportMenu.menuAction())
-        self.FileMenu.addSeparator()
-        self.FileMenu.addAction(self.FileExitItem)
-        self.ViewModeMenu.addAction(self.ModeLiveItem)
-        self.OptionsViewMenu.addAction(self.ViewModeMenu.menuAction())
-        self.OptionsViewMenu.addSeparator()
-        self.OptionsViewMenu.addAction(self.ViewMediaManagerItem)
-        self.OptionsViewMenu.addAction(self.ViewServiceManagerItem)
-        self.OptionsViewMenu.addAction(self.ViewThemeManagerItem)
-        self.OptionsViewMenu.addSeparator()
-        self.OptionsViewMenu.addAction(self.action_Preview_Panel)
-        self.OptionsLanguageMenu.addAction(self.LanguageEnglishItem)
-        self.OptionsLanguageMenu.addSeparator()
-        self.OptionsLanguageMenu.addAction(self.LanguageTranslateItem)
-        self.OptionsMenu.addAction(self.OptionsLanguageMenu.menuAction())
-        self.OptionsMenu.addAction(self.OptionsViewMenu.menuAction())
-        self.OptionsMenu.addSeparator()
-        self.OptionsMenu.addAction(self.OptionsSettingsItem)
-        self.ToolsMenu.addAction(self.PluginItem)
-        self.ToolsMenu.addSeparator()
-        self.ToolsMenu.addAction(self.ToolsAddToolItem)
-        self.HelpMenu.addAction(self.HelpDocumentationItem)
-        self.HelpMenu.addAction(self.HelpOnlineHelpItem)
-        self.HelpMenu.addSeparator()
-        self.HelpMenu.addAction(self.HelpWebSiteItem)
-        self.HelpMenu.addAction(self.HelpAboutItem)
-        self.MenuBar.addAction(self.FileMenu.menuAction())
-        self.MenuBar.addAction(self.OptionsMenu.menuAction())
-        self.MenuBar.addAction(self.ToolsMenu.menuAction())
-        self.MenuBar.addAction(self.HelpMenu.menuAction())
+        add_actions(self.FileImportMenu,
+            (self.ImportThemeItem, self.ImportLanguageItem))
+        add_actions(self.FileExportMenu,
+            (self.ExportThemeItem, self.ExportLanguageItem))
+        self.FileMenuActions = (self.FileNewItem, self.FileOpenItem,
+            self.FileSaveItem, self.FileSaveAsItem, None,
+            self.FileImportMenu.menuAction(), self.FileExportMenu.menuAction(),
+            self.FileExitItem)
+        add_actions(self.ViewModeMenu, [self.ModeLiveItem])
+        add_actions(self.OptionsViewMenu, (self.ViewModeMenu.menuAction(),
+            None, self.ViewMediaManagerItem, self.ViewServiceManagerItem,
+            self.ViewThemeManagerItem, None, self.action_Preview_Panel))
+        add_actions(self.OptionsLanguageMenu, (self.LanguageEnglishItem, None,
+            self.LanguageTranslateItem))
+        add_actions(self.OptionsMenu, (self.OptionsLanguageMenu.menuAction(),
+            self.OptionsViewMenu.menuAction(), None, self.OptionsSettingsItem))
+        add_actions(self.ToolsMenu,
+            (self.PluginItem, None, self.ToolsAddToolItem))
+        add_actions(self.HelpMenu,
+            (self.HelpDocumentationItem, self.HelpOnlineHelpItem, None,
+            self.HelpWebSiteItem, self.HelpAboutItem))
+        add_actions(self.MenuBar,
+            (self.FileMenu.menuAction(), self.OptionsMenu.menuAction(),
+            self.ToolsMenu.menuAction(), self.HelpMenu.menuAction()))
         # Initialise the translation
         self.retranslateUi(MainWindow)
         self.MediaToolBox.setCurrentIndex(0)
         # Connect up some signals and slots
+        QtCore.QObject.connect(self.FileMenu,
+            QtCore.SIGNAL(u'aboutToShow()'), self.updateFileMenu)
         QtCore.QObject.connect(self.FileExitItem,
             QtCore.SIGNAL(u'triggered()'), MainWindow.close)
         QtCore.QObject.connect(self.ControlSplitter,
@@ -441,16 +421,20 @@
         self.applicationVersion = applicationVersion
         self.serviceNotSaved = False
         self.settingsmanager = SettingsManager(screens)
-        self.generalConfig = PluginConfig(u'General')
         self.displayManager = DisplayManager(screens)
         self.aboutForm = AboutForm(self, applicationVersion)
         self.settingsForm = SettingsForm(self.screens, self, self)
+        self.recentFiles = []
         # Set up the path with plugins
         pluginpath = AppLocation.get_directory(AppLocation.PluginsDir)
         self.plugin_manager = PluginManager(pluginpath)
         self.plugin_helpers = {}
         # Set up the interface
         self.setupUi(self)
+        # Load settings after setupUi so default UI sizes are overwritten
+        self.loadSettings()
+        # Once settings are loaded update FileMenu with recentFiles
+        self.updateFileMenu()
         self.pluginForm = PluginForm(self)
         # Set up signals and slots
         QtCore.QObject.connect(self.ImportThemeItem,
@@ -524,7 +508,7 @@
         self.plugin_helpers[u'live'] = self.LiveController
         self.plugin_helpers[u'render'] = self.RenderManager
         self.plugin_helpers[u'service'] = self.ServiceManagerContents
-        self.plugin_helpers[u'settings'] = self.settingsForm
+        self.plugin_helpers[u'settings form'] = self.settingsForm
         self.plugin_helpers[u'toolbox'] = self.mediaDockManager
         self.plugin_helpers[u'maindisplay'] = self.displayManager.mainDisplay
         self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers)
@@ -571,13 +555,13 @@
         """
         Show the main form, as well as the display form
         """
-        self.showMaximized()
+        QtGui.QWidget.show(self)
         #screen_number = self.getMonitorNumber()
         self.displayManager.setup()
         if self.displayManager.mainDisplay.isVisible():
             self.displayManager.mainDisplay.setFocus()
         self.activateWindow()
-        if str_to_bool(self.generalConfig.get_config(u'auto open', False)):
+        if QtCore.QSettings().value(u'general/auto open', False).toBool():
             self.ServiceManagerContents.onLoadService(True)
 
     def blankCheck(self):
@@ -585,8 +569,8 @@
         Check and display message if screen blank on setup.
         Triggered by delay thread.
         """
-        if str_to_bool(self.generalConfig.get_config(u'screen blank', False)) \
-        and str_to_bool(self.generalConfig.get_config(u'blank warning', False)):
+        if QtCore.QSettings().value(u'general/screen blank', False).toBool() \
+        and QtCore.QSettings().value(u'general/blank warning', False).toBool():
             self.LiveController.onBlankDisplay(True)
             QtGui.QMessageBox.question(self,
                 self.trUtf8('OpenLP Main Display Blanked'),
@@ -598,7 +582,7 @@
         """
         Start an initial setup thread to delay notifications
         """
-        vT = VersionThread(self, self.applicationVersion, self.generalConfig)
+        vT = VersionThread(self, self.applicationVersion)
         vT.start()
 
     def onHelpAboutItemClicked(self):
@@ -666,6 +650,8 @@
         # Call the cleanup method to shutdown plugins.
         log.info(u'cleanup plugins')
         self.plugin_manager.finalise_plugins()
+        # Save settings
+        self.saveSettings()
         #Close down the displays
         self.displayManager.close()
 
@@ -701,22 +687,68 @@
     def toggleMediaManager(self, visible):
         if self.MediaManagerDock.isVisible() != visible:
             self.MediaManagerDock.setVisible(visible)
-            self.settingsmanager.setUIItemVisibility(
-                self.MediaManagerDock.objectName(), visible)
 
     def toggleServiceManager(self, visible):
         if self.ServiceManagerDock.isVisible() != visible:
             self.ServiceManagerDock.setVisible(visible)
-            self.settingsmanager.setUIItemVisibility(
-                self.ServiceManagerDock.objectName(), visible)
 
     def toggleThemeManager(self, visible):
         if self.ThemeManagerDock.isVisible() != visible:
             self.ThemeManagerDock.setVisible(visible)
-            self.settingsmanager.setUIItemVisibility(
-                self.ThemeManagerDock.objectName(), visible)
 
     def togglePreviewPanel(self):
         previewBool = self.PreviewController.Panel.isVisible()
         self.PreviewController.Panel.setVisible(not previewBool)
         self.settingsmanager.togglePreviewPanel(not previewBool)
+
+    def loadSettings(self):
+        log.debug(u'Loading QSettings')
+        settings = QtCore.QSettings()
+        self.recentFiles = settings.value(
+            u'general/recent files').toStringList()
+        self.move(settings.value(u'user interface/main window position',
+            QtCore.QVariant(QtCore.QPoint(0, 0))).toPoint())
+        self.restoreGeometry(settings.value(
+            u'user interface/main window geometry').toByteArray())
+        self.restoreState(
+            settings.value(u'user interface/main window state').toByteArray())
+
+    def saveSettings(self):
+        log.debug(u'Saving QSettings')
+        settings = QtCore.QSettings()
+        recentFiles = QtCore.QVariant(self.recentFiles) \
+            if self.recentFiles else QtCore.QVariant()
+        settings.setValue(u'general/recent files', recentFiles)
+        settings.setValue(u'user interface/main window position',
+            QtCore.QVariant(self.pos()))
+        settings.setValue(u'user interface/main window state',
+            QtCore.QVariant(self.saveState()))
+        settings.setValue(u'user interface/main window geometry',
+            QtCore.QVariant(self.saveGeometry()))
+
+    def updateFileMenu(self):
+        self.FileMenu.clear()
+        add_actions(self.FileMenu, self.FileMenuActions[:-1])
+        existingRecentFiles = []
+        for file in self.recentFiles:
+            if QtCore.QFile.exists(file):
+                existingRecentFiles.append(file)
+        if existingRecentFiles:
+            self.FileMenu.addSeparator()
+            for fileId, filename in enumerate(existingRecentFiles):
+                action = QtGui.QAction(u'&%d %s' % (fileId +1,
+                    QtCore.QFileInfo(filename).fileName()), self)
+                action.setData(QtCore.QVariant(filename))
+                self.connect(action, QtCore.SIGNAL(u'triggered()'),
+                    self.ServiceManagerContents.loadService)
+                self.FileMenu.addAction(action)
+        self.FileMenu.addSeparator()
+        self.FileMenu.addAction(self.FileMenuActions[-1])
+
+    def addRecentFile(self, filename):
+        recentFileCount = QtCore.QSettings().value(
+            u'general/max recent files', 4).toInt()[0]
+        if filename and not self.recentFiles.contains(filename):
+            self.recentFiles.prepend(QtCore.QString(filename))
+            while self.recentFiles.count() > recentFileCount:
+                self.recentFiles.takeLast()

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2010-04-22 21:22:09 +0000
+++ openlp/core/ui/servicemanager.py	2010-04-28 03:18:16 +0000
@@ -32,9 +32,10 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import PluginConfig, OpenLPToolbar, ServiceItem, \
-    contextMenuAction, Receiver, str_to_bool, build_icon, ItemCapabilities
+from openlp.core.lib import OpenLPToolbar, ServiceItem, contextMenuAction, \
+    Receiver, build_icon, ItemCapabilities, SettingsManager
 from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm
+from openlp.core.utils import AppLocation
 
 class ServiceManagerList(QtGui.QTreeWidget):
 
@@ -189,10 +190,9 @@
         QtCore.QObject.connect(Receiver.get_receiver(),
             QtCore.SIGNAL(u'config_updated'), self.regenerateServiceItems)
         # Last little bits of setting up
-        self.config = PluginConfig(u'ServiceManager')
-        self.servicePath = self.config.get_data_path()
-        self.service_theme = unicode(
-            self.config.get_config(u'service theme', u''))
+        self.service_theme = unicode(QtCore.QSettings().value(
+            u'service manager/service theme', u'').toString())
+        self.servicePath = AppLocation.get_section_data_path(u'servicemanager')
         #build the context menu
         self.menu = QtGui.QMenu()
         self.editAction = self.menu.addAction(self.trUtf8('&Edit Item'))
@@ -201,7 +201,8 @@
         self.editAction.setIcon(build_icon(u':/general/general_edit.png'))
         self.notesAction = self.menu.addAction(self.trUtf8('&Notes'))
         self.notesAction.setIcon(build_icon(u':/services/service_notes.png'))
-        self.deleteAction = self.menu.addAction(self.trUtf8('&Delete From Service'))
+        self.deleteAction = self.menu.addAction(
+            self.trUtf8('&Delete From Service'))
         self.deleteAction.setIcon(build_icon(u':/general/general_delete.png'))
         self.sep1 = self.menu.addAction(u'')
         self.sep1.setSeparator(True)
@@ -402,12 +403,11 @@
         Clear the list to create a new service
         """
         if self.parent.serviceNotSaved and \
-            str_to_bool(PluginConfig(u'General').
-                        get_config(u'save prompt', u'False')):
+            QtCore.QSettings().value(u'general/save prompt', False).toBool():
             ret = QtGui.QMessageBox.question(self,
                 self.trUtf8('Save Changes to Service?'),
-                self.trUtf8('Your service is unsaved, do you want to save those '
-                            'changes before creating a new one ?'),
+                self.trUtf8('Your service is unsaved, do you want to save '
+                            'those changes before creating a new one?'),
                 QtGui.QMessageBox.StandardButtons(
                     QtGui.QMessageBox.Cancel |
                     QtGui.QMessageBox.Save),
@@ -486,17 +486,18 @@
         log.debug(u'onSaveService')
         if not quick or self.isNew:
             filename = QtGui.QFileDialog.getSaveFileName(self,
-            self.trUtf8(u'Save Service'), self.config.get_last_dir(),
+            self.trUtf8(u'Save Service'),
+            SettingsManager.get_last_dir(u'servicemanager'),
             self.trUtf8(u'OpenLP Service Files (*.osz)'))
         else:
-            filename = self.config.get_last_dir()
+            filename = SettingsManager.get_last_dir(u'servicemanager')
         if filename:
             splittedFile = filename.split(u'.')
             if splittedFile[-1] != u'osz':
                 filename = filename + u'.osz'
             filename = unicode(filename)
             self.isNew = False
-            self.config.set_last_dir(filename)
+            SettingsManager.set_last_dir(u'servicemanager', filename)
             service = []
             servicefile = filename + u'.osd'
             zip = None
@@ -504,7 +505,8 @@
             try:
                 zip = zipfile.ZipFile(unicode(filename), 'w')
                 for item in self.serviceItems:
-                    service.append({u'serviceitem':item[u'service_item'].get_service_repr()})
+                    service.append({u'serviceitem':item[u'service_item']
+                        .get_service_repr()})
                     if item[u'service_item'].uses_file():
                         for frame in item[u'service_item'].get_frames():
                             path_from = unicode(os.path.join(
@@ -528,27 +530,49 @@
                 pass #if not present do not worry
             name = filename.split(os.path.sep)
             self.serviceName = name[-1]
+            self.parent.addRecentFile(filename)
             self.parent.serviceChanged(True, self.serviceName)
 
     def onQuickSaveService(self):
         self.onSaveService(True)
 
     def onLoadService(self, lastService=False):
+        if lastService:
+            filename = SettingsManager.get_last_dir(u'servicemanager')
+        else:
+            filename = QtGui.QFileDialog.getOpenFileName(
+                self, self.trUtf8('Open Service'),
+                SettingsManager.get_last_dir(u'servicemanager'),
+                u'Services (*.osz)')
+        self.loadService(filename)
+
+    def loadService(self, filename=None):
         """
         Load an existing service from disk and rebuild the serviceitems.  All
         files retrieved from the zip file are placed in a temporary directory
         and will only be used for this service.
         """
-        if lastService:
-            filename = self.config.get_last_dir()
-        else:
-            filename = QtGui.QFileDialog.getOpenFileName(
-                self, self.trUtf8('Open Service'),
-                self.config.get_last_dir(), u'Services (*.osz)')
+        if self.parent.serviceNotSaved:
+            ret = QtGui.QMessageBox.question(self,
+                self.trUtf8('Save Changes to Service?'),
+                self.trUtf8('Your current service is unsaved, do you want to '
+                            'save the changes before opening a new one?'),
+                QtGui.QMessageBox.StandardButtons(
+                    QtGui.QMessageBox.Discard |
+                    QtGui.QMessageBox.Save),
+                QtGui.QMessageBox.Save)
+            if ret == QtGui.QMessageBox.Save:
+                self.onSaveService()
+        if filename is None:
+            action = self.sender()
+            if isinstance(action, QtGui.QAction):
+                filename = action.data().toString()
+            else:
+                return
         filename = unicode(filename)
         name = filename.split(os.path.sep)
         if filename:
-            self.config.set_last_dir(filename)
+            SettingsManager.set_last_dir(u'servicemanager', filename)
             zip = None
             f = None
             try:
@@ -588,6 +612,7 @@
                     zip.close()
         self.isNew = False
         self.serviceName = name[len(name) - 1]
+        self.parent.addRecentFile(filename)
         self.parent.serviceChanged(True, self.serviceName)
 
     def validateItem(self, serviceItem):
@@ -616,7 +641,8 @@
         """
         self.service_theme = unicode(self.ThemeComboBox.currentText())
         self.parent.RenderManager.set_service_theme(self.service_theme)
-        self.config.set_config(u'service theme', self.service_theme)
+        QtCore.QSettings().setValue(u'servicemanager/service theme',
+            QtCore.QVariant(self.service_theme))
         self.regenerateServiceItems()
 
     def regenerateServiceItems(self):
@@ -628,7 +654,8 @@
             self.serviceItems = []
             self.isNew = True
             for item in tempServiceItems:
-                self.addServiceItem(item[u'service_item'], False, item[u'expanded'])
+                self.addServiceItem(
+                    item[u'service_item'], False, item[u'expanded'])
             #Set to False as items may have changed rendering
             #does not impact the saved song so True may also be valid
             self.parent.serviceChanged(False, self.serviceName)
@@ -697,11 +724,11 @@
         item, count = self.findServiceItem()
         self.parent.LiveController.addServiceManagerItem(
             self.serviceItems[item][u'service_item'], count)
-        if str_to_bool(PluginConfig(u'General').
-                        get_config(u'auto preview', u'False')):
+        if QtCore.QSettings().value(u'general/auto preview', False).toBool():
             item += 1
             if self.serviceItems and item < len(self.serviceItems) and \
-                self.serviceItems[item][u'service_item'].is_capable(ItemCapabilities.AllowsPreview):
+                self.serviceItems[item][u'service_item'].is_capable(
+                ItemCapabilities.AllowsPreview):
                     self.parent.PreviewController.addServiceManagerItem(
                         self.serviceItems[item][u'service_item'], 0)
 

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2010-04-22 21:22:09 +0000
+++ openlp/core/ui/slidecontroller.py	2010-04-28 03:18:16 +0000
@@ -41,8 +41,7 @@
     Blank = 1
     Theme = 2
 
-from openlp.core.lib import OpenLPToolbar, Receiver, str_to_bool, \
-    PluginConfig, resize_image
+from openlp.core.lib import OpenLPToolbar, Receiver, resize_image
 
 log = logging.getLogger(__name__)
 
@@ -96,7 +95,7 @@
         self.settingsmanager = settingsmanager
         self.isLive = isLive
         self.parent = parent
-        self.songsconfig = PluginConfig(u'Songs')
+        self.mainDisplay = self.parent.displayManager.mainDisplay
         self.loop_list = [
             u'Start Loop',
             u'Stop Loop',
@@ -153,13 +152,15 @@
         self.PreviewListWidget.horizontalHeader().setVisible(False)
         self.PreviewListWidget.verticalHeader().setVisible(False)
         self.PreviewListWidget.setColumnWidth(1, self.labelWidth)
-        self.PreviewListWidget.setColumnWidth(1, self.Controller.width() - self.labelWidth)
+        self.PreviewListWidget.setColumnWidth(
+            1, self.Controller.width() - self.labelWidth)
         self.PreviewListWidget.isLive = self.isLive
         self.PreviewListWidget.setObjectName(u'PreviewListWidget')
         self.PreviewListWidget.setSelectionBehavior(1)
         self.PreviewListWidget.setEditTriggers(
             QtGui.QAbstractItemView.NoEditTriggers)
-        self.PreviewListWidget.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+        self.PreviewListWidget.setHorizontalScrollBarPolicy(
+            QtCore.Qt.ScrollBarAlwaysOff)
         self.PreviewListWidget.setAlternatingRowColors(True)
         self.ControllerLayout.addWidget(self.PreviewListWidget)
         # Build the full toolbar
@@ -221,7 +222,8 @@
             self.Toolbar.addToolbarWidget(
                 u'Image SpinBox', self.DelaySpinBox)
             self.DelaySpinBox.setSuffix(self.trUtf8('s'))
-            self.DelaySpinBox.setToolTip(self.trUtf8('Delay between slides in seconds'))
+            self.DelaySpinBox.setToolTip(
+                self.trUtf8('Delay between slides in seconds'))
         self.ControllerLayout.addWidget(self.Toolbar)
         #Build a Media ToolBar
         self.Mediabar = OpenLPToolbar(self)
@@ -394,7 +396,7 @@
         self.Toolbar.makeWidgetsInvisible(self.loop_list)
         if item.is_text():
             self.Toolbar.makeWidgetsInvisible(self.loop_list)
-            if str_to_bool(self.songsconfig.get_config(u'show songbar', True)) \
+            if QtCore.QSettings().value(u'songs/show songbar', True).toBool() \
                 and len(self.slideList) > 0:
                 self.Toolbar.makeWidgetsVisible([u'Song Menu'])
         if item.is_capable(ItemCapabilities.AllowsLoop) and \
@@ -403,7 +405,7 @@
         if item.is_media():
             self.Toolbar.setVisible(False)
             self.Mediabar.setVisible(True)
-            #self.volumeSlider.setAudioOutput(self.parent.mainDisplay.videoDisplay.audio)
+            #self.volumeSlider.setAudioOutput(self.mainDisplay.videoDisplay.audio)
 
     def enablePreviewToolBar(self, item):
         """
@@ -583,8 +585,8 @@
         if force:
             self.blankButton.setChecked(True)
         self.blankScreen(HideMode.Blank, self.blankButton.isChecked())
-        self.parent.generalConfig.set_config(u'screen blank',
-            self.blankButton.isChecked())
+        QtCore.QSettings().setValue(u'general/screen blank',
+            QtCore.QVariant(self.blankButton.isChecked()))
 
     def onThemeDisplay(self, force=False):
         """
@@ -603,9 +605,9 @@
         if force:
             self.hideButton.setChecked(True)
         if self.hideButton.isChecked():
-            self.parent.mainDisplay.hideDisplay()
+            self.mainDisplay.hideDisplay()
         else:
-            self.parent.mainDisplay.showDisplay()
+            self.mainDisplay.showDisplay()
 
     def blankScreen(self, blankType, blanked=False):
         """
@@ -613,15 +615,16 @@
         """
         if self.serviceItem is not None:
             if blanked:
-                Receiver.send_message(u'%s_blank' % self.serviceItem.name.lower(), 
+                Receiver.send_message(
+                    u'%s_blank' % self.serviceItem.name.lower(),
                     [self.serviceItem, self.isLive])
             else:
                 Receiver.send_message(u'%s_unblank' 
                     % self.serviceItem.name.lower(), 
                     [self.serviceItem, self.isLive])
-            self.parent.mainDisplay.blankDisplay(blankType, blanked)
+            self.mainDisplay.blankDisplay(blankType, blanked)
         else:
-            self.parent.mainDisplay.blankDisplay(blankType, blanked)
+            self.mainDisplay.blankDisplay(blankType, blanked)
 
     def onSlideSelected(self):
         """
@@ -642,12 +645,15 @@
                     self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame))
                 else:
                     if isinstance(frame[u'main'], basestring):
-                        self.SlidePreview.setPixmap(QtGui.QPixmap(frame[u'main']))
+                        self.SlidePreview.setPixmap(
+                            QtGui.QPixmap(frame[u'main']))
                     else:
-                        self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[u'main']))
-                log.log(15, u'Slide Rendering took %4s' % (time.time() - before))
+                        self.SlidePreview.setPixmap(
+                            QtGui.QPixmap.fromImage(frame[u'main']))
+                log.log(
+                    15, u'Slide Rendering took %4s' % (time.time() - before))
                 if self.isLive:
-                    self.parent.displayManager.mainDisplay.frameView(frame, True)
+                    self.mainDisplay.frameView(frame, True)
             self.selectedRow = row
 
     def onSlideChange(self, row):

=== modified file 'openlp/core/ui/thememanager.py'
--- openlp/core/ui/thememanager.py	2010-04-20 22:00:55 +0000
+++ openlp/core/ui/thememanager.py	2010-04-28 03:18:16 +0000
@@ -33,10 +33,10 @@
 
 from openlp.core.ui import AmendThemeForm
 from openlp.core.theme import Theme
-from openlp.core.lib import PluginConfig, OpenLPToolbar, contextMenuAction, \
+from openlp.core.lib import OpenLPToolbar, contextMenuAction, \
     ThemeXML, str_to_bool, get_text_file_string, build_icon, Receiver, \
-    contextMenuSeparator
-from openlp.core.utils import ConfigHelper
+    contextMenuSeparator, SettingsManager
+from openlp.core.utils import AppLocation
 
 log = logging.getLogger(__name__)
 
@@ -105,16 +105,14 @@
             QtCore.SIGNAL(u'theme_update_global'), self.changeGlobalFromTab)
         #Variables
         self.themelist = []
-        self.path = os.path.join(ConfigHelper.get_data_path(), u'themes')
+        self.path = AppLocation.get_section_data_path(u'themes')
         self.checkThemesExists(self.path)
         self.thumbPath = os.path.join(self.path, u'.thumbnails')
         self.checkThemesExists(self.thumbPath)
         self.amendThemeForm.path = self.path
         # Last little bits of setting up
-        self.config = PluginConfig(u'themes')
-        self.servicePath = self.config.get_data_path()
-        self.global_theme = unicode(
-            self.config.get_config(u'global theme', u''))
+        self.global_theme = unicode(QtCore.QSettings().value(
+            u'themes/global theme', u'').toString())
 
     def changeGlobalFromTab(self, themeName):
         log.debug(u'changeGlobalFromTab %s', themeName)
@@ -146,7 +144,8 @@
                     self.ThemeListWidget.item(count).text())
                 name = u'%s (%s)' % (self.global_theme, self.trUtf8('default'))
                 self.ThemeListWidget.item(count).setText(name)
-                self.config.set_config(u'global theme', self.global_theme)
+                QtCore.QSettings().setValue(u'themes/global theme',
+                    QtCore.QVariant(self.global_theme))
                 Receiver.send_message(u'theme_update_global', self.global_theme)
                 self.pushThemes()
 
@@ -167,8 +166,8 @@
             self.amendThemeForm.exec_()
 
     def onDeleteTheme(self):
-        self.global_theme = unicode(
-            self.config.get_config(u'global theme', u''))
+        self.global_theme = unicode(QtCore.QSettings().value(
+            u'themes/global theme', u'').toString())
         item = self.ThemeListWidget.currentItem()
         if item:
             theme = unicode(item.text())
@@ -221,10 +220,10 @@
         theme = unicode(item.data(QtCore.Qt.UserRole).toString())
         path = QtGui.QFileDialog.getExistingDirectory(self,
             unicode(self.trUtf8('Save Theme - (%s)')) %  theme,
-            self.config.get_last_dir(1) )
+            SettingsManager.get_last_dir(u'themes', 1))
         path = unicode(path)
         if path:
-            self.config.set_last_dir(path, 1)
+            SettingsManager.set_last_dir(u'themes', path, 1)
             themePath = os.path.join(path, theme + u'.theme')
             zip = None
             try:
@@ -243,11 +242,11 @@
     def onImportTheme(self):
         files = QtGui.QFileDialog.getOpenFileNames(
             self, self.trUtf8('Select Theme Import File'),
-            self.config.get_last_dir(), u'Theme (*.*)')
+            SettingsManager.get_last_dir(u'themes'), u'Theme (*.*)')
         log.info(u'New Themes %s', unicode(files))
         if files:
             for file in files:
-                self.config.set_last_dir(unicode(file))
+                SettingsManager.set_last_dir(u'themes', unicode(file))
                 self.unzipTheme(file, self.path)
         self.loadThemes()
 

=== modified file 'openlp/core/ui/themestab.py'
--- openlp/core/ui/themestab.py	2010-04-16 07:31:01 +0000
+++ openlp/core/ui/themestab.py	2010-04-28 03:18:16 +0000
@@ -123,9 +123,11 @@
             'songs.'))
 
     def load(self):
-        self.theme_level = int(self.config.get_config(u'theme level',
-            ThemeLevel.Global))
-        self.global_theme = self.config.get_config(u'global theme', u'')
+        settings = QtCore.QSettings()
+        self.theme_level = settings.value(
+            u'themes/theme level', ThemeLevel.Global).toInt()[0]
+        self.global_theme = unicode(settings.value(
+            u'themes/global theme', u'').toString())
         if self.theme_level == ThemeLevel.Global:
             self.GlobalLevelRadioButton.setChecked(True)
         elif self.theme_level == ThemeLevel.Service:
@@ -134,8 +136,11 @@
             self.SongLevelRadioButton.setChecked(True)
 
     def save(self):
-        self.config.set_config(u'theme level', self.theme_level)
-        self.config.set_config(u'global theme',self.global_theme)
+        settings = QtCore.QSettings()
+        settings.setValue(u'themes/theme level',
+            QtCore.QVariant(self.theme_level))
+        settings.setValue(u'themes/global theme',
+            QtCore.QVariant(self.global_theme))
         Receiver.send_message(u'theme_update_global', self.global_theme)
         self.parent.RenderManager.set_global_theme(
             self.global_theme, self.theme_level)
@@ -169,7 +174,8 @@
         Called from ThemeManager when the Themes have changed
         """
         #reload as may have been triggered by the ThemeManager
-        self.global_theme = self.config.get_config(u'global theme', u'')
+        self.global_theme = unicode(QtCore.QSettings().value(
+            u'themes/global theme', u'').toString())
         self.DefaultComboBox.clear()
         for theme in theme_list:
             self.DefaultComboBox.addItem(theme)

=== modified file 'openlp/core/utils/__init__.py'
--- openlp/core/utils/__init__.py	2010-04-10 22:24:22 +0000
+++ openlp/core/utils/__init__.py	2010-04-28 03:18:16 +0000
@@ -64,7 +64,8 @@
             else:
                 try:
                     from xdg import BaseDirectory
-                    path = os.path.join(BaseDirectory.xdg_config_home, u'openlp')
+                    path = os.path.join(
+                        BaseDirectory.xdg_config_home, u'openlp')
                 except ImportError:
                     path = os.path.join(os.getenv(u'HOME'), u'.openlp')
             return path
@@ -97,27 +98,42 @@
                 plugin_path = os.path.split(openlp.__file__)[0]
             return plugin_path
 
-
-def check_latest_version(config, current_version):
+    @staticmethod
+    def get_data_path():
+        path = AppLocation.get_directory(AppLocation.DataDir)
+        if not os.path.exists(path):
+            os.makedirs(path)
+        return path
+
+    @staticmethod
+    def get_section_data_path(section):
+        data_path = AppLocation.get_data_path()
+        path = os.path.join(data_path, section)
+        if not os.path.exists(path):
+            os.makedirs(path)
+        return path
+
+
+def check_latest_version(current_version):
     """
     Check the latest version of OpenLP against the version file on the OpenLP
     site.
 
-    ``config``
-        The OpenLP config object.
-
     ``current_version``
         The current version of OpenLP.
     """
     version_string = current_version[u'full']
-    #set to prod in the distribution confif file.
-    last_test = config.get_config(u'last version test', datetime.now().date())
+    #set to prod in the distribution config file.
+    last_test = unicode(QtCore.QSettings().value(u'general/last version test',
+        datetime.now().date()).toString())
     this_test = unicode(datetime.now().date())
-    config.set_config(u'last version test', this_test)
+    QtCore.QSettings().setValue(
+        u'general/last version test', QtCore.QVariant(this_test))
     if last_test != this_test:
         version_string = u''
         if current_version[u'build']:
-            req = urllib2.Request(u'http://www.openlp.org/files/dev_version.txt')
+            req = urllib2.Request(
+                u'http://www.openlp.org/files/dev_version.txt')
         else:
             req = urllib2.Request(u'http://www.openlp.org/files/version.txt')
         req.add_header(u'User-Agent', u'OpenLP/%s' % current_version[u'full'])
@@ -149,7 +165,21 @@
         string = string_to_unicode(string)
     return string
 
-from registry import Registry
-from confighelper import ConfigHelper
-
-__all__ = [u'Registry', u'ConfigHelper', u'AppLocation', u'check_latest_version']
+def add_actions(target, actions):
+    """
+    Adds multiple actions to a menu or toolbar in one command.
+
+    ``target``
+        The menu or toolbar to add actions to.
+
+    ``actions``
+        The actions to be added.  An action consisting of the keyword 'None'
+        will result in a separator being inserted into the target.
+    """
+    for action in actions:
+        if action is None:
+            target.addSeparator()
+        else:
+            target.addAction(action)
+
+__all__ = [u'AppLocation', u'check_latest_version', u'add_actions']

=== removed file 'openlp/core/utils/confighelper.py'
--- openlp/core/utils/confighelper.py	2010-03-21 23:58:01 +0000
+++ openlp/core/utils/confighelper.py	1970-01-01 00:00:00 +0000
@@ -1,76 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
-
-###############################################################################
-# OpenLP - Open Source Lyrics Projection                                      #
-# --------------------------------------------------------------------------- #
-# Copyright (c) 2008-2010 Raoul Snyman                                        #
-# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
-# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin      #
-# Thompson, Jon Tibble, Carsten Tinggaard                                     #
-# --------------------------------------------------------------------------- #
-# This program is free software; you can redistribute it and/or modify it     #
-# under the terms of the GNU General Public License as published by the Free  #
-# Software Foundation; version 2 of the License.                              #
-#                                                                             #
-# This program is distributed in the hope that it will be useful, but WITHOUT #
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
-# more details.                                                               #
-#                                                                             #
-# You should have received a copy of the GNU General Public License along     #
-# with this program; if not, write to the Free Software Foundation, Inc., 59  #
-# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
-###############################################################################
-
-import os
-
-from openlp.core.utils import AppLocation
-from openlp.core.utils.registry import Registry
-
-class ConfigHelper(object):
-    """
-    Utility Helper to allow classes to find directories in a standard manner.
-    """
-    __registry__ = None
-
-    @staticmethod
-    def get_data_path():
-        path = AppLocation.get_directory(AppLocation.DataDir)
-        if not os.path.exists(path):
-            os.makedirs(path)
-        return path
-
-    @staticmethod
-    def get_config(section, key, default=None):
-        reg = ConfigHelper.get_registry()
-        if reg.has_value(section, key):
-            return reg.get_value(section, key, default)
-        else:
-            if default:
-                ConfigHelper.set_config(section, key, default)
-            return default
-
-    @staticmethod
-    def set_config(section, key, value):
-        reg = ConfigHelper.get_registry()
-        if not reg.has_section(section):
-            reg.create_section(section)
-        return reg.set_value(section, key, value)
-
-    @staticmethod
-    def delete_config(section, key):
-        reg = ConfigHelper.get_registry()
-        reg.delete_value(section, key)
-
-    @staticmethod
-    def get_registry():
-        """
-        This static method loads the appropriate registry class based on the
-        current operating system, and returns an instantiation of that class.
-        """
-        if ConfigHelper.__registry__ is None:
-            config_path = AppLocation.get_directory(AppLocation.ConfigDir)
-            ConfigHelper.__registry__ = Registry(config_path)
-        return ConfigHelper.__registry__
-

=== removed file 'openlp/core/utils/registry.py'
--- openlp/core/utils/registry.py	2010-04-14 17:12:30 +0000
+++ openlp/core/utils/registry.py	1970-01-01 00:00:00 +0000
@@ -1,134 +0,0 @@
-# -*- coding: utf-8 -*-
-# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
-
-###############################################################################
-# OpenLP - Open Source Lyrics Projection                                      #
-# --------------------------------------------------------------------------- #
-# Copyright (c) 2008-2010 Raoul Snyman                                        #
-# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael      #
-# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin      #
-# Thompson, Jon Tibble, Carsten Tinggaard                                     #
-# --------------------------------------------------------------------------- #
-# This program is free software; you can redistribute it and/or modify it     #
-# under the terms of the GNU General Public License as published by the Free  #
-# Software Foundation; version 2 of the License.                              #
-#                                                                             #
-# This program is distributed in the hope that it will be useful, but WITHOUT #
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or       #
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for    #
-# more details.                                                               #
-#                                                                             #
-# You should have received a copy of the GNU General Public License along     #
-# with this program; if not, write to the Free Software Foundation, Inc., 59  #
-# Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
-###############################################################################
-
-import os
-
-from ConfigParser import SafeConfigParser
-
-class Registry(object):
-    """
-    The Registry class is a high-level class for working with a configuration
-    file.
-    """
-    def __init__(self, dir):
-        self.config = SafeConfigParser()
-        self.file_name = os.path.join(dir, u'openlp.conf')
-        self._load()
-
-    def has_value(self, section, key):
-        """
-        Check if a value exists.
-        """
-        return self.config.has_option(section.encode('utf-8'), 
-            key.encode('utf-8'))
-
-    def get_value(self, section, key, default=None):
-        """
-        Get a single value from the registry.
-        """
-        try:
-            if self.config.get(section.encode('utf-8'), key.encode('utf-8')):
-                return self.config.get(section.encode('utf-8'), 
-                    key.encode('utf-8')).decode('utf-8')
-            else:
-                return default
-        except:
-            return default
-
-    def set_value(self, section, key, value):
-        """
-        Set a single value in the registry.
-        """
-        try :
-            self.config.set(section.encode('utf-8'), key.encode('utf-8'), 
-                unicode(value).encode('utf-8'))
-            return self._save()
-        except:
-            return False
-
-    def delete_value(self, section, key):
-        """
-        Delete a single value from the registry.
-        """
-        try:
-            self.config.remove_option(section.encode('utf-8'), 
-                key.encode('utf-8'))
-            return self._save()
-        except:
-            return False
-
-    def has_section(self, section):
-        """
-        Check if a section exists.
-        """
-        return self.config.has_section(section.encode('utf-8'))
-
-    def create_section(self, section):
-        """
-        Create a new section in the registry.
-        """
-        try:
-            self.config.add_section(section.encode('utf-8'))
-            return self._save()
-        except:
-            return False
-
-    def delete_section(self, section):
-        """
-        Delete a section (including all values).
-        """
-        try:
-            self.config.remove_section(section.encode('utf-8'))
-            return self._save()
-        except:
-            return False
-
-    def _load(self):
-        if not os.path.isfile(self.file_name):
-            return False
-        file_handle = None
-        try:
-            file_handle = open(self.file_name, u'r')
-            self.config.readfp(file_handle)
-            return True
-        except:
-            return False
-        finally:
-            if file_handle:
-                file_handle.close()
-
-    def _save(self):
-        file_handle = None
-        try:
-            if not os.path.exists(os.path.dirname(self.file_name)):
-                os.makedirs(os.path.dirname(self.file_name))
-            file_handle = open(self.file_name, u'w')
-            self.config.write(file_handle)
-            return self._load()
-        except:
-            return False
-        finally:
-            if file_handle:
-                file_handle.close()

=== modified file 'openlp/migration/migratebibles.py'
--- openlp/migration/migratebibles.py	2010-03-23 16:00:52 +0000
+++ openlp/migration/migratebibles.py	2010-04-28 03:18:16 +0000
@@ -31,7 +31,8 @@
 from sqlalchemy import create_engine
 from sqlalchemy.orm import scoped_session, sessionmaker, mapper
 
-from openlp.core.lib import PluginConfig
+from openlp.core.lib import SettingsManager
+from openlp.core.utils import AppLocation
 from openlp.plugins.bibles.lib.models import *
     
 class BaseModel(object):
@@ -111,9 +112,8 @@
 class MigrateBibles():
     def __init__(self, display):
         self.display = display
-        self.config = PluginConfig(u'Bibles')
-        self.data_path = self.config.get_data_path()
-        self.database_files = self.config.get_files(u'sqlite')
+        self.data_path = AppLocation.get_section_data_path(u'bibles')
+        self.database_files = SettingsManager.get_files(u'bibles', u'.sqlite')
         print self.database_files
 
     def progress(self, text):

=== modified file 'openlp/migration/migratefiles.py'
--- openlp/migration/migratefiles.py	2010-03-21 23:58:01 +0000
+++ openlp/migration/migratefiles.py	2010-04-28 03:18:16 +0000
@@ -23,7 +23,7 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 
-from openlp.core.utils import ConfigHelper
+from openlp.core.utils import AppLocation
 
 class MigrateFiles():
     def __init__(self, display):
@@ -36,14 +36,19 @@
 
     def _initial_setup(self):
         self.display.output(u'Initial Setup started')
-        ConfigHelper.get_data_path()
-        self.display.sub_output(u'Config created')
-        ConfigHelper.get_config(u'bible', u'data path')
-        self.display.sub_output(u'Config created')
-        ConfigHelper.get_config(u'videos', u'data path')
-        self.display.sub_output(u'videos created')
-        ConfigHelper.get_config(u'images', u'data path')
+        data_path = AppLocation.get_data_path()
+        print data_path
+        self.display.sub_output(u'Config created')
+        bibles_path = AppLocation.get_section_data_path(u'bibles')
+        print bibles_path
+        self.display.sub_output(u'Config created')
+        # Media doesn't use a directory like the other plugins.
+        #media_path = AppLocation.get_section_data_path(u'media')
+        #self.display.sub_output(u'videos created')
+        images_path = AppLocation.get_section_data_path(u'images')
+        print images_path
         self.display.sub_output(u'images created')
-        ConfigHelper.get_config(u'presentations', u'data path')
+        presentations_path = AppLocation.get_section_data_path(u'presentations')
+        print presentations_path
         self.display.sub_output(u'presentations created')
         self.display.output(u'Initial Setup finished')

=== modified file 'openlp/migration/migratesongs.py'
--- openlp/migration/migratesongs.py	2010-03-21 23:58:01 +0000
+++ openlp/migration/migratesongs.py	2010-04-28 03:18:16 +0000
@@ -31,7 +31,8 @@
 from sqlalchemy import create_engine
 from sqlalchemy.orm import scoped_session, sessionmaker, mapper, relation
 
-from openlp.core.lib import PluginConfig
+from openlp.core.lib import SettingsManager
+from openlp.core.utils import AppLocation
 from openlp.plugins.songs.lib.models import metadata, songs_table, Song, \
     Author, Topic, Book
 from openlp.plugins.songs.lib.tables import *
@@ -111,9 +112,8 @@
 class MigrateSongs():
     def __init__(self, display):
         self.display = display
-        self.config = PluginConfig(u'Songs')
-        self.data_path = self.config.get_data_path()
-        self.database_files = self.config.get_files(u'sqlite')
+        self.data_path = AppLocation.get_section_data_path(u'songs')
+        self.database_files = SettingsManager.get_files(u'songs', u'.sqlite')
         print self.database_files
 
     def process(self):

=== modified file 'openlp/plugins/alerts/alertsplugin.py'
--- openlp/plugins/alerts/alertsplugin.py	2010-04-21 21:56:48 +0000
+++ openlp/plugins/alerts/alertsplugin.py	2010-04-28 03:18:16 +0000
@@ -27,7 +27,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Plugin, build_icon, PluginStatus, Receiver
+from openlp.core.lib import Plugin, build_icon, PluginStatus
 from openlp.plugins.alerts.lib import AlertsManager, DBManager
 from openlp.plugins.alerts.forms import AlertsTab, AlertForm
 
@@ -41,7 +41,7 @@
         self.weight = -3
         self.icon = build_icon(u':/media/media_image.png')
         self.alertsmanager = AlertsManager(self)
-        self.manager = DBManager(self.config)
+        self.manager = DBManager()
         self.alertForm = AlertForm(self.manager, self)
         self.status = PluginStatus.Active
 
@@ -83,7 +83,8 @@
 
     def togglealertsState(self):
         self.alertsActive = not self.alertsActive
-        self.config.set_config(u'active', self.alertsActive)
+        QtCore.QSettings().setValue(
+            u'alerts/active', QtCore.QVariant(self.alertsActive))
 
     def onAlertsTrigger(self):
         self.alertForm.loadList()

=== modified file 'openlp/plugins/alerts/forms/alertstab.py'
--- openlp/plugins/alerts/forms/alertstab.py	2010-04-21 17:22:47 +0000
+++ openlp/plugins/alerts/forms/alertstab.py	2010-04-28 03:18:16 +0000
@@ -25,16 +25,16 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, str_to_bool
+from openlp.core.lib import SettingsTab
 
 class AlertsTab(SettingsTab):
     """
     AlertsTab is the alerts settings tab in the settings dialog.
     """
-    def __init__(self, parent, section=None):
+    def __init__(self, parent):
         self.parent = parent
         self.manager = parent.manager
-        SettingsTab.__init__(self, parent.name, section)
+        SettingsTab.__init__(self, parent.name)
 
     def setupUi(self):
         self.setObjectName(u'AlertsTab')
@@ -228,15 +228,16 @@
         self.updateDisplay()
 
     def load(self):
-        self.timeout = int(self.config.get_config(u'timeout', 5))
-        self.font_color = unicode(
-            self.config.get_config(u'font color', u'#ffffff'))
-        self.font_size = int(self.config.get_config(u'font size', 40))
-        self.bg_color = unicode(
-            self.config.get_config(u'background color', u'#660000'))
-        self.font_face = unicode(
-            self.config.get_config(u'font face', QtGui.QFont().family()))
-        self.location = int(self.config.get_config(u'location', 0))
+        settings = QtCore.QSettings()
+        self.timeout = settings.value(u'alerts/timeout', 5).toInt()[0]
+        self.font_color = unicode(settings.value(
+            u'alerts/font color', u'#ffffff').toString())
+        self.font_size = settings.value(u'alerts/font size', 40).toInt()[0]
+        self.bg_color = unicode(settings.value(
+            u'alerts/background color', u'#660000').toString())
+        self.font_face = unicode(settings.value(
+            u'alerts/font face', QtGui.QFont().family()).toString())
+        self.location = settings.value(u'alerts/location', 0).toInt()[0]
         self.FontSizeSpinBox.setValue(self.font_size)
         self.TimeoutSpinBox.setValue(self.timeout)
         self.FontColorButton.setStyleSheet(
@@ -254,14 +255,17 @@
         self.DeleteButton.setEnabled(True)
 
     def save(self):
+        settings = QtCore.QSettings()
         self.font_face = self.FontComboBox.currentFont().family()
-        self.config.set_config(u'background color', unicode(self.bg_color))
-        self.config.set_config(u'font color', unicode(self.font_color))
-        self.config.set_config(u'font size', unicode(self.font_size))
-        self.config.set_config(u'font face', unicode(self.font_face))
-        self.config.set_config(u'timeout', unicode(self.timeout))
-        self.config.set_config(u'location',
-                        unicode(self.LocationComboBox.currentIndex()))
+        settings.setValue(
+            u'alerts/background color', QtCore.QVariant(self.bg_color))
+        settings.setValue(
+            u'alerts/font color', QtCore.QVariant(self.font_color))
+        settings.setValue(u'alerts/font size', QtCore.QVariant(self.font_size))
+        settings.setValue(u'alerts/font face', QtCore.QVariant(self.font_face))
+        settings.setValue(u'alerts/timeout', QtCore.QVariant(self.timeout))
+        settings.setValue(u'alerts/location',
+            QtCore.QVariant(self.LocationComboBox.currentIndex()))
 
     def updateDisplay(self):
         font = QtGui.QFont()

=== modified file 'openlp/plugins/alerts/lib/manager.py'
--- openlp/plugins/alerts/lib/manager.py	2010-03-21 23:58:01 +0000
+++ openlp/plugins/alerts/lib/manager.py	2010-04-28 03:18:16 +0000
@@ -25,6 +25,9 @@
 
 import logging
 
+from PyQt4 import QtCore
+
+from openlp.core.utils import AppLocation
 from openlp.plugins.alerts.lib.models import init_models, metadata, AlertItem
 
 log = logging.getLogger(__name__)
@@ -36,24 +39,25 @@
     """
     log.info(u'Alerts DB loaded')
 
-    def __init__(self, config):
+    def __init__(self):
         """
         Creates the connection to the database, and creates the tables if they
         don't exist.
         """
-        self.config = config
+        settings = QtCore.QSettings()
         log.debug(u'Alerts Initialising')
         self.db_url = u''
-        db_type = self.config.get_config(u'db type', u'sqlite')
+        db_type = unicode(
+            settings.value(u'alerts/db type', u'sqlite').toString())
         if db_type == u'sqlite':
             self.db_url = u'sqlite:///%s/alerts.sqlite' % \
-                self.config.get_data_path()
+                AppLocation.get_section_data_path(u'alerts')
         else:
             self.db_url = u'%s://%s:%s@%s/%s' % \
-                (db_type, self.config.get_config(u'db username'),
-                    self.config.get_config(u'db password'),
-                    self.config.get_config(u'db hostname'),
-                    self.config.get_config(u'db database'))
+                (db_type, settings.value(u'alerts/db username'),
+                    settings.value(u'alerts/db password'),
+                    settings.value(u'alerts/db hostname'),
+                    settings.value(u'alerts/db database'))
         self.session = init_models(self.db_url)
         metadata.create_all(checkfirst=True)
 

=== modified file 'openlp/plugins/bibles/bibleplugin.py'
--- openlp/plugins/bibles/bibleplugin.py	2010-03-27 14:53:41 +0000
+++ openlp/plugins/bibles/bibleplugin.py	2010-04-28 03:18:16 +0000
@@ -46,7 +46,7 @@
     def initialise(self):
         log.info(u'bibles Initialising')
         if self.manager is None:
-            self.manager = BibleManager(self, self.config)
+            self.manager = BibleManager(self)
         Plugin.initialise(self)
         self.insert_toolbox_item()
         self.ImportBibleItem.setVisible(True)

=== modified file 'openlp/plugins/bibles/forms/importwizardform.py'
--- openlp/plugins/bibles/forms/importwizardform.py	2010-04-16 07:31:01 +0000
+++ openlp/plugins/bibles/forms/importwizardform.py	2010-04-28 03:18:16 +0000
@@ -31,7 +31,7 @@
 from PyQt4 import QtCore, QtGui
 
 from bibleimportwizard import Ui_BibleImportWizard
-from openlp.core.lib import Receiver
+from openlp.core.lib import Receiver, SettingsManager
 from openlp.core.utils import AppLocation, variant_to_unicode
 from openlp.plugins.bibles.lib.manager import BibleFormat
 
@@ -59,16 +59,13 @@
     """
     log.info(u'BibleImportForm loaded')
 
-    def __init__(self, parent, config, manager, bibleplugin):
+    def __init__(self, parent, manager, bibleplugin):
         """
         Instantiate the wizard, and run any extra setup we need to.
 
         ``parent``
             The QWidget-derived parent of the wizard.
 
-        ``config``
-            The configuration object for storing and retrieving settings.
-
         ``manager``
             The Bible manager.
 
@@ -81,7 +78,6 @@
         self.finishButton = self.button(QtGui.QWizard.FinishButton)
         self.cancelButton = self.button(QtGui.QWizard.CancelButton)
         self.manager = manager
-        self.config = config
         self.bibleplugin = bibleplugin
         self.manager.set_process_dialog(self)
         self.web_bible_list = {}
@@ -277,6 +273,7 @@
             u'license_permission', self.PermissionEdit)
 
     def setDefaults(self):
+        settings = QtCore.QSettings()
         self.setField(u'source_format', QtCore.QVariant(0))
         self.setField(u'osis_location', QtCore.QVariant(''))
         self.setField(u'csv_booksfile', QtCore.QVariant(''))
@@ -285,14 +282,15 @@
         self.setField(u'web_location', QtCore.QVariant(WebDownload.Crosswalk))
         self.setField(u'web_biblename', QtCore.QVariant(self.BibleComboBox))
         self.setField(u'proxy_server',
-            QtCore.QVariant(self.config.get_config(u'proxy address', '')))
+            settings.value(u'bibles/proxy address', u''))
         self.setField(u'proxy_username',
-            QtCore.QVariant(self.config.get_config(u'proxy username','')))
+            settings.value(u'bibles/proxy username', u''))
         self.setField(u'proxy_password',
-            QtCore.QVariant(self.config.get_config(u'proxy password','')))
+            settings.value(u'proxy password', u''))
         self.setField(u'license_version', QtCore.QVariant(self.VersionNameEdit))
         self.setField(u'license_copyright', QtCore.QVariant(self.CopyrightEdit))
-        self.setField(u'license_permission', QtCore.QVariant(self.PermissionEdit))
+        self.setField(u'license_permission',
+            QtCore.QVariant(self.PermissionEdit))
         self.onLocationComboBoxChanged(WebDownload.Crosswalk)
 
     def loadWebBibles(self):
@@ -302,10 +300,10 @@
         #Load and store Crosswalk Bibles
         filepath = AppLocation.get_directory(AppLocation.PluginsDir)
         filepath = os.path.join(filepath, u'bibles', u'resources')
-        fbibles = None
         try:
             self.web_bible_list[WebDownload.Crosswalk] = {}
-            books_file = open(os.path.join(filepath, u'crosswalkbooks.csv'), 'r')
+            books_file = open(
+                os.path.join(filepath, u'crosswalkbooks.csv'), 'r')
             dialect = csv.Sniffer().sniff(books_file.read(1024))
             books_file.seek(0)
             books_reader = csv.reader(books_file, dialect)
@@ -345,10 +343,10 @@
 
     def getFileName(self, title, editbox):
         filename = QtGui.QFileDialog.getOpenFileName(self, title,
-            self.config.get_last_dir(1))
+            SettingsManager.get_last_dir(bibles, 1))
         if filename:
             editbox.setText(filename)
-            self.config.set_last_dir(filename, 1)
+            SettingsManager.set_last_dir(bibles, filename, 1)
 
     def incrementProgressBar(self, status_text):
         log.debug(u'IncrementBar %s', status_text)
@@ -368,7 +366,8 @@
         bible_type = self.field(u'source_format').toInt()[0]
         license_version = variant_to_unicode(self.field(u'license_version'))
         license_copyright = variant_to_unicode(self.field(u'license_copyright'))
-        license_permission = variant_to_unicode(self.field(u'license_permission'))
+        license_permission = variant_to_unicode(
+            self.field(u'license_permission'))
         importer = None
         if bible_type == BibleFormat.OSIS:
             # Import an OSIS bible

=== modified file 'openlp/plugins/bibles/lib/biblestab.py'
--- openlp/plugins/bibles/lib/biblestab.py	2010-04-16 07:31:01 +0000
+++ openlp/plugins/bibles/lib/biblestab.py	2010-04-28 03:18:16 +0000
@@ -27,7 +27,7 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import str_to_bool, Receiver, SettingsTab
+from openlp.core.lib import Receiver, SettingsTab
 
 log = logging.getLogger(__name__)
 
@@ -37,11 +37,11 @@
     """
     log.info(u'Bible Tab loaded')
 
-    def __init__(self, title, section=None):
+    def __init__(self, title):
         self.paragraph_style = True
         self.show_new_chapters = False
         self.display_style = 0
-        SettingsTab.__init__(self, title, section)
+        SettingsTab.__init__(self, title)
 
     def setupUi(self):
         self.setObjectName(u'BiblesTab')
@@ -161,8 +161,8 @@
         self.DisplayStyleComboBox.setItemText(1, self.trUtf8('( and )'))
         self.DisplayStyleComboBox.setItemText(2, self.trUtf8('{ and }'))
         self.DisplayStyleComboBox.setItemText(3, self.trUtf8('[ and ]'))
-        self.ChangeNoteLabel.setText(
-            self.trUtf8('Note:\nChanges don\'t affect verses already in the service'))
+        self.ChangeNoteLabel.setText(self.trUtf8(
+            'Note:\nChanges don\'t affect verses already in the service'))
         self.BibleDualCheckBox.setText(self.trUtf8('Display Dual Bible Verses'))
 
     def onBibleThemeComboBoxChanged(self):
@@ -187,29 +187,33 @@
             self.duel_bibles = True
 
     def load(self):
-        self.show_new_chapters = str_to_bool(
-            self.config.get_config(u'display new chapter', u'False'))
-        self.display_style = int(
-            self.config.get_config(u'display brackets', u'0'))
-        self.layout_style = int(
-            self.config.get_config(u'verse layout style', u'0'))
-        self.bible_theme = self.config.get_config(u'bible theme', u'0')
-        self.duel_bibles = str_to_bool(
-            self.config.get_config(u'dual bibles', u'True'))
+        settings = QtCore.QSettings()
+        self.show_new_chapters = settings.value(
+            u'bibles/display new chapter', False).toBool()
+        self.display_style = settings.value(
+            u'bibles/display brackets', 0).toInt()[0]
+        self.layout_style = settings.value(
+            u'bibles/verse layout style', 0).toInt()[0]
+        self.bible_theme = unicode(
+            settings.value(u'bibles/bible theme', u'').toString())
+        self.duel_bibles = settings.value(u'bibles/dual bibles', True).toBool()
         self.NewChaptersCheckBox.setChecked(self.show_new_chapters)
         self.DisplayStyleComboBox.setCurrentIndex(self.display_style)
         self.LayoutStyleComboBox.setCurrentIndex(self.layout_style)
         self.BibleDualCheckBox.setChecked(self.duel_bibles)
 
     def save(self):
-        self.config.set_config(
-            u'display new chapter', unicode(self.show_new_chapters))
-        self.config.set_config(
-            u'display brackets', unicode(self.display_style))
-        self.config.set_config(
-            u'verse layout style', unicode(self.layout_style))
-        self.config.set_config(u'dual bibles', unicode(self.duel_bibles))
-        self.config.set_config(u'bible theme', unicode(self.bible_theme))
+        settings = QtCore.QSettings()
+        settings.setValue(u'bibles/display new chapter',
+            QtCore.QVariant(self.show_new_chapters))
+        settings.setValue(u'bibles/display brackets',
+            QtCore.QVariant(self.display_style))
+        settings.setValue(u'bibles/verse layout style',
+            QtCore.QVariant(self.layout_style))
+        settings.setValue(u'bibles/dual bibles',
+            QtCore.QVariant(self.duel_bibles))
+        settings.setValue(u'bibles/bible theme',
+            QtCore.QVariant(self.bible_theme))
 
     def updateThemeList(self, theme_list):
         """

=== modified file 'openlp/plugins/bibles/lib/db.py'
--- openlp/plugins/bibles/lib/db.py	2010-03-27 12:37:21 +0000
+++ openlp/plugins/bibles/lib/db.py	2010-04-28 03:18:16 +0000
@@ -56,20 +56,14 @@
         ``name``
             The name of the database. This is also used as the file name for
             SQLite databases.
-
-        ``config``
-            The configuration object, passed in from the plugin.
         """
         log.info(u'BibleDB loaded')
         QtCore.QObject.__init__(self)
         if u'path' not in kwargs:
             raise KeyError(u'Missing keyword argument "path".')
-        if u'config' not in kwargs:
-            raise KeyError(u'Missing keyword argument "config".')
         if u'name' not in kwargs and u'file' not in kwargs:
             raise KeyError(u'Missing keyword argument "name" or "file".')
         self.stop_import_flag = False
-        self.config = kwargs[u'config']
         if u'name' in kwargs:
             self.name = kwargs[u'name']
             if not isinstance(self.name, unicode):
@@ -79,16 +73,18 @@
             self.file = kwargs[u'file']
         self.db_file = os.path.join(kwargs[u'path'], self.file)
         log.debug(u'Load bible %s on path %s', self.file, self.db_file)
-        db_type = self.config.get_config(u'db type', u'sqlite')
+        settings = QtCore.QSettings()
+        db_type = unicode(
+            settings.value(u'bibles/db type', u'sqlite').toString())
         db_url = u''
         if db_type == u'sqlite':
             db_url = u'sqlite:///' + self.db_file
         else:
-            db_url = u'%s://%s:%s@%s/%s' % \
-                (db_type, self.config.get_config(u'db username'),
-                    self.config.get_config(u'db password'),
-                    self.config.get_config(u'db hostname'),
-                    self.config.get_config(u'db database'))
+            db_url = u'%s://%s:%s@%s/%s' % (db_type,
+                unicode(settings.value(u'bibles/db username').toString()),
+                unicode(settings.value(u'bibles/db password').toString()),
+                unicode(settings.value(u'bibles/db hostname').toString()),
+                unicode(settings.value(u'bibles/db database').toString()))
         self.metadata, self.session = init_models(db_url)
         self.metadata.create_all(checkfirst=True)
         if u'file' in kwargs:

=== modified file 'openlp/plugins/bibles/lib/manager.py'
--- openlp/plugins/bibles/lib/manager.py	2010-03-22 08:37:18 +0000
+++ openlp/plugins/bibles/lib/manager.py	2010-04-28 03:18:16 +0000
@@ -25,6 +25,11 @@
 
 import logging
 
+from PyQt4 import QtCore
+
+from openlp.core.lib import SettingsManager
+from openlp.core.utils import AppLocation
+
 from common import parse_reference
 from opensong import OpenSongBible
 from osis import OSISBible
@@ -94,25 +99,22 @@
     """
     log.info(u'Bible manager loaded')
 
-    def __init__(self, parent, config):
+    def __init__(self, parent):
         """
         Finds all the bibles defined for the system and creates an interface
         object for each bible containing connection information. Throws
         Exception if no Bibles are found.
 
         Init confirms the bible exists and stores the database path.
-
-        ``config``
-            The plugin's configuration object.
         """
         log.debug(u'Bible Initialising')
-        self.config = config
         self.parent = parent
         self.web = u'Web'
         self.db_cache = None
-        self.path = self.config.get_data_path()
-        self.proxy_name = self.config.get_config(u'proxy name')
-        self.suffix = u'sqlite'
+        self.path = AppLocation.get_section_data_path(u'bibles')
+        self.proxy_name = unicode(
+            QtCore.QSettings().value(u'bibles/proxy name', u'').toString())
+        self.suffix = u'.sqlite'
         self.import_wizard = None
         self.reload_bibles()
         self.media = None
@@ -124,12 +126,11 @@
         BibleDB class.
         """
         log.debug(u'Reload bibles')
-        files = self.config.get_files(self.suffix)
+        files = SettingsManager.get_files(u'bibles', self.suffix)
         log.debug(u'Bible Files %s', files)
         self.db_cache = {}
         for filename in files:
-            bible = BibleDB(self.parent, path=self.path, file=filename,
-                            config=self.config)
+            bible = BibleDB(self.parent, path=self.path, file=filename)
             name = bible.get_name()
             log.debug(u'Bible Name: "%s"', name)
             self.db_cache[name] = bible
@@ -139,8 +140,8 @@
                 download_name = self.db_cache[name].get_meta(u'download name').value
                 meta_proxy = self.db_cache[name].get_meta(u'proxy url')
                 web_bible = HTTPBible(self.parent, path=self.path,
-                    file=filename, config=self.config,
-                    download_source=source.value, download_name=download_name)
+                    file=filename, download_source=source.value,
+                    download_name=download_name)
                 if meta_proxy:
                     web_bible.set_proxy_server(meta_proxy.value)
                 self.db_cache[name] = web_bible
@@ -167,7 +168,6 @@
         """
         class_ = BibleFormat.get_class(type)
         kwargs['path'] = self.path
-        kwargs['config'] = self.config
         importer = class_(self.parent, **kwargs)
         name = importer.register(self.import_wizard)
         self.db_cache[name] = importer
@@ -260,4 +260,3 @@
             if bible == name:
                 return True
         return False
-

=== modified file 'openlp/plugins/bibles/lib/mediaitem.py'
--- openlp/plugins/bibles/lib/mediaitem.py	2010-04-16 07:31:01 +0000
+++ openlp/plugins/bibles/lib/mediaitem.py	2010-04-28 03:18:16 +0000
@@ -28,8 +28,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import MediaManagerItem, Receiver, str_to_bool, \
-    BaseListWithDnD, ItemCapabilities
+from openlp.core.lib import MediaManagerItem, Receiver, BaseListWithDnD, \
+    ItemCapabilities
 from openlp.plugins.bibles.forms import ImportWizardForm
 
 log = logging.getLogger(__name__)
@@ -276,8 +276,7 @@
         self.SearchProgress.setObjectName(u'SearchProgress')
 
     def configUpdated(self):
-        if str_to_bool(
-            self.parent.config.get_config(u'dual bibles', u'False')):
+        if QtCore.QSettings().value(u'bibles/dual bibles', False).toBool():
             self.AdvancedSecondBibleLabel.setVisible(True)
             self.AdvancedSecondBibleComboBox.setVisible(True)
             self.QuickSecondVersionLabel.setVisible(True)
@@ -381,7 +380,7 @@
             self.AdvancedBookComboBox.itemData(item).toInt()[0])
 
     def onImportClick(self):
-        self.bibleimportform = ImportWizardForm(self, self.parent.config,
+        self.bibleimportform = ImportWizardForm(self,
             self.parent.manager, self.parent)
         self.bibleimportform.exec_()
         self.reloadBibles()

=== modified file 'openlp/plugins/bibles/lib/osis.py'
--- openlp/plugins/bibles/lib/osis.py	2010-04-16 07:31:01 +0000
+++ openlp/plugins/bibles/lib/osis.py	2010-04-28 03:18:16 +0000
@@ -98,7 +98,8 @@
         Loads a Bible from file.
         """
         log.debug(u'Starting OSIS import from "%s"' % self.filename)
-        self.wizard.incrementProgressBar(u'Detecting encoding (this may take a few minutes)...')
+        self.wizard.incrementProgressBar(
+            u'Detecting encoding (this may take a few minutes)...')
         detect_file = None
         try:
             detect_file = open(self.filename, u'r')

=== modified file 'openlp/plugins/custom/customplugin.py'
--- openlp/plugins/custom/customplugin.py	2010-03-21 23:58:01 +0000
+++ openlp/plugins/custom/customplugin.py	2010-04-28 03:18:16 +0000
@@ -45,7 +45,7 @@
     def __init__(self, plugin_helpers):
         Plugin.__init__(self, u'Custom', u'1.9.1', plugin_helpers)
         self.weight = -5
-        self.custommanager = CustomManager(self.config)
+        self.custommanager = CustomManager()
         self.edit_custom_form = EditCustomForm(self.custommanager)
         self.icon = build_icon(u':/media/media_custom.png')
         self.status = PluginStatus.Active

=== modified file 'openlp/plugins/custom/lib/customtab.py'
--- openlp/plugins/custom/lib/customtab.py	2010-03-21 23:58:01 +0000
+++ openlp/plugins/custom/lib/customtab.py	2010-04-28 03:18:16 +0000
@@ -25,14 +25,14 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, str_to_bool
+from openlp.core.lib import SettingsTab
 
 class CustomTab(SettingsTab):
     """
     CustomTab is the Custom settings tab in the settings dialog.
     """
-    def __init__(self, title, section=None):
-        SettingsTab.__init__(self, title, section)
+    def __init__(self, title):
+        SettingsTab.__init__(self, title)
 
     def setupUi(self):
         self.setObjectName(u'CustomTab')
@@ -57,7 +57,7 @@
     def retranslateUi(self):
         self.CustomModeGroupBox.setTitle(self.trUtf8('Custom Display'))
         self.DisplayFooterCheckBox.setText(
-            self.trUtf8('Display Footer:'))
+            self.trUtf8('Display Footer'))
 
     def onDisplayFooterCheckBoxChanged(self, check_state):
         self.displayFooter = False
@@ -66,9 +66,10 @@
             self.displayFooter = True
 
     def load(self):
-        self.displayFooter = str_to_bool(
-            self.config.get_config(u'display footer', True))
+        self.displayFooter = QtCore.QSettings().value(
+            u'custom/display footer', True).toBool()
         self.DisplayFooterCheckBox.setChecked(self.displayFooter)
 
     def save(self):
-        self.config.set_config(u'display footer', unicode(self.displayFooter))
+        QtCore.QSettings().setValue(
+            u'custom/display footer', QtCore.QVariant(self.displayFooter))

=== modified file 'openlp/plugins/custom/lib/manager.py'
--- openlp/plugins/custom/lib/manager.py	2010-03-21 23:58:01 +0000
+++ openlp/plugins/custom/lib/manager.py	2010-04-28 03:18:16 +0000
@@ -25,6 +25,9 @@
 
 import logging
 
+from PyQt4 import QtCore
+
+from openlp.core.utils import AppLocation
 from openlp.plugins.custom.lib.models import init_models, metadata, CustomSlide
 
 log = logging.getLogger(__name__)
@@ -36,24 +39,25 @@
     """
     log.info(u'Custom manager loaded')
 
-    def __init__(self, config):
+    def __init__(self):
         """
         Creates the connection to the database, and creates the tables if they
         don't exist.
         """
-        self.config = config
         log.debug(u'Custom Initialising')
+        settings = QtCore.QSettings()
         self.db_url = u''
-        db_type = self.config.get_config(u'db type', u'sqlite')
+        db_type = unicode(
+            settings.value(u'custom/db type', u'sqlite').toString())
         if db_type == u'sqlite':
             self.db_url = u'sqlite:///%s/custom.sqlite' % \
-                self.config.get_data_path()
+                AppLocation.get_section_data_path(u'custom')
         else:
-            self.db_url = u'%s://%s:%s@%s/%s' % \
-                (db_type, self.config.get_config(u'db username'),
-                    self.config.get_config(u'db password'),
-                    self.config.get_config(u'db hostname'),
-                    self.config.get_config(u'db database'))
+            self.db_url = u'%s://%s:%s@%s/%s' % (db_type,
+                unicode(settings.value(u'custom/db username').toString()),
+                unicode(settings.value(u'custom/db password').toString()),
+                unicode(settings.value(u'custom/db hostname').toString()),
+                unicode(settings.value(u'custom/db database').toString()))
         self.session = init_models(self.db_url)
         metadata.create_all(checkfirst=True)
 
@@ -107,4 +111,5 @@
             return True
 
     def get_customs_for_theme(self, theme):
-        return self.session.query(CustomSlide).filter(CustomSlide.theme_name == theme).all()
+        return self.session.query(
+            CustomSlide).filter(CustomSlide.theme_name == theme).all()

=== modified file 'openlp/plugins/custom/lib/mediaitem.py'
--- openlp/plugins/custom/lib/mediaitem.py	2010-04-20 22:00:55 +0000
+++ openlp/plugins/custom/lib/mediaitem.py	2010-04-28 03:18:16 +0000
@@ -27,8 +27,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD,\
-Receiver, str_to_bool, ItemCapabilities
+from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD, \
+    Receiver, ItemCapabilities
 
 log = logging.getLogger(__name__)
 
@@ -164,7 +164,7 @@
         service_item.title = title
         for slide in raw_slides:
             service_item.add_from_text(slide[:30], slide)
-        if str_to_bool(self.parent.config.get_config(u'display footer', True)) \
+        if QtCore.QSettings().value(u'custom/display footer', True).toBool() \
             or credit:
             raw_footer.append(title + u' ' + credit)
         else:

=== modified file 'openlp/plugins/images/lib/imagetab.py'
--- openlp/plugins/images/lib/imagetab.py	2010-04-16 07:31:01 +0000
+++ openlp/plugins/images/lib/imagetab.py	2010-04-28 03:18:16 +0000
@@ -31,8 +31,8 @@
     """
     ImageTab is the Image settings tab in the settings dialog.
     """
-    def __init__(self, title, section=None):
-        SettingsTab.__init__(self, title, section)
+    def __init__(self, title):
+        SettingsTab.__init__(self, title)
 
     def setupUi(self):
         self.setObjectName(u'ImageTab')
@@ -71,11 +71,13 @@
         self.loop_delay = self.TimeoutSpinBox.value()
 
     def load(self):
-        self.loop_delay = int(self.config.get_config(u'loop delay', 5))
+        self.loop_delay = QtCore.QSettings().value(
+            u'images/loop delay', 5).toInt()[0]
         self.TimeoutSpinBox.setValue(self.loop_delay)
 
     def save(self):
-        self.config.set_config(u'loop delay', self.loop_delay)
+        QtCore.QSettings().setValue(
+            u'images/loop delay', QtCore.QVariant(self.loop_delay))
         Receiver.send_message(u'slidecontroller_live_spin_delay', 
             self.loop_delay)
 

=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py	2010-04-19 16:45:13 +0000
+++ openlp/plugins/images/lib/mediaitem.py	2010-04-28 03:18:16 +0000
@@ -27,8 +27,10 @@
 import os
 
 from PyQt4 import QtCore, QtGui
+
 from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
-    contextMenuAction, ItemCapabilities
+    contextMenuAction, ItemCapabilities, SettingsManager
+from openlp.core.utils import AppLocation
 
 log = logging.getLogger(__name__)
 
@@ -76,10 +78,12 @@
             QtGui.QAbstractItemView.ExtendedSelection)
         self.ListView.setIconSize(QtCore.QSize(88,50))
         self.servicePath = os.path.join(
-            self.parent.config.get_data_path(), u'.thumbnails')
+            AppLocation.get_section_data_path(self.ConfigSection),
+            u'.thumbnails')
         if not os.path.exists(self.servicePath):
             os.mkdir(self.servicePath)
-        self.loadList(self.parent.config.load_list(self.ConfigSection))
+        self.loadList(SettingsManager.load_list(
+            self.ConfigSection, self.ConfigSection))
 
     def addListViewToToolBar(self):
         MediaManagerItem.addListViewToToolBar(self)
@@ -112,12 +116,13 @@
             for item in items:
                 text = self.ListView.item(item.row())
                 try:
-                    os.remove(os.path.join(self.servicePath, unicode(text.text())))
+                    os.remove(
+                        os.path.join(self.servicePath, unicode(text.text())))
                 except:
                     #if not present do not worry
                     pass
                 self.ListView.takeItem(item.row())
-                self.parent.config.set_list(self.ConfigSection, self.getFileList())
+                SettingsManager.set_list(self.ConfigSection, self.getFileList())
 
     def loadList(self, list):
         for file in list:

=== modified file 'openlp/plugins/media/lib/mediaitem.py'
--- openlp/plugins/media/lib/mediaitem.py	2010-04-06 19:16:14 +0000
+++ openlp/plugins/media/lib/mediaitem.py	2010-04-28 03:18:16 +0000
@@ -29,7 +29,7 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
-ItemCapabilities
+    ItemCapabilities, SettingsManager
 
 log = logging.getLogger(__name__)
 
@@ -47,12 +47,12 @@
     def __init__(self, parent, icon, title):
         self.PluginNameShort = u'Media'
         self.IconPath = u'images/image'
-        self.ConfigSection = u'media'
         self.ConfigSection = title
         # this next is a class, not an instance of a class - it will
         # be instanced by the base MediaManagerItem
         self.ListViewWithDnD_class = MediaListView
-        self.PreviewFunction = QtGui.QPixmap(u':/media/media_video.png').toImage()
+        self.PreviewFunction = QtGui.QPixmap(
+            u':/media/media_video.png').toImage()
         MediaManagerItem.__init__(self, parent, icon, title)
         self.singleServiceItem = False
         self.ServiceItemIconName = u':/media/media_video.png'
@@ -89,15 +89,15 @@
         self.ListView.setSelectionMode(
             QtGui.QAbstractItemView.ExtendedSelection)
         self.ListView.setIconSize(QtCore.QSize(88,50))
-        self.loadList(self.parent.config.load_list(self.ConfigSection))
+        self.loadList(SettingsManager.load_list(
+            self.ConfigSection, self.ConfigSection))
 
     def onDeleteClick(self):
         item = self.ListView.currentItem()
         if item:
             row = self.ListView.row(item)
             self.ListView.takeItem(row)
-            self.parent.config.set_list(
-                self.ConfigSection, self.getFileList())
+            SettingsManager.set_list(self.ConfigSection, self.getFileList())
 
     def loadList(self, list):
         for file in list:

=== modified file 'openlp/plugins/presentations/lib/mediaitem.py'
--- openlp/plugins/presentations/lib/mediaitem.py	2010-04-21 17:36:29 +0000
+++ openlp/plugins/presentations/lib/mediaitem.py	2010-04-28 03:18:16 +0000
@@ -28,7 +28,9 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon
+from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
+    SettingsManager
+from openlp.core.utils import AppLocation
 from openlp.plugins.presentations.lib import MessageListener
 
 log = logging.getLogger(__name__)
@@ -68,7 +70,8 @@
         fileType = u''
         for controller in self.controllers:
             if self.controllers[controller].enabled:
-                types = self.controllers[controller].supports + self.controllers[controller].alsosupports
+                types = self.controllers[controller].supports + \
+                    self.controllers[controller].alsosupports
                 for type in types:
                     if fileType.find(type) == -1:
                         fileType += u'*%s ' % type
@@ -104,10 +107,11 @@
 
     def initialise(self):
         self.servicePath = os.path.join(
-            self.parent.config.get_data_path(), u'thumbnails')
+            AppLocation.get_section_data_path(self.ConfigSection),
+            u'thumbnails')
         if not os.path.exists(self.servicePath):
             os.mkdir(self.servicePath)
-        list = self.parent.config.load_list(u'presentations')
+        list = SettingsManager.load_list(self.ConfigSection, u'presentations')
         self.loadList(list)
         for item in self.controllers:
             #load the drop down selection
@@ -134,17 +138,20 @@
             else:
                 icon = None
                 for controller in self.controllers:
-                    thumbPath = os.path.join(self.parent.config.get_data_path(), \
+                    thumbPath = os.path.join(
+                        AppLocation.get_section_data_path(self.ConfigSection),
                         u'thumbnails', controller, filename)
                     thumb = os.path.join(thumbPath, u'slide1.png')
-                    preview = os.path.join(self.parent.config.get_data_path(), \
+                    preview = os.path.join(
+                        AppLocation.get_section_data_path(self.ConfigSection),
                         controller, u'thumbnails', filename, u'slide1.png')
                     if os.path.exists(preview):
                         if os.path.exists(thumb):
                             if self.validate(preview, thumb):
                                 icon = build_icon(thumb)
                             else:
-                                icon = build_icon(u':/general/general_delete.png')
+                                icon = build_icon(
+                                    u':/general/general_delete.png')
                         else:
                             os.makedirs(thumbPath)
                             icon = self.IconFromFile(preview, thumb)
@@ -160,8 +167,7 @@
         if item:
             row = self.ListView.row(item)
             self.ListView.takeItem(row)
-            self.parent.config.set_list(
-                self.ConfigSection, self.getFileList())
+            SettingsManager.set_list(self.ConfigSection, self.getFileList())
             filepath = unicode((item.data(QtCore.Qt.UserRole)).toString())
             #not sure of this has errors
             #John please can you look at .

=== modified file 'openlp/plugins/presentations/lib/messagelistener.py'
--- openlp/plugins/presentations/lib/messagelistener.py	2010-04-22 21:22:09 +0000
+++ openlp/plugins/presentations/lib/messagelistener.py	2010-04-28 03:18:16 +0000
@@ -165,7 +165,8 @@
         if not self.isLive:
             return
         self.activate()
-        if self.doc.slidenumber and self.doc.slidenumber != self.doc.get_slide_number():
+        if self.doc.slidenumber and \
+            self.doc.slidenumber != self.doc.get_slide_number():
             self.doc.goto_slide(self.doc.slidenumber)
         self.doc.unblank_screen()
 
@@ -186,26 +187,27 @@
         self.liveHandler = Controller(True)
         # messages are sent from core.ui.slidecontroller
         QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'presentation_start'), self.startup)
-        QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'presentation_stop'), self.shutdown)
-        QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'presentation_first'), self.first)
-        QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'presentation_previous'), self.previous)
-        QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'presentation_next'), self.next)
-        QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'presentation_last'), self.last)
-        QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'presentation_slide'), self.slide)
-        QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'presentation_blank'), self.blank)
-        QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'presentation_unblank'), self.unblank)
+            QtCore.SIGNAL(u'presentations_start'), self.startup)
+        QtCore.QObject.connect(Receiver.get_receiver(),
+            QtCore.SIGNAL(u'presentations_stop'), self.shutdown)
+        QtCore.QObject.connect(Receiver.get_receiver(),
+            QtCore.SIGNAL(u'presentations_first'), self.first)
+        QtCore.QObject.connect(Receiver.get_receiver(),
+            QtCore.SIGNAL(u'presentations_previous'), self.previous)
+        QtCore.QObject.connect(Receiver.get_receiver(),
+            QtCore.SIGNAL(u'presentations_next'), self.next)
+        QtCore.QObject.connect(Receiver.get_receiver(),
+            QtCore.SIGNAL(u'presentations_last'), self.last)
+        QtCore.QObject.connect(Receiver.get_receiver(),
+            QtCore.SIGNAL(u'presentations_slide'), self.slide)
+        QtCore.QObject.connect(Receiver.get_receiver(),
+            QtCore.SIGNAL(u'presentations_blank'), self.blank)
+        QtCore.QObject.connect(Receiver.get_receiver(),
+            QtCore.SIGNAL(u'presentations_unblank'), self.unblank)
         self.timer = QtCore.QTimer()
         self.timer.setInterval(500)
-        QtCore.QObject.connect(self.timer, QtCore.SIGNAL("timeout()"), self.timeout)
+        QtCore.QObject.connect(
+            self.timer, QtCore.SIGNAL("timeout()"), self.timeout)
 
     def startup(self, message):
         """
@@ -279,11 +281,10 @@
         if isLive:
             self.liveHandler.blank()
 
-    def unblank(self,  message):
+    def unblank(self, message):
         isLive, item = self.decode_message(message)
         if isLive:
             self.liveHandler.unblank()
         
     def timeout(self):
         self.liveHandler.poll()
-        

=== modified file 'openlp/plugins/presentations/lib/presentationcontroller.py'
--- openlp/plugins/presentations/lib/presentationcontroller.py	2010-04-16 07:31:01 +0000
+++ openlp/plugins/presentations/lib/presentationcontroller.py	2010-04-28 03:18:16 +0000
@@ -30,6 +30,7 @@
 from PyQt4 import QtCore
 
 from openlp.core.lib import Receiver
+from openlp.core.utils import AppLocation
 
 log = logging.getLogger(__name__)
 
@@ -68,7 +69,8 @@
         Called at system exit to clean up any running presentations
 
     ``check_available()``
-        Returns True if presentation application is installed/can run on this machine
+        Returns True if presentation application is installed/can run on this
+        machine
 
     ``presentation_deleted()``
         Deletes presentation specific files, e.g. thumbnails
@@ -78,13 +80,14 @@
 
     def __init__(self, plugin=None, name=u'PresentationController'):
         """
-        This is the constructor for the presentationcontroller object.
-        This provides an easy way for descendent plugins to populate common data.
+        This is the constructor for the presentationcontroller object.  This
+        provides an easy way for descendent plugins to populate common data.
         This method *must* be overridden, like so::
 
             class MyPresentationController(PresentationController):
                 def __init__(self, plugin):
-                    PresentationController.__init(self, plugin, u'My Presenter App')
+                    PresentationController.__init(
+                        self, plugin, u'My Presenter App')
 
         ``plugin``
             Defaults to *None*. The presentationplugin object
@@ -99,11 +102,12 @@
         self.name = name
         self.available = self.check_available()
         if self.available:
-            self.enabled = int(plugin.config.get_config(
-                name, QtCore.Qt.Unchecked)) == QtCore.Qt.Checked
+            self.enabled = QtCore.QSettings().value(u'presentations/' + name,
+                QtCore.Qt.Unchecked).toInt()[0] == QtCore.Qt.Checked
         else:
             self.enabled = False
-        self.thumbnailroot = os.path.join(plugin.config.get_data_path(),
+        self.thumbnailroot = os.path.join(
+            AppLocation.get_section_data_path(u'presentations'),
             name, u'thumbnails')
         self.thumbnailprefix = u'slide'
         if not os.path.isdir(self.thumbnailroot):
@@ -241,7 +245,8 @@
         return os.path.split(presentation)[1]
 
     def get_thumbnail_path(self,  presentation):
-        return os.path.join(self.controller.thumbnailroot, self.get_file_name(presentation))
+        return os.path.join(
+            self.controller.thumbnailroot, self.get_file_name(presentation))
 
     def check_thumbnails(self):
         """
@@ -326,11 +331,11 @@
         pass
 
     def next_step(self):
-       """
-       Triggers the next effect of slide on the running presentation
-       This might be the next animation on the current slide, or the next slide
-       """
-       pass
+        """
+        Triggers the next effect of slide on the running presentation
+        This might be the next animation on the current slide, or the next slide
+        """
+        pass
 
     def previous_step(self):
         """

=== modified file 'openlp/plugins/presentations/lib/presentationtab.py'
--- openlp/plugins/presentations/lib/presentationtab.py	2010-03-21 23:58:01 +0000
+++ openlp/plugins/presentations/lib/presentationtab.py	2010-04-28 03:18:16 +0000
@@ -23,7 +23,7 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 
-from PyQt4 import QtGui
+from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import SettingsTab
 
@@ -31,9 +31,9 @@
     """
     PresentationsTab is the Presentations settings tab in the settings dialog.
     """
-    def __init__(self, title, controllers, section=None):
+    def __init__(self, title, controllers):
         self.controllers = controllers
-        SettingsTab.__init__(self, title, section)
+        SettingsTab.__init__(self, title)
 
     def setupUi(self):
         self.setObjectName(u'PresentationTab')
@@ -93,19 +93,19 @@
             controller = self.controllers[key]
             checkbox = self.PresenterCheckboxes[controller.name]
             checkbox.setText(
-                u'%s %s:' % (controller.name, self.trUtf8('available')))
+                u'%s %s' % (controller.name, self.trUtf8('available')))
 
     def load(self):
         for key in self.controllers:
             controller = self.controllers[key]
             if controller.available:
                 checkbox = self.PresenterCheckboxes[controller.name]
-                checkbox.setChecked(
-                    int(self.config.get_config(controller.name, 0)))
+                checkbox.setChecked(QtCore.QSettings().value(
+                    u'presentations/' + controller.name, 0).toInt()[0])
 
     def save(self):
         for key in self.controllers:
             controller = self.controllers[key]
             checkbox = self.PresenterCheckboxes[controller.name]
-            self.config.set_config(
-                controller.name, unicode(checkbox.checkState()))
+            QtCore.QSettings().setValue(u'presentations/' + controller.name,
+                QtCore.QVariant(checkbox.checkState()))

=== modified file 'openlp/plugins/presentations/presentationplugin.py'
--- openlp/plugins/presentations/presentationplugin.py	2010-04-22 21:23:14 +0000
+++ openlp/plugins/presentations/presentationplugin.py	2010-04-28 03:18:16 +0000
@@ -26,7 +26,7 @@
 import os
 import logging
 
-from openlp.core.lib import Plugin, build_icon, Receiver, PluginStatus
+from openlp.core.lib import Plugin, build_icon, PluginStatus
 from openlp.core.utils import AppLocation
 from openlp.plugins.presentations.lib import *
 
@@ -96,7 +96,9 @@
                     try:
                         __import__(modulename, globals(), locals(), [])
                     except ImportError, e:
-                        log.error(u'Failed to import %s on path %s for reason %s', modulename, path, e.args[0])
+                        log.error(
+                            u'Failed to import %s on path %s for reason %s',
+                            modulename, path, e.args[0])
         controller_classes = PresentationController.__subclasses__()
         for controller_class in controller_classes:
             controller = controller_class(self)

=== modified file 'openlp/plugins/remotes/lib/remotetab.py'
--- openlp/plugins/remotes/lib/remotetab.py	2010-03-21 23:58:01 +0000
+++ openlp/plugins/remotes/lib/remotetab.py	2010-04-28 03:18:16 +0000
@@ -23,7 +23,7 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 
-from PyQt4 import QtGui
+from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import SettingsTab
 
@@ -31,8 +31,8 @@
     """
     RemoteTab is the Remotes settings tab in the settings dialog.
     """
-    def __init__(self, title, section=None):
-        SettingsTab.__init__(self, title, section)
+    def __init__(self, title):
+        SettingsTab.__init__(self, title)
 
     def setupUi(self):
         self.setObjectName(u'RemoteTab')
@@ -57,8 +57,8 @@
 
     def load(self):
         self.RemotePortSpinBox.setValue(
-            int(self.config.get_config(u'remote port', 4316)))
+            QtCore.QSettings().value(u'remotes/remote port', 4316).toInt()[0])
 
     def save(self):
-        self.config.set_config(
-            u'remote port', unicode(self.RemotePortSpinBox.value()))
+        QtCore.QSettings().setValue(u'remotes/remote port',
+            QtCore.QVariant(self.RemotePortSpinBox.value()))

=== modified file 'openlp/plugins/remotes/remoteplugin.py'
--- openlp/plugins/remotes/remoteplugin.py	2010-04-21 21:56:48 +0000
+++ openlp/plugins/remotes/remoteplugin.py	2010-04-28 03:18:16 +0000
@@ -45,7 +45,8 @@
         Plugin.initialise(self)
         self.insert_toolbox_item()
         self.server = QtNetwork.QUdpSocket()
-        self.server.bind(int(self.config.get_config(u'remote port', 4316)))
+        self.server.bind(
+            QtCore.QSettings().value(u'remotes/remote port', 4316).toInt()[0])
         QtCore.QObject.connect(self.server,
             QtCore.SIGNAL(u'readyRead()'), self.readData)
 

=== modified file 'openlp/plugins/songs/lib/manager.py'
--- openlp/plugins/songs/lib/manager.py	2010-04-03 22:14:37 +0000
+++ openlp/plugins/songs/lib/manager.py	2010-04-28 03:18:16 +0000
@@ -25,6 +25,9 @@
 
 import logging
 
+from PyQt4 import QtCore
+
+from openlp.core.utils import AppLocation
 from openlp.plugins.songs.lib.models import init_models, metadata, Song, \
     Author, Topic, Book
 
@@ -37,24 +40,29 @@
     """
     log.info(u'Song manager loaded')
 
-    def __init__(self, config):
+    def __init__(self):
         """
         Creates the connection to the database, and creates the tables if they
         don't exist.
         """
-        self.config = config
         log.debug(u'Song Initialising')
+        settings = QtCore.QSettings()
         self.db_url = u''
-        db_type = self.config.get_config(u'db type', u'sqlite')
+        db_type = unicode(
+            settings.value(u'songs/db type', u'sqlite').toString())
         if db_type == u'sqlite':
             self.db_url = u'sqlite:///%s/songs.sqlite' % \
-                self.config.get_data_path()
+                AppLocation.get_section_data_path(u'songs')
         else:
             self.db_url = db_type + 'u://' + \
-                self.config.get_config(u'db username') + u':' + \
-                self.config.get_config(u'db password') + u'@' + \
-                self.config.get_config(u'db hostname') + u'/' + \
-                self.config.get_config(u'db database')
+                unicode(settings.value(
+                    u'songs/db username', u'').toString()) + u':' + \
+                unicode(settings.value(
+                    u'songs/db password', u'').toString()) + u'@' + \
+                unicode(settings.value(
+                    u'songs/db hostname', u'').toString()) + u'/' + \
+                unicode(settings.value(
+                    u'songs/db database', u'').toString())
         self.session = init_models(self.db_url)
         metadata.create_all(checkfirst=True)
         log.debug(u'Song Initialised')

=== modified file 'openlp/plugins/songs/lib/mediaitem.py'
--- openlp/plugins/songs/lib/mediaitem.py	2010-04-20 22:00:55 +0000
+++ openlp/plugins/songs/lib/mediaitem.py	2010-04-28 03:18:16 +0000
@@ -28,7 +28,7 @@
 from PyQt4 import QtCore, QtGui
 
 from openlp.core.lib import MediaManagerItem, SongXMLParser, \
-    BaseListWithDnD, Receiver,  str_to_bool, ItemCapabilities
+    BaseListWithDnD, Receiver, ItemCapabilities
 from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm
 
 log = logging.getLogger(__name__)
@@ -133,8 +133,8 @@
             QtCore.SIGNAL(u'songs_edit_clear'), self.onRemoteEditClear)
 
     def configUpdated(self):
-        self.searchAsYouType = str_to_bool(
-            self.parent.config.get_config(u'search as type', u'False'))
+        self.searchAsYouType = QtCore.QSettings().value(
+            u'songs/search as type', u'False').toBool()
 
     def retranslateUi(self):
         self.SearchTextLabel.setText(self.trUtf8('Search:'))
@@ -350,7 +350,7 @@
             author_list = author_list + unicode(author.display_name)
             author_audit.append(unicode(author.display_name))
         if song.ccli_number is None or len(song.ccli_number) == 0:
-            ccli = self.parent.settings.GeneralTab.CCLINumber
+            ccli = self.parent.settings_form.GeneralTab.CCLINumber
         else:
             ccli = unicode(song.ccli_number)
         raw_footer.append(song.title)

=== modified file 'openlp/plugins/songs/lib/songstab.py'
--- openlp/plugins/songs/lib/songstab.py	2010-03-21 23:58:01 +0000
+++ openlp/plugins/songs/lib/songstab.py	2010-04-28 03:18:16 +0000
@@ -25,14 +25,14 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import SettingsTab, str_to_bool
+from openlp.core.lib import SettingsTab
 
 class SongsTab(SettingsTab):
     """
     SongsTab is the Songs settings tab in the settings dialog.
     """
-    def __init__(self, title, section=None):
-        SettingsTab.__init__(self, title, section)
+    def __init__(self, title):
+        SettingsTab.__init__(self, title)
 
     def setupUi(self):
         self.setObjectName(u'SongsTab')
@@ -63,9 +63,9 @@
     def retranslateUi(self):
         self.SongsModeGroupBox.setTitle(self.trUtf8('Songs Mode'))
         self.SearchAsTypeCheckBox.setText(
-            self.trUtf8('Enable search as you type:'))
+            self.trUtf8('Enable search as you type'))
         self.SongBarActiveCheckBox.setText(
-            self.trUtf8('Display Verses on Live Tool bar:'))
+            self.trUtf8('Display Verses on Live Tool bar'))
 
     def onSearchAsTypeCheckBoxChanged(self, check_state):
         self.song_search = False
@@ -80,13 +80,16 @@
             self.song_bar = True
 
     def load(self):
-        self.song_search = str_to_bool(
-            self.config.get_config(u'search as type', False))
-        self.song_bar = str_to_bool(
-            self.config.get_config(u'display songbar', True))
+        settings = QtCore.QSettings()
+        self.song_search = settings.value(
+            u'songs/search as type', False).toBool()
+        self.song_bar = settings.value(u'songs/display songbar', True).toBool()
         self.SearchAsTypeCheckBox.setChecked(self.song_search)
         self.SongBarActiveCheckBox.setChecked(self.song_bar)
 
     def save(self):
-        self.config.set_config(u'search as type', unicode(self.song_search))
-        self.config.set_config(u'display songbar', unicode(self.song_bar))
+        settings = QtCore.QSettings()
+        settings.setValue(
+            u'songs/search as type', QtCore.QVariant(self.song_search))
+        settings.setValue(
+            u'songs/display songbar', QtCore.QVariant(self.song_bar))

=== modified file 'openlp/plugins/songs/songsplugin.py'
--- openlp/plugins/songs/songsplugin.py	2010-04-16 07:31:01 +0000
+++ openlp/plugins/songs/songsplugin.py	2010-04-28 03:18:16 +0000
@@ -51,7 +51,7 @@
         """
         Plugin.__init__(self, u'Songs', u'1.9.1', plugin_helpers)
         self.weight = -10
-        self.songmanager = SongManager(self.config)
+        self.songmanager = SongManager()
         self.openlp_import_form = OpenLPImportForm()
         self.opensong_import_form = OpenSongImportForm()
         self.openlp_export_form = OpenLPExportForm()
@@ -65,7 +65,7 @@
     def initialise(self):
         log.info(u'Songs Initialising')
         #if self.songmanager is None:
-        #    self.songmanager = SongManager(self.config)
+        #    self.songmanager = SongManager()
         Plugin.initialise(self)
         self.insert_toolbox_item()
         self.ImportSongMenu.menuAction().setVisible(True)

=== modified file 'openlp/plugins/songusage/forms/songusagedetailform.py'
--- openlp/plugins/songusage/forms/songusagedetailform.py	2010-03-21 23:58:01 +0000
+++ openlp/plugins/songusage/forms/songusagedetailform.py	2010-04-28 03:18:16 +0000
@@ -23,10 +23,12 @@
 # Temple Place, Suite 330, Boston, MA 02111-1307 USA                          #
 ###############################################################################
 
+import logging
 import os
 
 from PyQt4 import QtCore, QtGui
-import logging
+
+from openlp.core.lib import SettingsManager
 
 from songusagedetaildialog import Ui_SongUsageDetailDialog
 
@@ -53,15 +55,15 @@
         fromDate = QtCore.QDate(year - 1, 9, 1)
         self.FromDate.setSelectedDate(fromDate)
         self.ToDate.setSelectedDate(toDate)
-        self.FileLineEdit.setText(self.parent.config.get_last_dir(1))
+        self.FileLineEdit.setText(SettingsManager.get_last_dir(u'songusage', 1))
 
     def defineOutputLocation(self):
         path = QtGui.QFileDialog.getExistingDirectory(self,
             self.trUtf8('Output File Location'),
-            self.parent.config.get_last_dir(1) )
+            SettingsManager.get_last_dir(u'songusage', 1))
         path = unicode(path)
         if path != u'':
-            self.parent.config.set_last_dir(path, 1)
+            SettingsManager.set_last_dir(u'songusage', path, 1)
             self.FileLineEdit.setText(path)
 
     def accept(self):

=== modified file 'openlp/plugins/songusage/lib/manager.py'
--- openlp/plugins/songusage/lib/manager.py	2010-03-21 23:58:01 +0000
+++ openlp/plugins/songusage/lib/manager.py	2010-04-28 03:18:16 +0000
@@ -25,7 +25,11 @@
 
 import logging
 
-from openlp.plugins.songusage.lib.models import init_models, metadata, SongUsageItem
+from PyQt4 import QtCore
+
+from openlp.core.utils import AppLocation
+from openlp.plugins.songusage.lib.models import init_models, metadata, \
+    SongUsageItem
 
 log = logging.getLogger(__name__)
 
@@ -36,24 +40,29 @@
     """
     log.info(u'SongUsage manager loaded')
 
-    def __init__(self, config):
+    def __init__(self):
         """
         Creates the connection to the database, and creates the tables if they
         don't exist.
         """
-        self.config = config
+        settings = QtCore.QSettings()
         log.debug(u'SongUsage Initialising')
         self.db_url = u''
-        db_type = self.config.get_config(u'db type', u'sqlite')
+        db_type = unicode(
+            settings.value(u'songusage/db type', u'sqlite').toString())
         if db_type == u'sqlite':
             self.db_url = u'sqlite:///%s/songusage.sqlite' % \
-                self.config.get_data_path()
+                AppLocation.get_section_data_path(u'songusage')
         else:
-            self.db_url = u'%s://%s:%s@%s/%s' % \
-                (db_type, self.config.get_config(u'db username'),
-                    self.config.get_config(u'db password'),
-                    self.config.get_config(u'db hostname'),
-                    self.config.get_config(u'db database'))
+            self.db_url = u'%s://%s:%s@%s/%s' % (db_type,
+                unicode(
+                    settings.value(u'songusage/db username', u'').toString()),
+                unicode(
+                    settings.value(u'songusage/db password', u'').toString()),
+                unicode(
+                    settings.value(u'songusage/db hostname', u'').toString()),
+                unicode(
+                    settings.value(u'songusage/db database', u'').toString()))
         self.session = init_models(self.db_url)
         metadata.create_all(checkfirst=True)
 

=== modified file 'openlp/plugins/songusage/songusageplugin.py'
--- openlp/plugins/songusage/songusageplugin.py	2010-04-22 21:22:09 +0000
+++ openlp/plugins/songusage/songusageplugin.py	2010-04-28 03:18:16 +0000
@@ -28,9 +28,10 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import Plugin, Receiver, str_to_bool, build_icon
+from openlp.core.lib import Plugin, Receiver, build_icon
 from openlp.plugins.songusage.lib import SongUsageManager
-from openlp.plugins.songusage.forms import SongUsageDetailForm, SongUsageDeleteForm
+from openlp.plugins.songusage.forms import SongUsageDetailForm, \
+    SongUsageDeleteForm
 from openlp.plugins.songusage.lib.models import SongUsageItem
 
 log = logging.getLogger(__name__)
@@ -107,12 +108,13 @@
         log.info(u'SongUsage Initialising')
         Plugin.initialise(self)
         QtCore.QObject.connect(Receiver.get_receiver(),
-            QtCore.SIGNAL(u'slidecontroller_live_started'), self.onReceiveSongUsage)
-        self.SongUsageActive = str_to_bool(
-            self.config.get_config(u'active', False))
+            QtCore.SIGNAL(u'slidecontroller_live_started'),
+            self.onReceiveSongUsage)
+        self.SongUsageActive = QtCore.QSettings().value(
+            u'songusage/active', False).toBool()
         self.SongUsageStatus.setChecked(self.SongUsageActive)
         if self.songusagemanager is None:
-            self.songusagemanager = SongUsageManager(self.config)
+            self.songusagemanager = SongUsageManager()
         self.SongUsagedeleteform = SongUsageDeleteForm(self.songusagemanager)
         self.SongUsagedetailform = SongUsageDetailForm(self)
         self.SongUsageMenu.menuAction().setVisible(True)
@@ -125,7 +127,8 @@
 
     def toggleSongUsageState(self):
         self.SongUsageActive = not self.SongUsageActive
-        self.config.set_config(u'active', self.SongUsageActive)
+        QtCore.QSettings().setValue(
+            u'songusage/active', QtCore.QVariant(self.SongUsageActive))
 
     def onReceiveSongUsage(self, items):
         """

=== modified file 'openlpcnv.pyw'
--- openlpcnv.pyw	2010-03-22 19:57:24 +0000
+++ openlpcnv.pyw	2010-04-28 03:18:16 +0000
@@ -35,6 +35,7 @@
     import win32con
     from win32com.client import Dispatch
 
+from openlp.core.utils import AppLocation
 from openlp.migration.display import *
 from openlp.migration.migratefiles import *
 from openlp.migration.migratebibles import *
@@ -103,8 +104,10 @@
     def convert_sqlite2_to_3(self, olddb, newdb):
         print u'Converting sqlite2 ' + olddb + ' to sqlite3 ' + newdb
         if os.name == u'nt':
-            # we can't make this a raw unicode string as the \U within it causes much confusion
-            hKey = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, u'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\SQLite ODBC Driver')
+            # we can't make this a raw unicode string as the \U within it
+            # causes much confusion
+            hKey = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,
+                u'SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\SQLite ODBC Driver')
             value, type = win32api.RegQueryValueEx (hKey, u'UninstallString')
             sqlitepath, temp = os.path.split(value)
             sqliteexe = os.path.join(sqlitepath, u'sqlite.exe')
@@ -133,10 +136,8 @@
 
 if __name__ == u'__main__':
     mig = Migration()
-    songconfig = PluginConfig(u'Songs')
-    newsongpath = songconfig.get_data_path()
-    bibleconfig = PluginConfig(u'Bibles')
-    newbiblepath = bibleconfig.get_data_path()
+    newsongpath = AppLocation.get_section_data_path(u'songs')
+    newbiblepath = AppLocation.get_section_data_path(u'bibles')
     if os.name == u'nt':
         if not os.path.isdir(newsongpath):
             os.makedirs(newsongpath)


Follow ups