From 5823bfbed54d015f30519a14129827bbeda184ee Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 5 Mar 2012 21:45:32 +0200 Subject: [PATCH 1/4] Added label to warn of missing verses. --- openlp/plugins/songs/forms/editsongdialog.py | 18 ++++++++++--- openlp/plugins/songs/forms/editsongform.py | 28 +++++++++++--------- 2 files changed, 31 insertions(+), 15 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index b1f8e4c6a..747541952 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -280,8 +280,15 @@ class Ui_EditSongDialog(object): self.songTabWidget.addTab(self.audioTab, u'') # Last few bits self.dialogLayout.addWidget(self.songTabWidget) + self.bottomLayout = QtGui.QHBoxLayout() + self.bottomLayout.setObjectName(u'bottomLayout') + self.warningLabel = QtGui.QLabel(editSongDialog) + self.warningLabel.setObjectName(u'warningLabel') + self.warningLabel.setVisible(False) + self.bottomLayout.addWidget(self.warningLabel) self.buttonBox = create_accept_reject_button_box(editSongDialog) - self.dialogLayout.addWidget(self.buttonBox) + self.bottomLayout.addWidget(self.buttonBox) + self.dialogLayout.addLayout(self.bottomLayout) self.retranslateUi(editSongDialog) QtCore.QMetaObject.connectSlotsByName(editSongDialog) @@ -349,14 +356,19 @@ class Ui_EditSongDialog(object): translate('SongsPlugin.EditSongForm', '&Remove')) self.audioRemoveAllButton.setText( translate('SongsPlugin.EditSongForm', 'Remove &All')) + self.warningLabel.setText( + translate('SongsPlugin.EditSongForm', 'Warning:' + ' Not all of the verses are in use.')) def editSongDialogComboBox(parent, name): """ Utility method to generate a standard combo box for this dialog. """ comboBox = QtGui.QComboBox(parent) - comboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToMinimumContentsLength) - comboBox.setSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) + comboBox.setSizeAdjustPolicy( + QtGui.QComboBox.AdjustToMinimumContentsLength) + comboBox.setSizePolicy( + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) comboBox.setEditable(True) comboBox.setInsertPolicy(QtGui.QComboBox.NoInsert) comboBox.setObjectName(name) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 62a76851c..2bcbc3811 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -641,19 +641,23 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): 'corresponding to %s. Valid entries are %s.')) % \ (order_names[count], valid)) return False + verses_not_used = [] for count, verse in enumerate(verses): - if verse not in order: - self.songTabWidget.setCurrentIndex(0) - self.verseOrderEdit.setFocus() - answer = QtGui.QMessageBox.warning(self, - translate('SongsPlugin.EditSongForm', 'Warning'), - unicode(translate('SongsPlugin.EditSongForm', - 'You have not used %s anywhere in the verse ' - 'order. Are you sure you want to save the song ' - 'like this?')) % verse_names[count], - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if answer == QtGui.QMessageBox.No: - return False + if not verse in order: + verses_not_used.append(verse) + #self.songTabWidget.setCurrentIndex(0) + #self.verseOrderEdit.setFocus() + #answer = QtGui.QMessageBox.warning(self, + # translate('SongsPlugin.EditSongForm', 'Warning'), + # unicode(translate('SongsPlugin.EditSongForm', + # 'You have not used %s anywhere in the verse ' + # 'order. Are you sure you want to save the song ' + # 'like this?')) % verse_names[count], + # QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) + #if answer == QtGui.QMessageBox.No: + # return False + if len(verses_in_use) < len(verses): + self.warningLabel.setVisible(True) item = int(self.songBookComboBox.currentIndex()) text = unicode(self.songBookComboBox.currentText()) if self.songBookComboBox.findText(text, QtCore.Qt.MatchExactly) < 0: From 619251193efe74ee47046508eeb8ff032a61e077 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 5 Mar 2012 21:45:57 +0200 Subject: [PATCH 2/4] Updated ignore --- .bzrignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.bzrignore b/.bzrignore index 1d2bb8267..080f03088 100644 --- a/.bzrignore +++ b/.bzrignore @@ -21,3 +21,4 @@ openlp/core/resources.py.old *.qm resources/windows/warnOpenLP.txt openlp.cfg +.idea From 8e54dcb1ee0ceefe2710ae2acafcd5047892050c Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 5 Mar 2012 22:34:23 +0200 Subject: [PATCH 3/4] The message appears when your verse list is incomplete, and disappears when it is complete. --- openlp/plugins/songs/forms/editsongform.py | 109 +++++++++++---------- 1 file changed, 55 insertions(+), 54 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 2bcbc3811..94d8f60f1 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -92,6 +92,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.QObject.connect(self.verseListWidget, QtCore.SIGNAL(u'itemClicked(QTableWidgetItem*)'), self.onVerseListViewPressed) + QtCore.QObject.connect(self.verseOrderEdit, + QtCore.SIGNAL(u'textChanged(QString)'), + self.onVerseOrderTextChanged) QtCore.QObject.connect(self.themeAddButton, QtCore.SIGNAL(u'clicked()'), self.mediaitem.plugin.renderer.themeManager.onAddTheme) @@ -574,6 +577,54 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.verseEditButton.setEnabled(False) self.verseDeleteButton.setEnabled(False) + def onVerseOrderTextChanged(self, text): + self._validate_verse_list(text, self.verseListWidget.rowCount()) + + def _validate_verse_list(self, verse_list, verse_count): + errors = [] + order = [] + order_names = unicode(verse_list).split() + for item in order_names: + if len(item) == 1: + verse_index = VerseType.from_translated_tag(item, None) + if verse_index is not None: + order.append(VerseType.Tags[verse_index] + u'1') + else: + # it matches no verses anyway + order.append(u'') + else: + verse_index = VerseType.from_translated_tag(item[0], None) + if verse_index is None: + # it matches no verses anyway + order.append(u'') + else: + verse_tag = VerseType.Tags[verse_index] + verse_num = item[1:].lower() + order.append(verse_tag + verse_num) + verses = [] + verse_names = [] + for index in range(0, verse_count): + verse = self.verseListWidget.item(index, 0) + verse = unicode(verse.data(QtCore.Qt.UserRole).toString()) + if verse not in verse_names: + verses.append(verse) + verse_names.append(u'%s%s' % ( + VerseType.translated_tag(verse[0]), verse[1:])) + for count, item in enumerate(order): + if item not in verses: + valid = create_separated_list(verse_names) + errors.append(unicode(translate('SongsPlugin.EditSongForm', + 'The verse order is invalid. There is no verse ' + 'corresponding to %s. Valid entries are %s.')) % \ + (order_names[count], valid)) + return False + verses_not_used = [] + for count, verse in enumerate(verses): + if not verse in order: + verses_not_used.append(verse) + self.warningLabel.setVisible(len(verses_not_used) > 0) + return errors + def _validate_song(self): """ Check the validity of the song. @@ -604,60 +655,10 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): 'You need to have an author for this song.')) return False if self.verseOrderEdit.text(): - order = [] - order_names = unicode(self.verseOrderEdit.text()).split() - for item in order_names: - if len(item) == 1: - verse_index = VerseType.from_translated_tag(item, None) - if verse_index is not None: - order.append(VerseType.Tags[verse_index] + u'1') - else: - # it matches no verses anyway - order.append(u'') - else: - verse_index = VerseType.from_translated_tag(item[0], None) - if verse_index is None: - # it matches no verses anyway - order.append(u'') - else: - verse_tag = VerseType.Tags[verse_index] - verse_num = item[1:].lower() - order.append(verse_tag + verse_num) - verses = [] - verse_names = [] - for index in range(0, self.verseListWidget.rowCount()): - verse = self.verseListWidget.item(index, 0) - verse = unicode(verse.data(QtCore.Qt.UserRole).toString()) - if verse not in verse_names: - verses.append(verse) - verse_names.append(u'%s%s' % ( - VerseType.translated_tag(verse[0]), verse[1:])) - for count, item in enumerate(order): - if item not in verses: - valid = create_separated_list(verse_names) - critical_error_message_box( - message=unicode(translate('SongsPlugin.EditSongForm', - 'The verse order is invalid. There is no verse ' - 'corresponding to %s. Valid entries are %s.')) % \ - (order_names[count], valid)) - return False - verses_not_used = [] - for count, verse in enumerate(verses): - if not verse in order: - verses_not_used.append(verse) - #self.songTabWidget.setCurrentIndex(0) - #self.verseOrderEdit.setFocus() - #answer = QtGui.QMessageBox.warning(self, - # translate('SongsPlugin.EditSongForm', 'Warning'), - # unicode(translate('SongsPlugin.EditSongForm', - # 'You have not used %s anywhere in the verse ' - # 'order. Are you sure you want to save the song ' - # 'like this?')) % verse_names[count], - # QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - #if answer == QtGui.QMessageBox.No: - # return False - if len(verses_in_use) < len(verses): - self.warningLabel.setVisible(True) + errors = self._validate_verse_list(self.verseOrderEdit.text(), + self.verseListWidget.rowCount()) + if errors: + critical_error_message_box(message=u'\n\n'.join(errors)) item = int(self.songBookComboBox.currentIndex()) text = unicode(self.songBookComboBox.currentText()) if self.songBookComboBox.findText(text, QtCore.Qt.MatchExactly) < 0: From 03f22ae1503a50046c0a609c3652445e56102e5f Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 11 Mar 2012 23:32:43 +0200 Subject: [PATCH 4/4] Refactored things a bit so that I don't rewrite too much code, and fixed up some issues with invalid verses. --- openlp/plugins/songs/forms/editsongform.py | 63 ++++++++++++++-------- 1 file changed, 42 insertions(+), 21 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 94d8f60f1..02b464497 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -578,12 +578,25 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.verseDeleteButton.setEnabled(False) def onVerseOrderTextChanged(self, text): - self._validate_verse_list(text, self.verseListWidget.rowCount()) + verses = [] + verse_names = [] + order = self.__extractVerseOrder(text) + for index in range(0, self.verseListWidget.rowCount()): + verse = self.verseListWidget.item(index, 0) + verse = unicode(verse.data(QtCore.Qt.UserRole).toString()) + 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 count, verse in enumerate(verses): + if not verse in order: + verses_not_used.append(verse) + self.warningLabel.setVisible(len(verses_not_used) > 0) - def _validate_verse_list(self, verse_list, verse_count): - errors = [] + def __extractVerseOrder(self, verse_order): order = [] - order_names = unicode(verse_list).split() + order_names = unicode(verse_order).split() for item in order_names: if len(item) == 1: verse_index = VerseType.from_translated_tag(item, None) @@ -601,8 +614,14 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): verse_tag = VerseType.Tags[verse_index] verse_num = item[1:].lower() order.append(verse_tag + verse_num) + return order + + def __validateVerseList(self, verse_order, verse_count): verses = [] + invalid_verses = [] verse_names = [] + order_names = unicode(verse_order).split() + order = self.__extractVerseOrder(verse_order) for index in range(0, verse_count): verse = self.verseListWidget.item(index, 0) verse = unicode(verse.data(QtCore.Qt.UserRole).toString()) @@ -612,20 +631,22 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): VerseType.translated_tag(verse[0]), verse[1:])) for count, item in enumerate(order): if item not in verses: - valid = create_separated_list(verse_names) - errors.append(unicode(translate('SongsPlugin.EditSongForm', - 'The verse order is invalid. There is no verse ' - 'corresponding to %s. Valid entries are %s.')) % \ - (order_names[count], valid)) - return False - verses_not_used = [] - for count, verse in enumerate(verses): - if not verse in order: - verses_not_used.append(verse) - self.warningLabel.setVisible(len(verses_not_used) > 0) - return errors + invalid_verses.append(order_names[count]) + if invalid_verses: + valid = create_separated_list(verse_names) + if len(invalid_verses) > 1: + critical_error_message_box(message=unicode(translate( + 'SongsPlugin.EditSongForm', 'The verse order is invalid. ' + 'There are no verses corresponding to %s. Valid entries ' + 'are %s.')) % (u', '.join(invalid_verses), valid)) + else: + critical_error_message_box(message=unicode(translate( + 'SongsPlugin.EditSongForm', 'The verse order is invalid. ' + 'There is no verse corresponding to %s. Valid entries ' + 'are %s.')) % (invalid_verses[0], valid)) + return len(invalid_verses) == 0 - def _validate_song(self): + def __validateSong(self): """ Check the validity of the song. """ @@ -655,10 +676,10 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): 'You need to have an author for this song.')) return False if self.verseOrderEdit.text(): - errors = self._validate_verse_list(self.verseOrderEdit.text(), + result = self.__validateVerseList(self.verseOrderEdit.text(), self.verseListWidget.rowCount()) - if errors: - critical_error_message_box(message=u'\n\n'.join(errors)) + if not result: + return False item = int(self.songBookComboBox.currentIndex()) text = unicode(self.songBookComboBox.currentText()) if self.songBookComboBox.findText(text, QtCore.Qt.MatchExactly) < 0: @@ -795,7 +816,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): """ log.debug(u'SongEditForm.accept') self.clearCaches() - if self._validate_song(): + if self.__validateSong(): self.saveSong() self.song = None QtGui.QDialog.accept(self)