From 06cf6dcc203c47b26dcf0ea5c1e0821d47a0b3ca Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 9 Nov 2010 17:56:16 +0100 Subject: [PATCH 01/40] changed bible importer finish message, clean ups --- .../plugins/bibles/forms/bibleimportform.py | 26 +++++++++++++------ openlp/plugins/bibles/lib/http.py | 7 +++-- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 2e11c30ad..9053c123e 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -168,7 +168,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): license_version = unicode(self.field(u'license_version').toString()) license_copyright = \ unicode(self.field(u'license_copyright').toString()) - if license_version == u'': + if not license_version: QtGui.QMessageBox.critical(self, translate('BiblesPlugin.ImportWizardForm', 'Empty Version Name'), @@ -176,7 +176,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): 'You need to specify a version name for your Bible.')) self.VersionNameEdit.setFocus() return False - elif license_copyright == u'': + elif not license_copyright: QtGui.QMessageBox.critical(self, translate('BiblesPlugin.ImportWizardForm', 'Empty Copyright'), @@ -317,7 +317,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): """ Load the list of Crosswalk and BibleGateway bibles. """ - #Load and store Crosswalk Bibles + # Load and store Crosswalk Bibles. filepath = AppLocation.get_directory(AppLocation.PluginsDir) filepath = os.path.join(filepath, u'bibles', u'resources') books_file = None @@ -341,7 +341,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): finally: if books_file: books_file.close() - #Load and store BibleGateway Bibles + # Load and store BibleGateway Bibles. books_file = None try: self.web_bible_list[WebDownload.BibleGateway] = {} @@ -379,12 +379,17 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): Receiver.send_message(u'openlp_process_events') def preImport(self): + bible_type = self.field(u'source_format').toInt()[0] self.finishButton.setVisible(False) self.ImportProgressBar.setMinimum(0) self.ImportProgressBar.setMaximum(1188) self.ImportProgressBar.setValue(0) - self.ImportProgressLabel.setText( - translate('BiblesPlugin.ImportWizardForm', 'Starting import...')) + if bible_type == BibleFormat.WebDownload: + self.ImportProgressLabel.setText(translate( + 'BiblesPlugin.ImportWizardForm', 'Starting Registering bible...')) + else: + self.ImportProgressLabel.setText(translate( + 'BiblesPlugin.ImportWizardForm', 'Starting import...')) Receiver.send_message(u'openlp_process_events') def performImport(self): @@ -438,8 +443,13 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): self.manager.save_meta_data(license_version, license_version, license_copyright, license_permissions) self.manager.reload_bibles() - self.ImportProgressLabel.setText( - translate('BiblesPlugin.ImportWizardForm', 'Finished import.')) + if bible_type == BibleFormat.WebDownload: + self.ImportProgressLabel.setText( + translate('BiblesPlugin.ImportWizardForm', 'Registered ' + 'bible. Verses will be downloaded as required.')) + else: + self.ImportProgressLabel.setText(translate( + 'BiblesPlugin.ImportWizardForm', 'Finished import.')) else: self.ImportProgressLabel.setText( translate('BiblesPlugin.ImportWizardForm', diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index e6a474f5c..361525563 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -364,12 +364,11 @@ class HTTPBible(BibleDB): if self.proxy_server: self.create_meta(u'proxy server', self.proxy_server) if self.proxy_username: - # store the proxy userid + # Store the proxy userid. self.create_meta(u'proxy username', self.proxy_username) if self.proxy_password: - # store the proxy password + # Store the proxy password. self.create_meta(u'proxy password', self.proxy_password) - self.wizard.incrementProgressBar('Registered.') return True def get_verses(self, reference_list): @@ -417,7 +416,7 @@ class HTTPBible(BibleDB): ## to request ac and get Acts back. bookname = search_results.book Receiver.send_message(u'openlp_process_events') - # check to see if book/chapter exists + # Check to see if book/chapter exists. db_book = self.get_book(bookname) self.create_chapter(db_book.id, search_results.chapter, search_results.verselist) From f8b793ca3bfeaac747eab323d128407c3d751fee Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 9 Nov 2010 18:10:37 +0100 Subject: [PATCH 02/40] removed whitespaces, added second blank line before class --- openlp/plugins/bibles/lib/mediaitem.py | 1 + openlp/plugins/songs/forms/songmaintenanceform.py | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index bb3c1b26d..d00e94fe0 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -47,6 +47,7 @@ class BibleListView(BaseListWithDnD): self.parent().onListViewResize(event.size().width(), event.size().width()) + class BibleMediaItem(MediaManagerItem): """ This is the custom media manager item for Bibles. diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py index 7c13e0989..e057bb516 100644 --- a/openlp/plugins/songs/forms/songmaintenanceform.py +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -405,7 +405,7 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): def mergeAuthors(self, old_author): """ Merges two authors into one author. - + ``old_author`` The author which will be deleted afterwards. """ @@ -427,7 +427,7 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): def mergeTopics(self, old_topic): """ Merges two topics into one topic. - + ``old_topic`` The topic which will be deleted afterwards. """ @@ -447,7 +447,7 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): def mergeBooks(self, old_book): """ Merges two books into one book. - + ``old_book`` The book which will be deleted afterwards. """ From 802e886e9621931505a9b0f4e311fca73e128cc0 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 9 Nov 2010 18:23:18 +0100 Subject: [PATCH 03/40] removed whitespaces --- openlp/plugins/bibles/lib/manager.py | 2 +- openlp/plugins/bibles/lib/mediaitem.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 9afc4a4b2..84137630f 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -267,7 +267,7 @@ class BibleManager(object): ``text`` The text to search for (unicode). """ - log.debug(u'BibleManager.verse_search("%s", "%s")', bible, text) + log.debug(u'BibleManager.verse_search("%s", "%s")', bible, text) if text: return self.db_cache[bible].verse_search(text) else: diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index d00e94fe0..79f3fde59 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -546,7 +546,7 @@ class BibleMediaItem(MediaManagerItem): self.dual_search_results = self.parent.manager.get_verses( dual_bible, text) else: - # We are doing a ' Text Search'. + # We are doing a 'Text Search'. bibles = self.parent.manager.get_bibles() self.search_results = self.parent.manager.verse_search(bible, text) if dual_bible and self.search_results: From 45945cc3025e6c15a756c4a56730ab18fa684f8c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 12 Nov 2010 14:50:13 +0100 Subject: [PATCH 04/40] -docs/comments -disabled text mode for webbibles -"dual" instead of "second" --- openlp/plugins/bibles/lib/manager.py | 20 +++- openlp/plugins/bibles/lib/mediaitem.py | 142 +++++++++++++++++-------- 2 files changed, 115 insertions(+), 47 deletions(-) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 84137630f..13f96cca9 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -257,17 +257,34 @@ class BibleManager(object): 'Book Chapter:Verse-Chapter:Verse')) return None - def verse_search(self, bible, text): + def verse_search(self, bible, dual_bible, text): """ Does a verse search for the given bible and text. ``bible`` The bible to seach in (unicode). + ``dual_bible`` + The dual bible (unicode). We do not search in this bible. + ``text`` The text to search for (unicode). """ log.debug(u'BibleManager.verse_search("%s", "%s")', bible, text) + # Check if the bible or dual_bible is a web bible. + webbible = self.db_cache[bible].get_object(BibleMeta, + u'download source') + dual_webbible = u'' + if dual_bible: + dual_webbible = self.db_cache[dual_bible].get_object(BibleMeta, + u'download source') + if webbible or dual_webbible: + QtGui.QMessageBox.information(self.parent.mediaItem, + translate('BiblesPlugin.BibleManager', + 'Web Bible cannot be used'), + translate('BiblesPlugin.BibleManager', 'You cannot use text ' + 'search with web bible.')) + return None if text: return self.db_cache[bible].verse_search(text) else: @@ -317,4 +334,3 @@ class BibleManager(object): """ for bible in self.db_cache: self.db_cache[bible].finalise() - diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 79f3fde59..6f82f6f08 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -60,7 +60,7 @@ class BibleMediaItem(MediaManagerItem): self.IconPath = u'songs/song' self.ListViewWithDnD_class = BibleListView MediaManagerItem.__init__(self, parent, icon, title) - # place to store the search results for both bibles + # Place to store the search results for both bibles. self.search_results = {} self.dual_search_results = {} QtCore.QObject.connect(Receiver.get_receiver(), @@ -100,14 +100,14 @@ class BibleMediaItem(MediaManagerItem): QtGui.QComboBox.AdjustToMinimumContentsLength) self.QuickVersionComboBox.setObjectName(u'VersionComboBox') self.QuickLayout.addWidget(self.QuickVersionComboBox, 0, 1, 1, 2) - self.QuickSecondVersionLabel = QtGui.QLabel(self.QuickTab) - self.QuickSecondVersionLabel.setObjectName(u'QuickSecondVersionLabel') - self.QuickLayout.addWidget(self.QuickSecondVersionLabel, 1, 0, 1, 1) - self.QuickSecondBibleComboBox = QtGui.QComboBox(self.QuickTab) - self.QuickSecondBibleComboBox.setSizeAdjustPolicy( + self.QuickDualVersionLabel = QtGui.QLabel(self.QuickTab) + self.QuickDualVersionLabel.setObjectName(u'QuickDualVersionLabel') + self.QuickLayout.addWidget(self.QuickDualVersionLabel, 1, 0, 1, 1) + self.QuickDualBibleComboBox = QtGui.QComboBox(self.QuickTab) + self.QuickDualBibleComboBox.setSizeAdjustPolicy( QtGui.QComboBox.AdjustToMinimumContentsLength) - self.QuickSecondBibleComboBox.setObjectName(u'SecondBible') - self.QuickLayout.addWidget(self.QuickSecondBibleComboBox, 1, 1, 1, 2) + self.QuickDualBibleComboBox.setObjectName(u'DualBible') + self.QuickLayout.addWidget(self.QuickDualBibleComboBox, 1, 1, 1, 2) self.QuickSearchLabel = QtGui.QLabel(self.QuickTab) self.QuickSearchLabel.setObjectName(u'QuickSearchLabel') self.QuickLayout.addWidget(self.QuickSearchLabel, 2, 0, 1, 1) @@ -161,16 +161,16 @@ class BibleMediaItem(MediaManagerItem): QtGui.QComboBox.AdjustToMinimumContentsLength) self.AdvancedVersionComboBox.setObjectName(u'AdvancedVersionComboBox') self.AdvancedLayout.addWidget(self.AdvancedVersionComboBox, 0, 1, 1, 2) - self.AdvancedSecondBibleLabel = QtGui.QLabel(self.AdvancedTab) - self.AdvancedSecondBibleLabel.setObjectName(u'AdvancedSecondBibleLabel') - self.AdvancedLayout.addWidget(self.AdvancedSecondBibleLabel, 1, 0, 1, 1) - self.AdvancedSecondBibleComboBox = QtGui.QComboBox(self.AdvancedTab) - self.AdvancedSecondBibleComboBox.setSizeAdjustPolicy( + self.AdvancedDualBibleLabel = QtGui.QLabel(self.AdvancedTab) + self.AdvancedDualBibleLabel.setObjectName(u'AdvancedDualBibleLabel') + self.AdvancedLayout.addWidget(self.AdvancedDualBibleLabel, 1, 0, 1, 1) + self.AdvancedDualBibleComboBox = QtGui.QComboBox(self.AdvancedTab) + self.AdvancedDualBibleComboBox.setSizeAdjustPolicy( QtGui.QComboBox.AdjustToMinimumContentsLength) - self.AdvancedSecondBibleComboBox.setObjectName( - u'AdvancedSecondBibleComboBox') + self.AdvancedDualBibleComboBox.setObjectName( + u'AdvancedDualBibleComboBox') self.AdvancedLayout.addWidget( - self.AdvancedSecondBibleComboBox, 1, 1, 1, 2) + self.AdvancedDualBibleComboBox, 1, 1, 1, 2) self.AdvancedBookLabel = QtGui.QLabel(self.AdvancedTab) self.AdvancedBookLabel.setObjectName(u'AdvancedBookLabel') self.AdvancedLayout.addWidget(self.AdvancedBookLabel, 2, 0, 1, 1) @@ -227,7 +227,7 @@ class BibleMediaItem(MediaManagerItem): self.AdvancedLayout.addWidget(self.AdvancedMessage, 8, 0, 1, 3) self.SearchTabWidget.addTab(self.AdvancedTab, translate('BiblesPlugin.MediaItem', 'Advanced')) - # Add the search tab widget to the page layout + # Add the search tab widget to the page layout. self.pageLayout.addWidget(self.SearchTabWidget) # Combo Boxes QtCore.QObject.connect(self.AdvancedVersionComboBox, @@ -273,21 +273,21 @@ class BibleMediaItem(MediaManagerItem): log.debug(u'configUpdated') if QtCore.QSettings().value(self.settingsSection + u'/dual bibles', QtCore.QVariant(True)).toBool(): - self.AdvancedSecondBibleLabel.setVisible(True) - self.AdvancedSecondBibleComboBox.setVisible(True) - self.QuickSecondVersionLabel.setVisible(True) - self.QuickSecondBibleComboBox.setVisible(True) + self.AdvancedDualBibleLabel.setVisible(True) + self.AdvancedDualBibleComboBox.setVisible(True) + self.QuickDualVersionLabel.setVisible(True) + self.QuickDualBibleComboBox.setVisible(True) else: - self.AdvancedSecondBibleLabel.setVisible(False) - self.AdvancedSecondBibleComboBox.setVisible(False) - self.QuickSecondVersionLabel.setVisible(False) - self.QuickSecondBibleComboBox.setVisible(False) + self.AdvancedDualBibleLabel.setVisible(False) + self.AdvancedDualBibleComboBox.setVisible(False) + self.QuickDualVersionLabel.setVisible(False) + self.QuickDualBibleComboBox.setVisible(False) def retranslateUi(self): log.debug(u'retranslateUi') self.QuickVersionLabel.setText( translate('BiblesPlugin.MediaItem', 'Version:')) - self.QuickSecondVersionLabel.setText( + self.QuickDualVersionLabel.setText( translate('BiblesPlugin.MediaItem', 'Dual:')) self.QuickSearchLabel.setText( translate('BiblesPlugin.MediaItem', 'Search type:')) @@ -299,7 +299,7 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'Results:')) self.AdvancedVersionLabel.setText( translate('BiblesPlugin.MediaItem', 'Version:')) - self.AdvancedSecondBibleLabel.setText( + self.AdvancedDualBibleLabel.setText( translate('BiblesPlugin.MediaItem', 'Dual:')) self.AdvancedBookLabel.setText( translate('BiblesPlugin.MediaItem', 'Book:')) @@ -339,7 +339,7 @@ class BibleMediaItem(MediaManagerItem): self.QuickMessage.setText(text) self.AdvancedMessage.setText(text) Receiver.send_message(u'openlp_process_events') - # minor delay to get the events processed + # Minor delay to get the events processed. time.sleep(0.1) def onListViewResize(self, width, height): @@ -364,26 +364,29 @@ class BibleMediaItem(MediaManagerItem): if not hasattr(self, u'import_wizard'): self.import_wizard = BibleImportForm(self, self.parent.manager, self.parent) - self.import_wizard.exec_() - self.reloadBibles() + # Do not reload if the import was canceled. + if self.import_wizard.exec_() == 1: + self.reloadBibles() def loadBibles(self): log.debug(u'Loading Bibles') self.QuickVersionComboBox.clear() - self.QuickSecondBibleComboBox.clear() + self.QuickDualBibleComboBox.clear() self.AdvancedVersionComboBox.clear() - self.AdvancedSecondBibleComboBox.clear() - self.QuickSecondBibleComboBox.addItem(u'') - self.AdvancedSecondBibleComboBox.addItem(u'') + self.AdvancedDualBibleComboBox.clear() + self.QuickDualBibleComboBox.addItem(u'') + self.AdvancedDualBibleComboBox.addItem(u'') + # Get all bibles and sort the list. bibles = self.parent.manager.get_bibles().keys() - # load bibles into the combo boxes + bibles.sort() + # Load the bibles into the combo boxes. first = True for bible in bibles: if bible: self.QuickVersionComboBox.addItem(bible) - self.QuickSecondBibleComboBox.addItem(bible) + self.QuickDualBibleComboBox.addItem(bible) self.AdvancedVersionComboBox.addItem(bible) - self.AdvancedSecondBibleComboBox.addItem(bible) + self.AdvancedDualBibleComboBox.addItem(bible) if first: first = False self.initialiseBible(bible) @@ -483,6 +486,17 @@ class BibleMediaItem(MediaManagerItem): def adjustComboBox(self, range_from, range_to, combo, restore=False): """ + Adjusts the give como boxe to the given values. + + ``range_from`` + The first number of the range (int). + + ``range_to`` + The last number of the range (int). + + ``combo`` + The combo box itself (QComboBox). + ``restore`` If True, then the combo's currentText will be restored after adjusting (if possible). @@ -491,16 +505,19 @@ class BibleMediaItem(MediaManagerItem): if restore: old_text = unicode(combo.currentText()) combo.clear() - for i in range(int(range_from), int(range_to) + 1): + for i in range(range_from, range_to + 1): combo.addItem(unicode(i)) if restore and combo.findText(old_text) != -1: combo.setCurrentIndex(combo.findText(old_text)) def onAdvancedSearchButton(self): + """ + Does an advanced search and saves the search reasults + """ log.debug(u'Advanced Search Button pressed') self.AdvancedSearchButton.setEnabled(False) bible = unicode(self.AdvancedVersionComboBox.currentText()) - dual_bible = unicode(self.AdvancedSecondBibleComboBox.currentText()) + dual_bible = unicode(self.AdvancedDualBibleComboBox.currentText()) book = unicode(self.AdvancedBookComboBox.currentText()) chapter_from = int(self.AdvancedFromChapter.currentText()) chapter_to = int(self.AdvancedToChapter.currentText()) @@ -537,7 +554,7 @@ class BibleMediaItem(MediaManagerItem): log.debug(u'Quick Search Button pressed') self.QuickSearchButton.setEnabled(False) bible = unicode(self.QuickVersionComboBox.currentText()) - dual_bible = unicode(self.QuickSecondBibleComboBox.currentText()) + dual_bible = unicode(self.QuickDualBibleComboBox.currentText()) text = unicode(self.QuickSearchEdit.text()) if self.QuickSearchComboBox.currentIndex() == 0: # We are doing a 'Verse Search'. @@ -548,7 +565,8 @@ class BibleMediaItem(MediaManagerItem): else: # We are doing a 'Text Search'. bibles = self.parent.manager.get_bibles() - self.search_results = self.parent.manager.verse_search(bible, text) + self.search_results = self.parent.manager.verse_search(bible, + dual_bible, text) if dual_bible and self.search_results: text = [] for verse in self.search_results: @@ -632,7 +650,7 @@ class BibleMediaItem(MediaManagerItem): 'dual_permissions': QtCore.QVariant(u''), 'dual_text': QtCore.QVariant(u'') } - bible_text = u' %s %d:%d (%s)' % (verse.book.name, + bible_text = u'%s %d:%d (%s)' % (verse.book.name, verse.chapter, verse.verse, version.value) bible_verse = QtGui.QListWidgetItem(bible_text) bible_verse.setData(QtCore.Qt.UserRole, QtCore.QVariant(vdict)) @@ -662,7 +680,7 @@ class BibleMediaItem(MediaManagerItem): if len(items) == 0: return False bible_text = u'' - old_chapter = u'' + old_chapter = -1 raw_footer = [] raw_slides = [] raw_title = [] @@ -750,6 +768,12 @@ class BibleMediaItem(MediaManagerItem): This methode is called, when we have to change the title, because we are at the end of a verse range. E. g. if we want to add Genesis 1:1-6 as well as Daniel 2:14. + + ``start_item`` + The first item of a range. + + ``old_item`` + The last item of a range. """ old_bitem = self.listView.item(old_item.row()) old_chapter = int(self._decodeQtObject(old_bitem, 'chapter')) @@ -786,9 +810,16 @@ class BibleMediaItem(MediaManagerItem): def checkTitle(self, item, old_item): """ This methode checks if we are at the end of an verse range. If that is - the case, we return True, else False. E. g. if we added Genesis 1:1-6, - but the next verse is Daniel 2:14. + the case, we return True, otherwise False. E. g. if we added Genesis 1:1-6, + but the next verse is Daniel 2:14, we return True. + + ``item`` + The item we are dealing with at the moment. + + ``old_item`` + The item we were previously dealing with. """ + # Get all the necessary meta data. bitem = self.listView.item(item.row()) book = self._decodeQtObject(bitem, 'book') chapter = int(self._decodeQtObject(bitem, 'chapter')) @@ -803,17 +834,38 @@ class BibleMediaItem(MediaManagerItem): old_dual_bible = self._decodeQtObject(old_bitem, 'dual_bible') if old_bible != bible or old_dual_bible != dual_bible or \ old_book != book: + # The bible, dual bible or book has changed. return True elif old_verse + 1 != verse and old_chapter == chapter: + # We are still in the same chapter, but a verse has been skipped. return True elif old_chapter + 1 == chapter and (verse != 1 or old_verse != self.parent.manager.get_verse_count( old_bible, old_book, old_chapter)): + # We are in the following chapter, but the last verse was not the + # last verse of the previous chapter or the current verse is not the + # first one of a chapter. return True else: return False def formatVerse(self, old_chapter, chapter, verse): + """ + Formats and returns the text, each verse starts with, for the given + chapter and verse. The text is either surrounded by round, square, + curly brackets or no brackets at all. For example:: + + u'{su}1:1{/su}' + + ``old_chapter`` + The previous verse's chapter number (int). + + ``chapter`` + The chapter number (int). + + ``verse`` + The verse number (int). + """ if not self.parent.settings_tab.show_new_chapters or \ old_chapter != chapter: verse_text = u'%s:%s' % (chapter, verse) From b34bb86b7c23b79442075af20fdd760650920fe7 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 12 Nov 2010 18:54:34 +0100 Subject: [PATCH 05/40] spelling --- openlp/plugins/bibles/lib/mediaitem.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 6f82f6f08..535ba30cf 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -364,7 +364,7 @@ class BibleMediaItem(MediaManagerItem): if not hasattr(self, u'import_wizard'): self.import_wizard = BibleImportForm(self, self.parent.manager, self.parent) - # Do not reload if the import was canceled. + # If the import was not canceled then reload. if self.import_wizard.exec_() == 1: self.reloadBibles() @@ -486,7 +486,7 @@ class BibleMediaItem(MediaManagerItem): def adjustComboBox(self, range_from, range_to, combo, restore=False): """ - Adjusts the give como boxe to the given values. + Adjusts the given como box to the given values. ``range_from`` The first number of the range (int). @@ -512,7 +512,7 @@ class BibleMediaItem(MediaManagerItem): def onAdvancedSearchButton(self): """ - Does an advanced search and saves the search reasults + Does an advanced search and saves the search results. """ log.debug(u'Advanced Search Button pressed') self.AdvancedSearchButton.setEnabled(False) @@ -843,8 +843,8 @@ class BibleMediaItem(MediaManagerItem): old_verse != self.parent.manager.get_verse_count( old_bible, old_book, old_chapter)): # We are in the following chapter, but the last verse was not the - # last verse of the previous chapter or the current verse is not the - # first one of a chapter. + # last verse of the chapter or the current verse is not the + # first one of the chapter. return True else: return False From 46321741adba557e71b3cfb251514beb27bcda84 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 12 Nov 2010 22:34:06 +0100 Subject: [PATCH 06/40] make sure, that the bible list in the importer is sorted --- .../plugins/bibles/forms/bibleimportform.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 9053c123e..75fc9e82e 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -207,9 +207,11 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): The index of the combo box. """ self.BibleComboBox.clear() - for bible in self.web_bible_list[index].keys(): - self.BibleComboBox.addItem(unicode( - translate('BiblesPlugin.ImportWizardForm', bible))) + bibles = [unicode(translate('BiblesPlugin.ImportWizardForm', bible)) for + bible in self.web_bible_list[index].keys()] + bibles.sort() + for bible in bibles: + self.BibleComboBox.addItem(bible) def onOsisFileButtonClicked(self): """ @@ -386,7 +388,8 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): self.ImportProgressBar.setValue(0) if bible_type == BibleFormat.WebDownload: self.ImportProgressLabel.setText(translate( - 'BiblesPlugin.ImportWizardForm', 'Starting Registering bible...')) + 'BiblesPlugin.ImportWizardForm', + 'Starting Registering bible...')) else: self.ImportProgressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Starting import...')) @@ -400,26 +403,26 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): unicode(self.field(u'license_permissions').toString()) importer = None if bible_type == BibleFormat.OSIS: - # Import an OSIS bible + # Import an OSIS bible. importer = self.manager.import_bible(BibleFormat.OSIS, name=license_version, filename=unicode(self.field(u'osis_location').toString()) ) elif bible_type == BibleFormat.CSV: - # Import a CSV bible + # Import a CSV bible. importer = self.manager.import_bible(BibleFormat.CSV, name=license_version, booksfile=unicode(self.field(u'csv_booksfile').toString()), versefile=unicode(self.field(u'csv_versefile').toString()) ) elif bible_type == BibleFormat.OpenSong: - # Import an OpenSong bible + # Import an OpenSong bible. importer = self.manager.import_bible(BibleFormat.OpenSong, name=license_version, filename=unicode(self.field(u'opensong_file').toString()) ) elif bible_type == BibleFormat.WebDownload: - # Import a bible from the web + # Import a bible from the web. self.ImportProgressBar.setMaximum(1) download_location = self.field(u'web_location').toInt()[0] bible_version = unicode(self.BibleComboBox.currentText()) From a0bbe7671710ebbc0fcbe768499c11524622e754 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 12 Nov 2010 22:51:18 +0100 Subject: [PATCH 07/40] comments/missing lines --- openlp/plugins/bibles/lib/db.py | 4 ++++ openlp/plugins/bibles/lib/mediaitem.py | 4 ++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 8f5c7dc79..b8ddc4bb0 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -44,24 +44,28 @@ class BibleMeta(BaseModel): """ pass + class Testament(BaseModel): """ Bible Testaments """ pass + class Book(BaseModel): """ Song model """ pass + class Verse(BaseModel): """ Topic model """ pass + def init_schema(url): """ Setup a bible database connection and initialise the database schema. diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 535ba30cf..fe6c786d7 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -84,7 +84,7 @@ class BibleMediaItem(MediaManagerItem): self.SearchTabWidget.sizePolicy().hasHeightForWidth()) self.SearchTabWidget.setSizePolicy(sizePolicy) self.SearchTabWidget.setObjectName(u'SearchTabWidget') - # Add the Quick Search tab + # Add the Quick Search tab. self.QuickTab = QtGui.QWidget() self.QuickTab.setObjectName(u'QuickTab') self.QuickLayout = QtGui.QGridLayout(self.QuickTab) @@ -145,7 +145,7 @@ class BibleMediaItem(MediaManagerItem): QuickSpacerItem = QtGui.QSpacerItem(20, 35, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.QuickLayout.addItem(QuickSpacerItem, 6, 2, 1, 1) - # Add the Advanced Search tab + # Add the Advanced Search tab. self.AdvancedTab = QtGui.QWidget() self.AdvancedTab.setObjectName(u'AdvancedTab') self.AdvancedLayout = QtGui.QGridLayout(self.AdvancedTab) From 093dc1afcaf7a125181426592ae0557cecc441e9 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 12 Nov 2010 23:02:25 +0100 Subject: [PATCH 08/40] make sure that the theme list (in the settings are sorted), docs/comments --- openlp/core/ui/themestab.py | 10 ++++++++-- openlp/plugins/bibles/lib/biblestab.py | 14 ++++++++++---- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 853865bb5..5ee36e174 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -183,13 +183,19 @@ class ThemesTab(SettingsTab): def updateThemeList(self, theme_list): """ - Called from ThemeManager when the Themes have changed + Called from ThemeManager when the Themes have changed. + + ``theme_list`` + The list of available themes:: + + [u'Song Theme', u'Bible Theme'] """ - #reload as may have been triggered by the ThemeManager + # Reload as may have been triggered by the ThemeManager. self.global_theme = unicode(QtCore.QSettings().value( self.settingsSection + u'/global theme', QtCore.QVariant(u'')).toString()) self.DefaultComboBox.clear() + theme_list.sort() for theme in theme_list: self.DefaultComboBox.addItem(theme) id = self.DefaultComboBox.findText( diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index b7d1b9bde..5546a2ccc 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -190,13 +190,13 @@ class BiblesTab(SettingsTab): def onNewChaptersCheckBoxChanged(self, check_state): self.show_new_chapters = False - # we have a set value convert to True/False + # We have a set value convert to True/False. if check_state == QtCore.Qt.Checked: self.show_new_chapters = True def onBibleDualCheckBox(self, check_state): self.dual_bibles = False - # we have a set value convert to True/False + # We have a set value convert to True/False. if check_state == QtCore.Qt.Checked: self.dual_bibles = True @@ -234,16 +234,22 @@ class BiblesTab(SettingsTab): def updateThemeList(self, theme_list): """ - Called from ThemeManager when the Themes have changed + Called from ThemeManager when the Themes have changed. + + ``theme_list`` + The list of available themes:: + + [u'Song Theme', u'Bible Theme'] """ self.BibleThemeComboBox.clear() self.BibleThemeComboBox.addItem(u'') + theme_list.sort() for theme in theme_list: self.BibleThemeComboBox.addItem(theme) index = self.BibleThemeComboBox.findText( unicode(self.bible_theme), QtCore.Qt.MatchExactly) if index == -1: - # Not Found + # Not Found. index = 0 self.bible_theme = u'' self.BibleThemeComboBox.setCurrentIndex(index) From 38397f07a2af3de26889960eeb8b6692b3d2e4f3 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 12 Nov 2010 23:27:57 +0100 Subject: [PATCH 09/40] changed texts again --- openlp/plugins/bibles/forms/bibleimportform.py | 9 +++++---- openlp/plugins/bibles/lib/manager.py | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 75fc9e82e..749f1f938 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -133,7 +133,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): self.OSISLocationEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == BibleFormat.CSV: - if self.field(u'csv_booksfile').toString() == u'': + if not self.field(u'csv_booksfile').toString(): QtGui.QMessageBox.critical(self, translate('BiblesPlugin.ImportWizardForm', 'Invalid Books File'), @@ -142,7 +142,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): 'the Bible to use in the import.')) self.BooksLocationEdit.setFocus() return False - elif self.field(u'csv_versefile').toString() == u'': + elif not self.field(u'csv_versefile').toString(): QtGui.QMessageBox.critical(self, translate('BiblesPlugin.ImportWizardForm', 'Invalid Verse File'), @@ -153,7 +153,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): return False elif self.field(u'source_format').toInt()[0] == \ BibleFormat.OpenSong: - if self.field(u'opensong_file').toString() == u'': + if not self.field(u'opensong_file').toString(): QtGui.QMessageBox.critical(self, translate('BiblesPlugin.ImportWizardForm', 'Invalid OpenSong Bible'), @@ -449,7 +449,8 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): if bible_type == BibleFormat.WebDownload: self.ImportProgressLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Registered ' - 'bible. Verses will be downloaded as required.')) + 'bible. Please note, that verses will be downloaded on\n' + 'demand and thus an internet connection is required.')) else: self.ImportProgressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Finished import.')) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 13f96cca9..2f468d01c 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -282,8 +282,8 @@ class BibleManager(object): QtGui.QMessageBox.information(self.parent.mediaItem, translate('BiblesPlugin.BibleManager', 'Web Bible cannot be used'), - translate('BiblesPlugin.BibleManager', 'You cannot use text ' - 'search with web bible.')) + translate('BiblesPlugin.BibleManager', 'Text Search is not ' + 'available with Web Bibles.')) return None if text: return self.db_cache[bible].verse_search(text) From 272eea72b7f06e20622f06882708b4faa9937681 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 13 Nov 2010 08:17:39 +0100 Subject: [PATCH 10/40] removed theme sorting --- openlp/core/ui/themestab.py | 1 - openlp/plugins/bibles/lib/biblestab.py | 1 - 2 files changed, 2 deletions(-) diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 5ee36e174..5a2bd2b15 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -195,7 +195,6 @@ class ThemesTab(SettingsTab): self.settingsSection + u'/global theme', QtCore.QVariant(u'')).toString()) self.DefaultComboBox.clear() - theme_list.sort() for theme in theme_list: self.DefaultComboBox.addItem(theme) id = self.DefaultComboBox.findText( diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index 5546a2ccc..225fc9c47 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -243,7 +243,6 @@ class BiblesTab(SettingsTab): """ self.BibleThemeComboBox.clear() self.BibleThemeComboBox.addItem(u'') - theme_list.sort() for theme in theme_list: self.BibleThemeComboBox.addItem(theme) index = self.BibleThemeComboBox.findText( From a357bdf6a0318a4f595fcbdaffbb9462b90fb7b1 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 13 Nov 2010 21:13:24 +0100 Subject: [PATCH 11/40] improved performance --- openlp/core/ui/themestab.py | 2 +- openlp/plugins/bibles/lib/biblestab.py | 2 +- openlp/plugins/bibles/lib/db.py | 2 +- openlp/plugins/bibles/lib/mediaitem.py | 7 ++----- 4 files changed, 5 insertions(+), 8 deletions(-) diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 5a2bd2b15..fe1f95aee 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -188,7 +188,7 @@ class ThemesTab(SettingsTab): ``theme_list`` The list of available themes:: - [u'Song Theme', u'Bible Theme'] + [u'Bible Theme', u'Song Theme'] """ # Reload as may have been triggered by the ThemeManager. self.global_theme = unicode(QtCore.QSettings().value( diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index 225fc9c47..10c7fbe3b 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -239,7 +239,7 @@ class BiblesTab(SettingsTab): ``theme_list`` The list of available themes:: - [u'Song Theme', u'Bible Theme'] + [u'Bible Theme', u'Song Theme'] """ self.BibleThemeComboBox.clear() self.BibleThemeComboBox.addItem(u'') diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index b8ddc4bb0..9852ed16b 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -244,7 +244,7 @@ class BibleDB(QtCore.QObject, Manager): and the value is the verse text. """ log.debug(u'create_chapter %s,%s', book_id, chapter) - # text list has book and chapter as first two elements of the array + # Text list has book and chapter as first two elements of the array. for verse_number, verse_text in textlist.iteritems(): verse = Verse.populate( book_id = book_id, diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index fe6c786d7..596059255 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -532,6 +532,7 @@ class BibleMediaItem(MediaManagerItem): if self.ClearAdvancedSearchComboBox.currentIndex() == 0: self.listView.clear() if self.listView.count() != 0: + # Check if the first item is a dual bible item or not. bitem = self.listView.item(0) item_dual_bible = self._decodeQtObject(bitem, 'dual_bible') if item_dual_bible and dual_bible or not item_dual_bible and \ @@ -611,8 +612,6 @@ class BibleMediaItem(MediaManagerItem): u'Permissions') if not dual_permissions: dual_permissions = u'' - # We count the number of rows which are maybe already present. - start_count = self.listView.count() for count, verse in enumerate(self.search_results): if dual_bible: vdict = { @@ -655,9 +654,7 @@ class BibleMediaItem(MediaManagerItem): bible_verse = QtGui.QListWidgetItem(bible_text) bible_verse.setData(QtCore.Qt.UserRole, QtCore.QVariant(vdict)) self.listView.addItem(bible_verse) - row = self.listView.setCurrentRow(count + start_count) - if row: - row.setSelected(True) + self.listView.selectAll() self.search_results = {} self.dual_search_results = {} From 80721aad3598545ab6ec9dc3cd48159a08e468cc Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 15 Nov 2010 18:47:33 +0100 Subject: [PATCH 12/40] replaced 'dual' --- openlp/plugins/bibles/lib/biblestab.py | 28 ++-- openlp/plugins/bibles/lib/manager.py | 16 +- openlp/plugins/bibles/lib/mediaitem.py | 202 ++++++++++++------------- 3 files changed, 123 insertions(+), 123 deletions(-) diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index 10c7fbe3b..a52c31fb7 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -110,9 +110,9 @@ class BiblesTab(SettingsTab): self.BibleThemeComboBox.setObjectName(u'BibleThemeComboBox') self.BibleThemeComboBox.addItem(QtCore.QString()) self.BibleThemeLayout.addWidget(self.BibleThemeComboBox) - self.BibleDualCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox) - self.BibleDualCheckBox.setObjectName(u'BibleDualCheckBox') - self.VerseDisplayLayout.addWidget(self.BibleDualCheckBox, 3, 0, 1, 1) + self.BibleSecondCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox) + self.BibleSecondCheckBox.setObjectName(u'BibleSecondCheckBox') + self.VerseDisplayLayout.addWidget(self.BibleSecondCheckBox, 3, 0, 1, 1) self.VerseDisplayLayout.addWidget(self.BibleThemeWidget, 4, 0, 1, 1) self.ChangeNoteLabel = QtGui.QLabel(self.VerseDisplayGroupBox) self.ChangeNoteLabel.setObjectName(u'ChangeNoteLabel') @@ -143,8 +143,8 @@ class BiblesTab(SettingsTab): self.LayoutStyleComboBox, QtCore.SIGNAL(u'activated(int)'), self.onLayoutStyleComboBoxChanged) QtCore.QObject.connect( - self.BibleDualCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), - self.onBibleDualCheckBox) + self.BibleSecondCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), + self.onBibleSecondCheckBox) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList) @@ -176,8 +176,8 @@ class BiblesTab(SettingsTab): translate('BiblesPlugin.BiblesTab', '[ And ]')) self.ChangeNoteLabel.setText(translate('BiblesPlugin.BiblesTab', 'Note:\nChanges do not affect verses already in the service.')) - self.BibleDualCheckBox.setText( - translate('BiblesPlugin.BiblesTab', 'Display dual Bible verses')) + self.BibleSecondCheckBox.setText( + translate('BiblesPlugin.BiblesTab', 'Display second Bible verses')) def onBibleThemeComboBoxChanged(self): self.bible_theme = self.BibleThemeComboBox.currentText() @@ -194,11 +194,11 @@ class BiblesTab(SettingsTab): if check_state == QtCore.Qt.Checked: self.show_new_chapters = True - def onBibleDualCheckBox(self, check_state): - self.dual_bibles = False + def onBibleSecondCheckBox(self, check_state): + self.second_bibles = False # We have a set value convert to True/False. if check_state == QtCore.Qt.Checked: - self.dual_bibles = True + self.second_bibles = True def load(self): settings = QtCore.QSettings() @@ -211,12 +211,12 @@ class BiblesTab(SettingsTab): u'verse layout style', QtCore.QVariant(0)).toInt()[0] self.bible_theme = unicode( settings.value(u'bible theme', QtCore.QVariant(u'')).toString()) - self.dual_bibles = settings.value( - u'dual bibles', QtCore.QVariant(True)).toBool() + self.second_bibles = settings.value( + u'second bibles', QtCore.QVariant(True)).toBool() self.NewChaptersCheckBox.setChecked(self.show_new_chapters) self.DisplayStyleComboBox.setCurrentIndex(self.display_style) self.LayoutStyleComboBox.setCurrentIndex(self.layout_style) - self.BibleDualCheckBox.setChecked(self.dual_bibles) + self.BibleSecondCheckBox.setChecked(self.second_bibles) settings.endGroup() def save(self): @@ -228,7 +228,7 @@ class BiblesTab(SettingsTab): QtCore.QVariant(self.display_style)) settings.setValue(u'verse layout style', QtCore.QVariant(self.layout_style)) - settings.setValue(u'dual bibles', QtCore.QVariant(self.dual_bibles)) + settings.setValue(u'second bibles', QtCore.QVariant(self.second_bibles)) settings.setValue(u'bible theme', QtCore.QVariant(self.bible_theme)) settings.endGroup() diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 2f468d01c..6b4d7c800 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -257,28 +257,28 @@ class BibleManager(object): 'Book Chapter:Verse-Chapter:Verse')) return None - def verse_search(self, bible, dual_bible, text): + def verse_search(self, bible, second_bible, text): """ Does a verse search for the given bible and text. ``bible`` The bible to seach in (unicode). - ``dual_bible`` - The dual bible (unicode). We do not search in this bible. + ``second_bible`` + The second bible (unicode). We do not search in this bible. ``text`` The text to search for (unicode). """ log.debug(u'BibleManager.verse_search("%s", "%s")', bible, text) - # Check if the bible or dual_bible is a web bible. + # Check if the bible or second_bible is a web bible. webbible = self.db_cache[bible].get_object(BibleMeta, u'download source') - dual_webbible = u'' - if dual_bible: - dual_webbible = self.db_cache[dual_bible].get_object(BibleMeta, + second_webbible = u'' + if second_bible: + second_webbible = self.db_cache[second_bible].get_object(BibleMeta, u'download source') - if webbible or dual_webbible: + if webbible or second_webbible: QtGui.QMessageBox.information(self.parent.mediaItem, translate('BiblesPlugin.BibleManager', 'Web Bible cannot be used'), diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 596059255..4ef4c0eff 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -62,7 +62,7 @@ class BibleMediaItem(MediaManagerItem): MediaManagerItem.__init__(self, parent, icon, title) # Place to store the search results for both bibles. self.search_results = {} - self.dual_search_results = {} + self.second_search_results = {} QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'bibles_load_list'), self.reloadBibles) @@ -100,14 +100,14 @@ class BibleMediaItem(MediaManagerItem): QtGui.QComboBox.AdjustToMinimumContentsLength) self.QuickVersionComboBox.setObjectName(u'VersionComboBox') self.QuickLayout.addWidget(self.QuickVersionComboBox, 0, 1, 1, 2) - self.QuickDualVersionLabel = QtGui.QLabel(self.QuickTab) - self.QuickDualVersionLabel.setObjectName(u'QuickDualVersionLabel') - self.QuickLayout.addWidget(self.QuickDualVersionLabel, 1, 0, 1, 1) - self.QuickDualBibleComboBox = QtGui.QComboBox(self.QuickTab) - self.QuickDualBibleComboBox.setSizeAdjustPolicy( + self.QuickSecondVersionLabel = QtGui.QLabel(self.QuickTab) + self.QuickSecondVersionLabel.setObjectName(u'QuickSecondVersionLabel') + self.QuickLayout.addWidget(self.QuickSecondVersionLabel, 1, 0, 1, 1) + self.QuickSecondBibleComboBox = QtGui.QComboBox(self.QuickTab) + self.QuickSecondBibleComboBox.setSizeAdjustPolicy( QtGui.QComboBox.AdjustToMinimumContentsLength) - self.QuickDualBibleComboBox.setObjectName(u'DualBible') - self.QuickLayout.addWidget(self.QuickDualBibleComboBox, 1, 1, 1, 2) + self.QuickSecondBibleComboBox.setObjectName(u'SecondBible') + self.QuickLayout.addWidget(self.QuickSecondBibleComboBox, 1, 1, 1, 2) self.QuickSearchLabel = QtGui.QLabel(self.QuickTab) self.QuickSearchLabel.setObjectName(u'QuickSearchLabel') self.QuickLayout.addWidget(self.QuickSearchLabel, 2, 0, 1, 1) @@ -161,16 +161,16 @@ class BibleMediaItem(MediaManagerItem): QtGui.QComboBox.AdjustToMinimumContentsLength) self.AdvancedVersionComboBox.setObjectName(u'AdvancedVersionComboBox') self.AdvancedLayout.addWidget(self.AdvancedVersionComboBox, 0, 1, 1, 2) - self.AdvancedDualBibleLabel = QtGui.QLabel(self.AdvancedTab) - self.AdvancedDualBibleLabel.setObjectName(u'AdvancedDualBibleLabel') - self.AdvancedLayout.addWidget(self.AdvancedDualBibleLabel, 1, 0, 1, 1) - self.AdvancedDualBibleComboBox = QtGui.QComboBox(self.AdvancedTab) - self.AdvancedDualBibleComboBox.setSizeAdjustPolicy( + self.AdvancedSecondBibleLabel = QtGui.QLabel(self.AdvancedTab) + self.AdvancedSecondBibleLabel.setObjectName(u'AdvancedSecondBibleLabel') + self.AdvancedLayout.addWidget(self.AdvancedSecondBibleLabel, 1, 0, 1, 1) + self.AdvancedSecondBibleComboBox = QtGui.QComboBox(self.AdvancedTab) + self.AdvancedSecondBibleComboBox.setSizeAdjustPolicy( QtGui.QComboBox.AdjustToMinimumContentsLength) - self.AdvancedDualBibleComboBox.setObjectName( - u'AdvancedDualBibleComboBox') + self.AdvancedSecondBibleComboBox.setObjectName( + u'AdvancedSecondBibleComboBox') self.AdvancedLayout.addWidget( - self.AdvancedDualBibleComboBox, 1, 1, 1, 2) + self.AdvancedSecondBibleComboBox, 1, 1, 1, 2) self.AdvancedBookLabel = QtGui.QLabel(self.AdvancedTab) self.AdvancedBookLabel.setObjectName(u'AdvancedBookLabel') self.AdvancedLayout.addWidget(self.AdvancedBookLabel, 2, 0, 1, 1) @@ -271,24 +271,24 @@ class BibleMediaItem(MediaManagerItem): def configUpdated(self): log.debug(u'configUpdated') - if QtCore.QSettings().value(self.settingsSection + u'/dual bibles', + if QtCore.QSettings().value(self.settingsSection + u'/second bibles', QtCore.QVariant(True)).toBool(): - self.AdvancedDualBibleLabel.setVisible(True) - self.AdvancedDualBibleComboBox.setVisible(True) - self.QuickDualVersionLabel.setVisible(True) - self.QuickDualBibleComboBox.setVisible(True) + self.AdvancedSecondBibleLabel.setVisible(True) + self.AdvancedSecondBibleComboBox.setVisible(True) + self.QuickSecondVersionLabel.setVisible(True) + self.QuickSecondBibleComboBox.setVisible(True) else: - self.AdvancedDualBibleLabel.setVisible(False) - self.AdvancedDualBibleComboBox.setVisible(False) - self.QuickDualVersionLabel.setVisible(False) - self.QuickDualBibleComboBox.setVisible(False) + self.AdvancedSecondBibleLabel.setVisible(False) + self.AdvancedSecondBibleComboBox.setVisible(False) + self.QuickSecondVersionLabel.setVisible(False) + self.QuickSecondBibleComboBox.setVisible(False) def retranslateUi(self): log.debug(u'retranslateUi') self.QuickVersionLabel.setText( translate('BiblesPlugin.MediaItem', 'Version:')) - self.QuickDualVersionLabel.setText( - translate('BiblesPlugin.MediaItem', 'Dual:')) + self.QuickSecondVersionLabel.setText( + translate('BiblesPlugin.MediaItem', 'Second:')) self.QuickSearchLabel.setText( translate('BiblesPlugin.MediaItem', 'Search type:')) self.QuickSearchLabel.setText( @@ -299,8 +299,8 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'Results:')) self.AdvancedVersionLabel.setText( translate('BiblesPlugin.MediaItem', 'Version:')) - self.AdvancedDualBibleLabel.setText( - translate('BiblesPlugin.MediaItem', 'Dual:')) + self.AdvancedSecondBibleLabel.setText( + translate('BiblesPlugin.MediaItem', 'Second:')) self.AdvancedBookLabel.setText( translate('BiblesPlugin.MediaItem', 'Book:')) self.AdvancedChapterLabel.setText( @@ -371,11 +371,11 @@ class BibleMediaItem(MediaManagerItem): def loadBibles(self): log.debug(u'Loading Bibles') self.QuickVersionComboBox.clear() - self.QuickDualBibleComboBox.clear() + self.QuickSecondBibleComboBox.clear() self.AdvancedVersionComboBox.clear() - self.AdvancedDualBibleComboBox.clear() - self.QuickDualBibleComboBox.addItem(u'') - self.AdvancedDualBibleComboBox.addItem(u'') + self.AdvancedSecondBibleComboBox.clear() + self.QuickSecondBibleComboBox.addItem(u'') + self.AdvancedSecondBibleComboBox.addItem(u'') # Get all bibles and sort the list. bibles = self.parent.manager.get_bibles().keys() bibles.sort() @@ -384,9 +384,9 @@ class BibleMediaItem(MediaManagerItem): for bible in bibles: if bible: self.QuickVersionComboBox.addItem(bible) - self.QuickDualBibleComboBox.addItem(bible) + self.QuickSecondBibleComboBox.addItem(bible) self.AdvancedVersionComboBox.addItem(bible) - self.AdvancedDualBibleComboBox.addItem(bible) + self.AdvancedSecondBibleComboBox.addItem(bible) if first: first = False self.initialiseBible(bible) @@ -517,7 +517,7 @@ class BibleMediaItem(MediaManagerItem): log.debug(u'Advanced Search Button pressed') self.AdvancedSearchButton.setEnabled(False) bible = unicode(self.AdvancedVersionComboBox.currentText()) - dual_bible = unicode(self.AdvancedDualBibleComboBox.currentText()) + second_bible = unicode(self.AdvancedSecondBibleComboBox.currentText()) book = unicode(self.AdvancedBookComboBox.currentText()) chapter_from = int(self.AdvancedFromChapter.currentText()) chapter_to = int(self.AdvancedToChapter.currentText()) @@ -526,76 +526,76 @@ class BibleMediaItem(MediaManagerItem): versetext = u'%s %s:%s-%s:%s' % (book, chapter_from, verse_from, chapter_to, verse_to) self.search_results = self.parent.manager.get_verses(bible, versetext) - if dual_bible: - self.dual_search_results = self.parent.manager.get_verses( - dual_bible, versetext) + if second_bible: + self.second_search_results = self.parent.manager.get_verses( + second_bible, versetext) if self.ClearAdvancedSearchComboBox.currentIndex() == 0: self.listView.clear() if self.listView.count() != 0: - # Check if the first item is a dual bible item or not. + # Check if the first item is a second bible item or not. bitem = self.listView.item(0) - item_dual_bible = self._decodeQtObject(bitem, 'dual_bible') - if item_dual_bible and dual_bible or not item_dual_bible and \ - not dual_bible: - self.displayResults(bible, dual_bible) + item_second_bible = self._decodeQtObject(bitem, 'second_bible') + if item_second_bible and second_bible or not item_second_bible and \ + not second_bible: + self.displayResults(bible, second_bible) elif QtGui.QMessageBox.critical(self, translate('BiblePlugin.MediaItem', 'Error'), translate('BiblePlugin.MediaItem', 'You cannot combine single ' - 'and dual bible verses. Do you want to delete your search ' + 'and second bible verses. Do you want to delete your search ' 'results and start a new search?'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.Yes: self.listView.clear() - self.displayResults(bible, dual_bible) + self.displayResults(bible, second_bible) else: - self.displayResults(bible, dual_bible) + self.displayResults(bible, second_bible) self.AdvancedSearchButton.setEnabled(True) def onQuickSearchButton(self): log.debug(u'Quick Search Button pressed') self.QuickSearchButton.setEnabled(False) bible = unicode(self.QuickVersionComboBox.currentText()) - dual_bible = unicode(self.QuickDualBibleComboBox.currentText()) + second_bible = unicode(self.QuickSecondBibleComboBox.currentText()) text = unicode(self.QuickSearchEdit.text()) if self.QuickSearchComboBox.currentIndex() == 0: # We are doing a 'Verse Search'. self.search_results = self.parent.manager.get_verses(bible, text) - if dual_bible and self.search_results: - self.dual_search_results = self.parent.manager.get_verses( - dual_bible, text) + if second_bible and self.search_results: + self.second_search_results = self.parent.manager.get_verses( + second_bible, text) else: # We are doing a 'Text Search'. bibles = self.parent.manager.get_bibles() self.search_results = self.parent.manager.verse_search(bible, - dual_bible, text) - if dual_bible and self.search_results: + second_bible, text) + if second_bible and self.search_results: text = [] for verse in self.search_results: text.append((verse.book.name, verse.chapter, verse.verse, verse.verse)) - self.dual_search_results = bibles[dual_bible].get_verses(text) + self.second_search_results = bibles[second_bible].get_verses(text) if self.ClearQuickSearchComboBox.currentIndex() == 0: self.listView.clear() if self.listView.count() != 0 and self.search_results: bitem = self.listView.item(0) - item_dual_bible = self._decodeQtObject(bitem, 'dual_bible') - if item_dual_bible and dual_bible or not item_dual_bible and \ - not dual_bible: - self.displayResults(bible, dual_bible) + item_second_bible = self._decodeQtObject(bitem, 'second_bible') + if item_second_bible and second_bible or not item_second_bible and \ + not second_bible: + self.displayResults(bible, second_bible) elif QtGui.QMessageBox.critical(self, translate('BiblePlugin.MediaItem', 'Error'), translate('BiblePlugin.MediaItem', 'You cannot combine single ' - 'and dual bible verses. Do you want to delete your search ' + 'and second bible verses. Do you want to delete your search ' 'results and start a new search?'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.Yes: self.listView.clear() - self.displayResults(bible, dual_bible) + self.displayResults(bible, second_bible) elif self.search_results: - self.displayResults(bible, dual_bible) + self.displayResults(bible, second_bible) self.QuickSearchButton.setEnabled(True) - def displayResults(self, bible, dual_bible=u''): + def displayResults(self, bible, second_bible=u''): """ Displays the search results in the media manager. All data needed for further action is saved for/in each row. @@ -603,17 +603,17 @@ class BibleMediaItem(MediaManagerItem): version = self.parent.manager.get_meta_data(bible, u'Version') copyright = self.parent.manager.get_meta_data(bible, u'Copyright') permissions = self.parent.manager.get_meta_data(bible, u'Permissions') - if dual_bible: - dual_version = self.parent.manager.get_meta_data(dual_bible, + if second_bible: + second_version = self.parent.manager.get_meta_data(second_bible, u'Version') - dual_copyright = self.parent.manager.get_meta_data(dual_bible, + second_copyright = self.parent.manager.get_meta_data(second_bible, u'Copyright') - dual_permissions = self.parent.manager.get_meta_data(dual_bible, + second_permissions = self.parent.manager.get_meta_data(second_bible, u'Permissions') - if not dual_permissions: - dual_permissions = u'' + if not second_permissions: + second_permissions = u'' for count, verse in enumerate(self.search_results): - if dual_bible: + if second_bible: vdict = { 'book': QtCore.QVariant(verse.book.name), 'chapter': QtCore.QVariant(verse.chapter), @@ -623,16 +623,16 @@ class BibleMediaItem(MediaManagerItem): 'copyright': QtCore.QVariant(copyright.value), 'permissions': QtCore.QVariant(permissions.value), 'text': QtCore.QVariant(verse.text), - 'dual_bible': QtCore.QVariant(dual_bible), - 'dual_version': QtCore.QVariant(dual_version.value), - 'dual_copyright': QtCore.QVariant(dual_copyright.value), - 'dual_permissions': QtCore.QVariant(dual_permissions.value), - 'dual_text': QtCore.QVariant( - self.dual_search_results[count].text) + 'second_bible': QtCore.QVariant(second_bible), + 'second_version': QtCore.QVariant(second_version.value), + 'second_copyright': QtCore.QVariant(second_copyright.value), + 'second_permissions': QtCore.QVariant(second_permissions.value), + 'second_text': QtCore.QVariant( + self.second_search_results[count].text) } bible_text = u' %s %d:%d (%s, %s)' % (verse.book.name, verse.chapter, verse.verse, version.value, - dual_version.value) + second_version.value) else: vdict = { 'book': QtCore.QVariant(verse.book.name), @@ -643,11 +643,11 @@ class BibleMediaItem(MediaManagerItem): 'copyright': QtCore.QVariant(copyright.value), 'permissions': QtCore.QVariant(permissions.value), 'text': QtCore.QVariant(verse.text), - 'dual_bible': QtCore.QVariant(u''), - 'dual_version': QtCore.QVariant(u''), - 'dual_copyright': QtCore.QVariant(u''), - 'dual_permissions': QtCore.QVariant(u''), - 'dual_text': QtCore.QVariant(u'') + 'second_bible': QtCore.QVariant(u''), + 'second_version': QtCore.QVariant(u''), + 'second_copyright': QtCore.QVariant(u''), + 'second_permissions': QtCore.QVariant(u''), + 'second_text': QtCore.QVariant(u'') } bible_text = u'%s %d:%d (%s)' % (verse.book.name, verse.chapter, verse.verse, version.value) @@ -656,7 +656,7 @@ class BibleMediaItem(MediaManagerItem): self.listView.addItem(bible_verse) self.listView.selectAll() self.search_results = {} - self.dual_search_results = {} + self.second_search_results = {} def _decodeQtObject(self, bitem, key): reference = bitem.data(QtCore.Qt.UserRole) @@ -692,22 +692,22 @@ class BibleMediaItem(MediaManagerItem): copyright = self._decodeQtObject(bitem, 'copyright') permissions = self._decodeQtObject(bitem, 'permissions') text = self._decodeQtObject(bitem, 'text') - dual_bible = self._decodeQtObject(bitem, 'dual_bible') - dual_version = self._decodeQtObject(bitem, 'dual_version') - dual_copyright = self._decodeQtObject(bitem, 'dual_copyright') - dual_permissions = self._decodeQtObject(bitem, 'dual_permissions') - dual_text = self._decodeQtObject(bitem, 'dual_text') + second_bible = self._decodeQtObject(bitem, 'second_bible') + second_version = self._decodeQtObject(bitem, 'second_version') + second_copyright = self._decodeQtObject(bitem, 'second_copyright') + second_permissions = self._decodeQtObject(bitem, 'second_permissions') + second_text = self._decodeQtObject(bitem, 'second_text') verse_text = self.formatVerse(old_chapter, chapter, verse) footer = u'%s (%s %s %s)' % (book, version, copyright, permissions) if footer not in raw_footer: raw_footer.append(footer) - if dual_bible: - footer = u'%s (%s %s %s)' % (book, dual_version, dual_copyright, - dual_permissions) + if second_bible: + footer = u'%s (%s %s %s)' % (book, second_version, second_copyright, + second_permissions) if footer not in raw_footer: raw_footer.append(footer) bible_text = u'%s %s\n\n%s %s' % (verse_text, text, verse_text, - dual_text) + second_text) raw_slides.append(bible_text) bible_text = u'' # If we are 'Verse Per Slide' then create a new slide. @@ -735,7 +735,7 @@ class BibleMediaItem(MediaManagerItem): raw_slides.append(bible_text) bible_text = u'' # Service Item: Capabilities - if self.parent.settings_tab.layout_style == 2 and not dual_bible: + if self.parent.settings_tab.layout_style == 2 and not second_bible: # Split the line but do not replace line breaks in renderer. service_item.add_capability(ItemCapabilities.NoLineBreaks) service_item.add_capability(ItemCapabilities.AllowsPreview) @@ -780,18 +780,18 @@ class BibleMediaItem(MediaManagerItem): start_chapter = int(self._decodeQtObject(start_bitem, 'chapter')) start_verse = int(self._decodeQtObject(start_bitem, 'verse')) start_bible = self._decodeQtObject(start_bitem, 'bible') - start_dual_bible = self._decodeQtObject(start_bitem, 'dual_bible') - if start_dual_bible: + start_second_bible = self._decodeQtObject(start_bitem, 'second_bible') + if start_second_bible: if start_verse == old_verse and start_chapter == old_chapter: title = u'%s %s:%s (%s, %s)' % (start_book, start_chapter, - start_verse, start_bible, start_dual_bible) + start_verse, start_bible, start_second_bible) elif start_chapter == old_chapter: title = u'%s %s:%s-%s (%s, %s)' % (start_book, start_chapter, - start_verse, old_verse, start_bible, start_dual_bible) + start_verse, old_verse, start_bible, start_second_bible) else: title = u'%s %s:%s-%s:%s (%s, %s)' % (start_book, start_chapter, start_verse, old_chapter, old_verse, start_bible, - start_dual_bible) + start_second_bible) else: if start_verse == old_verse and start_chapter == old_chapter: title = u'%s %s:%s (%s)' % (start_book, start_chapter, @@ -822,16 +822,16 @@ class BibleMediaItem(MediaManagerItem): chapter = int(self._decodeQtObject(bitem, 'chapter')) verse = int(self._decodeQtObject(bitem, 'verse')) bible = self._decodeQtObject(bitem, 'bible') - dual_bible = self._decodeQtObject(bitem, 'dual_bible') + second_bible = self._decodeQtObject(bitem, 'second_bible') old_bitem = self.listView.item(old_item.row()) old_book = self._decodeQtObject(old_bitem, 'book') old_chapter = int(self._decodeQtObject(old_bitem, 'chapter')) old_verse = int(self._decodeQtObject(old_bitem, 'verse')) old_bible = self._decodeQtObject(old_bitem, 'bible') - old_dual_bible = self._decodeQtObject(old_bitem, 'dual_bible') - if old_bible != bible or old_dual_bible != dual_bible or \ + old_second_bible = self._decodeQtObject(old_bitem, 'second_bible') + if old_bible != bible or old_second_bible != second_bible or \ old_book != book: - # The bible, dual bible or book has changed. + # The bible, second bible or book has changed. return True elif old_verse + 1 != verse and old_chapter == chapter: # We are still in the same chapter, but a verse has been skipped. From 588cfa111f496b0802c37f1ac1d324f57dcc57c5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 16 Nov 2010 18:57:13 +0100 Subject: [PATCH 13/40] long lines --- openlp/plugins/bibles/lib/mediaitem.py | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 4ef4c0eff..342d79c9e 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -573,7 +573,8 @@ class BibleMediaItem(MediaManagerItem): for verse in self.search_results: text.append((verse.book.name, verse.chapter, verse.verse, verse.verse)) - self.second_search_results = bibles[second_bible].get_verses(text) + self.second_search_results = \ + bibles[second_bible].get_verses(text) if self.ClearQuickSearchComboBox.currentIndex() == 0: self.listView.clear() if self.listView.count() != 0 and self.search_results: @@ -626,7 +627,8 @@ class BibleMediaItem(MediaManagerItem): 'second_bible': QtCore.QVariant(second_bible), 'second_version': QtCore.QVariant(second_version.value), 'second_copyright': QtCore.QVariant(second_copyright.value), - 'second_permissions': QtCore.QVariant(second_permissions.value), + 'second_permissions': QtCore.QVariant( + second_permissions.value), 'second_text': QtCore.QVariant( self.second_search_results[count].text) } @@ -702,8 +704,8 @@ class BibleMediaItem(MediaManagerItem): if footer not in raw_footer: raw_footer.append(footer) if second_bible: - footer = u'%s (%s %s %s)' % (book, second_version, second_copyright, - second_permissions) + footer = u'%s (%s %s %s)' % (book, second_version, + second_copyright, second_permissions) if footer not in raw_footer: raw_footer.append(footer) bible_text = u'%s %s\n\n%s %s' % (verse_text, text, verse_text, @@ -807,8 +809,8 @@ class BibleMediaItem(MediaManagerItem): def checkTitle(self, item, old_item): """ This methode checks if we are at the end of an verse range. If that is - the case, we return True, otherwise False. E. g. if we added Genesis 1:1-6, - but the next verse is Daniel 2:14, we return True. + the case, we return True, otherwise False. E. g. if we added + Genesis 1:1-6, but the next verse is Daniel 2:14, we return True. ``item`` The item we are dealing with at the moment. From 435338caadea07affb8595d210b65e4eea886e40 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 16 Nov 2010 19:33:37 +0100 Subject: [PATCH 14/40] more generic parameters for __init__ --- openlp/plugins/bibles/lib/mediaitem.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 342d79c9e..9ce463231 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -54,12 +54,12 @@ class BibleMediaItem(MediaManagerItem): """ log.info(u'Bible Media Item loaded') - def __init__(self, parent, icon, title): + def __init__(self, parent, plugin, icon): self.PluginNameShort = u'Bible' self.pluginNameVisible = translate('BiblesPlugin.MediaItem', 'Bible') self.IconPath = u'songs/song' self.ListViewWithDnD_class = BibleListView - MediaManagerItem.__init__(self, parent, icon, title) + MediaManagerItem.__init__(self, parent, plugin, icon) # Place to store the search results for both bibles. self.search_results = {} self.second_search_results = {} @@ -552,6 +552,10 @@ class BibleMediaItem(MediaManagerItem): self.AdvancedSearchButton.setEnabled(True) def onQuickSearchButton(self): + """ + Does a quick search and saves the search results. Quick search can + either be "Verse Search" or "Text Search". + """ log.debug(u'Quick Search Button pressed') self.QuickSearchButton.setEnabled(False) bible = unicode(self.QuickVersionComboBox.currentText()) From f6c30b7106fda87984fe74b6e969f9da5cb40155 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 19 Nov 2010 22:34:15 +0100 Subject: [PATCH 15/40] removed == 1 --- openlp/plugins/bibles/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 9ce463231..a94ea581a 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -365,7 +365,7 @@ class BibleMediaItem(MediaManagerItem): self.import_wizard = BibleImportForm(self, self.parent.manager, self.parent) # If the import was not canceled then reload. - if self.import_wizard.exec_() == 1: + if self.import_wizard.exec_(): self.reloadBibles() def loadBibles(self): From 5867fddd5be807d5aa2b6fa66082104b3bf61499 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 20 Nov 2010 00:26:15 +0200 Subject: [PATCH 16/40] Added theme wizard picture. Fixed up theme wizard somewhat (still not done). --- openlp/core/ui/themeform.py | 93 ++-- openlp/core/ui/themewizard.py | 692 +++++++++++++++--------- resources/forms/themewizard.ui | 685 +++++++++++++---------- resources/images/openlp-2.qrc | 1 + resources/images/wizard_createtheme.bmp | Bin 0 -> 172254 bytes 5 files changed, 897 insertions(+), 574 deletions(-) create mode 100644 resources/images/wizard_createtheme.bmp diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index ff57ecd56..5605ec261 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -60,24 +60,27 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): QtCore.QObject.connect(self.gradientComboBox, QtCore.SIGNAL(u'currentIndexChanged(int)'), self.onGradientComboBox) - QtCore.QObject.connect(self.color1PushButton, + QtCore.QObject.connect(self.colorButton, QtCore.SIGNAL(u'pressed()'), - self.onColor1PushButtonClicked) - QtCore.QObject.connect(self.color2PushButton, + self.onColorButtonClicked) + QtCore.QObject.connect(self.gradientStartButton, QtCore.SIGNAL(u'pressed()'), - self.onColor2PushButtonClicked) + self.onGradientStartButtonClicked) + QtCore.QObject.connect(self.gradientEndButton, + QtCore.SIGNAL(u'pressed()'), + self.onGradientEndButtonClicked) QtCore.QObject.connect(self.imageBrowseButton, QtCore.SIGNAL(u'pressed()'), - self.onImageBrowseButtonClicked) + self.onImageBrowseButtonClicked) QtCore.QObject.connect(self.mainColorPushButton, QtCore.SIGNAL(u'pressed()'), - self.onMainColourPushButtonClicked) + self.onMainColourPushButtonClicked) QtCore.QObject.connect(self.outlineColorPushButton, QtCore.SIGNAL(u'pressed()'), - self.onOutlineColourPushButtonClicked) + self.onOutlineColourPushButtonClicked) QtCore.QObject.connect(self.shadowColorPushButton, QtCore.SIGNAL(u'pressed()'), - self.onShadowColourPushButtonClicked) + self.onShadowColourPushButtonClicked) QtCore.QObject.connect(self.outlineCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onOutlineCheckCheckBoxChanged) @@ -126,9 +129,11 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): self.backgroundPage.registerField( u'background_type', self.backgroundTypeComboBox) self.backgroundPage.registerField( - u'color_1', self.color1PushButton) + u'color', self.colorButton) self.backgroundPage.registerField( - u'color_2', self.color2PushButton) + u'grandient_start', self.gradientStartButton) + self.backgroundPage.registerField( + u'grandient_end', self.gradientEndButton) self.backgroundPage.registerField( u'background_image', self.imageLineEdit) self.backgroundPage.registerField( @@ -261,54 +266,19 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): """ if self.theme.background_type == \ BackgroundType.to_string(BackgroundType.Solid): - self.setField(u'background_type', QtCore.QVariant(0)) - self.color1PushButton.setVisible(True) - self.color1Label.setVisible(True) - self.color1PushButton.setStyleSheet(u'background-color: %s' % + self.colorButton.setStyleSheet(u'background-color: %s' % self.theme.background_color) - self.color1Label.setText( - translate('OpenLP.ThemeForm', 'Color:')) - self.color2PushButton.setVisible(False) - self.color2Label.setVisible(False) - self.gradientLabel.setVisible(False) - self.gradientComboBox.setVisible(False) - self.imageLabel.setVisible(False) - self.imageLineEdit.setVisible(False) - self.imageBrowseButton.setVisible(False) - self.imageLineEdit.setText(u'') + self.setField(u'background_type', QtCore.QVariant(0)) elif self.theme.background_type == \ BackgroundType.to_string(BackgroundType.Gradient): - self.setField(u'background_type', QtCore.QVariant(1)) - self.color1PushButton.setVisible(True) - self.color1Label.setVisible(True) - self.color1PushButton.setStyleSheet(u'background-color: %s' % + self.gradientStartButton.setStyleSheet(u'background-color: %s' % self.theme.background_start_color) - self.color1Label.setText( - translate('OpenLP.ThemeForm', 'First color:')) - self.color2PushButton.setVisible(True) - self.color2Label.setVisible(True) - self.color2PushButton.setStyleSheet(u'background-color: %s' % + self.gradientEndButton.setStyleSheet(u'background-color: %s' % self.theme.background_end_color) - self.color2Label.setText( - translate('OpenLP.ThemeForm', 'Second color:')) - self.gradientLabel.setVisible(True) - self.gradientComboBox.setVisible(True) - self.imageLabel.setVisible(False) - self.imageLineEdit.setVisible(False) - self.imageBrowseButton.setVisible(False) - self.imageLineEdit.setText(u'') + self.setField(u'background_type', QtCore.QVariant(1)) else: - self.setField(u'background_type', QtCore.QVariant(2)) - self.color1PushButton.setVisible(False) - self.color1Label.setVisible(False) - self.color2PushButton.setVisible(False) - self.color2Label.setVisible(False) - self.gradientLabel.setVisible(False) - self.gradientComboBox.setVisible(False) - self.imageLineEdit.setVisible(True) - self.imageLabel.setVisible(True) - self.imageBrowseButton.setVisible(True) self.imageLineEdit.setText(self.theme.background_filename) + self.setField(u'background_type', QtCore.QVariant(2)) if self.theme.background_direction == \ BackgroundGradientType.to_string(BackgroundGradientType.Horizontal): self.setField(u'gradient', QtCore.QVariant(0)) @@ -441,20 +411,23 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): BackgroundGradientType.to_string(index) self.setBackgroundTabValues() - def onColor1PushButtonClicked(self): + def onColorButtonClicked(self): """ Background / Gradient 1 Color button pushed. """ - if self.theme.background_type == \ - BackgroundType.to_string(BackgroundType.Solid): - self.theme.background_color = \ - self._colorButton(self.theme.background_color) - else: - self.theme.background_start_color = \ - self._colorButton(self.theme.background_start_color) + self.theme.background_color = \ + self._colorButton(self.theme.background_color) self.setBackgroundTabValues() - def onColor2PushButtonClicked(self): + def onGradientStartButtonClicked(self): + """ + Gradient 2 Color button pushed. + """ + self.theme.background_start_color = \ + self._colorButton(self.theme.background_start_color) + self.setBackgroundTabValues() + + def onGradientEndButtonClicked(self): """ Gradient 2 Color button pushed. """ diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index b3af9df98..6281e876e 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -30,135 +30,217 @@ from openlp.core.lib import translate, build_icon class Ui_ThemeWizard(object): def setupUi(self, ThemeWizard): - ThemeWizard.setObjectName(u'ThemeWizard') + ThemeWizard.setObjectName(u'OpenLP.ThemeWizard') ThemeWizard.resize(550, 386) ThemeWizard.setModal(True) ThemeWizard.setWizardStyle(QtGui.QWizard.ModernStyle) - ThemeWizard.setOptions(QtGui.QWizard.IndependentPages|QtGui.QWizard.NoBackButtonOnStartPage) + ThemeWizard.setOptions( + QtGui.QWizard.IndependentPages | + QtGui.QWizard.NoBackButtonOnStartPage | + QtGui.QWizard.NoBackButtonOnLastPage) self.welcomePage = QtGui.QWizardPage() self.welcomePage.setTitle(u'') self.welcomePage.setSubTitle(u'') self.welcomePage.setObjectName(u'welcomePage') + self.welcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap, + QtGui.QPixmap(u':/wizards/wizard_createtheme.bmp')) self.welcomeLayout = QtGui.QHBoxLayout(self.welcomePage) self.welcomeLayout.setSpacing(8) self.welcomeLayout.setMargin(0) self.welcomeLayout.setObjectName(u'welcomeLayout') - self.importBibleImage = QtGui.QLabel(self.welcomePage) - self.importBibleImage.setMinimumSize(QtCore.QSize(163, 0)) - self.importBibleImage.setMaximumSize(QtCore.QSize(163, 16777215)) - self.importBibleImage.setLineWidth(0) - self.importBibleImage.setText(u'') - self.importBibleImage.setPixmap(QtGui.QPixmap(u':/wizards/wizard_importbible.bmp')) - self.importBibleImage.setIndent(0) - self.importBibleImage.setObjectName(u'importBibleImage') - self.welcomeLayout.addWidget(self.importBibleImage) self.welcomePageLayout = QtGui.QVBoxLayout() self.welcomePageLayout.setSpacing(8) self.welcomePageLayout.setObjectName(u'welcomePageLayout') self.titleLabel = QtGui.QLabel(self.welcomePage) self.titleLabel.setObjectName(u'titleLabel') self.welcomePageLayout.addWidget(self.titleLabel) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) - self.welcomePageLayout.addItem(spacerItem) + self.welcomeTopSpacer = QtGui.QSpacerItem(20, 40, + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + self.welcomePageLayout.addItem(self.welcomeTopSpacer) self.informationLabel = QtGui.QLabel(self.welcomePage) self.informationLabel.setWordWrap(True) self.informationLabel.setMargin(10) self.informationLabel.setObjectName(u'informationLabel') self.welcomePageLayout.addWidget(self.informationLabel) - spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.welcomePageLayout.addItem(spacerItem1) + self.welcomeBottomSpacer = QtGui.QSpacerItem(20, 40, + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.welcomePageLayout.addItem(self.welcomeBottomSpacer) self.welcomeLayout.addLayout(self.welcomePageLayout) ThemeWizard.addPage(self.welcomePage) self.backgroundPage = QtGui.QWizardPage() self.backgroundPage.setObjectName(u'backgroundPage') - self.backgroundLayout = QtGui.QFormLayout(self.backgroundPage) - self.backgroundLayout.setFieldGrowthPolicy(QtGui.QFormLayout.ExpandingFieldsGrow) - self.backgroundLayout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) - self.backgroundLayout.setMargin(20) + self.backgroundLayout = QtGui.QVBoxLayout(self.backgroundPage) self.backgroundLayout.setSpacing(8) + self.backgroundLayout.setMargin(20) self.backgroundLayout.setObjectName(u'backgroundLayout') + self.backgroundTypeLayout = QtGui.QHBoxLayout() + self.backgroundTypeLayout.setSpacing(8) + self.backgroundTypeLayout.setObjectName(u'backgroundTypeLayout') self.backgroundTypeLabel = QtGui.QLabel(self.backgroundPage) self.backgroundTypeLabel.setObjectName(u'backgroundTypeLabel') - self.backgroundLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.backgroundTypeLabel) + self.backgroundTypeLayout.addWidget(self.backgroundTypeLabel) self.backgroundTypeComboBox = QtGui.QComboBox(self.backgroundPage) self.backgroundTypeComboBox.setObjectName(u'backgroundTypeComboBox') self.backgroundTypeComboBox.addItem(u'') self.backgroundTypeComboBox.addItem(u'') self.backgroundTypeComboBox.addItem(u'') - self.backgroundLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.backgroundTypeComboBox) - self.color1Label = QtGui.QLabel(self.backgroundPage) - self.color1Label.setObjectName(u'color1Label') - self.backgroundLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.color1Label) - self.color1PushButton = QtGui.QPushButton(self.backgroundPage) - self.color1PushButton.setText(u'') - self.color1PushButton.setObjectName(u'color1PushButton') - self.backgroundLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.color1PushButton) - self.color2Label = QtGui.QLabel(self.backgroundPage) - self.color2Label.setObjectName(u'color2Label') - self.backgroundLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.color2Label) - self.color2PushButton = QtGui.QPushButton(self.backgroundPage) - self.color2PushButton.setText(u'') - self.color2PushButton.setObjectName(u'color2PushButton') - self.backgroundLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.color2PushButton) - self.imageLabel = QtGui.QLabel(self.backgroundPage) - self.imageLabel.setObjectName(u'imageLabel') - self.backgroundLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.imageLabel) - self.imageLayout = QtGui.QHBoxLayout() - self.imageLayout.setSpacing(8) - self.imageLayout.setObjectName(u'imageLayout') - self.imageLineEdit = QtGui.QLineEdit(self.backgroundPage) - self.imageLineEdit.setObjectName(u'imageLineEdit') - self.imageLayout.addWidget(self.imageLineEdit) - self.imageBrowseButton = QtGui.QToolButton(self.backgroundPage) - self.imageBrowseButton.setText(u'') - self.imageBrowseButton.setIcon(build_icon(u':/general/general_open.png')) - self.imageBrowseButton.setObjectName(u'imageBrowseButton') - self.imageLayout.addWidget(self.imageBrowseButton) - self.backgroundLayout.setLayout(3, QtGui.QFormLayout.FieldRole, self.imageLayout) - self.gradientLabel = QtGui.QLabel(self.backgroundPage) - self.gradientLabel.setObjectName(u'gradientLabel') - self.backgroundLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.gradientLabel) - self.gradientComboBox = QtGui.QComboBox(self.backgroundPage) + self.backgroundTypeLayout.addWidget(self.backgroundTypeComboBox) + self.backgroundTypeSpacer = QtGui.QSpacerItem(40, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.backgroundTypeLayout.addItem(self.backgroundTypeSpacer) + self.backgroundLayout.addLayout(self.backgroundTypeLayout) + self.backgroundStackedWidget = QtGui.QStackedWidget( + self.backgroundPage) + self.backgroundStackedWidget.setObjectName(u'backgroundStackedWidget') + self.colorPage = QtGui.QWidget() + self.colorPage.setObjectName(u'colorPage') + self.colorLayout = QtGui.QFormLayout(self.colorPage) + self.colorLayout.setMargin(0) + self.colorLayout.setSpacing(8) + self.colorLayout.setObjectName(u'colorLayout') + self.colorLabel = QtGui.QLabel(self.colorPage) + self.colorLabel.setMinimumSize(QtCore.QSize(103, 0)) + self.colorLabel.setAlignment(QtCore.Qt.AlignRight | + QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) + self.colorLabel.setObjectName(u'colorLabel') + self.colorLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.colorLabel) + self.colorButton = QtGui.QPushButton(self.colorPage) + self.colorButton.setText(u'') + self.colorButton.setObjectName(u'colorButton') + self.colorLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.colorButton) + self.backgroundStackedWidget.addWidget(self.colorPage) + self.gradientPage = QtGui.QWidget() + self.gradientPage.setObjectName(u'gradientPage') + self.gradientLayout = QtGui.QFormLayout(self.gradientPage) + self.gradientLayout.setMargin(0) + self.gradientLayout.setSpacing(8) + self.gradientLayout.setObjectName(u'gradientLayout') + self.gradientStartLabel = QtGui.QLabel(self.gradientPage) + self.gradientStartLabel.setMinimumSize(QtCore.QSize(103, 0)) + self.gradientStartLabel.setAlignment(QtCore.Qt.AlignRight | + QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) + self.gradientStartLabel.setObjectName(u'gradientStartLabel') + self.gradientLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.gradientStartLabel) + self.gradientStartButton = QtGui.QPushButton(self.gradientPage) + self.gradientStartButton.setText(u'') + self.gradientStartButton.setObjectName(u'gradientStartButton') + self.gradientLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.gradientStartButton) + self.gradientEndLabel = QtGui.QLabel(self.gradientPage) + self.gradientEndLabel.setMinimumSize(QtCore.QSize(103, 0)) + self.gradientEndLabel.setAlignment(QtCore.Qt.AlignRight | + QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) + self.gradientEndLabel.setObjectName(u'gradientEndLabel') + self.gradientLayout.setWidget(1, + QtGui.QFormLayout.LabelRole, self.gradientEndLabel) + self.gradientEndButton = QtGui.QPushButton(self.gradientPage) + self.gradientEndButton.setText(u'') + self.gradientEndButton.setObjectName(u'gradientEndButton') + self.gradientLayout.setWidget(1, + QtGui.QFormLayout.FieldRole, self.gradientEndButton) + self.gradientTypeLabel = QtGui.QLabel(self.gradientPage) + self.gradientTypeLabel.setMinimumSize(QtCore.QSize(103, 0)) + self.gradientTypeLabel.setAlignment(QtCore.Qt.AlignRight | + QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) + self.gradientTypeLabel.setObjectName(u'gradientTypeLabel') + self.gradientLayout.setWidget(2, + QtGui.QFormLayout.LabelRole, self.gradientTypeLabel) + self.gradientComboBox = QtGui.QComboBox(self.gradientPage) self.gradientComboBox.setObjectName(u'gradientComboBox') self.gradientComboBox.addItem(u'') self.gradientComboBox.addItem(u'') self.gradientComboBox.addItem(u'') self.gradientComboBox.addItem(u'') self.gradientComboBox.addItem(u'') - self.backgroundLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.gradientComboBox) + self.gradientLayout.setWidget(2, + QtGui.QFormLayout.FieldRole, self.gradientComboBox) + self.backgroundStackedWidget.addWidget(self.gradientPage) + self.imagePage = QtGui.QWidget() + self.imagePage.setObjectName(u'imagePage') + self.imageLayout = QtGui.QFormLayout(self.imagePage) + self.imageLayout.setMargin(0) + self.imageLayout.setSpacing(8) + self.imageLayout.setObjectName(u'imageLayout') + self.imageLabel = QtGui.QLabel(self.imagePage) + self.imageLabel.setMinimumSize(QtCore.QSize(103, 0)) + self.imageLabel.setAlignment(QtCore.Qt.AlignRight | + QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) + self.imageLabel.setObjectName(u'imageLabel') + self.imageLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.imageLabel) + self.imageFileLayout = QtGui.QHBoxLayout() + self.imageFileLayout.setSpacing(8) + self.imageFileLayout.setObjectName(u'imageFileLayout') + self.imageLineEdit = QtGui.QLineEdit(self.imagePage) + self.imageLineEdit.setObjectName(u'imageLineEdit') + self.imageFileLayout.addWidget(self.imageLineEdit) + self.imageBrowseButton = QtGui.QToolButton(self.imagePage) + self.imageBrowseButton.setText(u'') + self.imageBrowseButton.setIcon( + build_icon(u':/general/general_open.png')) + self.imageBrowseButton.setObjectName(u'imageBrowseButton') + self.imageFileLayout.addWidget(self.imageBrowseButton) + self.imageLayout.setLayout(0, + QtGui.QFormLayout.FieldRole, self.imageFileLayout) + self.backgroundStackedWidget.addWidget(self.imagePage) + self.backgroundLayout.addWidget(self.backgroundStackedWidget) ThemeWizard.addPage(self.backgroundPage) self.mainAreaPage = QtGui.QWizardPage() self.mainAreaPage.setObjectName(u'mainAreaPage') - self.formLayout = QtGui.QFormLayout(self.mainAreaPage) - self.formLayout.setFormAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) - self.formLayout.setContentsMargins(-1, 20, 20, 20) - self.formLayout.setSpacing(8) - self.formLayout.setObjectName(u'formLayout') + self.mainAreaLayout = QtGui.QFormLayout(self.mainAreaPage) + self.mainAreaLayout.setFormAlignment(QtCore.Qt.AlignLeading | + QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) + self.mainAreaLayout.setMargin(20) + self.mainAreaLayout.setSpacing(8) + self.mainAreaLayout.setObjectName(u'mainAreaLayout') self.mainFontLabel = QtGui.QLabel(self.mainAreaPage) + self.mainFontLabel.setMinimumSize(QtCore.QSize(103, 0)) + self.mainFontLabel.setAlignment(QtCore.Qt.AlignRight | + QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.mainFontLabel.setObjectName(u'mainFontLabel') - self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.mainFontLabel) + self.mainAreaLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.mainFontLabel) self.mainFontComboBox = QtGui.QFontComboBox(self.mainAreaPage) self.mainFontComboBox.setObjectName(u'mainFontComboBox') - self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.mainFontComboBox) + self.mainAreaLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.mainFontComboBox) self.mainColorLabel = QtGui.QLabel(self.mainAreaPage) self.mainColorLabel.setObjectName(u'mainColorLabel') - self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.mainColorLabel) + self.mainAreaLayout.setWidget(1, + QtGui.QFormLayout.LabelRole, self.mainColorLabel) + self.fontPropertiesLayout = QtGui.QHBoxLayout() + self.fontPropertiesLayout.setSpacing(24) + self.fontPropertiesLayout.setObjectName(u'fontPropertiesLayout') self.mainColorPushButton = QtGui.QPushButton(self.mainAreaPage) self.mainColorPushButton.setText(u'') self.mainColorPushButton.setObjectName(u'mainColorPushButton') - self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.mainColorPushButton) + self.fontPropertiesLayout.addWidget(self.mainColorPushButton) + self.boldCheckBox = QtGui.QCheckBox(self.mainAreaPage) + self.boldCheckBox.setObjectName(u'boldCheckBox') + self.fontPropertiesLayout.addWidget(self.boldCheckBox) + self.italicsCheckBox = QtGui.QCheckBox(self.mainAreaPage) + self.italicsCheckBox.setObjectName(u'italicsCheckBox') + self.fontPropertiesLayout.addWidget(self.italicsCheckBox) + self.mainAreaLayout.setLayout(1, + QtGui.QFormLayout.FieldRole, self.fontPropertiesLayout) self.mainSizeLabel = QtGui.QLabel(self.mainAreaPage) self.mainSizeLabel.setObjectName(u'mainSizeLabel') - self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.mainSizeLabel) + self.mainAreaLayout.setWidget(2, + QtGui.QFormLayout.LabelRole, self.mainSizeLabel) self.mainSizeLayout = QtGui.QHBoxLayout() self.mainSizeLayout.setSpacing(8) self.mainSizeLayout.setMargin(0) self.mainSizeLayout.setObjectName(u'mainSizeLayout') self.mainSizeSpinBox = QtGui.QSpinBox(self.mainAreaPage) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainSizeSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainSizeSpinBox.sizePolicy().hasHeightForWidth()) self.mainSizeSpinBox.setSizePolicy(sizePolicy) self.mainSizeSpinBox.setMinimumSize(QtCore.QSize(70, 0)) self.mainSizeSpinBox.setMaximum(999) @@ -168,18 +250,22 @@ class Ui_ThemeWizard(object): self.mainLineCountLabel = QtGui.QLabel(self.mainAreaPage) self.mainLineCountLabel.setObjectName(u'mainLineCountLabel') self.mainSizeLayout.addWidget(self.mainLineCountLabel) - self.formLayout.setLayout(2, QtGui.QFormLayout.FieldRole, self.mainSizeLayout) + self.mainAreaLayout.setLayout(2, + QtGui.QFormLayout.FieldRole, self.mainSizeLayout) self.lineSpacingLabel = QtGui.QLabel(self.mainAreaPage) self.lineSpacingLabel.setObjectName(u'lineSpacingLabel') - self.formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.lineSpacingLabel) + self.mainAreaLayout.setWidget(3, + QtGui.QFormLayout.LabelRole, self.lineSpacingLabel) self.lineSpacingSpinBox = QtGui.QSpinBox(self.mainAreaPage) self.lineSpacingSpinBox.setMinimum(-50) self.lineSpacingSpinBox.setMaximum(50) self.lineSpacingSpinBox.setObjectName(u'lineSpacingSpinBox') - self.formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.lineSpacingSpinBox) + self.mainAreaLayout.setWidget(3, + QtGui.QFormLayout.FieldRole, self.lineSpacingSpinBox) self.outlineCheckBox = QtGui.QCheckBox(self.mainAreaPage) self.outlineCheckBox.setObjectName(u'outlineCheckBox') - self.formLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.outlineCheckBox) + self.mainAreaLayout.setWidget(4, + QtGui.QFormLayout.LabelRole, self.outlineCheckBox) self.outlineLayout = QtGui.QHBoxLayout() self.outlineLayout.setObjectName(u'outlineLayout') self.outlineColorPushButton = QtGui.QPushButton(self.mainAreaPage) @@ -193,10 +279,12 @@ class Ui_ThemeWizard(object): self.outlineSizeSpinBox = QtGui.QSpinBox(self.mainAreaPage) self.outlineSizeSpinBox.setObjectName(u'outlineSizeSpinBox') self.outlineLayout.addWidget(self.outlineSizeSpinBox) - self.formLayout.setLayout(4, QtGui.QFormLayout.FieldRole, self.outlineLayout) + self.mainAreaLayout.setLayout(4, + QtGui.QFormLayout.FieldRole, self.outlineLayout) self.shadowCheckBox = QtGui.QCheckBox(self.mainAreaPage) self.shadowCheckBox.setObjectName(u'shadowCheckBox') - self.formLayout.setWidget(5, QtGui.QFormLayout.LabelRole, self.shadowCheckBox) + self.mainAreaLayout.setWidget(5, + QtGui.QFormLayout.LabelRole, self.shadowCheckBox) self.shadowLayout = QtGui.QHBoxLayout() self.shadowLayout.setObjectName(u'shadowLayout') self.shadowColorPushButton = QtGui.QPushButton(self.mainAreaPage) @@ -210,83 +298,99 @@ class Ui_ThemeWizard(object): self.shadowSizeSpinBox = QtGui.QSpinBox(self.mainAreaPage) self.shadowSizeSpinBox.setObjectName(u'shadowSizeSpinBox') self.shadowLayout.addWidget(self.shadowSizeSpinBox) - self.formLayout.setLayout(5, QtGui.QFormLayout.FieldRole, self.shadowLayout) - self.boldCheckBox = QtGui.QCheckBox(self.mainAreaPage) - self.boldCheckBox.setObjectName(u'boldCheckBox') - self.formLayout.setWidget(6, QtGui.QFormLayout.FieldRole, self.boldCheckBox) - self.italicsCheckBox = QtGui.QCheckBox(self.mainAreaPage) - self.italicsCheckBox.setObjectName(u'italicsCheckBox') - self.formLayout.setWidget(7, QtGui.QFormLayout.FieldRole, self.italicsCheckBox) + self.mainAreaLayout.setLayout(5, + QtGui.QFormLayout.FieldRole, self.shadowLayout) ThemeWizard.addPage(self.mainAreaPage) self.footerAreaPage = QtGui.QWizardPage() self.footerAreaPage.setObjectName(u'footerAreaPage') self.footerLayout = QtGui.QFormLayout(self.footerAreaPage) - self.footerLayout.setFieldGrowthPolicy(QtGui.QFormLayout.ExpandingFieldsGrow) - self.footerLayout.setContentsMargins(50, 20, 20, 20) + self.footerLayout.setFieldGrowthPolicy( + QtGui.QFormLayout.ExpandingFieldsGrow) + self.footerLayout.setMargin(20) self.footerLayout.setSpacing(8) self.footerLayout.setObjectName(u'footerLayout') self.footerFontLabel = QtGui.QLabel(self.footerAreaPage) + self.footerFontLabel.setMinimumSize(QtCore.QSize(103, 0)) + self.footerFontLabel.setAlignment(QtCore.Qt.AlignRight | + QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.footerFontLabel.setObjectName(u'footerFontLabel') - self.footerLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.footerFontLabel) + self.footerLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.footerFontLabel) self.footerFontComboBox = QtGui.QFontComboBox(self.footerAreaPage) self.footerFontComboBox.setObjectName(u'footerFontComboBox') - self.footerLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.footerFontComboBox) + self.footerLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.footerFontComboBox) self.footerColorLabel = QtGui.QLabel(self.footerAreaPage) self.footerColorLabel.setObjectName(u'footerColorLabel') - self.footerLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.footerColorLabel) + self.footerLayout.setWidget(1, + QtGui.QFormLayout.LabelRole, self.footerColorLabel) self.footerColorPushButton = QtGui.QPushButton(self.footerAreaPage) self.footerColorPushButton.setText(u'') self.footerColorPushButton.setObjectName(u'footerColorPushButton') - self.footerLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.footerColorPushButton) + self.footerLayout.setWidget(1, + QtGui.QFormLayout.FieldRole, self.footerColorPushButton) self.footerSizeLabel = QtGui.QLabel(self.footerAreaPage) self.footerSizeLabel.setObjectName(u'footerSizeLabel') - self.footerLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.footerSizeLabel) + self.footerLayout.setWidget(2, + QtGui.QFormLayout.LabelRole, self.footerSizeLabel) self.footerSizeSpinBox = QtGui.QSpinBox(self.footerAreaPage) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.footerSizeSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.footerSizeSpinBox.sizePolicy().hasHeightForWidth()) self.footerSizeSpinBox.setSizePolicy(sizePolicy) self.footerSizeSpinBox.setMinimumSize(QtCore.QSize(70, 0)) self.footerSizeSpinBox.setMaximum(999) self.footerSizeSpinBox.setProperty(u'value', 10) self.footerSizeSpinBox.setObjectName(u'footerSizeSpinBox') - self.footerLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.footerSizeSpinBox) + self.footerLayout.setWidget(2, + QtGui.QFormLayout.FieldRole, self.footerSizeSpinBox) ThemeWizard.addPage(self.footerAreaPage) self.alignmentPage = QtGui.QWizardPage() self.alignmentPage.setObjectName(u'alignmentPage') - self.formLayout_2 = QtGui.QFormLayout(self.alignmentPage) - self.formLayout_2.setMargin(20) - self.formLayout_2.setObjectName(u'formLayout_2') + self.alignmentLayout = QtGui.QFormLayout(self.alignmentPage) + self.alignmentLayout.setMargin(20) + self.alignmentLayout.setSpacing(8) + self.alignmentLayout.setObjectName(u'alignmentLayout') self.horizontalLabel = QtGui.QLabel(self.alignmentPage) + self.horizontalLabel.setMinimumSize(QtCore.QSize(103, 0)) + self.horizontalLabel.setAlignment(QtCore.Qt.AlignRight | + QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.horizontalLabel.setObjectName(u'horizontalLabel') - self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, self.horizontalLabel) + self.alignmentLayout.setWidget(0, + QtGui.QFormLayout.LabelRole, self.horizontalLabel) self.horizontalComboBox = QtGui.QComboBox(self.alignmentPage) self.horizontalComboBox.setEditable(False) self.horizontalComboBox.setObjectName(u'horizontalComboBox') self.horizontalComboBox.addItem(u'') self.horizontalComboBox.addItem(u'') self.horizontalComboBox.addItem(u'') - self.formLayout_2.setWidget(0, QtGui.QFormLayout.FieldRole, self.horizontalComboBox) + self.alignmentLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.horizontalComboBox) self.verticalLabel = QtGui.QLabel(self.alignmentPage) self.verticalLabel.setObjectName(u'verticalLabel') - self.formLayout_2.setWidget(1, QtGui.QFormLayout.LabelRole, self.verticalLabel) + self.alignmentLayout.setWidget(1, + QtGui.QFormLayout.LabelRole, self.verticalLabel) self.verticalComboBox = QtGui.QComboBox(self.alignmentPage) self.verticalComboBox.setObjectName(u'verticalComboBox') self.verticalComboBox.addItem(u'') self.verticalComboBox.addItem(u'') self.verticalComboBox.addItem(u'') - self.formLayout_2.setWidget(1, QtGui.QFormLayout.FieldRole, self.verticalComboBox) + self.alignmentLayout.setWidget(1, + QtGui.QFormLayout.FieldRole, self.verticalComboBox) self.transitionsCheckBox = QtGui.QCheckBox(self.alignmentPage) self.transitionsCheckBox.setObjectName(u'transitionsCheckBox') - self.formLayout_2.setWidget(2, QtGui.QFormLayout.FieldRole, self.transitionsCheckBox) + self.alignmentLayout.setWidget(2, + QtGui.QFormLayout.FieldRole, self.transitionsCheckBox) ThemeWizard.addPage(self.alignmentPage) self.areaPositionPage = QtGui.QWizardPage() self.areaPositionPage.setObjectName(u'areaPositionPage') - self.gridLayout_2 = QtGui.QGridLayout(self.areaPositionPage) - self.gridLayout_2.setMargin(20) - self.gridLayout_2.setSpacing(8) - self.gridLayout_2.setObjectName(u'gridLayout_2') + self.areaPositionLayout = QtGui.QGridLayout(self.areaPositionPage) + self.areaPositionLayout.setMargin(20) + self.areaPositionLayout.setSpacing(8) + self.areaPositionLayout.setObjectName(u'areaPositionLayout') self.mainPositionGroupBox = QtGui.QGroupBox(self.areaPositionPage) self.mainPositionGroupBox.setMinimumSize(QtCore.QSize(248, 0)) self.mainPositionGroupBox.setObjectName(u'mainPositionGroupBox') @@ -294,254 +398,360 @@ class Ui_ThemeWizard(object): self.mainPositionLayout.setMargin(8) self.mainPositionLayout.setSpacing(8) self.mainPositionLayout.setObjectName(u'mainPositionLayout') - self.mainDefaultPositionCheckBox = QtGui.QCheckBox(self.mainPositionGroupBox) + self.mainDefaultPositionCheckBox = QtGui.QCheckBox( + self.mainPositionGroupBox) self.mainDefaultPositionCheckBox.setChecked(True) self.mainDefaultPositionCheckBox.setTristate(False) self.mainDefaultPositionCheckBox.setObjectName(u'mainDefaultPositionCheckBox') - self.mainPositionLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.mainDefaultPositionCheckBox) + self.mainPositionLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.mainDefaultPositionCheckBox) self.nainXLabel = QtGui.QLabel(self.mainPositionGroupBox) self.nainXLabel.setObjectName(u'nainXLabel') - self.mainPositionLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.nainXLabel) + self.mainPositionLayout.setWidget(1, + QtGui.QFormLayout.LabelRole, self.nainXLabel) self.mainXSpinBox = QtGui.QSpinBox(self.mainPositionGroupBox) self.mainXSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainXSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainXSpinBox.sizePolicy().hasHeightForWidth()) self.mainXSpinBox.setSizePolicy(sizePolicy) self.mainXSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.mainXSpinBox.setMaximum(9999) self.mainXSpinBox.setProperty(u'value', 0) self.mainXSpinBox.setObjectName(u'mainXSpinBox') - self.mainPositionLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.mainXSpinBox) + self.mainPositionLayout.setWidget(1, + QtGui.QFormLayout.FieldRole, self.mainXSpinBox) self.mainYSpinBox = QtGui.QSpinBox(self.mainPositionGroupBox) self.mainYSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainYSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainYSpinBox.sizePolicy().hasHeightForWidth()) self.mainYSpinBox.setSizePolicy(sizePolicy) self.mainYSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.mainYSpinBox.setMaximum(9999) self.mainYSpinBox.setObjectName(u'mainYSpinBox') - self.mainPositionLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.mainYSpinBox) + self.mainPositionLayout.setWidget(2, + QtGui.QFormLayout.FieldRole, self.mainYSpinBox) self.mainYLabel = QtGui.QLabel(self.mainPositionGroupBox) self.mainYLabel.setObjectName(u'mainYLabel') - self.mainPositionLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.mainYLabel) + self.mainPositionLayout.setWidget(2, + QtGui.QFormLayout.LabelRole, self.mainYLabel) self.mainWidthSpinBox = QtGui.QSpinBox(self.mainPositionGroupBox) self.mainWidthSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainWidthSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainWidthSpinBox.sizePolicy().hasHeightForWidth()) self.mainWidthSpinBox.setSizePolicy(sizePolicy) self.mainWidthSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.mainWidthSpinBox.setMaximum(9999) self.mainWidthSpinBox.setObjectName(u'mainWidthSpinBox') - self.mainPositionLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.mainWidthSpinBox) + self.mainPositionLayout.setWidget(3, + QtGui.QFormLayout.FieldRole, self.mainWidthSpinBox) self.mainWidthLabel = QtGui.QLabel(self.mainPositionGroupBox) self.mainWidthLabel.setObjectName(u'mainWidthLabel') - self.mainPositionLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.mainWidthLabel) + self.mainPositionLayout.setWidget(3, + QtGui.QFormLayout.LabelRole, self.mainWidthLabel) self.mainHeightSpinBox = QtGui.QSpinBox(self.mainPositionGroupBox) self.mainHeightSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainHeightSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainHeightSpinBox.sizePolicy().hasHeightForWidth()) self.mainHeightSpinBox.setSizePolicy(sizePolicy) self.mainHeightSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.mainHeightSpinBox.setMaximum(9999) self.mainHeightSpinBox.setObjectName(u'mainHeightSpinBox') - self.mainPositionLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.mainHeightSpinBox) + self.mainPositionLayout.setWidget(4, + QtGui.QFormLayout.FieldRole, self.mainHeightSpinBox) self.mainHeightLabel = QtGui.QLabel(self.mainPositionGroupBox) self.mainHeightLabel.setObjectName(u'mainHeightLabel') - self.mainPositionLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.mainHeightLabel) - self.gridLayout_2.addWidget(self.mainPositionGroupBox, 1, 0, 1, 1) + self.mainPositionLayout.setWidget(4, + QtGui.QFormLayout.LabelRole, self.mainHeightLabel) + self.areaPositionLayout.addWidget( + self.mainPositionGroupBox, 1, 0, 1, 1) self.footerPositionGroupBox = QtGui.QGroupBox(self.areaPositionPage) self.footerPositionGroupBox.setMinimumSize(QtCore.QSize(248, 0)) self.footerPositionGroupBox.setObjectName(u'footerPositionGroupBox') - self.footerPositionLayout = QtGui.QFormLayout(self.footerPositionGroupBox) + self.footerPositionLayout = QtGui.QFormLayout( + self.footerPositionGroupBox) self.footerPositionLayout.setMargin(8) self.footerPositionLayout.setSpacing(8) self.footerPositionLayout.setObjectName(u'footerPositionLayout') self.footerXLabel = QtGui.QLabel(self.footerPositionGroupBox) self.footerXLabel.setObjectName(u'footerXLabel') - self.footerPositionLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.footerXLabel) + self.footerPositionLayout.setWidget(1, + QtGui.QFormLayout.LabelRole, self.footerXLabel) self.footerXSpinBox = QtGui.QSpinBox(self.footerPositionGroupBox) self.footerXSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.footerXSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.footerXSpinBox.sizePolicy().hasHeightForWidth()) self.footerXSpinBox.setSizePolicy(sizePolicy) self.footerXSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.footerXSpinBox.setMaximum(9999) self.footerXSpinBox.setProperty(u'value', 0) self.footerXSpinBox.setObjectName(u'footerXSpinBox') - self.footerPositionLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.footerXSpinBox) + self.footerPositionLayout.setWidget(1, + QtGui.QFormLayout.FieldRole, self.footerXSpinBox) self.footerYLabel = QtGui.QLabel(self.footerPositionGroupBox) self.footerYLabel.setObjectName(u'footerYLabel') - self.footerPositionLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.footerYLabel) + self.footerPositionLayout.setWidget(2, + QtGui.QFormLayout.LabelRole, self.footerYLabel) self.footerYSpinBox = QtGui.QSpinBox(self.footerPositionGroupBox) self.footerYSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.footerYSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.footerYSpinBox.sizePolicy().hasHeightForWidth()) self.footerYSpinBox.setSizePolicy(sizePolicy) self.footerYSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.footerYSpinBox.setMaximum(9999) self.footerYSpinBox.setProperty(u'value', 0) self.footerYSpinBox.setObjectName(u'footerYSpinBox') - self.footerPositionLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.footerYSpinBox) + self.footerPositionLayout.setWidget(2, + QtGui.QFormLayout.FieldRole, self.footerYSpinBox) self.footerWidthLabel = QtGui.QLabel(self.footerPositionGroupBox) self.footerWidthLabel.setObjectName(u'footerWidthLabel') - self.footerPositionLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.footerWidthLabel) + self.footerPositionLayout.setWidget(3, + QtGui.QFormLayout.LabelRole, self.footerWidthLabel) self.footerWidthSpinBox = QtGui.QSpinBox(self.footerPositionGroupBox) self.footerWidthSpinBox.setEnabled(False) self.footerWidthSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.footerWidthSpinBox.setMaximum(9999) self.footerWidthSpinBox.setObjectName(u'footerWidthSpinBox') - self.footerPositionLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.footerWidthSpinBox) + self.footerPositionLayout.setWidget(3, + QtGui.QFormLayout.FieldRole, self.footerWidthSpinBox) self.footerHeightLabel = QtGui.QLabel(self.footerPositionGroupBox) self.footerHeightLabel.setObjectName(u'footerHeightLabel') - self.footerPositionLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.footerHeightLabel) + self.footerPositionLayout.setWidget(4, + QtGui.QFormLayout.LabelRole, self.footerHeightLabel) self.footerHeightSpinBox = QtGui.QSpinBox(self.footerPositionGroupBox) self.footerHeightSpinBox.setEnabled(False) self.footerHeightSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.footerHeightSpinBox.setMaximum(9999) self.footerHeightSpinBox.setObjectName(u'footerHeightSpinBox') - self.footerPositionLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.footerHeightSpinBox) - self.footerDefaultPositionCheckBox = QtGui.QCheckBox(self.footerPositionGroupBox) + self.footerPositionLayout.setWidget(4, + QtGui.QFormLayout.FieldRole, self.footerHeightSpinBox) + self.footerDefaultPositionCheckBox = QtGui.QCheckBox( + self.footerPositionGroupBox) self.footerDefaultPositionCheckBox.setChecked(True) self.footerDefaultPositionCheckBox.setObjectName(u'footerDefaultPositionCheckBox') - self.footerPositionLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.footerDefaultPositionCheckBox) - self.gridLayout_2.addWidget(self.footerPositionGroupBox, 1, 1, 1, 1) + self.footerPositionLayout.setWidget(0, + QtGui.QFormLayout.FieldRole, self.footerDefaultPositionCheckBox) + self.areaPositionLayout.addWidget( + self.footerPositionGroupBox, 1, 1, 1, 1) ThemeWizard.addPage(self.areaPositionPage) self.previewPage = QtGui.QWizardPage() self.previewPage.setObjectName(u'previewPage') + self.previewLayout = QtGui.QVBoxLayout(self.previewPage) + self.previewLayout.setSpacing(8) + self.previewLayout.setMargin(20) + self.previewLayout.setObjectName(u'previewLayout') + self.themeNameLayout = QtGui.QHBoxLayout() + self.themeNameLayout.setSpacing(8) + self.themeNameLayout.setObjectName(u'themeNameLayout') self.themeNameLabel = QtGui.QLabel(self.previewPage) - self.themeNameLabel.setGeometry(QtCore.QRect(20, 10, 82, 16)) + self.themeNameLabel.setMinimumSize(QtCore.QSize(103, 0)) self.themeNameLabel.setTextFormat(QtCore.Qt.PlainText) + self.themeNameLabel.setAlignment(QtCore.Qt.AlignRight | + QtCore.Qt.AlignTrailing | QtCore.Qt.AlignVCenter) self.themeNameLabel.setObjectName(u'themeNameLabel') - self.previewLabel = QtGui.QLabel(self.previewPage) - self.previewLabel.setGeometry(QtCore.QRect(250, 60, 48, 16)) - self.previewLabel.setAlignment(QtCore.Qt.AlignCenter) - self.previewLabel.setObjectName(u'previewLabel') + self.themeNameLayout.addWidget(self.themeNameLabel) self.themeNameEdit = QtGui.QLineEdit(self.previewPage) - self.themeNameEdit.setGeometry(QtCore.QRect(117, 4, 351, 23)) self.themeNameEdit.setObjectName(u'themeNameEdit') - self.groupBox = QtGui.QGroupBox(self.previewPage) - self.groupBox.setGeometry(QtCore.QRect(40, 80, 464, 214)) - self.groupBox.setTitle(u'') - self.groupBox.setObjectName(u'groupBox') - self.horizontalLayout = QtGui.QHBoxLayout(self.groupBox) - self.horizontalLayout.setObjectName(u'horizontalLayout') - spacerItem2 = QtGui.QSpacerItem(58, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem2) - self.previewBoxLabel = QtGui.QLabel(self.groupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + self.themeNameLayout.addWidget(self.themeNameEdit) + self.previewLayout.addLayout(self.themeNameLayout) + self.previewPaneLayout = QtGui.QHBoxLayout() + self.previewPaneLayout.setSpacing(0) + self.previewPaneLayout.setObjectName(u'previewPaneLayout') + self.previewLeftSpacer = QtGui.QSpacerItem(58, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.previewPaneLayout.addItem(self.previewLeftSpacer) + self.previewBoxLabel = QtGui.QLabel(self.previewPage) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.previewBoxLabel.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.previewBoxLabel.sizePolicy().hasHeightForWidth()) self.previewBoxLabel.setSizePolicy(sizePolicy) - self.previewBoxLabel.setMinimumSize(QtCore.QSize(300, 200)) + self.previewBoxLabel.setMinimumSize(QtCore.QSize(100, 150)) self.previewBoxLabel.setFrameShape(QtGui.QFrame.WinPanel) self.previewBoxLabel.setFrameShadow(QtGui.QFrame.Sunken) self.previewBoxLabel.setLineWidth(1) self.previewBoxLabel.setText(u'') self.previewBoxLabel.setScaledContents(True) self.previewBoxLabel.setObjectName(u'previewBoxLabel') - self.horizontalLayout.addWidget(self.previewBoxLabel) - spacerItem3 = QtGui.QSpacerItem(78, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem3) + self.previewPaneLayout.addWidget(self.previewBoxLabel) + self.previewRightSpacer = QtGui.QSpacerItem(78, 20, + QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.previewPaneLayout.addItem(self.previewRightSpacer) + self.previewLayout.addLayout(self.previewPaneLayout) ThemeWizard.addPage(self.previewPage) self.themeNameLabel.setBuddy(self.themeNameEdit) self.retranslateUi(ThemeWizard) - QtCore.QObject.connect(ThemeWizard, QtCore.SIGNAL(u'accepted()'), ThemeWizard.accept) + self.backgroundStackedWidget.setCurrentIndex(0) + QtCore.QObject.connect( + ThemeWizard, + QtCore.SIGNAL(u'accepted()'), + ThemeWizard.accept) + QtCore.QObject.connect( + self.backgroundTypeComboBox, + QtCore.SIGNAL(u'currentIndexChanged(int)'), + self.backgroundStackedWidget.setCurrentIndex) QtCore.QMetaObject.connectSlotsByName(ThemeWizard) def retranslateUi(self, ThemeWizard): - ThemeWizard.setWindowTitle(translate('OpenLP.ThemeForm', 'Theme Wizard')) - self.titleLabel.setText(translate('OpenLP.ThemeForm', '\n' -'\n' -'

