← 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:
  Tim Bentley (trb143)
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/149940

Hello,

1) fixed bug #1128376 (Configure shortcuts has two items called settings)
2) do not pass shortcuts in create_action (use dict with default values)
3) added ActionList tests
4) do not react on ESC/Enter/Return events when the dialog is shown while changing shortcuts (because the event is meant to close the dialog)
5) added "lock" action from "view" menu
6) clean ups

Note to 2)
This was again a bit difficult. First it was difficult to determine which action should be added to the ActionList. I added the can_shorcuts capability to solve this. When can_shortcuts is True then the action can have shortucts. This also applies for action for internal usage (just do not specify a category). If this is not True, then it must not have shortcuts. The Reasons: The ActionList has to know *all* shortcuts in use. Otherwise it cannot take care of invalid shortcuts (=assigned twice). As a result I had to add all shortcuts to the default_values dict (even those which are not configurable); but I followed the rule "all settings should be present in that dict". This blows up the dict, but gives us a overview of all assigned shortcuts.  

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/149940
Your team OpenLP Core is subscribed to branch 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-21 21:28:23 +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-18 20:40:40 +0000
+++ openlp/core/lib/settings.py	2013-02-21 21:28:23 +0000
@@ -152,42 +152,99 @@
         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/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/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'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/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/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/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,17 +257,27 @@
         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')],
@@ -287,6 +354,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-14 21:50:10 +0000
+++ openlp/core/lib/ui.py	2013-02-21 21:28:23 +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``
+        Capability stating if this action can have shortcuts. If ``True`` the action is added to shortcut dialog
+        otherwise it it not. Define your shortcut in the :class:`~openlp.core.lib.Settings` class. *Note*: When *not*
+        ``True`` you *must not* set a shortcuts at all.
 
     ``context``
         A context for the shortcut execution.
@@ -289,26 +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'):
         action.triggered.connect(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)
@@ -333,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-21 21:28:23 +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,
@@ -1349,7 +1352,7 @@
                     self.version_text)
             else:
                 # the thread has not confirmed it is running or it has not yet sent any data so lets keep waiting
-                if not hasattr(self,u'version_update_running') or self.version_update_running:
+                if not hasattr(self, u'version_update_running') or self.version_update_running:
                     self.timer_version_id = self.startTimer(1000)
             self.application.process_events()
 

=== modified file 'openlp/core/ui/servicemanager.py'
--- openlp/core/ui/servicemanager.py	2013-02-16 13:24:56 +0000
+++ openlp/core/ui/servicemanager.py	2013-02-21 21:28:23 +0000
@@ -152,52 +152,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-21 21:28:23 +0000
@@ -56,8 +56,8 @@
         self.setupUi(self)
         self.changedActions = {}
         self.action_list = ActionList.get_instance()
-        QtCore.QObject.connect(self.primaryPushButton, QtCore.SIGNAL(u'toggled(bool)'),
-            self.onPrimaryPushButtonClicked)
+        self.dialog_was_shown = False
+        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 +72,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):
         """
@@ -93,9 +92,12 @@
         """
         if not self.primaryPushButton.isChecked() and not self.alternatePushButton.isChecked():
             return
+        # Do not continue, as the event is for the dialog (close it).
+        if self.dialog_was_shown and event.key() in (QtCore.Qt.Key_Escape, QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return):
+            self.dialog_was_shown = False
+            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:
+        if key in (QtCore.Qt.Key_Shift, QtCore.Qt.Key_Control, QtCore.Qt.Key_Meta, QtCore.Qt.Key_Alt):
             return
         key_string = QtGui.QKeySequence(key).toString()
         if event.modifiers() & QtCore.Qt.ControlModifier == QtCore.Qt.ControlModifier:
@@ -109,11 +111,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 +147,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 +204,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 +232,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 +250,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 +260,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 +269,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 +297,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 +319,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 +330,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 +341,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 +359,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 +394,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,27 +417,25 @@
                 # 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
         if not is_valid:
