diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index e132668f6..2218bc1ae 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -229,25 +229,28 @@ class MediaManagerItem(QtGui.QWidget): 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) diff --git a/openlp/core/lib/settings.py b/openlp/core/lib/settings.py index cd7c52949..be869ade6 100644 --- a/openlp/core/lib/settings.py +++ b/openlp/core/lib/settings.py @@ -152,42 +152,99 @@ class Settings(QtCore.QSettings): 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 @@ class Settings(QtCore.QSettings): 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 @@ class Settings(QtCore.QSettings): 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 diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index e09f4d164..c8cb6707a 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -69,9 +69,8 @@ def add_welcome_page(parent, image): 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 @@ def create_button_box(dialog, name, standard_buttons, custom_buttons=None): 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 create_button_box(dialog, name, standard_buttons, custom_buttons=None): 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 @@ def critical_error_message_box(title=None, message=None, parent=None, question=F 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 @@ def create_button(parent, name, **kwargs): 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 @@ def create_button(parent, name, **kwargs): 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 @@ def create_action(parent, name, **kwargs): ``data`` The action's data. - ``shortcuts`` - A QList (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 @@ def create_action(parent, name, **kwargs): 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 set_case_insensitive_completer(cache, widget): 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. diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index a4ff5823b..14186cf78 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -174,99 +174,101 @@ class Ui_MainWindow(object): 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 @@ class Ui_MainWindow(object): 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 @@ class Ui_MainWindow(object): 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 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): 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() diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 8ecc900be..2a428cb5b 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -152,52 +152,52 @@ class ServiceManagerDialog(object): # 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 diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 75e7403d5..3b8a5f107 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -56,8 +56,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): """ 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): # 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog): 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) + diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 84ea296d2..950f36333 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -44,6 +44,14 @@ from openlp.core.utils.actions import ActionList, CategoryOrder 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 @@ class SlideController(DisplayController): 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 @@ class SlideController(DisplayController): 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 @@ class SlideController(DisplayController): 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 @@ class SlideController(DisplayController): 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 @@ class SlideController(DisplayController): 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 @@ class SlideController(DisplayController): 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 @@ class SlideController(DisplayController): 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 @@ class SlideController(DisplayController): """ 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): diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index c7b2bae49..922aa7767 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -37,8 +37,8 @@ from openlp.core.lib import Settings 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 ActionCategory(object): 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 CategoryActionList(object): 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 CategoryList(object): 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 @@ class ActionList(object): """ 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 @@ class ActionList(object): 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 @@ class ActionList(object): # 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 @@ class ActionList(object): 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 @@ class ActionList(object): 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 @@ class ActionList(object): 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 @@ class ActionList(object): ``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): + def get_all_child_objects(self, qobject): """ - Goes recursively through the children of ``qobject`` and returns a list - of all child objects. + 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)) + children = qobject.children() + # Append the children's children. + children.extend(map(self.get_all_child_objects, children)) return children @@ -448,5 +433,5 @@ class CategoryOrder(object): """ An enumeration class for category weights. """ - standardMenu = -20 - standardToolbar = -10 + standard_menu = -20 + standard_toolbar = -10 diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 111abf795..5aba61e7c 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -150,7 +150,7 @@ class AlertsPlugin(Plugin): 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): diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 2280120c1..85c83fe36 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -32,9 +32,8 @@ import os 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 @@ class ImageMediaItem(MediaManagerItem): 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) diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 19b56a339..e51debc02 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -99,7 +99,7 @@ class SongUsagePlugin(Plugin): 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) diff --git a/tests/functional/openlp_core_utils/test_actions.py b/tests/functional/openlp_core_utils/test_actions.py new file mode 100644 index 000000000..83ed8af92 --- /dev/null +++ b/tests/functional/openlp_core_utils/test_actions.py @@ -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.' + +