Welcome to the Theme Wizard

')) - self.informationLabel.setText(translate('OpenLP.ThemeForm', 'This wizard will help you to maintain Themes . Click the next button below to start the process by setting up your background.')) - self.backgroundPage.setTitle(translate('OpenLP.ThemeForm', 'Set Up Background')) - self.backgroundPage.setSubTitle(translate('OpenLP.ThemeForm', 'Set up your theme\'s background according to the parameters below.')) - self.backgroundTypeLabel.setText(translate('OpenLP.ThemeForm', 'Background type:')) - self.backgroundTypeComboBox.setItemText(0, translate('OpenLP.ThemeForm', 'Solid Color')) - self.backgroundTypeComboBox.setItemText(1, translate('OpenLP.ThemeForm', 'Gradient')) - self.backgroundTypeComboBox.setItemText(2, translate('OpenLP.ThemeForm', 'Image')) - self.color1Label.setText(translate('OpenLP.ThemeForm', '')) - self.color2Label.setText(translate('OpenLP.ThemeForm', '')) - self.imageLabel.setText(translate('OpenLP.ThemeForm', 'Image:')) - self.gradientLabel.setText(translate('OpenLP.ThemeForm', 'Gradient:')) - self.gradientComboBox.setItemText(0, translate('OpenLP.ThemeForm', 'Horizontal')) - self.gradientComboBox.setItemText(1, translate('OpenLP.ThemeForm', 'Vertical')) - self.gradientComboBox.setItemText(2, translate('OpenLP.ThemeForm', 'Circular')) - self.gradientComboBox.setItemText(3, translate('OpenLP.ThemeForm', 'Top Left - Bottom Right')) - self.gradientComboBox.setItemText(4, translate('OpenLP.ThemeForm', 'Bottom Left - Top Right')) - self.mainAreaPage.setTitle(translate('OpenLP.ThemeForm', 'Main Area Font Details')) - self.mainAreaPage.setSubTitle(translate('OpenLP.ThemeForm', 'Define the font and display characteristics for the Display text')) - self.mainFontLabel.setText(translate('OpenLP.ThemeForm', 'Font:')) - self.mainColorLabel.setText(translate('OpenLP.ThemeForm', 'Color:')) - self.mainSizeLabel.setText(translate('OpenLP.ThemeForm', 'Size:')) - self.mainSizeSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'pt')) - self.mainLineCountLabel.setText(translate('OpenLP.ThemeForm', '(%d lines per slide)')) - self.lineSpacingLabel.setText(translate('OpenLP.ThemeForm', 'Line Spacing:')) - self.lineSpacingSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'pt')) - self.outlineCheckBox.setText(translate('OpenLP.ThemeForm', '&Outline:')) - self.outlineSizeLabel.setText(translate('OpenLP.ThemeForm', 'Size:')) - self.outlineSizeSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'pt')) - self.shadowCheckBox.setText(translate('OpenLP.ThemeForm', '&Shadow:')) - self.shadowSizeLabel.setText(translate('OpenLP.ThemeForm', 'Size:')) - self.shadowSizeSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'pt')) - self.boldCheckBox.setText(translate('OpenLP.ThemeForm', 'Bold Display')) - self.italicsCheckBox.setText(translate('OpenLP.ThemeForm', 'Italic Display')) - self.footerAreaPage.setTitle(translate('OpenLP.ThemeForm', 'Footer Area Font Details')) - self.footerAreaPage.setSubTitle(translate('OpenLP.ThemeForm', 'Define the font and display characteristics for the Footer text')) - self.footerFontLabel.setText(translate('OpenLP.ThemeForm', 'Font:')) - self.footerColorLabel.setText(translate('OpenLP.ThemeForm', 'Color:')) - self.footerSizeLabel.setText(translate('OpenLP.ThemeForm', 'Size:')) - self.footerSizeSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'pt')) - self.alignmentPage.setTitle(translate('OpenLP.ThemeForm', 'Text Formatting Details')) - self.alignmentPage.setSubTitle(translate('OpenLP.ThemeForm', 'Allows additional display formatting information to be defined')) - self.horizontalLabel.setText(translate('OpenLP.ThemeForm', 'Horizontal Align:')) - self.horizontalComboBox.setItemText(0, translate('OpenLP.ThemeForm', 'Left')) - self.horizontalComboBox.setItemText(1, translate('OpenLP.ThemeForm', 'Right')) - self.horizontalComboBox.setItemText(2, translate('OpenLP.ThemeForm', 'Center')) - self.verticalLabel.setText(translate('OpenLP.ThemeForm', 'Vertcal Align:')) - self.verticalComboBox.setItemText(0, translate('OpenLP.ThemeForm', 'Top')) - self.verticalComboBox.setItemText(1, translate('OpenLP.ThemeForm', 'Middle')) - self.verticalComboBox.setItemText(2, translate('OpenLP.ThemeForm', 'Bottom')) - self.transitionsCheckBox.setText(translate('OpenLP.ThemeForm', 'Transitions')) - self.areaPositionPage.setTitle(translate('OpenLP.ThemeForm', 'Output Area Locations')) - self.areaPositionPage.setSubTitle(translate('OpenLP.ThemeForm', 'Allows you to change and move the Main and Footer areas.')) - self.mainPositionGroupBox.setTitle(translate('OpenLP.ThemeForm', '&Main Area')) - self.mainDefaultPositionCheckBox.setText(translate('OpenLP.ThemeForm', '&Use default location')) - self.nainXLabel.setText(translate('OpenLP.ThemeForm', 'X position:')) - self.mainXSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) - self.mainYSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) - self.mainYLabel.setText(translate('OpenLP.ThemeForm', 'Y position:')) - self.mainWidthSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) - self.mainWidthLabel.setText(translate('OpenLP.ThemeForm', 'Width:')) - self.mainHeightSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) - self.mainHeightLabel.setText(translate('OpenLP.ThemeForm', 'Height:')) - self.footerPositionGroupBox.setTitle(translate('OpenLP.ThemeForm', 'Footer Area')) - self.footerXLabel.setText(translate('OpenLP.ThemeForm', 'X position:')) - self.footerXSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) - self.footerYLabel.setText(translate('OpenLP.ThemeForm', 'Y position:')) - self.footerYSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) - self.footerWidthLabel.setText(translate('OpenLP.ThemeForm', 'Width:')) - self.footerWidthSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) - self.footerHeightLabel.setText(translate('OpenLP.ThemeForm', 'Height:')) - self.footerHeightSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) - self.footerDefaultPositionCheckBox.setText(translate('OpenLP.ThemeForm', 'Use default location')) - self.previewPage.setTitle(translate('OpenLP.ThemeForm', 'Save and Preview')) - self.previewPage.setSubTitle(translate('OpenLP.ThemeForm', 'View the theme and save it replacing the current one or change the name to create a new theme')) - self.themeNameLabel.setText(translate('OpenLP.ThemeForm', 'Theme name:')) - self.previewLabel.setText(translate('OpenLP.ThemeForm', 'Preview')) + ThemeWizard.setWindowTitle( + translate('OpenLP.ThemeWizard', 'Theme Wizard')) + self.titleLabel.setText( + u'%s' % \ + translate('OpenLP.ThemeWizard', 'Welcome to the Theme Wizard')) + self.informationLabel.setText( + translate('OpenLP.ThemeWizard', 'This wizard will help you to ' + 'create and edit your themes . Click the next button below to ' + 'start the process by setting up your background.')) + self.backgroundPage.setTitle( + translate('OpenLP.ThemeWizard', 'Set Up Background')) + self.backgroundPage.setSubTitle( + translate('OpenLP.ThemeWizard', 'Set up your theme\'s background ' + 'according to the parameters below.')) + self.backgroundTypeLabel.setText( + translate('OpenLP.ThemeWizard', 'Background type:')) + self.backgroundTypeComboBox.setItemText(0, + translate('OpenLP.ThemeWizard', 'Solid Color')) + self.backgroundTypeComboBox.setItemText(1, + translate('OpenLP.ThemeWizard', 'Gradient')) + self.backgroundTypeComboBox.setItemText(2, + translate('OpenLP.ThemeWizard', 'Image')) + self.colorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:')) + self.gradientStartLabel.setText( + translate(u'OpenLP.ThemeWizard', 'Starting color:')) + self.gradientEndLabel.setText( + translate(u'OpenLP.ThemeWizard', 'Ending color:')) + self.gradientTypeLabel.setText( + translate('OpenLP.ThemeWizard', 'Gradient:')) + self.gradientComboBox.setItemText(0, + translate('OpenLP.ThemeWizard', 'Horizontal')) + self.gradientComboBox.setItemText(1, + translate('OpenLP.ThemeWizard', 'Vertical')) + self.gradientComboBox.setItemText(2, + translate('OpenLP.ThemeWizard', 'Circular')) + self.gradientComboBox.setItemText(3, + translate('OpenLP.ThemeWizard', 'Top Left - Bottom Right')) + self.gradientComboBox.setItemText(4, + translate('OpenLP.ThemeWizard', 'Bottom Left - Top Right')) + self.imageLabel.setText(translate('OpenLP.ThemeWizard', 'Image:')) + self.mainAreaPage.setTitle( + translate('OpenLP.ThemeWizard', 'Main Area Font Details')) + self.mainAreaPage.setSubTitle( + translate('OpenLP.ThemeWizard', 'Define the font and display ' + 'characteristics for the Display text')) + self.mainFontLabel.setText( + translate('OpenLP.ThemeWizard', 'Font:')) + self.mainColorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:')) + self.mainSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) + self.mainSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.mainLineCountLabel.setText( + translate('OpenLP.ThemeWizard', '(%d lines per slide)')) + self.lineSpacingLabel.setText( + translate('OpenLP.ThemeWizard', 'Line Spacing:')) + self.lineSpacingSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.outlineCheckBox.setText( + translate('OpenLP.ThemeWizard', '&Outline:')) + self.outlineSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) + self.outlineSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.shadowCheckBox.setText(translate('OpenLP.ThemeWizard', '&Shadow:')) + self.shadowSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) + self.shadowSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.boldCheckBox.setText( + translate('OpenLP.ThemeWizard', 'Bold')) + self.italicsCheckBox.setText( + translate('OpenLP.ThemeWizard', 'Italic')) + self.footerAreaPage.setTitle( + translate('OpenLP.ThemeWizard', 'Footer Area Font Details')) + self.footerAreaPage.setSubTitle( + translate('OpenLP.ThemeWizard', 'Define the font and display ' + 'characteristics for the Footer text')) + self.footerFontLabel.setText(translate('OpenLP.ThemeWizard', 'Font:')) + self.footerColorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:')) + self.footerSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:')) + self.footerSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt')) + self.alignmentPage.setTitle( + translate('OpenLP.ThemeWizard', 'Text Formatting Details')) + self.alignmentPage.setSubTitle( + translate('OpenLP.ThemeWizard', 'Allows additional display ' + 'formatting information to be defined')) + self.horizontalLabel.setText( + translate('OpenLP.ThemeWizard', 'Horizontal Align:')) + self.horizontalComboBox.setItemText(0, + translate('OpenLP.ThemeWizard', 'Left')) + self.horizontalComboBox.setItemText(1, + translate('OpenLP.ThemeWizard', 'Right')) + self.horizontalComboBox.setItemText(2, + translate('OpenLP.ThemeWizard', 'Center')) + self.verticalLabel.setText( + translate('OpenLP.ThemeWizard', 'Vertcal Align:')) + self.verticalComboBox.setItemText(0, + translate('OpenLP.ThemeWizard', 'Top')) + self.verticalComboBox.setItemText(1, + translate('OpenLP.ThemeWizard', 'Middle')) + self.verticalComboBox.setItemText(2, + translate('OpenLP.ThemeWizard', 'Bottom')) + self.transitionsCheckBox.setText( + translate('OpenLP.ThemeWizard', 'Transitions')) + self.areaPositionPage.setTitle( + translate('OpenLP.ThemeWizard', 'Output Area Locations')) + self.areaPositionPage.setSubTitle( + translate('OpenLP.ThemeWizard', 'Allows you to change and move the ' + 'main and footer areas.')) + self.mainPositionGroupBox.setTitle( + translate('OpenLP.ThemeWizard', '&Main Area')) + self.mainDefaultPositionCheckBox.setText( + translate('OpenLP.ThemeWizard', '&Use default location')) + self.nainXLabel.setText(translate('OpenLP.ThemeWizard', 'X position:')) + self.mainXSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'px')) + self.mainYSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'px')) + self.mainYLabel.setText(translate('OpenLP.ThemeWizard', 'Y position:')) + self.mainWidthSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'px')) + self.mainWidthLabel.setText(translate('OpenLP.ThemeWizard', 'Width:')) + self.mainHeightSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'px')) + self.mainHeightLabel.setText(translate('OpenLP.ThemeWizard', 'Height:')) + self.footerPositionGroupBox.setTitle( + translate('OpenLP.ThemeWizard', 'Footer Area')) + self.footerXLabel.setText(translate('OpenLP.ThemeWizard', 'X position:')) + self.footerXSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'px')) + self.footerYLabel.setText(translate('OpenLP.ThemeWizard', 'Y position:')) + self.footerYSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'px')) + self.footerWidthLabel.setText(translate('OpenLP.ThemeWizard', 'Width:')) + self.footerWidthSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'px')) + self.footerHeightLabel.setText( + translate('OpenLP.ThemeWizard', 'Height:')) + self.footerHeightSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'px')) + self.footerDefaultPositionCheckBox.setText( + translate('OpenLP.ThemeWizard', 'Use default location')) + self.previewPage.setTitle( + translate('OpenLP.ThemeWizard', 'Save and Preview')) + self.previewPage.setSubTitle( + translate('OpenLP.ThemeWizard', 'View the theme and save it ' + 'replacing the current one or change the name to create a ' + 'new theme')) + self.themeNameLabel.setText( + translate('OpenLP.ThemeWizard', 'Theme name:')) diff --git a/resources/forms/themewizard.ui b/resources/forms/themewizard.ui index 4ca7271d3..9e1f8f9e8 100644 --- a/resources/forms/themewizard.ui +++ b/resources/forms/themewizard.ui @@ -133,138 +133,254 @@ p, li { white-space: pre-wrap; } Set up your theme's background according to the parameters below. - - - QFormLayout::ExpandingFieldsGrow - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - 8 - - + + 8 20 - - - - Background type: - - - - - - - - Solid Color - - - - - Gradient - - - - - Image - - - - - - - - <Color1> - - - - - - - - - - - - - - <Color2> - - - - - - - - - - - - - - Image: - - - - - + + 8 - - - - + - - - - - :/general/general_open.png:/general/general_open.png + Background type: + + + + + Solid Color + + + + + Gradient + + + + + Image + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + - - - - Gradient: + + + + 0 - - - - - - - Horizontal - - - - - Vertical - - - - - Circular - - - - - Top Left - Bottom Right - - - - - Bottom Left - Top Right - - + + + + 8 + + + 8 + + + 0 + + + + + + 103 + 0 + + + + Color: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + 8 + + + 8 + + + 0 + + + + + + 103 + 0 + + + + Starting color: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 103 + 0 + + + + Ending color: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 103 + 0 + + + + Gradient: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + Horizontal + + + + + Vertical + + + + + Circular + + + + + Top Left - Bottom Right + + + + + Bottom Left - Top Right + + + + + + + + + + 8 + + + 8 + + + 0 + + + + + + 103 + 0 + + + + Image: + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 8 + + + + + + + + + + + + :/general/general_open.png:/general/general_open.png + + + + + + + @@ -276,30 +392,30 @@ p, li { white-space: pre-wrap; } Define the font and display characteristics for the Display text - - - Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop - + 8 8 - - 20 - - - 20 - - + 20 + + + 103 + 0 + + Font: + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -313,11 +429,32 @@ p, li { white-space: pre-wrap; } - - - + + + 24 - + + + + + + + + + + + Bold + + + + + + + Italic + + + + @@ -458,20 +595,6 @@ p, li { white-space: pre-wrap; } - - - - Bold Display - - - - - - - Italic Display - - - @@ -491,23 +614,23 @@ p, li { white-space: pre-wrap; } 8 - - 50 - - - 20 - - - 20 - - + 20 + + + 103 + 0 + + Font: + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -569,14 +692,29 @@ p, li { white-space: pre-wrap; } Allows additional display formatting information to be defined + + 8 + + + 8 + 20 + + + 103 + 0 + + Horizontal Align: + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + @@ -643,7 +781,7 @@ p, li { white-space: pre-wrap; } Allows you to change and move the Main and Footer areas. - + 20 @@ -983,129 +1121,114 @@ p, li { white-space: pre-wrap; } View the theme and save it replacing the current one or change the name to create a new theme - - - - 20 - 10 - 82 - 16 - + + + 8 - - Theme name: + + 20 - - Qt::PlainText - - - themeNameEdit - - - - - - 250 - 60 - 48 - 16 - - - - Preview - - - Qt::AlignCenter - - - - - - 117 - 4 - 351 - 23 - - - - - - - 40 - 80 - 464 - 214 - - - - - - - - - - Qt::Horizontal - - - - 58 - 20 - - - - - - - - - 0 - 0 - - - - - 300 - 200 - - - - QFrame::WinPanel - - - QFrame::Sunken - - - 1 - - - - - - true - - - - - - - Qt::Horizontal - - - - 78 - 20 - - - - - - + + + + 8 + + + + + + 103 + 0 + + + + Theme name: + + + Qt::PlainText + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + themeNameEdit + + + + + + + + + + + + 0 + + + + + Qt::Horizontal + + + + 58 + 20 + + + + + + + + + 0 + 0 + + + + + 100 + 150 + + + + QFrame::WinPanel + + + QFrame::Sunken + + + 1 + + + + + + true + + + + + + + Qt::Horizontal + + + + 78 + 20 + + + + + + + - - @@ -1124,5 +1247,21 @@ p, li { white-space: pre-wrap; } + + backgroundTypeComboBox + currentIndexChanged(int) + backgroundStackedWidget + setCurrentIndex(int) + + + 178 + 78 + + + 249 + 199 + + + diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index 0ecb87bca..2a3282461 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -81,6 +81,7 @@ wizard_importsong.bmp wizard_importbible.bmp + wizard_createtheme.bmp service_collapse_all.png diff --git a/resources/images/wizard_createtheme.bmp b/resources/images/wizard_createtheme.bmp new file mode 100644 index 0000000000000000000000000000000000000000..092c61ad4580cd5dced0faebd127743f5d34bdff GIT binary patch literal 172254 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%0A>Zs?&-6~)=!$J{**-WgjmG7Hn8@yu1UoGd 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 z¥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

y3Hxs?9$_Tt62H{?&|>wU-}W4 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 T6f@{Uf9|~*HVopc3#|VyplB~H literal 0 HcmV?d00001 From 1c11cab27b5ac5f65df30295a8beb45617f5395a Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Wed, 24 Nov 2010 01:51:08 +0000 Subject: [PATCH 17/40] Whitespace & unused imports --- openlp/core/lib/__init__.py | 4 ++-- openlp/core/lib/htmlbuilder.py | 15 ++++++++------- openlp/core/lib/mediamanageritem.py | 6 +++--- openlp/core/lib/spelltextedit.py | 2 +- openlp/core/lib/theme.py | 14 ++++++++------ openlp/core/ui/advancedtab.py | 3 ++- openlp/core/ui/themeform.py | 2 +- openlp/core/ui/thememanager.py | 3 ++- 8 files changed, 27 insertions(+), 22 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index b6946a628..90ee64a46 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -303,8 +303,8 @@ def expand_tags(text): text = text.replace(tag[u'end tag'], tag[u'end html']) return text -from theme import ThemeLevel, ThemeXML, BackgroundGradientType, BackgroundType, \ - HorizontalType, VerticalType +from theme import ThemeLevel, ThemeXML, BackgroundGradientType, \ + BackgroundType, HorizontalType, VerticalType from spelltextedit import SpellTextEdit from eventreceiver import Receiver from imagemanager import ImageManager diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index b2f46e655..9a042ed10 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -371,7 +371,8 @@ def build_background_css(item, width, height): theme = item.themedata background = u'background-color: black' if theme: - if theme.background_type == BackgroundType.to_string(BackgroundType.Solid): + if theme.background_type == BackgroundType.to_string( + BackgroundType.Solid): background = u'background-color: %s' % theme.background_color else: if theme.background_direction == BackgroundGradientType.to_string \ @@ -381,22 +382,22 @@ def build_background_css(item, width, height): u'-webkit-gradient(linear, left top, left bottom, ' \ 'from(%s), to(%s))' % (theme.background_start_color, theme.background_end_color) - elif theme.background_direction == BackgroundGradientType.to_string \ - (BackgroundGradientType.LeftTop): + elif theme.background_direction == BackgroundGradientType.to_string( + BackgroundGradientType.LeftTop): background = \ u'background: ' \ u'-webkit-gradient(linear, left top, right bottom, ' \ 'from(%s), to(%s))' % (theme.background_start_color, theme.background_end_color) - elif theme.background_direction == BackgroundGradientType.to_string \ - (BackgroundGradientType.LeftBottom): + elif theme.background_direction == BackgroundGradientType.to_string( + BackgroundGradientType.LeftBottom): background = \ u'background: ' \ u'-webkit-gradient(linear, left bottom, right top, ' \ 'from(%s), to(%s))' % (theme.background_start_color, theme.background_end_color) - elif theme.background_direction == BackgroundGradientType.to_string \ - (BackgroundGradientType.Vertical): + elif theme.background_direction == BackgroundGradientType.to_string( + BackgroundGradientType.Vertical): background = \ u'background: -webkit-gradient(linear, left top, ' \ u'right top, from(%s), to(%s))' % \ diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 3eae97238..c559c3e4b 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -474,8 +474,8 @@ class MediaManagerItem(QtGui.QWidget): translate('OpenLP.MediaManagerItem', 'You must select one or more items.')) else: - # Is it posssible to process multiple list items to generate multiple - # service items? + # Is it posssible to process multiple list items to generate + # multiple service items? if self.singleServiceItem or self.remoteTriggered: log.debug(self.plugin.name + u' Add requested') service_item = self.buildServiceItem() @@ -504,7 +504,7 @@ class MediaManagerItem(QtGui.QWidget): log.debug(self.plugin.name + u' Add requested') service_item = self.parent.serviceManager.getServiceItem() if not service_item: - QtGui.QMessageBox.information(self, + QtGui.QMessageBox.information(self, translate('OpenLP.MediaManagerItem', 'No Service Item Selected'), translate('OpenLP.MediaManagerItem', diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py index 603197c07..8a9a20a18 100644 --- a/openlp/core/lib/spelltextedit.py +++ b/openlp/core/lib/spelltextedit.py @@ -33,7 +33,7 @@ except ImportError: enchant_available = False # based on code from -# http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/ +#http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/ from PyQt4 import QtCore, QtGui from openlp.core.lib import html_expands, translate diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py index f211048e3..302a271a1 100644 --- a/openlp/core/lib/theme.py +++ b/openlp/core/lib/theme.py @@ -31,7 +31,6 @@ import re import logging from xml.dom.minidom import Document -from xml.etree.ElementTree import ElementTree, XML from lxml import etree, objectify from openlp.core.lib import str_to_bool @@ -261,8 +260,9 @@ class ThemeXML(object): def add_font(self, name, color, size, override, fonttype=u'main', bold=u'False', italics=u'False', line_adjustment=0, - xpos=0, ypos=0, width=0, height=0 , outline=u'False', outline_color=u'#ffffff', - outline_pixel=2, shadow=u'False', shadow_color=u'#ffffff', shadow_pixel=5): + xpos=0, ypos=0, width=0, height=0 , outline=u'False', + outline_color=u'#ffffff', outline_pixel=2, shadow=u'False', + shadow_color=u'#ffffff', shadow_pixel=5): """ Add a Font. @@ -441,7 +441,7 @@ class ThemeXML(object): if line: xml = xml[line + 2:] try: - theme_xml = objectify.fromstring(xml) + theme_xml = objectify.fromstring(xml) except etree.XMLSyntaxError: log.exception(u'Invalid xml %s', xml) return @@ -457,7 +457,8 @@ class ThemeXML(object): if element.getparent().tag == u'display': if element.tag.startswith(u'shadow') or \ element.tag.startswith(u'outline'): - self._create_attr(u'font_main', element.tag, element.text) + self._create_attr(u'font_main', element.tag, + element.text) master = element.getparent().tag if element.getparent().tag == u'background': master = element.getparent().tag @@ -471,7 +472,8 @@ class ThemeXML(object): for attr in element.attrib: base_element = attr # correction for the shadow and outline tags - if element.tag == u'shadow' or element.tag == u'outline': + if element.tag == u'shadow' or \ + element.tag == u'outline': if not attr.startswith(element.tag): base_element = element.tag + u'_' + attr self._create_attr(master, base_element, diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index dc126d863..f46f8fae8 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -82,7 +82,8 @@ class AdvancedTab(SettingsTab): self.doubleClickLiveCheckBox.setObjectName(u'doubleClickLiveCheckBox') self.uiLayout.addWidget(self.doubleClickLiveCheckBox) # self.expandServiceItemCheckBox = QtGui.QCheckBox(self.uiGroupBox) -# self.expandServiceItemCheckBox.setObjectName(u'expandServiceItemCheckBox') +# self.expandServiceItemCheckBox.setObjectName( +# u'expandServiceItemCheckBox') # self.uiLayout.addWidget(self.expandServiceItemCheckBox) self.leftLayout.addWidget(self.uiGroupBox) self.expandServiceItemCheckBox = QtGui.QCheckBox(self.uiGroupBox) diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index 0ea5f057f..5bb0cbb7b 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -596,5 +596,5 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): new_color = QtGui.QColorDialog.getColor( QtGui.QColor(field), self) if new_color.isValid(): - field = new_color.name() + field = new_color.name() return field diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 0f0802bf2..d9e89e6d6 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -630,7 +630,8 @@ class ThemeManager(QtGui.QWidget): newtheme.font_main_shadow_color = unicode(theme.ShadowColor.name()) if theme.Outline == 1: newtheme.font_main_outline = True - newtheme.font_main_outline_color = unicode(theme.OutlineColor.name()) + newtheme.font_main_outline_color = unicode( + theme.OutlineColor.name()) vAlignCorrection = 0 if theme.VerticalAlign == 2: vAlignCorrection = 1 From 66f230169d535381aea46de79a8ca717eb8365c6 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 26 Nov 2010 15:23:48 +0100 Subject: [PATCH 18/40] SongBeamer import clean ups and tweaks --- openlp/plugins/songs/forms/songimportform.py | 3 +- openlp/plugins/songs/lib/songbeamerimport.py | 169 +++++++++++-------- openlp/plugins/songs/lib/songimport.py | 3 +- 3 files changed, 98 insertions(+), 77 deletions(-) diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 014c66a51..67ef4d8c1 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -507,8 +507,7 @@ class SongImportForm(QtGui.QWizard, Ui_SongImportWizard): filenames=self.getListOfFiles( self.songBeamerFileListWidget) ) - success = importer.do_import() - if success: + if importer.do_import(): # reload songs self.importProgressLabel.setText( translate('SongsPlugin.SongImportForm', 'Finished import.')) diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index 8b07d2b32..3f76772ab 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -57,15 +57,17 @@ class SongBeamerTypes(object): u'Unknown': u'O' } + class SongBeamerImport(SongImport): """ - Import Song Beamer files(s) - Song Beamer file format is text based - in the beginning are one or more control tags written + Import Song Beamer files(s) + Song Beamer file format is text based + in the beginning are one or more control tags written """ def __init__(self, master_manager, **kwargs): """ Initialise the import. + ``master_manager`` The song manager for the running OpenLP installation. """ @@ -88,6 +90,7 @@ class SongBeamerImport(SongImport): # TODO: check that it is a valid SongBeamer file self.current_verse = u'' self.current_verse_type = u'V' + read_verses = False self.file_name = os.path.split(file)[1] self.import_wizard.incrementProgressBar( "Importing %s" % (self.file_name), 0) @@ -100,27 +103,26 @@ class SongBeamerImport(SongImport): else: return False for line in self.songData: - line = line.strip() - if line.startswith('#'): - log.debug(u'find tag: %s' % line) - if not self.parse_tags(line): - return False - elif line.startswith('---'): - log.debug(u'find ---') - if len(self.current_verse) > 0: - self.add_verse(self.current_verse, + # Just make sure that the line is of the type 'Unicode'. + line = unicode(line).strip() + if line.startswith(u'#') and not read_verses: + self.parse_tags(line) + elif line.startswith(u'---'): + if self.current_verse: + self.add_verse(self.current_verse, self.current_verse_type) self.current_verse = u'' self.current_verse_type = u'V' - self.read_verse = True - self.verse_start = True - elif self.read_verse: - if self.verse_start: - self.check_verse_marks(line) - self.verse_start = False + read_verses = True + verse_start = True + elif read_verses: + if verse_start: + verse_start = False + if not self.check_verse_marks(line): + self.current_verse = u'%s\n' % line else: self.current_verse += u'%s\n' % line - if len(self.current_verse) > 0: + if self.current_verse: self.add_verse(self.current_verse, self.current_verse_type) self.finish() self.import_wizard.incrementProgressBar( @@ -128,106 +130,125 @@ class SongBeamerImport(SongImport): return True def parse_tags(self, line): - tag_val = line.split('=') - if len(tag_val[0]) == 0 or len(tag_val[1]) == 0: - return True - if tag_val[0] == '#(c)': + """ + Parses a meta data line. + + ``line`` + The line in the file. It should consist of a tag and a value + for this tag. (unicode) + + u'#Title=Nearer my God to Thee' + """ + tag_val = line.split(u'=', 1) + if len(tag_val) == 1: + return + if not tag_val[0] or not tag_val[1]: + return + if tag_val[0] == u'#(c)': self.add_copyright(tag_val[1]) - elif tag_val[0] == '#AddCopyrightInfo': + elif tag_val[0] == u'#AddCopyrightInfo': pass - elif tag_val[0] == '#Author': - #TODO split Authors - self.add_author(tag_val[1]) - elif tag_val[0] == '#BackgroundImage': + elif tag_val[0] == u'#Author': + self.parse_author(tag_val[1]) + elif tag_val[0] == u'#BackgroundImage': pass - elif tag_val[0] == '#Bible': + elif tag_val[0] == u'#Bible': pass - elif tag_val[0] == '#Categories': + elif tag_val[0] == u'#Categories': self.topics = line.split(',') - elif tag_val[0] == '#CCLI': + elif tag_val[0] == u'#CCLI': self.ccli_number = tag_val[1] - elif tag_val[0] == '#Chords': + elif tag_val[0] == u'#Chords': pass - elif tag_val[0] == '#ChurchSongID': + elif tag_val[0] == u'#ChurchSongID': pass - elif tag_val[0] == '#ColorChords': + elif tag_val[0] == u'#ColorChords': pass - elif tag_val[0] == '#Comments': + elif tag_val[0] == u'#Comments': self.comments = tag_val[1] - elif tag_val[0] == '#Editor': + elif tag_val[0] == u'#Editor': pass - elif tag_val[0] == '#Font': + elif tag_val[0] == u'#Font': pass - elif tag_val[0] == '#FontLang2': + elif tag_val[0] == u'#FontLang2': pass - elif tag_val[0] == '#FontSize': + elif tag_val[0] == u'#FontSize': pass - elif tag_val[0] == '#Format': + elif tag_val[0] == u'#Format': pass - elif tag_val[0] == '#Format_PreLine': + elif tag_val[0] == u'#Format_PreLine': pass - elif tag_val[0] == '#Format_PrePage': + elif tag_val[0] == u'#Format_PrePage': pass - elif tag_val[0] == '#ID': + elif tag_val[0] == u'#ID': pass - elif tag_val[0] == '#Key': + elif tag_val[0] == u'#Key': pass - elif tag_val[0] == '#Keywords': + elif tag_val[0] == u'#Keywords': pass - elif tag_val[0] == '#LangCount': + elif tag_val[0] == u'#LangCount': pass - elif tag_val[0] == '#Melody': - #TODO split Authors - self.add_author(tag_val[1]) - elif tag_val[0] == '#NatCopyright': + elif tag_val[0] == u'#Melody': + self.parse_author(tag_val[1]) + elif tag_val[0] == u'#NatCopyright': pass - elif tag_val[0] == '#OTitle': + elif tag_val[0] == u'#OTitle': pass - elif tag_val[0] == '#OutlineColor': + elif tag_val[0] == u'#OutlineColor': pass - elif tag_val[0] == '#OutlinedFont': + elif tag_val[0] == u'#OutlinedFont': pass - elif tag_val[0] == '#QuickFind': + elif tag_val[0] == u'#QuickFind': pass - elif tag_val[0] == '#Rights': + elif tag_val[0] == u'#Rights': song_book_pub = tag_val[1] - elif tag_val[0] == '#Songbook': + elif tag_val[0] == u'#Songbook': book_num = tag_val[1].split(' / ') self.song_book_name = book_num[0] if len(book_num) == book_num[1]: self.song_number = u'' - elif tag_val[0] == '#Speed': + elif tag_val[0] == u'#Speed': pass - elif tag_val[0] == '#TextAlign': + elif tag_val[0] == u'#TextAlign': pass - elif tag_val[0] == '#Title': + elif tag_val[0] == u'#Title': self.title = u'%s' % tag_val[1] - elif tag_val[0] == '#TitleAlign': + elif tag_val[0] == u'#TitleAlign': pass - elif tag_val[0] == '#TitleFontSize': + elif tag_val[0] == u'#TitleFontSize': pass - elif tag_val[0] == '#TitleLang2': + elif tag_val[0] == u'#TitleLang2': pass - elif tag_val[0] == '#TitleLang3': + elif tag_val[0] == u'#TitleLang3': pass - elif tag_val[0] == '#TitleLang4': + elif tag_val[0] == u'#TitleLang4': pass - elif tag_val[0] == '#Translation': + elif tag_val[0] == u'#Translation': pass - elif tag_val[0] == '#Transpose': + elif tag_val[0] == u'#Transpose': pass - elif tag_val[0] == '#TransposeAccidental': + elif tag_val[0] == u'#TransposeAccidental': pass - elif tag_val[0] == '#Version': + elif tag_val[0] == u'#Version': pass - else: - pass - return True def check_verse_marks(self, line): - marks = line.split(' ') + """ + Check and add the verse's MarkType. Returns ``True`` if the given mark + is correct otherwise ``False``. + + ``line`` + The line to check for marks (unicode). + """ + marks = line.split(u' ') if len(marks) <= 2 and marks[0] in SongBeamerTypes.MarkTypes: self.current_verse_type = SongBeamerTypes.MarkTypes[marks[0]] if len(marks) == 2: - #TODO: may check, because of only digits are allowed - self.current_verse_type += marks[1] + # If we have a digit, we append it to current_verse_type. + try: + self.current_verse_type += u'%s' % int(marks[1]) + except ValueError: + pass + return True + else: + return False diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 2c1de83a2..ea36d55b5 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -254,7 +254,8 @@ class SongImport(QtCore.QObject): All fields have been set to this song. Write it away """ if not self.authors: - self.authors.append(u'Author unknown') + self.authors.append(unicode(translate('SongsPlugin.SongImport', + 'Author unknown'))) self.commit_song() def commit_song(self): From 0dc9d433b7537e3d4ea13f071063d34506a13400 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 26 Nov 2010 17:06:24 +0100 Subject: [PATCH 19/40] SongBeamer import converts tags, that they'll work with OpenLP --- openlp/plugins/songs/lib/songbeamerimport.py | 30 ++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index 3f76772ab..2d601fbb0 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -109,6 +109,7 @@ class SongBeamerImport(SongImport): self.parse_tags(line) elif line.startswith(u'---'): if self.current_verse: + self.replace_html_tags() self.add_verse(self.current_verse, self.current_verse_type) self.current_verse = u'' @@ -123,12 +124,41 @@ class SongBeamerImport(SongImport): else: self.current_verse += u'%s\n' % line if self.current_verse: + self.replace_html_tags() self.add_verse(self.current_verse, self.current_verse_type) self.finish() self.import_wizard.incrementProgressBar( "Importing %s" % (self.file_name)) return True + def replace_html_tags(self): + """ + This can be called to replace SongBeamer's specific (html) tags with + OpenLP's specific (html) tags. + """ + tag_pairs = [ + (u'', u'{st}'), + (u'', u'{/st}'), + (u'', u'{it}'), + (u'', u'{/it}'), + (u'', u''), + (u'', u''), + (u'
', u'{st}'), + (u'
', u'{st}'), + (u'', u'{st}'), + (u'

', u'{/p}'), + (u'

', u'{/p}'), + (u'', u'{su}'), + (u'', u'{/su}'), + (u'', u'{sb}'), + (u'', u'{/sb}'), + (u'', u''), + (u'', u'') + ] + for pair in tag_pairs: + self.current_verse.replace(pair[0], pair[1]) + # TODO: check for unsupported tags (see wiki) and remove them as well. + def parse_tags(self, line): """ Parses a meta data line. From ae036056b1fb1de9b5960b70c05757d682342c72 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 26 Nov 2010 17:25:56 +0100 Subject: [PATCH 20/40] added the tag {u} --- openlp/core/lib/__init__.py | 87 ++++++++++---------- openlp/plugins/songs/lib/songbeamerimport.py | 4 +- 2 files changed, 47 insertions(+), 44 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index b6946a628..eb7213c16 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -38,48 +38,51 @@ log = logging.getLogger(__name__) # TODO make external and configurable in alpha 4 via a settings dialog html_expands = [] -html_expands.append({u'desc':u'Red', u'start tag':u'{r}', - u'start html':u'', - u'end tag':u'{/r}', u'end html':u'', u'protected':False}) -html_expands.append({u'desc':u'Black', u'start tag':u'{b}', - u'start html':u'', - u'end tag':u'{/b}', u'end html':u'', u'protected':False}) -html_expands.append({u'desc':u'Blue', u'start tag':u'{bl}', - u'start html':u'', - u'end tag':u'{/bl}', u'end html':u'', u'protected':False}) -html_expands.append({u'desc':u'Yellow', u'start tag':u'{y}', - u'start html':u'', - u'end tag':u'{/y}', u'end html':u'', u'protected':False}) -html_expands.append({u'desc':u'Green', u'start tag':u'{g}', - u'start html':u'', - u'end tag':u'{/g}', u'end html':u'', u'protected':False}) -html_expands.append({u'desc':u'Pink', u'start tag':u'{pk}', - u'start html':u'', - u'end tag':u'{/pk}', u'end html':u'', u'protected':False}) -html_expands.append({u'desc':u'Orange', u'start tag':u'{o}', - u'start html':u'', - u'end tag':u'{/o}', u'end html':u'', u'protected':False}) -html_expands.append({u'desc':u'Purple', u'start tag':u'{pp}', - u'start html':u'', - u'end tag':u'{/pp}', u'end html':u'', u'protected':False}) -html_expands.append({u'desc':u'White', u'start tag':u'{w}', - u'start html':u'', - u'end tag':u'{/w}', u'end html':u'', u'protected':False}) -html_expands.append({u'desc':u'Superscript', u'start tag':u'{su}', - u'start html':u'', u'end tag':u'{/su}', u'end html':u'', - u'protected':True}) -html_expands.append({u'desc':u'Subscript', u'start tag':u'{sb}', - u'start html':u'', u'end tag':u'{/sb}', u'end html':u'', - u'protected':True}) -html_expands.append({u'desc':u'Paragraph', u'start tag':u'{p}', - u'start html':u'

', u'end tag':u'{/p}', u'end html':u'

', - u'protected':True}) -html_expands.append({u'desc':u'Bold', u'start tag':u'{st}', - u'start html':u'', u'end tag':u'{/st}', u'end html':u'', - u'protected':True}) -html_expands.append({u'desc':u'Italics', u'start tag':u'{it}', - u'start html':u'', u'end tag':u'{/it}', u'end html':u'', - u'protected':True}) +html_expands.append({u'desc': u'Red', u'start tag': u'{r}', + u'start html': u'', + u'end tag': u'{/r}', u'end html': u'', u'protected': False}) +html_expands.append({u'desc': u'Black', u'start tag': u'{b}', + u'start html': u'', + u'end tag': u'{/b}', u'end html': u'', u'protected': False}) +html_expands.append({u'desc': u'Blue', u'start tag': u'{bl}', + u'start html': u'', + u'end tag': u'{/bl}', u'end html': u'', u'protected': False}) +html_expands.append({u'desc': u'Yellow', u'start tag': u'{y}', + u'start html': u'', + u'end tag': u'{/y}', u'end html': u'', u'protected': False}) +html_expands.append({u'desc': u'Green', u'start tag': u'{g}', + u'start html': u'', + u'end tag': u'{/g}', u'end html': u'', u'protected': False}) +html_expands.append({u'desc': u'Pink', u'start tag': u'{pk}', + u'start html': u'', + u'end tag': u'{/pk}', u'end html': u'', u'protected': False}) +html_expands.append({u'desc': u'Orange', u'start tag': u'{o}', + u'start html': u'', + u'end tag': u'{/o}', u'end html': u'', u'protected': False}) +html_expands.append({u'desc': u'Purple', u'start tag': u'{pp}', + u'start html': u'', + u'end tag': u'{/pp}', u'end html': u'', u'protected': False}) +html_expands.append({u'desc': u'White', u'start tag': u'{w}', + u'start html': u'', + u'end tag': u'{/w}', u'end html': u'', u'protected': False}) +html_expands.append({u'desc': u'Superscript', u'start tag': u'{su}', + u'start html': u'', u'end tag': u'{/su}', u'end html': u'', + u'protected': True}) +html_expands.append({u'desc': u'Subscript', u'start tag': u'{sb}', + u'start html': u'', u'end tag': u'{/sb}', u'end html': u'', + u'protected': True}) +html_expands.append({u'desc': u'Paragraph', u'start tag': u'{p}', + u'start html': u'

', u'end tag': u'{/p}', u'end html': u'

', + u'protected': True}) +html_expands.append({u'desc': u'Bold', u'start tag': u'{st}', + u'start html': u'', u'end tag': u'{/st}', u'end html': u'', + u'protected': True}) +html_expands.append({u'desc': u'Italics', u'start tag': u'{it}', + u'start html': u'', u'end tag': u'{/it}', u'end html': u'', + u'protected': True}) +html_expands.append({u'desc': u'Underline', u'start tag': u'{u}', + u'start html': u'', u'end tag': u'{/u}', u'end html': u'', + u'protected': True}) def translate(context, text, comment=None): """ diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index 2d601fbb0..e089d316f 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -141,8 +141,8 @@ class SongBeamerImport(SongImport): (u'', u'{/st}'), (u'', u'{it}'), (u'', u'{/it}'), - (u'', u''), - (u'', u''), + (u'', u'{u}'), + (u'', u'{/u}'), (u'
', u'{st}'), (u'
', u'{st}'), (u'', u'{st}'), From 4d1b88072fc8f18a55d9db21c935e77d472c8954 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 26 Nov 2010 17:30:04 +0100 Subject: [PATCH 21/40] fixed reStructuredText --- openlp/plugins/songs/lib/songbeamerimport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index e089d316f..eca92aa79 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -165,7 +165,7 @@ class SongBeamerImport(SongImport): ``line`` The line in the file. It should consist of a tag and a value - for this tag. (unicode) + for this tag (unicode):: u'#Title=Nearer my God to Thee' """ From 7889a228107074772fa1418891af9ef322510d15 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 27 Nov 2010 22:12:52 +0100 Subject: [PATCH 22/40] fixed

tag, replaced the tag and another fix --- openlp/core/lib/__init__.py | 4 ++-- openlp/plugins/songs/lib/songbeamerimport.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index eb7213c16..a90a4c194 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -81,8 +81,8 @@ html_expands.append({u'desc': u'Italics', u'start tag': u'{it}', u'start html': u'', u'end tag': u'{/it}', u'end html': u'', u'protected': True}) html_expands.append({u'desc': u'Underline', u'start tag': u'{u}', - u'start html': u'', u'end tag': u'{/u}', u'end html': u'', - u'protected': True}) + u'start html': u'', + u'end tag': u'{/u}', u'end html': u'', u'protected': True}) def translate(context, text, comment=None): """ diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index eca92aa79..a743faafc 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -146,7 +146,7 @@ class SongBeamerImport(SongImport): (u'
', u'{st}'), (u'
', u'{st}'), (u'', u'{st}'), - (u'

', u'{/p}'), + (u'

', u'{p}'), (u'

', u'{/p}'), (u'', u'{su}'), (u'', u'{/su}'), @@ -156,7 +156,7 @@ class SongBeamerImport(SongImport): (u'', u'') ] for pair in tag_pairs: - self.current_verse.replace(pair[0], pair[1]) + self.current_verse = self.current_verse.replace(pair[0], pair[1]) # TODO: check for unsupported tags (see wiki) and remove them as well. def parse_tags(self, line): From 3a13ebdce76e963160a8a12ebd128592c0718ce9 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 28 Nov 2010 14:41:50 +0100 Subject: [PATCH 23/40] remove strike tags in songBeamer files; decent check for digits --- openlp/plugins/songs/lib/songbeamerimport.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index a743faafc..44e8805c9 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -153,7 +153,9 @@ class SongBeamerImport(SongImport): (u'', u'{sb}'), (u'', u'{/sb}'), (u'', u''), - (u'', u'') + (u'', u''), + (u'', u''), + (u'', u'') ] for pair in tag_pairs: self.current_verse = self.current_verse.replace(pair[0], pair[1]) @@ -264,8 +266,8 @@ class SongBeamerImport(SongImport): def check_verse_marks(self, line): """ - Check and add the verse's MarkType. Returns ``True`` if the given mark - is correct otherwise ``False``. + Check and add the verse's MarkType. Returns ``True`` if the given line + contains a correct verse mark otherwise ``False``. ``line`` The line to check for marks (unicode). @@ -275,10 +277,8 @@ class SongBeamerImport(SongImport): self.current_verse_type = SongBeamerTypes.MarkTypes[marks[0]] if len(marks) == 2: # If we have a digit, we append it to current_verse_type. - try: - self.current_verse_type += u'%s' % int(marks[1]) - except ValueError: - pass + if marks[1].isdigit(): + self.current_verse_type += marks[1] return True else: return False From 28390e965da29dd530b06cea48bf1cbccfed1903 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 29 Nov 2010 20:02:58 +0100 Subject: [PATCH 24/40] enable search button --- openlp/plugins/bibles/lib/mediaitem.py | 39 +++++++++++++++----------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index a94ea581a..e9c5d1bdb 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -359,6 +359,7 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'No Book Found'), translate('BiblesPlugin.MediaItem', 'No matching book could be found in this Bible.')) + self.AdvancedSearchButton.setEnabled(True) def onImportClick(self): if not hasattr(self, u'import_wizard'): @@ -619,23 +620,27 @@ class BibleMediaItem(MediaManagerItem): second_permissions = u'' for count, verse in enumerate(self.search_results): if second_bible: - vdict = { - 'book': QtCore.QVariant(verse.book.name), - 'chapter': QtCore.QVariant(verse.chapter), - 'verse': QtCore.QVariant(verse.verse), - 'bible': QtCore.QVariant(bible), - 'version': QtCore.QVariant(version.value), - 'copyright': QtCore.QVariant(copyright.value), - 'permissions': QtCore.QVariant(permissions.value), - 'text': QtCore.QVariant(verse.text), - 'second_bible': QtCore.QVariant(second_bible), - 'second_version': QtCore.QVariant(second_version.value), - 'second_copyright': QtCore.QVariant(second_copyright.value), - 'second_permissions': QtCore.QVariant( - second_permissions.value), - 'second_text': QtCore.QVariant( - self.second_search_results[count].text) - } + try: + vdict = { + 'book': QtCore.QVariant(verse.book.name), + 'chapter': QtCore.QVariant(verse.chapter), + 'verse': QtCore.QVariant(verse.verse), + 'bible': QtCore.QVariant(bible), + 'version': QtCore.QVariant(version.value), + 'copyright': QtCore.QVariant(copyright.value), + 'permissions': QtCore.QVariant(permissions.value), + 'text': QtCore.QVariant(verse.text), + 'second_bible': QtCore.QVariant(second_bible), + 'second_version': QtCore.QVariant(second_version.value), + 'second_copyright': QtCore.QVariant( + second_copyright.value), + 'second_permissions': QtCore.QVariant( + second_permissions.value), + 'second_text': QtCore.QVariant( + self.second_search_results[count].text) + } + except IndexError: + break bible_text = u' %s %d:%d (%s, %s)' % (verse.book.name, verse.chapter, verse.verse, version.value, second_version.value) From cd6948f61335cf5c05b25fe111b0cbd1e9a0af27 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 1 Dec 2010 19:37:54 +0100 Subject: [PATCH 25/40] added an autoCompleter for bible books for 'Verse Search' --- openlp/plugins/bibles/lib/mediaitem.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index e9c5d1bdb..6ea18dfe2 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -240,6 +240,10 @@ class BibleMediaItem(MediaManagerItem): QtCore.SIGNAL(u'activated(int)'), self.onAdvancedFromVerse) QtCore.QObject.connect(self.AdvancedToChapter, QtCore.SIGNAL(u'activated(int)'), self.onAdvancedToChapter) + QtCore.QObject.connect(self.QuickSearchComboBox, + QtCore.SIGNAL(u'activated(int)'), self.autoCompletion) + QtCore.QObject.connect(self.QuickVersionComboBox, + QtCore.SIGNAL(u'activated(int)'), self.autoCompletion) # Buttons QtCore.QObject.connect(self.AdvancedSearchButton, QtCore.SIGNAL(u'pressed()'), self.onAdvancedSearchButton) @@ -428,6 +432,21 @@ class BibleMediaItem(MediaManagerItem): self.adjustComboBox(1, verse_count, self.AdvancedFromVerse) self.adjustComboBox(1, verse_count, self.AdvancedToVerse) + def autoCompletion(self): + """ + This add or updates a bible book completion list for the search field. + The completion depends on the bible. It is only added when we are doing + a verse search on the quick tab, otherwise it is removed. + """ + books = [] + # We have to do a 'Verse Search'. + if self.QuickSearchComboBox.currentIndex() == 0: + bible = unicode(self.QuickVersionComboBox.currentText()) + if bible: + book_data = self.parent.manager.get_books(bible) + books = [book[u'name'] for book in book_data] + self.QuickSearchEdit.setCompleter(QtGui.QCompleter(books)) + def onAdvancedVersionComboBox(self): self.initialiseBible( unicode(self.AdvancedVersionComboBox.currentText())) From ada84d935270a0eb4fda72872af2ddc6e17c3cf3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 2 Dec 2010 14:37:38 +0000 Subject: [PATCH 26/40] pylint fixes part 1 --- openlp/core/lib/htmlbuilder.py | 14 +- openlp/core/lib/imagemanager.py | 4 +- openlp/core/lib/mediamanageritem.py | 2 +- openlp/core/lib/settingstab.py | 6 +- openlp/core/lib/spelltextedit.py | 23 +- openlp/core/lib/theme.py | 17 +- openlp/core/ui/amendthemedialog.py | 799 ---------------------------- openlp/core/ui/amendthemeform.py | 722 ------------------------- openlp/core/ui/maindisplay.py | 2 +- openlp/core/ui/mainwindow.py | 6 +- openlp/core/ui/thememanager.py | 3 +- openlp/core/ui/themewizard.py | 264 ++++++--- 12 files changed, 222 insertions(+), 1640 deletions(-) delete mode 100644 openlp/core/ui/amendthemedialog.py delete mode 100644 openlp/core/ui/amendthemeform.py diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index b2f46e655..9bbaa65d1 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -371,7 +371,8 @@ def build_background_css(item, width, height): theme = item.themedata background = u'background-color: black' if theme: - if theme.background_type == BackgroundType.to_string(BackgroundType.Solid): + if theme.background_type == \ + BackgroundType.to_string(BackgroundType.Solid): background = u'background-color: %s' % theme.background_color else: if theme.background_direction == BackgroundGradientType.to_string \ @@ -381,21 +382,24 @@ def build_background_css(item, width, height): u'-webkit-gradient(linear, left top, left bottom, ' \ 'from(%s), to(%s))' % (theme.background_start_color, theme.background_end_color) - elif theme.background_direction == BackgroundGradientType.to_string \ - (BackgroundGradientType.LeftTop): + elif theme.background_direction == \ + BackgroundGradientType.to_string( \ + BackgroundGradientType.LeftTop): background = \ u'background: ' \ u'-webkit-gradient(linear, left top, right bottom, ' \ 'from(%s), to(%s))' % (theme.background_start_color, theme.background_end_color) - elif theme.background_direction == BackgroundGradientType.to_string \ + elif theme.background_direction == \ + BackgroundGradientType.to_string \ (BackgroundGradientType.LeftBottom): background = \ u'background: ' \ u'-webkit-gradient(linear, left bottom, right top, ' \ 'from(%s), to(%s))' % (theme.background_start_color, theme.background_end_color) - elif theme.background_direction == BackgroundGradientType.to_string \ + elif theme.background_direction == \ + BackgroundGradientType.to_string \ (BackgroundGradientType.Vertical): background = \ u'background: -webkit-gradient(linear, left top, ' \ diff --git a/openlp/core/lib/imagemanager.py b/openlp/core/lib/imagemanager.py index 0e0660bda..307ee84df 100644 --- a/openlp/core/lib/imagemanager.py +++ b/openlp/core/lib/imagemanager.py @@ -46,13 +46,13 @@ class ImageThread(QtCore.QThread): """ def __init__(self, manager): QtCore.QThread.__init__(self, None) - self.image_mamager = manager + self.imageManager = manager def run(self): """ Run the thread. """ - self.image_mamager.process() + self.imageManager.process() class Image(object): diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 130da0c0e..acf24ae22 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -508,7 +508,7 @@ class MediaManagerItem(QtGui.QWidget): log.debug(self.plugin.name + u' Add requested') serviceItem = self.parent.serviceManager.getServiceItem() if not serviceItem: - QtGui.QMessageBox.information(self, + QtGui.QMessageBox.information(self, translate('OpenLP.MediaManagerItem', 'No Service Item Selected'), translate('OpenLP.MediaManagerItem', diff --git a/openlp/core/lib/settingstab.py b/openlp/core/lib/settingstab.py index 8de42e7a0..048751006 100644 --- a/openlp/core/lib/settingstab.py +++ b/openlp/core/lib/settingstab.py @@ -87,8 +87,12 @@ class SettingsTab(QtGui.QWidget): """ pass - def postSetUp(self): + def postSetUp(self, postUpdate=False): """ Changes which need to be made after setup of application + + ``postUpdate`` + Indicates if called before or after updates. + """ pass diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py index 603197c07..76271b6a7 100644 --- a/openlp/core/lib/spelltextedit.py +++ b/openlp/core/lib/spelltextedit.py @@ -33,12 +33,15 @@ except ImportError: enchant_available = False # based on code from -# http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/ +# http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check from PyQt4 import QtCore, QtGui from openlp.core.lib import html_expands, translate class SpellTextEdit(QtGui.QPlainTextEdit): + """ + Spell checking widget based on QPlanTextEdit. + """ def __init__(self, *args): QtGui.QPlainTextEdit.__init__(self, *args) # Default dictionary based on the current locale. @@ -60,7 +63,7 @@ class SpellTextEdit(QtGui.QPlainTextEdit): QtGui.QPlainTextEdit.mousePressEvent(self, event) def contextMenuEvent(self, event): - popup_menu = self.createStandardContextMenu() + popupMenu = self.createStandardContextMenu() # Select the word under the cursor. cursor = self.textCursor() # only select text if not already selected @@ -81,17 +84,17 @@ class SpellTextEdit(QtGui.QPlainTextEdit): # Only add the spelling suggests to the menu if there are # suggestions. if len(spell_menu.actions()) != 0: - popup_menu.insertSeparator(popup_menu.actions()[0]) - popup_menu.insertMenu(popup_menu.actions()[0], spell_menu) - tag_menu = QtGui.QMenu(translate('OpenLP.SpellTextEdit', + popupMenu.insertSeparator(popupMenu.actions()[0]) + popupMenu.insertMenu(popupMenu.actions()[0], spell_menu) + tagMenu = QtGui.QMenu(translate('OpenLP.SpellTextEdit', 'Formatting Tags')) for html in html_expands: - action = SpellAction( html[u'desc'], tag_menu) + action = SpellAction( html[u'desc'], tagMenu) action.correct.connect(self.htmlTag) - tag_menu.addAction(action) - popup_menu.insertSeparator(popup_menu.actions()[0]) - popup_menu.insertMenu(popup_menu.actions()[0], tag_menu) - popup_menu.exec_(event.globalPos()) + tagMenu.addAction(action) + popupMenu.insertSeparator(popupMenu.actions()[0]) + popupMenu.insertMenu(popupMenu.actions()[0], tagMenu) + popupMenu.exec_(event.globalPos()) def correctWord(self, word): """ diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py index f211048e3..db31f54da 100644 --- a/openlp/core/lib/theme.py +++ b/openlp/core/lib/theme.py @@ -261,8 +261,9 @@ class ThemeXML(object): def add_font(self, name, color, size, override, fonttype=u'main', bold=u'False', italics=u'False', line_adjustment=0, - xpos=0, ypos=0, width=0, height=0 , outline=u'False', outline_color=u'#ffffff', - outline_pixel=2, shadow=u'False', shadow_color=u'#ffffff', shadow_pixel=5): + xpos=0, ypos=0, width=0, height=0 , outline=u'False', + outline_color=u'#ffffff', outline_pixel=2, shadow=u'False', + shadow_color=u'#ffffff', shadow_pixel=5): """ Add a Font. @@ -441,7 +442,7 @@ class ThemeXML(object): if line: xml = xml[line + 2:] try: - theme_xml = objectify.fromstring(xml) + theme_xml = objectify.fromstring(xml) except etree.XMLSyntaxError: log.exception(u'Invalid xml %s', xml) return @@ -457,7 +458,8 @@ class ThemeXML(object): if element.getparent().tag == u'display': if element.tag.startswith(u'shadow') or \ element.tag.startswith(u'outline'): - self._create_attr(u'font_main', element.tag, element.text) + self._create_attr(u'font_main', element.tag, + element.text) master = element.getparent().tag if element.getparent().tag == u'background': master = element.getparent().tag @@ -471,7 +473,8 @@ class ThemeXML(object): for attr in element.attrib: base_element = attr # correction for the shadow and outline tags - if element.tag == u'shadow' or element.tag == u'outline': + if element.tag == u'shadow' or \ + element.tag == u'outline': if not attr.startswith(element.tag): base_element = element.tag + u'_' + attr self._create_attr(master, base_element, @@ -540,8 +543,8 @@ class ThemeXML(object): """ Change Camel Case string to python string """ - s1 = re.sub(u'(.)([A-Z][a-z]+)', r'\1_\2', name) - return re.sub(u'([a-z0-9])([A-Z])', r'\1_\2', s1).lower() + sub_name = re.sub(u'(.)([A-Z][a-z]+)', r'\1_\2', name) + return re.sub(u'([a-z0-9])([A-Z])', r'\1_\2', sub_name).lower() def _build_xml_from_attrs(self): """ diff --git a/openlp/core/ui/amendthemedialog.py b/openlp/core/ui/amendthemedialog.py deleted file mode 100644 index b77c9cfff..000000000 --- a/openlp/core/ui/amendthemedialog.py +++ /dev/null @@ -1,799 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import build_icon, translate - -class Ui_AmendThemeDialog(object): - def setupUi(self, amendThemeDialog): - amendThemeDialog.setObjectName(u'amendThemeDialog') - amendThemeDialog.setWindowModality(QtCore.Qt.ApplicationModal) - amendThemeDialog.resize(586, 651) - icon = build_icon(u':/icon/openlp-logo-16x16.png') - amendThemeDialog.setWindowIcon(icon) - amendThemeDialog.setModal(True) - self.amendThemeLayout = QtGui.QVBoxLayout(amendThemeDialog) - self.amendThemeLayout.setSpacing(8) - self.amendThemeLayout.setMargin(8) - self.amendThemeLayout.setObjectName(u'amendThemeLayout') - self.themeNameWidget = QtGui.QWidget(amendThemeDialog) - self.themeNameWidget.setObjectName(u'themeNameWidget') - self.themeNameLayout = QtGui.QHBoxLayout(self.themeNameWidget) - self.themeNameLayout.setSpacing(8) - self.themeNameLayout.setMargin(0) - self.themeNameLayout.setObjectName(u'themeNameLayout') - self.themeNameLabel = QtGui.QLabel(self.themeNameWidget) - self.themeNameLabel.setObjectName(u'themeNameLabel') - self.themeNameLayout.addWidget(self.themeNameLabel) - self.themeNameEdit = QtGui.QLineEdit(self.themeNameWidget) - self.themeNameEdit.setObjectName(u'themeNameEdit') - self.themeNameLabel.setBuddy(self.themeNameEdit) - self.themeNameLayout.addWidget(self.themeNameEdit) - self.amendThemeLayout.addWidget(self.themeNameWidget) - self.contentWidget = QtGui.QWidget(amendThemeDialog) - self.contentWidget.setObjectName(u'contentWidget') - self.contentLayout = QtGui.QHBoxLayout(self.contentWidget) - self.contentLayout.setSpacing(8) - self.contentLayout.setMargin(0) - self.contentLayout.setObjectName(u'contentLayout') - self.themeTabWidget = QtGui.QTabWidget(self.contentWidget) - self.themeTabWidget.setObjectName(u'themeTabWidget') - self.backgroundTab = QtGui.QWidget() - self.backgroundTab.setObjectName(u'backgroundTab') - self.backgroundLayout = QtGui.QFormLayout(self.backgroundTab) - self.backgroundLayout.setMargin(8) - self.backgroundLayout.setSpacing(8) - self.backgroundLayout.setObjectName(u'backgroundLayout') - self.backgroundTypeLabel = QtGui.QLabel(self.backgroundTab) - self.backgroundTypeLabel.setObjectName(u'backgroundTypeLabel') - self.backgroundLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.backgroundTypeLabel) - self.backgroundTypeComboBox = QtGui.QComboBox(self.backgroundTab) - self.backgroundTypeComboBox.setObjectName(u'backgroundTypeComboBox') - self.backgroundTypeComboBox.addItem(QtCore.QString()) - self.backgroundTypeComboBox.addItem(QtCore.QString()) - self.backgroundTypeComboBox.addItem(QtCore.QString()) - self.backgroundLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.backgroundTypeComboBox) - self.color1Label = QtGui.QLabel(self.backgroundTab) - self.color1Label.setObjectName(u'color1Label') - self.backgroundLayout.setWidget(2, QtGui.QFormLayout.LabelRole, - self.color1Label) - self.color1PushButton = QtGui.QPushButton(self.backgroundTab) - self.color1PushButton.setObjectName(u'color1PushButton') - self.backgroundLayout.setWidget(2, QtGui.QFormLayout.FieldRole, - self.color1PushButton) - self.color2Label = QtGui.QLabel(self.backgroundTab) - self.color2Label.setObjectName(u'color2Label') - self.backgroundLayout.setWidget(3, QtGui.QFormLayout.LabelRole, - self.color2Label) - self.color2PushButton = QtGui.QPushButton(self.backgroundTab) - self.color2PushButton.setObjectName(u'color2PushButton') - self.backgroundLayout.setWidget(3, QtGui.QFormLayout.FieldRole, - self.color2PushButton) - self.imageLabel = QtGui.QLabel(self.backgroundTab) - self.imageLabel.setObjectName(u'imageLabel') - self.backgroundLayout.setWidget(4, QtGui.QFormLayout.LabelRole, - self.imageLabel) - self.gradientLabel = QtGui.QLabel(self.backgroundTab) - self.gradientLabel.setObjectName(u'gradientLabel') - self.backgroundLayout.setWidget(6, QtGui.QFormLayout.LabelRole, - self.gradientLabel) - self.gradientComboBox = QtGui.QComboBox(self.backgroundTab) - self.gradientComboBox.setObjectName(u'gradientComboBox') - self.gradientComboBox.addItem(QtCore.QString()) - self.gradientComboBox.addItem(QtCore.QString()) - self.gradientComboBox.addItem(QtCore.QString()) - self.backgroundLayout.setWidget(6, QtGui.QFormLayout.FieldRole, - self.gradientComboBox) - self.imageFilenameWidget = QtGui.QWidget(self.backgroundTab) - self.imageFilenameWidget.setObjectName(u'imageFilenameWidget') - self.horizontalLayout2 = QtGui.QHBoxLayout(self.imageFilenameWidget) - self.horizontalLayout2.setSpacing(0) - self.horizontalLayout2.setMargin(0) - self.horizontalLayout2.setObjectName(u'horizontalLayout2') - self.imageLineEdit = QtGui.QLineEdit(self.imageFilenameWidget) - self.imageLineEdit.setObjectName(u'imageLineEdit') - self.horizontalLayout2.addWidget(self.imageLineEdit) - self.imageToolButton = QtGui.QToolButton(self.imageFilenameWidget) - self.imageToolButton.setIcon(build_icon(u':/general/general_open.png')) - self.imageToolButton.setObjectName(u'imageToolButton') - self.imageToolButton.setAutoRaise(True) - self.horizontalLayout2.addWidget(self.imageToolButton) - self.backgroundLayout.setWidget(4, QtGui.QFormLayout.FieldRole, - self.imageFilenameWidget) - self.themeTabWidget.addTab(self.backgroundTab, u'') - self.fontMainTab = QtGui.QWidget() - self.fontMainTab.setObjectName(u'fontMainTab') - self.fontMainLayout = QtGui.QHBoxLayout(self.fontMainTab) - self.fontMainLayout.setSpacing(8) - self.fontMainLayout.setMargin(8) - self.fontMainLayout.setObjectName(u'fontMainLayout') - self.mainLeftWidget = QtGui.QWidget(self.fontMainTab) - self.mainLeftWidget.setObjectName(u'mainLeftWidget') - self.mainLeftLayout = QtGui.QVBoxLayout(self.mainLeftWidget) - self.mainLeftLayout.setSpacing(8) - self.mainLeftLayout.setMargin(0) - self.mainLeftLayout.setObjectName(u'mainLeftLayout') - self.fontMainGroupBox = QtGui.QGroupBox(self.mainLeftWidget) - self.fontMainGroupBox.setObjectName(u'fontMainGroupBox') - self.mainFontLayout = QtGui.QFormLayout(self.fontMainGroupBox) - self.mainFontLayout.setFormAlignment(QtCore.Qt.AlignLeading | - QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) - self.mainFontLayout.setMargin(8) - self.mainFontLayout.setSpacing(8) - self.mainFontLayout.setObjectName(u'mainFontLayout') - self.fontMainlabel = QtGui.QLabel(self.fontMainGroupBox) - self.fontMainlabel.setObjectName(u'fontMainlabel') - self.mainFontLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.fontMainlabel) - self.fontMainComboBox = QtGui.QFontComboBox(self.fontMainGroupBox) - self.fontMainComboBox.setObjectName(u'fontMainComboBox') - self.mainFontLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.fontMainComboBox) - self.fontMainColorLabel = QtGui.QLabel(self.fontMainGroupBox) - self.fontMainColorLabel.setObjectName(u'fontMainColorLabel') - self.mainFontLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.fontMainColorLabel) - self.fontMainColorPushButton = QtGui.QPushButton(self.fontMainGroupBox) - self.fontMainColorPushButton.setObjectName(u'fontMainColorPushButton') - self.mainFontLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.fontMainColorPushButton) - self.fontMainSize = QtGui.QLabel(self.fontMainGroupBox) - self.fontMainSize.setObjectName(u'fontMainSize') - self.mainFontLayout.setWidget(2, QtGui.QFormLayout.LabelRole, - self.fontMainSize) - self.fontMainSizeSpinBox = QtGui.QSpinBox(self.fontMainGroupBox) - defaultSizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Fixed) - defaultSizePolicy.setHeightForWidth( - self.fontMainSizeSpinBox.sizePolicy().hasHeightForWidth()) - self.fontMainSizeSpinBox.setSizePolicy(defaultSizePolicy) - self.fontMainSizeSpinBox.setMinimumSize(QtCore.QSize(70, 0)) - self.fontMainSizeSpinBox.setProperty(u'value', QtCore.QVariant(16)) - self.fontMainSizeSpinBox.setMaximum(999) - self.fontMainSizeSpinBox.setObjectName(u'fontMainSizeSpinBox') - self.mainFontLayout.setWidget(2, QtGui.QFormLayout.FieldRole, - self.fontMainSizeSpinBox) - self.fontMainWeightComboBox = QtGui.QComboBox(self.fontMainGroupBox) - self.fontMainWeightComboBox.setObjectName(u'fontMainWeightComboBox') - self.fontMainWeightComboBox.addItem(QtCore.QString()) - self.fontMainWeightComboBox.addItem(QtCore.QString()) - self.fontMainWeightComboBox.addItem(QtCore.QString()) - self.fontMainWeightComboBox.addItem(QtCore.QString()) - self.mainFontLayout.setWidget(3, QtGui.QFormLayout.FieldRole, - self.fontMainWeightComboBox) - self.fontMainWeightLabel = QtGui.QLabel(self.fontMainGroupBox) - self.fontMainWeightLabel.setObjectName(u'fontMainWeightLabel') - self.mainFontLayout.setWidget(3, QtGui.QFormLayout.LabelRole, - self.fontMainWeightLabel) - self.mainLeftLayout.addWidget(self.fontMainGroupBox) - self.fontMainWrapLineAdjustmentLabel = QtGui.QLabel( - self.fontMainGroupBox) - self.fontMainWrapLineAdjustmentLabel.setObjectName( - u'fontMainWrapLineAdjustmentLabel') - self.mainFontLayout.setWidget(4, QtGui.QFormLayout.LabelRole, - self.fontMainWrapLineAdjustmentLabel) - self.fontMainLineAdjustmentSpinBox = QtGui.QSpinBox( - self.fontMainGroupBox) - self.fontMainLineAdjustmentSpinBox.setObjectName( - u'fontMainLineAdjustmentSpinBox') - self.fontMainLineAdjustmentSpinBox.setMinimum(-99) - self.mainFontLayout.setWidget(4, QtGui.QFormLayout.FieldRole, - self.fontMainLineAdjustmentSpinBox) - self.fontMainLinesPageLabel = QtGui.QLabel(self.fontMainGroupBox) - self.fontMainLinesPageLabel.setObjectName(u'fontMainLinesPageLabel') - self.mainFontLayout.addRow(self.fontMainLinesPageLabel) - spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - self.mainLeftLayout.addItem(spacerItem1) - self.fontMainLayout.addWidget(self.mainLeftWidget) - self.mainRightWidget = QtGui.QWidget(self.fontMainTab) - self.mainRightWidget.setObjectName(u'mainRightWidget') - self.mainRightLayout = QtGui.QVBoxLayout(self.mainRightWidget) - self.mainRightLayout.setSpacing(8) - self.mainRightLayout.setMargin(0) - self.mainRightLayout.setObjectName(u'mainRightLayout') - self.mainLocationGroupBox = QtGui.QGroupBox(self.mainRightWidget) - self.mainLocationGroupBox.setObjectName(u'mainLocationGroupBox') - self.mainLocationLayout = QtGui.QFormLayout(self.mainLocationGroupBox) - self.mainLocationLayout.setMargin(8) - self.mainLocationLayout.setSpacing(8) - self.mainLocationLayout.setObjectName(u'mainLocationLayout') - self.defaultLocationLabel = QtGui.QLabel(self.mainLocationGroupBox) - self.defaultLocationLabel.setObjectName(u'defaultLocationLabel') - self.mainLocationLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.defaultLocationLabel) - self.fontMainDefaultCheckBox = QtGui.QCheckBox( - self.mainLocationGroupBox) - self.fontMainDefaultCheckBox.setTristate(False) - self.fontMainDefaultCheckBox.setObjectName(u'fontMainDefaultCheckBox') - self.mainLocationLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.fontMainDefaultCheckBox) - self.fontMainXLabel = QtGui.QLabel(self.mainLocationGroupBox) - self.fontMainXLabel.setObjectName(u'fontMainXLabel') - self.mainLocationLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.fontMainXLabel) - self.fontMainYLabel = QtGui.QLabel(self.mainLocationGroupBox) - self.fontMainYLabel.setObjectName(u'fontMainYLabel') - self.mainLocationLayout.setWidget(2, QtGui.QFormLayout.LabelRole, - self.fontMainYLabel) - self.fontMainWidthLabel = QtGui.QLabel(self.mainLocationGroupBox) - self.fontMainWidthLabel.setObjectName(u'fontMainWidthLabel') - self.mainLocationLayout.setWidget(3, QtGui.QFormLayout.LabelRole, - self.fontMainWidthLabel) - self.fontMainHeightLabel = QtGui.QLabel(self.mainLocationGroupBox) - self.fontMainHeightLabel.setObjectName(u'fontMainHeightLabel') - self.mainLocationLayout.setWidget(4, QtGui.QFormLayout.LabelRole, - self.fontMainHeightLabel) - self.fontMainXSpinBox = QtGui.QSpinBox(self.mainLocationGroupBox) - defaultSizePolicy.setHeightForWidth( - self.fontMainXSpinBox.sizePolicy().hasHeightForWidth()) - self.fontMainXSpinBox.setSizePolicy(defaultSizePolicy) - self.fontMainXSpinBox.setMinimumSize(QtCore.QSize(78, 0)) - self.fontMainXSpinBox.setProperty(u'value', QtCore.QVariant(0)) - self.fontMainXSpinBox.setMaximum(9999) - self.fontMainXSpinBox.setObjectName(u'fontMainXSpinBox') - self.mainLocationLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.fontMainXSpinBox) - self.fontMainYSpinBox = QtGui.QSpinBox(self.mainLocationGroupBox) - defaultSizePolicy.setHeightForWidth( - self.fontMainYSpinBox.sizePolicy().hasHeightForWidth()) - self.fontMainYSpinBox.setSizePolicy(defaultSizePolicy) - self.fontMainYSpinBox.setMinimumSize(QtCore.QSize(78, 0)) - self.fontMainYSpinBox.setMaximum(9999) - self.fontMainYSpinBox.setObjectName(u'fontMainYSpinBox') - self.mainLocationLayout.setWidget(2, QtGui.QFormLayout.FieldRole, - self.fontMainYSpinBox) - self.fontMainWidthSpinBox = QtGui.QSpinBox(self.mainLocationGroupBox) - defaultSizePolicy.setHeightForWidth( - self.fontMainWidthSpinBox.sizePolicy().hasHeightForWidth()) - self.fontMainWidthSpinBox.setSizePolicy(defaultSizePolicy) - self.fontMainWidthSpinBox.setMinimumSize(QtCore.QSize(78, 0)) - self.fontMainWidthSpinBox.setMaximum(9999) - self.fontMainWidthSpinBox.setObjectName(u'fontMainWidthSpinBox') - self.mainLocationLayout.setWidget(3, QtGui.QFormLayout.FieldRole, - self.fontMainWidthSpinBox) - self.fontMainHeightSpinBox = QtGui.QSpinBox(self.mainLocationGroupBox) - defaultSizePolicy.setHeightForWidth( - self.fontMainHeightSpinBox.sizePolicy().hasHeightForWidth()) - self.fontMainHeightSpinBox.setSizePolicy(defaultSizePolicy) - self.fontMainHeightSpinBox.setMinimumSize(QtCore.QSize(78, 0)) - self.fontMainHeightSpinBox.setMaximum(9999) - self.fontMainHeightSpinBox.setObjectName(u'fontMainHeightSpinBox') - self.mainLocationLayout.setWidget(4, QtGui.QFormLayout.FieldRole, - self.fontMainHeightSpinBox) - self.mainRightLayout.addWidget(self.mainLocationGroupBox) - spacerItem2 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - self.mainRightLayout.addItem(spacerItem2) - self.fontMainLayout.addWidget(self.mainRightWidget) - self.themeTabWidget.addTab(self.fontMainTab, u'') - self.fontFooterTab = QtGui.QWidget() - self.fontFooterTab.setObjectName(u'fontFooterTab') - self.fontFooterLayout = QtGui.QHBoxLayout(self.fontFooterTab) - self.fontFooterLayout.setSpacing(8) - self.fontFooterLayout.setMargin(8) - self.fontFooterLayout.setObjectName(u'fontFooterLayout') - self.footerLeftWidget = QtGui.QWidget(self.fontFooterTab) - self.footerLeftWidget.setObjectName(u'footerLeftWidget') - self.footerLeftLayout = QtGui.QVBoxLayout(self.footerLeftWidget) - self.footerLeftLayout.setSpacing(8) - self.footerLeftLayout.setMargin(0) - self.footerLeftLayout.setObjectName(u'footerLeftLayout') - self.footerFontGroupBox = QtGui.QGroupBox(self.footerLeftWidget) - self.footerFontGroupBox.setObjectName(u'footerFontGroupBox') - self.footerFontLayout = QtGui.QFormLayout(self.footerFontGroupBox) - self.footerFontLayout.setFieldGrowthPolicy( - QtGui.QFormLayout.ExpandingFieldsGrow) - self.footerFontLayout.setFormAlignment(QtCore.Qt.AlignLeading | - QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) - self.footerFontLayout.setMargin(8) - self.footerFontLayout.setSpacing(8) - self.footerFontLayout.setObjectName(u'footerFontLayout') - self.fontFooterLabel = QtGui.QLabel(self.footerFontGroupBox) - self.fontFooterLabel.setObjectName(u'fontFooterLabel') - self.footerFontLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.fontFooterLabel) - self.fontFooterComboBox = QtGui.QFontComboBox(self.footerFontGroupBox) - self.fontFooterComboBox.setObjectName(u'fontFooterComboBox') - self.footerFontLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.fontFooterComboBox) - self.fontFooterColorLabel = QtGui.QLabel(self.footerFontGroupBox) - self.fontFooterColorLabel.setObjectName(u'fontFooterColorLabel') - self.footerFontLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.fontFooterColorLabel) - self.fontFooterColorPushButton = QtGui.QPushButton( - self.footerFontGroupBox) - self.fontFooterColorPushButton.setObjectName( - u'fontFooterColorPushButton') - self.footerFontLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.fontFooterColorPushButton) - self.fontFooterSizeLabel = QtGui.QLabel(self.footerFontGroupBox) - self.fontFooterSizeLabel.setObjectName(u'fontFooterSizeLabel') - self.footerFontLayout.setWidget(2, QtGui.QFormLayout.LabelRole, - self.fontFooterSizeLabel) - self.fontFooterSizeSpinBox = QtGui.QSpinBox(self.footerFontGroupBox) - defaultSizePolicy.setHeightForWidth( - self.fontFooterSizeSpinBox.sizePolicy().hasHeightForWidth()) - self.fontFooterSizeSpinBox.setSizePolicy(defaultSizePolicy) - self.fontFooterSizeSpinBox.setMinimumSize(QtCore.QSize(70, 0)) - self.fontFooterSizeSpinBox.setProperty(u'value', QtCore.QVariant(10)) - self.fontFooterSizeSpinBox.setMaximum(999) - self.fontFooterSizeSpinBox.setObjectName(u'fontFooterSizeSpinBox') - self.footerFontLayout.setWidget(2, QtGui.QFormLayout.FieldRole, - self.fontFooterSizeSpinBox) - self.fontFooterWeightComboBox = QtGui.QComboBox(self.footerFontGroupBox) - self.fontFooterWeightComboBox.setObjectName(u'fontFooterWeightComboBox') - self.fontFooterWeightComboBox.addItem(QtCore.QString()) - self.fontFooterWeightComboBox.addItem(QtCore.QString()) - self.fontFooterWeightComboBox.addItem(QtCore.QString()) - self.fontFooterWeightComboBox.addItem(QtCore.QString()) - self.footerFontLayout.setWidget(3, QtGui.QFormLayout.FieldRole, - self.fontFooterWeightComboBox) - self.fontFooterWeightLabel = QtGui.QLabel(self.footerFontGroupBox) - self.fontFooterWeightLabel.setObjectName(u'fontFooterWeightLabel') - self.footerFontLayout.setWidget(3, QtGui.QFormLayout.LabelRole, - self.fontFooterWeightLabel) - self.footerLeftLayout.addWidget(self.footerFontGroupBox) - spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - self.footerLeftLayout.addItem(spacerItem3) - self.fontFooterLayout.addWidget(self.footerLeftWidget) - self.footerRightWidget = QtGui.QWidget(self.fontFooterTab) - self.footerRightWidget.setObjectName(u'footerRightWidget') - self.footerRightLayout = QtGui.QVBoxLayout(self.footerRightWidget) - self.footerRightLayout.setSpacing(8) - self.footerRightLayout.setMargin(0) - self.footerRightLayout.setObjectName(u'footerRightLayout') - self.locationFooterGroupBox = QtGui.QGroupBox(self.footerRightWidget) - self.locationFooterGroupBox.setObjectName(u'locationFooterGroupBox') - self.locationFooterLayout = QtGui.QFormLayout( - self.locationFooterGroupBox) - self.locationFooterLayout.setFieldGrowthPolicy( - QtGui.QFormLayout.ExpandingFieldsGrow) - self.locationFooterLayout.setFormAlignment(QtCore.Qt.AlignLeading | - QtCore.Qt.AlignLeft | QtCore.Qt.AlignVCenter) - self.locationFooterLayout.setMargin(8) - self.locationFooterLayout.setSpacing(8) - self.locationFooterLayout.setObjectName(u'locationFooterLayout') - self.fontFooterDefaultLabel = QtGui.QLabel(self.locationFooterGroupBox) - self.fontFooterDefaultLabel.setObjectName(u'fontFooterDefaultLabel') - self.locationFooterLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.fontFooterDefaultLabel) - self.fontFooterDefaultCheckBox = QtGui.QCheckBox( - self.locationFooterGroupBox) - self.fontFooterDefaultCheckBox.setTristate(False) - self.fontFooterDefaultCheckBox.setObjectName( - u'fontFooterDefaultCheckBox') - self.locationFooterLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.fontFooterDefaultCheckBox) - self.fontFooterXLabel = QtGui.QLabel(self.locationFooterGroupBox) - self.fontFooterXLabel.setObjectName(u'fontFooterXLabel') - self.locationFooterLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.fontFooterXLabel) - self.fontFooterYLabel = QtGui.QLabel(self.locationFooterGroupBox) - self.fontFooterYLabel.setObjectName(u'fontFooterYLabel') - self.locationFooterLayout.setWidget(2, QtGui.QFormLayout.LabelRole, - self.fontFooterYLabel) - self.fontFooterWidthLabel = QtGui.QLabel(self.locationFooterGroupBox) - self.fontFooterWidthLabel.setObjectName(u'fontFooterWidthLabel') - self.locationFooterLayout.setWidget(3, QtGui.QFormLayout.LabelRole, - self.fontFooterWidthLabel) - self.fontFooterHeightLabel = QtGui.QLabel(self.locationFooterGroupBox) - self.fontFooterHeightLabel.setObjectName(u'fontFooterHeightLabel') - self.locationFooterLayout.setWidget(4, QtGui.QFormLayout.LabelRole, - self.fontFooterHeightLabel) - self.fontFooterXSpinBox = QtGui.QSpinBox(self.locationFooterGroupBox) - defaultSizePolicy.setHeightForWidth( - self.fontFooterXSpinBox.sizePolicy().hasHeightForWidth()) - self.fontFooterXSpinBox.setSizePolicy(defaultSizePolicy) - self.fontFooterXSpinBox.setMinimumSize(QtCore.QSize(78, 0)) - self.fontFooterXSpinBox.setProperty(u'value', QtCore.QVariant(0)) - self.fontFooterXSpinBox.setMaximum(9999) - self.fontFooterXSpinBox.setObjectName(u'fontFooterXSpinBox') - self.locationFooterLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.fontFooterXSpinBox) - self.fontFooterYSpinBox = QtGui.QSpinBox(self.locationFooterGroupBox) - defaultSizePolicy.setHeightForWidth( - self.fontFooterXSpinBox.sizePolicy().hasHeightForWidth()) - self.fontFooterYSpinBox.setSizePolicy(defaultSizePolicy) - self.fontFooterYSpinBox.setMinimumSize(QtCore.QSize(78, 0)) - self.fontFooterYSpinBox.setProperty(u'value', QtCore.QVariant(0)) - self.fontFooterYSpinBox.setMaximum(9999) - self.fontFooterYSpinBox.setObjectName(u'fontFooterYSpinBox') - self.locationFooterLayout.setWidget(2, QtGui.QFormLayout.FieldRole, - self.fontFooterYSpinBox) - self.fontFooterWidthSpinBox = QtGui.QSpinBox( - self.locationFooterGroupBox) - self.fontFooterWidthSpinBox.setMinimumSize(QtCore.QSize(78, 0)) - self.fontFooterWidthSpinBox.setMaximum(9999) - self.fontFooterWidthSpinBox.setObjectName(u'fontFooterWidthSpinBox') - self.locationFooterLayout.setWidget(3, QtGui.QFormLayout.FieldRole, - self.fontFooterWidthSpinBox) - self.fontFooterHeightSpinBox = QtGui.QSpinBox( - self.locationFooterGroupBox) - self.fontFooterHeightSpinBox.setMinimumSize(QtCore.QSize(78, 0)) - self.fontFooterHeightSpinBox.setMaximum(9999) - self.fontFooterHeightSpinBox.setObjectName(u'fontFooterHeightSpinBox') - self.locationFooterLayout.setWidget(4, QtGui.QFormLayout.FieldRole, - self.fontFooterHeightSpinBox) - self.footerRightLayout.addWidget(self.locationFooterGroupBox) - spacerItem4 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - self.footerRightLayout.addItem(spacerItem4) - self.fontFooterLayout.addWidget(self.footerRightWidget) - self.themeTabWidget.addTab(self.fontFooterTab, u'') - self.otherOptionsTab = QtGui.QWidget() - self.otherOptionsTab.setObjectName(u'otherOptionsTab') - self.otherOptionsLayout = QtGui.QHBoxLayout(self.otherOptionsTab) - self.otherOptionsLayout.setSpacing(8) - self.otherOptionsLayout.setMargin(8) - self.otherOptionsLayout.setObjectName(u'otherOptionsLayout') - self.optionsLeftWidget = QtGui.QWidget(self.otherOptionsTab) - self.optionsLeftWidget.setObjectName(u'optionsLeftWidget') - self.optionsLeftLayout = QtGui.QVBoxLayout(self.optionsLeftWidget) - self.optionsLeftLayout.setSpacing(8) - self.optionsLeftLayout.setMargin(0) - self.optionsLeftLayout.setObjectName(u'optionsLeftLayout') - self.outlineGroupBox = QtGui.QGroupBox(self.optionsLeftWidget) - self.outlineGroupBox.setObjectName(u'outlineGroupBox') - self.verticalLayout = QtGui.QVBoxLayout(self.outlineGroupBox) - self.verticalLayout.setSpacing(8) - self.verticalLayout.setMargin(8) - self.verticalLayout.setObjectName(u'verticalLayout') - self.outlineWidget = QtGui.QWidget(self.outlineGroupBox) - self.outlineWidget.setObjectName(u'outlineWidget') - self.outlineLayout = QtGui.QFormLayout(self.outlineWidget) - self.outlineLayout.setMargin(0) - self.outlineLayout.setSpacing(8) - self.outlineLayout.setObjectName(u'outlineLayout') - self.outlineCheckBox = QtGui.QCheckBox(self.outlineWidget) - self.outlineCheckBox.setObjectName(u'outlineCheckBox') - self.outlineLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.outlineCheckBox) - self.outlineSpinBox = QtGui.QSpinBox(self.outlineWidget) - self.outlineSpinBox.setObjectName(u'outlineSpinBox') - self.outlineSpinBox.setMaximum(10) - self.outlineLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.outlineSpinBox) - self.outlineSpinBoxLabel = QtGui.QLabel(self.outlineWidget) - self.outlineSpinBoxLabel.setObjectName(u'outlineSpinBoxLabel') - self.outlineLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.outlineSpinBoxLabel) - self.outlineColorLabel = QtGui.QLabel(self.outlineWidget) - self.outlineColorLabel.setObjectName(u'outlineColorLabel') - self.outlineLayout.setWidget(2, QtGui.QFormLayout.LabelRole, - self.outlineColorLabel) - self.outlineColorPushButton = QtGui.QPushButton(self.outlineWidget) - self.outlineColorPushButton.setObjectName(u'outlineColorPushButton') - self.outlineLayout.setWidget(2, QtGui.QFormLayout.FieldRole, - self.outlineColorPushButton) - self.outlineEnabledLabel = QtGui.QLabel(self.outlineWidget) - self.outlineEnabledLabel.setObjectName(u'outlineEnabledLabel') - self.outlineLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.outlineEnabledLabel) - self.verticalLayout.addWidget(self.outlineWidget) - self.optionsLeftLayout.addWidget(self.outlineGroupBox) - self.shadowGroupBox = QtGui.QGroupBox(self.optionsLeftWidget) - self.shadowGroupBox.setObjectName(u'shadowGroupBox') - self.verticalLayout = QtGui.QVBoxLayout(self.shadowGroupBox) - self.verticalLayout.setSpacing(8) - self.verticalLayout.setMargin(8) - self.verticalLayout.setObjectName(u'verticalLayout') - self.shadowWidget = QtGui.QWidget(self.shadowGroupBox) - self.shadowWidget.setObjectName(u'shadowWidget') - self.shadowLayout = QtGui.QFormLayout(self.shadowWidget) - self.shadowLayout.setMargin(0) - self.shadowLayout.setSpacing(8) - self.shadowLayout.setObjectName(u'shadowLayout') - self.shadowCheckBox = QtGui.QCheckBox(self.shadowWidget) - self.shadowCheckBox.setObjectName(u'shadowCheckBox') - self.shadowLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.shadowCheckBox) - self.shadowSpinBox = QtGui.QSpinBox(self.outlineWidget) - self.shadowSpinBox.setObjectName(u'shadowSpinBox') - self.shadowSpinBox.setMaximum(10) - self.shadowLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.shadowSpinBox) - self.shadowSpinBoxLabel = QtGui.QLabel(self.outlineWidget) - self.shadowSpinBoxLabel.setObjectName(u'shadowSpinBoxLabel') - self.shadowLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.shadowSpinBoxLabel) - self.shadowColorLabel = QtGui.QLabel(self.shadowWidget) - self.shadowColorLabel.setObjectName(u'shadowColorLabel') - self.shadowLayout.setWidget(2, QtGui.QFormLayout.LabelRole, - self.shadowColorLabel) - self.shadowColorPushButton = QtGui.QPushButton(self.shadowWidget) - self.shadowColorPushButton.setObjectName(u'shadowColorPushButton') - self.shadowLayout.setWidget(2, QtGui.QFormLayout.FieldRole, - self.shadowColorPushButton) - self.shadowEnabledLabel = QtGui.QLabel(self.shadowWidget) - self.shadowEnabledLabel.setObjectName(u'shadowEnabledLabel') - self.shadowLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.shadowEnabledLabel) - self.verticalLayout.addWidget(self.shadowWidget) - self.optionsLeftLayout.addWidget(self.shadowGroupBox) - spacerItem5 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - self.optionsLeftLayout.addItem(spacerItem5) - self.otherOptionsLayout.addWidget(self.optionsLeftWidget) - self.optionsRightWidget = QtGui.QWidget(self.otherOptionsTab) - self.optionsRightWidget.setObjectName(u'optionsRightWidget') - self.optionsRightLayout = QtGui.QVBoxLayout(self.optionsRightWidget) - self.optionsRightLayout.setSpacing(8) - self.optionsRightLayout.setMargin(0) - self.optionsRightLayout.setObjectName(u'optionsRightLayout') - self.alignmentGroupBox = QtGui.QGroupBox(self.optionsRightWidget) - self.alignmentGroupBox.setObjectName(u'alignmentGroupBox') - self.gridLayout4 = QtGui.QGridLayout(self.alignmentGroupBox) - self.gridLayout4.setObjectName(u'gridLayout4') - self.horizontalLabel = QtGui.QLabel(self.alignmentGroupBox) - self.horizontalLabel.setObjectName(u'horizontalLabel') - self.gridLayout4.addWidget(self.horizontalLabel, 0, 0, 1, 1) - self.horizontalComboBox = QtGui.QComboBox(self.alignmentGroupBox) - self.horizontalComboBox.setObjectName(u'horizontalComboBox') - self.horizontalComboBox.addItem(QtCore.QString()) - self.horizontalComboBox.addItem(QtCore.QString()) - self.horizontalComboBox.addItem(QtCore.QString()) - self.gridLayout4.addWidget(self.horizontalComboBox, 0, 1, 1, 1) - self.verticalLabel = QtGui.QLabel(self.alignmentGroupBox) - self.verticalLabel.setObjectName(u'verticalLabel') - self.gridLayout4.addWidget(self.verticalLabel, 1, 0, 1, 1) - self.verticalComboBox = QtGui.QComboBox(self.alignmentGroupBox) - self.verticalComboBox.setObjectName(u'verticalComboBox') - self.verticalComboBox.addItem(QtCore.QString()) - self.verticalComboBox.addItem(QtCore.QString()) - self.verticalComboBox.addItem(QtCore.QString()) - self.gridLayout4.addWidget(self.verticalComboBox, 1, 1, 1, 1) - self.optionsRightLayout.addWidget(self.alignmentGroupBox) - self.transitionGroupBox = QtGui.QGroupBox(self.optionsRightWidget) - self.transitionGroupBox.setObjectName(u'transitionGroupBox') - self.gridLayout5 = QtGui.QGridLayout(self.transitionGroupBox) - self.gridLayout5.setObjectName(u'gridLayout5') - self.slideTransitionCheckBoxLabel = QtGui.QLabel( - self.transitionGroupBox) - self.slideTransitionCheckBoxLabel.setObjectName( - u'slideTransitionCheckBoxLabel') - self.gridLayout5.addWidget( - self.slideTransitionCheckBoxLabel, 0, 0, 1, 1) - self.slideTransitionCheckBox = QtGui.QCheckBox(self.alignmentGroupBox) - self.slideTransitionCheckBox.setTristate(False) - self.gridLayout5.addWidget(self.slideTransitionCheckBox, 0, 1, 1, 1) - self.optionsRightLayout.addWidget(self.transitionGroupBox) - spacerItem6 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - self.optionsRightLayout.addItem(spacerItem6) - self.otherOptionsLayout.addWidget(self.optionsRightWidget) - self.themeTabWidget.addTab(self.otherOptionsTab, u'') - self.contentLayout.addWidget(self.themeTabWidget) - self.amendThemeLayout.addWidget(self.contentWidget) - self.previewGroupBox = QtGui.QGroupBox(amendThemeDialog) - self.previewGroupBox.setObjectName(u'previewGroupBox') - self.themePreviewLayout = QtGui.QHBoxLayout(self.previewGroupBox) - self.themePreviewLayout.setSpacing(8) - self.themePreviewLayout.setMargin(8) - self.themePreviewLayout.setObjectName(u'themePreviewLayout') - spacerItem7 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, - QtGui.QSizePolicy.Expanding) - self.themePreviewLayout.addItem(spacerItem7) - self.themePreview = QtGui.QLabel(self.previewGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.themePreview.sizePolicy().hasHeightForWidth()) - self.themePreview.setSizePolicy(sizePolicy) - self.themePreview.setMaximumSize(QtCore.QSize(300, 225)) - self.themePreview.setFrameShape(QtGui.QFrame.WinPanel) - self.themePreview.setFrameShadow(QtGui.QFrame.Sunken) - self.themePreview.setLineWidth(1) - self.themePreview.setScaledContents(True) - self.themePreview.setObjectName(u'themePreview') - self.themePreviewLayout.addWidget(self.themePreview) - spacerItem8 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, - QtGui.QSizePolicy.Expanding) - self.themePreviewLayout.addItem(spacerItem8) - self.amendThemeLayout.addWidget(self.previewGroupBox) - self.themeButtonBox = QtGui.QDialogButtonBox(amendThemeDialog) - self.themeButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | - QtGui.QDialogButtonBox.Ok) - self.themeButtonBox.setObjectName(u'themeButtonBox') - self.amendThemeLayout.addWidget(self.themeButtonBox) - - self.retranslateUi(amendThemeDialog) - self.themeTabWidget.setCurrentIndex(0) - QtCore.QObject.connect(self.themeButtonBox, - QtCore.SIGNAL(u'accepted()'), amendThemeDialog.accept) - QtCore.QObject.connect(self.themeButtonBox, - QtCore.SIGNAL(u'rejected()'), amendThemeDialog.reject) - QtCore.QMetaObject.connectSlotsByName(amendThemeDialog) - - def retranslateUi(self, amendThemeDialog): - amendThemeDialog.setWindowTitle( - translate('OpenLP.AmendThemeForm', 'Theme Maintenance')) - self.themeNameLabel.setText( - translate('OpenLP.AmendThemeForm', 'Theme &name:')) - self.backgroundTypeLabel.setText( - translate('OpenLP.AmendThemeForm', 'Type:')) - self.backgroundTypeComboBox.setItemText(0, - translate('OpenLP.AmendThemeForm', 'Solid Color')) - self.backgroundTypeComboBox.setItemText(1, - translate('OpenLP.AmendThemeForm', 'Gradient')) - self.backgroundTypeComboBox.setItemText(2, - translate('OpenLP.AmendThemeForm', 'Image')) - self.color1Label.setText(u':') - self.color2Label.setText(u':') - self.imageLabel.setText( - translate('OpenLP.AmendThemeForm', 'Image:')) - self.gradientLabel.setText( - translate('OpenLP.AmendThemeForm', 'Gradient:')) - self.gradientComboBox.setItemText(0, - translate('OpenLP.AmendThemeForm', 'Horizontal')) - self.gradientComboBox.setItemText(1, - translate('OpenLP.AmendThemeForm', 'Vertical')) - self.gradientComboBox.setItemText(2, - translate('OpenLP.AmendThemeForm', 'Circular')) - self.themeTabWidget.setTabText( - self.themeTabWidget.indexOf(self.backgroundTab), - translate('OpenLP.AmendThemeForm', '&Background')) - self.fontMainGroupBox.setTitle( - translate('OpenLP.AmendThemeForm', 'Main Font')) - self.fontMainlabel.setText( - translate('OpenLP.AmendThemeForm', 'Font:')) - self.fontMainColorLabel.setText( - translate('OpenLP.AmendThemeForm', 'Color:')) - self.fontMainSize.setText( - translate('OpenLP.AmendThemeForm', 'Size:')) - self.fontMainSizeSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'pt')) - self.fontMainWrapLineAdjustmentLabel.setText( - translate('OpenLP.AmendThemeForm', 'Adjust line spacing:')) - self.fontMainWeightComboBox.setItemText(0, - translate('OpenLP.AmendThemeForm', 'Normal')) - self.fontMainWeightComboBox.setItemText(1, - translate('OpenLP.AmendThemeForm', 'Bold')) - self.fontMainWeightComboBox.setItemText(2, - translate('OpenLP.AmendThemeForm', 'Italics')) - self.fontMainWeightComboBox.setItemText(3, - translate('OpenLP.AmendThemeForm', 'Bold/Italics')) - self.fontMainWeightLabel.setText( - translate('OpenLP.AmendThemeForm', 'Style:')) - self.mainLocationGroupBox.setTitle( - translate('OpenLP.AmendThemeForm', 'Display Location')) - self.defaultLocationLabel.setText( - translate('OpenLP.AmendThemeForm', 'Use default location')) - self.fontMainXLabel.setText( - translate('OpenLP.AmendThemeForm', 'X position:')) - self.fontMainYLabel.setText( - translate('OpenLP.AmendThemeForm', 'Y position:')) - self.fontMainWidthLabel.setText( - translate('OpenLP.AmendThemeForm', 'Width:')) - self.fontMainHeightLabel.setText( - translate('OpenLP.AmendThemeForm', 'Height:')) - self.fontMainXSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.fontMainYSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.fontMainWidthSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.fontMainHeightSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.themeTabWidget.setTabText( - self.themeTabWidget.indexOf(self.fontMainTab), - translate('OpenLP.AmendThemeForm', '&Main Font')) - self.footerFontGroupBox.setTitle( - translate('OpenLP.AmendThemeForm', 'Footer Font')) - self.fontFooterLabel.setText( - translate('OpenLP.AmendThemeForm', 'Font:')) - self.fontFooterColorLabel.setText( - translate('OpenLP.AmendThemeForm', 'Color:')) - self.fontFooterSizeLabel.setText( - translate('OpenLP.AmendThemeForm', 'Size:')) - self.fontFooterSizeSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'pt')) - self.fontFooterWeightComboBox.setItemText(0, - translate('OpenLP.AmendThemeForm', 'Normal')) - self.fontFooterWeightComboBox.setItemText(1, - translate('OpenLP.AmendThemeForm', 'Bold')) - self.fontFooterWeightComboBox.setItemText(2, - translate('OpenLP.AmendThemeForm', 'Italics')) - self.fontFooterWeightComboBox.setItemText(3, - translate('OpenLP.AmendThemeForm', 'Bold/Italics')) - self.fontFooterWeightLabel.setText( - translate('OpenLP.AmendThemeForm', 'Style:')) - self.locationFooterGroupBox.setTitle( - translate('OpenLP.AmendThemeForm', 'Display Location')) - self.fontFooterDefaultLabel.setText( - translate('OpenLP.AmendThemeForm', 'Use default location')) - self.fontFooterXLabel.setText( - translate('OpenLP.AmendThemeForm', 'X position:')) - self.fontFooterYLabel.setText( - translate('OpenLP.AmendThemeForm', 'Y position:')) - self.fontFooterWidthLabel.setText( - translate('OpenLP.AmendThemeForm', 'Width:')) - self.fontFooterHeightLabel.setText( - translate('OpenLP.AmendThemeForm', 'Height:')) - self.fontFooterXSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.fontFooterYSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.fontFooterWidthSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.fontFooterHeightSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.themeTabWidget.setTabText( - self.themeTabWidget.indexOf(self.fontFooterTab), - translate('OpenLP.AmendThemeForm', '&Footer Font')) - self.outlineGroupBox.setTitle( - translate('OpenLP.AmendThemeForm', 'Outline')) - self.outlineSpinBoxLabel.setText( - translate('OpenLP.AmendThemeForm', 'Outline size:')) - self.outlineSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.outlineColorLabel.setText( - translate('OpenLP.AmendThemeForm', 'Outline color:')) - self.outlineEnabledLabel.setText( - translate('OpenLP.AmendThemeForm', 'Show outline:')) - self.shadowGroupBox.setTitle( - translate('OpenLP.AmendThemeForm', 'Shadow')) - self.shadowSpinBoxLabel.setText( - translate('OpenLP.AmendThemeForm', 'Shadow size:')) - self.shadowSpinBox.setSuffix( - translate('OpenLP.AmendThemeForm', 'px')) - self.shadowColorLabel.setText( - translate('OpenLP.AmendThemeForm', 'Shadow color:')) - self.shadowEnabledLabel.setText( - translate('OpenLP.AmendThemeForm', 'Show shadow:')) - self.alignmentGroupBox.setTitle( - translate('OpenLP.AmendThemeForm', 'Alignment')) - self.horizontalLabel.setText( - translate('OpenLP.AmendThemeForm', 'Horizontal align:')) - self.horizontalComboBox.setItemText(0, - translate('OpenLP.AmendThemeForm', 'Left')) - self.horizontalComboBox.setItemText(1, - translate('OpenLP.AmendThemeForm', 'Right')) - self.horizontalComboBox.setItemText(2, - translate('OpenLP.AmendThemeForm', 'Center')) - self.verticalLabel.setText( - translate('OpenLP.AmendThemeForm', 'Vertical align:')) - self.verticalComboBox.setItemText(0, - translate('OpenLP.AmendThemeForm', 'Top')) - self.verticalComboBox.setItemText(1, - translate('OpenLP.AmendThemeForm', 'Middle')) - self.verticalComboBox.setItemText(2, - translate('OpenLP.AmendThemeForm', 'Bottom')) - self.transitionGroupBox.setTitle( - translate('OpenLP.AmendThemeForm', 'Slide Transition')) - self.slideTransitionCheckBoxLabel.setText( - translate('OpenLP.AmendThemeForm', 'Transition active')) - self.themeTabWidget.setTabText( - self.themeTabWidget.indexOf(self.otherOptionsTab), - translate('OpenLP.AmendThemeForm', '&Other Options')) - self.previewGroupBox.setTitle( - translate('OpenLP.AmendThemeForm', 'Preview')) diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py deleted file mode 100644 index 1a7871f22..000000000 --- a/openlp/core/ui/amendthemeform.py +++ /dev/null @@ -1,722 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian # -# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, # -# Carsten Tinggaard, Frode Woldsund # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -import logging -import os -import os.path - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import ThemeXML, translate -from openlp.core.utils import get_images_filter -from amendthemedialog import Ui_AmendThemeDialog - -log = logging.getLogger(u'AmendThemeForm') - -class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): - """ - The :class:`AmendThemeForm` class provides the user interface to set up - new and edit existing themes. - """ - def __init__(self, parent): - """ - Initialise the theme editor user interface - """ - QtGui.QDialog.__init__(self, parent) - self.thememanager = parent - self.path = None - self.theme = ThemeXML() - self.setupUi(self) - # Buttons - QtCore.QObject.connect(self.color1PushButton, - QtCore.SIGNAL(u'pressed()'), self.onColor1PushButtonClicked) - QtCore.QObject.connect(self.color2PushButton, - QtCore.SIGNAL(u'pressed()'), self.onColor2PushButtonClicked) - QtCore.QObject.connect(self.fontMainColorPushButton, - QtCore.SIGNAL(u'pressed()'), self.onFontMainColorPushButtonClicked) - QtCore.QObject.connect(self.fontFooterColorPushButton, - QtCore.SIGNAL(u'pressed()'), - self.onFontFooterColorPushButtonClicked) - QtCore.QObject.connect(self.outlineColorPushButton, - QtCore.SIGNAL(u'pressed()'), self.onOutlineColorPushButtonClicked) - QtCore.QObject.connect(self.shadowColorPushButton, - QtCore.SIGNAL(u'pressed()'), self.onShadowColorPushButtonClicked) - QtCore.QObject.connect(self.imageToolButton, - QtCore.SIGNAL(u'clicked()'), self.onImageToolButtonClicked) - # Combo boxes - QtCore.QObject.connect(self.backgroundTypeComboBox, - QtCore.SIGNAL(u'activated(int)'), - self.onBackgroundTypeComboBoxSelected) - QtCore.QObject.connect(self.gradientComboBox, - QtCore.SIGNAL(u'activated(int)'), self.onGradientComboBoxSelected) - QtCore.QObject.connect(self.fontMainComboBox, - QtCore.SIGNAL(u'activated(int)'), self.onFontMainComboBoxSelected) - QtCore.QObject.connect(self.fontMainWeightComboBox, - QtCore.SIGNAL(u'activated(int)'), - self.onFontMainWeightComboBoxSelected) - QtCore.QObject.connect(self.fontFooterComboBox, - QtCore.SIGNAL(u'activated(int)'), self.onFontFooterComboBoxSelected) - QtCore.QObject.connect(self.fontFooterWeightComboBox, - QtCore.SIGNAL(u'activated(int)'), - self.onFontFooterWeightComboBoxSelected) - QtCore.QObject.connect(self.horizontalComboBox, - QtCore.SIGNAL(u'activated(int)'), self.onHorizontalComboBoxSelected) - QtCore.QObject.connect(self.verticalComboBox, - QtCore.SIGNAL(u'activated(int)'), self.onVerticalComboBoxSelected) - # Spin boxes - QtCore.QObject.connect(self.fontMainSizeSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontMainSizeSpinBoxChanged) - QtCore.QObject.connect(self.fontMainLineAdjustmentSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontMainLineAdjustmentSpinBoxChanged) - QtCore.QObject.connect(self.shadowSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onShadowSpinBoxChanged) - QtCore.QObject.connect(self.outlineSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onOutlineSpinBoxChanged) - - QtCore.QObject.connect(self.fontFooterSizeSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontFooterSizeSpinBoxChanged) - QtCore.QObject.connect(self.fontMainXSpinBox, - QtCore.SIGNAL(u'editingFinished()'), self.onFontMainXSpinBoxChanged) - QtCore.QObject.connect(self.fontMainYSpinBox, - QtCore.SIGNAL(u'editingFinished()'), self.onFontMainYSpinBoxChanged) - QtCore.QObject.connect(self.fontMainWidthSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontMainWidthSpinBoxChanged) - QtCore.QObject.connect(self.fontMainHeightSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontMainHeightSpinBoxChanged) - QtCore.QObject.connect(self.fontMainLineAdjustmentSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontMainLineAdjustmentSpinBoxChanged) - QtCore.QObject.connect(self.fontFooterXSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontFooterXSpinBoxChanged) - QtCore.QObject.connect(self.fontFooterYSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontFooterYSpinBoxChanged) - QtCore.QObject.connect(self.fontFooterWidthSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontFooterWidthSpinBoxChanged) - QtCore.QObject.connect(self.fontFooterHeightSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontFooterHeightSpinBoxChanged) - - # CheckBoxes - QtCore.QObject.connect(self.fontMainDefaultCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), - self.onFontMainDefaultCheckBoxChanged) - QtCore.QObject.connect(self.fontFooterDefaultCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), - self.onFontFooterDefaultCheckBoxChanged) - QtCore.QObject.connect(self.outlineCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), self.onOutlineCheckBoxChanged) - QtCore.QObject.connect(self.shadowCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), self.onShadowCheckBoxChanged) - QtCore.QObject.connect(self.slideTransitionCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), - self.onSlideTransitionCheckBoxChanged) - - def accept(self): - new_theme = ThemeXML() - theme_name = unicode(self.themeNameEdit.text()) - new_theme.new_document(theme_name) - save_from = None - save_to = None - if self.theme.background_type == u'solid': - new_theme.add_background_solid( - unicode(self.theme.background_color)) - elif self.theme.background_type == u'gradient': - new_theme.add_background_gradient( - unicode(self.theme.background_start_color), - unicode(self.theme.background_end_color), - self.theme.background_direction) - else: - filename = \ - os.path.split(unicode(self.theme.background_filename))[1] - new_theme.add_background_image(filename) - save_to = os.path.join(self.path, theme_name, filename) - save_from = self.theme.background_filename - new_theme.add_font(unicode(self.theme.font_main_name), - unicode(self.theme.font_main_color), - unicode(self.theme.font_main_proportion), - unicode(self.theme.font_main_override), u'main', - unicode(self.theme.font_main_weight), - unicode(self.theme.font_main_italics), - unicode(self.theme.font_main_line_adjustment), - unicode(self.theme.font_main_x), - unicode(self.theme.font_main_y), - unicode(self.theme.font_main_width), - unicode(self.theme.font_main_height)) - new_theme.add_font(unicode(self.theme.font_footer_name), - unicode(self.theme.font_footer_color), - unicode(self.theme.font_footer_proportion), - unicode(self.theme.font_footer_override), u'footer', - unicode(self.theme.font_footer_weight), - unicode(self.theme.font_footer_italics), - 0, # line adjustment - unicode(self.theme.font_footer_x), - unicode(self.theme.font_footer_y), - unicode(self.theme.font_footer_width), - unicode(self.theme.font_footer_height)) - new_theme.add_display(unicode(self.theme.display_shadow), - unicode(self.theme.display_shadow_color), - unicode(self.theme.display_outline), - unicode(self.theme.display_outline_color), - unicode(self.theme.display_horizontal_align), - unicode(self.theme.display_vertical_align), - unicode(self.theme.display_wrap_style), - unicode(self.theme.display_slide_transition), - unicode(self.theme.display_shadow_size), - unicode(self.theme.display_outline_size)) - theme = new_theme.extract_xml() - pretty_theme = new_theme.extract_formatted_xml() - if self.thememanager.saveTheme(theme_name, theme, pretty_theme, - save_from, save_to) is not False: - return QtGui.QDialog.accept(self) - - def loadTheme(self, theme): - log.debug(u'LoadTheme %s', theme) - self.theme = theme - # Stop the initial screen setup generating 1 preview per field! - self.allowPreview = False - self.paintUi(self.theme) - self.allowPreview = True - self.previewTheme() - - def onImageToolButtonClicked(self): - images_filter = get_images_filter() - images_filter = '%s;;%s (*.*) (*)' % (images_filter, - translate('OpenLP.AmendThemeForm', 'All Files')) - filename = QtGui.QFileDialog.getOpenFileName(self, - translate('OpenLP.AmendThemeForm', 'Select Image'), u'', - images_filter) - if filename: - self.imageLineEdit.setText(filename) - self.theme.background_filename = filename - self.previewTheme() - # - # Main Font Tab - # - def onFontMainComboBoxSelected(self): - self.theme.font_main_name = self.fontMainComboBox.currentFont().family() - self.previewTheme() - - def onFontMainWeightComboBoxSelected(self, value): - if value == 0: - self.theme.font_main_weight = u'Normal' - self.theme.font_main_italics = False - elif value == 1: - self.theme.font_main_weight = u'Bold' - self.theme.font_main_italics = False - elif value == 2: - self.theme.font_main_weight = u'Normal' - self.theme.font_main_italics = True - else: - self.theme.font_main_weight = u'Bold' - self.theme.font_main_italics = True - self.previewTheme() - - def onFontMainColorPushButtonClicked(self): - new_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.font_main_color), self) - if new_color.isValid(): - self.theme.font_main_color = new_color.name() - self.fontMainColorPushButton.setStyleSheet( - u'background-color: %s' % unicode(self.theme.font_main_color)) - self.previewTheme() - - def onFontMainSizeSpinBoxChanged(self): - if self.theme.font_main_proportion != self.fontMainSizeSpinBox.value(): - self.theme.font_main_proportion = self.fontMainSizeSpinBox.value() - self.previewTheme() - - def onFontMainDefaultCheckBoxChanged(self, value): - if value == 2: # checked - self.theme.font_main_override = False - else: - self.theme.font_main_override = True - - if not self.theme.font_main_x and not self.theme.font_main_y and \ - not self.theme.font_main_width and not self.theme.font_main_height: - self.theme.font_main_x = u'10' - self.theme.font_main_y = u'10' - self.theme.font_main_width = u'1024' - self.theme.font_main_height = u'730' - self.fontMainXSpinBox.setValue(self.theme.font_main_x) - self.fontMainYSpinBox.setValue(self.theme.font_main_y) - self.fontMainWidthSpinBox.setValue(self.theme.font_main_width) - self.fontMainHeightSpinBox.setValue(self.theme.font_main_height) - self.fontMainLineAdjustmentSpinBox.setValue( - self.theme.font_main_line_adjustment) - self.stateChanging(self.theme) - self.previewTheme() - - def onFontMainXSpinBoxChanged(self): - if self.theme.font_main_x != self.fontMainXSpinBox.value(): - self.theme.font_main_x = self.fontMainXSpinBox.value() - self.previewTheme() - - def onFontMainYSpinBoxChanged(self): - if self.theme.font_main_y != self.fontMainYSpinBox.value(): - self.theme.font_main_y = self.fontMainYSpinBox.value() - self.previewTheme() - - def onFontMainWidthSpinBoxChanged(self): - if self.theme.font_main_width != self.fontMainWidthSpinBox.value(): - self.theme.font_main_width = self.fontMainWidthSpinBox.value() - self.previewTheme() - - def onFontMainLineAdjustmentSpinBoxChanged(self): - if self.theme.font_main_line_adjustment != \ - self.fontMainLineAdjustmentSpinBox.value(): - self.theme.font_main_line_adjustment = \ - self.fontMainLineAdjustmentSpinBox.value() - self.previewTheme() - - def onFontMainHeightSpinBoxChanged(self): - if self.theme.font_main_height != self.fontMainHeightSpinBox.value(): - self.theme.font_main_height = self.fontMainHeightSpinBox.value() - self.previewTheme() - # - # Footer Font Tab - # - def onFontFooterComboBoxSelected(self): - self.theme.font_footer_name = \ - self.fontFooterComboBox.currentFont().family() - self.previewTheme() - - def onFontFooterWeightComboBoxSelected(self, value): - if value == 0: - self.theme.font_footer_weight = u'Normal' - self.theme.font_footer_italics = False - elif value == 1: - self.theme.font_footer_weight = u'Bold' - self.theme.font_footer_italics = False - elif value == 2: - self.theme.font_footer_weight = u'Normal' - self.theme.font_footer_italics = True - else: - self.theme.font_footer_weight = u'Bold' - self.theme.font_footer_italics = True - self.previewTheme() - - def onFontFooterColorPushButtonClicked(self): - new_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.font_footer_color), self) - if new_color.isValid(): - self.theme.font_footer_color = new_color.name() - self.fontFooterColorPushButton.setStyleSheet( - u'background-color: %s' % unicode(self.theme.font_footer_color)) - self.previewTheme() - - def onFontFooterSizeSpinBoxChanged(self): - if self.theme.font_footer_proportion != \ - self.fontFooterSizeSpinBox.value(): - self.theme.font_footer_proportion = \ - self.fontFooterSizeSpinBox.value() - self.previewTheme() - - def onFontFooterDefaultCheckBoxChanged(self, value): - if value == 2: # checked - self.theme.font_footer_override = False - else: - self.theme.font_footer_override = True - if not self.theme.font_footer_x and not self.theme.font_footer_y and \ - not self.theme.font_footer_width and \ - not self.theme.font_footer_height: - self.theme.font_footer_x = u'10' - self.theme.font_footer_y = u'730' - self.theme.font_footer_width = u'1024' - self.theme.font_footer_height = u'38' - self.fontFooterXSpinBox.setValue(self.theme.font_footer_x) - self.fontFooterYSpinBox.setValue(self.theme.font_footer_y) - self.fontFooterWidthSpinBox.setValue(self.theme.font_footer_width) - self.fontFooterHeightSpinBox.setValue( - self.theme.font_footer_height) - self.stateChanging(self.theme) - self.previewTheme() - - def onFontFooterXSpinBoxChanged(self): - if self.theme.font_footer_x != self.fontFooterXSpinBox.value(): - self.theme.font_footer_x = self.fontFooterXSpinBox.value() - self.previewTheme() - - def onFontFooterYSpinBoxChanged(self): - if self.theme.font_footer_y != self.fontFooterYSpinBox.value(): - self.theme.font_footer_y = self.fontFooterYSpinBox.value() - self.previewTheme() - - def onFontFooterWidthSpinBoxChanged(self): - if self.theme.font_footer_width != self.fontFooterWidthSpinBox.value(): - self.theme.font_footer_width = self.fontFooterWidthSpinBox.value() - self.previewTheme() - - def onFontFooterHeightSpinBoxChanged(self): - if self.theme.font_footer_height != \ - self.fontFooterHeightSpinBox.value(): - self.theme.font_footer_height = \ - self.fontFooterHeightSpinBox.value() - self.previewTheme() - # - # Background Tab - # - def onGradientComboBoxSelected(self, currentIndex): - self.setBackground(self.backgroundTypeComboBox.currentIndex(), - currentIndex) - - def onBackgroundTypeComboBoxSelected(self, currentIndex): - self.setBackground(currentIndex, self.gradientComboBox.currentIndex()) - - def setBackground(self, background, gradient): - if background == 0: # Solid - self.theme.background_type = u'solid' - if self.theme.background_color is None: - self.theme.background_color = u'#000000' - self.imageLineEdit.setText(u'') - elif background == 1: # Gradient - self.theme.background_type = u'gradient' - if gradient == 0: # Horizontal - self.theme.background_direction = u'horizontal' - elif gradient == 1: # vertical - self.theme.background_direction = u'vertical' - else: - self.theme.background_direction = u'circular' - if self.theme.background_start_color is None: - self.theme.background_start_color = u'#000000' - if self.theme.background_end_color is None: - self.theme.background_end_color = u'#ff0000' - self.imageLineEdit.setText(u'') - else: - self.theme.background_type = u'image' - self.stateChanging(self.theme) - self.previewTheme() - - def onColor1PushButtonClicked(self): - if self.theme.background_type == u'solid': - new_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.background_color), self) - if new_color.isValid(): - self.theme.background_color = new_color.name() - self.color1PushButton.setStyleSheet(u'background-color: %s' % - unicode(self.theme.background_color)) - else: - new_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.background_start_color), self) - if new_color.isValid(): - self.theme.background_start_color = new_color.name() - self.color1PushButton.setStyleSheet(u'background-color: %s' % - unicode(self.theme.background_start_color)) - self.previewTheme() - - def onColor2PushButtonClicked(self): - new_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.background_end_color), self) - if new_color.isValid(): - self.theme.background_end_color = new_color.name() - self.color2PushButton.setStyleSheet(u'background-color: %s' % - unicode(self.theme.background_end_color)) - self.previewTheme() - # - # Other Tab - # - def onOutlineCheckBoxChanged(self, value): - if value == 2: # checked - self.theme.display_outline = True - else: - self.theme.display_outline = False - self.stateChanging(self.theme) - self.previewTheme() - - def onOutlineSpinBoxChanged(self): - if self.theme.display_outline_size != self.outlineSpinBox.value(): - self.theme.display_outline_size = self.outlineSpinBox.value() - self.previewTheme() - - def onShadowSpinBoxChanged(self): - if self.theme.display_shadow_size != self.shadowSpinBox.value(): - self.theme.display_shadow_size = self.shadowSpinBox.value() - self.previewTheme() - - def onOutlineColorPushButtonClicked(self): - new_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.display_outline_color), self) - if new_color.isValid(): - self.theme.display_outline_color = new_color.name() - self.outlineColorPushButton.setStyleSheet(u'background-color: %s' % - unicode(self.theme.display_outline_color)) - self.previewTheme() - - def onShadowCheckBoxChanged(self, value): - if value == 2: # checked - self.theme.display_shadow = True - else: - self.theme.display_shadow = False - self.stateChanging(self.theme) - self.previewTheme() - - def onSlideTransitionCheckBoxChanged(self, value): - if value == 2: # checked - self.theme.display_slide_transition = True - else: - self.theme.display_slide_transition = False - self.stateChanging(self.theme) - self.previewTheme() - - def onShadowColorPushButtonClicked(self): - new_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.display_shadow_color), self) - if new_color.isValid(): - self.theme.display_shadow_color = new_color.name() - self.shadowColorPushButton.setStyleSheet(u'background-color: %s' % - unicode(self.theme.display_shadow_color)) - self.previewTheme() - - def onHorizontalComboBoxSelected(self, currentIndex): - self.theme.display_horizontal_align = currentIndex - self.stateChanging(self.theme) - self.previewTheme() - - def onVerticalComboBoxSelected(self, currentIndex): - self.theme.display_vertical_align = currentIndex - self.stateChanging(self.theme) - self.previewTheme() - # - # Local Methods - # - def paintUi(self, theme): - self.stateChanging(theme) - self.themeNameEdit.setText(self.theme.theme_name) - # Background Tab - self.imageLineEdit.setText(u'') - if theme.background_type == u'solid': - self.backgroundTypeComboBox.setCurrentIndex(0) - elif theme.background_type == u'gradient': - self.backgroundTypeComboBox.setCurrentIndex(1) - else: - self.backgroundTypeComboBox.setCurrentIndex(2) - self.imageLineEdit.setText(self.theme.background_filename) - if self.theme.background_direction == u'horizontal': - self.gradientComboBox.setCurrentIndex(0) - elif self.theme.background_direction == u'vertical': - self.gradientComboBox.setCurrentIndex(1) - else: - self.gradientComboBox.setCurrentIndex(2) - # Font Main Tab - self.mainFontComboBox.setCurrentFont( - QtGui.QFont(self.theme.font_main_name)) - self.fontMainSizeSpinBox.setValue(self.theme.font_main_proportion) - if not self.theme.font_main_italics and \ - self.theme.font_main_weight == u'Normal': - self.fontMainWeightComboBox.setCurrentIndex(0) - elif not self.theme.font_main_italics and \ - self.theme.font_main_weight == u'Bold': - self.fontMainWeightComboBox.setCurrentIndex(1) - elif self.theme.font_main_italics and \ - self.theme.font_main_weight == u'Normal': - self.fontMainWeightComboBox.setCurrentIndex(2) - else: - self.fontMainWeightComboBox.setCurrentIndex(3) - self.fontMainXSpinBox.setValue(self.theme.font_main_x) - self.fontMainYSpinBox.setValue(self.theme.font_main_y) - self.fontMainWidthSpinBox.setValue(self.theme.font_main_width) - self.fontMainHeightSpinBox.setValue(self.theme.font_main_height) - # Font Footer Tab - self.fontFooterComboBox.setCurrentFont( - QtGui.QFont(self.theme.font_footer_name)) - self.fontFooterSizeSpinBox.setValue( - self.theme.font_footer_proportion) - if not self.theme.font_footer_italics and \ - self.theme.font_footer_weight == u'Normal': - self.fontFooterWeightComboBox.setCurrentIndex(0) - elif not self.theme.font_footer_italics and \ - self.theme.font_footer_weight == u'Bold': - self.fontFooterWeightComboBox.setCurrentIndex(1) - elif self.theme.font_footer_italics and \ - self.theme.font_footer_weight == u'Normal': - self.fontFooterWeightComboBox.setCurrentIndex(2) - else: - self.fontFooterWeightComboBox.setCurrentIndex(3) - self.fontFooterXSpinBox.setValue(self.theme.font_footer_x) - self.fontFooterYSpinBox.setValue(self.theme.font_footer_y) - self.fontFooterWidthSpinBox.setValue(self.theme.font_footer_width) - self.fontFooterHeightSpinBox.setValue(self.theme.font_footer_height) - self.fontMainColorPushButton.setStyleSheet( - u'background-color: %s' % unicode(theme.font_main_color)) - self.fontFooterColorPushButton.setStyleSheet( - u'background-color: %s' % unicode(theme.font_footer_color)) - if not self.theme.font_main_override: - self.fontMainDefaultCheckBox.setChecked(True) - else: - self.fontMainDefaultCheckBox.setChecked(False) - if not self.theme.font_footer_override: - self.fontFooterDefaultCheckBox.setChecked(True) - else: - self.fontFooterDefaultCheckBox.setChecked(False) - self.outlineColorPushButton.setStyleSheet( - u'background-color: %s' % unicode(theme.display_outline_color)) - self.shadowColorPushButton.setStyleSheet( - u'background-color: %s' % unicode(theme.display_shadow_color)) - if self.theme.display_outline: - self.outlineCheckBox.setChecked(True) - self.outlineColorPushButton.setEnabled(True) - else: - self.outlineCheckBox.setChecked(False) - self.outlineColorPushButton.setEnabled(False) - self.outlineSpinBox.setValue(int(self.theme.display_outline_size)) - if self.theme.display_shadow: - self.shadowCheckBox.setChecked(True) - self.shadowColorPushButton.setEnabled(True) - else: - self.shadowCheckBox.setChecked(False) - self.shadowColorPushButton.setEnabled(False) - self.shadowSpinBox.setValue(int(self.theme.display_shadow_size)) - if self.theme.display_slide_transition: - self.slideTransitionCheckBox.setCheckState(QtCore.Qt.Checked) - else: - self.slideTransitionCheckBox.setCheckState(QtCore.Qt.Unchecked) - self.horizontalComboBox.setCurrentIndex( - self.theme.display_horizontal_align) - self.verticalComboBox.setCurrentIndex(self.theme.display_vertical_align) - - def stateChanging(self, theme): - self.backgroundTypeComboBox.setVisible(True) - self.backgroundTypeLabel.setVisible(True) - if theme.background_type == u'solid': - self.color1PushButton.setStyleSheet( - u'background-color: %s' % unicode(theme.background_color)) - self.color1Label.setText( - translate('OpenLP.AmendThemeForm', 'Color:')) - self.color1Label.setVisible(True) - self.color1PushButton.setVisible(True) - self.color2Label.setVisible(False) - self.color2PushButton.setVisible(False) - self.imageLabel.setVisible(False) - self.imageLineEdit.setVisible(False) - self.imageFilenameWidget.setVisible(False) - self.gradientLabel.setVisible(False) - self.gradientComboBox.setVisible(False) - elif theme.background_type == u'gradient': - self.color1PushButton.setStyleSheet(u'background-color: %s' \ - % unicode(theme.background_start_color)) - self.color2PushButton.setStyleSheet(u'background-color: %s' \ - % unicode(theme.background_end_color)) - self.color1Label.setText( - translate('OpenLP.AmendThemeForm', 'First color:')) - self.color2Label.setText( - translate('OpenLP.AmendThemeForm', 'Second color:')) - self.color1Label.setVisible(True) - self.color1PushButton.setVisible(True) - self.color2Label.setVisible(True) - self.color2PushButton.setVisible(True) - self.imageLabel.setVisible(False) - self.imageLineEdit.setVisible(False) - self.imageFilenameWidget.setVisible(False) - self.gradientLabel.setVisible(True) - self.gradientComboBox.setVisible(True) - else: # must be image - self.color1Label.setVisible(False) - self.color1PushButton.setVisible(False) - self.color2Label.setVisible(False) - self.color2PushButton.setVisible(False) - self.imageLabel.setVisible(True) - self.imageLineEdit.setVisible(True) - self.imageFilenameWidget.setVisible(True) - self.gradientLabel.setVisible(False) - self.gradientComboBox.setVisible(False) - if not theme.font_main_override: - self.fontMainXSpinBox.setEnabled(False) - self.fontMainYSpinBox.setEnabled(False) - self.fontMainWidthSpinBox.setEnabled(False) - self.fontMainHeightSpinBox.setEnabled(False) - else: - self.fontMainXSpinBox.setEnabled(True) - self.fontMainYSpinBox.setEnabled(True) - self.fontMainWidthSpinBox.setEnabled(True) - self.fontMainHeightSpinBox.setEnabled(True) - - if not theme.font_footer_override: - self.fontFooterXSpinBox.setEnabled(False) - self.fontFooterYSpinBox.setEnabled(False) - self.fontFooterWidthSpinBox.setEnabled(False) - self.fontFooterHeightSpinBox.setEnabled(False) - else: - self.fontFooterXSpinBox.setEnabled(True) - self.fontFooterYSpinBox.setEnabled(True) - self.fontFooterWidthSpinBox.setEnabled(True) - self.fontFooterHeightSpinBox.setEnabled(True) - - if self.theme.display_outline: - self.outlineColorPushButton.setEnabled(True) - else: - self.outlineColorPushButton.setEnabled(False) - - if self.theme.display_shadow: - self.shadowColorPushButton.setEnabled(True) - else: - self.shadowColorPushButton.setEnabled(False) - - def previewTheme(self): - if self.allowPreview: - #calculate main number of rows - metrics = self._getThemeMetrics() - line_height = metrics.height() \ - + int(self.theme.font_main_line_adjustment) - if self.theme.display_shadow: - line_height += int(self.theme.display_shadow_size) - if self.theme.display_outline: - # pixels top/bottom - line_height += 2 * int(self.theme.display_outline_size) - page_length = \ - ((self.fontMainHeightSpinBox.value()) / line_height ) - log.debug(u'Page Length area height %s, metrics %s, lines %s' % - (self.fontMainHeightSpinBox.value(), metrics.height(), - page_length)) - page_length_text = unicode( - translate('OpenLP.AmendThemeForm', 'Slide height is %s rows.')) - self.fontMainLinesPageLabel.setText(page_length_text % page_length) - frame = self.thememanager.generateImage(self.theme) - self.themePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) - - def _getThemeMetrics(self): - main_weight = 50 - if self.theme.font_main_weight == u'Bold': - main_weight = 75 - mainFont = QtGui.QFont(self.theme.font_main_name, - self.theme.font_main_proportion, # size - main_weight, # weight - self.theme.font_main_italics)# italic - mainFont.setPixelSize(self.theme.font_main_proportion) - metrics = QtGui.QFontMetrics(mainFont) - # Validate that the screen width is big enough to display the text - if self.theme.font_main_width < metrics.maxWidth() * 2 + 64: - self.theme.font_main_width = metrics.maxWidth() * 2 + 64 - self.fontMainWidthSpinBox.setValue(self.theme.font_main_width) - return metrics diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 90f920a50..ba2a4b1cc 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -229,7 +229,7 @@ class MainDisplay(DisplayWidget): """ API for replacement backgrounds so Images are added directly to cache """ - image = self.imageManager.add_image(name, path) + self.imageManager.add_image(name, path) self.image(name) def image(self, name): diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index a513cc99e..3833f1697 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -627,7 +627,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # warning cyclic dependency # RenderManager needs to call ThemeManager and # ThemeManager needs to call RenderManager - self.RenderManager = RenderManager( + self.renderManager = RenderManager( self.ThemeManagerContents, self.screens) # Define the media Dock Manager self.mediaDockManager = MediaDockManager(self.MediaToolBox) @@ -635,7 +635,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # make the controllers available to the plugins self.plugin_helpers[u'preview'] = self.PreviewController self.plugin_helpers[u'live'] = self.LiveController - self.plugin_helpers[u'render'] = self.RenderManager + self.plugin_helpers[u'render'] = self.renderManager self.plugin_helpers[u'service'] = self.ServiceManagerContents self.plugin_helpers[u'settings form'] = self.settingsForm self.plugin_helpers[u'toolbox'] = self.mediaDockManager @@ -809,7 +809,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): their locations """ log.debug(u'screenChanged') - self.RenderManager.update_display() + self.renderManager.update_display() self.setFocus() self.activateWindow() diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 65913a9f6..56765eda6 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -627,7 +627,8 @@ class ThemeManager(QtGui.QWidget): newtheme.font_main_shadow_color = unicode(theme.ShadowColor.name()) if theme.Outline == 1: newtheme.font_main_outline = True - newtheme.font_main_outline_color = unicode(theme.OutlineColor.name()) + newtheme.font_main_outline_color = \ + unicode(theme.OutlineColor.name()) vAlignCorrection = 0 if theme.VerticalAlign == 2: vAlignCorrection = 1 diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index b3af9df98..bff8a578c 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -34,7 +34,8 @@ class Ui_ThemeWizard(object): ThemeWizard.resize(550, 386) ThemeWizard.setModal(True) ThemeWizard.setWizardStyle(QtGui.QWizard.ModernStyle) - ThemeWizard.setOptions(QtGui.QWizard.IndependentPages|QtGui.QWizard.NoBackButtonOnStartPage) + ThemeWizard.setOptions(QtGui.QWizard.IndependentPages| + QtGui.QWizard.NoBackButtonOnStartPage) self.welcomePage = QtGui.QWizardPage() self.welcomePage.setTitle(u'') self.welcomePage.setSubTitle(u'') @@ -48,7 +49,8 @@ class Ui_ThemeWizard(object): self.importBibleImage.setMaximumSize(QtCore.QSize(163, 16777215)) self.importBibleImage.setLineWidth(0) self.importBibleImage.setText(u'') - self.importBibleImage.setPixmap(QtGui.QPixmap(u':/wizards/wizard_importbible.bmp')) + self.importBibleImage.setPixmap(QtGui.QPixmap + (u':/wizards/wizard_importbible.bmp')) self.importBibleImage.setIndent(0) self.importBibleImage.setObjectName(u'importBibleImage') self.welcomeLayout.addWidget(self.importBibleImage) @@ -58,51 +60,62 @@ class Ui_ThemeWizard(object): self.titleLabel = QtGui.QLabel(self.welcomePage) self.titleLabel.setObjectName(u'titleLabel') self.welcomePageLayout.addWidget(self.titleLabel) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Fixed) self.welcomePageLayout.addItem(spacerItem) self.informationLabel = QtGui.QLabel(self.welcomePage) self.informationLabel.setWordWrap(True) self.informationLabel.setMargin(10) self.informationLabel.setObjectName(u'informationLabel') self.welcomePageLayout.addWidget(self.informationLabel) - spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Expanding) self.welcomePageLayout.addItem(spacerItem1) self.welcomeLayout.addLayout(self.welcomePageLayout) ThemeWizard.addPage(self.welcomePage) self.backgroundPage = QtGui.QWizardPage() self.backgroundPage.setObjectName(u'backgroundPage') self.backgroundLayout = QtGui.QFormLayout(self.backgroundPage) - self.backgroundLayout.setFieldGrowthPolicy(QtGui.QFormLayout.ExpandingFieldsGrow) - self.backgroundLayout.setLabelAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) + self.backgroundLayout.setFieldGrowthPolicy( + QtGui.QFormLayout.ExpandingFieldsGrow) + self.backgroundLayout.setLabelAlignment( + QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter) self.backgroundLayout.setMargin(20) self.backgroundLayout.setSpacing(8) self.backgroundLayout.setObjectName(u'backgroundLayout') self.backgroundTypeLabel = QtGui.QLabel(self.backgroundPage) self.backgroundTypeLabel.setObjectName(u'backgroundTypeLabel') - self.backgroundLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.backgroundTypeLabel) + self.backgroundLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.backgroundTypeLabel) self.backgroundTypeComboBox = QtGui.QComboBox(self.backgroundPage) self.backgroundTypeComboBox.setObjectName(u'backgroundTypeComboBox') self.backgroundTypeComboBox.addItem(u'') self.backgroundTypeComboBox.addItem(u'') self.backgroundTypeComboBox.addItem(u'') - self.backgroundLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.backgroundTypeComboBox) + self.backgroundLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.backgroundTypeComboBox) self.color1Label = QtGui.QLabel(self.backgroundPage) self.color1Label.setObjectName(u'color1Label') - self.backgroundLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.color1Label) + self.backgroundLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.color1Label) self.color1PushButton = QtGui.QPushButton(self.backgroundPage) self.color1PushButton.setText(u'') self.color1PushButton.setObjectName(u'color1PushButton') - self.backgroundLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.color1PushButton) + self.backgroundLayout.setWidget(1, QtGui.QFormLayout.FieldRole, + self.color1PushButton) self.color2Label = QtGui.QLabel(self.backgroundPage) self.color2Label.setObjectName(u'color2Label') - self.backgroundLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.color2Label) + self.backgroundLayout.setWidget(2, QtGui.QFormLayout.LabelRole, + self.color2Label) self.color2PushButton = QtGui.QPushButton(self.backgroundPage) self.color2PushButton.setText(u'') self.color2PushButton.setObjectName(u'color2PushButton') - self.backgroundLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.color2PushButton) + self.backgroundLayout.setWidget(2, QtGui.QFormLayout.FieldRole, + self.color2PushButton) self.imageLabel = QtGui.QLabel(self.backgroundPage) self.imageLabel.setObjectName(u'imageLabel') - self.backgroundLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.imageLabel) + self.backgroundLayout.setWidget(3, QtGui.QFormLayout.LabelRole, + self.imageLabel) self.imageLayout = QtGui.QHBoxLayout() self.imageLayout.setSpacing(8) self.imageLayout.setObjectName(u'imageLayout') @@ -111,13 +124,16 @@ class Ui_ThemeWizard(object): self.imageLayout.addWidget(self.imageLineEdit) self.imageBrowseButton = QtGui.QToolButton(self.backgroundPage) self.imageBrowseButton.setText(u'') - self.imageBrowseButton.setIcon(build_icon(u':/general/general_open.png')) + self.imageBrowseButton.setIcon(build_icon + (u':/general/general_open.png')) self.imageBrowseButton.setObjectName(u'imageBrowseButton') self.imageLayout.addWidget(self.imageBrowseButton) - self.backgroundLayout.setLayout(3, QtGui.QFormLayout.FieldRole, self.imageLayout) + self.backgroundLayout.setLayout(3, QtGui.QFormLayout.FieldRole, + self.imageLayout) self.gradientLabel = QtGui.QLabel(self.backgroundPage) self.gradientLabel.setObjectName(u'gradientLabel') - self.backgroundLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.gradientLabel) + self.backgroundLayout.setWidget(4, QtGui.QFormLayout.LabelRole, + self.gradientLabel) self.gradientComboBox = QtGui.QComboBox(self.backgroundPage) self.gradientComboBox.setObjectName(u'gradientComboBox') self.gradientComboBox.addItem(u'') @@ -125,40 +141,49 @@ class Ui_ThemeWizard(object): self.gradientComboBox.addItem(u'') self.gradientComboBox.addItem(u'') self.gradientComboBox.addItem(u'') - self.backgroundLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.gradientComboBox) + self.backgroundLayout.setWidget(4, QtGui.QFormLayout.FieldRole, + self.gradientComboBox) ThemeWizard.addPage(self.backgroundPage) self.mainAreaPage = QtGui.QWizardPage() self.mainAreaPage.setObjectName(u'mainAreaPage') self.formLayout = QtGui.QFormLayout(self.mainAreaPage) - self.formLayout.setFormAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) + self.formLayout.setFormAlignment( + QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignTop) self.formLayout.setContentsMargins(-1, 20, 20, 20) self.formLayout.setSpacing(8) self.formLayout.setObjectName(u'formLayout') self.mainFontLabel = QtGui.QLabel(self.mainAreaPage) self.mainFontLabel.setObjectName(u'mainFontLabel') - self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.mainFontLabel) + self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.mainFontLabel) self.mainFontComboBox = QtGui.QFontComboBox(self.mainAreaPage) self.mainFontComboBox.setObjectName(u'mainFontComboBox') - self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.mainFontComboBox) + self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.mainFontComboBox) self.mainColorLabel = QtGui.QLabel(self.mainAreaPage) self.mainColorLabel.setObjectName(u'mainColorLabel') - self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.mainColorLabel) + self.formLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.mainColorLabel) self.mainColorPushButton = QtGui.QPushButton(self.mainAreaPage) self.mainColorPushButton.setText(u'') self.mainColorPushButton.setObjectName(u'mainColorPushButton') - self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.mainColorPushButton) + self.formLayout.setWidget(1, QtGui.QFormLayout.FieldRole, + self.mainColorPushButton) self.mainSizeLabel = QtGui.QLabel(self.mainAreaPage) self.mainSizeLabel.setObjectName(u'mainSizeLabel') - self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.mainSizeLabel) + self.formLayout.setWidget(2, QtGui.QFormLayout.LabelRole, + self.mainSizeLabel) self.mainSizeLayout = QtGui.QHBoxLayout() self.mainSizeLayout.setSpacing(8) self.mainSizeLayout.setMargin(0) self.mainSizeLayout.setObjectName(u'mainSizeLayout') self.mainSizeSpinBox = QtGui.QSpinBox(self.mainAreaPage) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainSizeSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainSizeSpinBox.sizePolicy().hasHeightForWidth()) self.mainSizeSpinBox.setSizePolicy(sizePolicy) self.mainSizeSpinBox.setMinimumSize(QtCore.QSize(70, 0)) self.mainSizeSpinBox.setMaximum(999) @@ -168,18 +193,22 @@ class Ui_ThemeWizard(object): self.mainLineCountLabel = QtGui.QLabel(self.mainAreaPage) self.mainLineCountLabel.setObjectName(u'mainLineCountLabel') self.mainSizeLayout.addWidget(self.mainLineCountLabel) - self.formLayout.setLayout(2, QtGui.QFormLayout.FieldRole, self.mainSizeLayout) + self.formLayout.setLayout(2, QtGui.QFormLayout.FieldRole, + self.mainSizeLayout) self.lineSpacingLabel = QtGui.QLabel(self.mainAreaPage) self.lineSpacingLabel.setObjectName(u'lineSpacingLabel') - self.formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.lineSpacingLabel) + self.formLayout.setWidget(3, QtGui.QFormLayout.LabelRole, + self.lineSpacingLabel) self.lineSpacingSpinBox = QtGui.QSpinBox(self.mainAreaPage) self.lineSpacingSpinBox.setMinimum(-50) self.lineSpacingSpinBox.setMaximum(50) self.lineSpacingSpinBox.setObjectName(u'lineSpacingSpinBox') - self.formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.lineSpacingSpinBox) + self.formLayout.setWidget(3, QtGui.QFormLayout.FieldRole, + self.lineSpacingSpinBox) self.outlineCheckBox = QtGui.QCheckBox(self.mainAreaPage) self.outlineCheckBox.setObjectName(u'outlineCheckBox') - self.formLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.outlineCheckBox) + self.formLayout.setWidget(4, QtGui.QFormLayout.LabelRole, + self.outlineCheckBox) self.outlineLayout = QtGui.QHBoxLayout() self.outlineLayout.setObjectName(u'outlineLayout') self.outlineColorPushButton = QtGui.QPushButton(self.mainAreaPage) @@ -193,10 +222,12 @@ class Ui_ThemeWizard(object): self.outlineSizeSpinBox = QtGui.QSpinBox(self.mainAreaPage) self.outlineSizeSpinBox.setObjectName(u'outlineSizeSpinBox') self.outlineLayout.addWidget(self.outlineSizeSpinBox) - self.formLayout.setLayout(4, QtGui.QFormLayout.FieldRole, self.outlineLayout) + self.formLayout.setLayout(4, QtGui.QFormLayout.FieldRole, + self.outlineLayout) self.shadowCheckBox = QtGui.QCheckBox(self.mainAreaPage) self.shadowCheckBox.setObjectName(u'shadowCheckBox') - self.formLayout.setWidget(5, QtGui.QFormLayout.LabelRole, self.shadowCheckBox) + self.formLayout.setWidget(5, QtGui.QFormLayout.LabelRole, + self.shadowCheckBox) self.shadowLayout = QtGui.QHBoxLayout() self.shadowLayout.setObjectName(u'shadowLayout') self.shadowColorPushButton = QtGui.QPushButton(self.mainAreaPage) @@ -210,48 +241,60 @@ class Ui_ThemeWizard(object): self.shadowSizeSpinBox = QtGui.QSpinBox(self.mainAreaPage) self.shadowSizeSpinBox.setObjectName(u'shadowSizeSpinBox') self.shadowLayout.addWidget(self.shadowSizeSpinBox) - self.formLayout.setLayout(5, QtGui.QFormLayout.FieldRole, self.shadowLayout) + self.formLayout.setLayout(5, QtGui.QFormLayout.FieldRole, + self.shadowLayout) self.boldCheckBox = QtGui.QCheckBox(self.mainAreaPage) self.boldCheckBox.setObjectName(u'boldCheckBox') - self.formLayout.setWidget(6, QtGui.QFormLayout.FieldRole, self.boldCheckBox) + self.formLayout.setWidget(6, QtGui.QFormLayout.FieldRole, + self.boldCheckBox) self.italicsCheckBox = QtGui.QCheckBox(self.mainAreaPage) self.italicsCheckBox.setObjectName(u'italicsCheckBox') - self.formLayout.setWidget(7, QtGui.QFormLayout.FieldRole, self.italicsCheckBox) + self.formLayout.setWidget(7, QtGui.QFormLayout.FieldRole, + self.italicsCheckBox) ThemeWizard.addPage(self.mainAreaPage) self.footerAreaPage = QtGui.QWizardPage() self.footerAreaPage.setObjectName(u'footerAreaPage') self.footerLayout = QtGui.QFormLayout(self.footerAreaPage) - self.footerLayout.setFieldGrowthPolicy(QtGui.QFormLayout.ExpandingFieldsGrow) + self.footerLayout.setFieldGrowthPolicy( + QtGui.QFormLayout.ExpandingFieldsGrow) self.footerLayout.setContentsMargins(50, 20, 20, 20) self.footerLayout.setSpacing(8) self.footerLayout.setObjectName(u'footerLayout') self.footerFontLabel = QtGui.QLabel(self.footerAreaPage) self.footerFontLabel.setObjectName(u'footerFontLabel') - self.footerLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.footerFontLabel) + self.footerLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.footerFontLabel) self.footerFontComboBox = QtGui.QFontComboBox(self.footerAreaPage) self.footerFontComboBox.setObjectName(u'footerFontComboBox') - self.footerLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.footerFontComboBox) + self.footerLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.footerFontComboBox) self.footerColorLabel = QtGui.QLabel(self.footerAreaPage) self.footerColorLabel.setObjectName(u'footerColorLabel') - self.footerLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.footerColorLabel) + self.footerLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.footerColorLabel) self.footerColorPushButton = QtGui.QPushButton(self.footerAreaPage) self.footerColorPushButton.setText(u'') self.footerColorPushButton.setObjectName(u'footerColorPushButton') - self.footerLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.footerColorPushButton) + self.footerLayout.setWidget(1, QtGui.QFormLayout.FieldRole, + self.footerColorPushButton) self.footerSizeLabel = QtGui.QLabel(self.footerAreaPage) self.footerSizeLabel.setObjectName(u'footerSizeLabel') - self.footerLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.footerSizeLabel) + self.footerLayout.setWidget(2, QtGui.QFormLayout.LabelRole, + self.footerSizeLabel) self.footerSizeSpinBox = QtGui.QSpinBox(self.footerAreaPage) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.footerSizeSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.footerSizeSpinBox.sizePolicy().hasHeightForWidth()) self.footerSizeSpinBox.setSizePolicy(sizePolicy) self.footerSizeSpinBox.setMinimumSize(QtCore.QSize(70, 0)) self.footerSizeSpinBox.setMaximum(999) self.footerSizeSpinBox.setProperty(u'value', 10) self.footerSizeSpinBox.setObjectName(u'footerSizeSpinBox') - self.footerLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.footerSizeSpinBox) + self.footerLayout.setWidget(2, QtGui.QFormLayout.FieldRole, + self.footerSizeSpinBox) ThemeWizard.addPage(self.footerAreaPage) self.alignmentPage = QtGui.QWizardPage() self.alignmentPage.setObjectName(u'alignmentPage') @@ -260,26 +303,31 @@ class Ui_ThemeWizard(object): self.formLayout_2.setObjectName(u'formLayout_2') self.horizontalLabel = QtGui.QLabel(self.alignmentPage) self.horizontalLabel.setObjectName(u'horizontalLabel') - self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, self.horizontalLabel) + self.formLayout_2.setWidget(0, QtGui.QFormLayout.LabelRole, + self.horizontalLabel) self.horizontalComboBox = QtGui.QComboBox(self.alignmentPage) self.horizontalComboBox.setEditable(False) self.horizontalComboBox.setObjectName(u'horizontalComboBox') self.horizontalComboBox.addItem(u'') self.horizontalComboBox.addItem(u'') self.horizontalComboBox.addItem(u'') - self.formLayout_2.setWidget(0, QtGui.QFormLayout.FieldRole, self.horizontalComboBox) + self.formLayout_2.setWidget(0, QtGui.QFormLayout.FieldRole, + self.horizontalComboBox) self.verticalLabel = QtGui.QLabel(self.alignmentPage) self.verticalLabel.setObjectName(u'verticalLabel') - self.formLayout_2.setWidget(1, QtGui.QFormLayout.LabelRole, self.verticalLabel) + self.formLayout_2.setWidget(1, QtGui.QFormLayout.LabelRole, + self.verticalLabel) self.verticalComboBox = QtGui.QComboBox(self.alignmentPage) self.verticalComboBox.setObjectName(u'verticalComboBox') self.verticalComboBox.addItem(u'') self.verticalComboBox.addItem(u'') self.verticalComboBox.addItem(u'') - self.formLayout_2.setWidget(1, QtGui.QFormLayout.FieldRole, self.verticalComboBox) + self.formLayout_2.setWidget(1, QtGui.QFormLayout.FieldRole, + self.verticalComboBox) self.transitionsCheckBox = QtGui.QCheckBox(self.alignmentPage) self.transitionsCheckBox.setObjectName(u'transitionsCheckBox') - self.formLayout_2.setWidget(2, QtGui.QFormLayout.FieldRole, self.transitionsCheckBox) + self.formLayout_2.setWidget(2, QtGui.QFormLayout.FieldRole, + self.transitionsCheckBox) ThemeWizard.addPage(self.alignmentPage) self.areaPositionPage = QtGui.QWizardPage() self.areaPositionPage.setObjectName(u'areaPositionPage') @@ -294,128 +342,163 @@ class Ui_ThemeWizard(object): self.mainPositionLayout.setMargin(8) self.mainPositionLayout.setSpacing(8) self.mainPositionLayout.setObjectName(u'mainPositionLayout') - self.mainDefaultPositionCheckBox = QtGui.QCheckBox(self.mainPositionGroupBox) + self.mainDefaultPositionCheckBox = \ + QtGui.QCheckBox(self.mainPositionGroupBox) self.mainDefaultPositionCheckBox.setChecked(True) self.mainDefaultPositionCheckBox.setTristate(False) - self.mainDefaultPositionCheckBox.setObjectName(u'mainDefaultPositionCheckBox') - self.mainPositionLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.mainDefaultPositionCheckBox) + self.mainDefaultPositionCheckBox.setObjectName( + u'mainDefaultPositionCheckBox') + self.mainPositionLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.mainDefaultPositionCheckBox) self.nainXLabel = QtGui.QLabel(self.mainPositionGroupBox) self.nainXLabel.setObjectName(u'nainXLabel') - self.mainPositionLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.nainXLabel) + self.mainPositionLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.nainXLabel) self.mainXSpinBox = QtGui.QSpinBox(self.mainPositionGroupBox) self.mainXSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainXSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainXSpinBox.sizePolicy().hasHeightForWidth()) self.mainXSpinBox.setSizePolicy(sizePolicy) self.mainXSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.mainXSpinBox.setMaximum(9999) self.mainXSpinBox.setProperty(u'value', 0) self.mainXSpinBox.setObjectName(u'mainXSpinBox') - self.mainPositionLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.mainXSpinBox) + self.mainPositionLayout.setWidget(1, QtGui.QFormLayout.FieldRole, + self.mainXSpinBox) self.mainYSpinBox = QtGui.QSpinBox(self.mainPositionGroupBox) self.mainYSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainYSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainYSpinBox.sizePolicy().hasHeightForWidth()) self.mainYSpinBox.setSizePolicy(sizePolicy) self.mainYSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.mainYSpinBox.setMaximum(9999) self.mainYSpinBox.setObjectName(u'mainYSpinBox') - self.mainPositionLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.mainYSpinBox) + self.mainPositionLayout.setWidget(2, QtGui.QFormLayout.FieldRole, + self.mainYSpinBox) self.mainYLabel = QtGui.QLabel(self.mainPositionGroupBox) self.mainYLabel.setObjectName(u'mainYLabel') - self.mainPositionLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.mainYLabel) + self.mainPositionLayout.setWidget(2, QtGui.QFormLayout.LabelRole, + self.mainYLabel) self.mainWidthSpinBox = QtGui.QSpinBox(self.mainPositionGroupBox) self.mainWidthSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainWidthSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainWidthSpinBox.sizePolicy().hasHeightForWidth()) self.mainWidthSpinBox.setSizePolicy(sizePolicy) self.mainWidthSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.mainWidthSpinBox.setMaximum(9999) self.mainWidthSpinBox.setObjectName(u'mainWidthSpinBox') - self.mainPositionLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.mainWidthSpinBox) + self.mainPositionLayout.setWidget(3, QtGui.QFormLayout.FieldRole, + self.mainWidthSpinBox) self.mainWidthLabel = QtGui.QLabel(self.mainPositionGroupBox) self.mainWidthLabel.setObjectName(u'mainWidthLabel') - self.mainPositionLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.mainWidthLabel) + self.mainPositionLayout.setWidget(3, QtGui.QFormLayout.LabelRole, + self.mainWidthLabel) self.mainHeightSpinBox = QtGui.QSpinBox(self.mainPositionGroupBox) self.mainHeightSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy( + QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.mainHeightSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.mainHeightSpinBox.sizePolicy().hasHeightForWidth()) self.mainHeightSpinBox.setSizePolicy(sizePolicy) self.mainHeightSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.mainHeightSpinBox.setMaximum(9999) self.mainHeightSpinBox.setObjectName(u'mainHeightSpinBox') - self.mainPositionLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.mainHeightSpinBox) + self.mainPositionLayout.setWidget(4, QtGui.QFormLayout.FieldRole, + self.mainHeightSpinBox) self.mainHeightLabel = QtGui.QLabel(self.mainPositionGroupBox) self.mainHeightLabel.setObjectName(u'mainHeightLabel') - self.mainPositionLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.mainHeightLabel) + self.mainPositionLayout.setWidget(4, QtGui.QFormLayout.LabelRole, + self.mainHeightLabel) self.gridLayout_2.addWidget(self.mainPositionGroupBox, 1, 0, 1, 1) self.footerPositionGroupBox = QtGui.QGroupBox(self.areaPositionPage) self.footerPositionGroupBox.setMinimumSize(QtCore.QSize(248, 0)) self.footerPositionGroupBox.setObjectName(u'footerPositionGroupBox') - self.footerPositionLayout = QtGui.QFormLayout(self.footerPositionGroupBox) + self.footerPositionLayout = \ + QtGui.QFormLayout(self.footerPositionGroupBox) self.footerPositionLayout.setMargin(8) self.footerPositionLayout.setSpacing(8) self.footerPositionLayout.setObjectName(u'footerPositionLayout') self.footerXLabel = QtGui.QLabel(self.footerPositionGroupBox) self.footerXLabel.setObjectName(u'footerXLabel') - self.footerPositionLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.footerXLabel) + self.footerPositionLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.footerXLabel) self.footerXSpinBox = QtGui.QSpinBox(self.footerPositionGroupBox) self.footerXSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.footerXSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.footerXSpinBox.sizePolicy().hasHeightForWidth()) self.footerXSpinBox.setSizePolicy(sizePolicy) self.footerXSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.footerXSpinBox.setMaximum(9999) self.footerXSpinBox.setProperty(u'value', 0) self.footerXSpinBox.setObjectName(u'footerXSpinBox') - self.footerPositionLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.footerXSpinBox) + self.footerPositionLayout.setWidget(1, QtGui.QFormLayout.FieldRole, + self.footerXSpinBox) self.footerYLabel = QtGui.QLabel(self.footerPositionGroupBox) self.footerYLabel.setObjectName(u'footerYLabel') - self.footerPositionLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.footerYLabel) + self.footerPositionLayout.setWidget(2, QtGui.QFormLayout.LabelRole, + self.footerYLabel) self.footerYSpinBox = QtGui.QSpinBox(self.footerPositionGroupBox) self.footerYSpinBox.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.footerYSpinBox.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.footerYSpinBox.sizePolicy().hasHeightForWidth()) self.footerYSpinBox.setSizePolicy(sizePolicy) self.footerYSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.footerYSpinBox.setMaximum(9999) self.footerYSpinBox.setProperty(u'value', 0) self.footerYSpinBox.setObjectName(u'footerYSpinBox') - self.footerPositionLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.footerYSpinBox) + self.footerPositionLayout.setWidget(2, QtGui.QFormLayout.FieldRole, + self.footerYSpinBox) self.footerWidthLabel = QtGui.QLabel(self.footerPositionGroupBox) self.footerWidthLabel.setObjectName(u'footerWidthLabel') - self.footerPositionLayout.setWidget(3, QtGui.QFormLayout.LabelRole, self.footerWidthLabel) + self.footerPositionLayout.setWidget(3, QtGui.QFormLayout.LabelRole, + self.footerWidthLabel) self.footerWidthSpinBox = QtGui.QSpinBox(self.footerPositionGroupBox) self.footerWidthSpinBox.setEnabled(False) self.footerWidthSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.footerWidthSpinBox.setMaximum(9999) self.footerWidthSpinBox.setObjectName(u'footerWidthSpinBox') - self.footerPositionLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.footerWidthSpinBox) + self.footerPositionLayout.setWidget(3, QtGui.QFormLayout.FieldRole, + self.footerWidthSpinBox) self.footerHeightLabel = QtGui.QLabel(self.footerPositionGroupBox) self.footerHeightLabel.setObjectName(u'footerHeightLabel') - self.footerPositionLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.footerHeightLabel) + self.footerPositionLayout.setWidget(4, QtGui.QFormLayout.LabelRole, + self.footerHeightLabel) self.footerHeightSpinBox = QtGui.QSpinBox(self.footerPositionGroupBox) self.footerHeightSpinBox.setEnabled(False) self.footerHeightSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.footerHeightSpinBox.setMaximum(9999) self.footerHeightSpinBox.setObjectName(u'footerHeightSpinBox') - self.footerPositionLayout.setWidget(4, QtGui.QFormLayout.FieldRole, self.footerHeightSpinBox) - self.footerDefaultPositionCheckBox = QtGui.QCheckBox(self.footerPositionGroupBox) + self.footerPositionLayout.setWidget(4, QtGui.QFormLayout.FieldRole, + self.footerHeightSpinBox) + self.footerDefaultPositionCheckBox = \ + QtGui.QCheckBox(self.footerPositionGroupBox) self.footerDefaultPositionCheckBox.setChecked(True) - self.footerDefaultPositionCheckBox.setObjectName(u'footerDefaultPositionCheckBox') - self.footerPositionLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.footerDefaultPositionCheckBox) + self.footerDefaultPositionCheckBox.setObjectName( + u'footerDefaultPositionCheckBox') + self.footerPositionLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.footerDefaultPositionCheckBox) self.gridLayout_2.addWidget(self.footerPositionGroupBox, 1, 1, 1, 1) ThemeWizard.addPage(self.areaPositionPage) self.previewPage = QtGui.QWizardPage() @@ -437,13 +520,16 @@ class Ui_ThemeWizard(object): self.groupBox.setObjectName(u'groupBox') self.horizontalLayout = QtGui.QHBoxLayout(self.groupBox) self.horizontalLayout.setObjectName(u'horizontalLayout') - spacerItem2 = QtGui.QSpacerItem(58, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem2 = QtGui.QSpacerItem(58, 20, QtGui.QSizePolicy.Expanding, + QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem2) self.previewBoxLabel = QtGui.QLabel(self.groupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.previewBoxLabel.sizePolicy().hasHeightForWidth()) + sizePolicy.setHeightForWidth( + self.previewBoxLabel.sizePolicy().hasHeightForWidth()) self.previewBoxLabel.setSizePolicy(sizePolicy) self.previewBoxLabel.setMinimumSize(QtCore.QSize(300, 200)) self.previewBoxLabel.setFrameShape(QtGui.QFrame.WinPanel) @@ -453,13 +539,15 @@ class Ui_ThemeWizard(object): self.previewBoxLabel.setScaledContents(True) self.previewBoxLabel.setObjectName(u'previewBoxLabel') self.horizontalLayout.addWidget(self.previewBoxLabel) - spacerItem3 = QtGui.QSpacerItem(78, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem3 = QtGui.QSpacerItem(78, 20, QtGui.QSizePolicy.Expanding, + QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem3) ThemeWizard.addPage(self.previewPage) self.themeNameLabel.setBuddy(self.themeNameEdit) self.retranslateUi(ThemeWizard) - QtCore.QObject.connect(ThemeWizard, QtCore.SIGNAL(u'accepted()'), ThemeWizard.accept) + QtCore.QObject.connect(ThemeWizard, QtCore.SIGNAL(u'accepted()'), + ThemeWizard.accept) QtCore.QMetaObject.connectSlotsByName(ThemeWizard) def retranslateUi(self, ThemeWizard): From b88436c6413b91a0b230d3257b5a46beb0168b4f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 2 Dec 2010 18:36:35 +0100 Subject: [PATCH 27/40] autocompleter should be 'CaseInsensitive' --- openlp/plugins/bibles/lib/mediaitem.py | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index a3b95d3f3..3044e431a 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -241,9 +241,9 @@ class BibleMediaItem(MediaManagerItem): QtCore.QObject.connect(self.AdvancedToChapter, QtCore.SIGNAL(u'activated(int)'), self.onAdvancedToChapter) QtCore.QObject.connect(self.QuickSearchComboBox, - QtCore.SIGNAL(u'activated(int)'), self.autoCompletion) + QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter) QtCore.QObject.connect(self.QuickVersionComboBox, - QtCore.SIGNAL(u'activated(int)'), self.autoCompletion) + QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter) # Buttons QtCore.QObject.connect(self.AdvancedSearchButton, QtCore.SIGNAL(u'pressed()'), self.onAdvancedSearchButton) @@ -336,6 +336,7 @@ class BibleMediaItem(MediaManagerItem): log.debug(u'bible manager initialise') self.parent.manager.media = self self.loadBibles() + self.updateAutoCompleter() self.configUpdated() log.debug(u'bible manager initialise complete') @@ -402,6 +403,15 @@ class BibleMediaItem(MediaManagerItem): self.loadBibles() def initialiseBible(self, bible): + """ + This initialises the given bible, which means that its book names and + their chapter numbers is added to the combo boxes on the + 'Advanced Search' Tab. This is not of any importance of the + 'Quick Search' Tab. + + ``bible`` + The bible to initialise (unicode). + """ log.debug(u'initialiseBible %s', bible) book_data = self.parent.manager.get_books(bible) self.AdvancedBookComboBox.clear() @@ -432,11 +442,11 @@ class BibleMediaItem(MediaManagerItem): self.adjustComboBox(1, verse_count, self.AdvancedFromVerse) self.adjustComboBox(1, verse_count, self.AdvancedToVerse) - def autoCompletion(self): + def updateAutoCompleter(self): """ - This add or updates a bible book completion list for the search field. - The completion depends on the bible. It is only added when we are doing - a verse search on the quick tab, otherwise it is removed. + This updates the bible book completion list for the search field. The + completion depends on the bible. It is only updated when we are doing a + verse search, otherwise the auto completion list is removed. """ books = [] # We have to do a 'Verse Search'. @@ -445,7 +455,9 @@ class BibleMediaItem(MediaManagerItem): if bible: book_data = self.parent.manager.get_books(bible) books = [book[u'name'] for book in book_data] - self.QuickSearchEdit.setCompleter(QtGui.QCompleter(books)) + completer = QtGui.QCompleter(books) + completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + self.QuickSearchEdit.setCompleter(completer) def onAdvancedVersionComboBox(self): self.initialiseBible( From 1b6aa34d3969660748c7171c82ad09f448ddeca8 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 3 Dec 2010 15:14:32 +0000 Subject: [PATCH 28/40] Pylint again --- openlp/core/ui/themewizard.py | 117 ++++++++++++++++++++++------------ 1 file changed, 78 insertions(+), 39 deletions(-) diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index bff8a578c..a2a919857 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -551,36 +551,52 @@ class Ui_ThemeWizard(object): QtCore.QMetaObject.connectSlotsByName(ThemeWizard) def retranslateUi(self, ThemeWizard): - ThemeWizard.setWindowTitle(translate('OpenLP.ThemeForm', 'Theme Wizard')) - self.titleLabel.setText(translate('OpenLP.ThemeForm', '\n' + ThemeWizard.setWindowTitle(translate('OpenLP.ThemeForm', + 'Theme Wizard')) + self.titleLabel.setText(translate('OpenLP.ThemeForm', + '\n' '\n' '

