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')