diff --git a/openlp/core/ui/exceptiondialog.py b/openlp/core/ui/exceptiondialog.py index 7341287c7..bcbc67552 100644 --- a/openlp/core/ui/exceptiondialog.py +++ b/openlp/core/ui/exceptiondialog.py @@ -97,9 +97,9 @@ class Ui_ExceptionDialog(object): translate('OpenLP.ExceptionDialog', 'Please describe what you were trying to do. ' ' If possible, write in English.')) exception_part1 = (translate('OpenLP.ExceptionDialog', - 'Oops, OpenLP hit a problem and couldn\'t recover!

' - 'You can help the OpenLP developers to fix this' - ' by
sending them a bug report to {email}{newlines}' + 'Oops, OpenLP hit a problem and couldn\'t recover!

' + 'You can help
the OpenLP developers to fix this' + ' by
sending them a bug report to {email}{newlines}' ).format(email=' bugs@openlp.org', newlines='

')) self.message_label.setText( diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index dbd9ae0dd..4ce1ace43 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -367,7 +367,6 @@ class BibleManager(OpenLPMixin, RegistryProperties): second_web_bible = self.db_cache[second_bible].get_object(BibleMeta, 'download_source') if web_bible or second_web_bible: # If either Bible is Web, cursor is reset to normal and search ends w/o any message. - self.check_search_result() self.application.set_normal_cursor() return None # Fetch the results from db. If no results are found, return None, no message is given for this. diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index b8ff3a752..fc92b8f7a 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -254,8 +254,8 @@ class BibleMediaItem(MediaManagerItem): self.quickStyleComboBox.activated.connect(self.on_quick_style_combo_box_changed) self.advancedStyleComboBox.activated.connect(self.on_advanced_style_combo_box_changed) # Buttons - self.advancedClearButton.clicked.connect(self.on_clear_button) - self.quickClearButton.clicked.connect(self.on_clear_button) + self.advancedClearButton.clicked.connect(self.on_advanced_clear_button_clicked) + self.quickClearButton.clicked.connect(self.on_clear_button_clicked) self.advancedSearchButton.clicked.connect(self.on_advanced_search_button) self.quickSearchButton.clicked.connect(self.on_quick_search_button) # Other stuff @@ -548,19 +548,31 @@ class BibleMediaItem(MediaManagerItem): self.advancedTab.setVisible(True) self.advanced_book_combo_box.setFocus() - def on_clear_button(self): + def on_clear_button_clicked(self): # Clear the list, then set the "No search Results" message, then clear the text field and give it focus. self.list_view.clear() self.check_search_result() self.quick_search_edit.clear() self.quick_search_edit.setFocus() + def on_advanced_clear_button_clicked(self): + # The same as the on_clear_button_clicked, but gives focus to Book name field in "Select" (advanced). + self.list_view.clear() + self.check_search_result() + self.advanced_book_combo_box.setFocus() + def on_lock_button_toggled(self, checked): - self.quick_search_edit.setFocus() + """ + Toggle the lock button, if Search tab is used, set focus to search field. + :param checked: The state of the toggle button. bool + :return: None + """ if checked: self.sender().setIcon(self.lock_icon) else: self.sender().setIcon(self.unlock_icon) + if self.quickTab.isVisible(): + self.quick_search_edit.setFocus() def on_quick_style_combo_box_changed(self): self.settings.layout_style = self.quickStyleComboBox.currentIndex() diff --git a/tests/functional/openlp_plugins/bibles/test_mediaitem.py b/tests/functional/openlp_plugins/bibles/test_mediaitem.py index 05418f177..d5645cd3f 100644 --- a/tests/functional/openlp_plugins/bibles/test_mediaitem.py +++ b/tests/functional/openlp_plugins/bibles/test_mediaitem.py @@ -114,7 +114,7 @@ class TestMediaItem(TestCase, TestMixin): self.assertEqual(self.media_item.search_results, {}) self.assertEqual(self.media_item.second_search_results, {}) - def on_quick_search_button_general_test(self): + def test_on_quick_search_button_general(self): """ Test that general things, which should be called on all Quick searches are called. """ @@ -150,3 +150,60 @@ class TestMediaItem(TestCase, TestMixin): self.assertEqual(2, self.media_item.quickSearchButton.setEnabled.call_count, 'Disable and Enable the button') self.assertEqual(1, self.media_item.check_search_result.call_count, 'Check results Should had been called once') self.assertEqual(1, self.app.set_normal_cursor.call_count, 'Normal cursor should had been called once') + + def test_on_clear_button_clicked(self): + """ + Test that the on_clear_button_clicked works properly. (Used by Bible search tab) + """ + # GIVEN: Mocked list_view, check_search_results & quick_search_edit. + self.media_item.list_view = MagicMock() + self.media_item.check_search_result = MagicMock() + self.media_item.quick_search_edit = MagicMock() + + # WHEN: on_clear_button_clicked is called + self.media_item.on_clear_button_clicked() + + # THEN: Search result should be reset and search field should receive focus. + self.media_item.list_view.clear.assert_called_once_with(), + self.media_item.check_search_result.assert_called_once_with(), + self.media_item.quick_search_edit.clear.assert_called_once_with(), + self.media_item.quick_search_edit.setFocus.assert_called_once_with() + + def test_on_lock_button_toggled_search_tab_lock_icon(self): + """ + Test that "on_lock_button_toggled" gives focus to the right field and toggles the lock properly. + """ + # GIVEN: Mocked sender & Search edit, quickTab returning value = True on isVisible. + self.media_item.sender = MagicMock() + self.media_item.quick_search_edit = MagicMock() + self.media_item.quickTab = MagicMock(**{'isVisible.return_value': True}) + + self.media_item.lock_icon = 'lock icon' + sender_instance_mock = MagicMock() + self.media_item.sender = MagicMock(return_value=sender_instance_mock) + + # WHEN: on_lock_button_toggled is called and checked returns = True. + self.media_item.on_lock_button_toggled(True) + + # THEN: on_quick_search_edit should receive focus and Lock icon should be set. + self.media_item.quick_search_edit.setFocus.assert_called_once_with() + sender_instance_mock.setIcon.assert_called_once_with('lock icon') + + def test_on_lock_button_toggled_unlock_icon(self): + """ + Test that lock button unlocks properly and lock toggles properly. + """ + # GIVEN: Mocked sender & Search edit, quickTab returning value = False on isVisible. + self.media_item.sender = MagicMock() + self.media_item.quick_search_edit = MagicMock() + self.media_item.quickTab = MagicMock() + self.media_item.quickTab.isVisible = MagicMock() + self.media_item.unlock_icon = 'unlock icon' + sender_instance_mock = MagicMock() + self.media_item.sender = MagicMock(return_value=sender_instance_mock) + + # WHEN: on_lock_button_toggled is called and checked returns = False. + self.media_item.on_lock_button_toggled(False) + + # THEN: Unlock icon should be set. + sender_instance_mock.setIcon.assert_called_once_with('unlock icon')