Welcome to the Theme Wizard

')) self.informationLabel.setText(translate('OpenLP.ThemeForm', 'This wizard will help you to maintain Themes . Click the next button below to start the process by setting up your background.')) self.backgroundPage.setTitle(translate('OpenLP.ThemeForm', 'Set Up Background')) - self.backgroundPage.setSubTitle(translate('OpenLP.ThemeForm', 'Set up your theme\'s background according to the parameters below.')) - self.backgroundTypeLabel.setText(translate('OpenLP.ThemeForm', 'Background type:')) - self.backgroundTypeComboBox.setItemText(0, translate('OpenLP.ThemeForm', 'Solid Color')) - self.backgroundTypeComboBox.setItemText(1, translate('OpenLP.ThemeForm', 'Gradient')) - self.backgroundTypeComboBox.setItemText(2, translate('OpenLP.ThemeForm', 'Image')) + self.backgroundPage.setSubTitle(translate('OpenLP.ThemeForm', + 'Set up your theme\'s background according to the parameters below.')) + self.backgroundTypeLabel.setText(translate('OpenLP.ThemeForm', + 'Background type:')) + self.backgroundTypeComboBox.setItemText(0, translate('OpenLP.ThemeForm', + 'Solid Color')) + self.backgroundTypeComboBox.setItemText(1, translate('OpenLP.ThemeForm', + 'Gradient')) + self.backgroundTypeComboBox.setItemText(2, translate('OpenLP.ThemeForm', + 'Image')) self.color1Label.setText(translate('OpenLP.ThemeForm', '')) self.color2Label.setText(translate('OpenLP.ThemeForm', '')) self.imageLabel.setText(translate('OpenLP.ThemeForm', 'Image:')) self.gradientLabel.setText(translate('OpenLP.ThemeForm', 'Gradient:')) - self.gradientComboBox.setItemText(0, translate('OpenLP.ThemeForm', 'Horizontal')) - self.gradientComboBox.setItemText(1, translate('OpenLP.ThemeForm', 'Vertical')) - self.gradientComboBox.setItemText(2, translate('OpenLP.ThemeForm', 'Circular')) - self.gradientComboBox.setItemText(3, translate('OpenLP.ThemeForm', 'Top Left - Bottom Right')) - self.gradientComboBox.setItemText(4, translate('OpenLP.ThemeForm', 'Bottom Left - Top Right')) - self.mainAreaPage.setTitle(translate('OpenLP.ThemeForm', 'Main Area Font Details')) - self.mainAreaPage.setSubTitle(translate('OpenLP.ThemeForm', 'Define the font and display characteristics for the Display text')) + self.gradientComboBox.setItemText(0, translate('OpenLP.ThemeForm', + 'Horizontal')) + self.gradientComboBox.setItemText(1, translate('OpenLP.ThemeForm', + 'Vertical')) + self.gradientComboBox.setItemText(2, translate('OpenLP.ThemeForm', + 'Circular')) + self.gradientComboBox.setItemText(3, translate('OpenLP.ThemeForm', + 'Top Left - Bottom Right')) + self.gradientComboBox.setItemText(4, translate('OpenLP.ThemeForm', + 'Bottom Left - Top Right')) + self.mainAreaPage.setTitle(translate('OpenLP.ThemeForm', + 'Main Area Font Details')) + self.mainAreaPage.setSubTitle(translate('OpenLP.ThemeForm', + 'Define the font and display characteristics for the Display text')) self.mainFontLabel.setText(translate('OpenLP.ThemeForm', 'Font:')) self.mainColorLabel.setText(translate('OpenLP.ThemeForm', 'Color:')) self.mainSizeLabel.setText(translate('OpenLP.ThemeForm', 'Size:')) self.mainSizeSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'pt')) - self.mainLineCountLabel.setText(translate('OpenLP.ThemeForm', '(%d lines per slide)')) - self.lineSpacingLabel.setText(translate('OpenLP.ThemeForm', 'Line Spacing:')) + self.mainLineCountLabel.setText(translate('OpenLP.ThemeForm', + '(%d lines per slide)')) + self.lineSpacingLabel.setText(translate('OpenLP.ThemeForm', + 'Line Spacing:')) self.lineSpacingSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'pt')) self.outlineCheckBox.setText(translate('OpenLP.ThemeForm', '&Outline:')) self.outlineSizeLabel.setText(translate('OpenLP.ThemeForm', 'Size:')) @@ -589,28 +605,46 @@ class Ui_ThemeWizard(object): self.shadowSizeLabel.setText(translate('OpenLP.ThemeForm', 'Size:')) self.shadowSizeSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'pt')) self.boldCheckBox.setText(translate('OpenLP.ThemeForm', 'Bold Display')) - self.italicsCheckBox.setText(translate('OpenLP.ThemeForm', 'Italic Display')) - self.footerAreaPage.setTitle(translate('OpenLP.ThemeForm', 'Footer Area Font Details')) - self.footerAreaPage.setSubTitle(translate('OpenLP.ThemeForm', 'Define the font and display characteristics for the Footer text')) + self.italicsCheckBox.setText(translate('OpenLP.ThemeForm', + 'Italic Display')) + self.footerAreaPage.setTitle(translate('OpenLP.ThemeForm', + 'Footer Area Font Details')) + self.footerAreaPage.setSubTitle(translate('OpenLP.ThemeForm', + 'Define the font and display characteristics for the Footer text')) self.footerFontLabel.setText(translate('OpenLP.ThemeForm', 'Font:')) self.footerColorLabel.setText(translate('OpenLP.ThemeForm', 'Color:')) self.footerSizeLabel.setText(translate('OpenLP.ThemeForm', 'Size:')) self.footerSizeSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'pt')) - self.alignmentPage.setTitle(translate('OpenLP.ThemeForm', 'Text Formatting Details')) - self.alignmentPage.setSubTitle(translate('OpenLP.ThemeForm', 'Allows additional display formatting information to be defined')) - self.horizontalLabel.setText(translate('OpenLP.ThemeForm', 'Horizontal Align:')) - self.horizontalComboBox.setItemText(0, translate('OpenLP.ThemeForm', 'Left')) - self.horizontalComboBox.setItemText(1, translate('OpenLP.ThemeForm', 'Right')) - self.horizontalComboBox.setItemText(2, translate('OpenLP.ThemeForm', 'Center')) - self.verticalLabel.setText(translate('OpenLP.ThemeForm', 'Vertcal Align:')) - self.verticalComboBox.setItemText(0, translate('OpenLP.ThemeForm', 'Top')) - self.verticalComboBox.setItemText(1, translate('OpenLP.ThemeForm', 'Middle')) - self.verticalComboBox.setItemText(2, translate('OpenLP.ThemeForm', 'Bottom')) - self.transitionsCheckBox.setText(translate('OpenLP.ThemeForm', 'Transitions')) - self.areaPositionPage.setTitle(translate('OpenLP.ThemeForm', 'Output Area Locations')) - self.areaPositionPage.setSubTitle(translate('OpenLP.ThemeForm', 'Allows you to change and move the Main and Footer areas.')) - self.mainPositionGroupBox.setTitle(translate('OpenLP.ThemeForm', '&Main Area')) - self.mainDefaultPositionCheckBox.setText(translate('OpenLP.ThemeForm', '&Use default location')) + self.alignmentPage.setTitle(translate('OpenLP.ThemeForm', + 'Text Formatting Details')) + self.alignmentPage.setSubTitle(translate('OpenLP.ThemeForm', + 'Allows additional display formatting information to be defined')) + self.horizontalLabel.setText(translate('OpenLP.ThemeForm', + 'Horizontal Align:')) + self.horizontalComboBox.setItemText(0, translate('OpenLP.ThemeForm', + 'Left')) + self.horizontalComboBox.setItemText(1, translate('OpenLP.ThemeForm', + 'Right')) + self.horizontalComboBox.setItemText(2, translate('OpenLP.ThemeForm', + 'Center')) + self.verticalLabel.setText(translate('OpenLP.ThemeForm', + 'Vertcal Align:')) + self.verticalComboBox.setItemText(0, translate('OpenLP.ThemeForm', + 'Top')) + self.verticalComboBox.setItemText(1, translate('OpenLP.ThemeForm', + 'Middle')) + self.verticalComboBox.setItemText(2, translate('OpenLP.ThemeForm', + 'Bottom')) + self.transitionsCheckBox.setText(translate('OpenLP.ThemeForm', + 'Transitions')) + self.areaPositionPage.setTitle(translate('OpenLP.ThemeForm', + 'Output Area Locations')) + self.areaPositionPage.setSubTitle(translate('OpenLP.ThemeForm', + 'Allows you to change and move the Main and Footer areas.')) + self.mainPositionGroupBox.setTitle(translate('OpenLP.ThemeForm', + '&Main Area')) + self.mainDefaultPositionCheckBox.setText(translate('OpenLP.ThemeForm', + '&Use default location')) self.nainXLabel.setText(translate('OpenLP.ThemeForm', 'X position:')) self.mainXSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) self.mainYSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) @@ -619,7 +653,8 @@ class Ui_ThemeWizard(object): self.mainWidthLabel.setText(translate('OpenLP.ThemeForm', 'Width:')) self.mainHeightSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) self.mainHeightLabel.setText(translate('OpenLP.ThemeForm', 'Height:')) - self.footerPositionGroupBox.setTitle(translate('OpenLP.ThemeForm', 'Footer Area')) + self.footerPositionGroupBox.setTitle(translate('OpenLP.ThemeForm', + 'Footer Area')) self.footerXLabel.setText(translate('OpenLP.ThemeForm', 'X position:')) self.footerXSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) self.footerYLabel.setText(translate('OpenLP.ThemeForm', 'Y position:')) @@ -628,8 +663,12 @@ class Ui_ThemeWizard(object): self.footerWidthSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) self.footerHeightLabel.setText(translate('OpenLP.ThemeForm', 'Height:')) self.footerHeightSpinBox.setSuffix(translate('OpenLP.ThemeForm', 'px')) - self.footerDefaultPositionCheckBox.setText(translate('OpenLP.ThemeForm', 'Use default location')) - self.previewPage.setTitle(translate('OpenLP.ThemeForm', 'Save and Preview')) - self.previewPage.setSubTitle(translate('OpenLP.ThemeForm', 'View the theme and save it replacing the current one or change the name to create a new theme')) - self.themeNameLabel.setText(translate('OpenLP.ThemeForm', 'Theme name:')) + self.footerDefaultPositionCheckBox.setText(translate('OpenLP.ThemeForm', + 'Use default location')) + self.previewPage.setTitle(translate('OpenLP.ThemeForm', + 'Save and Preview')) + self.previewPage.setSubTitle(translate('OpenLP.ThemeForm', + 'View the theme and save it replacing the current one or change the name to create a new theme')) + self.themeNameLabel.setText(translate('OpenLP.ThemeForm', + 'Theme name:')) self.previewLabel.setText(translate('OpenLP.ThemeForm', 'Preview')) From 37c065a6e4768fea0e9be5e5a7fe77ecef1a1fce Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 3 Dec 2010 18:56:12 +0000 Subject: [PATCH 29/40] pylint finished for now --- openlp/core/ui/servicemanager.py | 10 +++++----- openlp/core/ui/slidecontroller.py | 12 ++++++------ openlp/core/ui/thememanager.py | 2 +- openlp/core/ui/themestab.py | 6 +++--- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 6d721823a..85dff6b91 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -759,7 +759,7 @@ class ServiceManager(QtGui.QWidget): self.onNewService() for item in items: serviceitem = ServiceItem() - serviceitem.render_manager = self.parent.RenderManager + serviceitem.render_manager = self.parent.renderManager serviceitem.set_from_service(item, self.servicePath) self.validateItem(serviceitem) self.addServiceItem(serviceitem) @@ -820,7 +820,7 @@ class ServiceManager(QtGui.QWidget): """ log.debug(u'onThemeComboBoxSelected') self.service_theme = unicode(self.themeComboBox.currentText()) - self.parent.RenderManager.set_service_theme(self.service_theme) + self.parent.renderManager.set_service_theme(self.service_theme) QtCore.QSettings().setValue( self.parent.serviceSettingsSection + u'/service theme', QtCore.QVariant(self.service_theme)) @@ -832,7 +832,7 @@ class ServiceManager(QtGui.QWidget): sure the theme combo box is in the correct state. """ log.debug(u'themeChange') - if self.parent.RenderManager.theme_level == ThemeLevel.Global: + if self.parent.renderManager.theme_level == ThemeLevel.Global: self.toolbar.actions[u'ThemeLabel'].setVisible(False) self.toolbar.actions[u'ThemeWidget'].setVisible(False) else: @@ -846,7 +846,7 @@ class ServiceManager(QtGui.QWidget): """ log.debug(u'regenerateServiceItems') # force reset of renderer as theme data has changed - self.parent.RenderManager.themedata = None + self.parent.renderManager.themedata = None if self.serviceItems: tempServiceItems = self.serviceItems self.serviceManagerList.clear() @@ -1088,7 +1088,7 @@ class ServiceManager(QtGui.QWidget): index = 0 self.service_theme = u'' self.themeComboBox.setCurrentIndex(index) - self.parent.RenderManager.set_service_theme(self.service_theme) + self.parent.renderManager.set_service_theme(self.service_theme) self.regenerateServiceItems() def onThemeChangeAction(self): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 48810990a..f667c6d3c 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -400,7 +400,7 @@ class SlideController(QtGui.QWidget): log.debug(u'screenSizeChanged live = %s' % self.isLive) # rebuild display as screen size changed self.display = MainDisplay(self, self.screens, self.isLive) - self.display.imageManager = self.parent.RenderManager.image_manager + self.display.imageManager = self.parent.renderManager.image_manager self.display.alertTab = self.alertTab self.ratio = float(self.screens.current[u'size'].width()) / \ float(self.screens.current[u'size'].height()) @@ -416,7 +416,7 @@ class SlideController(QtGui.QWidget): """ log.debug(u'widthChanged live = %s' % self.isLive) width = self.parent.ControlSplitter.sizes()[self.split] - height = width * self.parent.RenderManager.screen_ratio + height = width * self.parent.renderManager.screen_ratio self.PreviewListWidget.setColumnWidth(0, width) # Sort out image heights (Songs, bibles excluded) if self.serviceItem and not self.serviceItem.is_text(): @@ -595,14 +595,14 @@ class SlideController(QtGui.QWidget): label.setScaledContents(True) if self.serviceItem.is_command(): image = resize_image(frame[u'image'], - self.parent.RenderManager.width, - self.parent.RenderManager.height) + self.parent.renderManager.width, + self.parent.renderManager.height) else: - image = self.parent.RenderManager.image_manager. \ + image = self.parent.renderManager.image_manager. \ get_image(frame[u'title']) label.setPixmap(QtGui.QPixmap.fromImage(image)) self.PreviewListWidget.setCellWidget(framenumber, 0, label) - slideHeight = width * self.parent.RenderManager.screen_ratio + slideHeight = width * self.parent.renderManager.screen_ratio row += 1 text.append(unicode(row)) self.PreviewListWidget.setItem(framenumber, 0, item) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 56765eda6..e69bdade1 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -750,7 +750,7 @@ class ThemeManager(QtGui.QWidget): Flag to tell message lines per page need to be generated. """ log.debug(u'generateImage \n%s ', themeData) - return self.parent.RenderManager.generate_preview(themeData, forcePage) + return self.parent.renderManager.generate_preview(themeData, forcePage) def getPreviewImage(self, theme): """ diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 853865bb5..412d2dec2 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -153,7 +153,7 @@ class ThemesTab(SettingsTab): settings.setValue(u'global theme', QtCore.QVariant(self.global_theme)) settings.endGroup() - self.parent.RenderManager.set_global_theme( + self.parent.renderManager.set_global_theme( self.global_theme, self.theme_level) Receiver.send_message(u'theme_update_global', self.global_theme) @@ -171,7 +171,7 @@ class ThemesTab(SettingsTab): def onDefaultComboBoxChanged(self, value): self.global_theme = unicode(self.DefaultComboBox.currentText()) - self.parent.RenderManager.set_global_theme( + self.parent.renderManager.set_global_theme( self.global_theme, self.theme_level) image = self.parent.ThemeManagerContents.getPreviewImage( self.global_theme) @@ -198,7 +198,7 @@ class ThemesTab(SettingsTab): id = 0 # Not Found self.global_theme = u'' self.DefaultComboBox.setCurrentIndex(id) - self.parent.RenderManager.set_global_theme( + self.parent.renderManager.set_global_theme( self.global_theme, self.theme_level) if self.global_theme is not u'': image = self.parent.ThemeManagerContents.getPreviewImage( From 99cfc65446efdc0afe7d4dfe0364127d1e468b98 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 3 Dec 2010 19:00:40 +0000 Subject: [PATCH 30/40] Allow theme name to be changed after error message Fixes: https://launchpad.net/bugs/684901 --- openlp/core/ui/themeform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index cc52abafc..aa1780836 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -606,7 +606,6 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): # Hack to stop it for now. if self.accepted: return - self.accepted = True # Save the theme name self.theme.theme_name = \ unicode(self.field(u'name').toString()) @@ -628,6 +627,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): (QtGui.QMessageBox.Ok), QtGui.QMessageBox.Ok) return + self.accepted = True saveFrom = None saveTo = None if self.theme.background_type == \ From 22f52b74c1659aa220c7ddde2d5f73e019743858 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 3 Dec 2010 19:21:15 +0000 Subject: [PATCH 31/40] Fix spelling --- openlp/core/lib/theme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py index db31f54da..542e4e723 100644 --- a/openlp/core/lib/theme.py +++ b/openlp/core/lib/theme.py @@ -56,7 +56,7 @@ BLANK_THEME_XML = \ Arial #FFFFFF - 30 + 40 False False 0 From 245465ab112e875a82f9b862c471909882a77ced Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 3 Dec 2010 20:53:56 +0100 Subject: [PATCH 32/40] improved completor performance --- openlp/plugins/bibles/lib/mediaitem.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 3044e431a..949035c0b 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -451,10 +451,12 @@ class BibleMediaItem(MediaManagerItem): books = [] # We have to do a 'Verse Search'. if self.QuickSearchComboBox.currentIndex() == 0: + bibles = self.parent.manager.get_bibles() bible = unicode(self.QuickVersionComboBox.currentText()) if bible: - book_data = self.parent.manager.get_books(bible) - books = [book[u'name'] for book in book_data] + book_data = bibles[bible].get_books() + books = [book.name for book in book_data] + books.sort() completer = QtGui.QCompleter(books) completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.QuickSearchEdit.setCompleter(completer) From 41dfd114d7878662cdb07d41be6aedff1d6a6be2 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 3 Dec 2010 20:22:59 +0000 Subject: [PATCH 33/40] Theme values are preserved correctly Fixes: https://launchpad.net/bugs/684901 --- openlp/core/lib/theme.py | 1 - openlp/core/ui/themeform.py | 17 ++++++++++------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py index 542e4e723..ae893ead1 100644 --- a/openlp/core/lib/theme.py +++ b/openlp/core/lib/theme.py @@ -318,7 +318,6 @@ class ThemeXML(object): ``shadow_size`` How big the Shadow is - """ background = self.theme_xml.createElement(u'font') background.setAttribute(u'type', fonttype) diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index aa1780836..ba439c5b1 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -55,6 +55,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): self.setupUi(self) self.registerFields() self.accepted = False + self.updateThemeAllowed = True QtCore.QObject.connect(self.backgroundTypeComboBox, QtCore.SIGNAL(u'currentIndexChanged(int)'), self.onBackgroundComboBox) @@ -164,8 +165,6 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): u'background_image', self.imageLineEdit) self.backgroundPage.registerField( u'gradient', self.gradientComboBox) - self.mainAreaPage.registerField( - u'mainFontComboBox', self.mainFontComboBox) self.mainAreaPage.registerField( u'mainColorPushButton', self.mainColorPushButton) self.mainAreaPage.registerField( @@ -285,7 +284,9 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): """ Run the wizard. """ + self.updateThemeAllowed = False self.setDefaults() + self.updateThemeAllowed = True return QtGui.QWizard.exec_(self) def initializePage(self, id): @@ -526,11 +527,11 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): self.theme.background_filename = unicode(filename) self.setBackgroundTabValues() - def onMainFontComboBox(self): - """ - Main Font Combo box changed - """ - self.theme.font_main_name = self.mainFontComboBox.currentFont().family() +# def onMainFontComboBox(self): +# """ +# Main Font Combo box changed +# """ +# self.theme.font_main_name = self.mainFontComboBox.currentFont().family() def onMainColourPushButtonClicked(self): self.theme.font_main_color = \ @@ -557,6 +558,8 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): Update the theme object from the UI for fields not already updated when the are changed. """ + if not self.updateThemeAllowed: + return log.debug(u'updateTheme') # main page self.theme.font_main_name = \ From 38d777d98e042a9f12c47e1adc814657dd1e87e5 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 4 Dec 2010 09:05:11 +0000 Subject: [PATCH 34/40] Fix more line endings --- openlp/core/ui/themewizard.py | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index a2a919857..8f981ad7c 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -554,15 +554,25 @@ class Ui_ThemeWizard(object): ThemeWizard.setWindowTitle(translate('OpenLP.ThemeForm', 'Theme Wizard')) self.titleLabel.setText(translate('OpenLP.ThemeForm', - '\n' -'\n' -'