-            self.main_window.warning_message( translate('OpenLP.ShortcutListDialog', 'Duplicate Shortcut'),
+            self.main_window.warning_message(translate('OpenLP.ShortcutListDialog', 'Duplicate Shortcut'),
                 translate('OpenLP.ShortcutListDialog',
                     'The shortcut "%s" is already assigned to another action, please use a different shortcut.') %
                     key_sequence.toString()
             )
+            self.dialog_was_shown = True
         return is_valid
 
     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 +443,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 +472,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-21 19:16:05 +0000
+++ openlp/core/ui/slidecontroller.py	2013-02-21 21:28:23 +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):
     """
@@ -123,7 +131,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)
@@ -167,13 +175,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()
@@ -189,14 +197,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)
@@ -224,10 +232,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.main_window.advancedSettingsSection + u'/slide limits') == SlideLimits.Wrap:
                 self.playSlidesMenu.setDefaultAction(self.playSlidesLoop)
@@ -266,7 +274,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)
@@ -275,20 +283,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-21 21:28:23 +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 not 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-14 21:31:17 +0000
+++ openlp/plugins/alerts/alertsplugin.py	2013-02-21 21:28:23 +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-21 21:28:23 +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-16 13:02:20 +0000
+++ openlp/plugins/songusage/songusageplugin.py	2013-02-21 21:28:23 +0000
@@ -99,7 +99,7 @@
         self.song_usage_status = 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.toggle_song_usage_state)
+            can_shortcuts=True, triggers=self.toggle_song_usage_state)
         # Add Menus together
         self.toolsMenu.addAction(self.song_usage_menu.menuAction())
         self.song_usage_menu.addAction(self.song_usage_status)

=== 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-21 21:28:23 +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()
+        action1 = QtGui.QAction(parent)
+        action1.setObjectName(u'action1')
+        action_with_same_shortcuts1 = QtGui.QAction(parent)
+        action_with_same_shortcuts1.setObjectName(u'action_with_same_shortcuts1')
+        # Add default shortcuts to Settings class.
+        default_shortcuts = {
+            u'shortcuts/action1': [QtGui.QKeySequence(u'a'), QtGui.QKeySequence(u'b')],
+            u'shortcuts/action_with_same_shortcuts1': [QtGui.QKeySequence(u'b'), QtGui.QKeySequence(u'a')]
+        }
+        Settings.extend_default_settings(default_shortcuts)
+
+        # WHEN: Add the two actions to the action list.
+        self.action_list.add_action(action1, u'example_category')
+        self.action_list.add_action(action_with_same_shortcuts1, u'example_category')
+        # Remove the actions again.
+        self.action_list.remove_action(action1, u'example_category')
+        self.action_list.remove_action(action_with_same_shortcuts1, u'example_category')
+
+        # THEN: As both actions have the same shortcuts, they should be removed from one action.
+        assert len(action1.shortcuts()) == 2, u'The action should have two shortcut assigned.'
+        assert len(action_with_same_shortcuts1.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()
+        action2 = QtGui.QAction(parent)
+        action2.setObjectName(u'action2')
+        second_parent = QtCore.QObject()
+        action_with_same_shortcuts2 = QtGui.QAction(second_parent)
+        action_with_same_shortcuts2.setObjectName(u'action_with_same_shortcuts2')
+        # Add default shortcuts to Settings class.
+        default_shortcuts = {
+            u'shortcuts/action2': [QtGui.QKeySequence(u'c'), QtGui.QKeySequence(u'd')],
+            u'shortcuts/action_with_same_shortcuts2': [QtGui.QKeySequence(u'd'), QtGui.QKeySequence(u'c')]
+        }
+        Settings.extend_default_settings(default_shortcuts)
+
+        # WHEN: Add the two actions to the action list.
+        self.action_list.add_action(action2, u'example_category')
+        self.action_list.add_action(action_with_same_shortcuts2, u'example_category')
+        # Remove the actions again.
+        self.action_list.remove_action(action2, u'example_category')
+        self.action_list.remove_action(action_with_same_shortcuts2, u'example_category')
+
+        # THEN: As both actions have the same shortcuts, they should be removed from one action.
+        assert len(action2.shortcuts()) == 2, u'The action should have two shortcut assigned.'
+        assert len(action_with_same_shortcuts2.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()
+        action3 = QtGui.QAction(parent)
+        action3.setObjectName(u'action3')
+        action3.setShortcutContext(QtCore.Qt.WidgetShortcut)
+        second_parent = QtCore.QObject()
+        action_with_same_shortcuts3 = QtGui.QAction(second_parent)
+        action_with_same_shortcuts3.setObjectName(u'action_with_same_shortcuts3')
+        action_with_same_shortcuts3.setShortcutContext(QtCore.Qt.WidgetShortcut)
+        # Add default shortcuts to Settings class.
+        default_shortcuts = {
+            u'shortcuts/action3': [QtGui.QKeySequence(u'e'), QtGui.QKeySequence(u'f')],
+            u'shortcuts/action_with_same_shortcuts3': [QtGui.QKeySequence(u'e'), QtGui.QKeySequence(u'f')]
+        }
+        Settings.extend_default_settings(default_shortcuts)
+
+        # WHEN: Add the two actions to the action list.
+        self.action_list.add_action(action3, u'example_category2')
+        self.action_list.add_action(action_with_same_shortcuts3, u'example_category2')
+        # Remove the actions again.
+        self.action_list.remove_action(action3, u'example_category2')
+        self.action_list.remove_action(action_with_same_shortcuts3, u'example_category2')
+
+        # THEN: Both action should keep their shortcuts.
+        assert len(action3.shortcuts()) == 2, u'The action should have two shortcut assigned.'
+        assert len(action_with_same_shortcuts3.shortcuts()) == 2, u'The action should have two shortcuts assigned.'
+
+


Follow ups