← Back to team overview

openlp-core team mailing list archive

[Merge] lp:~googol/openlp/central-settings-place into lp:openlp

 

Andreas Preikschat has proposed merging lp:~googol/openlp/central-settings-place into lp:openlp.

Requested reviews:
  OpenLP Core (openlp-core)
Related bugs:
  Bug #1096559 in OpenLP: "Central place for default settings"
  https://bugs.launchpad.net/openlp/+bug/1096559
  Bug #1128376 in OpenLP: "Configure shortcuts has two items called settings"
  https://bugs.launchpad.net/openlp/+bug/1128376

For more details, see:
https://code.launchpad.net/~googol/openlp/central-settings-place/+merge/149375

Hello,

- fixed bug #1128376 (Configure shortcuts has two items called settings)
- do not pass shortcuts (use dict with default values)
- added ActionList tests

http://ci.openlp.org/view/Specific%20Branch/job/OpenLP-Pull_and_Run_Functional_Tests/61/

http://ci.openlp.org/view/Specific%20Branch/job/OpenLP-Pull_and_Run_Interface_Tests/14/
-- 
https://code.launchpad.net/~googol/openlp/central-settings-place/+merge/149375
Your team OpenLP Core is requested to review the proposed merge of lp:~googol/openlp/central-settings-place into lp:openlp.
=== modified file 'openlp/core/lib/mediamanageritem.py'
--- openlp/core/lib/mediamanageritem.py	2013-02-07 08:42:17 +0000
+++ openlp/core/lib/mediamanageritem.py	2013-02-19 19:30:31 +0000
@@ -229,25 +229,28 @@
             create_widget_action(self.listView, separator=True)
         if self.hasDeleteIcon:
             create_widget_action(self.listView,
+                u'listView%s%sItem' % (self.plugin.name.title(), StringContent.Delete.title()),
                 text=self.plugin.getString(StringContent.Delete)[u'title'],
                 icon=u':/general/general_delete.png',
-                shortcuts=[QtCore.Qt.Key_Delete], triggers=self.onDeleteClick)
+                can_shortcuts=True, triggers=self.onDeleteClick)
             create_widget_action(self.listView, separator=True)
         create_widget_action(self.listView,
+            u'listView%s%sItem' % (self.plugin.name.title(), StringContent.Preview.title()),
             text=self.plugin.getString(StringContent.Preview)[u'title'],
             icon=u':/general/general_preview.png',
-            shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return],
+            can_shortcuts=True,
             triggers=self.onPreviewClick)
         create_widget_action(self.listView,
+            u'listView%s%sItem' % (self.plugin.name.title(), StringContent.Live.title()),
             text=self.plugin.getString(StringContent.Live)[u'title'],
             icon=u':/general/general_live.png',
-            shortcuts=[QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Enter,
-            QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Return],
+            can_shortcuts=True,
             triggers=self.onLiveClick)
         create_widget_action(self.listView,
+            u'listView%s%sItem' % (self.plugin.name.title(), StringContent.Service.title()),
+            can_shortcuts=True,
             text=self.plugin.getString(StringContent.Service)[u'title'],
             icon=u':/general/general_add.png',
-            shortcuts=[QtCore.Qt.Key_Plus, QtCore.Qt.Key_Equal],
             triggers=self.onAddClick)
         if self.addToServiceItem:
             create_widget_action(self.listView, separator=True)

=== modified file 'openlp/core/lib/settings.py'
--- openlp/core/lib/settings.py	2013-02-16 18:24:31 +0000
+++ openlp/core/lib/settings.py	2013-02-19 19:30:31 +0000
@@ -152,42 +152,57 @@
         u'SettingsImport/type': u'OpenLP_settings_export',
         u'SettingsImport/version': u'',
         u'shortcuts/aboutItem': [QtGui.QKeySequence(u'Ctrl+F1')],
+        u'shortcuts/addToService': [],
         u'shortcuts/audioPauseItem': [],
         u'shortcuts/displayTagItem': [],
-        u'shortcuts/blankScreen': [QtCore.Qt.Key_Period],
-        u'shortcuts/collapse': [QtCore.Qt.Key_Minus],
+        u'shortcuts/blankScreen': [QtGui.QKeySequence(QtCore.Qt.Key_Period)],
+        u'shortcuts/collapse': [QtGui.QKeySequence(QtCore.Qt.Key_Minus)],
         u'shortcuts/desktopScreen': [QtGui.QKeySequence(u'D')],
-        u'shortcuts/down': [QtCore.Qt.Key_Down],
-        u'shortcuts/escapeItem': [QtCore.Qt.Key_Escape],
-        u'shortcuts/expand': [QtCore.Qt.Key_Plus],
+        u'shortcuts/delete': [],
+        u'shortcuts/down': [QtGui.QKeySequence(QtCore.Qt.Key_Down)],
+        u'shortcuts/editSong': [],
+        u'shortcuts/escapeItem': [QtGui.QKeySequence(QtCore.Qt.Key_Escape)],
+        u'shortcuts/expand': [QtGui.QKeySequence(QtCore.Qt.Key_Plus)],
         u'shortcuts/exportThemeItem': [],
         u'shortcuts/fileNewItem': [QtGui.QKeySequence(u'Ctrl+N')],
         u'shortcuts/fileSaveAsItem': [QtGui.QKeySequence(u'Ctrl+Shift+S')],
         u'shortcuts/fileExitItem': [QtGui.QKeySequence(u'Alt+F4')],
         u'shortcuts/fileSaveItem': [QtGui.QKeySequence(u'Ctrl+S')],
         u'shortcuts/fileOpenItem': [QtGui.QKeySequence(u'Ctrl+O')],
+        u'shortcuts/goLive': [],
         u'shortcuts/importThemeItem': [],
         u'shortcuts/importBibleItem': [],
+        u'shortcuts/lockPanel': [],
         u'shortcuts/modeDefaultItem': [],
         u'shortcuts/modeLiveItem': [],
-        u'shortcuts/make_live': [QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return],
-        u'shortcuts/moveUp': [QtCore.Qt.Key_PageUp],
-        u'shortcuts/moveTop': [QtCore.Qt.Key_Home],
+        u'shortcuts/make_live': [QtGui.QKeySequence(QtCore.Qt.Key_Enter), QtGui.QKeySequence(QtCore.Qt.Key_Return)],
+        u'shortcuts/moveUp': [QtGui.QKeySequence(QtCore.Qt.Key_PageUp)],
+        u'shortcuts/moveTop': [QtGui.QKeySequence(QtCore.Qt.Key_Home)],
         u'shortcuts/modeSetupItem': [],
-        u'shortcuts/moveBottom': [QtCore.Qt.Key_End],
-        u'shortcuts/moveDown': [QtCore.Qt.Key_PageDown],
+        u'shortcuts/moveBottom': [QtGui.QKeySequence(QtCore.Qt.Key_End)],
+        u'shortcuts/moveDown': [QtGui.QKeySequence(QtCore.Qt.Key_PageDown)],
         u'shortcuts/nextTrackItem': [],
-        u'shortcuts/nextItem_live': [QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown],
-        u'shortcuts/nextService': [QtCore.Qt.Key_Right],
+        u'shortcuts/nextItem_live': [QtGui.QKeySequence(QtCore.Qt.Key_Down),
+            QtGui.QKeySequence(QtCore.Qt.Key_PageDown)],
+        u'shortcuts/nextItem_preview': [],
+        u'shortcuts/nextService': [QtGui.QKeySequence(QtCore.Qt.Key_Right)],
+        u'shortcuts/newService': [],
         u'shortcuts/offlineHelpItem': [],
         u'shortcuts/onlineHelpItem': [QtGui.QKeySequence(u'Alt+F1')],
-        u'shortcuts/previousItem_live': [QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp],
+        u'shortcuts/openService': [],
+        u'shortcuts/saveService': [],
+        u'shortcuts/previousItem_live': [QtGui.QKeySequence(QtCore.Qt.Key_Up),
+            QtGui.QKeySequence(QtCore.Qt.Key_PageUp)],
+        u'shortcuts/playbackPause': [],
+        u'shortcuts/playbackPlay': [],
+        u'shortcuts/playbackStop': [],
         u'shortcuts/playSlidesLoop': [],
         u'shortcuts/playSlidesOnce': [],
-        u'shortcuts/previousService': [QtCore.Qt.Key_Left],
+        u'shortcuts/previousService': [QtGui.QKeySequence(QtCore.Qt.Key_Left)],
+        u'shortcuts/previousItem_preview': [],
         u'shortcuts/printServiceItem': [QtGui.QKeySequence(u'Ctrl+P')],
         u'shortcuts/songExportItem': [],
-        u'shortcuts/songUsageStatus': [QtCore.Qt.Key_F4],
+        u'shortcuts/songUsageStatus': [QtGui.QKeySequence(QtCore.Qt.Key_F4)],
         u'shortcuts/settingsShortcutsItem': [],
         u'shortcuts/settingsImportItem': [],
         u'shortcuts/settingsPluginListItem': [QtGui.QKeySequence(u'Alt+F7')],
@@ -200,23 +215,78 @@
         u'shortcuts/shortcutAction_O': [QtGui.QKeySequence(u'O')],
         u'shortcuts/shortcutAction_P': [QtGui.QKeySequence(u'P')],
         u'shortcuts/shortcutAction_V': [QtGui.QKeySequence(u'V')],
+        u'shortcuts/shortcutAction_0': [QtGui.QKeySequence(u'0')],
+        u'shortcuts/shortcutAction_1': [QtGui.QKeySequence(u'1')],
+        u'shortcuts/shortcutAction_2': [QtGui.QKeySequence(u'2')],
+        u'shortcuts/shortcutAction_3': [QtGui.QKeySequence(u'3')],
+        u'shortcuts/shortcutAction_4': [QtGui.QKeySequence(u'4')],
+        u'shortcuts/shortcutAction_5': [QtGui.QKeySequence(u'5')],
+        u'shortcuts/shortcutAction_6': [QtGui.QKeySequence(u'6')],
+        u'shortcuts/shortcutAction_7': [QtGui.QKeySequence(u'7')],
+        u'shortcuts/shortcutAction_8': [QtGui.QKeySequence(u'8')],
+        u'shortcuts/shortcutAction_9': [QtGui.QKeySequence(u'9')],
         u'shortcuts/settingsExportItem': [],
         u'shortcuts/songUsageReport': [],
         u'shortcuts/songImportItem': [],
         u'shortcuts/themeScreen': [QtGui.QKeySequence(u'T')],
         u'shortcuts/toolsReindexItem': [],
