Samuel Mehrbrodt has proposed merging lp:~sam92/openlp/2.0-backports into lp:openlp.
Requested reviews: OpenLP Core (openlp-core) Related bugs: Bug #1157938 in OpenLP: ""Alt + Tab" = some pixelated icons and missing icons" https://bugs.launchpad.net/openlp/+bug/1157938 Bug #1199639 in OpenLP: "Formatting tags opened and closed in different verses throw an exception " https://bugs.launchpad.net/openlp/+bug/1199639 Bug #1216234 in OpenLP: "Layout style has not effect when using a second bible" https://bugs.launchpad.net/openlp/+bug/1216234 Bug #1310523 in OpenLP: "Can't display songs that have more than 26 verses named equally" https://bugs.launchpad.net/openlp/+bug/1310523 For more details, see: https://code.launchpad.net/~sam92/openlp/2.0-backports/+merge/218189 Merge some fixes from the 2.0 branch lp:~sam92/openlp/2.0-backports (revision 2387) [SUCCESS] http://ci.openlp.org/job/Branch-01-Pull/431/ [SUCCESS] http://ci.openlp.org/job/Branch-02-Functional-Tests/387/ [SUCCESS] http://ci.openlp.org/job/Branch-03-Interface-Tests/332/ [SUCCESS] http://ci.openlp.org/job/Branch-04-Windows_Tests/293/ [SUCCESS] http://ci.openlp.org/job/Branch-05a-Code_Analysis/197/ [SUCCESS] http://ci.openlp.org/job/Branch-05b-Test_Coverage/72/ -- https://code.launchpad.net/~sam92/openlp/2.0-backports/+merge/218189 Your team OpenLP Core is requested to review the proposed merge of lp:~sam92/openlp/2.0-backports into lp:openlp.
=== modified file '.bzrignore' --- .bzrignore 2014-04-21 09:49:17 +0000 +++ .bzrignore 2014-05-03 15:51:13 +0000 @@ -32,3 +32,4 @@ *.orig __pycache__ *.dll +.directory === modified file 'README.txt' --- README.txt 2011-05-24 20:47:05 +0000 +++ README.txt 2014-05-03 15:51:13 +0000 @@ -1,16 +1,15 @@ -OpenLP 2.0 -========== +OpenLP +====== You're probably reading this because you've just downloaded the source code for -OpenLP 2.0. If you are looking for the installer file, please go to the download +OpenLP. If you are looking for the installer file, please go to the download page on the web site:: - http://openlp.org/en/download.html + http://openlp.org/download If you're looking for how to contribute to OpenLP, then please look at the OpenLP wiki:: http://wiki.openlp.org/ -Thanks for downloading OpenLP 2.0! - +Thanks for downloading OpenLP! === modified file 'openlp/core/ui/aboutdialog.py' --- openlp/core/ui/aboutdialog.py 2014-03-20 19:10:31 +0000 +++ openlp/core/ui/aboutdialog.py 2014-05-03 15:51:13 +0000 @@ -44,7 +44,7 @@ Set up the UI for the dialog. """ about_dialog.setObjectName('about_dialog') - about_dialog.setWindowIcon(build_icon(':/icon/openlp-logo-16x16.png')) + about_dialog.setWindowIcon(build_icon(':/icon/openlp-logo.svg')) self.about_dialog_layout = QtGui.QVBoxLayout(about_dialog) self.about_dialog_layout.setObjectName('about_dialog_layout') self.logo_label = QtGui.QLabel(about_dialog) === modified file 'openlp/core/ui/exceptiondialog.py' --- openlp/core/ui/exceptiondialog.py 2014-05-01 17:49:43 +0000 +++ openlp/core/ui/exceptiondialog.py 2014-05-03 15:51:13 +0000 @@ -32,7 +32,7 @@ from PyQt4 import QtGui -from openlp.core.lib import translate +from openlp.core.lib import translate, build_icon from openlp.core.lib.ui import create_button, create_button_box @@ -45,6 +45,7 @@ Set up the UI. """ exception_dialog.setObjectName('exception_dialog') + exception_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) self.exception_layout = QtGui.QVBoxLayout(exception_dialog) self.exception_layout.setObjectName('exception_layout') self.message_layout = QtGui.QHBoxLayout() === modified file 'openlp/core/ui/filerenamedialog.py' --- openlp/core/ui/filerenamedialog.py 2013-12-24 08:56:50 +0000 +++ openlp/core/ui/filerenamedialog.py 2014-05-03 15:51:13 +0000 @@ -31,7 +31,7 @@ """ from PyQt4 import QtCore, QtGui -from openlp.core.lib import translate +from openlp.core.lib import translate, build_icon from openlp.core.lib.ui import create_button_box @@ -44,6 +44,7 @@ Set up the UI """ file_rename_dialog.setObjectName('file_rename_dialog') + file_rename_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) file_rename_dialog.resize(300, 10) self.dialog_layout = QtGui.QGridLayout(file_rename_dialog) self.dialog_layout.setObjectName('dialog_layout') === modified file 'openlp/core/ui/firsttimelanguagedialog.py' --- openlp/core/ui/firsttimelanguagedialog.py 2013-12-24 08:56:50 +0000 +++ openlp/core/ui/firsttimelanguagedialog.py 2014-05-03 15:51:13 +0000 @@ -32,6 +32,7 @@ from PyQt4 import QtGui from openlp.core.common import translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import create_button_box @@ -44,6 +45,7 @@ Set up the UI. """ language_dialog.setObjectName('language_dialog') + language_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) language_dialog.resize(300, 50) self.dialog_layout = QtGui.QVBoxLayout(language_dialog) self.dialog_layout.setContentsMargins(8, 8, 8, 8) === modified file 'openlp/core/ui/firsttimewizard.py' --- openlp/core/ui/firsttimewizard.py 2014-04-12 20:19:22 +0000 +++ openlp/core/ui/firsttimewizard.py 2014-05-03 15:51:13 +0000 @@ -34,6 +34,7 @@ import sys from openlp.core.common import translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import add_welcome_page @@ -60,6 +61,7 @@ Set up the UI. """ first_time_wizard.setObjectName('first_time_wizard') + first_time_wizard.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) first_time_wizard.resize(550, 386) first_time_wizard.setModal(True) first_time_wizard.setWizardStyle(QtGui.QWizard.ModernStyle) === modified file 'openlp/core/ui/formattingtagdialog.py' --- openlp/core/ui/formattingtagdialog.py 2014-03-20 19:10:31 +0000 +++ openlp/core/ui/formattingtagdialog.py 2014-05-03 15:51:13 +0000 @@ -45,6 +45,7 @@ Set up the UI """ formatting_tag_dialog.setObjectName('formatting_tag_dialog') + formatting_tag_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) formatting_tag_dialog.resize(725, 548) self.list_data_grid_layout = QtGui.QVBoxLayout(formatting_tag_dialog) self.list_data_grid_layout.setMargin(8) === modified file 'openlp/core/ui/mainwindow.py' --- openlp/core/ui/mainwindow.py 2014-04-20 16:02:50 +0000 +++ openlp/core/ui/mainwindow.py 2014-05-03 15:51:13 +0000 @@ -89,7 +89,7 @@ Set up the user interface """ main_window.setObjectName('MainWindow') - main_window.setWindowIcon(build_icon(':/icon/openlp-logo-64x64.png')) + main_window.setWindowIcon(build_icon(':/icon/openlp-logo.svg')) main_window.setDockNestingEnabled(True) # Set up the main container, which contains all the other form widgets. self.main_content = QtGui.QWidget(main_window) === modified file 'openlp/core/ui/plugindialog.py' --- openlp/core/ui/plugindialog.py 2013-12-24 15:55:01 +0000 +++ openlp/core/ui/plugindialog.py 2014-05-03 15:51:13 +0000 @@ -32,6 +32,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.common import UiStrings, translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import create_button_box @@ -44,6 +45,7 @@ Set up the UI """ pluginViewDialog.setObjectName('pluginViewDialog') + pluginViewDialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) pluginViewDialog.setWindowModality(QtCore.Qt.ApplicationModal) self.plugin_layout = QtGui.QVBoxLayout(pluginViewDialog) self.plugin_layout.setObjectName('plugin_layout') === modified file 'openlp/core/ui/printservicedialog.py' --- openlp/core/ui/printservicedialog.py 2013-12-24 15:55:01 +0000 +++ openlp/core/ui/printservicedialog.py 2014-05-03 15:51:13 +0000 @@ -56,6 +56,7 @@ Set up the UI """ print_service_dialog.setObjectName('print_service_dialog') + print_service_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) print_service_dialog.resize(664, 594) self.main_layout = QtGui.QVBoxLayout(print_service_dialog) self.main_layout.setSpacing(0) === modified file 'openlp/core/ui/serviceitemeditdialog.py' --- openlp/core/ui/serviceitemeditdialog.py 2013-12-24 15:55:01 +0000 +++ openlp/core/ui/serviceitemeditdialog.py 2014-05-03 15:51:13 +0000 @@ -32,6 +32,7 @@ from PyQt4 import QtGui from openlp.core.common import translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import create_button_box, create_button @@ -44,6 +45,7 @@ Set up the UI """ serviceItemEditDialog.setObjectName('serviceItemEditDialog') + serviceItemEditDialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) self.dialog_layout = QtGui.QGridLayout(serviceItemEditDialog) self.dialog_layout.setContentsMargins(8, 8, 8, 8) self.dialog_layout.setSpacing(8) === modified file 'openlp/core/ui/settingsdialog.py' --- openlp/core/ui/settingsdialog.py 2013-12-24 08:56:50 +0000 +++ openlp/core/ui/settingsdialog.py 2014-05-03 15:51:13 +0000 @@ -45,8 +45,8 @@ Set up the UI """ settings_dialog.setObjectName('settings_dialog') + settings_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) settings_dialog.resize(800, 500) - settings_dialog.setWindowIcon(build_icon(':/system/system_settings.png')) self.dialog_layout = QtGui.QGridLayout(settings_dialog) self.dialog_layout.setObjectName('dialog_layout') self.dialog_layout.setMargin(8) === modified file 'openlp/core/ui/shortcutlistdialog.py' --- openlp/core/ui/shortcutlistdialog.py 2013-12-24 20:45:29 +0000 +++ openlp/core/ui/shortcutlistdialog.py 2014-05-03 15:51:13 +0000 @@ -66,6 +66,7 @@ Set up the UI """ shortcutListDialog.setObjectName('shortcutListDialog') + shortcutListDialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) shortcutListDialog.resize(500, 438) self.shortcut_list_layout = QtGui.QVBoxLayout(shortcutListDialog) self.shortcut_list_layout.setObjectName('shortcut_list_layout') === modified file 'openlp/core/ui/starttimedialog.py' --- openlp/core/ui/starttimedialog.py 2013-12-24 20:45:29 +0000 +++ openlp/core/ui/starttimedialog.py 2014-05-03 15:51:13 +0000 @@ -32,6 +32,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.common import UiStrings, translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import create_button_box @@ -44,6 +45,7 @@ Set up the UI """ StartTimeDialog.setObjectName('StartTimeDialog') + StartTimeDialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) StartTimeDialog.resize(350, 10) self.dialog_layout = QtGui.QGridLayout(StartTimeDialog) self.dialog_layout.setObjectName('dialog_layout') === modified file 'openlp/core/ui/themelayoutdialog.py' --- openlp/core/ui/themelayoutdialog.py 2014-04-12 20:19:22 +0000 +++ openlp/core/ui/themelayoutdialog.py 2014-05-03 15:51:13 +0000 @@ -32,6 +32,7 @@ from PyQt4 import QtGui from openlp.core.common import translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import create_button_box @@ -44,6 +45,7 @@ Set up the UI """ themeLayoutDialog.setObjectName('themeLayoutDialogDialog') + themeLayoutDialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) self.preview_layout = QtGui.QVBoxLayout(themeLayoutDialog) self.preview_layout.setObjectName('preview_layout') self.preview_area = QtGui.QWidget(themeLayoutDialog) === modified file 'openlp/core/ui/themewizard.py' --- openlp/core/ui/themewizard.py 2014-03-20 19:10:31 +0000 +++ openlp/core/ui/themewizard.py 2014-05-03 15:51:13 +0000 @@ -46,6 +46,7 @@ Set up the UI """ themeWizard.setObjectName('OpenLP.ThemeWizard') + themeWizard.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) themeWizard.setModal(True) themeWizard.setWizardStyle(QtGui.QWizard.ModernStyle) themeWizard.setOptions(QtGui.QWizard.IndependentPages | === modified file 'openlp/core/ui/wizard.py' --- openlp/core/ui/wizard.py 2014-05-02 06:42:17 +0000 +++ openlp/core/ui/wizard.py 2014-05-03 15:51:13 +0000 @@ -118,6 +118,7 @@ """ Set up the wizard UI. """ + self.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) self.setModal(True) self.setWizardStyle(QtGui.QWizard.ModernStyle) self.setOptions(QtGui.QWizard.IndependentPages | === modified file 'openlp/plugins/alerts/forms/alertdialog.py' --- openlp/plugins/alerts/forms/alertdialog.py 2014-01-11 21:46:20 +0000 +++ openlp/plugins/alerts/forms/alertdialog.py 2014-05-03 15:51:13 +0000 @@ -46,7 +46,7 @@ """ alert_dialog.setObjectName('alert_dialog') alert_dialog.resize(400, 300) - alert_dialog.setWindowIcon(build_icon(':/icon/openlp-logo-16x16.png')) + alert_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) self.alert_dialog_layout = QtGui.QGridLayout(alert_dialog) self.alert_dialog_layout.setObjectName('alert_dialog_layout') self.alert_text_layout = QtGui.QFormLayout() === modified file 'openlp/plugins/bibles/forms/booknamedialog.py' --- openlp/plugins/bibles/forms/booknamedialog.py 2014-03-21 18:23:35 +0000 +++ openlp/plugins/bibles/forms/booknamedialog.py 2014-05-03 15:51:13 +0000 @@ -30,12 +30,14 @@ from PyQt4 import QtCore, QtGui from openlp.core.common import translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import create_button_box class Ui_BookNameDialog(object): def setupUi(self, book_name_dialog): book_name_dialog.setObjectName('book_name_dialog') + book_name_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) book_name_dialog.resize(400, 271) self.book_name_layout = QtGui.QVBoxLayout(book_name_dialog) self.book_name_layout.setSpacing(8) === modified file 'openlp/plugins/bibles/forms/editbibledialog.py' --- openlp/plugins/bibles/forms/editbibledialog.py 2014-03-21 18:23:35 +0000 +++ openlp/plugins/bibles/forms/editbibledialog.py 2014-05-03 15:51:13 +0000 @@ -39,8 +39,8 @@ class Ui_EditBibleDialog(object): def setupUi(self, edit_bible_dialog): edit_bible_dialog.setObjectName('edit_bible_dialog') + edit_bible_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) edit_bible_dialog.resize(520, 400) - edit_bible_dialog.setWindowIcon(build_icon(':/icon/openlp-logo-16x16.png')) edit_bible_dialog.setModal(True) self.dialog_layout = QtGui.QVBoxLayout(edit_bible_dialog) self.dialog_layout.setSpacing(8) === modified file 'openlp/plugins/bibles/forms/languagedialog.py' --- openlp/plugins/bibles/forms/languagedialog.py 2014-03-21 18:23:35 +0000 +++ openlp/plugins/bibles/forms/languagedialog.py 2014-05-03 15:51:13 +0000 @@ -30,12 +30,14 @@ from PyQt4 import QtGui from openlp.core.common import translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import create_button_box class Ui_LanguageDialog(object): def setupUi(self, language_dialog): language_dialog.setObjectName('language_dialog') + language_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) language_dialog.resize(400, 165) self.language_layout = QtGui.QVBoxLayout(language_dialog) self.language_layout.setSpacing(8) === modified file 'openlp/plugins/bibles/lib/mediaitem.py' --- openlp/plugins/bibles/lib/mediaitem.py 2014-05-02 06:50:54 +0000 +++ openlp/plugins/bibles/lib/mediaitem.py 2014-05-03 15:51:13 +0000 @@ -60,7 +60,6 @@ log.info('Bible Media Item loaded') def __init__(self, parent, plugin): - self.icon_path = 'songs/song' self.lock_icon = build_icon(':/bibles/bibles_search_lock.png') self.unlock_icon = build_icon(':/bibles/bibles_search_unlock.png') MediaManagerItem.__init__(self, parent, plugin) @@ -172,6 +171,7 @@ self.page_layout.addWidget(tab) tab.setVisible(False) lock_button.toggled.connect(self.on_lock_button_toggled) + second_combo_box.currentIndexChanged.connect(self.on_second_bible_combobox_index_changed) setattr(self, prefix + 'VersionLabel', version_label) setattr(self, prefix + 'VersionComboBox', version_combo_box) setattr(self, prefix + 'SecondLabel', second_label) @@ -263,11 +263,15 @@ def config_update(self): log.debug('config_update') if Settings().value(self.settings_section + '/second bibles'): + self.quickSecondLabel.setVisible(True) + self.quickSecondComboBox.setVisible(True) self.advancedSecondLabel.setVisible(True) self.advancedSecondComboBox.setVisible(True) self.quickSecondLabel.setVisible(True) self.quickSecondComboBox.setVisible(True) else: + self.quickSecondLabel.setVisible(False) + self.quickSecondComboBox.setVisible(False) self.advancedSecondLabel.setVisible(False) self.advancedSecondComboBox.setVisible(False) self.quickSecondLabel.setVisible(False) @@ -459,6 +463,17 @@ books.sort(key=get_locale_key) set_case_insensitive_completer(books, self.quick_search_edit) + def on_second_bible_combobox_index_changed(self, selection): + """ + Activate the style combobox only when no second bible is selected + """ + if selection == 0: + self.quickStyleComboBox.setEnabled(True) + self.advancedStyleComboBox.setEnabled(True) + else: + self.quickStyleComboBox.setEnabled(False) + self.advancedStyleComboBox.setEnabled(False) + def on_import_click(self): if not hasattr(self, 'import_wizard'): self.import_wizard = BibleImportForm(self, self.plugin.manager, self.plugin) === modified file 'openlp/plugins/custom/forms/editcustomdialog.py' --- openlp/plugins/custom/forms/editcustomdialog.py 2014-01-01 10:56:23 +0000 +++ openlp/plugins/custom/forms/editcustomdialog.py 2014-05-03 15:51:13 +0000 @@ -41,8 +41,8 @@ :param custom_edit_dialog: The Dialog """ custom_edit_dialog.setObjectName('custom_edit_dialog') + custom_edit_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) custom_edit_dialog.resize(450, 350) - custom_edit_dialog.setWindowIcon(build_icon(':/icon/openlp-logo-16x16.png')) self.dialog_layout = QtGui.QVBoxLayout(custom_edit_dialog) self.dialog_layout.setObjectName('dialog_layout') self.title_layout = QtGui.QHBoxLayout() === modified file 'openlp/plugins/custom/forms/editcustomslidedialog.py' --- openlp/plugins/custom/forms/editcustomslidedialog.py 2014-03-21 21:38:08 +0000 +++ openlp/plugins/custom/forms/editcustomslidedialog.py 2014-05-03 15:51:13 +0000 @@ -30,13 +30,14 @@ from PyQt4 import QtGui from openlp.core.common import UiStrings, translate -from openlp.core.lib import SpellTextEdit +from openlp.core.lib import SpellTextEdit, build_icon from openlp.core.lib.ui import create_button, create_button_box class Ui_CustomSlideEditDialog(object): def setupUi(self, custom_slide_edit_dialog): custom_slide_edit_dialog.setObjectName('custom_slide_edit_dialog') + custom_slide_edit_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) custom_slide_edit_dialog.resize(350, 300) self.dialog_layout = QtGui.QVBoxLayout(custom_slide_edit_dialog) self.slide_text_edit = SpellTextEdit(self) === modified file 'openlp/plugins/songs/forms/authorsdialog.py' --- openlp/plugins/songs/forms/authorsdialog.py 2013-12-24 08:56:50 +0000 +++ openlp/plugins/songs/forms/authorsdialog.py 2014-05-03 15:51:13 +0000 @@ -43,8 +43,8 @@ Set up the UI for the dialog. """ authors_dialog.setObjectName('authors_dialog') + authors_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) authors_dialog.resize(300, 10) - authors_dialog.setWindowIcon(build_icon(':/icon/openlp-logo-16x16.png')) authors_dialog.setModal(True) self.dialog_layout = QtGui.QVBoxLayout(authors_dialog) self.dialog_layout.setObjectName('dialog_layout') === modified file 'openlp/plugins/songs/forms/editsongdialog.py' --- openlp/plugins/songs/forms/editsongdialog.py 2014-04-21 09:58:53 +0000 +++ openlp/plugins/songs/forms/editsongdialog.py 2014-05-03 15:51:13 +0000 @@ -43,8 +43,8 @@ """ def setupUi(self, edit_song_dialog): edit_song_dialog.setObjectName('edit_song_dialog') + edit_song_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) edit_song_dialog.resize(650, 400) - edit_song_dialog.setWindowIcon(build_icon(':/icon/openlp-logo-16x16.png')) edit_song_dialog.setModal(True) self.dialog_layout = QtGui.QVBoxLayout(edit_song_dialog) self.dialog_layout.setSpacing(8) === modified file 'openlp/plugins/songs/forms/editsongform.py' --- openlp/plugins/songs/forms/editsongform.py 2014-04-15 08:30:04 +0000 +++ openlp/plugins/songs/forms/editsongform.py 2014-05-03 15:51:13 +0000 @@ -107,6 +107,7 @@ self.audio_list_widget.setAlternatingRowColors(True) self.find_verse_split = re.compile('---\[\]---\n', re.UNICODE) self.whitespace = re.compile(r'\W+', re.UNICODE) + self.find_tags = re.compile(u'\{/?\w+\}', re.UNICODE) def _load_objects(self, cls, combo, cache): """ @@ -234,8 +235,57 @@ self.manager.save_object(book) else: return False + # Validate tags (lp#1199639) + misplaced_tags = [] + verse_tags = [] + for i in range(self.verse_list_widget.rowCount()): + item = self.verse_list_widget.item(i, 0) + tags = self.find_tags.findall(item.text()) + field = item.data(QtCore.Qt.UserRole) + verse_tags.append(field) + if not self._validate_tags(tags): + misplaced_tags.append('%s %s' % (VerseType.translated_name(field[0]), field[1:])) + if misplaced_tags: + critical_error_message_box( + message=translate('SongsPlugin.EditSongForm', + 'There are misplaced formatting tags in the following verses:\n\n%s\n\n' + 'Please correct these tags before continuing.' % ', '.join(misplaced_tags))) + return False + for tag in verse_tags: + if verse_tags.count(tag) > 26: + # lp#1310523: OpenLyrics allows only a-z variants of one verse: + # http://openlyrics.info/dataformat.html#verse-name + critical_error_message_box(message=translate( + 'SongsPlugin.EditSongForm', 'You have %(count)s verses named %(name)s %(number)s. ' + 'You can have at most 26 verses with the same name' % + {'count': verse_tags.count(tag), + 'name': VerseType.translated_name(tag[0]), + 'number': tag[1:]})) + return False return True + def _validate_tags(self, tags): + """ + Validates a list of tags + Deletes the first affiliated tag pair which is located side by side in the list + and call itself recursively with the shortened tag list. + If there is any misplaced tag in the list, either the length of the tag list is not even, + or the function won't find any tag pairs side by side. + If there is no misplaced tag, the length of the list will be zero on any recursive run. + + :param tags: A list of tags + :return: True if the function can't find any mismatched tags. Else False. + """ + if len(tags) == 0: + return True + if len(tags) % 2 != 0: + return False + for i in range(len(tags)-1): + if tags[i+1] == "{/" + tags[i][1:]: + del tags[i:i+2] + return self._validate_tags(tags) + return False + def _process_lyrics(self): """ Process the lyric data entered by the user into the OpenLP XML format. === modified file 'openlp/plugins/songs/forms/editversedialog.py' --- openlp/plugins/songs/forms/editversedialog.py 2014-03-04 18:49:30 +0000 +++ openlp/plugins/songs/forms/editversedialog.py 2014-05-03 15:51:13 +0000 @@ -37,6 +37,7 @@ class Ui_EditVerseDialog(object): def setupUi(self, edit_verse_dialog): edit_verse_dialog.setObjectName('edit_verse_dialog') + edit_verse_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) edit_verse_dialog.resize(400, 400) edit_verse_dialog.setModal(True) self.dialog_layout = QtGui.QVBoxLayout(edit_verse_dialog) === modified file 'openlp/plugins/songs/forms/mediafilesdialog.py' --- openlp/plugins/songs/forms/mediafilesdialog.py 2014-04-12 20:19:22 +0000 +++ openlp/plugins/songs/forms/mediafilesdialog.py 2014-05-03 15:51:13 +0000 @@ -42,10 +42,10 @@ Set up the user interface. """ media_files_dialog.setObjectName('media_files_dialog') + media_files_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) media_files_dialog.setWindowModality(QtCore.Qt.ApplicationModal) media_files_dialog.resize(400, 300) media_files_dialog.setModal(True) - media_files_dialog.setWindowIcon(build_icon(':/icon/openlp-logo-16x16.png')) self.files_vertical_layout = QtGui.QVBoxLayout(media_files_dialog) self.files_vertical_layout.setSpacing(8) self.files_vertical_layout.setMargin(8) === modified file 'openlp/plugins/songs/forms/songbookdialog.py' --- openlp/plugins/songs/forms/songbookdialog.py 2013-12-24 08:56:50 +0000 +++ openlp/plugins/songs/forms/songbookdialog.py 2014-05-03 15:51:13 +0000 @@ -29,7 +29,7 @@ from PyQt4 import QtGui -from openlp.core.lib import translate +from openlp.core.lib import translate, build_icon from openlp.core.lib.ui import create_button_box @@ -42,6 +42,7 @@ Set up the user interface. """ song_book_dialog.setObjectName('song_book_dialog') + song_book_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) song_book_dialog.resize(300, 10) self.dialog_layout = QtGui.QVBoxLayout(song_book_dialog) self.dialog_layout.setObjectName('dialog_layout') === modified file 'openlp/plugins/songs/forms/songmaintenancedialog.py' --- openlp/plugins/songs/forms/songmaintenancedialog.py 2014-03-21 21:38:08 +0000 +++ openlp/plugins/songs/forms/songmaintenancedialog.py 2014-05-03 15:51:13 +0000 @@ -44,6 +44,7 @@ Set up the user interface for the song maintenance dialog """ song_maintenance_dialog.setObjectName('song_maintenance_dialog') + song_maintenance_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) song_maintenance_dialog.setWindowModality(QtCore.Qt.ApplicationModal) song_maintenance_dialog.resize(10, 350) self.dialog_layout = QtGui.QGridLayout(song_maintenance_dialog) === modified file 'openlp/plugins/songs/forms/topicsdialog.py' --- openlp/plugins/songs/forms/topicsdialog.py 2013-12-24 08:56:50 +0000 +++ openlp/plugins/songs/forms/topicsdialog.py 2014-05-03 15:51:13 +0000 @@ -29,7 +29,7 @@ from PyQt4 import QtGui -from openlp.core.lib import translate +from openlp.core.lib import translate, build_icon from openlp.core.lib.ui import create_button_box @@ -42,6 +42,7 @@ Set up the user interface for the topics dialog. """ topics_dialog.setObjectName('topics_dialog') + topics_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) topics_dialog.resize(300, 10) self.dialog_layout = QtGui.QVBoxLayout(topics_dialog) self.dialog_layout.setObjectName('dialog_layout') === modified file 'openlp/plugins/songs/lib/xml.py' --- openlp/plugins/songs/lib/xml.py 2014-05-02 06:42:17 +0000 +++ openlp/plugins/songs/lib/xml.py 2014-05-03 15:51:13 +0000 @@ -310,9 +310,9 @@ verse_tag = verse[0]['type'][0].lower() verse_number = verse[0]['label'] verse_def = verse_tag + verse_number + # Create the letter from the number of duplicates + verse[0][u'suffix'] = chr(97 + (verse_tags.count(verse_def) % 26)) verse_tags.append(verse_def) - # Create the letter from the number of duplicates - verse[0]['suffix'] = chr(96 + verse_tags.count(verse_def)) # If the verse tag is a duplicate use the suffix letter for verse in verse_list: verse_tag = verse[0]['type'][0].lower() === modified file 'openlp/plugins/songusage/forms/songusagedeletedialog.py' --- openlp/plugins/songusage/forms/songusagedeletedialog.py 2014-01-11 22:01:41 +0000 +++ openlp/plugins/songusage/forms/songusagedeletedialog.py 2014-05-03 15:51:13 +0000 @@ -30,6 +30,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.common import translate +from openlp.core.lib import build_icon from openlp.core.lib.ui import create_button_box @@ -44,6 +45,7 @@ :param song_usage_delete_dialog: """ song_usage_delete_dialog.setObjectName('song_usage_delete_dialog') + song_usage_delete_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) song_usage_delete_dialog.resize(291, 243) self.vertical_layout = QtGui.QVBoxLayout(song_usage_delete_dialog) self.vertical_layout.setSpacing(8) === modified file 'openlp/plugins/songusage/forms/songusagedetaildialog.py' --- openlp/plugins/songusage/forms/songusagedetaildialog.py 2014-01-11 22:01:41 +0000 +++ openlp/plugins/songusage/forms/songusagedetaildialog.py 2014-05-03 15:51:13 +0000 @@ -45,6 +45,7 @@ :param song_usage_detail_dialog: """ song_usage_detail_dialog.setObjectName('song_usage_detail_dialog') + song_usage_detail_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo.svg')) song_usage_detail_dialog.resize(609, 413) self.vertical_layout = QtGui.QVBoxLayout(song_usage_detail_dialog) self.vertical_layout.setSpacing(8) === modified file 'tests/functional/openlp_core_lib/test_ui.py' --- tests/functional/openlp_core_lib/test_ui.py 2014-04-20 20:19:21 +0000 +++ tests/functional/openlp_core_lib/test_ui.py 2014-05-03 15:51:13 +0000 @@ -82,6 +82,21 @@ self.assertEqual(1, len(btnbox.buttons())) self.assertEqual(QtGui.QDialogButtonBox.HelpRole, btnbox.buttonRole(btnbox.buttons()[0])) + def test_create_horizontal_adjusting_combo_box(self): + """ + Test creating a horizontal adjusting combo box + """ + # GIVEN: A dialog + dialog = QtGui.QDialog() + + # WHEN: We create the combobox + combo = create_horizontal_adjusting_combo_box(dialog, 'combo1') + + # THEN: We should get a ComboBox + self.assertIsInstance(combo, QtGui.QComboBox) + self.assertEqual('combo1', combo.objectName()) + self.assertEqual(QtGui.QComboBox.AdjustToMinimumContentsLength, combo.sizeAdjustPolicy()) + def test_create_button(self): """ Test creating a button @@ -114,38 +129,6 @@ self.assertEqual('my_btn', btn.objectName()) self.assertTrue(btn.isEnabled()) - def test_create_valign_selection_widgets(self): - """ - Test creating a combo box for valign selection - """ - # GIVEN: A dialog - dialog = QtGui.QDialog() - - # WHEN: We create the widgets - label, combo = create_valign_selection_widgets(dialog) - - # THEN: We should get a label and a combobox. - self.assertEqual(translate('OpenLP.Ui', '&Vertical Align:'), label.text()) - self.assertIsInstance(combo, QtGui.QComboBox) - self.assertEqual(combo, label.buddy()) - for text in [UiStrings().Top, UiStrings().Middle, UiStrings().Bottom]: - self.assertTrue(combo.findText(text) >= 0) - - def test_create_horizontal_adjusting_combo_box(self): - """ - Test creating a horizontal adjusting combo box - """ - # GIVEN: A dialog - dialog = QtGui.QDialog() - - # WHEN: We create the combobox - combo = create_horizontal_adjusting_combo_box(dialog, 'combo1') - - # THEN: We should get a ComboBox - self.assertIsInstance(combo, QtGui.QComboBox) - self.assertEqual('combo1', combo.objectName()) - self.assertEqual(QtGui.QComboBox.AdjustToMinimumContentsLength, combo.sizeAdjustPolicy()) - def test_create_action(self): """ Test creating an action @@ -170,3 +153,47 @@ self.assertIsInstance(action.icon(), QtGui.QIcon) self.assertEqual('my tooltip', action.toolTip()) self.assertEqual('my statustip', action.statusTip()) + + def test_create_valign_selection_widgets(self): + """ + Test creating a combo box for valign selection + """ + # GIVEN: A dialog + dialog = QtGui.QDialog() + + # WHEN: We create the widgets + label, combo = create_valign_selection_widgets(dialog) + + # THEN: We should get a label and a combobox. + self.assertEqual(translate('OpenLP.Ui', '&Vertical Align:'), label.text()) + self.assertIsInstance(combo, QtGui.QComboBox) + self.assertEqual(combo, label.buddy()) + for text in [UiStrings().Top, UiStrings().Middle, UiStrings().Bottom]: + self.assertTrue(combo.findText(text) >= 0) + + def test_find_and_set_in_combo_box(self): + """ + Test finding a string in a combo box and setting it as the selected item if present + """ + # GIVEN: A ComboBox + combo = QtGui.QComboBox() + combo.addItems(['One', 'Two', 'Three']) + combo.setCurrentIndex(1) + + # WHEN: We call the method with a non-existing value and set_missing=False + find_and_set_in_combo_box(combo, 'Four', set_missing=False) + + # THEN: The index should not have changed + self.assertEqual(1, combo.currentIndex()) + + # WHEN: We call the method with a non-existing value + find_and_set_in_combo_box(combo, 'Four') + + # THEN: The index should have been reset + self.assertEqual(0, combo.currentIndex()) + + # WHEN: We call the method with the default behavior + find_and_set_in_combo_box(combo, 'Three') + + # THEN: The index should have changed + self.assertEqual(2, combo.currentIndex()) === modified file 'tests/utils/test_bzr_tags.py' --- tests/utils/test_bzr_tags.py 2014-04-14 20:01:13 +0000 +++ tests/utils/test_bzr_tags.py 2014-05-03 15:51:13 +0000 @@ -53,6 +53,7 @@ ['2.0.1', '?'], ['2.0.2', '?'], ['2.0.3', '?'], + ['2.0.4', '?'], ['2.1.0', '2119'] ]
_______________________________________________ Mailing list: https://launchpad.net/~openlp-core Post to : openlp-core@lists.launchpad.net Unsubscribe : https://launchpad.net/~openlp-core More help : https://help.launchpad.net/ListHelp