diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index 4bf2c91d9..19dad3eae 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -275,7 +275,6 @@ class Ui_EditSongDialog(object): self.bottom_layout.setObjectName(u'bottom_layout') self.warning_label = QtGui.QLabel(edit_song_dialog) self.warning_label.setObjectName(u'warning_label') - self.warning_label.setVisible(False) self.bottom_layout.addWidget(self.warning_label) self.button_box = create_button_box(edit_song_dialog, u'button_box', [u'cancel', u'save']) self.bottom_layout.addWidget(self.button_box) @@ -323,8 +322,10 @@ class Ui_EditSongDialog(object): self.from_media_button.setText(translate('SongsPlugin.EditSongForm', 'Add &Media')) self.audio_remove_button.setText(translate('SongsPlugin.EditSongForm', '&Remove')) self.audio_remove_all_button.setText(translate('SongsPlugin.EditSongForm', 'Remove &All')) - self.warning_label.setText( - translate('SongsPlugin.EditSongForm', 'Warning: Not all of the verses are in use.')) + self.not_all_verses_used_warning = \ + translate('SongsPlugin.EditSongForm', 'Warning: Not all of the verses are in use.') + self.no_verse_order_entered_warning = \ + translate('SongsPlugin.EditSongForm', 'Warning: You have not entered a verse order.') def create_combo_box(parent, name): diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 5a100b014..24d0d3024 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -456,6 +456,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.title_edit.setFocus() # Hide or show the preview button. self.preview_button.setVisible(preview) + # Check if all verse tags are used. + self.on_verse_order_text_changed(self.verse_order_edit.text()) def tag_rows(self): """ @@ -683,21 +685,33 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.verse_edit_button.setEnabled(False) self.verse_delete_button.setEnabled(False) + def on_verse_order_text_changed(self, text): - verses = [] - verse_names = [] - order = self._extract_verse_order(text) + """ + Checks if the verse order is complete or missing. Shows a error message according to the state of the verse + order. + + ``text`` + The text of the verse order edit (ignored). + """ + # Extract all verses which were used in the order. + verses_in_order = self._extract_verse_order(self.verse_order_edit.text()) + # Find the verses which were not used in the order. + verses_not_used = [] for index in range(self.verse_list_widget.rowCount()): verse = self.verse_list_widget.item(index, 0) verse = verse.data(QtCore.Qt.UserRole) - if verse not in verse_names: - verses.append(verse) - verse_names.append(u'%s%s' % (VerseType.translated_tag(verse[0]), verse[1:])) - verses_not_used = [] - for verse in verses: - if not verse in order: + if verse not in verses_in_order: verses_not_used.append(verse) - self.warning_label.setVisible(len(verses_not_used) > 0) + # Set the label text. + label_text = u'' + # No verse order was entered. + if not verses_in_order: + label_text = self.no_verse_order_entered_warning + # The verse order does not contain all verses. + elif verses_not_used: + label_text = self.not_all_verses_used_warning + self.warning_label.setText(label_text) def on_copyright_insert_button_triggered(self): text = self.copyright_edit.text() diff --git a/tests/interfaces/openlp_plugins/songs/forms/test_editsongform.py b/tests/interfaces/openlp_plugins/songs/forms/test_editsongform.py index 2c5de6535..013e91bc1 100644 --- a/tests/interfaces/openlp_plugins/songs/forms/test_editsongform.py +++ b/tests/interfaces/openlp_plugins/songs/forms/test_editsongform.py @@ -44,4 +44,67 @@ class TestEditSongForm(TestCase): self.assertFalse(self.form.topic_remove_button.isEnabled(), u'The topic remove button should not be enabled') def is_verse_edit_form_executed_test(self): - pass \ No newline at end of file + pass + + def verse_order_no_warning_test(self): + """ + Test if the verse order warning is not shown + """ + # GIVEN: Mocked methods. + given_verse_order = u'V1 V2' + self.form.verse_list_widget.rowCount = MagicMock(return_value=2) + # Mock out the verse. + first_verse = MagicMock() + first_verse.data = MagicMock(return_value=u'V1') + second_verse = MagicMock() + second_verse.data = MagicMock(return_value= u'V2') + self.form.verse_list_widget.item = MagicMock(side_effect=[first_verse, second_verse]) + self.form._extract_verse_order = MagicMock(return_value=given_verse_order.split()) + + # WHEN: Call the method. + self.form.on_verse_order_text_changed(given_verse_order) + + # THEN: No text should be shown. + assert self.form.warning_label.text() == u'', u'There should be no warning.' + + def verse_order_incomplete_warning_test(self): + """ + Test if the verse-order-incomple warning is shown + """ + # GIVEN: Mocked methods. + given_verse_order = u'V1' + self.form.verse_list_widget.rowCount = MagicMock(return_value=2) + # Mock out the verse. + first_verse = MagicMock() + first_verse.data = MagicMock(return_value=u'V1') + second_verse = MagicMock() + second_verse.data = MagicMock(return_value= u'V2') + self.form.verse_list_widget.item = MagicMock(side_effect=[first_verse, second_verse]) + self.form._extract_verse_order = MagicMock(return_value=[given_verse_order]) + + # WHEN: Call the method. + self.form.on_verse_order_text_changed(given_verse_order) + + # THEN: The verse-order-incomplete text should be shown. + assert self.form.warning_label.text() == self.form.not_all_verses_used_warning, \ + u'The verse-order-incomplete warning should be shown.' + + def bug_1170435_test(self): + """ + Regression test for bug 1170435 (test if "no verse order" message is shown) + """ + # GIVEN: Mocked methods. + given_verse_order = u'' + self.form.verse_list_widget.rowCount = MagicMock(return_value=1) + # Mock out the verse. (We want a verse type to be returned). + mocked_verse = MagicMock() + mocked_verse.data = MagicMock(return_value=u'V1') + self.form.verse_list_widget.item = MagicMock(return_value=mocked_verse) + self.form._extract_verse_order = MagicMock(return_value=[]) + self.form.verse_order_edit.text = MagicMock(return_value=given_verse_order) + # WHEN: Call the method. + self.form.on_verse_order_text_changed(given_verse_order) + + # THEN: The no-verse-order message should be shown. + assert self.form.warning_label.text() == self.form.no_verse_order_entered_warning, \ + u'The no-verse-order message should be shown.'