-        u'shortcuts/toolsAlertItem': [u'F7'],
+        u'shortcuts/toolsAlertItem': [QtGui.QKeySequence(u'F7')],
         u'shortcuts/toolsFirstTimeWizard': [],
         u'shortcuts/toolsOpenDataFolder': [],
         u'shortcuts/toolsAddToolItem': [],
         u'shortcuts/updateThemeImages': [],
-        u'shortcuts/up': [QtCore.Qt.Key_Up],
+        u'shortcuts/up': [QtGui.QKeySequence(QtCore.Qt.Key_Up)],
         u'shortcuts/viewThemeManagerItem': [QtGui.QKeySequence(u'F10')],
         u'shortcuts/viewMediaManagerItem': [QtGui.QKeySequence(u'F8')],
         u'shortcuts/viewPreviewPanel': [QtGui.QKeySequence(u'F11')],
         u'shortcuts/viewLivePanel': [QtGui.QKeySequence(u'F12')],
         u'shortcuts/viewServiceManagerItem': [QtGui.QKeySequence(u'F9')],
         u'shortcuts/webSiteItem': [],
+
+        # FIXME: To be sorted.
+        u'shortcuts/listViewSongsDeleteItem': [QtGui.QKeySequence(QtCore.Qt.Key_Delete)],
+        u'shortcuts/listViewSongsPreviewItem': [QtGui.QKeySequence(QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewSongsLiveItem': [QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewSongsServiceItem': [QtGui.QKeySequence(QtCore.Qt.Key_Plus),
+            QtGui.QKeySequence(QtCore.Qt.Key_Equal)],
+        u'shortcuts/listViewBiblesDeleteItem': [QtGui.QKeySequence(QtCore.Qt.Key_Delete)],
+        u'shortcuts/listViewBiblesPreviewItem': [QtGui.QKeySequence(QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewBiblesLiveItem': [QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewBiblesServiceItem': [QtGui.QKeySequence(QtCore.Qt.Key_Plus),
+            QtGui.QKeySequence(QtCore.Qt.Key_Equal)],
+        u'shortcuts/listViewPresentationsDeleteItem': [QtGui.QKeySequence(QtCore.Qt.Key_Delete)],
+        u'shortcuts/listViewPresentationsPreviewItem': [QtGui.QKeySequence(QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewPresentationsLiveItem': [QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewPresentationsServiceItem': [QtGui.QKeySequence(QtCore.Qt.Key_Plus),
+            QtGui.QKeySequence(QtCore.Qt.Key_Equal)],
+        u'shortcuts/listViewImagesDeleteItem': [QtGui.QKeySequence(QtCore.Qt.Key_Delete)],
+        u'shortcuts/listViewImagesPreviewItem': [QtGui.QKeySequence(QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewImagesLiveItem': [QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewImagesServiceItem': [QtGui.QKeySequence(QtCore.Qt.Key_Plus),
+            QtGui.QKeySequence(QtCore.Qt.Key_Equal)],
+        u'shortcuts/listViewMediaDeleteItem': [QtGui.QKeySequence(QtCore.Qt.Key_Delete)],
+        u'shortcuts/listViewMediaPreviewItem': [QtGui.QKeySequence(QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewMediaLiveItem': [QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewMediaServiceItem': [QtGui.QKeySequence(QtCore.Qt.Key_Plus),
+            QtGui.QKeySequence(QtCore.Qt.Key_Equal)],
+        u'shortcuts/listViewCustomDeleteItem': [QtGui.QKeySequence(QtCore.Qt.Key_Delete)],
+        u'shortcuts/listViewCustomPreviewItem': [QtGui.QKeySequence(QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewCustomLiveItem': [QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Enter),
+            QtGui.QKeySequence(QtCore.Qt.ShiftModifier | QtCore.Qt.Key_Return)],
+        u'shortcuts/listViewCustomServiceItem': [QtGui.QKeySequence(QtCore.Qt.Key_Plus),
+            QtGui.QKeySequence(QtCore.Qt.Key_Equal)],
+
         u'themes/global theme': u'',
         u'themes/last directory': u'',
         u'themes/last directory export': u'',
@@ -288,6 +358,14 @@
         else:
             QtCore.QSettings.__init__(self, *args)
 
+    def get_default_value(self, key):
+        """
+        Get the default value of the given key
+        """
+        if self.group():
+            key = self.group() + u'/' + key
+        return Settings.__default_settings__[key]
+
     def remove_obsolete_settings(self):
         """
         This method is only called to clean up the config. It removes old settings and it renames settings. See

=== modified file 'openlp/core/lib/ui.py'
--- openlp/core/lib/ui.py	2013-02-07 07:17:19 +0000
+++ openlp/core/lib/ui.py	2013-02-19 19:30:31 +0000
@@ -69,9 +69,8 @@
 
 def create_button_box(dialog, name, standard_buttons, custom_buttons=None):
     """
-    Creates a QDialogButtonBox with the given buttons. The ``accepted()`` and
-    ``rejected()`` signals of the button box are connected with the dialogs
-    ``accept()`` and ``reject()`` slots.
+    Creates a QDialogButtonBox with the given buttons. The ``accepted()`` and ``rejected()`` signals of the button box
+    are connected with the dialogs ``accept()`` and ``reject()`` slots.
 
     ``dialog``
         The parent object. This has to be a ``QDialog`` descendant.
@@ -80,13 +79,12 @@
         A string which is set as object name.
 
     ``standard_buttons``
-        A list of strings for the used buttons. It might contain: ``ok``,
-        ``save``, ``cancel``, ``close``, and ``defaults``.
+        A list of strings for the used buttons. It might contain: ``ok``, ``save``, ``cancel``, ``close``, and
+        ``defaults``.
 
     ``custom_buttons``
-        A list of additional buttons. If a item is a instance of
-        QtGui.QAbstractButton it is added with QDialogButtonBox.ActionRole.
-        Otherwhise the item has to be a tuple of a button and a ButtonRole.
+        A list of additional buttons. If a item is a instance of QtGui.QAbstractButton it is added with
+        QDialogButtonBox.ActionRole. Otherwhise the item has to be a tuple of a button and a ButtonRole.
     """
     if custom_buttons is None:
         custom_buttons = []
@@ -116,8 +114,7 @@
 
 def critical_error_message_box(title=None, message=None, parent=None, question=False):
     """
-    Provides a standard critical message box for errors that OpenLP displays
-    to users.
+    Provides a standard critical message box for errors that OpenLP displays to users.
 
     ``title``
         The title for the message box.
@@ -134,7 +131,6 @@
     if question:
         return QtGui.QMessageBox.critical(parent, UiStrings().Error, message,
             QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No))
-    data = {u'message': message}
     return Registry().get(u'main_window').error_message(title if title else UiStrings().Error, message)
 
 
@@ -166,16 +162,14 @@
         A string which is set as object name (required).
 
     ``role``
-        A string which can have one value out of ``delete``, ``up``, and
-        ``down``. This decides about default values for properties like text,
-        icon, or tooltip.
+        A string which can have one value out of ``delete``, ``up``, and ``down``. This decides about default values
+        for properties like text, icon, or tooltip.
 
     ``text``
         A string for the action text.
 
     ``icon``
-        Either a QIcon, a resource string, or a file location string for the
-        action icon.
+        Either a QIcon, a resource string, or a file location string for the action icon.
 
     ``tooltip``
         A string for the action tool tip.
@@ -195,8 +189,7 @@
             kwargs.setdefault(u'icon', u':/services/service_down.png')
             kwargs.setdefault(u'tooltip', translate('OpenLP.Ui', 'Move selection down one position.'))
         else:
-            log.warn(u'The role "%s" is not defined in create_push_button().',
-                role)
+            log.warn(u'The role "%s" is not defined in create_push_button().', role)
     if kwargs.pop(u'class', u'') == u'toolbutton':
         button = QtGui.QToolButton(parent)
     else:
@@ -256,8 +249,10 @@
     ``data``
         The action's data.
 
-    ``shortcuts``
-        A QList<QKeySequence> (or a list of strings) which are set as shortcuts.
+    ``can_shortcuts``
+        Boolean stating if this action has shortcuts or if it can have shortcuts. If ``True`` the action is added to
+        shortcut dialog. **Note**: Never set the shortcuts yourselt; use the :class:`~openlp.core.lib.Settings` class
+        to define the action's shortcuts.
 
     ``context``
         A context for the shortcut execution.
@@ -289,27 +284,24 @@
         action.setSeparator(True)
     if u'data' in kwargs:
         action.setData(kwargs.pop(u'data'))
-    if kwargs.get(u'shortcuts'):
-        action.setShortcuts(kwargs.pop(u'shortcuts'))
+    if kwargs.pop(u'can_shortcuts', False):
+        action_list = ActionList.get_instance()
+        action_list.add_action(action, kwargs.pop(u'category', None))
     if u'context' in kwargs:
         action.setShortcutContext(kwargs.pop(u'context'))
-    if kwargs.get(u'category'):
-        action_list = ActionList.get_instance()
-        action_list.add_action(action, unicode(kwargs.pop(u'category')))
     if kwargs.get(u'triggers'):
-        QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'),
-            kwargs.pop(u'triggers'))
+        QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), kwargs.pop(u'triggers'))
     for key in kwargs.keys():
-        if key not in [u'text', u'icon', u'tooltip', u'statustip', u'checked', u'shortcuts', u'category', u'triggers']:
+        if key not in [u'text', u'icon', u'tooltip', u'statustip', u'checked', u'can_shortcuts',
+                u'category', u'triggers']:
             log.warn(u'Parameter %s was not consumed in create_action().', key)
     return action
 
 
 def create_widget_action(parent, name=u'', **kwargs):
     """
-    Return a new QAction by calling ``create_action(parent, name, **kwargs)``.
-    The shortcut context defaults to ``QtCore.Qt.WidgetShortcut`` and the action
-    is added to the parents action list.
+    Return a new QAction by calling ``create_action(parent, name, **kwargs)``. The shortcut context defaults to
+    ``QtCore.Qt.WidgetShortcut`` and the action is added to the parents action list.
     """
     kwargs.setdefault(u'context', QtCore.Qt.WidgetShortcut)
     action = create_action(parent, name, **kwargs)
@@ -334,8 +326,7 @@
 
 def create_valign_selection_widgets(parent):
     """
-    Creates a standard label and combo box for asking users to select a
-    vertical alignment.
+    Creates a standard label and combo box for asking users to select a vertical alignment.
 
     ``parent``
         The parent object. This should be a ``QWidget`` descendant.

=== modified file 'openlp/core/ui/mainwindow.py'
--- openlp/core/ui/mainwindow.py	2013-02-17 12:57:52 +0000
+++ openlp/core/ui/mainwindow.py	2013-02-19 19:30:31 +0000
@@ -174,99 +174,101 @@
         main_window.addDockWidget(QtCore.Qt.RightDockWidgetArea, self.themeManagerDock)
         # Create the menu items
         action_list = ActionList.get_instance()
-        action_list.add_category(UiStrings().File, CategoryOrder.standardMenu)
+        action_list.add_category(UiStrings().File, CategoryOrder.standard_menu)
         self.fileNewItem = create_action(main_window, u'fileNewItem',
             icon=u':/general/general_new.png',
-            shortcuts=[QtGui.QKeySequence(u'Ctrl+N')],
+            can_shortcuts=True,
             category=UiStrings().File,
             triggers=self.serviceManagerContents.on_new_service_clicked)
         self.fileOpenItem = create_action(main_window, u'fileOpenItem',
             icon=u':/general/general_open.png',
-            shortcuts=[QtGui.QKeySequence(u'Ctrl+O')],
+            can_shortcuts=True,
             category=UiStrings().File,
             triggers=self.serviceManagerContents.on_load_service_clicked)
         self.fileSaveItem = create_action(main_window, u'fileSaveItem',
             icon=u':/general/general_save.png',
-            shortcuts=[QtGui.QKeySequence(u'Ctrl+S')],
+            can_shortcuts=True,
             category=UiStrings().File,
             triggers=self.serviceManagerContents.save_file)
         self.fileSaveAsItem = create_action(main_window, u'fileSaveAsItem',
-            shortcuts=[QtGui.QKeySequence(u'Ctrl+Shift+S')],
+            can_shortcuts=True,
             category=UiStrings().File,
             triggers=self.serviceManagerContents.save_file_as)
         self.printServiceOrderItem = create_action(main_window,
-            u'printServiceItem', shortcuts=[QtGui.QKeySequence(u'Ctrl+P')],
+            u'printServiceItem', can_shortcuts=True,
             category=UiStrings().File,
             triggers=self.serviceManagerContents.print_service_order)
         self.fileExitItem = create_action(main_window, u'fileExitItem',
             icon=u':/system/system_exit.png',
-            shortcuts=[QtGui.QKeySequence(u'Alt+F4')],
+            can_shortcuts=True,
             category=UiStrings().File, triggers=main_window.close)
         # Give QT Extra Hint that this is the Exit Menu Item
         self.fileExitItem.setMenuRole(QtGui.QAction.QuitRole)
-        action_list.add_category(UiStrings().Import, CategoryOrder.standardMenu)
-        self.importThemeItem = create_action(main_window, u'importThemeItem', category=UiStrings().Import)
+        action_list.add_category(UiStrings().Import, CategoryOrder.standard_menu)
+        self.importThemeItem = create_action(
+            main_window, u'importThemeItem', category=UiStrings().Import, can_shortcuts=True)
         self.importLanguageItem = create_action(main_window, u'importLanguageItem')
-        action_list.add_category(UiStrings().Export, CategoryOrder.standardMenu)
-        self.exportThemeItem = create_action(main_window, u'exportThemeItem', category=UiStrings().Export)
+        action_list.add_category(UiStrings().Export, CategoryOrder.standard_menu)
+        self.exportThemeItem = create_action(
+            main_window, u'exportThemeItem', category=UiStrings().Export, can_shortcuts=True)
         self.exportLanguageItem = create_action(main_window, u'exportLanguageItem')
-        action_list.add_category(UiStrings().View, CategoryOrder.standardMenu)
+        action_list.add_category(UiStrings().View, CategoryOrder.standard_menu)
         self.viewMediaManagerItem = create_action(main_window,
-            u'viewMediaManagerItem', shortcuts=[QtGui.QKeySequence(u'F8')],
+            u'viewMediaManagerItem',
             icon=u':/system/system_mediamanager.png',
             checked=self.mediaManagerDock.isVisible(),
+            can_shortcuts=True,
             category=UiStrings().View, triggers=self.toggleMediaManager)
         self.viewThemeManagerItem = create_action(main_window,
-            u'viewThemeManagerItem', shortcuts=[QtGui.QKeySequence(u'F10')],
+            u'viewThemeManagerItem', can_shortcuts=True,
             icon=u':/system/system_thememanager.png',
             checked=self.themeManagerDock.isVisible(),
             category=UiStrings().View, triggers=self.toggleThemeManager)
         self.viewServiceManagerItem = create_action(main_window,
-            u'viewServiceManagerItem', shortcuts=[QtGui.QKeySequence(u'F9')],
+            u'viewServiceManagerItem', can_shortcuts=True,
             icon=u':/system/system_servicemanager.png',
             checked=self.serviceManagerDock.isVisible(),
             category=UiStrings().View, triggers=self.toggleServiceManager)
         self.viewPreviewPanel = create_action(main_window, u'viewPreviewPanel',
-            shortcuts=[QtGui.QKeySequence(u'F11')], checked=previewVisible,
+            can_shortcuts=True, checked=previewVisible,
             category=UiStrings().View, triggers=self.setPreviewPanelVisibility)
         self.viewLivePanel = create_action(main_window, u'viewLivePanel',
-            shortcuts=[QtGui.QKeySequence(u'F12')], checked=liveVisible,
+            can_shortcuts=True, checked=liveVisible,
             category=UiStrings().View, triggers=self.setLivePanelVisibility)
         self.lockPanel = create_action(main_window, u'lockPanel',
-            checked=panelLocked, triggers=self.setLockPanel)
-        action_list.add_category(UiStrings().ViewMode,
-            CategoryOrder.standardMenu)
-        self.modeDefaultItem = create_action(main_window, u'modeDefaultItem', checked=False,
-            category=UiStrings().ViewMode)
-        self.modeSetupItem = create_action(main_window, u'modeSetupItem', checked=False, category=UiStrings().ViewMode)
-        self.modeLiveItem = create_action(main_window, u'modeLiveItem', checked=True, category=UiStrings().ViewMode)
+            can_shortcuts=True, checked=panelLocked,
+            category=UiStrings().View,
+            triggers=self.setLockPanel)
+        action_list.add_category(UiStrings().ViewMode, CategoryOrder.standard_menu)
+        self.modeDefaultItem = create_action(
+            main_window, u'modeDefaultItem', checked=False, category=UiStrings().ViewMode, can_shortcuts=True)
+        self.modeSetupItem = create_action(
+            main_window, u'modeSetupItem', checked=False, category=UiStrings().ViewMode, can_shortcuts=True)
+        self.modeLiveItem = create_action(
+            main_window, u'modeLiveItem', checked=True, category=UiStrings().ViewMode, can_shortcuts=True)
         self.modeGroup = QtGui.QActionGroup(main_window)
         self.modeGroup.addAction(self.modeDefaultItem)
         self.modeGroup.addAction(self.modeSetupItem)
         self.modeGroup.addAction(self.modeLiveItem)
         self.modeDefaultItem.setChecked(True)
-        action_list.add_category(UiStrings().Tools, CategoryOrder.standardMenu)
+        action_list.add_category(UiStrings().Tools, CategoryOrder.standard_menu)
         self.toolsAddToolItem = create_action(main_window,
-            u'toolsAddToolItem', icon=u':/tools/tools_add.png',
-            category=UiStrings().Tools)
+            u'toolsAddToolItem', icon=u':/tools/tools_add.png', category=UiStrings().Tools, can_shortcuts=True)
         self.toolsOpenDataFolder = create_action(main_window,
-            u'toolsOpenDataFolder', icon=u':/general/general_open.png',
-            category=UiStrings().Tools)
+            u'toolsOpenDataFolder', icon=u':/general/general_open.png', category=UiStrings().Tools, can_shortcuts=True)
         self.toolsFirstTimeWizard = create_action(main_window,
             u'toolsFirstTimeWizard', icon=u':/general/general_revert.png',
-            category=UiStrings().Tools)
+            category=UiStrings().Tools, can_shortcuts=True)
         self.updateThemeImages = create_action(main_window,
-            u'updateThemeImages', category=UiStrings().Tools)
-        action_list.add_category(UiStrings().Settings,
-            CategoryOrder.standardMenu)
+            u'updateThemeImages', category=UiStrings().Tools, can_shortcuts=True)
+        action_list.add_category(UiStrings().Settings, CategoryOrder.standard_menu)
         self.settingsPluginListItem = create_action(main_window,
             u'settingsPluginListItem',
             icon=u':/system/settings_plugin_list.png',
-            shortcuts=[QtGui.QKeySequence(u'Alt+F7')],
+            can_shortcuts=True,
             category=UiStrings().Settings, triggers=self.onPluginItemClicked)
         # i18n Language Items
-        self.autoLanguageItem = create_action(main_window, u'autoLanguageItem',
-            checked=LanguageManager.auto_language)
+        self.autoLanguageItem = create_action(main_window, u'autoLanguageItem', checked=LanguageManager.auto_language)
         self.languageGroup = QtGui.QActionGroup(main_window)
         self.languageGroup.setExclusive(True)
         self.languageGroup.setObjectName(u'languageGroup')
@@ -277,20 +279,21 @@
             languageItem = create_action(main_window, key, checked=qmList[key] == savedLanguage)
             add_actions(self.languageGroup, [languageItem])
         self.settingsShortcutsItem = create_action(main_window, u'settingsShortcutsItem',
-            icon=u':/system/system_configure_shortcuts.png', category=UiStrings().Settings)
+            icon=u':/system/system_configure_shortcuts.png', category=UiStrings().Settings, can_shortcuts=True)
         # Formatting Tags were also known as display tags.
         self.formattingTagItem = create_action(main_window, u'displayTagItem',
-            icon=u':/system/tag_editor.png', category=UiStrings().Settings)
+            icon=u':/system/tag_editor.png', category=UiStrings().Settings, can_shortcuts=True)
         self.settingsConfigureItem = create_action(main_window, u'settingsConfigureItem',
-            icon=u':/system/system_settings.png', category=UiStrings().Settings)
+            icon=u':/system/system_settings.png', can_shortcuts=True, category=UiStrings().Settings)
         # Give QT Extra Hint that this is the Preferences Menu Item
         self.settingsConfigureItem.setMenuRole(QtGui.QAction.PreferencesRole)
-        self.settingsImportItem = create_action(main_window, u'settingsImportItem', category=UiStrings().Settings)
-        self.settingsExportItem = create_action(main_window, u'settingsExportItem', category=UiStrings().Settings)
-        action_list.add_category(UiStrings().Help, CategoryOrder.standardMenu)
+        self.settingsImportItem = create_action(
+            main_window, u'settingsImportItem', category=UiStrings().Import, can_shortcuts=True)
+        self.settingsExportItem = create_action(
+            main_window, u'settingsExportItem', category=UiStrings().Export, can_shortcuts=True)
+        action_list.add_category(UiStrings().Help, CategoryOrder.standard_menu)
         self.aboutItem = create_action(main_window, u'aboutItem', icon=u':/system/system_about.png',
-            shortcuts=[QtGui.QKeySequence(u'Ctrl+F1')],
-            category=UiStrings().Help, triggers=self.onAboutItemClicked)
+            can_shortcuts=True, category=UiStrings().Help, triggers=self.onAboutItemClicked)
         # Give QT Extra Hint that this is an About Menu Item
         self.aboutItem.setMenuRole(QtGui.QAction.AboutRole)
         if os.name == u'nt':
@@ -298,13 +301,13 @@
                 AppLocation.get_directory(AppLocation.AppDir), 'OpenLP.chm')
             self.offlineHelpItem = create_action(main_window, u'offlineHelpItem',
                 icon=u':/system/system_help_contents.png',
-                shortcuts=[QtGui.QKeySequence(u'F1')],
+                can_shortcuts=True,
                 category=UiStrings().Help, triggers=self.onOfflineHelpClicked)
         self.onlineHelpItem = create_action(main_window, u'onlineHelpItem',
             icon=u':/system/system_online_help.png',
-            shortcuts=[QtGui.QKeySequence(u'Alt+F1')],
+            can_shortcuts=True,
             category=UiStrings().Help, triggers=self.onOnlineHelpClicked)
-        self.webSiteItem = create_action(main_window, u'webSiteItem', category=UiStrings().Help)
+        self.webSiteItem = create_action(main_window, u'webSiteItem', can_shortcuts=True, category=UiStrings().Help)
         add_actions(self.fileImportMenu, (self.settingsImportItem, None, self.importThemeItem, self.importLanguageItem))
         add_actions(self.fileExportMenu, (self.settingsExportItem, None, self.exportThemeItem, self.exportLanguageItem))
         add_actions(self.fileMenu, (self.fileNewItem, self.fileOpenItem,

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2013-02-07 21:50:25 +0000
+++ openlp/core/ui/servicemanager.py	2013-02-19 19:30:31 +0000
@@ -153,52 +153,52 @@
         # Add the bottom toolbar
         self.order_toolbar = OpenLPToolbar(self)
         action_list = ActionList.get_instance()
-        action_list.add_category(UiStrings().Service, CategoryOrder.standardToolbar)
+        action_list.add_category(UiStrings().Service, CategoryOrder.standard_toolbar)
         self.service_manager_list.moveTop = self.order_toolbar.addToolbarAction(u'moveTop',
             text=translate('OpenLP.ServiceManager', 'Move to &top'), icon=u':/services/service_top.png',
             tooltip=translate('OpenLP.ServiceManager', 'Move item to the top of the service.'),
-            shortcuts=[QtCore.Qt.Key_Home], category=UiStrings().Service, triggers=self.onServiceTop)
+            can_shortcuts=True, category=UiStrings().Service, triggers=self.onServiceTop)
         self.service_manager_list.moveUp = self.order_toolbar.addToolbarAction(u'moveUp',
             text=translate('OpenLP.ServiceManager', 'Move &up'), icon=u':/services/service_up.png',
             tooltip=translate('OpenLP.ServiceManager', 'Move item up one position in the service.'),
-            shortcuts=[QtCore.Qt.Key_PageUp], category=UiStrings().Service, triggers=self.onServiceUp)
+            can_shortcuts=True, category=UiStrings().Service, triggers=self.onServiceUp)
         self.service_manager_list.moveDown = self.order_toolbar.addToolbarAction(u'moveDown',
             text=translate('OpenLP.ServiceManager', 'Move &down'), icon=u':/services/service_down.png',
             tooltip=translate('OpenLP.ServiceManager', 'Move item down one position in the service.'),
-            shortcuts=[QtCore.Qt.Key_PageDown], category=UiStrings().Service, triggers=self.onServiceDown)
+            can_shortcuts=True, category=UiStrings().Service, triggers=self.onServiceDown)
         self.service_manager_list.moveBottom = self.order_toolbar.addToolbarAction(u'moveBottom',
             text=translate('OpenLP.ServiceManager', 'Move to &bottom'), icon=u':/services/service_bottom.png',
             tooltip=translate('OpenLP.ServiceManager', 'Move item to the end of the service.'),
-            shortcuts=[QtCore.Qt.Key_End], category=UiStrings().Service, triggers=self.onServiceEnd)
+            can_shortcuts=True, category=UiStrings().Service, triggers=self.onServiceEnd)
         self.service_manager_list.down = self.order_toolbar.addToolbarAction(u'down',
-            text=translate('OpenLP.ServiceManager', 'Move &down'),
+            text=translate('OpenLP.ServiceManager', 'Move &down'), can_shortcuts=True,
             tooltip=translate('OpenLP.ServiceManager', 'Moves the selection down the window.'), visible=False,
-            shortcuts=[QtCore.Qt.Key_Down], triggers=self.on_move_selection_down)
+            triggers=self.on_move_selection_down)
         action_list.add_action(self.service_manager_list.down)
         self.service_manager_list.up = self.order_toolbar.addToolbarAction(u'up',
-            text=translate('OpenLP.ServiceManager', 'Move up'), tooltip=translate('OpenLP.ServiceManager',
-                'Moves the selection up the window.'), visible=False, shortcuts=[QtCore.Qt.Key_Up],
+            text=translate('OpenLP.ServiceManager', 'Move up'), can_shortcuts=True,
+            tooltip=translate('OpenLP.ServiceManager', 'Moves the selection up the window.'), visible=False,
             triggers=self.on_move_selection_up)
         action_list.add_action(self.service_manager_list.up)
         self.order_toolbar.addSeparator()
-        self.service_manager_list.delete = self.order_toolbar.addToolbarAction(u'delete',
+        self.service_manager_list.delete = self.order_toolbar.addToolbarAction(u'delete', can_shortcuts=True,
             text=translate('OpenLP.ServiceManager', '&Delete From Service'), icon=u':/general/general_delete.png',
             tooltip=translate('OpenLP.ServiceManager', 'Delete the selected item from the service.'),
-            shortcuts=[QtCore.Qt.Key_Delete], triggers=self.onDeleteFromService)
+            triggers=self.onDeleteFromService)
         self.order_toolbar.addSeparator()
-        self.service_manager_list.expand = self.order_toolbar.addToolbarAction(u'expand',
+        self.service_manager_list.expand = self.order_toolbar.addToolbarAction(u'expand', can_shortcuts=True,
             text=translate('OpenLP.ServiceManager', '&Expand all'), icon=u':/services/service_expand_all.png',
             tooltip=translate('OpenLP.ServiceManager', 'Expand all the service items.'),
-            shortcuts=[QtCore.Qt.Key_Plus], category=UiStrings().Service, triggers=self.onExpandAll)
-        self.service_manager_list.collapse = self.order_toolbar.addToolbarAction(u'collapse',
+            category=UiStrings().Service, triggers=self.onExpandAll)
+        self.service_manager_list.collapse = self.order_toolbar.addToolbarAction(u'collapse', can_shortcuts=True,
             text=translate('OpenLP.ServiceManager', '&Collapse all'), icon=u':/services/service_collapse_all.png',
             tooltip=translate('OpenLP.ServiceManager', 'Collapse all the service items.'),
-            shortcuts=[QtCore.Qt.Key_Minus], category=UiStrings().Service, triggers=self.onCollapseAll)
+            category=UiStrings().Service, triggers=self.onCollapseAll)
         self.order_toolbar.addSeparator()
-        self.service_manager_list.make_live = self.order_toolbar.addToolbarAction(u'make_live',
+        self.service_manager_list.make_live = self.order_toolbar.addToolbarAction(u'make_live', can_shortcuts=True,
             text=translate('OpenLP.ServiceManager', 'Go Live'), icon=u':/general/general_live.png',
             tooltip=translate('OpenLP.ServiceManager', 'Send the selected item to Live.'),
-            shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return], category=UiStrings().Service,
+            category=UiStrings().Service,
             triggers=self.make_live)
         self.layout.addWidget(self.order_toolbar)
         # Connect up our signals and slots

=== modified file 'openlp/core/ui/shortcutlistform.py'
--- openlp/core/ui/shortcutlistform.py	2013-02-05 21:42:15 +0000
+++ openlp/core/ui/shortcutlistform.py	2013-02-19 19:30:31 +0000
@@ -56,8 +56,7 @@
         self.setupUi(self)
         self.changedActions = {}
         self.action_list = ActionList.get_instance()
-        QtCore.QObject.connect(self.primaryPushButton, QtCore.SIGNAL(u'toggled(bool)'),
-            self.onPrimaryPushButtonClicked)
+        QtCore.QObject.connect(self.primaryPushButton, QtCore.SIGNAL(u'toggled(bool)'), self.onPrimaryPushButtonClicked)
         QtCore.QObject.connect(self.alternatePushButton, QtCore.SIGNAL(u'toggled(bool)'),
             self.onAlternatePushButtonClicked)
         QtCore.QObject.connect(self.treeWidget,
@@ -72,8 +71,7 @@
             self.onRestoreDefaultsClicked)
         QtCore.QObject.connect(self.defaultRadioButton, QtCore.SIGNAL(u'clicked(bool)'),
             self.onDefaultRadioButtonClicked)
-        QtCore.QObject.connect(self.customRadioButton, QtCore.SIGNAL(u'clicked(bool)'),
-            self.onCustomRadioButtonClicked)
+        QtCore.QObject.connect(self.customRadioButton, QtCore.SIGNAL(u'clicked(bool)'), self.onCustomRadioButtonClicked)
 
     def keyPressEvent(self, event):
         """
@@ -95,7 +93,7 @@
             return
         key = event.key()
         if key == QtCore.Qt.Key_Shift or key == QtCore.Qt.Key_Control or \
-            key == QtCore.Qt.Key_Meta or key == QtCore.Qt.Key_Alt:
+                key == QtCore.Qt.Key_Meta or key == QtCore.Qt.Key_Alt:
             return
         key_string = QtGui.QKeySequence(key).toString()
         if event.modifiers() & QtCore.Qt.ControlModifier == QtCore.Qt.ControlModifier:
@@ -109,11 +107,9 @@
         key_sequence = QtGui.QKeySequence(key_string)
         if self._validiate_shortcut(self._currentItemAction(), key_sequence):
             if self.primaryPushButton.isChecked():
-                self._adjustButton(self.primaryPushButton,
-                    False, text=key_sequence.toString())
+                self._adjustButton(self.primaryPushButton, False, text=key_sequence.toString())
             elif self.alternatePushButton.isChecked():
-                self._adjustButton(self.alternatePushButton,
-                    False, text=key_sequence.toString())
+                self._adjustButton(self.alternatePushButton, False, text=key_sequence.toString())
 
     def exec_(self):
         """
@@ -147,8 +143,8 @@
 
     def refreshShortcutList(self):
         """
-        This refreshes the item's shortcuts shown in the list. Note, this
-        neither adds new actions nor removes old actions.
+        This refreshes the item's shortcuts shown in the list. Note, this neither adds new actions nor removes old
+        actions.
         """
         iterator = QtGui.QTreeWidgetItemIterator(self.treeWidget)
         while iterator.value():
@@ -204,21 +200,19 @@
         new_shortcuts = []
         if shortcuts:
             new_shortcuts.append(shortcuts[0])
-        new_shortcuts.append(
-            QtGui.QKeySequence(self.alternatePushButton.text()))
+        new_shortcuts.append(QtGui.QKeySequence(self.alternatePushButton.text()))
         self.changedActions[action] = new_shortcuts
         if not self.primaryPushButton.text():
-            # When we do not have a primary shortcut, the just entered alternate
-            # shortcut will automatically become the primary shortcut. That is
-            # why we have to adjust the primary button's text.
+            # When we do not have a primary shortcut, the just entered alternate shortcut will automatically become the
+            # primary shortcut. That is why we have to adjust the primary button's text.
             self.primaryPushButton.setText(self.alternatePushButton.text())
             self.alternatePushButton.setText(u'')
         self.refreshShortcutList()
 
     def onItemDoubleClicked(self, item, column):
         """
-        A item has been double clicked. The ``primaryPushButton`` will be
-        checked and the item's shortcut will be displayed.
+        A item has been double clicked. The ``primaryPushButton`` will be checked and the item's shortcut will be
+        displayed.
         """
         action = self._currentItemAction(item)
         if action is None:
@@ -234,8 +228,7 @@
 
     def onCurrentItemChanged(self, item=None, previousItem=None):
         """
-        A item has been pressed. We adjust the button's text to the action's
-        shortcut which is encapsulate in the item.
+        A item has been pressed. We adjust the button's text to the action's shortcut which is encapsulate in the item.
         """
         action = self._currentItemAction(item)
         self.primaryPushButton.setEnabled(action is not None)
@@ -253,9 +246,8 @@
                 if len(action.defaultShortcuts) == 2:
                     alternate_label_text = action.defaultShortcuts[1].toString()
             shortcuts = self._actionShortcuts(action)
-            # We do not want to loose pending changes, that is why we have to
-            # keep the text when, this function has not been triggered by a
-            # signal.
+            # We do not want to loose pending changes, that is why we have to keep the text when, this function has not
+            # been triggered by a signal.
             if item is None:
                 primary_text = self.primaryPushButton.text()
                 alternate_text = self.alternatePushButton.text()
@@ -264,8 +256,7 @@
             elif len(shortcuts) == 2:
                 primary_text = shortcuts[0].toString()
                 alternate_text = shortcuts[1].toString()
-        # When we are capturing a new shortcut, we do not want, the buttons to
-        # display the current shortcut.
+        # When we are capturing a new shortcut, we do not want, the buttons to display the current shortcut.
         if self.primaryPushButton.isChecked():
             primary_text = u''
         if self.alternatePushButton.isChecked():
@@ -274,8 +265,7 @@
         self.alternatePushButton.setText(alternate_text)
         self.primaryLabel.setText(primary_label_text)
         self.alternateLabel.setText(alternate_label_text)
-        # We do not want to toggle and radio button, as the function has not
-        # been triggered by a signal.
+        # We do not want to toggle and radio button, as the function has not been triggered by a signal.
         if item is None:
             return
         if primary_label_text == primary_text and alternate_label_text == alternate_text:
@@ -303,8 +293,8 @@
 
     def onDefaultRadioButtonClicked(self, toggled):
         """
-        The default radio button has been clicked, which means we have to make
-        sure, that we use the default shortcuts for the action.
+        The default radio button has been clicked, which means we have to make sure, that we use the default shortcuts
+        for the action.
         """
         if not toggled:
             return
@@ -325,9 +315,8 @@
 
     def onCustomRadioButtonClicked(self, toggled):
         """
-        The custom shortcut radio button was clicked, thus we have to restore
-        the custom shortcuts by calling those functions triggered by button
-        clicks.
+        The custom shortcut radio button was clicked, thus we have to restore the custom shortcuts by calling those
+        functions triggered by button clicks.
         """
         if not toggled:
             return
@@ -337,8 +326,8 @@
 
     def save(self):
         """
-        Save the shortcuts. **Note**, that we do not have to load the shortcuts,
-        as they are loaded in :class:`~openlp.core.utils.ActionList`.
+        Save the shortcuts. **Note**, that we do not have to load the shortcuts, as they are loaded in
+        :class:`~openlp.core.utils.ActionList`.
         """
         settings = Settings()
         settings.beginGroup(u'shortcuts')
@@ -348,8 +337,7 @@
                 continue
             for action in category.actions:
                 if action in self.changedActions:
-                    old_shortcuts = map(unicode,
-                        map(QtGui.QKeySequence.toString, action.shortcuts()))
+                    old_shortcuts = map(QtGui.QKeySequence.toString, action.shortcuts())
                     action.setShortcuts(self.changedActions[action])
                     self.action_list.update_shortcut_map(action, old_shortcuts)
                 settings.setValue(action.objectName(), action.shortcuts())
@@ -367,13 +355,10 @@
         new_shortcuts = []
         if action.defaultShortcuts:
             new_shortcuts.append(action.defaultShortcuts[0])
-            # We have to check if the primary default shortcut is available. But
-            # we only have to check, if the action has a default primary
-            # shortcut (an "empty" shortcut is always valid and if the action
-            # does not have a default primary shortcut, then the alternative
-            # shortcut (not the default one) will become primary shortcut, thus
-            # the check will assume that an action were going to have the same
-            # shortcut twice.
+            # We have to check if the primary default shortcut is available. But  we only have to check, if the action
+            # has a default primary shortcut (an "empty" shortcut is always valid and if the action does not have a
+            # default primary shortcut, then the alternative shortcut (not the default one) will become primary
+            # shortcut, thus the check will assume that an action were going to have the same shortcut twice.
             if not self._validiate_shortcut(action, new_shortcuts[0]) and new_shortcuts[0] != shortcuts[0]:
                 return
         if len(shortcuts) == 2:
@@ -405,9 +390,8 @@
 
     def _validiate_shortcut(self, changing_action, key_sequence):
         """
-        Checks if the given ``changing_action `` can use the given
-        ``key_sequence``. Returns ``True`` if the ``key_sequence`` can be used
-        by the action, otherwise displays a dialog and returns ``False``.
+        Checks if the given ``changing_action `` can use the given ``key_sequence``. Returns ``True`` if the
+        ``key_sequence`` can be used by the action, otherwise displays a dialog and returns ``False``.
 
         ``changing_action``
             The action which wants to use the ``key_sequence``.
@@ -429,11 +413,9 @@
                 # Have the same parent, thus they cannot have the same shortcut.
                 if action.parent() is changing_action.parent():
                     is_valid = False
-                # The new shortcut is already assigned, but if both shortcuts
-                # are only valid in a different widget the new shortcut is
-                # vaild, because they will not interfere.
-                if action.shortcutContext() in [QtCore.Qt.WindowShortcut,
-                    QtCore.Qt.ApplicationShortcut]:
+                # The new shortcut is already assigned, but if both shortcuts are only valid in a different widget the
+                # new shortcut is vaild, because they will not interfere.
+                if action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]:
                     is_valid = False
                 if changing_action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]:
                     is_valid = False
@@ -447,9 +429,8 @@
 
     def _actionShortcuts(self, action):
         """
-        This returns the shortcuts for the given ``action``, which also includes
-        those shortcuts which are not saved yet but already assigned (as changes
-        are applied when closing the dialog).
+        This returns the shortcuts for the given ``action``, which also includes those shortcuts which are not saved
+        yet but already assigned (as changes yre applied when closing the dialog).
         """
         if action in self.changedActions:
             return self.changedActions[action]
@@ -457,8 +438,8 @@
 
     def _currentItemAction(self, item=None):
         """
-        Returns the action of the given ``item``. If no item is given, we return
-        the action of the current item of the ``treeWidget``.
+        Returns the action of the given ``item``. If no item is given, we return the action of the current item of
+        the ``treeWidget``.
         """
         if item is None:
             item = self.treeWidget.currentItem()
@@ -486,4 +467,5 @@
             self._main_window = Registry().get(u'main_window')
         return self._main_window
 
-    main_window = property(_get_main_window)
\ No newline at end of file
+    main_window = property(_get_main_window)
+

=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py	2013-02-07 11:33:47 +0000
+++ openlp/core/ui/slidecontroller.py	2013-02-19 19:30:31 +0000
@@ -44,6 +44,14 @@
 
 log = logging.getLogger(__name__)
 
+AUDIO_TIME_LABEL_STYLESHEET = u'background-color: palette(background); ' \
+    u'border-top-color: palette(shadow); ' \
+    u'border-left-color: palette(shadow); ' \
+    u'border-bottom-color: palette(light); ' \
+    u'border-right-color: palette(light); ' \
+    u'border-radius: 3px; border-style: inset; ' \
+    u'border-width: 1; font-family: monospace; margin: 2px;'
+
 
 class DisplayController(QtGui.QWidget):
     """
@@ -124,7 +132,7 @@
             self.keypress_queue = deque()
             self.keypress_loop = False
             self.category = UiStrings().LiveToolbar
-            ActionList.get_instance().add_category(unicode(self.category), CategoryOrder.standardToolbar)
+            ActionList.get_instance().add_category(unicode(self.category), CategoryOrder.standard_toolbar)
         else:
             Registry().register(u'preview_controller', self)
             self.typeLabel.setText(UiStrings().Preview)
@@ -168,13 +176,13 @@
         self.previousItem = create_action(self, u'previousItem_' + self.typePrefix,
             text=translate('OpenLP.SlideController', 'Previous Slide'), icon=u':/slides/slide_previous.png',
             tooltip=translate('OpenLP.SlideController', 'Move to previous.'),
-            shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], context=QtCore.Qt.WidgetWithChildrenShortcut,
+            can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut,
             category=self.category, triggers=self.on_slide_selected_previous)
         self.toolbar.addAction(self.previousItem)
         self.nextItem = create_action(self, u'nextItem_' + self.typePrefix,
             text=translate('OpenLP.SlideController', 'Next Slide'), icon=u':/slides/slide_next.png',
             tooltip=translate('OpenLP.SlideController', 'Move to next.'),
-            shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], context=QtCore.Qt.WidgetWithChildrenShortcut,
+            can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut,
             category=self.category, triggers=self.on_slide_selected_next_action)
         self.toolbar.addAction(self.nextItem)
         self.toolbar.addSeparator()
@@ -190,14 +198,14 @@
             self.toolbar.addToolbarWidget(self.hideMenu)
             self.blankScreen = create_action(self, u'blankScreen',
                 text=translate('OpenLP.SlideController', 'Blank Screen'), icon=u':/slides/slide_blank.png',
-                checked=False, shortcuts=[QtCore.Qt.Key_Period], category=self.category, triggers=self.onBlankDisplay)
+                checked=False, can_shortcuts=True, category=self.category, triggers=self.onBlankDisplay)
             self.themeScreen = create_action(self, u'themeScreen',
                 text=translate('OpenLP.SlideController', 'Blank to Theme'), icon=u':/slides/slide_theme.png',
-                checked=False, shortcuts=[QtGui.QKeySequence(u'T')], category=self.category,
+                checked=False, can_shortcuts=True, category=self.category,
                 triggers=self.onThemeDisplay)
             self.desktopScreen = create_action(self, u'desktopScreen',
                 text=translate('OpenLP.SlideController', 'Show Desktop'), icon=u':/slides/slide_desktop.png',
-                checked=False, shortcuts=[QtGui.QKeySequence(u'D')], category=self.category,
+                checked=False, can_shortcuts=True, category=self.category,
                 triggers=self.onHideDisplay)
             self.hideMenu.setDefaultAction(self.blankScreen)
             self.hideMenu.menu().addAction(self.blankScreen)
@@ -225,10 +233,10 @@
             self.playSlidesMenu.setMenu(QtGui.QMenu(translate('OpenLP.SlideController', 'Play Slides'), self.toolbar))
             self.toolbar.addToolbarWidget(self.playSlidesMenu)
             self.playSlidesLoop = create_action(self, u'playSlidesLoop', text=UiStrings().PlaySlidesInLoop,
-                icon=u':/media/media_time.png', checked=False, shortcuts=[],
+                icon=u':/media/media_time.png', checked=False, can_shortcuts=True,
                 category=self.category, triggers=self.onPlaySlidesLoop)
             self.playSlidesOnce = create_action(self, u'playSlidesOnce', text=UiStrings().PlaySlidesToEnd,
-                icon=u':/media/media_time.png', checked=False, shortcuts=[],
+                icon=u':/media/media_time.png', checked=False, can_shortcuts=True,
                 category=self.category, triggers=self.onPlaySlidesOnce)
             if Settings().value(self.parent().advancedSettingsSection + u'/slide limits') == SlideLimits.Wrap:
                 self.playSlidesMenu.setDefaultAction(self.playSlidesLoop)
@@ -267,7 +275,7 @@
                 icon=u':/slides/media_playback_pause.png', text=translate('OpenLP.SlideController', 'Pause Audio'),
                 tooltip=translate('OpenLP.SlideController', 'Pause audio.'),
                 checked=False, visible=False, category=self.category, context=QtCore.Qt.WindowShortcut,
-                shortcuts=[], triggers=self.onAudioPauseClicked)
+                can_shortcuts=True, triggers=self.onAudioPauseClicked)
             self.audioMenu = QtGui.QMenu(translate('OpenLP.SlideController', 'Background Audio'), self.toolbar)
             self.audioPauseItem.setMenu(self.audioMenu)
             self.audioPauseItem.setParent(self.toolbar)
@@ -276,20 +284,12 @@
             self.nextTrackItem = create_action(self, u'nextTrackItem', text=UiStrings().NextTrack,
                 icon=u':/slides/media_playback_next.png',
                 tooltip=translate('OpenLP.SlideController', 'Go to next audio track.'),
-                category=self.category, shortcuts=[], triggers=self.onNextTrackClicked)
+                category=self.category, can_shortcuts=True, triggers=self.onNextTrackClicked)
             self.audioMenu.addAction(self.nextTrackItem)
             self.trackMenu = self.audioMenu.addMenu(translate('OpenLP.SlideController', 'Tracks'))
             self.audioTimeLabel = QtGui.QLabel(u' 00:00 ', self.toolbar)
             self.audioTimeLabel.setAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignHCenter)
-            self.audioTimeLabel.setStyleSheet(
-                u'background-color: palette(background); '
-                u'border-top-color: palette(shadow); '
-                u'border-left-color: palette(shadow); '
-                u'border-bottom-color: palette(light); '
-                u'border-right-color: palette(light); '
-                u'border-radius: 3px; border-style: inset; '
-                u'border-width: 1; font-family: monospace; margin: 2px;'
-            )
+            self.audioTimeLabel.setStyleSheet(AUDIO_TIME_LABEL_STYLESHEET)
             self.audioTimeLabel.setObjectName(u'audioTimeLabel')
             self.toolbar.addToolbarWidget(self.audioTimeLabel)
             self.toolbar.setWidgetVisible(self.audioList, False)
@@ -334,25 +334,20 @@
             self.shortcutTimer = QtCore.QTimer()
             self.shortcutTimer.setObjectName(u'shortcutTimer')
             self.shortcutTimer.setSingleShot(True)
-            shortcuts = [{u'key': u'V', u'configurable': True,
-                u'text': translate('OpenLP.SlideController', 'Go to "Verse"')},
-                {u'key': u'C', u'configurable': True,
-                u'text': translate('OpenLP.SlideController', 'Go to "Chorus"')},
-                {u'key': u'B', u'configurable': True,
-                u'text': translate('OpenLP.SlideController', 'Go to "Bridge"')},
+            shortcuts = [
+                {u'key': u'V', u'configurable': True, u'text': translate('OpenLP.SlideController', 'Go to "Verse"')},
+                {u'key': u'C', u'configurable': True, u'text': translate('OpenLP.SlideController', 'Go to "Chorus"')},
+                {u'key': u'B', u'configurable': True, u'text': translate('OpenLP.SlideController', 'Go to "Bridge"')},
                 {u'key': u'P', u'configurable': True,
-                u'text': translate('OpenLP.SlideController',
-                'Go to "Pre-Chorus"')},
-                {u'key': u'I', u'configurable': True,
-                u'text': translate('OpenLP.SlideController', 'Go to "Intro"')},
-                {u'key': u'E', u'configurable': True,
-                u'text': translate('OpenLP.SlideController', 'Go to "Ending"')},
-                {u'key': u'O', u'configurable': True,
-                u'text': translate('OpenLP.SlideController', 'Go to "Other"')}]
-            shortcuts += [{u'key': unicode(number)} for number in range(10)]
+                    u'text': translate('OpenLP.SlideController', 'Go to "Pre-Chorus"')},
+                {u'key': u'I', u'configurable': True, u'text': translate('OpenLP.SlideController', 'Go to "Intro"')},
+                {u'key': u'E', u'configurable': True, u'text': translate('OpenLP.SlideController', 'Go to "Ending"')},
+                {u'key': u'O', u'configurable': True, u'text': translate('OpenLP.SlideController', 'Go to "Other"')}
+            ]
+            shortcuts.extend([{u'key': unicode(number)} for number in range(10)])
             self.previewListWidget.addActions([create_action(self,
                 u'shortcutAction_%s' % s[u'key'], text=s.get(u'text'),
-                shortcuts=[QtGui.QKeySequence(s[u'key'])],
+                can_shortcuts=True,
                 context=QtCore.Qt.WidgetWithChildrenShortcut,
                 category=self.category if s.get(u'configurable') else None,
                 triggers=self._slideShortcutActivated) for s in shortcuts])
@@ -451,15 +446,15 @@
         """
         self.previousService = create_action(parent, u'previousService',
             text=translate('OpenLP.SlideController', 'Previous Service'),
-            shortcuts=[QtCore.Qt.Key_Left], context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
+            can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
             triggers=self.servicePrevious)
         self.nextService = create_action(parent, 'nextService',
             text=translate('OpenLP.SlideController', 'Next Service'),
-            shortcuts=[QtCore.Qt.Key_Right], context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
+            can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
             triggers=self.serviceNext)
         self.escapeItem = create_action(parent, 'escapeItem',
             text=translate('OpenLP.SlideController', 'Escape Item'),
-            shortcuts=[QtCore.Qt.Key_Escape], context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
+            can_shortcuts=True, context=QtCore.Qt.WidgetWithChildrenShortcut, category=self.category,
             triggers=self.liveEscape)
 
     def liveEscape(self):

=== modified file 'openlp/core/utils/actions.py'
--- openlp/core/utils/actions.py	2013-02-02 20:18:34 +0000
+++ openlp/core/utils/actions.py	2013-02-19 19:30:31 +0000
@@ -37,8 +37,8 @@
 
 class ActionCategory(object):
     """
-    The :class:`~openlp.core.utils.ActionCategory` class encapsulates a
-    category for the :class:`~openlp.core.utils.CategoryList` class.
+    The :class:`~openlp.core.utils.ActionCategory` class encapsulates a category for the
+    :class:`~openlp.core.utils.CategoryList` class.
     """
     def __init__(self, name, weight=0):
         """
@@ -51,8 +51,7 @@
 
 class CategoryActionList(object):
     """
-    The :class:`~openlp.core.utils.CategoryActionList` class provides a sorted
-    list of actions within a category.
+    The :class:`~openlp.core.utils.CategoryActionList` class provides a sorted list of actions within a category.
     """
     def __init__(self):
         """
@@ -142,9 +141,9 @@
 
 class CategoryList(object):
     """
-    The :class:`~openlp.core.utils.CategoryList` class encapsulates a category
-    list for the :class:`~openlp.core.utils.ActionList` class and provides an
-    iterator interface for walking through the list of actions in this category.
+    The :class:`~openlp.core.utils.CategoryList` class encapsulates a category list for the
+    :class:`~openlp.core.utils.ActionList` class and provides an iterator interface for walking through the list of
+    actions in this category.
     """
 
     def __init__(self):
@@ -244,10 +243,9 @@
 
 class ActionList(object):
     """
-    The :class:`~openlp.core.utils.ActionList` class contains a list of menu
-    actions and categories associated with those actions. Each category also
-    has a weight by which it is sorted when iterating through the list of
-    actions or categories.
+    The :class:`~openlp.core.utils.ActionList` class contains a list of menu actions and categories associated with
+    those actions. Each category also has a weight by which it is sorted when iterating through the list of actions or
+    categories.
     """
     instance = None
     shortcut_map = {}
@@ -271,48 +269,44 @@
         """
         Add an action to the list of actions.
 
+        **Note**: The action's objectName must be set when you want to add it!
+
         ``action``
-            The action to add (QAction). **Note**, the action must not have an
-            empty ``objectName``.
+            The action to add (QAction). **Note**, the action must not have an empty ``objectName``.
 
         ``category``
-            The category this action belongs to. The category has to be a python
-            string. . **Note**, if the category is ``None``, the category and
-            its actions are being hidden in the shortcut dialog. However, if
-            they are added, it is possible to avoid assigning shortcuts twice,
-            which is important.
+            The category this action belongs to. The category has to be a python string. . **Note**, if the category
+            is ``None``, the category and its actions are being hidden in the shortcut dialog. However, if they are
+            added, it is possible to avoid assigning shortcuts twice, which is important.
 
         ``weight``
-            The weight specifies how important a category is. However, this only
-            has an impact on the order the categories are displayed.
+            The weight specifies how important a category is. However, this only has an impact on the order the
+            categories are displayed.
         """
         if category not in self.categories:
             self.categories.append(category)
-        action.defaultShortcuts = action.shortcuts()
+        settings = Settings()
+        settings.beginGroup(u'shortcuts')
+        # Get the default shortcut from the config.
+        action.defaultShortcuts = settings.get_default_value(action.objectName())
         if weight is None:
             self.categories[category].actions.append(action)
         else:
             self.categories[category].actions.add(action, weight)
         # Load the shortcut from the config.
-        settings = Settings()
-        settings.beginGroup(u'shortcuts')
         shortcuts = settings.value(action.objectName())
         settings.endGroup()
         if not shortcuts:
             action.setShortcuts([])
             return
-        # We have to do this to ensure that the loaded shortcut list e. g.
-        # STRG+O (German) is converted to CTRL+O, which is only done when we
-        # convert the strings in this way (QKeySequence -> QString -> unicode).
-        shortcuts = map(QtGui.QKeySequence, shortcuts)
-        shortcuts = map(unicode, map(QtGui.QKeySequence.toString, shortcuts))
-        # Check the alternate shortcut first, to avoid problems when the
-        # alternate shortcut becomes the primary shortcut after removing the
-        # (initial) primary shortcut due to conflicts.
+        # We have to do this to ensure that the loaded shortcut list e. g. STRG+O (German) is converted to CTRL+O,
+        # which is only done when we convert the strings in this way (QKeySequencet -> uncode).
+        shortcuts = map(QtGui.QKeySequence.toString, map(QtGui.QKeySequence, shortcuts))
+        # Check the alternate shortcut first, to avoid problems when the alternate shortcut becomes the primary shortcut
+        #  after removing the (initial) primary shortcut due to conflicts.
         if len(shortcuts) == 2:
             existing_actions = ActionList.shortcut_map.get(shortcuts[1], [])
-            # Check for conflicts with other actions considering the shortcut
-            # context.
+            # Check for conflicts with other actions considering the shortcut context.
             if self._is_shortcut_available(existing_actions, action):
                 actions = ActionList.shortcut_map.get(shortcuts[1], [])
                 actions.append(action)
@@ -321,28 +315,24 @@
                 shortcuts.remove(shortcuts[1])
         # Check the primary shortcut.
         existing_actions = ActionList.shortcut_map.get(shortcuts[0], [])
-        # Check for conflicts with other actions considering the shortcut
-        # context.
+        # Check for conflicts with other actions considering the shortcut context.
         if self._is_shortcut_available(existing_actions, action):
             actions = ActionList.shortcut_map.get(shortcuts[0], [])
             actions.append(action)
             ActionList.shortcut_map[shortcuts[0]] = actions
         else:
             shortcuts.remove(shortcuts[0])
-        action.setShortcuts(
-            [QtGui.QKeySequence(shortcut) for shortcut in shortcuts])
+        action.setShortcuts([QtGui.QKeySequence(shortcut) for shortcut in shortcuts])
 
     def remove_action(self, action, category=None):
         """
-        This removes an action from its category. Empty categories are
-        automatically removed.
+        This removes an action from its category. Empty categories are automatically removed.
 
         ``action``
             The ``QAction`` object to be removed.
 
         ``category``
-            The name (unicode string) of the category, which contains the
-            action. Defaults to None.
+            The name (unicode string) of the category, which contains the action. Defaults to None.
         """
         if category not in self.categories:
             return
@@ -350,10 +340,9 @@
         # Remove empty categories.
         if not self.categories[category].actions:
             self.categories.remove(category)
-        shortcuts = map(unicode, map(QtGui.QKeySequence.toString, action.shortcuts()))
+        shortcuts = map(QtGui.QKeySequence.toString, action.shortcuts())
         for shortcut in shortcuts:
-            # Remove action from the list of actions which are using this
-            # shortcut.
+            # Remove action from the list of actions which are using this shortcut.
             ActionList.shortcut_map[shortcut].remove(action)
             # Remove empty entries.
             if not ActionList.shortcut_map[shortcut]:
@@ -361,8 +350,7 @@
 
     def add_category(self, name, weight):
         """
-        Add an empty category to the list of categories. This is ony convenient
-        for categories with a given weight.
+        Add an empty category to the list of categories. This is only convenient for categories with a given weight.
 
         ``name``
             The category's name.
@@ -381,27 +369,24 @@
 
     def update_shortcut_map(self, action, old_shortcuts):
         """
-        Remove the action for the given ``old_shortcuts`` from the
-        ``shortcut_map`` to ensure its up-to-dateness.
+        Remove the action for the given ``old_shortcuts`` from the ``shortcut_map`` to ensure its up-to-dateness.
 
-        **Note**: The new action's shortcuts **must** be assigned to the given
-        ``action`` **before** calling this method.
+        **Note**: The new action's shortcuts **must** be assigned to the given ``action`` **before** calling this
+        method.
 
         ``action``
-            The action whose shortcuts are supposed to be updated in the
-            ``shortcut_map``.
+            The action whose shortcuts are supposed to be updated in the ``shortcut_map``.
 
         ``old_shortcuts``
             A list of unicode keysequences.
         """
         for old_shortcut in old_shortcuts:
-            # Remove action from the list of actions which are using this
-            # shortcut.
+            # Remove action from the list of actions which are using this shortcut.
             ActionList.shortcut_map[old_shortcut].remove(action)
             # Remove empty entries.
             if not ActionList.shortcut_map[old_shortcut]:
                 del ActionList.shortcut_map[old_shortcut]
-        new_shortcuts = map(unicode, map(QtGui.QKeySequence.toString, action.shortcuts()))
+        new_shortcuts = map(QtGui.QKeySequence.toString, action.shortcuts())
         # Add the new shortcuts to the map.
         for new_shortcut in new_shortcuts:
             existing_actions = ActionList.shortcut_map.get(new_shortcut, [])
@@ -410,8 +395,7 @@
 
     def _is_shortcut_available(self, existing_actions, action):
         """
-        Checks if the given ``action`` may use its assigned shortcut(s) or not.
-        Returns ``True`` or ``False.
+        Checks if the given ``action`` may use its assigned shortcut(s) or not. Returns ``True`` or ``False.
 
         ``existing_actions``
             A list of actions which already use a particular shortcut.
@@ -419,28 +403,29 @@
         ``action``
             The action which wants to use a particular shortcut.
         """
-        local = action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]
-        affected_actions = filter(lambda a: isinstance(a, QtGui.QAction),
-            self.getAllChildObjects(action.parent())) if local else []
+        global_context = action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]
+        affected_actions = []
+        if global_context:
+            affected_actions = filter(
+                lambda a: isinstance(a, QtGui.QAction), self.get_all_child_objects(action.parent()))
         for existing_action in existing_actions:
             if action is existing_action:
                 continue
-            if not local or existing_action in affected_actions:
+            if global_context or existing_action in affected_actions:
                 return False
             if existing_action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]:
                 return False
-            elif action in self.getAllChildObjects(existing_action.parent()):
+            elif action in self.get_all_child_objects(existing_action.parent()):
                 return False
         return True
 
-    def getAllChildObjects(self, qobject):
-        """
-        Goes recursively through the children of ``qobject`` and returns a list
-        of all child objects.
-        """
-        children = [child for child in qobject.children()]
-        for child in qobject.children():
-            children.append(self.getAllChildObjects(child))
+    def get_all_child_objects(self, qobject):
+        """
+        Goes recursively through the children of ``qobject`` and returns a list of all child objects.
+        """
+        children = qobject.children()
+        # Append the children's children.
+        children.extend(map(self.get_all_child_objects, children))
         return children
 
 
@@ -448,5 +433,5 @@
     """
     An enumeration class for category weights.
     """
-    standardMenu = -20
-    standardToolbar = -10
+    standard_menu = -20
+    standard_toolbar = -10

=== modified file 'openlp/plugins/alerts/alertsplugin.py'
--- openlp/plugins/alerts/alertsplugin.py	2013-02-05 08:05:28 +0000
+++ openlp/plugins/alerts/alertsplugin.py	2013-02-19 19:30:31 +0000
@@ -150,7 +150,7 @@
         self.toolsAlertItem = create_action(tools_menu, u'toolsAlertItem',
             text=translate('AlertsPlugin', '&Alert'), icon=u':/plugins/plugin_alerts.png',
             statustip=translate('AlertsPlugin', 'Show an alert message.'),
-            visible=False, shortcuts=[u'F7'], triggers=self.onAlertsTrigger)
+            visible=False, can_shortcuts=True, triggers=self.onAlertsTrigger)
         self.main_window.toolsMenu.addAction(self.toolsAlertItem)
 
     def initialise(self):

=== modified file 'openlp/plugins/images/lib/mediaitem.py'
--- openlp/plugins/images/lib/mediaitem.py	2013-02-07 11:33:47 +0000
+++ openlp/plugins/images/lib/mediaitem.py	2013-02-19 19:30:31 +0000
@@ -32,9 +32,8 @@
 
 from PyQt4 import QtCore, QtGui
 
-from openlp.core.lib import MediaManagerItem, ItemCapabilities, Registry, SettingsManager, ServiceItemContext, \
-    Settings, UiStrings, build_icon, check_item_selected, check_directory_exists, create_thumb, translate, \
-    validate_thumb
+from openlp.core.lib import MediaManagerItem, ItemCapabilities, Registry, ServiceItemContext, Settings, UiStrings, \
+    build_icon, check_item_selected, check_directory_exists, create_thumb, translate, validate_thumb
 from openlp.core.lib.ui import critical_error_message_box
 from openlp.core.utils import AppLocation, delete_file, locale_compare, get_images_filter
 
@@ -107,7 +106,7 @@
                     delete_file(os.path.join(self.servicePath, text.text()))
                 self.listView.takeItem(row)
                 self.main_window.incrementProgressBar()
-            SettingsManager.setValue(self.settingsSection + u'/images files', self.getFileList())
+            Settings.setValue(self.settingsSection + u'/images files', self.getFileList())
             self.main_window.finishedProgressBar()
             self.application.set_normal_cursor()
         self.listView.blockSignals(False)

=== modified file 'openlp/plugins/songusage/songusageplugin.py'
--- openlp/plugins/songusage/songusageplugin.py	2013-02-07 11:33:47 +0000
+++ openlp/plugins/songusage/songusageplugin.py	2013-02-19 19:30:31 +0000
@@ -100,7 +100,7 @@
         self.songUsageStatus = create_action(tools_menu, u'songUsageStatus',
             text=translate('SongUsagePlugin', 'Toggle Tracking'),
             statustip=translate('SongUsagePlugin', 'Toggle the tracking of song usage.'), checked=False,
-            shortcuts=[QtCore.Qt.Key_F4], triggers=self.toggleSongUsageState)
+            can_shortcuts=True, triggers=self.toggleSongUsageState)
         # Add Menus together
         self.toolsMenu.addAction(self.songUsageMenu.menuAction())
         self.songUsageMenu.addAction(self.songUsageStatus)

=== added file 'tests/functional/openlp_core_utils/test_actions.py'
--- tests/functional/openlp_core_utils/test_actions.py	1970-01-01 00:00:00 +0000
+++ tests/functional/openlp_core_utils/test_actions.py	2013-02-19 19:30:31 +0000
@@ -0,0 +1,124 @@
+"""
+Package to test the openlp.core.utils.actions package.
+"""
+import os
+from tempfile import mkstemp
+from unittest import TestCase
+
+from PyQt4 import QtGui, QtCore
+
+from openlp.core.lib import Settings
+from openlp.core.utils import ActionList
+
+
+class TestActionList(TestCase):
+
+    def setUp(self):
+        """
+        Prepare the tests
+        """
+        self.action_list = ActionList.get_instance()
+        self.settings = Settings()
+        fd, self.ini_file = mkstemp(u'.ini')
+        self.settings.set_filename(self.ini_file)
+        self.settings.beginGroup(u'shortcuts')
+
+    def tearDown(self):
+        """
+        Clean up
+        """
+        self.settings.endGroup()
+        os.unlink(self.ini_file)
+
+    def test_add_action_same_parent(self):
+        """
+        ActionList test - Tests the add_action method. The actions have the same parent, the same shortcuts and both
+        have the QtCore.Qt.WindowShortcut shortcut context set.
+        """
+        # GIVEN: Two actions with the same shortcuts.
+        parent = QtCore.QObject()
+        action = QtGui.QAction(parent)
+        action.setObjectName(u'action')
+        action_with_same_shortcuts = QtGui.QAction(parent)
+        action_with_same_shortcuts.setObjectName(u'action_with_same_shortcuts')
+        # Add default shortcuts to Settings class.
+        default_shortcuts = {
+            u'shortcuts/action': [QtGui.QKeySequence(u'v'), QtGui.QKeySequence(u'c')],
+            u'shortcuts/action_with_same_shortcuts': [QtGui.QKeySequence(u'v'), QtGui.QKeySequence(u'c')]
+        }
+        Settings.extend_default_settings(default_shortcuts)
+
+        # WHEN: Add the two actions to the action list.
+        self.action_list.add_action(action, u'example_category')
+        self.action_list.add_action(action_with_same_shortcuts, u'example_category')
+        # Remove the actions again.
+        self.action_list.remove_action(action, u'example_category')
+        self.action_list.remove_action(action_with_same_shortcuts, u'example_category')
+
+        # THEN: As both actions have the same shortcuts, they should be removed from one action.
+        assert len(action.shortcuts()) == 2, u'The action should have two shortcut assigned.'
+        assert len(action_with_same_shortcuts.shortcuts()) == 0, u'The action should not have a shortcut assigned.'
+
+    def test_add_action_different_parent(self):
+        """
+        ActionList test - Tests the add_action method. The actions have the different parent, the same shortcuts and
+        both have the QtCore.Qt.WindowShortcut shortcut context set.
+        """
+        # GIVEN: Two actions with the same shortcuts.
+        parent = QtCore.QObject()
+        action = QtGui.QAction(parent)
+        action.setObjectName(u'action2')
+        second_parent = QtCore.QObject()
+        action_with_same_shortcuts = QtGui.QAction(second_parent)
+        action_with_same_shortcuts.setObjectName(u'action_with_same_shortcuts2')
+        # Add default shortcuts to Settings class.
+        default_shortcuts = {
+            u'shortcuts/action2': [QtGui.QKeySequence(u'v'), QtGui.QKeySequence(u'c')],
+            u'shortcuts/action_with_same_shortcuts2': [QtGui.QKeySequence(u'v'), QtGui.QKeySequence(u'c')]
+        }
+        Settings.extend_default_settings(default_shortcuts)
+
+        # WHEN: Add the two actions to the action list.
+        self.action_list.add_action(action, u'example_category')
+        self.action_list.add_action(action_with_same_shortcuts, u'example_category')
+        # Remove the actions again.
+        self.action_list.remove_action(action, u'example_category')
+        self.action_list.remove_action(action_with_same_shortcuts, u'example_category')
+
+        # THEN: As both actions have the same shortcuts, they should be removed from one action.
+        assert len(action.shortcuts()) == 2, u'The action should have two shortcut assigned.'
+        assert len(action_with_same_shortcuts.shortcuts()) == 0, u'The action should not have a shortcut assigned.'
+
+    def test_add_action_different_context(self):
+        """
+        ActionList test - Tests the add_action method. The actions have the different parent, the same shortcuts and
+        both have the QtCore.Qt.WidgetShortcut shortcut context set.
+        """
+        # GIVEN: Two actions with the same shortcuts.
+        parent = QtCore.QObject()
+        action = QtGui.QAction(parent)
+        action.setObjectName(u'action3')
+        action.setShortcutContext(QtCore.Qt.WidgetShortcut)
+        second_parent = QtCore.QObject()
+        action_with_same_shortcuts = QtGui.QAction(second_parent)
+        action_with_same_shortcuts.setObjectName(u'action_with_same_shortcuts3')
+        action_with_same_shortcuts.setShortcutContext(QtCore.Qt.WidgetShortcut)
+        # Add default shortcuts to Settings class.
+        default_shortcuts = {
+            u'shortcuts/action3': [QtGui.QKeySequence(u'1'), QtGui.QKeySequence(u'2')],
+            u'shortcuts/action_with_same_shortcuts3': [QtGui.QKeySequence(u'1'), QtGui.QKeySequence(u'2')]
+        }
+        Settings.extend_default_settings(default_shortcuts)
+
+        # WHEN: Add the two actions to the action list.
+        self.action_list.add_action(action, u'example_category2')
+        self.action_list.add_action(action_with_same_shortcuts, u'example_category2')
+        # Remove the actions again.
+        self.action_list.remove_action(action, u'example_category2')
+        self.action_list.remove_action(action_with_same_shortcuts, u'example_category2')
+
+        # THEN: Both action should keep their shortcuts.
+        assert len(action.shortcuts()) == 2, u'The action should have two shortcut assigned.'
+        assert len(action_with_same_shortcuts.shortcuts()) == 2, u'The action should have two shortcuts assigned.'
+
+


Follow ups