diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index dbf42dc84..950d654dc 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -322,6 +322,7 @@ class ActionList(object): ActionList.shortcut_map[shortcuts[0]] = actions else: shortcuts.remove(shortcuts[0]) + action.setShortcuts([QtGui.QKeySequence(shortcut) for shortcut in shortcuts]) def remove_action(self, action, category=None): @@ -350,7 +351,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. @@ -403,15 +404,15 @@ class ActionList(object): ``action`` The action which wants to use a particular shortcut. """ - local = action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut] + local_context = action.shortcutContext() not in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut] affected_actions = [] - if local: + if local_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 local_context or existing_action in affected_actions: return False if existing_action.shortcutContext() in [QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]: return False diff --git a/tests/functional/openlp_core_utils/test_actions.py b/tests/functional/openlp_core_utils/test_actions.py index 8cdae2e41..7b03493ba 100644 --- a/tests/functional/openlp_core_utils/test_actions.py +++ b/tests/functional/openlp_core_utils/test_actions.py @@ -1,10 +1,13 @@ """ Package to test the openlp.core.utils.actions package. """ +import os +from tempfile import mkstemp from unittest import TestCase -from mock import patch +from PyQt4 import QtGui, QtCore +from openlp.core.lib import Settings from openlp.core.utils import ActionList @@ -15,8 +18,107 @@ class TestActionList(TestCase): 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 test_(self): + def tearDown(self): """ + Clean up """ - pass + self.settings.endGroup() + os.unlink(self.ini_file) + + def test_add_action_same_parent(self): + """ + ActionList test - Tests the add_action method. The actions have the same parent, the same shortcuts and both + have the QtCore.Qt.WindowShortcut shortcut context set. + """ + # GIVEN: Two actions with the same shortcuts. + parent = QtCore.QObject() + action = QtGui.QAction(parent) + action.setObjectName(u'action') + action_with_same_shortcuts = QtGui.QAction(parent) + action_with_same_shortcuts.setObjectName(u'action_with_same_shortcuts') + # Add default shortcuts to Settings class. + default_shortcuts = { + u'shortcuts/action': [QtGui.QKeySequence(u'v'), QtGui.QKeySequence(u'c')], + u'shortcuts/action_with_same_shortcuts': [QtGui.QKeySequence(u'v'), QtGui.QKeySequence(u'c')] + } + Settings.extend_default_settings(default_shortcuts) + + # WHEN: Add the two actions to the action list. + self.action_list.add_action(action, u'example_category') + self.action_list.add_action(action_with_same_shortcuts, u'example_category') + # Remove the actions again. + self.action_list.remove_action(action, u'example_category') + self.action_list.remove_action(action_with_same_shortcuts, u'example_category') + + # THEN: As both actions have the same shortcuts, they should be removed from one action. + assert len(action.shortcuts()) == 2, u'The action should have two shortcut assigned.' + assert len(action_with_same_shortcuts.shortcuts()) == 0, u'The action should not have a shortcut assigned.' + + def test_add_action_different_parent(self): + """ + ActionList test - Tests the add_action method. The actions have the different parent, the same shortcuts and + both have the QtCore.Qt.WindowShortcut shortcut context set. + """ + # GIVEN: Two actions with the same shortcuts. + parent = QtCore.QObject() + action = QtGui.QAction(parent) + action.setObjectName(u'action2') + second_parent = QtCore.QObject() + action_with_same_shortcuts = QtGui.QAction(second_parent) + action_with_same_shortcuts.setObjectName(u'action_with_same_shortcuts2') + # Add default shortcuts to Settings class. + default_shortcuts = { + u'shortcuts/action2': [QtGui.QKeySequence(u'v'), QtGui.QKeySequence(u'c')], + u'shortcuts/action_with_same_shortcuts2': [QtGui.QKeySequence(u'v'), QtGui.QKeySequence(u'c')] + } + Settings.extend_default_settings(default_shortcuts) + + # WHEN: Add the two actions to the action list. + self.action_list.add_action(action, u'example_category') + self.action_list.add_action(action_with_same_shortcuts, u'example_category') + # Remove the actions again. + self.action_list.remove_action(action, u'example_category') + self.action_list.remove_action(action_with_same_shortcuts, u'example_category') + + # THEN: As both actions have the same shortcuts, they should be removed from one action. + assert len(action.shortcuts()) == 2, u'The action should have two shortcut assigned.' + assert len(action_with_same_shortcuts.shortcuts()) == 0, u'The action should not have a shortcut assigned.' + + def test_add_action_different_context(self): + """ + ActionList test - Tests the add_action method. The actions have the different parent, the same shortcuts and + both have the QtCore.Qt.WidgetShortcut shortcut context set. + """ + # GIVEN: Two actions with the same shortcuts. + parent = QtCore.QObject() + action = QtGui.QAction(parent) + action.setObjectName(u'action3') + action.setShortcutContext(QtCore.Qt.WidgetShortcut) + second_parent = QtCore.QObject() + action_with_same_shortcuts = QtGui.QAction(second_parent) + action_with_same_shortcuts.setObjectName(u'action_with_same_shortcuts3') + action_with_same_shortcuts.setShortcutContext(QtCore.Qt.WidgetShortcut) + # Add default shortcuts to Settings class. + default_shortcuts = { + u'shortcuts/action3': [QtGui.QKeySequence(u'1'), QtGui.QKeySequence(u'2')], + u'shortcuts/action_with_same_shortcuts3': [QtGui.QKeySequence(u'1'), QtGui.QKeySequence(u'2')] + } + Settings.extend_default_settings(default_shortcuts) + + # WHEN: Add the two actions to the action list. + self.action_list.add_action(action, u'example_category2') + self.action_list.add_action(action_with_same_shortcuts, u'example_category2') + # Remove the actions again. + self.action_list.remove_action(action, u'example_category2') + self.action_list.remove_action(action_with_same_shortcuts, u'example_category2') + + # THEN: Both action should keep their shortcuts. + assert len(action.shortcuts()) == 2, u'The action should have two shortcut assigned.' + assert len(action_with_same_shortcuts.shortcuts()) == 2, u'The action should have two shortcuts assigned.' + + diff --git a/tests/functional/openlp_core_utils/test_languagemanager.py b/tests/functional/openlp_core_utils/test_languagemanager.py deleted file mode 100644 index e2034bcd8..000000000 --- a/tests/functional/openlp_core_utils/test_languagemanager.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -Functional tests for the Language Manager. -""" - -from unittest import TestCase - -from mock import patch - -from openlp.core.utils import LanguageManager - -class TestLanguageManager(TestCase): - """ - A test suite to test out various methods around the LanguageManager class. - """ - def get_translator_linux_test(self): - """ - """ - with patch(u'openlp.core.utils.sys.platform') as mocked_platform: - # GIVEN: We are on linux. - mocked_platform.return_value = u'linux2' - - app_translator, default_translator = LanguageManager.get_translator('en') - - assert not app_translator.isEmpty(), u'The application translator should not be empty' - assert not default_translator.isEmpty(), u'The default translator should not be empty' -