Welcome to the Theme Wizard

')) - self.informationLabel.setText(translate('OpenLP.ThemeForm', 'This wizard will help you to maintain Themes . Click the next button below to start the process by setting up your background.')) - self.backgroundPage.setTitle(translate('OpenLP.ThemeForm', 'Set Up Background')) + '\n' + '\n' + '

' + 'Welcome to the Theme Wizard

')) + self.informationLabel.setText(translate('OpenLP.ThemeForm', + 'This wizard will help you to maintain Themes . Click the next ' + 'button below to start the process by setting up your background.')) + self.backgroundPage.setTitle(translate('OpenLP.ThemeForm', + 'Set Up Background')) self.backgroundPage.setSubTitle(translate('OpenLP.ThemeForm', - 'Set up your theme\'s background according to the parameters below.')) + 'Set up your theme\'s background according to the parameters ' + 'below.')) self.backgroundTypeLabel.setText(translate('OpenLP.ThemeForm', 'Background type:')) self.backgroundTypeComboBox.setItemText(0, translate('OpenLP.ThemeForm', @@ -668,7 +678,8 @@ class Ui_ThemeWizard(object): self.previewPage.setTitle(translate('OpenLP.ThemeForm', 'Save and Preview')) self.previewPage.setSubTitle(translate('OpenLP.ThemeForm', - 'View the theme and save it replacing the current one or change the name to create a new theme')) + 'View the theme and save it replacing the current one or change ' + 'the name to create a new theme')) self.themeNameLabel.setText(translate('OpenLP.ThemeForm', 'Theme name:')) self.previewLabel.setText(translate('OpenLP.ThemeForm', 'Preview')) From 3389e487ca34a83bc1c42b7052b16a61fda73a0d Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 5 Dec 2010 20:02:36 +0200 Subject: [PATCH 35/40] Fixed issues from merges. Set second page of wizard on edit. --- openlp/core/ui/themeform.py | 4 +++- openlp/core/ui/thememanager.py | 2 +- openlp/core/ui/themewizard.py | 5 ++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index 613670f01..3b2c4edba 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -285,13 +285,15 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): self.footerHeightSpinBox.setEnabled(self.theme.font_footer_override) self.footerWidthSpinBox.setEnabled(self.theme.font_footer_override) - def exec_(self): + def exec_(self, edit=False): """ Run the wizard. """ self.updateThemeAllowed = False self.setDefaults() self.updateThemeAllowed = True + if edit: + self.next() return QtGui.QWizard.exec_(self) def initializePage(self, id): diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index e69bdade1..da8597cc0 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -280,7 +280,7 @@ class ThemeManager(QtGui.QWidget): self.saveThemeName = unicode( item.data(QtCore.Qt.UserRole).toString()) self.themeForm.theme = theme - self.themeForm.exec_() + self.themeForm.exec_(True) def onDeleteTheme(self): """ diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index b4b5fcea3..76fd1d445 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -36,8 +36,7 @@ class Ui_ThemeWizard(object): ThemeWizard.setWizardStyle(QtGui.QWizard.ModernStyle) ThemeWizard.setOptions( QtGui.QWizard.IndependentPages | - QtGui.QWizard.NoBackButtonOnStartPage | - QtGui.QWizard.NoBackButtonOnLastPage) + QtGui.QWizard.NoBackButtonOnStartPage) self.welcomePage = QtGui.QWizardPage() self.welcomePage.setTitle(u'') self.welcomePage.setSubTitle(u'') @@ -556,7 +555,7 @@ class Ui_ThemeWizard(object): u'footerDefaultPositionCheckBox') self.footerPositionLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.footerDefaultPositionCheckBox) - self.footerPositionGroupBox, 1, 1, 1, 1) + self.areaPositionLayout.addWidget(self.footerPositionGroupBox, 1, 1, 1, 1) ThemeWizard.addPage(self.areaPositionPage) self.previewPage = QtGui.QWizardPage() self.previewPage.setObjectName(u'previewPage') From 109d214fb37b1860307763a1e597f90db404d531 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 6 Dec 2010 19:25:44 +0000 Subject: [PATCH 36/40] Add comment --- openlp/core/ui/maindisplay.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index ba2a4b1cc..69eb9305d 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -23,7 +23,8 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - +""" +""" import logging import os From b01aed6b0d737660235d77e9f0a5d2f3c908215a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 6 Dec 2010 19:36:15 +0000 Subject: [PATCH 37/40] Fix theme main font color bug Fixes: https://launchpad.net/bugs/686122 --- openlp/core/lib/theme.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py index ae893ead1..afde5c9c5 100644 --- a/openlp/core/lib/theme.py +++ b/openlp/core/lib/theme.py @@ -325,7 +325,7 @@ class ThemeXML(object): # Create Font name element self.child_element(background, u'name', name) # Create Font color element - self.child_element(background, u'color', color) + self.child_element(background, u'color', unicode(color)) # Create Proportion name element self.child_element(background, u'size', unicode(size)) # Create weight name element From 117f77a4a4c63f4520f720f0017896a0a2b6d8dc Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 6 Dec 2010 19:42:17 +0000 Subject: [PATCH 38/40] Spell Vertical --- openlp/core/ui/themewizard.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index 76fd1d445..234c9de5e 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -708,7 +708,7 @@ class Ui_ThemeWizard(object): self.horizontalComboBox.setItemText(2, translate('OpenLP.ThemeWizard', 'Center')) self.verticalLabel.setText( - translate('OpenLP.ThemeWizard', 'Vertcal Align:')) + translate('OpenLP.ThemeWizard', 'Vertical Align:')) self.verticalComboBox.setItemText(0, translate('OpenLP.ThemeWizard', 'Top')) self.verticalComboBox.setItemText(1, From 9291516b59aef0842c968ad3f621a22b7fc4b91e Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Mon, 6 Dec 2010 23:37:55 +0000 Subject: [PATCH 39/40] Fix v2 import bug --- openlp/plugins/songs/lib/olpimport.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/olpimport.py b/openlp/plugins/songs/lib/olpimport.py index 6b993994c..662a94f5b 100644 --- a/openlp/plugins/songs/lib/olpimport.py +++ b/openlp/plugins/songs/lib/olpimport.py @@ -152,7 +152,7 @@ class OpenLPSongImport(SongImport): u'Importing song %s of %s' % (song_count, song_total)) new_song = Song() new_song.title = song.title - if has_media_files: + if has_media_files and hasattr(song, 'alternate_title'): new_song.alternate_title = song.alternate_title else: old_titles = song.search_title.split(u'@') From 7f60e706aad28b4dc0079d6d7226fe5f8d928be8 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Mon, 6 Dec 2010 23:59:01 +0000 Subject: [PATCH 40/40] Unused imports --- openlp/plugins/custom/lib/customxmlhandler.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/plugins/custom/lib/customxmlhandler.py b/openlp/plugins/custom/lib/customxmlhandler.py index 907c3470d..14ca23ee0 100644 --- a/openlp/plugins/custom/lib/customxmlhandler.py +++ b/openlp/plugins/custom/lib/customxmlhandler.py @@ -42,9 +42,8 @@ The basic XML is of the format:: import logging from xml.dom.minidom import Document -from xml.etree.ElementTree import ElementTree, XML, dump +from xml.etree.ElementTree import dump from lxml import etree, objectify -from xml.parsers.expat import ExpatError log = logging.getLogger(__name__)