From 47e7937baf9e0e5db08161b248543d203ba2cf30 Mon Sep 17 00:00:00 2001 From: M2j Date: Mon, 1 Nov 2010 21:48:30 +0100 Subject: [PATCH 001/140] - recognize openlp.org 1.x import char encoding by title, lyrics and copyright - prefere utf-8 encoding for CCLI imports --- openlp/plugins/songs/lib/cclifileimport.py | 7 ++++++- openlp/plugins/songs/lib/olp1import.py | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) mode change 100755 => 100644 openlp/plugins/songs/lib/cclifileimport.py diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py old mode 100755 new mode 100644 index 669201325..c52343844 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -76,7 +76,12 @@ class CCLIFileImport(SongImport): lines = [] if os.path.isfile(filename): detect_file = open(filename, u'r') - details = chardet.detect(detect_file.read(2048)) + detect_content = detect_file.read(2048) + try: + unicode(detect_content, u'utf-8') + details = {'confidence': 1, 'encoding': 'utf-8'} + except UnicodeDecodeError: + details = chardet.detect(detect_content) detect_file.close() infile = codecs.open(filename, u'r', details['encoding']) lines = infile.readlines() diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index de750cb24..0d981b87f 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -118,7 +118,7 @@ class OpenLP1SongImport(SongImport): success = False break song_id = song[0] - guess = chardet.detect(song[2]) + guess = chardet.detect(song[1] + song[2] + song[3]) title = self.decode_string(song[1], guess) lyrics = self.decode_string(song[2], guess).replace(u'\r', u'') copyright = self.decode_string(song[3], guess) From 4520845a81ffad73e1e18234fbfeb6352e41e6e4 Mon Sep 17 00:00:00 2001 From: Wesley Stout Date: Tue, 2 Nov 2010 21:07:05 -0500 Subject: [PATCH 002/140] Added mediamanger.rst and began work on songsplugin.rst --- documentation/manual/source/mediamanager.rst | 26 ++++++++++ documentation/manual/source/pics/plugins.png | Bin 0 -> 29895 bytes .../manual/source/pics/songimporter.png | Bin 0 -> 141012 bytes .../source/pics/songimporterchoices.png | Bin 0 -> 40238 bytes documentation/manual/source/songsplugin.rst | 47 ++++++++++++++++++ 5 files changed, 73 insertions(+) create mode 100644 documentation/manual/source/mediamanager.rst create mode 100644 documentation/manual/source/pics/plugins.png create mode 100644 documentation/manual/source/pics/songimporter.png create mode 100644 documentation/manual/source/pics/songimporterchoices.png create mode 100644 documentation/manual/source/songsplugin.rst diff --git a/documentation/manual/source/mediamanager.rst b/documentation/manual/source/mediamanager.rst new file mode 100644 index 000000000..2cf1d2c57 --- /dev/null +++ b/documentation/manual/source/mediamanager.rst @@ -0,0 +1,26 @@ +============= +Media Manager +============= + +Once you get your system set up for OpenLP you will be ready to add content to +your setup. This will all happen through the **Media Manager**. The +`Media Manager` contains all the bibles, songs, presentations, media, and +everything else that you will project through OpenLP. + +Enabling the Plugins +-------------------- + +You may need to enable the plugins that came with OpenLP. As you can see below +this is what the `Media Manager` looks like with all the plugins enabled. + +.. image:: pics/mediamanager.png + +To enable the plugins navigate to :menuselection:`Settings --> Plugins` or +press `F7`. You will then want to click on the plugin to the left that you want +to enable and select **active** from the drop down box to the right. + +.. image:: pics/plugins.png + + +Now you should be ready to add content to OpenLP check out the section of this +guide on the individual plugins. diff --git a/documentation/manual/source/pics/plugins.png b/documentation/manual/source/pics/plugins.png new file mode 100644 index 0000000000000000000000000000000000000000..b6810242b69589d1dd67e3135fa670b02d4e39aa GIT binary patch literal 29895 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 literal 0 HcmV?d00001 diff --git a/documentation/manual/source/pics/songimporter.png b/documentation/manual/source/pics/songimporter.png new file mode 100644 index 0000000000000000000000000000000000000000..96c39ea38fdc3cdda9324a207f2b84e88793c960 GIT binary patch literal 141012 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 z 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 Import --> Song`. +You will then see the Song Importer window, then click :guilabel:`Next`. + +.. image:: pics/songimporter.png + +After choosing :guilabel:`Next` you can then select from the various types of +software that OpenLP will convert songs from. + +.. image:: pics/songimporterchoices.png + +Then click on the file folder icon to choose the file of the song database you +want to import. See the following sections for information on the different +formats that OpenLP will import. + +Importing from OpenLP Version 1 +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +Converting from OpenLP Version 1 is a pretty simple process. You will first +need to locate your version 1 database file. + +Windows XP:: + + C:\Documents and Settings\All Users\Application Data\openlp.org\Data\songs.olp + +Windows Vista/7:: + + C:\ProgramData\openlp.org\Data\songs.olp + + + + + + + + From 4294ae83b8f158a1ac33424cd60079fd509aa7e1 Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 4 Nov 2010 20:32:43 +0100 Subject: [PATCH 003/140] split song verse order at consecutive whitespaces and not just u' ' --- openlp/plugins/songs/forms/editsongform.py | 2 +- openlp/plugins/songs/lib/mediaitem.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 67ff6f32f..005ca0192 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -527,7 +527,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): return False if self.song.verse_order: order = [] - order_names = self.song.verse_order.split(u' ') + order_names = self.song.verse_order.split(None) for item in order_names: if len(item) == 1: order.append(item.lower() + u'1') diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index a211344c2..03e4e909c 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -358,7 +358,7 @@ class SongMediaItem(MediaManagerItem): verse[1][:30], unicode(verse[1]), verseTag) else: #Loop through the verse list and expand the song accordingly. - for order in song.verse_order.upper().split(u' '): + for order in song.verse_order.upper().split(None): if len(order) == 0: break for verse in verseList: From fa8997177143e52a94fd0398db3c80240ea82ee3 Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 4 Nov 2010 21:45:49 +0100 Subject: [PATCH 004/140] openlp.org 1.x importer graped authors out of the lyrics --- openlp/plugins/songs/lib/olp1import.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 0d981b87f..9d584ab0d 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -126,7 +126,10 @@ class OpenLP1SongImport(SongImport): unicode(translate('SongsPlugin.ImportWizardForm', 'Importing "%s"...')) % title) self.title = title - self.process_song_text(lyrics) + verses = lyrics.split(u'\n\n') + for verse in verses: + if verse.strip() != u'': + self.add_verse(verse.strip()) self.add_copyright(copyright) cursor.execute(u'SELECT authorid FROM songauthors ' u'WHERE songid = %s' % song_id) From 0853e52de7c5d1482d801b173d8575fc45e991b6 Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 4 Nov 2010 23:25:42 +0100 Subject: [PATCH 005/140] single chardet for the whole olp1import database --- openlp/plugins/songs/lib/olp1import.py | 35 +++++++++++++++----------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 9d584ab0d..904250c52 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -28,7 +28,7 @@ The :mod:`olp1import` module provides the functionality for importing openlp.org 1.x song databases into the current installation database. """ import logging -import chardet +from chardet.universaldetector import UniversalDetector import sqlite from openlp.core.lib import translate @@ -66,22 +66,11 @@ class OpenLP1SongImport(SongImport): ``guess`` What chardet guessed the encoding to be. """ - if guess[u'confidence'] < 0.8: - codec = u'windows-1252' - else: - codec = guess[u'encoding'] try: - decoded = unicode(raw, codec) - self.last_encoding = codec + decoded = unicode(raw, guess[u'encoding']) except UnicodeDecodeError: log.exception(u'Error in detecting openlp.org 1.x database encoding.') - try: - decoded = unicode(raw, self.last_encoding) - except UnicodeDecodeError: - # possibly show an error form - #self.import_wizard.showError(u'There was a problem ' - # u'detecting the encoding of a string') - decoded = raw + decoded = raw return decoded def do_import(self): @@ -112,13 +101,29 @@ class OpenLP1SongImport(SongImport): cursor.execute(u'SELECT songid, songtitle, lyrics || \'\' AS lyrics, ' u'copyrightinfo FROM songs') songs = cursor.fetchall() + detector = UniversalDetector() + for author in authors: + detector.feed(author[1]) + if detector.done: + break + for index in [1, 3, 2]: + for song in songs: + detector.feed(song[index]) + if detector.done: + break + if new_db: + for track in tracks: + detector.feed(track[1]) + if detector.done: + break + detector.close() + guess = detector.result for song in songs: self.set_defaults() if self.stop_import_flag: success = False break song_id = song[0] - guess = chardet.detect(song[1] + song[2] + song[3]) title = self.decode_string(song[1], guess) lyrics = self.decode_string(song[2], guess).replace(u'\r', u'') copyright = self.decode_string(song[3], guess) From 5e9ff18927306d5788cf4c0f0be60eb8d538a9cf Mon Sep 17 00:00:00 2001 From: M2j Date: Sun, 7 Nov 2010 23:57:30 +0100 Subject: [PATCH 006/140] caracter encoding comboBox for openlp.org 1.x import --- openlp/plugins/songs/lib/olp1import.py | 148 ++++++++++++++++++++----- 1 file changed, 121 insertions(+), 27 deletions(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 904250c52..73fc0284b 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -27,6 +27,9 @@ The :mod:`olp1import` module provides the functionality for importing openlp.org 1.x song databases into the current installation database. """ + +from PyQt4 import QtGui, QtCore + import logging from chardet.universaldetector import UniversalDetector import sqlite @@ -56,20 +59,21 @@ class OpenLP1SongImport(SongImport): SongImport.__init__(self, manager) self.import_source = kwargs[u'filename'] - def decode_string(self, raw, guess): + def decode_string(self, raw, encoding): """ Use chardet to detect the encoding of the raw string, and convert it to unicode. ``raw`` The raw bytestring to decode. - ``guess`` - What chardet guessed the encoding to be. + ``encoding`` + The bytestring character encoding. """ try: - decoded = unicode(raw, guess[u'encoding']) + decoded = unicode(raw, encoding) except UnicodeDecodeError: - log.exception(u'Error in detecting openlp.org 1.x database encoding.') + log.exception(u'The openlp.org 1.x database is not %s encoded.' % \ + encoding) decoded = raw return decoded @@ -101,32 +105,19 @@ class OpenLP1SongImport(SongImport): cursor.execute(u'SELECT songid, songtitle, lyrics || \'\' AS lyrics, ' u'copyrightinfo FROM songs') songs = cursor.fetchall() - detector = UniversalDetector() - for author in authors: - detector.feed(author[1]) - if detector.done: - break - for index in [1, 3, 2]: - for song in songs: - detector.feed(song[index]) - if detector.done: - break - if new_db: - for track in tracks: - detector.feed(track[1]) - if detector.done: - break - detector.close() - guess = detector.result + encoding = self.get_encoding() + if not encoding: + self.stop_import_flag = True + return False for song in songs: self.set_defaults() if self.stop_import_flag: success = False break song_id = song[0] - title = self.decode_string(song[1], guess) - lyrics = self.decode_string(song[2], guess).replace(u'\r', u'') - copyright = self.decode_string(song[3], guess) + title = self.decode_string(song[1], encoding) + lyrics = self.decode_string(song[2], encoding).replace(u'\r', u'') + copyright = self.decode_string(song[3], encoding) self.import_wizard.incrementProgressBar( unicode(translate('SongsPlugin.ImportWizardForm', 'Importing "%s"...')) % title) @@ -145,7 +136,7 @@ class OpenLP1SongImport(SongImport): break for author in authors: if author[0] == author_id[0]: - self.parse_author(self.decode_string(author[1], guess)) + self.parse_author(self.decode_string(author[1], encoding)) break if self.stop_import_flag: success = False @@ -160,7 +151,7 @@ class OpenLP1SongImport(SongImport): break for track in tracks: if track[0] == track_id[0]: - self.add_media_file(self.decode_string(track[1], guess)) + self.add_media_file(self.decode_string(track[1], encoding)) break if self.stop_import_flag: success = False @@ -168,3 +159,106 @@ class OpenLP1SongImport(SongImport): self.finish() return success + def get_encoding(self): + """ + Detect character encoding of an openlp.org 1.x song database. + """ + # Connect to the database + connection = sqlite.connect(self.import_source) + cursor = connection.cursor() + + detector = UniversalDetector() + # detect charset by authors + cursor.execute(u'SELECT authorname FROM authors') + authors = cursor.fetchall() + for author in authors: + detector.feed(author[0]) + if detector.done: + detector.close() + return detector.result[u'encoding'] + # detect charset by songs + cursor.execute(u'SELECT songtitle, copyrightinfo, ' + u'lyrics || \'\' AS lyrics FROM songs') + songs = cursor.fetchall() + for index in [0, 1, 2]: + for song in songs: + detector.feed(song[index]) + if detector.done: + detector.close() + return detector.result[u'encoding'] + # detect charset by songs + cursor.execute(u'SELECT name FROM sqlite_master ' + u'WHERE type = \'table\' AND name = \'tracks\'') + if len(cursor.fetchall()) > 0: + cursor.execute(u'SELECT fulltrackname FROM tracks') + tracks = cursor.fetchall() + for track in tracks: + detector.feed(track[0]) + if detector.done: + detector.close() + return detector.result[u'encoding'] + detector.close() + guess = detector.result[u'encoding'] + + # map chardet result to compatible windows standard code page + codepage_mapping = {'IBM866': u'cp866', 'TIS-620': u'cp874', + 'SHIFT_JIS': u'cp932', 'GB2312': u'cp936', 'HZ-GB-2312': u'cp936', + 'EUC-KR': u'cp949', 'Big5': u'cp950', 'ISO-8859-2': u'cp1250', + 'windows-1250': u'cp1250', 'windows-1251': u'cp1251', + 'windows-1252': u'cp1252', 'ISO-8859-7': u'cp1253', + 'windows-1253': u'cp1253', 'ISO-8859-8': u'cp1255', + 'windows-1255': u'cp1255'} + if guess in codepage_mapping: + guess = codepage_mapping[guess] + else: + guess = u'cp1252' + + encodings = {u'cp874': translate('SongsPlugin.OpenLP1SongImport', + 'CP-874 (Thai)'), + u'cp932': translate('SongsPlugin.OpenLP1SongImport', + 'CP-932 (Japanese)'), + u'cp936': translate('SongsPlugin.OpenLP1SongImport', + 'CP-936 (Simplified Chinese)'), + u'cp949': translate('SongsPlugin.OpenLP1SongImport', + 'CP-949 (Korean)'), + u'cp950': translate('SongsPlugin.OpenLP1SongImport', + 'CP-950 (Traditional Chinese)'), + u'cp1250': translate('SongsPlugin.OpenLP1SongImport', + 'CP-1250 (Central European)'), + u'cp1251': translate('SongsPlugin.OpenLP1SongImport', + 'CP-1251 (Cyrillic)'), + u'cp1252': translate('SongsPlugin.OpenLP1SongImport', + 'CP-1252 (Western European)'), + u'cp1253': translate('SongsPlugin.OpenLP1SongImport', + 'CP-1253 (Greek)'), + u'cp1254': translate('SongsPlugin.OpenLP1SongImport', + 'CP-1254 (Turkish)'), + u'cp1255': translate('SongsPlugin.OpenLP1SongImport', + 'CP-1255 (Hebrew)'), + u'cp1256': translate('SongsPlugin.OpenLP1SongImport', + 'CP-1256 (Arabic)'), + u'cp1257': translate('SongsPlugin.OpenLP1SongImport', + 'CP-1257 (Baltic)'), + u'cp1258': translate('SongsPlugin.OpenLP1SongImport', + 'CP-1258 (Vietnam)')} + encoding_list = encodings.keys() + encoding_index = 0 + for encoding in encoding_list: + if encoding == guess: + break + else: + encoding_index = encoding_index + 1 + ok_applied = False + chosen_encoding = QtGui.QInputDialog.getItem(None, + translate('SongsPlugin.OpenLP1SongImport', + 'Database Character Encoding'), + translate('SongsPlugin.OpenLP1SongImport', + 'The codepage setting is responsible\n' + 'for the correct character representation.\n' + 'Usually you are fine with the preselected choise.'), + encodings.values(), encoding_index, False) + if not chosen_encoding[1]: + return None + for encoding in encodings.items(): + if encoding[1] == unicode(chosen_encoding[0]): + return encoding[0] From 06cf6dcc203c47b26dcf0ea5c1e0821d47a0b3ca Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 9 Nov 2010 17:56:16 +0100 Subject: [PATCH 007/140] 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 008/140] 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 009/140] 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 ef91b24d8a41ac138302f6619927733123dbf82c Mon Sep 17 00:00:00 2001 From: M2j Date: Fri, 12 Nov 2010 13:23:44 +0100 Subject: [PATCH 010/140] using PySQLite type conversion --- openlp/plugins/songs/lib/olp1import.py | 47 ++++++++++---------------- 1 file changed, 17 insertions(+), 30 deletions(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 73fc0284b..94a84bc0d 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -59,65 +59,50 @@ class OpenLP1SongImport(SongImport): SongImport.__init__(self, manager) self.import_source = kwargs[u'filename'] - def decode_string(self, raw, encoding): - """ - Use chardet to detect the encoding of the raw string, and convert it - to unicode. - - ``raw`` - The raw bytestring to decode. - ``encoding`` - The bytestring character encoding. - """ - try: - decoded = unicode(raw, encoding) - except UnicodeDecodeError: - log.exception(u'The openlp.org 1.x database is not %s encoded.' % \ - encoding) - decoded = raw - return decoded - def do_import(self): """ Run the import for an openlp.org 1.x song database. """ # Connect to the database - connection = sqlite.connect(self.import_source) + encoding = self.get_encoding() + if not encoding: + return False + connection = sqlite.connect(self.import_source, mode=0555, + encoding=(encoding, 'replace')) cursor = connection.cursor() # Determine if we're using a new or an old DB cursor.execute(u'SELECT name FROM sqlite_master ' u'WHERE type = \'table\' AND name = \'tracks\'') - table_list = cursor.fetchall() - new_db = len(table_list) > 0 + new_db = len(cursor.fetchall()) > 0 # Count the number of records we need to import, for the progress bar + cursor.execute(u'-- types int') cursor.execute(u'SELECT COUNT(songid) FROM songs') count = int(cursor.fetchone()[0]) success = True self.import_wizard.importProgressBar.setMaximum(count) # "cache" our list of authors + cursor.execute(u'-- types int, unicode') cursor.execute(u'SELECT authorid, authorname FROM authors') authors = cursor.fetchall() if new_db: # "cache" our list of tracks + cursor.execute(u'-- types int, unicode') cursor.execute(u'SELECT trackid, fulltrackname FROM tracks') tracks = cursor.fetchall() # Import the songs + cursor.execute(u'-- types int, unicode, unicode, unicode') cursor.execute(u'SELECT songid, songtitle, lyrics || \'\' AS lyrics, ' u'copyrightinfo FROM songs') songs = cursor.fetchall() - encoding = self.get_encoding() - if not encoding: - self.stop_import_flag = True - return False for song in songs: self.set_defaults() if self.stop_import_flag: success = False break song_id = song[0] - title = self.decode_string(song[1], encoding) - lyrics = self.decode_string(song[2], encoding).replace(u'\r', u'') - copyright = self.decode_string(song[3], encoding) + title = song[1] + lyrics = song[2].replace(u'\r\n', u'\n') + copyright = song[3] self.import_wizard.incrementProgressBar( unicode(translate('SongsPlugin.ImportWizardForm', 'Importing "%s"...')) % title) @@ -127,6 +112,7 @@ class OpenLP1SongImport(SongImport): if verse.strip() != u'': self.add_verse(verse.strip()) self.add_copyright(copyright) + cursor.execute(u'-- types int') cursor.execute(u'SELECT authorid FROM songauthors ' u'WHERE songid = %s' % song_id) author_ids = cursor.fetchall() @@ -136,12 +122,13 @@ class OpenLP1SongImport(SongImport): break for author in authors: if author[0] == author_id[0]: - self.parse_author(self.decode_string(author[1], encoding)) + self.parse_author(author[1]) break if self.stop_import_flag: success = False break if new_db: + cursor.execute(u'-- types int') cursor.execute(u'SELECT trackid FROM songtracks ' u'WHERE songid = %s ORDER BY listindex' % song_id) track_ids = cursor.fetchall() @@ -151,7 +138,7 @@ class OpenLP1SongImport(SongImport): break for track in tracks: if track[0] == track_id[0]: - self.add_media_file(self.decode_string(track[1], encoding)) + self.add_media_file(track[1]) break if self.stop_import_flag: success = False From 682fcc240540694f2a04c85fa17f174e53b7e138 Mon Sep 17 00:00:00 2001 From: M2j Date: Fri, 12 Nov 2010 14:20:45 +0100 Subject: [PATCH 011/140] use a list in the OLP1 import to get sorted entries in the encoding comboBox --- openlp/plugins/songs/lib/olp1import.py | 81 +++++++++++++------------- 1 file changed, 41 insertions(+), 40 deletions(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 94a84bc0d..c91dd3bc4 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -67,7 +67,7 @@ class OpenLP1SongImport(SongImport): encoding = self.get_encoding() if not encoding: return False - connection = sqlite.connect(self.import_source, mode=0555, + connection = sqlite.connect(self.import_source, mode=0444, encoding=(encoding, 'replace')) cursor = connection.cursor() # Determine if we're using a new or an old DB @@ -151,7 +151,7 @@ class OpenLP1SongImport(SongImport): Detect character encoding of an openlp.org 1.x song database. """ # Connect to the database - connection = sqlite.connect(self.import_source) + connection = sqlite.connect(self.import_source, mode=0444) cursor = connection.cursor() detector = UniversalDetector() @@ -200,42 +200,43 @@ class OpenLP1SongImport(SongImport): else: guess = u'cp1252' - encodings = {u'cp874': translate('SongsPlugin.OpenLP1SongImport', - 'CP-874 (Thai)'), - u'cp932': translate('SongsPlugin.OpenLP1SongImport', - 'CP-932 (Japanese)'), - u'cp936': translate('SongsPlugin.OpenLP1SongImport', - 'CP-936 (Simplified Chinese)'), - u'cp949': translate('SongsPlugin.OpenLP1SongImport', - 'CP-949 (Korean)'), - u'cp950': translate('SongsPlugin.OpenLP1SongImport', - 'CP-950 (Traditional Chinese)'), - u'cp1250': translate('SongsPlugin.OpenLP1SongImport', - 'CP-1250 (Central European)'), - u'cp1251': translate('SongsPlugin.OpenLP1SongImport', - 'CP-1251 (Cyrillic)'), - u'cp1252': translate('SongsPlugin.OpenLP1SongImport', - 'CP-1252 (Western European)'), - u'cp1253': translate('SongsPlugin.OpenLP1SongImport', - 'CP-1253 (Greek)'), - u'cp1254': translate('SongsPlugin.OpenLP1SongImport', - 'CP-1254 (Turkish)'), - u'cp1255': translate('SongsPlugin.OpenLP1SongImport', - 'CP-1255 (Hebrew)'), - u'cp1256': translate('SongsPlugin.OpenLP1SongImport', - 'CP-1256 (Arabic)'), - u'cp1257': translate('SongsPlugin.OpenLP1SongImport', - 'CP-1257 (Baltic)'), - u'cp1258': translate('SongsPlugin.OpenLP1SongImport', - 'CP-1258 (Vietnam)')} - encoding_list = encodings.keys() + # Show dialog for encoding selection + encodings = [[u'cp874', u'cp932', u'cp936', u'cp949', u'cp950', + u'cp1250', u'cp1251', u'cp1252', u'cp1253', u'cp1254', + u'cp1255', u'cp1256', u'cp1257', u'cp1258'], + [translate('SongsPlugin.OpenLP1SongImport', + 'CP-874 (Thai)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-932 (Japanese)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-936 (Simplified Chinese)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-949 (Korean)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-950 (Traditional Chinese)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-1250 (Central European)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-1251 (Cyrillic)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-1252 (Western European)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-1253 (Greek)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-1254 (Turkish)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-1255 (Hebrew)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-1256 (Arabic)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-1257 (Baltic)'), + translate('SongsPlugin.OpenLP1SongImport', + 'CP-1258 (Vietnam)')]] encoding_index = 0 - for encoding in encoding_list: - if encoding == guess: + for index in range(len(encodings[0])): + if guess == encodings[0][index]: + encoding_index = index break - else: - encoding_index = encoding_index + 1 - ok_applied = False chosen_encoding = QtGui.QInputDialog.getItem(None, translate('SongsPlugin.OpenLP1SongImport', 'Database Character Encoding'), @@ -243,9 +244,9 @@ class OpenLP1SongImport(SongImport): 'The codepage setting is responsible\n' 'for the correct character representation.\n' 'Usually you are fine with the preselected choise.'), - encodings.values(), encoding_index, False) + encodings[1], encoding_index, False) if not chosen_encoding[1]: return None - for encoding in encodings.items(): - if encoding[1] == unicode(chosen_encoding[0]): - return encoding[0] + for index in range(len(encodings[1])): + if unicode(chosen_encoding[0]) == encodings[1][index]: + return encodings[0][index] From 45945cc3025e6c15a756c4a56730ab18fa684f8c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 12 Nov 2010 14:50:13 +0100 Subject: [PATCH 012/140] -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 013/140] 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 014/140] 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 015/140] 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 016/140] 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 017/140] 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 018/140] 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 e81bd1c3fc7c3211d9012d7e7b0ebe377ceddec4 Mon Sep 17 00:00:00 2001 From: M2j Date: Sat, 13 Nov 2010 09:01:47 +0100 Subject: [PATCH 019/140] remove QtCore from header --- openlp/plugins/songs/lib/olp1import.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index c91dd3bc4..b58eaeff7 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -28,7 +28,7 @@ The :mod:`olp1import` module provides the functionality for importing openlp.org 1.x song databases into the current installation database. """ -from PyQt4 import QtGui, QtCore +from PyQt4 import QtGui import logging from chardet.universaldetector import UniversalDetector @@ -77,7 +77,7 @@ class OpenLP1SongImport(SongImport): # Count the number of records we need to import, for the progress bar cursor.execute(u'-- types int') cursor.execute(u'SELECT COUNT(songid) FROM songs') - count = int(cursor.fetchone()[0]) + count = cursor.fetchone()[0] success = True self.import_wizard.importProgressBar.setMaximum(count) # "cache" our list of authors @@ -248,5 +248,5 @@ class OpenLP1SongImport(SongImport): if not chosen_encoding[1]: return None for index in range(len(encodings[1])): - if unicode(chosen_encoding[0]) == encodings[1][index]: + if chosen_encoding[0] == encodings[1][index]: return encodings[0][index] From a357bdf6a0318a4f595fcbdaffbb9462b90fb7b1 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 13 Nov 2010 21:13:24 +0100 Subject: [PATCH 020/140] 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 bb571b0df583498f8ce355314268706bbb77980a Mon Sep 17 00:00:00 2001 From: M2j Date: Sat, 13 Nov 2010 22:04:11 +0100 Subject: [PATCH 021/140] using list of tuples --- openlp/plugins/songs/lib/olp1import.py | 70 ++++++++++++-------------- 1 file changed, 33 insertions(+), 37 deletions(-) diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index b58eaeff7..6b93195db 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -201,40 +201,37 @@ class OpenLP1SongImport(SongImport): guess = u'cp1252' # Show dialog for encoding selection - encodings = [[u'cp874', u'cp932', u'cp936', u'cp949', u'cp950', - u'cp1250', u'cp1251', u'cp1252', u'cp1253', u'cp1254', - u'cp1255', u'cp1256', u'cp1257', u'cp1258'], - [translate('SongsPlugin.OpenLP1SongImport', - 'CP-874 (Thai)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-932 (Japanese)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-936 (Simplified Chinese)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-949 (Korean)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-950 (Traditional Chinese)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-1250 (Central European)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-1251 (Cyrillic)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-1252 (Western European)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-1253 (Greek)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-1254 (Turkish)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-1255 (Hebrew)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-1256 (Arabic)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-1257 (Baltic)'), - translate('SongsPlugin.OpenLP1SongImport', - 'CP-1258 (Vietnam)')]] + encodings = [(u'cp874', translate('SongsPlugin.OpenLP1SongImport', + 'CP-874 (Thai)')), + (u'cp932', translate('SongsPlugin.OpenLP1SongImport', + 'CP-932 (Japanese)')), + (u'cp936', translate('SongsPlugin.OpenLP1SongImport', + 'CP-936 (Simplified Chinese)')), + (u'cp949', translate('SongsPlugin.OpenLP1SongImport', + 'CP-949 (Korean)')), + (u'cp950', translate('SongsPlugin.OpenLP1SongImport', + 'CP-950 (Traditional Chinese)')), + (u'cp1250', translate('SongsPlugin.OpenLP1SongImport', + 'CP-1250 (Central European)')), + (u'cp1251', translate('SongsPlugin.OpenLP1SongImport', + 'CP-1251 (Cyrillic)')), + (u'cp1252', translate('SongsPlugin.OpenLP1SongImport', + 'CP-1252 (Western European)')), + (u'cp1253', translate('SongsPlugin.OpenLP1SongImport', + 'CP-1253 (Greek)')), + (u'cp1254', translate('SongsPlugin.OpenLP1SongImport', + 'CP-1254 (Turkish)')), + (u'cp1255', translate('SongsPlugin.OpenLP1SongImport', + 'CP-1255 (Hebrew)')), + (u'cp1256', translate('SongsPlugin.OpenLP1SongImport', + 'CP-1256 (Arabic)')), + (u'cp1257', translate('SongsPlugin.OpenLP1SongImport', + 'CP-1257 (Baltic)')), + (u'cp1258', translate('SongsPlugin.OpenLP1SongImport', + 'CP-1258 (Vietnam)'))] encoding_index = 0 - for index in range(len(encodings[0])): - if guess == encodings[0][index]: + for index in range(len(encodings)): + if guess == encodings[index][0]: encoding_index = index break chosen_encoding = QtGui.QInputDialog.getItem(None, @@ -244,9 +241,8 @@ class OpenLP1SongImport(SongImport): 'The codepage setting is responsible\n' 'for the correct character representation.\n' 'Usually you are fine with the preselected choise.'), - encodings[1], encoding_index, False) + [pair[1] for pair in encodings], encoding_index, False) if not chosen_encoding[1]: return None - for index in range(len(encodings[1])): - if chosen_encoding[0] == encodings[1][index]: - return encodings[0][index] + return filter(lambda item: item[1] == chosen_encoding[0], + encodings)[0][0] From ed6c8a52a754777f3dbe57079358e000a3dc4f33 Mon Sep 17 00:00:00 2001 From: Wesley Stout Date: Sun, 14 Nov 2010 15:01:39 -0600 Subject: [PATCH 022/140] some cleanup and working on the songs --- documentation/manual/source/index.rst | 3 +++ .../manual/source/{songsplugin.rst => songs.rst} | 13 +++---------- 2 files changed, 6 insertions(+), 10 deletions(-) rename documentation/manual/source/{songsplugin.rst => songs.rst} (96%) diff --git a/documentation/manual/source/index.rst b/documentation/manual/source/index.rst index ac29c4360..7a16b7932 100644 --- a/documentation/manual/source/index.rst +++ b/documentation/manual/source/index.rst @@ -14,6 +14,9 @@ Contents: introduction glossary dualmonitors + mediamanager + songsplugin + songs Indices and tables ================== diff --git a/documentation/manual/source/songsplugin.rst b/documentation/manual/source/songs.rst similarity index 96% rename from documentation/manual/source/songsplugin.rst rename to documentation/manual/source/songs.rst index 3e7100848..e025b680c 100644 --- a/documentation/manual/source/songsplugin.rst +++ b/documentation/manual/source/songs.rst @@ -1,6 +1,6 @@ -============ -Songs Plugin -============ +===== +Songs +===== The `Songs Plugin` is where you access your database of songs. From here you can also edit songs, add new songs, and even convert songs from other formats. @@ -38,10 +38,3 @@ Windows Vista/7:: C:\ProgramData\openlp.org\Data\songs.olp - - - - - - - From 80721aad3598545ab6ec9dc3cd48159a08e468cc Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 15 Nov 2010 18:47:33 +0100 Subject: [PATCH 023/140] 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 024/140] 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 025/140] 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 026/140] 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 027/140] 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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 z
+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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 a2d68bd71fdbab8c7cae8a7732610f8827118649 Mon Sep 17 00:00:00 2001 From: Wesley Stout Date: Fri, 19 Nov 2010 20:32:58 -0600 Subject: [PATCH 028/140] updated how I handled the songs plugin --- documentation/manual/source/index.rst | 1 - .../source/pics/vistadisplaysettings.png | Bin .../manual/source/pics/vistapersonalize.png | Bin .../manual/source/pics/winsevendisplay.png | Bin .../manual/source/pics/winsevenresolution.png | Bin .../manual/source/pics/xpdisplaysettings.png | Bin 35473 -> 24927 bytes documentation/manual/source/songs.rst | 7 +++++-- 7 files changed, 5 insertions(+), 3 deletions(-) mode change 100755 => 100644 documentation/manual/source/pics/vistadisplaysettings.png mode change 100755 => 100644 documentation/manual/source/pics/vistapersonalize.png mode change 100755 => 100644 documentation/manual/source/pics/winsevendisplay.png mode change 100755 => 100644 documentation/manual/source/pics/winsevenresolution.png diff --git a/documentation/manual/source/index.rst b/documentation/manual/source/index.rst index 7a16b7932..5786af1ae 100644 --- a/documentation/manual/source/index.rst +++ b/documentation/manual/source/index.rst @@ -15,7 +15,6 @@ Contents: glossary dualmonitors mediamanager - songsplugin songs Indices and tables diff --git a/documentation/manual/source/pics/vistadisplaysettings.png b/documentation/manual/source/pics/vistadisplaysettings.png old mode 100755 new mode 100644 diff --git a/documentation/manual/source/pics/vistapersonalize.png b/documentation/manual/source/pics/vistapersonalize.png old mode 100755 new mode 100644 diff --git a/documentation/manual/source/pics/winsevendisplay.png b/documentation/manual/source/pics/winsevendisplay.png old mode 100755 new mode 100644 diff --git a/documentation/manual/source/pics/winsevenresolution.png b/documentation/manual/source/pics/winsevenresolution.png old mode 100755 new mode 100644 diff --git a/documentation/manual/source/pics/xpdisplaysettings.png b/documentation/manual/source/pics/xpdisplaysettings.png index eb7a8921c2a0278c8eb09f7ac946b49ad5718be1..e1ec66c6f5e9c9319c616a239a87fbe113554496 100644 GIT binary patch literal 24927 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 diff --git a/documentation/manual/source/songs.rst b/documentation/manual/source/songs.rst index e025b680c..b91a3b791 100644 --- a/documentation/manual/source/songs.rst +++ b/documentation/manual/source/songs.rst @@ -2,8 +2,8 @@ Songs ===== -The `Songs Plugin` is where you access your database of songs. From here you -can also edit songs, add new songs, and even convert songs from other formats. +Managing your songs in OpenLP is a relatively simple process. There are also +converters provided to get data from other formats into OpenLP. Song Importer ============= @@ -38,3 +38,6 @@ Windows Vista/7:: C:\ProgramData\openlp.org\Data\songs.olp +After clicking :guilabel"`Next` your conversion should be complete and your +OpenLP Version 1 songs should be imported and ready to use. + From 1c11cab27b5ac5f65df30295a8beb45617f5395a Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Wed, 24 Nov 2010 01:51:08 +0000 Subject: [PATCH 029/140] 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 4c3e32c4d7bc2bd91acf14db81829ba9e4cbc725 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Nov 2010 07:36:20 +0000 Subject: [PATCH 030/140] Song Usage documentation --- documentation/manual/source/index.rst | 1 + .../manual/source/pics/songusage.png | Bin 0 -> 27549 bytes .../manual/source/pics/songusagedelete.png | Bin 0 -> 27818 bytes .../manual/source/pics/songusagereport.png | Bin 0 -> 56226 bytes documentation/manual/source/songusage.rst | 35 ++++++++++++++++++ 5 files changed, 36 insertions(+) create mode 100644 documentation/manual/source/pics/songusage.png create mode 100644 documentation/manual/source/pics/songusagedelete.png create mode 100644 documentation/manual/source/pics/songusagereport.png create mode 100644 documentation/manual/source/songusage.rst diff --git a/documentation/manual/source/index.rst b/documentation/manual/source/index.rst index ac29c4360..5228256cf 100644 --- a/documentation/manual/source/index.rst +++ b/documentation/manual/source/index.rst @@ -14,6 +14,7 @@ Contents: introduction glossary dualmonitors + songusage Indices and tables ================== diff --git a/documentation/manual/source/pics/songusage.png b/documentation/manual/source/pics/songusage.png new file mode 100644 index 0000000000000000000000000000000000000000..10f29f2a931d6fab0e3334aa538fbfbaed45c222 GIT binary patch literal 27549 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 AE&u=k literal 0 HcmV?d00001 diff --git a/documentation/manual/source/pics/songusagereport.png b/documentation/manual/source/pics/songusagereport.png new file mode 100644 index 0000000000000000000000000000000000000000..c0d9df3dde4edc8525bba19cb25168abef153c1d GIT binary patch literal 56226 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%0DLyWkk*7?m_T$|V# zJc>ToCQz0C27Ea<0T!I)o;jgLN84IGJ}34J5RIO+uxP<)&Ly6HS-kf)a40jROZ@II zKQ7YD>$z1;!9K?AIS<;BI@kIoyj7U$sbqB@{^>j8QJAw^fORwXjhvXq76VV zP%O&t%EppUcgb5`tml0coIbp)R@apgsXpB+RrJ&#cmSL58C)7+P>4iOFGwm}n5EL- zsT3d@#+~tx(%`UAT$G%sl|OGz-bwK00Ee^JGy>ut+3PWK1Dw{6;uszfkhR`R}|P+4%H7RD@^*6;q=0QrTyFHUH}5D zzQ%!4rCT9|bQaj+4^WpeHyhcwk{KB2%SEh%vI-1qv26~Qr4|Q?dNI)3o ziv~$Y0swn*w_(f`Rpj|mt0T^b7c#Q6=~$C~6?rzM=rvLyy0xyZT6J)sF)VZ#9_T5}!^g>hi*OoHn8=@m+`C2OtPdcA9KGwGz+m)H7fROil)NR|-bd)+gUJB4it zOn{)V$}4%c+t)}pHp&@nyqn7P@<{JBtiXp$QYLL~x$%xcLd7)kCgMC~2k$u;%!woCjg0WT=8_yxfb=LAp;m|UP|Z_{AKmVWgZn-fTcs4Z3C&1!*Qu-m1g%>cK%)DyRhdq2%Py|?xjz`OAkw( zpxP~y(PgabUCgzE)5gK2xhSA5K~46`G6tD{D)O1+TBE=M)@kBn=i0E^uhMgRb`5 zgTgZ9JR}OmHG#P7{Td$M5(d~RA35*3nH6ytRhcsszA@~N3QA{ROP5@R6sie5U92)T zsU;=0MG4T1#5FKmV_0wOslukdds01Ko1eJgBvgzkt+ScT@uQB;bE|uk!c?hZf<>1& zDx8!W^AW)eXT5#b_BINF8n60%>{3l~R{_0PEKJe02KoH0L!*9lOd?^}JXw&ELrJpL z95b-Q?WI(?&Dk@(yL#(3)Q{GNOGTZ8)Xavh4hOatnvzH}wJWUW?Gq~|fa0Vp5^%dl zW{c)4$ySp7ruiAV6bEO)`N8`1ej#A#cHzni31=k{jss>dd;~qYQP<>xzZ=)5@ z+gfyotv4gu?5$sgCy)n5NX0T8n?*jO&aL)Ut}jes=I2>|pb+!8m)e*gUtJV@50LWC z^M^ossn+}qC7h`6n}oUqLFM3+LR*b>)F*?4!usnY?+HWQ82DcR;+Mr?<2Ganyrh_P z1D;1uWgFS>r`^HM1k$(Da6$kHNWhsnc`orYZb5sA{OqP>JSD3)I1t!Tj1h9c{xUS#y0eaS;Yi13oVq29FRf}K5GNN-; z)I1Va+W^kZ0#@t;u+>`W>g-gRX~!a6gF30I<_GHO_MMBV!I<7v1rK1t^an&O^H&J~TIIqv~W~g!l zyY#%jcB2B9YS+|%lQD{=l$VoZITh)3l%hcce3SY9{Cin8oY$M&YAdvyLz4Q8oY>X? z>yaGhIURxv(8M0t*KPuAUz7*Pu2*lzOuQdHRTz>%M#c5P0$486aBxqCAhmxs!u9i- zXk=119h>Wq-!b{>+53I2YAJ=}dKQ_CSvD2R>8|c`fksU2vmX^tu|#vt9v*RJ=l7yu zlna1v4~gd#Fh2SMsaZ<00oL4wybdB)XXj`FZPOW;`vur-A$(ZU0~bLa+-XY z)veDn#U%EoG8KJ4T})?q+z_-qcJ{6)6W5&m%&ThPN}1RTqv4x1d%u`>jaoFh>Vb}- zPpI{5^r?D3o1pTevrHJ3Gm_U~9EgZL{dv2s^YN#n?FGhrM|f{eNLZdleAxvKSH;*VD zOwhn-z9=#&cmy4+QgQQn_$QF|AI4N2tX1h#swNjH@GGlx z@=)qZzMSYKTDWRhILYEHNdBl9zro>7jdh~@tENLH7mTg?xKA2E9GpK3VFU#fC}$ zvX>i}7PqmrYx|qYvBn2fwUlbh1&-Botf(dL9)bP7paubu(+riJ8&HI*KaErwwWheT z-j22ZC_>-cg$=-@Pts|sxvm@DgA+z-eY}r$;&7%AeM*l5$wI3Vkw%BJxu~F>iA28z zr@gF62XBfm<1xqbfJ5m!uz93atKr;=pSD5ON}xaYU!Dd3soe-lc09$0&Ebvw$Wo?> zuc^)t&cPa6d@h_k#bS|dcYGVOqaC#- z^eK;o8|gF*1L2A^8XQyg>hJ5pZJj6mo`5KfwUhbrs1bK}_pRXfYiJMxfV%{vA?x}K zrXopF539);t?*eg7gY>%nPq(kJ&@e347`b~0OLUM-1hE9wb-rW2e#cV9i6T$NH+HN zlFFjTA<4w$LoO%7U1ATG%ku%yVftO9H3js#8|wQh-LA>nU6&CHq`5h2?n7qdHnn3d zx2L115FV)DTlWPtHOJv+>K}w%KTGV}GL6xsji+iJ(#Li&3vpD)0)++BO#ZM zEcp^rA1OYMvGAFn{~7B570*V5+wl$WsXh$PHK_=yqmC73dR(MQiqdQ|wkI^)*Y8bq z4snR;NubZSsXf@BMzaTq_zA5VU9-S}Z(ub4p{kflG~WFs<&ry_o4` z{^S(HU+WSH2l$p6ZRult=aH7jrQ#Q9VOs7oXOp@&2DM)Ie&z1y0!J&4SH*9>d1ZXe z`>7-;fE^}5#}{T70+6zV-8zk;Q08wT3IB}HX&ev%cih|F5jU=B%7hkYK5Z}6rzrWU z1~;Ps60g332g7HXeI^4Azy%D|Q0W7*QZ3UW{nU_Et2Xn`Pz#aZSFMh5Fi`>BGb+8| zdUwN;4M+X{u$|gY8GZe3J}gIHui;$rZ5MMd z#dCLaBm53|TmY{8SCkgsOi-cu&aW~pHjVudM-DAdef<|d!Prd$wL05pezD6$Wf~2V zw)U3UAUOhu-Fqd6wkYZH#Wvt~4Mv<1YYUyb5V=SyYj=Erz3&0fZEc!m6H)ry z(WkG#%IR;#k0=_MU&Fkl?0V@Fy>vvx>UDPy%nJ+(At6K{prBhR&U(?pS;a%67y-+>h?l@W#5-aG1icLw1L z83yPu@$CKcDg&7$sHdfU@2KENKX3k^LB)6A$dMLxehpGAL^N!4+aU`A%PTePjIo=u z3wJ^ySqR%=Lede$n7a#4Ssk5(D!x*MA8{yPC1z;%ITs!9b7fik)2Btwc@@y%j81rh zUh;BF3-NafTF#~EpyOBWhnu5Zc!W>jaCt#ihmI1G?K5#;QCSsOFk>EURGbF+x+SZ? zx3%gc%B`d(erhGq@DP8#u_6Zw#?CkxNHRI&($qf(6^?^e6b2ESrER4A$Ov)tDrJkp zuQtSqDztlO)>6xG}}Gihx>Q75JtEn5nG<~K&><|NDtVi0EFT^^&akz$%%}rXiEFMFZMY* z>X?e9qHevmu1Rkur`zq2-7IDw2MC~9ccWF$e;G!d6~URcv^S@sfST-X^*wpuxj0)m zPrLLYh1f&_4`>~(wKYrdNw~8V$<}!6$vQ~p1Ik06od!_Psduawd<@s>vtjy_t(%g{ zqqSf{$+uF+9`?rsfnWB2R9h^J$;JZ!gQ81`C;dlN;2>8x7wV&w^UK&{`5*}SA7^9X ziI;WwT+T;(YY#j&pHMVfPWRUOq;P&SCFULMk4duhvcA|(J$C`A4>DWQ3Si}y)vFJF zI^JGrg+$@60M7$_o7Z06ey6eoE}BMRVX~bFS#I6<%)iX}r42P3oj#wKqL)=gXsfuQ zptr74AY!5>MY|TCsmLFyS%i30+u_mJt*W!M1mV4FuYc%viSqPhky$Ci5r$ZExQ!sm zl+pAZ&t!yss=m!=80a8*>vNxI+W$^aFwGU9CuoBFXmZYbelY$v4AO6{;O3sy`8Vc{ z(m~! z%ZNcIZOj^{Jp&IMzdxFg5vJ1L&TU4^k6hpg_yWL_T)*tK4R(|^1*3RPQTYBTCFfFt zhWok3C~xPYJ_Z63KHoa0+FT?&coLCR$-8>T-pOG}rNt0Vd&&IHos~79-qOUO9s6Py zB-IrR%@0dE8W9X~zEJ$YuN&{!Sn!qmbRR@OKiHegKYrR@7Z>~L11^<>0bn#MJyOq! zfRB4XUJ)k3gA;T*qn>&jk9cchM1YpHeqvd8AQGUdM5wX7ClMBrtjxb@T(cA=ghI05FC8s^{RV$VW9O(fkqu6K1BwWAC$CSm(*UF&z8N5@ zKe}(r`v%!Fy>)&7A(-m$6h! zr2qrqU>3X#`tUtQ!9;{`rRDO+q*#=k-sX0=-y3|Q7k^PFrCK<(s(RHcMv?|q_9BPJ zAuzPXeG(Vq|5_df$BR_{DY1?azivB!$loT>$5VG|Hd>T?Ff`KR(mQ(%3H>bvG4Ykx z)b7d4Co9=0M6YHURj$I&Z*Kv5d+|M6te*9b%VT%M2zxBv3-P*kcFhzrKi6#KY$jq+ zgHN+Mu}{_1%x95Fa%F-9<~LiZmhhx7ZX?ORq*Yq2q!a>;0xXtXc1Nm7_*m1}N=J%_ zOxjw*U@BeuyjPwA>G{MK@O79~rw}!FR00o36}Si$wkKo`7K5r2yv6dTddNRr6S0v| z@+2DJJcX;L(eTi;3GUKdEaP*D`e`GDeY=Z`M!qxqsBIc8=fyu&Gu?4M*nW0*>_Lc$~26BN7^;gfybL}vK?4Nt) zRk@M_cYo}qU6_xt-6Z%ue3UwAd@aH`gEqV;E^;GQ<>B&rr zu+Qp3IkzT)F7<-orREtt0`kI$I!so~U;eC?=|lV1U)7+C_^(9s*7R+>_{M}PojGQGlC;$xK8BWGI_|=%s1?5}(X^X%`8slBIOWA~ZEpnIG zF~Kcl+nrsv=jR0V^wgn^aW2C0--kQMb}4woZ;YSFNPP_IOd0~3vI*!Jy}%!rnU-?w zy6;OWYQeO~Xx7Ck_#R%Xe!Q`tD_@Lx@t8uZ?Z!no)-!T!bb%C>^|>KHDM9r^f<3Dg zPYj9qN2MFn-zU3)HzUQ&t%6T7qMxRnDc=f!6a*6e-4mO5BZ1=se7vGGag7ab1xgaN zB8rzrjNjxLp})1Z3L3ko1O#*yvzps|OYrq0Jd%tObV1eoRm{X^ZeV=hkI#?Nxkv*k zP@uhO%Qj#SvVtKhXkoCSM~w0Ah1hQ^GPpsuYB|2~lG?2M0+e>St2mIEb3 zM6Qzw5t!Af&7NTaeokwV?@{;JZ0cIGQ$_joo~Z2>Xguk}=>3vCPerwiD(zz-z8Vh|Z9wzIiKD{RqDB$e*qUzhOs&pqC*kb! z0`+q4g=@=y?y6&151NaORYbW?C?b5cnf4)V_Vi$;IbRq+?ctTya3zt|DS0Gs&TjJb zVWdBKwz0`CPdV$61{8J70uhs(mPtqRW@z+nFx%0ygS%1n=>zQLU9o#q@9++BWl2_pUCH(0rU25{zrWRlOi^XTbe9Ib(IvUfyl5|DE&D2i_J`$y z`6V=$mbU%lC2~T4{$+f5qH}zFnHbCf?iUf59&FZBpuGgAEQ0Lbs`uvAC$l;9_*^6d zI({&C(YPb^JhyAB+sgC{>3~$x0FCi00JsRF=^~ypzJ>7=jmUhqJvq_7k3}_G1Pyc86m2jjfq1DyQCm{1?!3{rH=dh#Yj(Tw1}m%wx0b=lqo z7tj#JgCguSVcbK`yE4;rd8lG^{ACJtaIt~KnM%{pZ+Eu4kobcr9H4OkMuvL@G2CQp zb-HogJ<9tyCw3r_#JtsXX*r=7_`dnVEKe&{oQjo};HZa64K3~U{C2rkve%W>1u<4p zq{m3sAjccCy?!v2yRL`gHeAX1Fw|$}@Zc+Gp*(*S+?VDW_5P#Ir(II5+6p9g{M3u$(%(p_xfJYC}^KvqfO|SXoB;wFwKl z@pu-a`EWZFveVVWvm_%!w_^TAWCS%S=IN*6uVopwz+&`6zqP~sL_kdAKPoxbZ6 zE)1YL;@ZlH0u7UxX+vaxMfiy=&jkgocnFc- zdZ_c>4b%GmzBG&1BXrLb4;PUSAmD|#(`-so6Gq3pY|O{owm}ya4yh$pq!Z1Lht9+d zJs2}7Z%7cz^~yYEnr^sQ)MBj@6WQ0SudfZ;)6Tub&d{canUa&yt-8n~%m3f#sxv-a zzp2y@b)wvf1&T^!0_zMBiP{XAKq#qg43Q{)pFRDoP}3ePpujIcdUD!ev6m}GwBp|%T+AMrktYgsAvwNmyW>sFY)w26f?o8fT>vV$*u^FqJiM8s!N{DQAUmiS`=#>|RVe5r5KKg{ z2Dj8<=A8aM*BpI5N-K(|Iarq?+VtFQduQdculpq0gQ1xo`Hu?$Oia+}AFCovhfKAW zK%=9%fuMEPMnUJ1O`C7i7}Xl2^`y7=4?#TF=P&i13#TG+_D17luf@H}`;o{siQ#0w zY-)#jj5f=i#xm%A#zP#pP07n4B%+!6m9?kM;?V-_BJ$$n-F8xsvaH&J=U|=6gwIL# zT#u+8OlCAd$X24M!;(t_x%7$?LpaW*1%hqt%(8+TEp0rZ)~}nk9`kgLekqiRDR$Er z*|{~ziH{=)Y47IHgy(Y`wUw%;ZF^UL-Wc(dvSz>RDp039J3lk4t#1LBluL;dD!M-1 zv(hLqyQY!n`Zb@_*sba307be27&atxekkd@ERxso!o>a~3!DA52ATY(vFi-9f)2Y5 zO!}h-x^QYGCsz}JCq90zdU|?I-_5dLBdyX^%U_uY3=Ir~HTJUtI;(d;gZ|}#lw;4q zm2|4(;)5&+FBBT&cx-5YdYW(bCcn%*E8WTnze9e0(r=|woqjTPFN`{*{aza{5$dr*M}M^TUbH6Jc&Sw+cMH?g zuc0n0OIgzURDc5yq-&04ElgCd{Fa3LIv3t?D#{;iPa1ClMhp!P9FY;5EFBiGIQ)eQ(+QwNJ>f;(Q))W!s-gY0KgP3!jy*9tGDFEQ_4h@KWtI2Ty;0QH zmS1Gx$9iVY5FHSZXW8GqnPfW@kmsreLiB#=laY}gQ+2u9VqIO*ypt8B7b@|4**{s0 z&p13)T=k||6ooSiKUfhZuA2}&D0AV}^1keQr{mbheJwnvmgB4W-6&eVu_8Tv(iWIF zXh_@TW{r);x92|!R&dH|SXnVLno|WoNHZ`H6)*%{Q*zBNek$<77Vs5LYXfH)JcJs! z?i%u*+R8uWfQ|w_EZ+@Lt9Xq+*eyN52OSh6eV;HL-mI7W5g#~VPOn63#GdQ1SHa1&__8Gy&{W0*T=B)4 z_IH4Orhq}fCgL62?~5oAe+&}Xf=wvEd9L$i3pa`iqV&BQ4W1Ud!JPord16z#XZ$~X zT^Wc?WL_izPGo`-ALc6sDa#z>w*w=pH_=qIBahZ=R_#cv!V)s65%vQIF2E_~$;9OI zA?*2-w5aNg05WjcR{U4&9scZ9PRB&#(;k#aWIXnYQZey}4o{ibS4z>4yLcNoM81J~ z<;o)4WrK{!a=jdOm>Qs2C6mubN<5fX`jWHqEHcL_&f?nBeAhT9JU$#w1rH$A8`5!j zqU7KFoi*Nx8J@3|458_+uOtL+-2O0lM!=HqX+B?hhymkYLD+RxrKh!uhLAE}ji;zJ zSF$08B0jjo;ox=ZrrwG!(U6TWAVLUa?5RBy-LQzsDU;U_jt5eP`R^S4 zL)LEsmpErGX?e4|9)x_7$6*G~2gmWZXNq41K|Y3b7M=`(s@GJl2Qk% z1!^0GZK1UwW#UhUrocppEJe1OCG{a@nne2(Sl8@Y(6E^*uxXL5de5Tw7P_RV zXQpG!h|e2rSEm(R_*QVPe@t7aDFQ_sw;ys)hih{q}y6v zA7-+5Vo`m4V4X$K_HY@z-HwvNm&U$%8pfTX4J3W0I`Nus|t776u5Ll~Hq;Ii&CHkz$fX;z?^W<{N@&Lai z__1`e0E&$OZKCGfC2AR-SQV3#16|%6X_ThiiTaUi(*b6esFJ8$=A>pHO9e33vQ?9( znu+LXUj|FraE`vk$JT`pe$X_&h0Rb^|9XRdq$D}SlY!^pIN7E{jymC8_=6<+X()Vy zY+hEzb%SxMmmb<*=%#r^1M24jMFUOPfhFsA%1Z^!&J0{^*D~&pSIx4ohY(B zKa6MNyz_u$VIWwjih!R!eXjf%EHG}98`8S=1R9#y>eHh!4<9i11W$&+~_ zdccDVsa|v17p!<0^F2crD}3^tnQgR!_jOKsr>mbNA@qTMbBB*w%_&czsnit9Esu#} z8=TitwehjBX@hdX?Sf+c?Jbe|b^4R*#CY1o9_`LN!|2afEF+%#PKtY7Un`>CgwOI% zEj`=C9o9HHVt>ux??w39_5#6(Zc^D;gfn}2; zBI4myuM4Vr7f5y^B$Qv1^|tNu`ia95&xrmn=5LR7eb4igN7{z}%(pWLb1m(jb`F0L zz$wMjBM0Sbnlg7sUIm>~{Bx!F^z4v@(XSP}+s;(XKd_iNms`PXucfPPgQ_paeU2J8 z#!$n08E+A95!r#8t67&rY>rZFlGrm$h2D~R3VCq;HJH%+TUmv@bomGIB5Ui4#MF4B zg|?Wp&%>1%GKP*7-gg4)oZw=$`YEZh^d~^u56sT}F6K*ryb#9=fqj$^(wT2F{@C6UwNbr9H8#=Z=ZOwR zt1qEt{1yEIcArNi-w4AfgmD{Qi@D*YK749tpnQ{1QJfzcjQg;0umoCURd5)dwb$hm ze=5wmIGHS~r{e5-N`dYW^Z3!l2;)U&T@RKuDw*|Ya68; z{u-SA9mWkaC_j1P!Elk!+Hf#_tpjQVwzp848u0eBbtB#DRS`-l_%;C99JhL%o_@Rr zHILFyfODQsr!{ZKUAj;%JC<;9_tVlQPpo>w1I|+yS?J~WcA(9_@*RK2ut&|m51wo` z#%=qcp`7s?AP$wR-}=_089qVVr(WYR!qVqaC$gH_7WrXk8%Qf!rFq-tfa50pw$g2$ za$@c8sLq-xR`#<$XF1_PRjk5NEzUCp(pDjs6W@di;;)>mPEUPdw|Z&r_?#@&xbYYn z>Gwyv%K65RZ@{igO|^M6R_cL$j}Ed3jnBpRyzImYbMBfyS>k&Kx6O+^f_iyJzu<-` zKH9{{-xqT3m>fzr_Pej8@U1e9^5^MXn`fj#dV2c)S7?V^P7B0%U-Sr#Q|Dlh;M$(m z>=)J1YohGZNGA1{kfe<9-yyY%+&ff%);;Sbtw=U&NyWB#Ggw~pGmVns&xihFuXWi@ zS>HyaV{p)bd?QnkVP9_I&x0J%4_Rcnyhm$tVJfr=+8KT>)ngGno%HLySfH|z!m`N} z%JH}?CFOcTDA2+VXt@dOS4D%{WwSVCYrk`d$RWP~pCxY3Q^UZQk@Q20G<@^Ta*1K^ z!zdpUU*#RR(YxzGlIx(@7YU>;n0s(m`Vl>io82^b$yucpq0lYM8ddhgWBOPAl*#3u zsdZy4(|l9X%J+kHtf=Jrr^Aur zWD4(1t66-@-UXtQTYB+W z)U5ozk%@PTFlCWeMdZ=UaY+j&w#s9}OJv!wg^?iwnn;%neYr?dTDWTdq8EHe|J#oy zdSn8)q4)DwpH1u_QEMi-BTR@dN29Sx$DXnndR5L$EXcmhISnF66u*BIlhl@!tQfGg zSEtXD?274a-rI=*NJo<3&dAFzIdrj>X<^4Bhn>z%%;+&n3nMA9^qF_qO{b+zy@=D5 zxACHVn;bv1Ix)Tjh2)k3kOmYtqp$S|uXyErA%DKJeM{8ESEwj5H;t51Qbc+z&X|X} z#&Dw{XZ|u&R@$}z(Fyg1o{OZ=f$SSt5R1En__qyRRC3UDyk?pQWQ=&JH2ie9f&Fca zTDbrD0?`^F3%Gk_{#e1R7KRCrt z$!d1ck|+4jq5njb!mY`%j+l)*fc2k`g}{FhZ*0>An%PY5Zuc9&}* zL7%i`ADbYWrt_um&@gMOGsy)lEaPT^gfGNwlxK)K?n8~t6*x=^ZZ26tJD0}!H!P?_ zo3^J>R;h{_Ehv0g?fTcch@i`4|ixuCi zbKezE9B(K=9C{JW;era=9Q=NO6fRl&d(7?Cl(HnY2re$iw zY%|B6w~tm!a*(&>9Yn?4DC3t_SI1;NV3$c){ZuzvCcyNbSug);3DMhwC541+szI(3 zt(j_7!^p{$HeNIuy>}wn?2XBQ_j-F*LlW%_TGg_lp^@}s6E%;FYqs5u)Cd7kbydMO zP<72lpfv-W>Iae4;-v1YtII|++@hL#W_{zUOt*y1-Fby*3D(_`K}9h_#y74w(4{mW z?PY&3kRoz+j+5&Yz*V822&PHNwuO9XL8Ggm+nj%r30dLm%i@!?!#dS#t@vr6j49ll`&;aTivB#CA z!N3TuW}W+gA%nnpO4Z@#&KflanBd>u5dTG5_!olXUEymEN4$Tj=U1P?QvZwU{Xen$ b&&!1jNoTXOXJkOG5>HcAPo-MPF6RFL%{|*K literal 0 HcmV?d00001 diff --git a/documentation/manual/source/songusage.rst b/documentation/manual/source/songusage.rst new file mode 100644 index 000000000..d77cc3632 --- /dev/null +++ b/documentation/manual/source/songusage.rst @@ -0,0 +1,35 @@ +========== +Song Usage +========== + +The Songusage plugin records the usage of Songs when they are used in a **Live** situation. +If the plugin is active all songs sent to the Live Service Manager are recorded by this plugin. +Once the plugin has been activated by the plugin menu it can be turned on and off by use of +the``F4`` key or the SongUsage menus. + +The image below shows the menu items and how to access them. + +.. image:: pics/songusage.png + + +Generating reports +------------------ +Reports can be generated between any two dates. The system defaults to 1st September previous year to 31st +August current year. The data is written to a file in a selectable directory. +The file name is **usage_detail_fromdate_todate.txt**. + +.. image:: pics/songusagereport.png + +The details extracted are: + - Date item used + - Time item used + - Song Title + - Song Copyright + - Song CCLI. + +Removing data +------------- +To remove stored data use the option below which can be access from the Tools Toolbar. Select the +date you wish to remove data up to and press``Ok`` + +.. image:: pics/songusagedelete.png \ No newline at end of file From f153c27d321e478fa5397e5a50ba2ddee8a45958 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Nov 2010 09:00:14 +0000 Subject: [PATCH 031/140] Fix preview of live when returning from blank display --- openlp/core/ui/maindisplay.py | 2 +- openlp/core/ui/slidecontroller.py | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 5a53a84fe..9d6c04075 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -459,9 +459,9 @@ class MainDisplay(DisplayWidget): if self.phononActive: self.webView.setVisible(False) self.videoPlay() + self.hide_mode = None # Trigger actions when display is active again Receiver.send_message(u'maindisplay_active') - self.hide_mode = None class AudioPlayer(QtCore.QObject): """ diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 0afb0efaa..618665a7c 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -391,6 +391,8 @@ class SlideController(QtGui.QWidget): if self.isLive: QtCore.QObject.connect(self.volumeSlider, QtCore.SIGNAL(u'sliderReleased()'), self.mediaVolume) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'maindisplay_active'), self.updatePreview) def screenSizeChanged(self): """ @@ -823,16 +825,15 @@ class SlideController(QtGui.QWidget): row) def updatePreview(self): + log.debug(u'updatePreview %s ' %self.screens.current[u'primary']) if not self.screens.current[u'primary']: # Grab now, but try again in a couple of seconds if slide change # is slow QtCore.QTimer.singleShot(0.5, self.grabMainDisplay) QtCore.QTimer.singleShot(2.5, self.grabMainDisplay) else: - label = self.PreviewListWidget.cellWidget( - self.PreviewListWidget.currentRow(), 1) - if label: - self.SlidePreview.setPixmap(label.pixmap()) + self.SlidePreview.setPixmap( + QtGui.QPixmap.fromImage(self.display.preview())) def grabMainDisplay(self): winid = QtGui.QApplication.desktop().winId() From 2752279d4311f4ad5256804027724ebc25625dbd Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 26 Nov 2010 09:49:06 +0000 Subject: [PATCH 032/140] Remove need to restart for double click event changes --- openlp/core/lib/mediamanageritem.py | 22 +++++++++++++--------- openlp/core/ui/advancedtab.py | 2 +- openlp/core/ui/slidecontroller.py | 14 ++++++++++---- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 3eae97238..749543fd9 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -320,15 +320,9 @@ class MediaManagerItem(QtGui.QWidget): translate('OpenLP.MediaManagerItem', '&Add to selected Service Item'), self.onAddEditClick)) - if QtCore.QSettings().value(u'advanced/double click live', - QtCore.QVariant(False)).toBool(): - QtCore.QObject.connect(self.listView, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.onLiveClick) - else: - QtCore.QObject.connect(self.listView, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.onPreviewClick) + QtCore.QObject.connect(self.listView, + QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), + self.onClickPressed) def initialise(self): """ @@ -430,6 +424,16 @@ class MediaManagerItem(QtGui.QWidget): raise NotImplementedError(u'MediaManagerItem.generateSlideData needs ' u'to be defined by the plugin') + def onClickPressed(self): + """ + Allows the list click action to be determined dynamically + """ + if QtCore.QSettings().value(u'advanced/double click live', + QtCore.QVariant(False)).toBool(): + self.onLiveClick() + else: + self.onPreviewClick() + def onPreviewClick(self): """ Preview an item by building a service item then adding that service diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index dc126d863..a390780ca 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -146,7 +146,7 @@ class AdvancedTab(SettingsTab): self.mediaPluginCheckBox.setText(translate('OpenLP.AdvancedTab', 'Remember active media manager tab on startup')) self.doubleClickLiveCheckBox.setText(translate('OpenLP.AdvancedTab', - 'Double-click to send items straight to live (requires restart)')) + 'Double-click to send items straight to live')) self.expandServiceItemCheckBox.setText(translate('OpenLP.AdvancedTab', 'Expand new service items on creation')) # self.sharedDirGroupBox.setTitle( diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 618665a7c..48810990a 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -331,10 +331,8 @@ class SlideController(QtGui.QWidget): QtCore.QObject.connect(self.PreviewListWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) if not self.isLive: - if QtCore.QSettings().value(u'advanced/double click live', - QtCore.QVariant(False)).toBool(): - QtCore.QObject.connect(self.PreviewListWidget, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onGoLive) + QtCore.QObject.connect(self.PreviewListWidget, + QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onGoLiveClick) if isLive: QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), @@ -945,6 +943,14 @@ class SlideController(QtGui.QWidget): Receiver.send_message(u'%s_edit' % self.serviceItem.name.lower(), u'P:%s' % self.serviceItem.edit_id) + def onGoLiveClick(self): + """ + triggered by clicking the Preview slide items + """ + if QtCore.QSettings().value(u'advanced/double click live', + QtCore.QVariant(False)).toBool(): + self.onGoLive() + def onGoLive(self): """ If preview copy slide item to live From 2989b40147f22cef620bcde2710039d8ceb6da96 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 27 Nov 2010 08:53:29 +0000 Subject: [PATCH 033/140] Documentation fixes --- documentation/manual/source/songusage.rst | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/documentation/manual/source/songusage.rst b/documentation/manual/source/songusage.rst index d77cc3632..df6d930f3 100644 --- a/documentation/manual/source/songusage.rst +++ b/documentation/manual/source/songusage.rst @@ -2,10 +2,10 @@ Song Usage ========== -The Songusage plugin records the usage of Songs when they are used in a **Live** situation. -If the plugin is active all songs sent to the Live Service Manager are recorded by this plugin. -Once the plugin has been activated by the plugin menu it can be turned on and off by use of -the``F4`` key or the SongUsage menus. +The Songusage plugin records the usage of Songs when they are used in a **Live** +situation. If the plugin is active all songs sent to the Live Service Manager +are recorded by this plugin. Once the plugin has been activated by the plugin +menu it can be turned on and off by use of the``F4`` key or the SongUsage menus. The image below shows the menu items and how to access them. @@ -14,8 +14,9 @@ The image below shows the menu items and how to access them. Generating reports ------------------ -Reports can be generated between any two dates. The system defaults to 1st September previous year to 31st -August current year. The data is written to a file in a selectable directory. +This option allows reports to be generated between any two dates. The system +automatically defaults to dates between the 1st September last year and 31st +August this year. The data is written to a file in a selectable directory. The file name is **usage_detail_fromdate_todate.txt**. .. image:: pics/songusagereport.png @@ -24,12 +25,13 @@ The details extracted are: - Date item used - Time item used - Song Title - - Song Copyright + - Song Copyright - Song CCLI. Removing data ------------- -To remove stored data use the option below which can be access from the Tools Toolbar. Select the -date you wish to remove data up to and press``Ok`` +This option allows the removal of stored data use is no longer required. +Select the date you wish to remove data up to and press``Ok``. This option is +not reversable. -.. image:: pics/songusagedelete.png \ No newline at end of file +.. image:: pics/songusagedelete.png From 771c86783edda0dba7226adaa74c729c7dfe93bc Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 27 Nov 2010 08:59:49 +0000 Subject: [PATCH 034/140] Remove theme background for Images --- openlp/plugins/images/lib/mediaitem.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 71dbd8903..7394758c3 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -163,6 +163,8 @@ class ImageMediaItem(MediaManagerItem): service_item.add_capability(ItemCapabilities.AllowsPreview) service_item.add_capability(ItemCapabilities.AllowsLoop) service_item.add_capability(ItemCapabilities.AllowsAdditions) + # force a nonexistent theme + service_item.theme = -1 for item in items: bitem = self.listView.item(item.row()) filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) From 3d927b33f935fc934cc241f45863560d548276bd Mon Sep 17 00:00:00 2001 From: Wesley Stout Date: Sat, 27 Nov 2010 08:58:27 -0600 Subject: [PATCH 035/140] drudging along with songs importers --- .../manual/source/pics/finishedimport.png | Bin 0 -> 13674 bytes .../manual/source/pics/selectsongs.png | Bin 0 -> 64560 bytes .../manual/source/pics/songselectlyrics.png | Bin 0 -> 211452 bytes .../source/pics/songselectsongsearch.png | Bin 0 -> 163391 bytes documentation/manual/source/songs.rst | 67 ++++++++++++++++-- 5 files changed, 62 insertions(+), 5 deletions(-) create mode 100644 documentation/manual/source/pics/finishedimport.png create mode 100644 documentation/manual/source/pics/selectsongs.png create mode 100644 documentation/manual/source/pics/songselectlyrics.png create mode 100644 documentation/manual/source/pics/songselectsongsearch.png diff --git a/documentation/manual/source/pics/finishedimport.png b/documentation/manual/source/pics/finishedimport.png new file mode 100644 index 0000000000000000000000000000000000000000..d49876ec994112b2b59927274b1b47e1e6313a7f GIT binary patch literal 13674 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

#|yhQGbF4hm>t}8(=pAnkWu6YdDZ>dO&4W_ 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%0A5F&gztgV#!D)e>3>0Z9mY}Mo>TI7z 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

TAvqyAv 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,CHiVf2OcXqCdy^6U$I__zhR= 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

j@ws& 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 literal 0 HcmV?d00001 diff --git a/documentation/manual/source/pics/songselectsongsearch.png b/documentation/manual/source/pics/songselectsongsearch.png new file mode 100644 index 0000000000000000000000000000000000000000..de0ea12ca81a6a8b070a37711eb8cda9dd647a6f GIT binary patch literal 163391 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

TAvqyAv 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,CHiVf2OcXqCdy^6U$I__zhR= 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 Date: Sat, 27 Nov 2010 15:25:00 +0000 Subject: [PATCH 036/140] Documentation fixups and \nstart to add OpenlLyrics export for songs --- documentation/manual/source/songusage.rst | 32 +++++---- openlp/core/lib/mediamanageritem.py | 10 +-- openlp/core/lib/serviceitem.py | 6 +- openlp/plugins/bibles/lib/mediaitem.py | 2 +- openlp/plugins/custom/lib/mediaitem.py | 2 +- openlp/plugins/images/lib/mediaitem.py | 2 +- openlp/plugins/media/lib/mediaitem.py | 2 +- openlp/plugins/presentations/lib/mediaitem.py | 10 +-- openlp/plugins/songs/lib/__init__.py | 3 +- openlp/plugins/songs/lib/mediaitem.py | 24 +++++-- openlp/plugins/songs/lib/xml.py | 69 ++++++++++++++++++- 11 files changed, 123 insertions(+), 39 deletions(-) diff --git a/documentation/manual/source/songusage.rst b/documentation/manual/source/songusage.rst index df6d930f3..6e439ce6c 100644 --- a/documentation/manual/source/songusage.rst +++ b/documentation/manual/source/songusage.rst @@ -5,18 +5,30 @@ Song Usage The Songusage plugin records the usage of Songs when they are used in a **Live** situation. If the plugin is active all songs sent to the Live Service Manager are recorded by this plugin. Once the plugin has been activated by the plugin -menu it can be turned on and off by use of the``F4`` key or the SongUsage menus. +menu it can be turned on and off by use of the :guilabel:`F4` key or the +SongUsage menus. The image below shows the menu items and how to access them. .. image:: pics/songusage.png +Delete Tracking Data +^^^^^^^^^^^^^^^^^^^^ +This option allows the removal of stored data use is no longer required. +Select the date you wish to remove data up to and press :guilabel:`Ok`. + +This option is not reversable. + +.. image:: pics/songusagedelete.png + +Extract Tracking Data +^^^^^^^^^^^^^^^^^^^^^ +This option allows reports to be generated between any two dates. + +The system automatically defaults to dates between the 1st September last year +and 31st August this year. The data is written to a file in the selected +directory. -Generating reports ------------------- -This option allows reports to be generated between any two dates. The system -automatically defaults to dates between the 1st September last year and 31st -August this year. The data is written to a file in a selectable directory. The file name is **usage_detail_fromdate_todate.txt**. .. image:: pics/songusagereport.png @@ -27,11 +39,3 @@ The details extracted are: - Song Title - Song Copyright - Song CCLI. - -Removing data -------------- -This option allows the removal of stored data use is no longer required. -Select the date you wish to remove data up to and press``Ok``. This option is -not reversable. - -.. image:: pics/songusagedelete.png diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 749543fd9..58b69bf83 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -420,7 +420,7 @@ class MediaManagerItem(QtGui.QWidget): raise NotImplementedError(u'MediaManagerItem.onDeleteClick needs to ' u'be defined by the plugin') - def generateSlideData(self, service_item, item=None): + def generateSlideData(self, service_item, item=None, xmlVersion=False): raise NotImplementedError(u'MediaManagerItem.generateSlideData needs ' u'to be defined by the plugin') @@ -482,7 +482,7 @@ class MediaManagerItem(QtGui.QWidget): # service items? if self.singleServiceItem or self.remoteTriggered: log.debug(self.plugin.name + u' Add requested') - service_item = self.buildServiceItem() + service_item = self.buildServiceItem(None, True) if service_item: service_item.from_plugin = False self.parent.serviceManager.addServiceItem(service_item, @@ -490,7 +490,7 @@ class MediaManagerItem(QtGui.QWidget): else: items = self.listView.selectedIndexes() for item in items: - service_item = self.buildServiceItem(item) + service_item = self.buildServiceItem(item, True) if service_item: service_item.from_plugin = False self.parent.serviceManager.addServiceItem(service_item) @@ -525,7 +525,7 @@ class MediaManagerItem(QtGui.QWidget): unicode(translate('OpenLP.MediaManagerItem', 'You must select a %s service item.')) % self.title) - def buildServiceItem(self, item=None): + def buildServiceItem(self, item=None, xmlVersion=False): """ Common method for generating a service item """ @@ -534,7 +534,7 @@ class MediaManagerItem(QtGui.QWidget): service_item.add_icon(self.serviceItemIconName) else: service_item.add_icon(self.parent.icon_path) - if self.generateSlideData(service_item, item): + if self.generateSlideData(service_item, item, xmlVersion): return service_item else: return None diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 0cbc34de5..585a89276 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -101,6 +101,7 @@ class ServiceItem(object): self.search_string = u'' self.data_string = u'' self.edit_id = None + self.xml_version = None self._new_item() def _new_item(self): @@ -252,7 +253,8 @@ class ServiceItem(object): u'from_plugin': self.from_plugin, u'capabilities': self.capabilities, u'search': self.search_string, - u'data': self.data_string + u'data': self.data_string, + u'xmlVersion': self.xml_version } service_data = [] if self.service_item_type == ServiceItemType.Text: @@ -294,6 +296,8 @@ class ServiceItem(object): if u'search' in header: self.search_string = header[u'search'] self.data_string = header[u'data'] + if u'xmlVersion' in header: + self.xml_version = header[u'xmlVersion'] if self.service_item_type == ServiceItemType.Text: for slide in serviceitem[u'serviceitem'][u'data']: self._raw_frames.append(slide) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index bb3c1b26d..25edb4926 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -651,7 +651,7 @@ class BibleMediaItem(MediaManagerItem): obj = obj.toPyObject() return unicode(obj) - def generateSlideData(self, service_item, item=None): + def generateSlideData(self, service_item, item=None, xmlVersion=False): """ Generates and formats the slides for the service item as well as the service item's title. diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 8549e6449..83a43fba8 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -144,7 +144,7 @@ class CustomMediaItem(MediaManagerItem): for row in row_list: self.listView.takeItem(row) - def generateSlideData(self, service_item, item=None): + def generateSlideData(self, service_item, item=None, xmlVersion=False): raw_slides = [] raw_footer = [] slide = None diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 7394758c3..4f1e9378e 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -154,7 +154,7 @@ class ImageMediaItem(MediaManagerItem): item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) self.listView.addItem(item_name) - def generateSlideData(self, service_item, item=None): + def generateSlideData(self, service_item, item=None, xmlVersion=False): items = self.listView.selectedIndexes() if items: service_item.title = unicode( diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 030f67153..11e00628e 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -116,7 +116,7 @@ class MediaMediaItem(MediaManagerItem): self.parent.liveController.display.video(filename, 0, True) self.resetButton.setVisible(True) - def generateSlideData(self, service_item, item=None): + def generateSlideData(self, service_item, item=None, xmlVersion=False): if item is None: item = self.listView.currentItem() if item is None: diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index e6f456e5c..8e3a2fc36 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -38,7 +38,7 @@ log = logging.getLogger(__name__) class PresentationListView(BaseListWithDnD): """ Class for the list of Presentations - + We have to explicitly create separate classes for each plugin in order for DnD to the Service manager to work correctly. """ @@ -67,7 +67,7 @@ class PresentationMediaItem(MediaManagerItem): self.message_listener = MessageListener(self) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'mediaitem_presentation_rebuild'), self.rebuild) - + def retranslateUi(self): """ The name of the plugin media displayed in UI @@ -159,7 +159,7 @@ class PresentationMediaItem(MediaManagerItem): if self.DisplayTypeComboBox.count() > 1: self.DisplayTypeComboBox.insertItem(0, self.Automatic) self.DisplayTypeComboBox.setCurrentIndex(0) - if QtCore.QSettings().value(self.settingsSection + u'/override app', + if QtCore.QSettings().value(self.settingsSection + u'/override app', QtCore.QVariant(QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: self.PresentationWidget.show() else: @@ -238,7 +238,7 @@ class PresentationMediaItem(MediaManagerItem): SettingsManager.set_list(self.settingsSection, self.settingsSection, self.getFileList()) - def generateSlideData(self, service_item, item=None): + def generateSlideData(self, service_item, item=None, xmlVersion=False): """ Load the relevant information for displaying the presentation in the slidecontroller. In the case of powerpoints, an image @@ -277,7 +277,7 @@ class PresentationMediaItem(MediaManagerItem): def findControllerByType(self, filename): """ Determine the default application controller to use for the selected - file type. This is used if "Automatic" is set as the preferred + file type. This is used if "Automatic" is set as the preferred controller. Find the first (alphabetic) enabled controller which "supports" the extension. If none found, then look for a controller which "alsosupports" it instead. diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index 351d50071..bb9c6ebf9 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -92,7 +92,6 @@ class VerseType(object): unicode(VerseType.to_string(VerseType.Other)).lower(): return VerseType.Other - -from xml import LyricsXML, SongXMLBuilder, SongXMLParser +from xml import LyricsXML, SongXMLBuilder, SongXMLParser, OpenLyricsParser from songstab import SongsTab from mediaitem import SongMediaItem diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index cb2d6a6e0..546751a48 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -32,7 +32,7 @@ from openlp.core.lib import MediaManagerItem, BaseListWithDnD, Receiver, \ ItemCapabilities, translate, check_item_selected from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \ SongImportForm -from openlp.plugins.songs.lib import SongXMLParser +from openlp.plugins.songs.lib import SongXMLParser, OpenLyricsParser from openlp.plugins.songs.lib.db import Author, Song log = logging.getLogger(__name__) @@ -54,7 +54,6 @@ class SongMediaItem(MediaManagerItem): MediaManagerItem.__init__(self, parent, self, icon) self.edit_song_form = EditSongForm(self, self.parent.manager) self.singleServiceItem = False - #self.edit_song_form = EditSongForm(self.parent.manager, self) self.song_maintenance_form = SongMaintenanceForm( self.parent.manager, self) # Holds information about whether the edit is remotly triggered and @@ -141,7 +140,7 @@ class SongMediaItem(MediaManagerItem): self.updateServiceOnEdit = QtCore.QSettings().value( self.settingsSection + u'/update service on edit', QtCore.QVariant(u'False')).toBool() - self.AddSongFromServide = QtCore.QSettings().value( + self.addSongFromService = QtCore.QSettings().value( self.settingsSection + u'/add song from service', QtCore.QVariant(u'True')).toBool() @@ -328,7 +327,7 @@ class SongMediaItem(MediaManagerItem): self.parent.manager.delete_object(Song, item_id) self.onSearchTextButtonClick() - def generateSlideData(self, service_item, item=None): + def generateSlideData(self, service_item, item=None, xmlVersion=False): log.debug(u'generateSlideData (%s:%s)' % (service_item, item)) raw_footer = [] author_list = u'' @@ -355,7 +354,7 @@ class SongMediaItem(MediaManagerItem): if song.lyrics.startswith(u'' + \ u'%s' % lyrics_output return song_output + +class OpenLyricsParser(object): + """ + This class represents the converter for Song to/from OpenLyrics XML. + """ + def songToXml(self, song): + """ + Convert the song to OpenLyrics Format + """ + songXML = SongXMLParser(song.lyrics) + verseList = songXML.get_verses() + song_xml = objectify.fromstring( + u'') + properties = etree.SubElement(song_xml, u'properties') + titles = etree.SubElement(properties, u'titles') + self.add_text_to_element(u'title', titles, song.title) + if song.alternate_title: + self.add_text_to_element(u'title', titles, song.alternate_title) + if song.theme_name: + themes = etree.SubElement(properties, u'themes') + self.add_text_to_element(u'theme', themes, song.theme_name) + self.add_text_to_element(u'copyright', properties, song.copyright) + self.add_text_to_element(u'verseOrder', properties, song.verse_order) + if song.ccli_number: + self.add_text_to_element(u'ccliNo', properties, song.ccli_number) + authors = etree.SubElement(properties, u'authors') + for author in song.authors: + self.add_text_to_element(u'author', authors, author.display_name) + lyrics = etree.SubElement(song_xml, u'lyrics') + for verse in verseList: + verseTag = u'%s%s' % ( + verse[0][u'type'][0].lower(), verse[0][u'label']) + element = self.add_text_to_element(u'verse', lyrics, None, verseTag) + element = self.add_text_to_element(u'lines', element) + for line in unicode(verse[1]).split(u'\n'): + self.add_text_to_element(u'line', element, line) + #print self.dump_xml(song_xml) + return u'' #self.extract_xml(song_xml) + + def add_text_to_element(self, tag, parent, text=None, label=None): + if label: + element = etree.Element(tag, name = unicode(label)) + else: + element = etree.Element(tag) + if text: + element.text = unicode(text) + parent.append(element) + return element + + def xmlToSong(self, xml): + """ + Create a Song from OpenLyrics format xml + """ + return 0 + + def dump_xml(self, xml): + """ + Debugging aid to dump XML so that we can see what we have. + """ + return etree.tostring(xml, encoding=u'UTF-8', + xml_declaration=True, pretty_print=True) + + def extract_xml(self, xml): + """ + Extract our newly created XML song. + """ + return etree.tostring(xml, encoding=u'UTF-8', + xml_declaration=True) From 326580559a198516328092fcc6bac54926f07fb1 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 27 Nov 2010 16:22:23 +0000 Subject: [PATCH 037/140] Remove documenation for now --- documentation/manual/source/index.rst | 1 - documentation/manual/source/songusage.rst | 41 ----------------------- 2 files changed, 42 deletions(-) delete mode 100644 documentation/manual/source/songusage.rst diff --git a/documentation/manual/source/index.rst b/documentation/manual/source/index.rst index 5228256cf..ac29c4360 100644 --- a/documentation/manual/source/index.rst +++ b/documentation/manual/source/index.rst @@ -14,7 +14,6 @@ Contents: introduction glossary dualmonitors - songusage Indices and tables ================== diff --git a/documentation/manual/source/songusage.rst b/documentation/manual/source/songusage.rst deleted file mode 100644 index 6e439ce6c..000000000 --- a/documentation/manual/source/songusage.rst +++ /dev/null @@ -1,41 +0,0 @@ -========== -Song Usage -========== - -The Songusage plugin records the usage of Songs when they are used in a **Live** -situation. If the plugin is active all songs sent to the Live Service Manager -are recorded by this plugin. Once the plugin has been activated by the plugin -menu it can be turned on and off by use of the :guilabel:`F4` key or the -SongUsage menus. - -The image below shows the menu items and how to access them. - -.. image:: pics/songusage.png - -Delete Tracking Data -^^^^^^^^^^^^^^^^^^^^ -This option allows the removal of stored data use is no longer required. -Select the date you wish to remove data up to and press :guilabel:`Ok`. - -This option is not reversable. - -.. image:: pics/songusagedelete.png - -Extract Tracking Data -^^^^^^^^^^^^^^^^^^^^^ -This option allows reports to be generated between any two dates. - -The system automatically defaults to dates between the 1st September last year -and 31st August this year. The data is written to a file in the selected -directory. - -The file name is **usage_detail_fromdate_todate.txt**. - -.. image:: pics/songusagereport.png - -The details extracted are: - - Date item used - - Time item used - - Song Title - - Song Copyright - - Song CCLI. From 1cf49148620916f7c8c83ffba33cc3891fd89b85 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 27 Nov 2010 20:51:54 +0000 Subject: [PATCH 038/140] fixes from last merge and more code for song management --- openlp/core/lib/mediamanageritem.py | 54 +++++++++++----------- openlp/core/lib/serviceitem.py | 6 +-- openlp/core/ui/maindisplay.py | 14 +++--- openlp/plugins/bibles/lib/mediaitem.py | 2 +- openlp/plugins/songs/forms/editsongform.py | 7 ++- openlp/plugins/songs/lib/mediaitem.py | 2 +- openlp/plugins/songs/lib/xml.py | 40 ++++++++++++++-- 7 files changed, 81 insertions(+), 44 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 58b69bf83..03ecba088 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -420,7 +420,7 @@ class MediaManagerItem(QtGui.QWidget): raise NotImplementedError(u'MediaManagerItem.onDeleteClick needs to ' u'be defined by the plugin') - def generateSlideData(self, service_item, item=None, xmlVersion=False): + def generateSlideData(self, serviceItem, item=None, xmlVersion=False): raise NotImplementedError(u'MediaManagerItem.generateSlideData needs ' u'to be defined by the plugin') @@ -446,10 +446,10 @@ class MediaManagerItem(QtGui.QWidget): 'You must select one or more items to preview.')) else: log.debug(self.plugin.name + u' Preview requested') - service_item = self.buildServiceItem() - if service_item: - service_item.from_plugin = True - self.parent.previewController.addServiceItem(service_item) + serviceItem = self.buildServiceItem() + if serviceItem: + serviceItem.from_plugin = True + self.parent.previewController.addServiceItem(serviceItem) def onLiveClick(self): """ @@ -463,10 +463,10 @@ class MediaManagerItem(QtGui.QWidget): 'You must select one or more items to send live.')) else: log.debug(self.plugin.name + u' Live requested') - service_item = self.buildServiceItem() - if service_item: - service_item.from_plugin = True - self.parent.liveController.addServiceItem(service_item) + serviceItem = self.buildServiceItem() + if serviceItem: + serviceItem.from_plugin = True + self.parent.liveController.addServiceItem(serviceItem) def onAddClick(self): """ @@ -482,18 +482,18 @@ class MediaManagerItem(QtGui.QWidget): # service items? if self.singleServiceItem or self.remoteTriggered: log.debug(self.plugin.name + u' Add requested') - service_item = self.buildServiceItem(None, True) - if service_item: - service_item.from_plugin = False - self.parent.serviceManager.addServiceItem(service_item, + serviceItem = self.buildServiceItem(None, True) + if serviceItem: + serviceItem.from_plugin = False + self.parent.serviceManager.addServiceItem(serviceItem, replace=self.remoteTriggered) else: items = self.listView.selectedIndexes() for item in items: - service_item = self.buildServiceItem(item, True) - if service_item: - service_item.from_plugin = False - self.parent.serviceManager.addServiceItem(service_item) + serviceItem = self.buildServiceItem(item, True) + if serviceItem: + serviceItem.from_plugin = False + self.parent.serviceManager.addServiceItem(serviceItem) def onAddEditClick(self): """ @@ -506,16 +506,16 @@ class MediaManagerItem(QtGui.QWidget): 'You must select one or more items')) else: log.debug(self.plugin.name + u' Add requested') - service_item = self.parent.serviceManager.getServiceItem() - if not service_item: + serviceItem = self.parent.serviceManager.getServiceItem() + if not serviceItem: QtGui.QMessageBox.information(self, translate('OpenLP.MediaManagerItem', 'No Service Item Selected'), translate('OpenLP.MediaManagerItem', 'You must select an existing service item to add to.')) - elif self.title.lower() == service_item.name.lower(): - self.generateSlideData(service_item) - self.parent.serviceManager.addServiceItem(service_item, + elif self.title.lower() == serviceItem.name.lower(): + self.generateSlideData(serviceItem) + self.parent.serviceManager.addServiceItem(serviceItem, replace=True) else: # Turn off the remote edit update message indicator @@ -529,13 +529,13 @@ class MediaManagerItem(QtGui.QWidget): """ Common method for generating a service item """ - service_item = ServiceItem(self.parent) + serviceItem = ServiceItem(self.parent) if self.serviceItemIconName: - service_item.add_icon(self.serviceItemIconName) + serviceItem.add_icon(self.serviceItemIconName) else: - service_item.add_icon(self.parent.icon_path) - if self.generateSlideData(service_item, item, xmlVersion): - return service_item + serviceItem.add_icon(self.parent.icon_path) + if self.generateSlideData(serviceItem, item, xmlVersion): + return serviceItem else: return None diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 585a89276..b9394030a 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -254,7 +254,7 @@ class ServiceItem(object): u'capabilities': self.capabilities, u'search': self.search_string, u'data': self.data_string, - u'xmlVersion': self.xml_version + u'xml_version': self.xml_version } service_data = [] if self.service_item_type == ServiceItemType.Text: @@ -296,8 +296,8 @@ class ServiceItem(object): if u'search' in header: self.search_string = header[u'search'] self.data_string = header[u'data'] - if u'xmlVersion' in header: - self.xml_version = header[u'xmlVersion'] + if u'xml_version' in header: + self.xml_version = header[u'xml_version'] if self.service_item_type == ServiceItemType.Text: for slide in serviceitem[u'serviceitem'][u'data']: self._raw_frames.append(slide) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 9d6c04075..90f920a50 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -100,7 +100,7 @@ class MainDisplay(DisplayWidget): self.screens = screens self.isLive = live self.alertTab = None - self.hide_mode = None + self.hideMode = None self.setWindowTitle(u'OpenLP Display') self.setStyleSheet(u'border: 0px; margin: 0px; padding: 0px;') self.setWindowFlags(QtCore.Qt.FramelessWindowHint | @@ -381,8 +381,8 @@ class MainDisplay(DisplayWidget): if self.isLive: self.setVisible(True) # if was hidden keep it hidden - if self.hide_mode and self.isLive: - self.hideDisplay(self.hide_mode) + if self.hideMode and self.isLive: + self.hideDisplay(self.hideMode) preview = QtGui.QImage(self.screen[u'size'].width(), self.screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied) @@ -412,8 +412,8 @@ class MainDisplay(DisplayWidget): if serviceItem.foot_text and serviceItem.foot_text: self.footer(serviceItem.foot_text) # if was hidden keep it hidden - if self.hide_mode and self.isLive: - self.hideDisplay(self.hide_mode) + if self.hideMode and self.isLive: + self.hideDisplay(self.hideMode) def footer(self, text): """ @@ -444,7 +444,7 @@ class MainDisplay(DisplayWidget): self.setVisible(True) if self.phononActive: self.webView.setVisible(True) - self.hide_mode = mode + self.hideMode = mode def showDisplay(self): """ @@ -459,7 +459,7 @@ class MainDisplay(DisplayWidget): if self.phononActive: self.webView.setVisible(False) self.videoPlay() - self.hide_mode = None + self.hideMode = None # Trigger actions when display is active again Receiver.send_message(u'maindisplay_active') diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 25edb4926..0e1850485 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -545,7 +545,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: diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 241c6fd95..8c92583d5 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -630,7 +630,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): Get all the data from the widgets on the form, and then save it to the database. - ``preview`` + ``preview`` Should be True if song is also previewed. """ self.song.title = unicode(self.TitleEditItem.text()) @@ -648,6 +648,11 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): Book.name == book_name) else: self.song.book = None + theme_name = unicode(self.ThemeSelectionComboItem.currentText()) + if theme_name: + self.song.theme_name = theme_name + else: + self.song.theme_name = None if self._validate_song(): self.processLyrics() self.processTitle() diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 546751a48..3441aed86 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -396,7 +396,7 @@ class SongMediaItem(MediaManagerItem): ] service_item.data_string = {u'title':song.search_title, u'authors':author_list} - service_item.xml_version = OpenLyricsParser().songToXml(song) + service_item.xml_version = OpenLyricsParser().song_to_xml(song) return True def serviceLoad(self, item): diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 782a86bfa..bdd8478d4 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -41,6 +41,7 @@ The basic XML is of the format:: import logging from lxml import etree, objectify +from openlp.plugins.songs.lib.db import Author, Song log = logging.getLogger(__name__) @@ -97,6 +98,7 @@ class SongXMLBuilder(object): return etree.tostring(self.song_xml, encoding=u'UTF-8', xml_declaration=True) + class SongXMLParser(object): """ A class to read in and parse a song's XML. @@ -239,11 +241,12 @@ class LyricsXML(object): u'%s' % lyrics_output return song_output + class OpenLyricsParser(object): """ This class represents the converter for Song to/from OpenLyrics XML. """ - def songToXml(self, song): + def song_to_xml(self, song): """ Convert the song to OpenLyrics Format """ @@ -274,8 +277,8 @@ class OpenLyricsParser(object): element = self.add_text_to_element(u'lines', element) for line in unicode(verse[1]).split(u'\n'): self.add_text_to_element(u'line', element, line) - #print self.dump_xml(song_xml) - return u'' #self.extract_xml(song_xml) + self.xml_to_song(self.extract_xml(song_xml)) + return u'' #self.xml_to_song(self.extract_xml(song_xml)) def add_text_to_element(self, tag, parent, text=None, label=None): if label: @@ -287,11 +290,40 @@ class OpenLyricsParser(object): parent.append(element) return element - def xmlToSong(self, xml): + def xml_to_song(self, xml): """ Create a Song from OpenLyrics format xml """ return 0 + song = Song() + if xml[:5] == u' Date: Sun, 28 Nov 2010 13:39:51 +0000 Subject: [PATCH 039/140] Song rebuilding continues --- openlp/plugins/songs/lib/mediaitem.py | 7 +- openlp/plugins/songs/lib/xml.py | 143 +++++++++++++++++--------- 2 files changed, 97 insertions(+), 53 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 3441aed86..0d5572d1e 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -53,6 +53,7 @@ class SongMediaItem(MediaManagerItem): self.ListViewWithDnD_class = SongListView MediaManagerItem.__init__(self, parent, self, icon) self.edit_song_form = EditSongForm(self, self.parent.manager) + self.openLyrics = OpenLyricsParser(self.parent.manager) self.singleServiceItem = False self.song_maintenance_form = SongMaintenanceForm( self.parent.manager, self) @@ -396,7 +397,7 @@ class SongMediaItem(MediaManagerItem): ] service_item.data_string = {u'title':song.search_title, u'authors':author_list} - service_item.xml_version = OpenLyricsParser().song_to_xml(song) + service_item.xml_version = self.openLyrics.song_to_xml(song) return True def serviceLoad(self, item): @@ -424,12 +425,12 @@ class SongMediaItem(MediaManagerItem): else: # Authors different if self.addSongFromService: - editId = OpenLyricsParser(). \ + editId = self.openLyrics. \ xmlToSong(item.xml_version) else: # Title does not match if self.addSongFromService: - editId = OpenLyricsParser().xmlToSong(item.xml_version) + editId = self.openLyrics.xmlToSong(item.xml_version) # Update service with correct song id if editId != 0: Receiver.send_message(u'service_item_update', diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index bdd8478d4..03b672928 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -39,6 +39,7 @@ The basic XML is of the format:: """ import logging +import re from lxml import etree, objectify from openlp.plugins.songs.lib.db import Author, Song @@ -246,6 +247,9 @@ class OpenLyricsParser(object): """ This class represents the converter for Song to/from OpenLyrics XML. """ + def __init__(self, manager): + self.manager = manager + def song_to_xml(self, song): """ Convert the song to OpenLyrics Format @@ -256,31 +260,87 @@ class OpenLyricsParser(object): u'') properties = etree.SubElement(song_xml, u'properties') titles = etree.SubElement(properties, u'titles') - self.add_text_to_element(u'title', titles, song.title) + self._add_text_to_element(u'title', titles, song.title) if song.alternate_title: - self.add_text_to_element(u'title', titles, song.alternate_title) + self._add_text_to_element(u'title', titles, song.alternate_title) if song.theme_name: themes = etree.SubElement(properties, u'themes') - self.add_text_to_element(u'theme', themes, song.theme_name) - self.add_text_to_element(u'copyright', properties, song.copyright) - self.add_text_to_element(u'verseOrder', properties, song.verse_order) + self._add_text_to_element(u'theme', themes, song.theme_name) + self._add_text_to_element(u'copyright', properties, song.copyright) + self._add_text_to_element(u'verseOrder', properties, song.verse_order) if song.ccli_number: - self.add_text_to_element(u'ccliNo', properties, song.ccli_number) + self._add_text_to_element(u'ccliNo', properties, song.ccli_number) authors = etree.SubElement(properties, u'authors') for author in song.authors: - self.add_text_to_element(u'author', authors, author.display_name) + self._add_text_to_element(u'author', authors, author.display_name) lyrics = etree.SubElement(song_xml, u'lyrics') for verse in verseList: verseTag = u'%s%s' % ( verse[0][u'type'][0].lower(), verse[0][u'label']) - element = self.add_text_to_element(u'verse', lyrics, None, verseTag) - element = self.add_text_to_element(u'lines', element) + element = self._add_text_to_element(u'verse', lyrics, None, verseTag) + element = self._add_text_to_element(u'lines', element) for line in unicode(verse[1]).split(u'\n'): - self.add_text_to_element(u'line', element, line) - self.xml_to_song(self.extract_xml(song_xml)) - return u'' #self.xml_to_song(self.extract_xml(song_xml)) + self._add_text_to_element(u'line', element, line) + print self._dump_xml(song_xml) + self.xml_to_song(self._extract_xml(song_xml)) + return u'' #self.xml_to_song(self._extract_xml(song_xml)) - def add_text_to_element(self, tag, parent, text=None, label=None): + def xml_to_song(self, xml): + """ + Create a Song from OpenLyrics format xml + """ + song = Song() + if xml[:5] == u' Date: Sun, 28 Nov 2010 13:41:52 +0000 Subject: [PATCH 040/140] Fix DnD bug --- openlp/core/ui/servicemanager.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index f294cedd4..454819f32 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -1028,6 +1028,9 @@ class ServiceManager(QtGui.QWidget): # ServiceManager started the drag and drop if plugin == u'ServiceManager': startpos, startCount = self.findServiceItem() + # If no items selected + if startpos == -1: + return if item is None: endpos = len(self.serviceItems) else: From 9fa384b57f988f695820caed6f424af7ade20221 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 28 Nov 2010 14:40:46 +0000 Subject: [PATCH 041/140] More changes --- openlp/plugins/songs/lib/xml.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 03b672928..5cfa8603b 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -317,9 +317,7 @@ class OpenLyricsParser(object): unicode(song.search_title)).lower() # Process Authors for author in properties.authors.author: - print author, author.text - #song.authors.append(self._process_author(author.text)) - print "here" + self._process_author(author.text, song) # Process Lyrics sxml = SongXMLBuilder() search_text = u'' @@ -327,16 +325,18 @@ class OpenLyricsParser(object): for verse in song_xml.lyrics.verse: print "verse", verse.attrib text = u'' - for line in lyrics.verse.lines.line: + for line in verse.lines.line: line = unicode(line) if not text: text = line else: text += u'\n' + line - sxml.add_verse_to_lyrics(u'V', verse.attrib, text) + sxml.add_verse_to_lyrics(u'V', verse.attrib[u'name'], text) search_text = search_text + text song.search_lyrics = search_text.lower() song.lyrics = unicode(sxml.extract_xml(), u'utf-8') + song.comments = u'' + song.song_number = u'' self.manager.save_object(song) return 0 @@ -364,7 +364,7 @@ class OpenLyricsParser(object): return etree.tostring(xml, encoding=u'UTF-8', xml_declaration=True) - def _process_author(self, name): + def _process_author(self, name, song): """ Find or create an Author from display_name. """ @@ -374,10 +374,10 @@ class OpenLyricsParser(object): Author.display_name == name) if search_results: # should only be one! so take the first - return search_results[0] + song.authors.append(search_results[0]) else: # Need a new author new_author = Author.populate(first_name=name.rsplit(u' ', 1)[0], last_name=name.rsplit(u' ', 1)[1], display_name=name) self.manager.save_object(new_author) - return author + song.authors.append(new_author) From 8929aaaa2301cc41e368f47118ec1ec1d3700bfc Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 28 Nov 2010 16:10:51 +0100 Subject: [PATCH 042/140] docs; make sure, that the edit/delete buttons are always disabled after loading the window --- openlp/plugins/songs/forms/editsongform.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 241c6fd95..d81f1a27a 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -152,6 +152,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): def newSong(self): log.debug(u'New Song') + self.initialise() self.SongTabWidget.setCurrentIndex(0) self.TitleEditItem.setText(u'') self.AlternativeEdit.setText(u'') @@ -170,8 +171,18 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): # it's a new song to preview is not possible self.previewButton.setVisible(False) - def loadSong(self, id, preview): + def loadSong(self, id, preview=False): + """ + Loads a song. + + ``id`` + The song id (int). + + ``preview`` + Should be ``True`` if the song is also previewed (boolean). + """ log.debug(u'Load Song') + self.initialise() self.SongTabWidget.setCurrentIndex(0) self.loadAuthors() self.loadTopics() @@ -594,6 +605,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): """ Save and Preview button pressed. The Song is valid so as the plugin to add it to preview to see. + + ``button`` + A button (QPushButton). """ log.debug(u'onPreview') if unicode(button.objectName()) == u'previewButton' and \ @@ -631,7 +645,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): database. ``preview`` - Should be True if song is also previewed. + Should be ``True`` if the song is also previewed (boolean). """ self.song.title = unicode(self.TitleEditItem.text()) self.song.alternate_title = unicode(self.AlternativeEdit.text()) From 132c67856939276238e26ebd60db60235cc3fcdb Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 28 Nov 2010 15:20:53 +0000 Subject: [PATCH 043/140] Fix exit for non Sqlite Databases --- openlp/core/lib/db.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 0dc138abc..8afa02111 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -294,4 +294,5 @@ class Manager(object): """ if self.is_dirty: engine = create_engine(self.db_url) - engine.execute("vacuum") + if self.db_url.startswith(u'sqlite'): + engine.execute("vacuum") From e2ac8b6dcc50139ebc5b5b96499e993945f396c8 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 28 Nov 2010 16:48:36 +0000 Subject: [PATCH 044/140] More code fixes --- openlp/plugins/songs/lib/xml.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 5cfa8603b..a12bdc24c 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -79,7 +79,6 @@ class SongXMLBuilder(object): ``content`` The actual text of the verse to be stored. """ - # log.debug(u'add_verse_to_lyrics %s, %s\n%s' % (type, number, content)) verse = etree.Element(u'verse', type = unicode(type), label = unicode(number)) verse.text = etree.CDATA(content) @@ -368,13 +367,12 @@ class OpenLyricsParser(object): """ Find or create an Author from display_name. """ - print "name = ", name name = unicode(name) - search_results = self.manager.get_all_objects(Author, + author = self.manager.get_object_filtered(Author, Author.display_name == name) - if search_results: + if author: # should only be one! so take the first - song.authors.append(search_results[0]) + song.authors.append(author) else: # Need a new author new_author = Author.populate(first_name=name.rsplit(u' ', 1)[0], From 6ecc121bdfc5998db261e90e1adf9c5464fc0296 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 28 Nov 2010 19:38:27 +0000 Subject: [PATCH 045/140] Convert verse tags --- openlp/core/lib/mediamanageritem.py | 4 ++-- openlp/plugins/songs/lib/__init__.py | 30 +++++++++++++++++++++++++++ openlp/plugins/songs/lib/mediaitem.py | 1 + openlp/plugins/songs/lib/xml.py | 4 +++- 4 files changed, 36 insertions(+), 3 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 03ecba088..130da0c0e 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -478,8 +478,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') serviceItem = self.buildServiceItem(None, True) diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index bb9c6ebf9..795116b4e 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -62,6 +62,36 @@ class VerseType(object): elif verse_type == VerseType.Other: return translate('SongsPlugin.VerseType', 'Other') + @staticmethod + def expand_string(verse_type): + """ + Return the VerseType for a given string + + ``verse_type`` + The string to return a VerseType for + """ + verse_type = verse_type.lower() + if verse_type == unicode(VerseType.to_string(VerseType.Verse)).lower()[0]: + return translate('SongsPlugin.VerseType', 'Verse') + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Chorus)).lower()[0]: + return translate('SongsPlugin.VerseType', 'Chorus') + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Bridge)).lower()[0]: + return translate('SongsPlugin.VerseType', 'Bridge') + elif verse_type == \ + unicode(VerseType.to_string(VerseType.PreChorus)).lower()[0]: + return translate('SongsPlugin.VerseType', 'PreChorus') + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Intro)).lower()[0]: + return translate('SongsPlugin.VerseType', 'Intro') + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Ending)).lower()[0]: + return translate('SongsPlugin.VerseType', 'Ending') + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Other)).lower()[0]: + return translate('SongsPlugin.VerseType', 'Other') + @staticmethod def from_string(verse_type): """ diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 0d5572d1e..2ffa096a6 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -397,6 +397,7 @@ class SongMediaItem(MediaManagerItem): ] service_item.data_string = {u'title':song.search_title, u'authors':author_list} + # if xmlVersion: service_item.xml_version = self.openLyrics.song_to_xml(song) return True diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index a12bdc24c..910fb6549 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -42,6 +42,7 @@ import logging import re from lxml import etree, objectify +from openlp.plugins.songs.lib import VerseType from openlp.plugins.songs.lib.db import Author, Song log = logging.getLogger(__name__) @@ -330,7 +331,8 @@ class OpenLyricsParser(object): text = line else: text += u'\n' + line - sxml.add_verse_to_lyrics(u'V', verse.attrib[u'name'], text) + type = VerseType.expand_string(verse.attrib[u'name'][0]) + sxml.add_verse_to_lyrics(type, verse.attrib[u'name'][1], text) search_text = search_text + text song.search_lyrics = search_text.lower() song.lyrics = unicode(sxml.extract_xml(), u'utf-8') From 5decd5c4661f6860fa54e508ddfafbec966d4e3c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 29 Nov 2010 07:32:08 +0000 Subject: [PATCH 046/140] Cleanups and fixes --- openlp/plugins/custom/forms/editcustomform.py | 6 +++--- openlp/plugins/custom/forms/editcustomslideform.py | 4 ++-- openlp/plugins/custom/lib/customxmlhandler.py | 11 ++++++----- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 65a73337a..c5281574b 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -46,7 +46,6 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): Constructor """ QtGui.QDialog.__init__(self, parent) - #self.parent = parent self.setupUi(self) # Connecting signals and slots self.previewButton = QtGui.QPushButton() @@ -124,8 +123,9 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): self.slideListView.addItem(slide[1]) theme = self.customSlide.theme_name id = self.themeComboBox.findText(theme, QtCore.Qt.MatchExactly) + # No theme match if id == -1: - id = 0 # Not Found + id = 0 self.themeComboBox.setCurrentIndex(id) else: self.themeComboBox.setCurrentIndex(0) @@ -264,7 +264,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): self.titleEdit.setFocus() return False, translate('CustomPlugin.EditCustomForm', 'You need to type in a title.') - # We must have one slide. + # We must have at least one slide. if self.slideListView.count() == 0: return False, translate('CustomPlugin.EditCustomForm', 'You need to add at least one slide') diff --git a/openlp/plugins/custom/forms/editcustomslideform.py b/openlp/plugins/custom/forms/editcustomslideform.py index 5f535c8bc..72c7dbb4a 100644 --- a/openlp/plugins/custom/forms/editcustomslideform.py +++ b/openlp/plugins/custom/forms/editcustomslideform.py @@ -50,7 +50,7 @@ class EditCustomSlideForm(QtGui.QDialog, Ui_CustomSlideEditDialog): def setText(self, text): """ Set the text for slideTextEdit. - + ``text`` The text (unicode). """ @@ -67,7 +67,7 @@ class EditCustomSlideForm(QtGui.QDialog, Ui_CustomSlideEditDialog): def onSplitButtonPressed(self): """ - Splits a slide in two slides. + Adds a slide split at the cursor. """ if self.slideTextEdit.textCursor().columnNumber() != 0: self.slideTextEdit.insertPlainText(u'\n') diff --git a/openlp/plugins/custom/lib/customxmlhandler.py b/openlp/plugins/custom/lib/customxmlhandler.py index b554f9657..987163aa3 100644 --- a/openlp/plugins/custom/lib/customxmlhandler.py +++ b/openlp/plugins/custom/lib/customxmlhandler.py @@ -43,6 +43,7 @@ import logging from xml.dom.minidom import Document from xml.etree.ElementTree import ElementTree, XML, dump +from lxml import etree, objectify from xml.parsers.expat import ExpatError log = logging.getLogger(__name__) @@ -129,10 +130,11 @@ class CustomXMLParser(object): The XML of the song to be parsed. """ self.custom_xml = None + if xml[:5] == u' Date: Mon, 29 Nov 2010 14:04:37 +0000 Subject: [PATCH 047/140] Songs get built correctly --- openlp/plugins/custom/lib/customxmlhandler.py | 19 ++++--- openlp/plugins/custom/lib/mediaitem.py | 6 +-- openlp/plugins/songs/lib/xml.py | 50 +++++++++---------- 3 files changed, 36 insertions(+), 39 deletions(-) diff --git a/openlp/plugins/custom/lib/customxmlhandler.py b/openlp/plugins/custom/lib/customxmlhandler.py index 987163aa3..907c3470d 100644 --- a/openlp/plugins/custom/lib/customxmlhandler.py +++ b/openlp/plugins/custom/lib/customxmlhandler.py @@ -56,14 +56,14 @@ class CustomXMLBuilder(object): def __init__(self): """ - Set up the song builder. + Set up the custom builder. """ # Create the minidom document self.custom_xml = Document() def new_document(self): """ - Create a new song XML document. + Create a new custom XML document. """ # Create the base element self.song = self.custom_xml.createElement(u'song') @@ -73,7 +73,7 @@ class CustomXMLBuilder(object): def add_lyrics_to_song(self): """ Set up and add a ```` tag which contains the lyrics of the - song. + custom item. """ # Create the main element self.lyrics = self.custom_xml.createElement(u'lyrics') @@ -94,7 +94,6 @@ class CustomXMLBuilder(object): ``content`` The actual text of the verse to be stored. """ - #log.debug(u'add_verse_to_lyrics %s, %s\n%s' % (type, number, content)) verse = self.custom_xml.createElement(u'verse') verse.setAttribute(u'type', type) verse.setAttribute(u'label', number) @@ -103,7 +102,7 @@ class CustomXMLBuilder(object): cds = self.custom_xml.createCDATASection(content) verse.appendChild(cds) - def dump_xml(self): + def _dump_xml(self): """ Debugging aid to dump XML so that we can see what we have. """ @@ -111,23 +110,23 @@ class CustomXMLBuilder(object): def extract_xml(self): """ - Extract our newly created XML song. + Extract our newly created XML custom. """ return self.custom_xml.toxml(u'utf-8') class CustomXMLParser(object): """ - A class to read in and parse a song's XML. + A class to read in and parse a custom's XML. """ log.info(u'CustomXMLParser Loaded') def __init__(self, xml): """ - Set up our song XML parser. + Set up our custom XML parser. ``xml`` - The XML of the song to be parsed. + The XML of the custom to be parsed. """ self.custom_xml = None if xml[:5] == u' Date: Mon, 29 Nov 2010 16:02:41 +0000 Subject: [PATCH 048/140] Songs get created correctly and displays refreshed --- openlp/core/ui/servicemanager.py | 2 ++ openlp/plugins/songs/forms/editsongform.py | 7 +++++-- openlp/plugins/songs/lib/mediaitem.py | 11 ++++++----- openlp/plugins/songs/lib/xml.py | 23 +++++++++++++++------- 4 files changed, 29 insertions(+), 14 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 454819f32..6d721823a 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -789,6 +789,8 @@ class ServiceManager(QtGui.QWidget): self.serviceName = name[len(name) - 1] self.parent.addRecentFile(filename) self.parent.serviceChanged(True, self.serviceName) + # Refresh Plugin lists + Receiver.send_message(u'plugin_list_refresh') def validateItem(self, serviceItem): """ diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 8c92583d5..c9868d2e3 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -636,8 +636,11 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.song.title = unicode(self.TitleEditItem.text()) self.song.alternate_title = unicode(self.AlternativeEdit.text()) self.song.copyright = unicode(self.CopyrightEditItem.text()) - self.song.search_title = self.song.title + u'@' + \ - self.song.alternate_title + if self.song.alternate_title: + self.song.search_title = self.song.title + u'@' + \ + self.song.alternate_title + else: + self.song.search_title = self.song.title self.song.comments = unicode(self.CommentsEdit.toPlainText()) self.song.verse_order = unicode(self.VerseOrderEdit.text()) self.song.ccli_number = unicode(self.CCLNumberEdit.text()) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 2ffa096a6..432eee744 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -114,6 +114,8 @@ class SongMediaItem(MediaManagerItem): self.SearchButtonLayout.addWidget(self.ClearTextButton) self.pageLayout.addLayout(self.SearchButtonLayout) # Signals and slots + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'plugin_list_refresh'), self.onSearchTextButtonClick) QtCore.QObject.connect(self.SearchTextEdit, QtCore.SIGNAL(u'returnPressed()'), self.onSearchTextButtonClick) QtCore.QObject.connect(self.SearchTextButton, @@ -397,7 +399,6 @@ class SongMediaItem(MediaManagerItem): ] service_item.data_string = {u'title':song.search_title, u'authors':author_list} - # if xmlVersion: service_item.xml_version = self.openLyrics.song_to_xml(song) return True @@ -408,8 +409,8 @@ class SongMediaItem(MediaManagerItem): log.debug(u'serviceLoad') if item.data_string: search_results = self.parent.manager.get_all_objects(Song, - Song.search_title.like(u'%' + - item.data_string[u'title'].split(u'@')[0] + u'%'), + Song.search_title == + item.data_string[u'title'].split(u'@')[0].lower() , Song.search_title.asc()) author_list = item.data_string[u'authors'].split(u', ') editId = 0 @@ -427,11 +428,11 @@ class SongMediaItem(MediaManagerItem): # Authors different if self.addSongFromService: editId = self.openLyrics. \ - xmlToSong(item.xml_version) + xml_to_song(item.xml_version) else: # Title does not match if self.addSongFromService: - editId = self.openLyrics.xmlToSong(item.xml_version) + editId = self.openLyrics.xml_to_song(item.xml_version) # Update service with correct song id if editId != 0: Receiver.send_message(u'service_item_update', diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index f5f285396..2d9855ca8 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -281,14 +281,15 @@ class OpenLyricsParser(object): element = self._add_text_to_element(u'lines', element) for line in unicode(verse[1]).split(u'\n'): self._add_text_to_element(u'line', element, line) - print self._dump_xml(song_xml) - self.xml_to_song(self._extract_xml(song_xml)) - return u'' #self.xml_to_song(self._extract_xml(song_xml)) + return self._extract_xml(song_xml) def xml_to_song(self, xml): """ Create a Song from OpenLyrics format xml """ + # No xml get out of here + if not xml: + return 0 song = Song() if xml[:5] == u' Date: Mon, 29 Nov 2010 20:02:58 +0100 Subject: [PATCH 049/140] 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 7f1e21c13bab2853c7684147e2a5790326758db3 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 30 Nov 2010 20:23:21 +0000 Subject: [PATCH 050/140] Fix field names and verse order bug --- openlp/plugins/songs/lib/xml.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 2d9855ca8..655ea1e3c 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -254,8 +254,8 @@ class OpenLyricsParser(object): """ Convert the song to OpenLyrics Format """ - songXML = SongXMLParser(song.lyrics) - verseList = songXML.get_verses() + song_xml_parser = SongXMLParser(song.lyrics) + verse_list = song_xml_parser.get_verses() song_xml = objectify.fromstring( u'') properties = etree.SubElement(song_xml, u'properties') @@ -274,10 +274,11 @@ class OpenLyricsParser(object): for author in song.authors: self._add_text_to_element(u'author', authors, author.display_name) lyrics = etree.SubElement(song_xml, u'lyrics') - for verse in verseList: - verseTag = u'%s%s' % ( + for verse in verse_list: + verse_tag = u'%s%s' % ( verse[0][u'type'][0].lower(), verse[0][u'label']) - element = self._add_text_to_element(u'verse', lyrics, None, verseTag) + element = \ + self._add_text_to_element(u'verse', lyrics, None, verse_tag) element = self._add_text_to_element(u'lines', element) for line in unicode(verse[1]).split(u'\n'): self._add_text_to_element(u'line', element, line) @@ -297,6 +298,8 @@ class OpenLyricsParser(object): properties = song_xml.properties song.copyright = unicode(properties.copyright.text) song.verse_order = unicode(properties.verseOrder.text) + if song.verse_order == u'None': + song.verse_order = u'' song.topics = [] song.book = None theme_name = None From cd6948f61335cf5c05b25fe111b0cbd1e9a0af27 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 1 Dec 2010 19:37:54 +0100 Subject: [PATCH 051/140] 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 052/140] 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 053/140] 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 054/140] 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 055/140] 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 056/140] 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 057/140] 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 058/140] 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 059/140] 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 060/140] 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 e6cfad921a51a61e5c8a73c7fbe92c13f398bd81 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 4 Dec 2010 21:42:03 +0100 Subject: [PATCH 061/140] olpv1 bible importer --- openlp/plugins/bibles/lib/db.py | 2 +- openlp/plugins/bibles/lib/manager.py | 1 + openlp/plugins/bibles/lib/olp1import.py | 98 +++++++++++++++++++++++++ 3 files changed, 100 insertions(+), 1 deletion(-) create mode 100755 openlp/plugins/bibles/lib/olp1import.py diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 9852ed16b..cdc81d408 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -231,7 +231,7 @@ class BibleDB(QtCore.QObject, Manager): def create_chapter(self, book_id, chapter, textlist): """ - Add a chapter and it's verses to a book. + Add a chapter and its verses to a book. ``book_id`` The id of the book being appended. diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 6b4d7c800..6c8b9f4ab 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -61,6 +61,7 @@ class BibleFormat(object): CSV = 1 OpenSong = 2 WebDownload = 3 + OpenLPv1 = 4 @staticmethod def get_class(format): diff --git a/openlp/plugins/bibles/lib/olp1import.py b/openlp/plugins/bibles/lib/olp1import.py new file mode 100755 index 000000000..75bb2e643 --- /dev/null +++ b/openlp/plugins/bibles/lib/olp1import.py @@ -0,0 +1,98 @@ +# -*- 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 sqlite + +#from openlp.core.lib import Receiver +from db import BibleDB + +log = logging.getLogger(__name__) + +class OpenLPv1BibleImporter(BibleDB): + """ + This class provides the OpenLPv1 bible importer. + """ + def _init__(self, parent, **kwargs): + """ + Constructor. + """ + BibleDB.__init__(self, parent, **kwargs) + if 'filename' not in kwargs: + raise KeyError(u'You have to supply a file name to import from.') + self.filename = kwargs['filename'] +# QtCore.QObject.connect(Receiver.get_receiver(), +# QtCore.SIGNAL(u'bibles_stop_import'), self.stop_import) + + def do_import(self): + """ + Imports an openlp.org v1 bible. + """ + connection = None + cursor = None + #self.wizard.incrementProgressBar(u'Preparing for import...') + try: + connection = sqlite.connect(self.filename) + cursor = connection.cursor() + except: + return False + # Import the meta data. + cursor.execute(u'SELECT "key", "value" FROM metadata') + meta_data = cursor.fetchall() + for data in meta_data: + key = unicode(data[0], u'cp1252') + value = unicode(data[1], u'cp1252') + if key == u'Permission': + key = u'Permissions' + self.create_meta(self, key, value) + # Import the testaments. + cursor.execute(u'SELECT id, name FROM testament') + testaments = cursor.fetchall() + for testament in testaments: + id = int(testament[0]) + name = unicode(testament[1], u'cp1252') + sql_params = (id, name) + # TODO: complete testament import. + # Import books. + cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') + books = cursor.fetchall() + for book in books: + testament_id = int(book[1]) + name = unicode(book[2], u'cp1252') + abbreviation = unicode(book[3], u'cp1252') + self.create_book(name, abbreviation, testament_id) + # Import chapters/verses. + cursor.execute(u'SELECT id, book_id, chapter, verse, text || \'\' AS ' + 'text FROM verse') + verses = old_cursor.fetchall() + for verse in verses: + book_id = int(verse[1]) + chapter = int(verse[2]) + verse_number = int(verse[3]) + text = unicode(verse[4], u'cp1252') + self.create_verse(book_id, chapter, verse_number, text) + return True + From b8e6da0417857ee4eddf6ffbf419016abaa6dda0 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 5 Dec 2010 16:47:23 +0100 Subject: [PATCH 062/140] completed work --- openlp/plugins/bibles/lib/olp1.py | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/openlp/plugins/bibles/lib/olp1.py b/openlp/plugins/bibles/lib/olp1.py index c0106a980..cc5a5550e 100755 --- a/openlp/plugins/bibles/lib/olp1.py +++ b/openlp/plugins/bibles/lib/olp1.py @@ -73,15 +73,17 @@ class OpenLP1Bible(BibleDB): self.create_book(name, abbreviation, testament_id) self.session.commit() # Import chapters/verses. - cursor.execute(u'SELECT id, book_id, chapter, verse, text || \'\' AS ' - 'text FROM verse') - verses = cursor.fetchall() - for verse in verses: - book_id = int(verse[1]) - chapter = int(verse[2]) - verse_number = int(verse[3]) - text = unicode(verse[4], u'cp1252') - self.create_verse(book_id, chapter, verse_number, text) - self.session.commit() + for book in books: + print u'Importiere %s' % book + cursor.execute(u'SELECT id, book_id, chapter, verse, text || \'\' ' + 'AS text FROM verse WHERE book_id=%s' % book) + verses = cursor.fetchall() + for verse in verses: + book_id = int(verse[1]) + chapter = int(verse[2]) + verse_number = int(verse[3]) + text = unicode(verse[4], u'cp1252') + self.create_verse(book_id, chapter, verse_number, text) + self.session.commit() return True From e3cb6a6508375e377e6b0ae94ebef4452d5624b4 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 5 Dec 2010 17:07:16 +0100 Subject: [PATCH 063/140] changed --- openlp/plugins/bibles/lib/olp1.py | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/openlp/plugins/bibles/lib/olp1.py b/openlp/plugins/bibles/lib/olp1.py index cc5a5550e..98a7e4da7 100755 --- a/openlp/plugins/bibles/lib/olp1.py +++ b/openlp/plugins/bibles/lib/olp1.py @@ -63,27 +63,25 @@ class OpenLP1Bible(BibleDB): cursor = connection.cursor() except: return False - # Import books. + # Create all books. cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') books = cursor.fetchall() for book in books: + book_id = int(book[0]) testament_id = int(book[1]) name = unicode(book[2], u'cp1252') abbreviation = unicode(book[3], u'cp1252') + self.wizard.incrementProgressBar(unicode('%s %s' % (translate( + 'BiblesPlugin.olp1', 'Importing'), name))) self.create_book(name, abbreviation, testament_id) - self.session.commit() - # Import chapters/verses. - for book in books: - print u'Importiere %s' % book - cursor.execute(u'SELECT id, book_id, chapter, verse, text || \'\' ' - 'AS text FROM verse WHERE book_id=%s' % book) + # Import the verses for this book. + cursor.execute(u'SELECT chapter, verse, text || \'\' AS text FROM ' + 'verse WHERE book_id=%s' % book_id) verses = cursor.fetchall() for verse in verses: - book_id = int(verse[1]) - chapter = int(verse[2]) - verse_number = int(verse[3]) - text = unicode(verse[4], u'cp1252') + chapter = int(verse[0]) + verse_number = int(verse[1]) + text = unicode(verse[2], u'cp1252') self.create_verse(book_id, chapter, verse_number, text) - self.session.commit() + self.session.commit() return True - From 3389e487ca34a83bc1c42b7052b16a61fda73a0d Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sun, 5 Dec 2010 20:02:36 +0200 Subject: [PATCH 064/140] 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 065/140] 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 d5e0643b4552ec2dcd91f07b6cfb1e433cb5fec8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 6 Dec 2010 20:30:04 +0100 Subject: [PATCH 066/140] attempt to clean up bible importers --- .../plugins/bibles/forms/bibleimportform.py | 13 ++++--- openlp/plugins/bibles/lib/csvbible.py | 25 ++++++-------- openlp/plugins/bibles/lib/http.py | 13 ++----- openlp/plugins/bibles/lib/manager.py | 2 +- openlp/plugins/bibles/lib/olp1.py | 27 ++++++++------- openlp/plugins/bibles/lib/opensong.py | 11 ++---- openlp/plugins/bibles/lib/osis.py | 34 ++++++++----------- 7 files changed, 56 insertions(+), 69 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 4a3b8ecde..f4f527e6b 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -405,6 +405,9 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): Receiver.send_message(u'openlp_process_events') def preImport(self): + """ + Prepare the UI for the import. + """ bible_type = self.field(u'source_format').toInt()[0] self.finishButton.setVisible(False) self.ImportProgressBar.setMinimum(0) @@ -420,6 +423,9 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): Receiver.send_message(u'openlp_process_events') def performImport(self): + """ + Perform the actual import. + """ bible_type = self.field(u'source_format').toInt()[0] license_version = unicode(self.field(u'license_version').toString()) license_copyright = unicode(self.field(u'license_copyright').toString()) @@ -469,7 +475,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): elif bible_type == BibleFormat.OLP1: # Import an openlp.org 1.x bible. importer = self.manager.import_bible(BibleFormat.OLP1, - name=license_version, + name=license_version, filename=unicode(self.field(u'OLP1_location').toString()) ) if importer.do_import(): @@ -485,9 +491,8 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): self.ImportProgressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Finished import.')) else: - self.ImportProgressLabel.setText( - translate('BiblesPlugin.ImportWizardForm', - 'Your Bible import failed.')) + self.ImportProgressLabel.setText(translate( + 'BiblesPlugin.ImportWizardForm', 'Your Bible import failed.')) delete_database(self.bibleplugin.settingsSection, importer.file) def postImport(self): diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index cc981059c..2b92891ab 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -30,7 +30,7 @@ import csv from PyQt4 import QtCore -from openlp.core.lib import Receiver +from openlp.core.lib import Receiver, translate from db import BibleDB log = logging.getLogger(__name__) @@ -46,28 +46,25 @@ class CSVBible(BibleDB): This class assumes the files contain all the information and a clean bible is being loaded. """ - BibleDB.__init__(self, parent, **kwargs) log.info(self.__class__.__name__) - if u'booksfile' not in kwargs: - raise KeyError(u'You have to supply a file to import books from.') + BibleDB.__init__(self, parent, **kwargs) self.booksfile = kwargs[u'booksfile'] - if u'versefile' not in kwargs: - raise KeyError(u'You have to supply a file to import verses from.') self.versesfile = kwargs[u'versefile'] QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'bibles_stop_import'), self.stop_import) def do_import(self): - #Populate the Tables success = True books_file = None + book_ptr = None + verse_file = None + # Populate the Tables try: books_file = open(self.booksfile, 'r') dialect = csv.Sniffer().sniff(books_file.read(1024)) books_file.seek(0) books_reader = csv.reader(books_file, dialect) for line in books_reader: - # cancel pressed if self.stop_import_flag: break details = chardet.detect(line[1]) @@ -82,25 +79,24 @@ class CSVBible(BibleDB): books_file.close() if not success: return False - verse_file = None try: - book_ptr = None verse_file = open(self.versesfile, 'r') dialect = csv.Sniffer().sniff(verse_file.read(1024)) verse_file.seek(0) verse_reader = csv.reader(verse_file, dialect) for line in verse_reader: - if self.stop_import_flag: # cancel pressed + if self.stop_import_flag: break details = chardet.detect(line[3]) if book_ptr != line[0]: book = self.get_book(line[0]) book_ptr = book.name - self.wizard.incrementProgressBar( - u'Importing %s %s' % (book.name, line[1])) + self.wizard.incrementProgressBar(u'%s %s %s...' % ( + translate('BiblesPlugin.CSVImport', 'Importing'), + book.name, line[1])) self.session.commit() self.create_verse(book.id, line[1], line[2], - unicode(line[3], details['encoding'])) + unicode(line[3], details['encoding'])) Receiver.send_message(u'openlp_process_events') self.session.commit() except IOError: @@ -110,7 +106,6 @@ class CSVBible(BibleDB): if verse_file: verse_file.close() if self.stop_import_flag: - self.wizard.incrementProgressBar(u'Import canceled!') return False else: return success diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index fa47dd7f5..dade3ad44 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -333,24 +333,17 @@ class HTTPBible(BibleDB): Init confirms the bible exists and stores the database path. """ BibleDB.__init__(self, parent, **kwargs) - if u'download_source' not in kwargs: - raise KeyError(u'Missing keyword argument "download_source"') - if u'download_name' not in kwargs: - raise KeyError(u'Missing keyword argument "download_name"') self.download_source = kwargs[u'download_source'] self.download_name = kwargs[u'download_name'] + self.proxy_server = None + self.proxy_username = None + self.proxy_password = None if u'proxy_server' in kwargs: self.proxy_server = kwargs[u'proxy_server'] - else: - self.proxy_server = None if u'proxy_username' in kwargs: self.proxy_username = kwargs[u'proxy_username'] - else: - self.proxy_username = None if u'proxy_password' in kwargs: self.proxy_password = kwargs[u'proxy_password'] - else: - self.proxy_password = None def do_import(self): """ diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 737822016..d2c281877 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -34,10 +34,10 @@ from openlp.plugins.bibles.lib import parse_reference from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta from csvbible import CSVBible +from http import HTTPBible from olp1 import OpenLP1Bible from opensong import OpenSongBible from osis import OSISBible -from http import HTTPBible log = logging.getLogger(__name__) diff --git a/openlp/plugins/bibles/lib/olp1.py b/openlp/plugins/bibles/lib/olp1.py index 4655289a6..6e453c3b3 100755 --- a/openlp/plugins/bibles/lib/olp1.py +++ b/openlp/plugins/bibles/lib/olp1.py @@ -27,8 +27,9 @@ import logging import sqlite -#from openlp.core.lib import Receiver, translate -from openlp.core.lib import translate +from PyQt4 import QtCore + +from openlp.core.lib import Receiver, translate from db import BibleDB log = logging.getLogger(__name__) @@ -41,22 +42,19 @@ class OpenLP1Bible(BibleDB): """ Constructor. """ - log.debug(__name__) + log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) - if 'filename' not in kwargs: - raise KeyError(u'You have to supply a file name to import from.') - self.filename = kwargs['filename'] -# QtCore.QObject.connect(Receiver.get_receiver(), -# QtCore.SIGNAL(u'bibles_stop_import'), self.stop_import) + self.filename = kwargs[u'filename'] + self.name = kwargs[u'name'] + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'bibles_stop_import'), self.stop_import) def do_import(self): """ Imports an openlp.org v1 bible. """ - # TODO: stop_import_flag connection = None cursor = None - self.wizard.incrementProgressBar(u'Preparing for import...') try: connection = sqlite.connect(self.filename) cursor = connection.cursor() @@ -66,18 +64,23 @@ class OpenLP1Bible(BibleDB): cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') books = cursor.fetchall() for book in books: + if self.stop_import_flag: + return False book_id = int(book[0]) testament_id = int(book[1]) name = unicode(book[2], u'cp1252') abbreviation = unicode(book[3], u'cp1252') - self.wizard.incrementProgressBar(unicode('%s %s' % (translate( - 'BiblesPlugin.olp1', 'Importing'), name))) self.create_book(name, abbreviation, testament_id) + # Update the progess bar. + self.wizard.incrementProgressBar(u'%s %s...' % (translate( + 'BiblesPlugin.OpenLP1Import', 'Importing'), name)) # Import the verses for this book. cursor.execute(u'SELECT chapter, verse, text || \'\' AS text FROM ' 'verse WHERE book_id=%s' % book_id) verses = cursor.fetchall() for verse in verses: + if self.stop_import_flag: + return False chapter = int(verse[0]) verse_number = int(verse[1]) text = unicode(verse[2], u'cp1252') diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 8644a9f47..14454a69f 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -44,10 +44,8 @@ class OpenSongBible(BibleDB): Constructor to create and set up an instance of the OpenSongBible class. This class is used to import Bibles from OpenSong's XML format. """ - log.debug(__name__) + log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) - if 'filename' not in kwargs: - raise KeyError(u'You have to supply a file name to import from.') self.filename = kwargs['filename'] QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'bibles_stop_import'), self.stop_import) @@ -59,7 +57,6 @@ class OpenSongBible(BibleDB): log.debug(u'Starting OpenSong import from "%s"' % self.filename) if not isinstance(self.filename, unicode): self.filename = unicode(self.filename, u'utf8') - self.wizard.incrementProgressBar(u'Preparing for import...') file = None success = True try: @@ -87,10 +84,9 @@ class OpenSongBible(BibleDB): unicode(verse.text) ) Receiver.send_message(u'openlp_process_events') - self.wizard.incrementProgressBar( - QtCore.QString('%s %s %s' % ( + self.wizard.incrementProgressBar(u'%s %s %s...' % ( translate('BiblesPlugin.Opensong', 'Importing'), - db_book.name, chapter.attrib[u'n']))) + db_book.name, chapter.attrib[u'n'])) self.session.commit() except IOError: log.exception(u'Loading bible from OpenSong file failed') @@ -99,7 +95,6 @@ class OpenSongBible(BibleDB): if file: file.close() if self.stop_import_flag: - self.wizard.incrementProgressBar(u'Import canceled!') return False else: return success diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index a0b6a1828..53a6f152c 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -33,7 +33,7 @@ import re from PyQt4 import QtCore -from openlp.core.lib import Receiver +from openlp.core.lib import Receiver, translate from openlp.core.utils import AppLocation from db import BibleDB @@ -50,11 +50,11 @@ class OSISBible(BibleDB): Constructor to create and set up an instance of the OpenSongBible class. This class is used to import Bibles from OpenSong's XML format. """ - log.debug(__name__) + log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) - if u'filename' not in kwargs: - raise KeyError(u'You have to supply a file name to import from.') self.filename = kwargs[u'filename'] + fbibles = None + self.books = {} self.verse_regex = re.compile( r'(.*?)') self.note_regex = re.compile(r'(.*?)') @@ -72,11 +72,9 @@ class OSISBible(BibleDB): self.divineName_regex = re.compile( r'(.*?)') self.spaces_regex = re.compile(r'([ ]{2,})') - self.books = {} filepath = os.path.join( AppLocation.get_directory(AppLocation.PluginsDir), u'bibles', u'resources', u'osisbooks.csv') - fbibles = None try: fbibles = open(filepath, u'r') for line in fbibles: @@ -96,9 +94,15 @@ class OSISBible(BibleDB): Loads a Bible from file. """ log.debug(u'Starting OSIS import from "%s"' % self.filename) - self.wizard.incrementProgressBar( - u'Detecting encoding (this may take a few minutes)...') detect_file = None + db_book = None + osis = None + success = True + last_chapter = 0 + testament = 1 + match_count = 0 + self.wizard.incrementProgressBar(translate('BiblesPlugin.OsisImport', + 'Detecting encoding (this may take a few minutes)...')) try: detect_file = open(self.filename, u'r') details = chardet.detect(detect_file.read(1048576)) @@ -108,14 +112,8 @@ class OSISBible(BibleDB): finally: if detect_file: detect_file.close() - osis = None - success = True try: osis = codecs.open(self.filename, u'r', details['encoding']) - last_chapter = 0 - testament = 1 - match_count = 0 - db_book = None for file_record in osis: if self.stop_import_flag: break @@ -142,9 +140,9 @@ class OSISBible(BibleDB): if last_chapter != chapter: if last_chapter != 0: self.session.commit() - self.wizard.incrementProgressBar( - u'Importing %s %s...' % \ - (self.books[match.group(1)][0], chapter)) + self.wizard.incrementProgressBar(u'%s %s %s...' % ( + translate('BiblesPlugin.OsisImport', 'Importing'), + self.books[match.group(1)][0], chapter)) last_chapter = chapter # All of this rigmarol below is because the mod2osis # tool from the Sword library embeds XML in the OSIS @@ -171,7 +169,6 @@ class OSISBible(BibleDB): self.create_verse(db_book.id, chapter, verse, verse_text) Receiver.send_message(u'openlp_process_events') self.session.commit() - self.wizard.incrementProgressBar(u'Finishing import...') if match_count == 0: success = False except (ValueError, IOError): @@ -181,7 +178,6 @@ class OSISBible(BibleDB): if osis: osis.close() if self.stop_import_flag: - self.wizard.incrementProgressBar(u'Import canceled!') return False else: return success From b01aed6b0d737660235d77e9f0a5d2f3c908215a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 6 Dec 2010 19:36:15 +0000 Subject: [PATCH 067/140] 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 068/140] 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 069/140] 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 070/140] 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__) From 6fd338c492501d5c00d8197c2448e297245fdba2 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 7 Dec 2010 17:34:19 +0100 Subject: [PATCH 071/140] tweaked importer --- openlp/plugins/bibles/lib/olp1.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/olp1.py b/openlp/plugins/bibles/lib/olp1.py index 6e453c3b3..7bd47d99f 100755 --- a/openlp/plugins/bibles/lib/olp1.py +++ b/openlp/plugins/bibles/lib/olp1.py @@ -85,5 +85,6 @@ class OpenLP1Bible(BibleDB): verse_number = int(verse[1]) text = unicode(verse[2], u'cp1252') self.create_verse(book_id, chapter, verse_number, text) - self.session.commit() + Receiver.send_message(u'openlp_process_events') + self.session.commit() return True From a55cdd3a50700fb2e432d692c50d74724a1fbcc1 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 7 Dec 2010 18:55:58 +0000 Subject: [PATCH 072/140] Fix string to int problem --- openlp/core/ui/generaltab.py | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index d8481e801..0801c91c6 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -23,6 +23,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import re from PyQt4 import QtCore, QtGui @@ -465,10 +466,10 @@ class GeneralTab(SettingsTab): # Reset screens after initial definition if self.overrideChanged: self.screens.override[u'size'] = QtCore.QRect( - int(self.customXValueEdit.text()), - int(self.customYValueEdit.text()), - int(self.customWidthValueEdit.text()), - int(self.customHeightValueEdit.text())) + self._toInt(self.customXValueEdit.text()), + self._toInt(self.customYValueEdit.text()), + self._toInt(self.customWidthValueEdit.text()), + self._toInt(self.customHeightValueEdit.text())) if self.overrideCheckBox.isChecked(): self.screens.set_override_display() else: @@ -487,3 +488,12 @@ class GeneralTab(SettingsTab): self.customHeightValueEdit.setEnabled(checked) self.customWidthValueEdit.setEnabled(checked) self.overrideChanged = True + + def _toInt(self, value): + """ + Convert text string to a numeric string + """ + try: + return int(value) + except: + return 0 From a5fc219abb0774bcded14b564d2530af1400a818 Mon Sep 17 00:00:00 2001 From: Derek Scotney Date: Tue, 7 Dec 2010 22:03:20 +0200 Subject: [PATCH 073/140] Updated to handle CCLI verse type 'misc' --- openlp/plugins/songs/lib/cclifileimport.py | 39 ++++++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py index 207756e4b..c22c987f4 100755 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -165,6 +165,7 @@ class CCLIFileImport(SongImport): song_words = line[6:].strip() #Unhandled usr keywords:Type,Version,Admin,Themes,Keys #Process Fields and words sections + check_first_verse_line = False field_list = song_fields.split(u'/t') words_list = song_words.split(u'/t') for counter in range(0, len(field_list)): @@ -176,10 +177,25 @@ class CCLIFileImport(SongImport): verse_type = u'B' else: #Other verse_type = u'O' + check_first_verse_line = True verse_text = unicode(words_list[counter]) verse_text = verse_text.replace("/n", "\n") + verse_lines = verse_text.split(u'\n', 1) + if check_first_verse_line: + if verse_lines[0].startswith(u'(PRE-CHORUS'): + verse_type = u'P' + log.debug(u'USR verse PRE-CHORUS: %s', verse_lines[0] ) + verse_text = verse_lines[1] + elif verse_lines[0].startswith(u'(BRIDGE'): + verse_type = u'B' + log.debug(u'USR verse BRIDGE') + verse_text = verse_lines[1] + elif verse_lines[0].startswith(u'('): + verse_type = u'O' + verse_text = verse_lines[1] if len(verse_text) > 0: self.add_verse(verse_text, verse_type) + check_first_verse_line = False #Handle multiple authors author_list = song_author.split(u'/') if len(author_list) < 2: @@ -228,6 +244,7 @@ class CCLIFileImport(SongImport): log.debug(u'TXT file text: %s', textList) self.set_defaults() line_number = 0 + check_first_verse_line = False verse_text = u'' song_comments = u'' song_copyright = u'' @@ -265,16 +282,32 @@ class CCLIFileImport(SongImport): elif verse_desc_parts[0].startswith(u'Br'): verse_type = u'B' else: + #we need to analyse the next line for + #verse type, so set flag verse_type = u'O' + check_first_verse_line = True verse_number = verse_desc_parts[1] else: verse_type = u'O' verse_number = 1 verse_start = True else: - # We have verse content or the start of the - # last part. Add l so as to keep the CRLF - verse_text = verse_text + line + #check first line for verse type + if check_first_verse_line: + if line.startswith(u'(PRE-CHORUS'): + verse_type = u'P' + elif line.startswith(u'(BRIDGE'): + verse_type = u'B' + # Handle all other misc types + elif line.startswith(u'('): + verse_type = u'O' + else: + verse_text = verse_text + line + check_first_verse_line = False + else: + # We have verse content or the start of the + # last part. Add l so as to keep the CRLF + verse_text = verse_text + line else: #line_number=2, copyright if line_number == 2: From ccc640bb27b5f28aa2b329f856ffcf409794792b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 7 Dec 2010 20:47:09 +0000 Subject: [PATCH 074/140] Stop invalid characters being entered --- openlp/core/ui/generaltab.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 0801c91c6..f932f7ab1 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -243,6 +243,7 @@ class GeneralTab(SettingsTab): self.customXLayout.addWidget(self.customXLabel) self.customXValueEdit = QtGui.QLineEdit(self.displayGroupBox) self.customXValueEdit.setObjectName(u'customXValueEdit') + self.customXValueEdit.setInputMask(u'99999') self.customXLayout.addWidget(self.customXValueEdit) self.customLayout.addLayout(self.customXLayout) self.customYLayout = QtGui.QVBoxLayout() @@ -255,6 +256,7 @@ class GeneralTab(SettingsTab): self.customYLayout.addWidget(self.customYLabel) self.customYValueEdit = QtGui.QLineEdit(self.displayGroupBox) self.customYValueEdit.setObjectName(u'customYValueEdit') + self.customYValueEdit.setInputMask(u'99999') self.customYLayout.addWidget(self.customYValueEdit) self.customLayout.addLayout(self.customYLayout) self.customWidthLayout = QtGui.QVBoxLayout() @@ -268,6 +270,7 @@ class GeneralTab(SettingsTab): self.customWidthLayout.addWidget(self.customWidthLabel) self.customWidthValueEdit = QtGui.QLineEdit(self.displayGroupBox) self.customWidthValueEdit.setObjectName(u'customWidthValueEdit') + self.customWidthValueEdit.setInputMask(u'99999') self.customWidthLayout.addWidget(self.customWidthValueEdit) self.customLayout.addLayout(self.customWidthLayout) self.customHeightLayout = QtGui.QVBoxLayout() @@ -280,6 +283,7 @@ class GeneralTab(SettingsTab): self.customHeightLayout.addWidget(self.customHeightLabel) self.customHeightValueEdit = QtGui.QLineEdit(self.displayGroupBox) self.customHeightValueEdit.setObjectName(u'customHeightValueEdit') + self.customHeightValueEdit.setInputMask(u'99999') self.customHeightLayout.addWidget(self.customHeightValueEdit) self.customLayout.addLayout(self.customHeightLayout) self.displayLayout.addLayout(self.customLayout) @@ -491,7 +495,7 @@ class GeneralTab(SettingsTab): def _toInt(self, value): """ - Convert text string to a numeric string + Make sure a Int returns a value. """ try: return int(value) From 298a159b5ecfd1f6847de875368abf05b99c9a60 Mon Sep 17 00:00:00 2001 From: Derek Scotney Date: Tue, 7 Dec 2010 23:10:57 +0200 Subject: [PATCH 075/140] Update to verse types --- openlp/plugins/songs/lib/cclifileimport.py | 33 +++++++++++----------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py index c22c987f4..adb55ee6d 100755 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -30,6 +30,7 @@ import chardet import codecs from songimport import SongImport +from openlp.plugins.songs.lib import VerseType log = logging.getLogger(__name__) @@ -170,28 +171,26 @@ class CCLIFileImport(SongImport): words_list = song_words.split(u'/t') for counter in range(0, len(field_list)): if field_list[counter].startswith(u'Ver'): - verse_type = u'V' + verse_type = VerseType.to_string(VerseType.Verse) elif field_list[counter].startswith(u'Ch'): - verse_type = u'C' + verse_type = VerseType.to_string(VerseType.Chorus) elif field_list[counter].startswith(u'Br'): - verse_type = u'B' + verse_type = VerseType.to_string(VerseType.Bridge) else: #Other - verse_type = u'O' + verse_type = VerseType.to_string(VerseType.Other) check_first_verse_line = True verse_text = unicode(words_list[counter]) verse_text = verse_text.replace("/n", "\n") verse_lines = verse_text.split(u'\n', 1) if check_first_verse_line: if verse_lines[0].startswith(u'(PRE-CHORUS'): - verse_type = u'P' - log.debug(u'USR verse PRE-CHORUS: %s', verse_lines[0] ) + verse_type = VerseType.to_string(VerseType.PreChorus) verse_text = verse_lines[1] elif verse_lines[0].startswith(u'(BRIDGE'): - verse_type = u'B' - log.debug(u'USR verse BRIDGE') + verse_type = VerseType.to_string(VerseType.Bridge) verse_text = verse_lines[1] elif verse_lines[0].startswith(u'('): - verse_type = u'O' + verse_type = VerseType.to_string(VerseType.Other) verse_text = verse_lines[1] if len(verse_text) > 0: self.add_verse(verse_text, verse_type) @@ -276,31 +275,31 @@ class CCLIFileImport(SongImport): verse_desc_parts = clean_line.split(' ') if len(verse_desc_parts) == 2: if verse_desc_parts[0].startswith(u'Ver'): - verse_type = u'V' + verse_type = VerseType.to_string(VerseType.Verse) elif verse_desc_parts[0].startswith(u'Ch'): - verse_type = u'C' + verse_type = VerseType.to_string(VerseType.Chorus) elif verse_desc_parts[0].startswith(u'Br'): - verse_type = u'B' + verse_type = VerseType.to_string(VerseType.Bridge) else: #we need to analyse the next line for #verse type, so set flag - verse_type = u'O' + verse_type = VerseType.to_string(VerseType.Other) check_first_verse_line = True verse_number = verse_desc_parts[1] else: - verse_type = u'O' + verse_type = VerseType.to_string(VerseType.Other) verse_number = 1 verse_start = True else: #check first line for verse type if check_first_verse_line: if line.startswith(u'(PRE-CHORUS'): - verse_type = u'P' + verse_type = VerseType.to_string(VerseType.PreChorus) elif line.startswith(u'(BRIDGE'): - verse_type = u'B' + verse_type = VerseType.to_string(VerseType.Bridge) # Handle all other misc types elif line.startswith(u'('): - verse_type = u'O' + verse_type = VerseType.to_string(VerseType.Other) else: verse_text = verse_text + line check_first_verse_line = False From 62766269f13a3397da67e289d9f64f132ff828ed Mon Sep 17 00:00:00 2001 From: M2j Date: Wed, 8 Dec 2010 09:21:17 +0100 Subject: [PATCH 076/140] - remove None in .split() method - change translatable codepage selection strings --- openlp/plugins/songs/forms/editsongform.py | 2 +- openlp/plugins/songs/lib/mediaitem.py | 2 +- openlp/plugins/songs/lib/olp1import.py | 52 +++++++++++----------- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 1d7b5f1c2..2846a98df 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -525,7 +525,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): return False if self.song.verse_order: order = [] - order_names = self.song.verse_order.split(None) + order_names = self.song.verse_order.split() for item in order_names: if len(item) == 1: order.append(item.lower() + u'1') diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index cd921b9ef..4ca391f20 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -358,7 +358,7 @@ class SongMediaItem(MediaManagerItem): verse[1][:30], unicode(verse[1]), verseTag) else: #Loop through the verse list and expand the song accordingly. - for order in song.verse_order.upper().split(None): + for order in song.verse_order.upper().split(): if len(order) == 0: break for verse in verseList: diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 6b93195db..7c01a4c19 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -201,34 +201,34 @@ class OpenLP1SongImport(SongImport): guess = u'cp1252' # Show dialog for encoding selection - encodings = [(u'cp874', translate('SongsPlugin.OpenLP1SongImport', - 'CP-874 (Thai)')), - (u'cp932', translate('SongsPlugin.OpenLP1SongImport', - 'CP-932 (Japanese)')), - (u'cp936', translate('SongsPlugin.OpenLP1SongImport', - 'CP-936 (Simplified Chinese)')), - (u'cp949', translate('SongsPlugin.OpenLP1SongImport', - 'CP-949 (Korean)')), - (u'cp950', translate('SongsPlugin.OpenLP1SongImport', - 'CP-950 (Traditional Chinese)')), - (u'cp1250', translate('SongsPlugin.OpenLP1SongImport', - 'CP-1250 (Central European)')), - (u'cp1251', translate('SongsPlugin.OpenLP1SongImport', - 'CP-1251 (Cyrillic)')), - (u'cp1252', translate('SongsPlugin.OpenLP1SongImport', - 'CP-1252 (Western European)')), - (u'cp1253', translate('SongsPlugin.OpenLP1SongImport', - 'CP-1253 (Greek)')), - (u'cp1254', translate('SongsPlugin.OpenLP1SongImport', - 'CP-1254 (Turkish)')), - (u'cp1255', translate('SongsPlugin.OpenLP1SongImport', - 'CP-1255 (Hebrew)')), - (u'cp1256', translate('SongsPlugin.OpenLP1SongImport', - 'CP-1256 (Arabic)')), + encodings = [(u'cp1256', translate('SongsPlugin.OpenLP1SongImport', + 'Arabic (CP-1256)')), (u'cp1257', translate('SongsPlugin.OpenLP1SongImport', - 'CP-1257 (Baltic)')), + 'Baltic (CP-1257)')), + (u'cp1250', translate('SongsPlugin.OpenLP1SongImport', + 'Central European (CP-1250)')), + (u'cp1251', translate('SongsPlugin.OpenLP1SongImport', + 'Cyrillic (CP-1251)')), + (u'cp1253', translate('SongsPlugin.OpenLP1SongImport', + 'Greek (CP-1253)')), + (u'cp1255', translate('SongsPlugin.OpenLP1SongImport', + 'Hebrew (CP-1255)')), + (u'cp932', translate('SongsPlugin.OpenLP1SongImport', + 'Japanese (CP-932)')), + (u'cp949', translate('SongsPlugin.OpenLP1SongImport', + 'Korean (CP-949)')), + (u'cp936', translate('SongsPlugin.OpenLP1SongImport', + 'Simplified Chinese (CP-936)')), + (u'cp874', translate('SongsPlugin.OpenLP1SongImport', + 'Thai (CP-874)')), + (u'cp950', translate('SongsPlugin.OpenLP1SongImport', + 'Traditional Chinese (CP-950)')), + (u'cp1254', translate('SongsPlugin.OpenLP1SongImport', + 'Turkish (CP-1254)')), (u'cp1258', translate('SongsPlugin.OpenLP1SongImport', - 'CP-1258 (Vietnam)'))] + 'Vietnam (CP-1258)')), + (u'cp1252', translate('SongsPlugin.OpenLP1SongImport', + 'Western European (CP-1252)'))] encoding_index = 0 for index in range(len(encodings)): if guess == encodings[index][0]: From 12e7c96463fb5ac0ffaee3083a72cfc9efe5620b Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 8 Dec 2010 18:18:12 +0100 Subject: [PATCH 077/140] camelCase changes --- .../plugins/bibles/forms/bibleimportform.py | 130 ++-- .../plugins/bibles/forms/bibleimportwizard.py | 640 +++++++++--------- 2 files changed, 385 insertions(+), 385 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index f4f527e6b..3255eb7a6 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -31,7 +31,7 @@ import os.path from PyQt4 import QtCore, QtGui -from bibleimportwizard import Ui_BibleImportWizard +from bibleimportwizard import Ui_bibleImportWizard from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.lib.db import delete_database from openlp.core.utils import AppLocation @@ -54,7 +54,7 @@ class WebDownload(object): return cls.Names[name] -class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): +class BibleImportForm(QtGui.QWizard, Ui_bibleImportWizard): """ This is the Bible Import Wizard, which allows easy importing of Bibles into OpenLP from other formats like OSIS, CSV and OpenSong. @@ -84,22 +84,22 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): self.manager.set_process_dialog(self) self.web_bible_list = {} self.loadWebBibles() - QtCore.QObject.connect(self.LocationComboBox, + QtCore.QObject.connect(self.locationComboBox, QtCore.SIGNAL(u'currentIndexChanged(int)'), self.onLocationComboBoxChanged) - QtCore.QObject.connect(self.OsisFileButton, + QtCore.QObject.connect(self.osisFileButton, QtCore.SIGNAL(u'clicked()'), self.onOsisFileButtonClicked) - QtCore.QObject.connect(self.BooksFileButton, + QtCore.QObject.connect(self.booksFileButton, QtCore.SIGNAL(u'clicked()'), self.onBooksFileButtonClicked) - QtCore.QObject.connect(self.CsvVersesFileButton, + QtCore.QObject.connect(self.csvVersesFileButton, QtCore.SIGNAL(u'clicked()'), self.onCsvVersesFileButtonClicked) - QtCore.QObject.connect(self.OpenSongBrowseButton, + QtCore.QObject.connect(self.openSongBrowseButton, QtCore.SIGNAL(u'clicked()'), self.onOpenSongBrowseButtonClicked) - QtCore.QObject.connect(self.OLP1FileButton, + QtCore.QObject.connect(self.openlp1FileButton, QtCore.SIGNAL(u'clicked()'), self.onOLP1FileButtonClicked) QtCore.QObject.connect(self.cancelButton, @@ -143,7 +143,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): translate('BiblesPlugin.ImportWizardForm', 'You need to specify a file with books of ' 'the Bible to use in the import.')) - self.BooksLocationEdit.setFocus() + self.booksLocationEdit.setFocus() return False elif not self.field(u'csv_versefile').toString(): QtGui.QMessageBox.critical(self, @@ -152,7 +152,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): translate('BiblesPlugin.ImportWizardForm', 'You need to specify a file of Bible ' 'verses to import.')) - self.CsvVerseLocationEdit.setFocus() + self.csvVerseLocationEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == \ BibleFormat.OpenSong: @@ -163,7 +163,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): translate('BiblesPlugin.ImportWizardForm', 'You need to specify an OpenSong Bible ' 'file to import.')) - self.OpenSongFileEdit.setFocus() + self.openSongFileEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == BibleFormat.OLP1: if not self.field(u'OLP1_location').toString(): @@ -173,7 +173,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): translate('BiblesPlugin.ImportWizardForm', 'You need to specify a file to import your ' 'Bible from.')) - self.OLP1LocationEdit.setFocus() + self.openlp1LocationEdit.setFocus() return False return True elif self.currentId() == 2: @@ -187,7 +187,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): 'Empty Version Name'), translate('BiblesPlugin.ImportWizardForm', 'You need to specify a version name for your Bible.')) - self.VersionNameEdit.setFocus() + self.versionNameEdit.setFocus() return False elif not license_copyright: QtGui.QMessageBox.critical(self, @@ -196,7 +196,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): translate('BiblesPlugin.ImportWizardForm', 'You need to set a copyright for your Bible. ' 'Bibles in the Public Domain need to be marked as such.')) - self.CopyrightEdit.setFocus() + self.copyrightEdit.setFocus() return False elif self.manager.exists(license_version): QtGui.QMessageBox.critical(self, @@ -204,7 +204,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): translate('BiblesPlugin.ImportWizardForm', 'This Bible already exists. Please import ' 'a different Bible or first delete the existing one.')) - self.VersionNameEdit.setFocus() + self.versionNameEdit.setFocus() return False return True if self.currentId() == 3: @@ -219,12 +219,12 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): ``index`` The index of the combo box. """ - self.BibleComboBox.clear() + self.bibleComboBox.clear() 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) + self.bibleComboBox.addItem(bible) def onOsisFileButtonClicked(self): """ @@ -240,14 +240,14 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): """ self.getFileName( translate('BiblesPlugin.ImportWizardForm', 'Open Books CSV File'), - self.BooksLocationEdit) + self.booksLocationEdit) def onCsvVersesFileButtonClicked(self): """ Show the file open dialog for the verses CSV file. """ self.getFileName(translate('BiblesPlugin.ImportWizardForm', - 'Open Verses CSV File'), self.CsvVerseLocationEdit) + 'Open Verses CSV File'), self.csvVerseLocationEdit) def onOpenSongBrowseButtonClicked(self): """ @@ -255,7 +255,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): """ self.getFileName( translate('BiblesPlugin.ImportWizardForm', 'Open OpenSong Bible'), - self.OpenSongFileEdit) + self.openSongFileEdit) def onOLP1FileButtonClicked(self): """ @@ -263,7 +263,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): """ self.getFileName( translate('BiblesPlugin.ImportWizardForm', - 'Open openlp.org 1.x Bible'), self.OLP1LocationEdit) + 'Open openlp.org 1.x Bible'), self.openlp1LocationEdit) def onCancelButtonClicked(self, checked): """ @@ -280,34 +280,34 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): self.postImport() def registerFields(self): - self.SelectPage.registerField( - u'source_format', self.FormatComboBox) - self.SelectPage.registerField( + self.selectPage.registerField( + u'source_format', self.formatComboBox) + self.selectPage.registerField( u'osis_location', self.OSISLocationEdit) - self.SelectPage.registerField( - u'csv_booksfile', self.BooksLocationEdit) - self.SelectPage.registerField( - u'csv_versefile', self.CsvVerseLocationEdit) - self.SelectPage.registerField( - u'opensong_file', self.OpenSongFileEdit) - self.SelectPage.registerField( - u'web_location', self.LocationComboBox) - self.SelectPage.registerField( - u'web_biblename', self.BibleComboBox) - self.SelectPage.registerField( - u'proxy_server', self.AddressEdit) - self.SelectPage.registerField( - u'proxy_username', self.UsernameEdit) - self.SelectPage.registerField( - u'proxy_password', self.PasswordEdit) - self.SelectPage.registerField( - u'OLP1_location', self.OLP1LocationEdit) - self.LicenseDetailsPage.registerField( - u'license_version', self.VersionNameEdit) - self.LicenseDetailsPage.registerField( - u'license_copyright', self.CopyrightEdit) - self.LicenseDetailsPage.registerField( - u'license_permissions', self.PermissionsEdit) + self.selectPage.registerField( + u'csv_booksfile', self.booksLocationEdit) + self.selectPage.registerField( + u'csv_versefile', self.csvVerseLocationEdit) + self.selectPage.registerField( + u'opensong_file', self.openSongFileEdit) + self.selectPage.registerField( + u'web_location', self.locationComboBox) + self.selectPage.registerField( + u'web_biblename', self.bibleComboBox) + self.selectPage.registerField( + u'proxy_server', self.addressEdit) + self.selectPage.registerField( + u'proxy_username', self.usernameEdit) + self.selectPage.registerField( + u'proxy_password', self.passwordEdit) + self.selectPage.registerField( + u'OLP1_location', self.openlp1LocationEdit) + self.licenseDetailsPage.registerField( + u'license_version', self.versionNameEdit) + self.licenseDetailsPage.registerField( + u'license_copyright', self.copyrightEdit) + self.licenseDetailsPage.registerField( + u'license_permissions', self.permissionsEdit) def setDefaults(self): settings = QtCore.QSettings() @@ -322,7 +322,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): self.setField(u'opensong_file', QtCore.QVariant('')) self.setField(u'web_location', QtCore.QVariant(WebDownload.Crosswalk)) self.setField(u'web_biblename', - QtCore.QVariant(self.BibleComboBox.currentIndex())) + QtCore.QVariant(self.bibleComboBox.currentIndex())) self.setField(u'proxy_server', settings.value(u'proxy address', QtCore.QVariant(u''))) self.setField(u'proxy_username', @@ -331,11 +331,11 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): settings.value(u'proxy password', QtCore.QVariant(u''))) self.setField(u'OLP1_location', QtCore.QVariant('')) self.setField(u'license_version', - QtCore.QVariant(self.VersionNameEdit.text())) + QtCore.QVariant(self.versionNameEdit.text())) self.setField(u'license_copyright', - QtCore.QVariant(self.CopyrightEdit.text())) + QtCore.QVariant(self.copyrightEdit.text())) self.setField(u'license_permissions', - QtCore.QVariant(self.PermissionsEdit.text())) + QtCore.QVariant(self.permissionsEdit.text())) self.onLocationComboBoxChanged(WebDownload.Crosswalk) settings.endGroup() @@ -400,8 +400,8 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): def incrementProgressBar(self, status_text): log.debug(u'IncrementBar %s', status_text) - self.ImportProgressLabel.setText(status_text) - self.ImportProgressBar.setValue(self.ImportProgressBar.value() + 1) + self.importProgressLabel.setText(status_text) + self.importProgressBar.setValue(self.importProgressBar.value() + 1) Receiver.send_message(u'openlp_process_events') def preImport(self): @@ -410,15 +410,15 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): """ 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.importProgressBar.setMinimum(0) + self.importProgressBar.setMaximum(1188) + self.importProgressBar.setValue(0) if bible_type == BibleFormat.WebDownload: - self.ImportProgressLabel.setText(translate( + self.importProgressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Starting Registering bible...')) else: - self.ImportProgressLabel.setText(translate( + self.importProgressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Starting import...')) Receiver.send_message(u'openlp_process_events') @@ -453,9 +453,9 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): ) elif bible_type == BibleFormat.WebDownload: # Import a bible from the web. - self.ImportProgressBar.setMaximum(1) + self.importProgressBar.setMaximum(1) download_location = self.field(u'web_location').toInt()[0] - bible_version = unicode(self.BibleComboBox.currentText()) + bible_version = unicode(self.bibleComboBox.currentText()) if download_location == WebDownload.Crosswalk: bible = \ self.web_bible_list[WebDownload.Crosswalk][bible_version] @@ -483,20 +483,20 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): license_copyright, license_permissions) self.manager.reload_bibles() if bible_type == BibleFormat.WebDownload: - self.ImportProgressLabel.setText( + self.importProgressLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Registered ' 'bible. Please note, that verses will be downloaded on\n' 'demand and thus an internet connection is required.')) else: - self.ImportProgressLabel.setText(translate( + self.importProgressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Finished import.')) else: - self.ImportProgressLabel.setText(translate( + self.importProgressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Your Bible import failed.')) delete_database(self.bibleplugin.settingsSection, importer.file) def postImport(self): - self.ImportProgressBar.setValue(self.ImportProgressBar.maximum()) + self.importProgressBar.setValue(self.importProgressBar.maximum()) self.finishButton.setVisible(True) self.cancelButton.setVisible(False) Receiver.send_message(u'openlp_process_events') diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index bb5049344..d60dfbbea 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -28,392 +28,392 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate -class Ui_BibleImportWizard(object): - def setupUi(self, BibleImportWizard): - BibleImportWizard.setObjectName(u'BibleImportWizard') - BibleImportWizard.resize(550, 386) - BibleImportWizard.setModal(True) - BibleImportWizard.setWizardStyle(QtGui.QWizard.ModernStyle) - BibleImportWizard.setOptions( +class Ui_bibleImportWizard(object): + def setupUi(self, bibleImportWizard): + bibleImportWizard.setObjectName(u'bibleImportWizard') + bibleImportWizard.resize(550, 386) + bibleImportWizard.setModal(True) + bibleImportWizard.setWizardStyle(QtGui.QWizard.ModernStyle) + bibleImportWizard.setOptions( QtGui.QWizard.IndependentPages | QtGui.QWizard.NoBackButtonOnStartPage | QtGui.QWizard.NoBackButtonOnLastPage) # Welcome page - self.WelcomePage = QtGui.QWizardPage() - self.WelcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap, + self.welcomePage = QtGui.QWizardPage() + self.welcomePage.setPixmap(QtGui.QWizard.WatermarkPixmap, QtGui.QPixmap(u':/wizards/wizard_importbible.bmp')) - self.WelcomePage.setObjectName(u'WelcomePage') - self.WelcomeLayout = QtGui.QVBoxLayout(self.WelcomePage) - self.WelcomeLayout.setSpacing(8) - self.WelcomeLayout.setMargin(0) - self.WelcomeLayout.setObjectName(u'WelcomeLayout') - self.TitleLabel = QtGui.QLabel(self.WelcomePage) - self.TitleLabel.setObjectName(u'TitleLabel') - self.WelcomeLayout.addWidget(self.TitleLabel) + self.welcomePage.setObjectName(u'WelcomePage') + self.welcomeLayout = QtGui.QVBoxLayout(self.welcomePage) + self.welcomeLayout.setSpacing(8) + self.welcomeLayout.setMargin(0) + self.welcomeLayout.setObjectName(u'WelcomeLayout') + self.titleLabel = QtGui.QLabel(self.welcomePage) + self.titleLabel.setObjectName(u'TitleLabel') + self.welcomeLayout.addWidget(self.titleLabel) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) - self.WelcomeLayout.addItem(spacerItem) - self.InformationLabel = QtGui.QLabel(self.WelcomePage) - self.InformationLabel.setWordWrap(True) - self.InformationLabel.setMargin(10) - self.InformationLabel.setObjectName(u'InformationLabel') - self.WelcomeLayout.addWidget(self.InformationLabel) + self.welcomeLayout.addItem(spacerItem) + self.informationLabel = QtGui.QLabel(self.welcomePage) + self.informationLabel.setWordWrap(True) + self.informationLabel.setMargin(10) + self.informationLabel.setObjectName(u'InformationLabel') + self.welcomeLayout.addWidget(self.informationLabel) spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.WelcomeLayout.addItem(spacerItem1) - BibleImportWizard.addPage(self.WelcomePage) + self.welcomeLayout.addItem(spacerItem1) + bibleImportWizard.addPage(self.welcomePage) # Select page - self.SelectPage = QtGui.QWizardPage() - self.SelectPage.setObjectName(u'SelectPage') - self.selectPageLayout = QtGui.QVBoxLayout(self.SelectPage) + self.selectPage = QtGui.QWizardPage() + self.selectPage.setObjectName(u'SelectPage') + self.selectPageLayout = QtGui.QVBoxLayout(self.selectPage) self.selectPageLayout.setSpacing(8) self.selectPageLayout.setMargin(20) self.selectPageLayout.setObjectName(u'selectPageLayout') - self.FormatSelectLayout = QtGui.QHBoxLayout() - self.FormatSelectLayout.setSpacing(8) - self.FormatSelectLayout.setObjectName(u'FormatSelectLayout') - self.FormatLabel = QtGui.QLabel(self.SelectPage) - self.FormatLabel.setObjectName(u'FormatLabel') - self.FormatSelectLayout.addWidget(self.FormatLabel) - self.FormatComboBox = QtGui.QComboBox(self.SelectPage) - self.FormatComboBox.setObjectName(u'FormatComboBox') - self.FormatComboBox.addItem(u'') - self.FormatComboBox.addItem(u'') - self.FormatComboBox.addItem(u'') - self.FormatComboBox.addItem(u'') - self.FormatComboBox.addItem(u'') - self.FormatSelectLayout.addWidget(self.FormatComboBox) + self.formatSelectLayout = QtGui.QHBoxLayout() + self.formatSelectLayout.setSpacing(8) + self.formatSelectLayout.setObjectName(u'FormatSelectLayout') + self.formatLabel = QtGui.QLabel(self.selectPage) + self.formatLabel.setObjectName(u'FormatLabel') + self.formatSelectLayout.addWidget(self.formatLabel) + self.formatComboBox = QtGui.QComboBox(self.selectPage) + self.formatComboBox.setObjectName(u'FormatComboBox') + self.formatComboBox.addItem(u'') + self.formatComboBox.addItem(u'') + self.formatComboBox.addItem(u'') + self.formatComboBox.addItem(u'') + self.formatComboBox.addItem(u'') + self.formatSelectLayout.addWidget(self.formatComboBox) spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.FormatSelectLayout.addItem(spacerItem2) - self.selectPageLayout.addLayout(self.FormatSelectLayout) - self.FormatWidget = QtGui.QStackedWidget(self.SelectPage) - self.FormatWidget.setObjectName(u'FormatWidget') + self.formatSelectLayout.addItem(spacerItem2) + self.selectPageLayout.addLayout(self.formatSelectLayout) + self.formatWidget = QtGui.QStackedWidget(self.selectPage) + self.formatWidget.setObjectName(u'FormatWidget') generalIcon = build_icon(u':/general/general_open.png') - self.OsisPage = QtGui.QWidget() - self.OsisPage.setObjectName(u'OsisPage') - self.OsisLayout = QtGui.QFormLayout(self.OsisPage) - self.OsisLayout.setFieldGrowthPolicy( + self.osisPage = QtGui.QWidget() + self.osisPage.setObjectName(u'OsisPage') + self.osisLayout = QtGui.QFormLayout(self.osisPage) + self.osisLayout.setFieldGrowthPolicy( QtGui.QFormLayout.ExpandingFieldsGrow) - self.OsisLayout.setMargin(0) - self.OsisLayout.setSpacing(8) - self.OsisLayout.setObjectName(u'OsisLayout') - self.OsisLocationLabel = QtGui.QLabel(self.OsisPage) - self.OsisLocationLabel.setObjectName(u'OsisLocationLabel') - self.OsisLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.OsisLocationLabel) - self.OsisLocationLayout = QtGui.QHBoxLayout() - self.OsisLocationLayout.setSpacing(8) - self.OsisLocationLayout.setObjectName(u'OsisLocationLayout') - self.OSISLocationEdit = QtGui.QLineEdit(self.OsisPage) + self.osisLayout.setMargin(0) + self.osisLayout.setSpacing(8) + self.osisLayout.setObjectName(u'OsisLayout') + self.osisLocationLabel = QtGui.QLabel(self.osisPage) + self.osisLocationLabel.setObjectName(u'OsisLocationLabel') + self.osisLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.osisLocationLabel) + self.osisLocationLayout = QtGui.QHBoxLayout() + self.osisLocationLayout.setSpacing(8) + self.osisLocationLayout.setObjectName(u'OsisLocationLayout') + self.OSISLocationEdit = QtGui.QLineEdit(self.osisPage) self.OSISLocationEdit.setObjectName(u'OSISLocationEdit') - self.OsisLocationLayout.addWidget(self.OSISLocationEdit) - self.OsisFileButton = QtGui.QToolButton(self.OsisPage) - self.OsisFileButton.setMaximumSize(QtCore.QSize(32, 16777215)) - self.OsisFileButton.setIcon(generalIcon) - self.OsisFileButton.setObjectName(u'OsisFileButton') - self.OsisLocationLayout.addWidget(self.OsisFileButton) - self.OsisLayout.setLayout(1, QtGui.QFormLayout.FieldRole, - self.OsisLocationLayout) - self.FormatWidget.addWidget(self.OsisPage) - self.CsvPage = QtGui.QWidget() - self.CsvPage.setObjectName(u'CsvPage') - self.CsvSourceLayout = QtGui.QFormLayout(self.CsvPage) - self.CsvSourceLayout.setFieldGrowthPolicy( + self.osisLocationLayout.addWidget(self.OSISLocationEdit) + self.osisFileButton = QtGui.QToolButton(self.osisPage) + self.osisFileButton.setMaximumSize(QtCore.QSize(32, 16777215)) + self.osisFileButton.setIcon(generalIcon) + self.osisFileButton.setObjectName(u'OsisFileButton') + self.osisLocationLayout.addWidget(self.osisFileButton) + self.osisLayout.setLayout(1, QtGui.QFormLayout.FieldRole, + self.osisLocationLayout) + self.formatWidget.addWidget(self.osisPage) + self.csvPage = QtGui.QWidget() + self.csvPage.setObjectName(u'CsvPage') + self.csvSourceLayout = QtGui.QFormLayout(self.csvPage) + self.csvSourceLayout.setFieldGrowthPolicy( QtGui.QFormLayout.ExpandingFieldsGrow) - self.CsvSourceLayout.setLabelAlignment(QtCore.Qt.AlignBottom | + self.csvSourceLayout.setLabelAlignment(QtCore.Qt.AlignBottom | QtCore.Qt.AlignRight | QtCore.Qt.AlignTrailing) - self.CsvSourceLayout.setFormAlignment(QtCore.Qt.AlignLeading | + self.csvSourceLayout.setFormAlignment(QtCore.Qt.AlignLeading | QtCore.Qt.AlignLeft | QtCore.Qt.AlignTop) - self.CsvSourceLayout.setMargin(0) - self.CsvSourceLayout.setSpacing(8) - self.CsvSourceLayout.setObjectName(u'CsvSourceLayout') - self.BooksLocationLabel = QtGui.QLabel(self.CsvPage) - self.BooksLocationLabel.setObjectName(u'BooksLocationLabel') - self.CsvSourceLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.BooksLocationLabel) - self.CsvBooksLayout = QtGui.QHBoxLayout() - self.CsvBooksLayout.setSpacing(8) - self.CsvBooksLayout.setObjectName(u'CsvBooksLayout') - self.BooksLocationEdit = QtGui.QLineEdit(self.CsvPage) - self.BooksLocationEdit.setObjectName(u'BooksLocationEdit') - self.CsvBooksLayout.addWidget(self.BooksLocationEdit) - self.BooksFileButton = QtGui.QToolButton(self.CsvPage) - self.BooksFileButton.setMaximumSize(QtCore.QSize(32, 16777215)) - self.BooksFileButton.setIcon(generalIcon) - self.BooksFileButton.setObjectName(u'BooksFileButton') - self.CsvBooksLayout.addWidget(self.BooksFileButton) - self.CsvSourceLayout.setLayout(0, QtGui.QFormLayout.FieldRole, - self.CsvBooksLayout) - self.VerseLocationLabel = QtGui.QLabel(self.CsvPage) - self.VerseLocationLabel.setObjectName(u'VerseLocationLabel') - self.CsvSourceLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.VerseLocationLabel) - self.CsvVerseLayout = QtGui.QHBoxLayout() - self.CsvVerseLayout.setSpacing(8) - self.CsvVerseLayout.setObjectName(u'CsvVerseLayout') - self.CsvVerseLocationEdit = QtGui.QLineEdit(self.CsvPage) - self.CsvVerseLocationEdit.setObjectName(u'CsvVerseLocationEdit') - self.CsvVerseLayout.addWidget(self.CsvVerseLocationEdit) - self.CsvVersesFileButton = QtGui.QToolButton(self.CsvPage) - self.CsvVersesFileButton.setMaximumSize(QtCore.QSize(32, 16777215)) - self.CsvVersesFileButton.setIcon(generalIcon) - self.CsvVersesFileButton.setObjectName(u'CsvVersesFileButton') - self.CsvVerseLayout.addWidget(self.CsvVersesFileButton) - self.CsvSourceLayout.setLayout(1, QtGui.QFormLayout.FieldRole, - self.CsvVerseLayout) - self.FormatWidget.addWidget(self.CsvPage) - self.OpenSongPage = QtGui.QWidget() - self.OpenSongPage.setObjectName(u'OpenSongPage') - self.OpenSongLayout = QtGui.QFormLayout(self.OpenSongPage) - self.OpenSongLayout.setMargin(0) - self.OpenSongLayout.setSpacing(8) - self.OpenSongLayout.setObjectName(u'OpenSongLayout') - self.OpenSongFileLabel = QtGui.QLabel(self.OpenSongPage) - self.OpenSongFileLabel.setObjectName(u'OpenSongFileLabel') - self.OpenSongLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.OpenSongFileLabel) - self.OpenSongFileLayout = QtGui.QHBoxLayout() - self.OpenSongFileLayout.setSpacing(8) - self.OpenSongFileLayout.setObjectName(u'OpenSongFileLayout') - self.OpenSongFileEdit = QtGui.QLineEdit(self.OpenSongPage) - self.OpenSongFileEdit.setObjectName(u'OpenSongFileEdit') - self.OpenSongFileLayout.addWidget(self.OpenSongFileEdit) - self.OpenSongBrowseButton = QtGui.QToolButton(self.OpenSongPage) - self.OpenSongBrowseButton.setIcon(generalIcon) - self.OpenSongBrowseButton.setObjectName(u'OpenSongBrowseButton') - self.OpenSongFileLayout.addWidget(self.OpenSongBrowseButton) - self.OpenSongLayout.setLayout(0, QtGui.QFormLayout.FieldRole, - self.OpenSongFileLayout) - self.FormatWidget.addWidget(self.OpenSongPage) - self.WebDownloadPage = QtGui.QWidget() - self.WebDownloadPage.setObjectName(u'WebDownloadPage') - self.WebDownloadLayout = QtGui.QVBoxLayout(self.WebDownloadPage) - self.WebDownloadLayout.setSpacing(8) - self.WebDownloadLayout.setMargin(0) - self.WebDownloadLayout.setObjectName(u'WebDownloadLayout') - self.WebDownloadTabWidget = QtGui.QTabWidget(self.WebDownloadPage) - self.WebDownloadTabWidget.setObjectName(u'WebDownloadTabWidget') - self.DownloadOptionsTab = QtGui.QWidget() - self.DownloadOptionsTab.setObjectName(u'DownloadOptionsTab') - self.DownloadOptionsLayout = QtGui.QFormLayout(self.DownloadOptionsTab) - self.DownloadOptionsLayout.setMargin(8) - self.DownloadOptionsLayout.setSpacing(8) - self.DownloadOptionsLayout.setObjectName(u'DownloadOptionsLayout') - self.LocationLabel = QtGui.QLabel(self.DownloadOptionsTab) - self.LocationLabel.setObjectName(u'LocationLabel') - self.DownloadOptionsLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.LocationLabel) - self.LocationComboBox = QtGui.QComboBox(self.DownloadOptionsTab) - self.LocationComboBox.setObjectName(u'LocationComboBox') - self.LocationComboBox.addItem(u'') - self.LocationComboBox.addItem(u'') - self.DownloadOptionsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.LocationComboBox) - self.BibleLabel = QtGui.QLabel(self.DownloadOptionsTab) - self.BibleLabel.setObjectName(u'BibleLabel') - self.DownloadOptionsLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.BibleLabel) - self.BibleComboBox = QtGui.QComboBox(self.DownloadOptionsTab) - self.BibleComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) - self.BibleComboBox.setObjectName(u'BibleComboBox') - self.BibleComboBox.addItem(u'') - self.BibleComboBox.addItem(u'') - self.BibleComboBox.addItem(u'') - self.DownloadOptionsLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.BibleComboBox) - self.WebDownloadTabWidget.addTab(self.DownloadOptionsTab, u'') - self.ProxyServerTab = QtGui.QWidget() - self.ProxyServerTab.setObjectName(u'ProxyServerTab') - self.ProxyServerLayout = QtGui.QFormLayout(self.ProxyServerTab) - self.ProxyServerLayout.setObjectName(u'ProxyServerLayout') - self.AddressLabel = QtGui.QLabel(self.ProxyServerTab) - self.AddressLabel.setObjectName(u'AddressLabel') - self.ProxyServerLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.AddressLabel) - self.AddressEdit = QtGui.QLineEdit(self.ProxyServerTab) - self.AddressEdit.setObjectName(u'AddressEdit') - self.ProxyServerLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.AddressEdit) - self.UsernameLabel = QtGui.QLabel(self.ProxyServerTab) - self.UsernameLabel.setObjectName(u'UsernameLabel') - self.ProxyServerLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.UsernameLabel) - self.UsernameEdit = QtGui.QLineEdit(self.ProxyServerTab) - self.UsernameEdit.setObjectName(u'UsernameEdit') - self.ProxyServerLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.UsernameEdit) - self.PasswordLabel = QtGui.QLabel(self.ProxyServerTab) - self.PasswordLabel.setObjectName(u'PasswordLabel') - self.ProxyServerLayout.setWidget(2, QtGui.QFormLayout.LabelRole, - self.PasswordLabel) - self.PasswordEdit = QtGui.QLineEdit(self.ProxyServerTab) - self.PasswordEdit.setObjectName(u'PasswordEdit') - self.ProxyServerLayout.setWidget(2, QtGui.QFormLayout.FieldRole, - self.PasswordEdit) - self.WebDownloadTabWidget.addTab(self.ProxyServerTab, u'') - self.WebDownloadLayout.addWidget(self.WebDownloadTabWidget) - self.FormatWidget.addWidget(self.WebDownloadPage) - self.OLP1Page = QtGui.QWidget() - self.OLP1Page.setObjectName(u'OLP1Page') - self.OLP1Layout = QtGui.QFormLayout(self.OLP1Page) - self.OLP1Layout.setFieldGrowthPolicy( + self.csvSourceLayout.setMargin(0) + self.csvSourceLayout.setSpacing(8) + self.csvSourceLayout.setObjectName(u'CsvSourceLayout') + self.booksLocationLabel = QtGui.QLabel(self.csvPage) + self.booksLocationLabel.setObjectName(u'BooksLocationLabel') + self.csvSourceLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.booksLocationLabel) + self.csvBooksLayout = QtGui.QHBoxLayout() + self.csvBooksLayout.setSpacing(8) + self.csvBooksLayout.setObjectName(u'CsvBooksLayout') + self.booksLocationEdit = QtGui.QLineEdit(self.csvPage) + self.booksLocationEdit.setObjectName(u'BooksLocationEdit') + self.csvBooksLayout.addWidget(self.booksLocationEdit) + self.booksFileButton = QtGui.QToolButton(self.csvPage) + self.booksFileButton.setMaximumSize(QtCore.QSize(32, 16777215)) + self.booksFileButton.setIcon(generalIcon) + self.booksFileButton.setObjectName(u'BooksFileButton') + self.csvBooksLayout.addWidget(self.booksFileButton) + self.csvSourceLayout.setLayout(0, QtGui.QFormLayout.FieldRole, + self.csvBooksLayout) + self.verseLocationLabel = QtGui.QLabel(self.csvPage) + self.verseLocationLabel.setObjectName(u'VerseLocationLabel') + self.csvSourceLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.verseLocationLabel) + self.csvVerseLayout = QtGui.QHBoxLayout() + self.csvVerseLayout.setSpacing(8) + self.csvVerseLayout.setObjectName(u'CsvVerseLayout') + self.csvVerseLocationEdit = QtGui.QLineEdit(self.csvPage) + self.csvVerseLocationEdit.setObjectName(u'CsvVerseLocationEdit') + self.csvVerseLayout.addWidget(self.csvVerseLocationEdit) + self.csvVersesFileButton = QtGui.QToolButton(self.csvPage) + self.csvVersesFileButton.setMaximumSize(QtCore.QSize(32, 16777215)) + self.csvVersesFileButton.setIcon(generalIcon) + self.csvVersesFileButton.setObjectName(u'CsvVersesFileButton') + self.csvVerseLayout.addWidget(self.csvVersesFileButton) + self.csvSourceLayout.setLayout(1, QtGui.QFormLayout.FieldRole, + self.csvVerseLayout) + self.formatWidget.addWidget(self.csvPage) + self.openSongPage = QtGui.QWidget() + self.openSongPage.setObjectName(u'OpenSongPage') + self.openSongLayout = QtGui.QFormLayout(self.openSongPage) + self.openSongLayout.setMargin(0) + self.openSongLayout.setSpacing(8) + self.openSongLayout.setObjectName(u'OpenSongLayout') + self.openSongFileLabel = QtGui.QLabel(self.openSongPage) + self.openSongFileLabel.setObjectName(u'OpenSongFileLabel') + self.openSongLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.openSongFileLabel) + self.openSongFileLayout = QtGui.QHBoxLayout() + self.openSongFileLayout.setSpacing(8) + self.openSongFileLayout.setObjectName(u'OpenSongFileLayout') + self.openSongFileEdit = QtGui.QLineEdit(self.openSongPage) + self.openSongFileEdit.setObjectName(u'OpenSongFileEdit') + self.openSongFileLayout.addWidget(self.openSongFileEdit) + self.openSongBrowseButton = QtGui.QToolButton(self.openSongPage) + self.openSongBrowseButton.setIcon(generalIcon) + self.openSongBrowseButton.setObjectName(u'OpenSongBrowseButton') + self.openSongFileLayout.addWidget(self.openSongBrowseButton) + self.openSongLayout.setLayout(0, QtGui.QFormLayout.FieldRole, + self.openSongFileLayout) + self.formatWidget.addWidget(self.openSongPage) + self.webDownloadPage = QtGui.QWidget() + self.webDownloadPage.setObjectName(u'WebDownloadPage') + self.webDownloadLayout = QtGui.QVBoxLayout(self.webDownloadPage) + self.webDownloadLayout.setSpacing(8) + self.webDownloadLayout.setMargin(0) + self.webDownloadLayout.setObjectName(u'WebDownloadLayout') + self.webDownloadTabWidget = QtGui.QTabWidget(self.webDownloadPage) + self.webDownloadTabWidget.setObjectName(u'WebDownloadTabWidget') + self.downloadOptionsTab = QtGui.QWidget() + self.downloadOptionsTab.setObjectName(u'DownloadOptionsTab') + self.downloadOptionsLayout = QtGui.QFormLayout(self.downloadOptionsTab) + self.downloadOptionsLayout.setMargin(8) + self.downloadOptionsLayout.setSpacing(8) + self.downloadOptionsLayout.setObjectName(u'DownloadOptionsLayout') + self.locationLabel = QtGui.QLabel(self.downloadOptionsTab) + self.locationLabel.setObjectName(u'LocationLabel') + self.downloadOptionsLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.locationLabel) + self.locationComboBox = QtGui.QComboBox(self.downloadOptionsTab) + self.locationComboBox.setObjectName(u'LocationComboBox') + self.locationComboBox.addItem(u'') + self.locationComboBox.addItem(u'') + self.downloadOptionsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.locationComboBox) + self.bibleLabel = QtGui.QLabel(self.downloadOptionsTab) + self.bibleLabel.setObjectName(u'BibleLabel') + self.downloadOptionsLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.bibleLabel) + self.bibleComboBox = QtGui.QComboBox(self.downloadOptionsTab) + self.bibleComboBox.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContents) + self.bibleComboBox.setObjectName(u'BibleComboBox') + self.bibleComboBox.addItem(u'') + self.bibleComboBox.addItem(u'') + self.bibleComboBox.addItem(u'') + self.downloadOptionsLayout.setWidget(1, QtGui.QFormLayout.FieldRole, + self.bibleComboBox) + self.webDownloadTabWidget.addTab(self.downloadOptionsTab, u'') + self.proxyServerTab = QtGui.QWidget() + self.proxyServerTab.setObjectName(u'ProxyServerTab') + self.proxyServerLayout = QtGui.QFormLayout(self.proxyServerTab) + self.proxyServerLayout.setObjectName(u'ProxyServerLayout') + self.addressLabel = QtGui.QLabel(self.proxyServerTab) + self.addressLabel.setObjectName(u'AddressLabel') + self.proxyServerLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.addressLabel) + self.addressEdit = QtGui.QLineEdit(self.proxyServerTab) + self.addressEdit.setObjectName(u'AddressEdit') + self.proxyServerLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.addressEdit) + self.usernameLabel = QtGui.QLabel(self.proxyServerTab) + self.usernameLabel.setObjectName(u'UsernameLabel') + self.proxyServerLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.usernameLabel) + self.usernameEdit = QtGui.QLineEdit(self.proxyServerTab) + self.usernameEdit.setObjectName(u'UsernameEdit') + self.proxyServerLayout.setWidget(1, QtGui.QFormLayout.FieldRole, + self.usernameEdit) + self.passwordLabel = QtGui.QLabel(self.proxyServerTab) + self.passwordLabel.setObjectName(u'PasswordLabel') + self.proxyServerLayout.setWidget(2, QtGui.QFormLayout.LabelRole, + self.passwordLabel) + self.passwordEdit = QtGui.QLineEdit(self.proxyServerTab) + self.passwordEdit.setObjectName(u'PasswordEdit') + self.proxyServerLayout.setWidget(2, QtGui.QFormLayout.FieldRole, + self.passwordEdit) + self.webDownloadTabWidget.addTab(self.proxyServerTab, u'') + self.webDownloadLayout.addWidget(self.webDownloadTabWidget) + self.formatWidget.addWidget(self.webDownloadPage) + self.openlp1Page = QtGui.QWidget() + self.openlp1Page.setObjectName(u'OLP1Page') + self.openlp1Layout = QtGui.QFormLayout(self.openlp1Page) + self.openlp1Layout.setFieldGrowthPolicy( QtGui.QFormLayout.ExpandingFieldsGrow) - self.OLP1Layout.setMargin(0) - self.OLP1Layout.setSpacing(8) - self.OLP1Layout.setObjectName(u'OLP1Layout') - self.OLP1LocationLabel = QtGui.QLabel(self.OLP1Page) - self.OLP1LocationLabel.setObjectName(u'OLP1LocationLabel') - self.OLP1Layout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.OLP1LocationLabel) - self.OLP1LocationLayout = QtGui.QHBoxLayout() - self.OLP1LocationLayout.setSpacing(8) - self.OLP1LocationLayout.setObjectName(u'OLP1LocationLayout') - self.OLP1LocationEdit = QtGui.QLineEdit(self.OLP1Page) - self.OLP1LocationEdit.setObjectName(u'OLP1LocationEdit') - self.OLP1LocationLayout.addWidget(self.OLP1LocationEdit) - self.OLP1FileButton = QtGui.QToolButton(self.OLP1Page) - self.OLP1FileButton.setMaximumSize(QtCore.QSize(32, 16777215)) - self.OLP1FileButton.setIcon(generalIcon) - self.OLP1FileButton.setObjectName(u'OLP1FileButton') - self.OLP1LocationLayout.addWidget(self.OLP1FileButton) - self.OLP1Layout.setLayout(1, QtGui.QFormLayout.FieldRole, - self.OLP1LocationLayout) - self.FormatWidget.addWidget(self.OLP1Page) - self.selectPageLayout.addWidget(self.FormatWidget) - BibleImportWizard.addPage(self.SelectPage) + self.openlp1Layout.setMargin(0) + self.openlp1Layout.setSpacing(8) + self.openlp1Layout.setObjectName(u'OLP1Layout') + self.openlp1LocationLabel = QtGui.QLabel(self.openlp1Page) + self.openlp1LocationLabel.setObjectName(u'OLP1LocationLabel') + self.openlp1Layout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.openlp1LocationLabel) + self.openlp1LocationLayout = QtGui.QHBoxLayout() + self.openlp1LocationLayout.setSpacing(8) + self.openlp1LocationLayout.setObjectName(u'OLP1LocationLayout') + self.openlp1LocationEdit = QtGui.QLineEdit(self.openlp1Page) + self.openlp1LocationEdit.setObjectName(u'OLP1LocationEdit') + self.openlp1LocationLayout.addWidget(self.openlp1LocationEdit) + self.openlp1FileButton = QtGui.QToolButton(self.openlp1Page) + self.openlp1FileButton.setMaximumSize(QtCore.QSize(32, 16777215)) + self.openlp1FileButton.setIcon(generalIcon) + self.openlp1FileButton.setObjectName(u'OLP1FileButton') + self.openlp1LocationLayout.addWidget(self.openlp1FileButton) + self.openlp1Layout.setLayout(1, QtGui.QFormLayout.FieldRole, + self.openlp1LocationLayout) + self.formatWidget.addWidget(self.openlp1Page) + self.selectPageLayout.addWidget(self.formatWidget) + bibleImportWizard.addPage(self.selectPage) # License page - self.LicenseDetailsPage = QtGui.QWizardPage() - self.LicenseDetailsPage.setObjectName(u'LicenseDetailsPage') - self.LicenseDetailsLayout = QtGui.QFormLayout(self.LicenseDetailsPage) - self.LicenseDetailsLayout.setMargin(20) - self.LicenseDetailsLayout.setSpacing(8) - self.LicenseDetailsLayout.setObjectName(u'LicenseDetailsLayout') - self.VersionNameLabel = QtGui.QLabel(self.LicenseDetailsPage) - self.VersionNameLabel.setObjectName(u'VersionNameLabel') - self.LicenseDetailsLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.VersionNameLabel) - self.VersionNameEdit = QtGui.QLineEdit(self.LicenseDetailsPage) - self.VersionNameEdit.setObjectName(u'VersionNameEdit') - self.LicenseDetailsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.VersionNameEdit) - self.CopyrightLabel = QtGui.QLabel(self.LicenseDetailsPage) - self.CopyrightLabel.setObjectName(u'CopyrightLabel') - self.LicenseDetailsLayout.setWidget(1, QtGui.QFormLayout.LabelRole, - self.CopyrightLabel) - self.CopyrightEdit = QtGui.QLineEdit(self.LicenseDetailsPage) - self.CopyrightEdit.setObjectName(u'CopyrightEdit') - self.LicenseDetailsLayout.setWidget(1, QtGui.QFormLayout.FieldRole, - self.CopyrightEdit) - self.PermissionsLabel = QtGui.QLabel(self.LicenseDetailsPage) - self.PermissionsLabel.setObjectName(u'PermissionsLabel') - self.LicenseDetailsLayout.setWidget(2, QtGui.QFormLayout.LabelRole, - self.PermissionsLabel) - self.PermissionsEdit = QtGui.QLineEdit(self.LicenseDetailsPage) - self.PermissionsEdit.setObjectName(u'PermissionsEdit') - self.LicenseDetailsLayout.setWidget(2, QtGui.QFormLayout.FieldRole, - self.PermissionsEdit) - BibleImportWizard.addPage(self.LicenseDetailsPage) + self.licenseDetailsPage = QtGui.QWizardPage() + self.licenseDetailsPage.setObjectName(u'LicenseDetailsPage') + self.licenseDetailsLayout = QtGui.QFormLayout(self.licenseDetailsPage) + self.licenseDetailsLayout.setMargin(20) + self.licenseDetailsLayout.setSpacing(8) + self.licenseDetailsLayout.setObjectName(u'LicenseDetailsLayout') + self.versionNameLabel = QtGui.QLabel(self.licenseDetailsPage) + self.versionNameLabel.setObjectName(u'VersionNameLabel') + self.licenseDetailsLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.versionNameLabel) + self.versionNameEdit = QtGui.QLineEdit(self.licenseDetailsPage) + self.versionNameEdit.setObjectName(u'VersionNameEdit') + self.licenseDetailsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.versionNameEdit) + self.copyrightLabel = QtGui.QLabel(self.licenseDetailsPage) + self.copyrightLabel.setObjectName(u'CopyrightLabel') + self.licenseDetailsLayout.setWidget(1, QtGui.QFormLayout.LabelRole, + self.copyrightLabel) + self.copyrightEdit = QtGui.QLineEdit(self.licenseDetailsPage) + self.copyrightEdit.setObjectName(u'CopyrightEdit') + self.licenseDetailsLayout.setWidget(1, QtGui.QFormLayout.FieldRole, + self.copyrightEdit) + self.permissionsLabel = QtGui.QLabel(self.licenseDetailsPage) + self.permissionsLabel.setObjectName(u'PermissionsLabel') + self.licenseDetailsLayout.setWidget(2, QtGui.QFormLayout.LabelRole, + self.permissionsLabel) + self.permissionsEdit = QtGui.QLineEdit(self.licenseDetailsPage) + self.permissionsEdit.setObjectName(u'PermissionsEdit') + self.licenseDetailsLayout.setWidget(2, QtGui.QFormLayout.FieldRole, + self.permissionsEdit) + bibleImportWizard.addPage(self.licenseDetailsPage) # Progress page - self.ImportPage = QtGui.QWizardPage() - self.ImportPage.setObjectName(u'ImportPage') - self.ImportLayout = QtGui.QVBoxLayout(self.ImportPage) - self.ImportLayout.setSpacing(8) - self.ImportLayout.setMargin(50) - self.ImportLayout.setObjectName(u'ImportLayout') - self.ImportProgressLabel = QtGui.QLabel(self.ImportPage) - self.ImportProgressLabel.setObjectName(u'ImportProgressLabel') - self.ImportLayout.addWidget(self.ImportProgressLabel) - self.ImportProgressBar = QtGui.QProgressBar(self.ImportPage) - self.ImportProgressBar.setValue(0) - self.ImportProgressBar.setObjectName(u'ImportProgressBar') - self.ImportLayout.addWidget(self.ImportProgressBar) - BibleImportWizard.addPage(self.ImportPage) + self.importPage = QtGui.QWizardPage() + self.importPage.setObjectName(u'ImportPage') + self.importLayout = QtGui.QVBoxLayout(self.importPage) + self.importLayout.setSpacing(8) + self.importLayout.setMargin(50) + self.importLayout.setObjectName(u'ImportLayout') + self.importProgressLabel = QtGui.QLabel(self.importPage) + self.importProgressLabel.setObjectName(u'ImportProgressLabel') + self.importLayout.addWidget(self.importProgressLabel) + self.importProgressBar = QtGui.QProgressBar(self.importPage) + self.importProgressBar.setValue(0) + self.importProgressBar.setObjectName(u'ImportProgressBar') + self.importLayout.addWidget(self.importProgressBar) + bibleImportWizard.addPage(self.importPage) - self.retranslateUi(BibleImportWizard) - self.FormatWidget.setCurrentIndex(0) - self.WebDownloadTabWidget.setCurrentIndex(0) - QtCore.QObject.connect(self.FormatComboBox, + self.retranslateUi(bibleImportWizard) + self.formatWidget.setCurrentIndex(0) + self.webDownloadTabWidget.setCurrentIndex(0) + QtCore.QObject.connect(self.formatComboBox, QtCore.SIGNAL(u'currentIndexChanged(int)'), - self.FormatWidget.setCurrentIndex) - QtCore.QMetaObject.connectSlotsByName(BibleImportWizard) + self.formatWidget.setCurrentIndex) + QtCore.QMetaObject.connectSlotsByName(bibleImportWizard) - def retranslateUi(self, BibleImportWizard): - BibleImportWizard.setWindowTitle( + def retranslateUi(self, bibleImportWizard): + bibleImportWizard.setWindowTitle( translate('BiblesPlugin.ImportWizardForm', 'Bible Import Wizard')) - self.TitleLabel.setText( + self.titleLabel.setText( u'%s' % \ translate('BiblesPlugin.ImportWizardForm', 'Welcome to the Bible Import Wizard')) - self.InformationLabel.setText( + self.informationLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'This wizard will help you to import Bibles from a ' 'variety of formats. Click the next button below to start the ' 'process by selecting a format to import from.')) - self.SelectPage.setTitle(translate('BiblesPlugin.ImportWizardForm', + self.selectPage.setTitle(translate('BiblesPlugin.ImportWizardForm', 'Select Import Source')) - self.SelectPage.setSubTitle( + self.selectPage.setSubTitle( translate('BiblesPlugin.ImportWizardForm', 'Select the import format, and where to import from.')) - self.FormatLabel.setText( + self.formatLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Format:')) - self.FormatComboBox.setItemText(0, + self.formatComboBox.setItemText(0, translate('BiblesPlugin.ImportWizardForm', 'OSIS')) - self.FormatComboBox.setItemText(1, + self.formatComboBox.setItemText(1, translate('BiblesPlugin.ImportWizardForm', 'CSV')) - self.FormatComboBox.setItemText(2, + self.formatComboBox.setItemText(2, translate('BiblesPlugin.ImportWizardForm', 'OpenSong')) - self.FormatComboBox.setItemText(3, + self.formatComboBox.setItemText(3, translate('BiblesPlugin.ImportWizardForm', 'Web Download')) - self.FormatComboBox.setItemText(4, + self.formatComboBox.setItemText(4, translate('BiblesPlugin.ImportWizardForm', 'openlp.org 1.x')) - self.OLP1LocationLabel.setText( + self.openlp1LocationLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'File location:')) - self.OsisLocationLabel.setText( + self.osisLocationLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'File location:')) - self.BooksLocationLabel.setText( + self.booksLocationLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Books location:')) - self.VerseLocationLabel.setText( + self.verseLocationLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Verse location:')) - self.OpenSongFileLabel.setText( + self.openSongFileLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Bible filename:')) - self.LocationLabel.setText( + self.locationLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Location:')) - self.LocationComboBox.setItemText(0, + self.locationComboBox.setItemText(0, translate('BiblesPlugin.ImportWizardForm', 'Crosswalk')) - self.LocationComboBox.setItemText(1, + self.locationComboBox.setItemText(1, translate('BiblesPlugin.ImportWizardForm', 'BibleGateway')) - self.BibleLabel.setText( + self.bibleLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Bible:')) - self.WebDownloadTabWidget.setTabText( - self.WebDownloadTabWidget.indexOf(self.DownloadOptionsTab), + self.webDownloadTabWidget.setTabText( + self.webDownloadTabWidget.indexOf(self.downloadOptionsTab), translate('BiblesPlugin.ImportWizardForm', 'Download Options')) - self.AddressLabel.setText( + self.addressLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Server:')) - self.UsernameLabel.setText( + self.usernameLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Username:')) - self.PasswordLabel.setText( + self.passwordLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Password:')) - self.WebDownloadTabWidget.setTabText( - self.WebDownloadTabWidget.indexOf(self.ProxyServerTab), + self.webDownloadTabWidget.setTabText( + self.webDownloadTabWidget.indexOf(self.proxyServerTab), translate('BiblesPlugin.ImportWizardForm', 'Proxy Server (Optional)')) - self.LicenseDetailsPage.setTitle( + self.licenseDetailsPage.setTitle( translate('BiblesPlugin.ImportWizardForm', 'License Details')) - self.LicenseDetailsPage.setSubTitle( + self.licenseDetailsPage.setSubTitle( translate('BiblesPlugin.ImportWizardForm', 'Set up the Bible\'s license details.')) - self.VersionNameLabel.setText( + self.versionNameLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Version name:')) - self.CopyrightLabel.setText( + self.copyrightLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Copyright:')) - self.PermissionsLabel.setText( + self.permissionsLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Permissions:')) - self.ImportPage.setTitle( + self.importPage.setTitle( translate('BiblesPlugin.ImportWizardForm', 'Importing')) - self.ImportPage.setSubTitle( + self.importPage.setSubTitle( translate('BiblesPlugin.ImportWizardForm', 'Please wait while your Bible is imported.')) - self.ImportProgressLabel.setText( + self.importProgressLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Ready.')) - self.ImportProgressBar.setFormat(u'%p%') + self.importProgressBar.setFormat(u'%p%') From b044226332ef9e1ca82cfa5408cb97410ce28e04 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 8 Dec 2010 18:19:51 +0100 Subject: [PATCH 078/140] changed class name --- openlp/plugins/bibles/forms/bibleimportform.py | 4 ++-- openlp/plugins/bibles/forms/bibleimportwizard.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 3255eb7a6..6fcedc28b 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -31,7 +31,7 @@ import os.path from PyQt4 import QtCore, QtGui -from bibleimportwizard import Ui_bibleImportWizard +from bibleimportwizard import uiBibleImportWizard from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.lib.db import delete_database from openlp.core.utils import AppLocation @@ -54,7 +54,7 @@ class WebDownload(object): return cls.Names[name] -class BibleImportForm(QtGui.QWizard, Ui_bibleImportWizard): +class BibleImportForm(QtGui.QWizard, uiBibleImportWizard): """ This is the Bible Import Wizard, which allows easy importing of Bibles into OpenLP from other formats like OSIS, CSV and OpenSong. diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index d60dfbbea..c60490086 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -28,7 +28,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate -class Ui_bibleImportWizard(object): +class uiBibleImportWizard(object): def setupUi(self, bibleImportWizard): bibleImportWizard.setObjectName(u'bibleImportWizard') bibleImportWizard.resize(550, 386) From aca56b78b5165923ba0b21ed3021a5f3669cc812 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 8 Dec 2010 18:46:22 +0100 Subject: [PATCH 079/140] changed olp1 to OpenLP1 --- openlp/plugins/bibles/forms/bibleimportform.py | 6 +++--- openlp/plugins/bibles/lib/manager.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 6fcedc28b..2fd82ed1d 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -165,7 +165,7 @@ class BibleImportForm(QtGui.QWizard, uiBibleImportWizard): 'file to import.')) self.openSongFileEdit.setFocus() return False - elif self.field(u'source_format').toInt()[0] == BibleFormat.OLP1: + elif self.field(u'source_format').toInt()[0] == BibleFormat.OpenLP1: if not self.field(u'OLP1_location').toString(): QtGui.QMessageBox.critical(self, translate('BiblesPlugin.ImportWizardForm', @@ -472,9 +472,9 @@ class BibleImportForm(QtGui.QWizard, uiBibleImportWizard): unicode(self.field(u'proxy_username').toString()), proxy_password=unicode(self.field(u'proxy_password').toString()) ) - elif bible_type == BibleFormat.OLP1: + elif bible_type == BibleFormat.OpenLP1: # Import an openlp.org 1.x bible. - importer = self.manager.import_bible(BibleFormat.OLP1, + importer = self.manager.import_bible(BibleFormat.OpenLP1, name=license_version, filename=unicode(self.field(u'OLP1_location').toString()) ) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index d2c281877..e2639d6ff 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -62,7 +62,7 @@ class BibleFormat(object): CSV = 1 OpenSong = 2 WebDownload = 3 - OLP1 = 4 + OpenLP1 = 4 @staticmethod def get_class(format): @@ -80,7 +80,7 @@ class BibleFormat(object): return OpenSongBible elif format == BibleFormat.WebDownload: return HTTPBible - elif format == BibleFormat.OLP1: + elif format == BibleFormat.OpenLP1: return OpenLP1Bible else: return None @@ -95,7 +95,7 @@ class BibleFormat(object): BibleFormat.CSV, BibleFormat.OpenSong, BibleFormat.WebDownload, - BibleFormat.OLP1 + BibleFormat.OpenLP1 ] From 9f6a0f7c641389034625967b559c8e43e1a0aa7c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 8 Dec 2010 18:56:29 +0100 Subject: [PATCH 080/140] moved file --- openlp/plugins/bibles/lib/manager.py | 2 +- openlp/plugins/bibles/lib/{olp1.py => openlp1.py} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename openlp/plugins/bibles/lib/{olp1.py => openlp1.py} (100%) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index e2639d6ff..794c9c5f7 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -35,7 +35,7 @@ from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta from csvbible import CSVBible from http import HTTPBible -from olp1 import OpenLP1Bible +from openlp1 import OpenLP1Bible from opensong import OpenSongBible from osis import OSISBible diff --git a/openlp/plugins/bibles/lib/olp1.py b/openlp/plugins/bibles/lib/openlp1.py similarity index 100% rename from openlp/plugins/bibles/lib/olp1.py rename to openlp/plugins/bibles/lib/openlp1.py From 2f04bde2aab04197cae2b4e09e2be708d47d7ec2 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 8 Dec 2010 19:00:24 +0000 Subject: [PATCH 081/140] Fix size input validation --- openlp/core/ui/generaltab.py | 53 +++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index f932f7ab1..0ef848410 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -23,12 +23,34 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -import re +import logging from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, Receiver, translate +log = logging.getLogger(__name__) + +class ValidEdit(QtGui.QLineEdit): + """ + Only allow numeric characters to be edited + """ + def __init__(self, parent): + """ + Set up Override and Validator + """ + QtGui.QLineEdit.__init__(self, parent) + self.setValidator(QtGui.QIntValidator(0, 9999, self)) + + def validText(self): + """ + Only return Integers. Space is 0 + """ + if len(self.text()) == 0: + return QtCore.QString(u'0') + else: + return self.text() + class GeneralTab(SettingsTab): """ GeneralTab is the general settings tab in the settings dialog. @@ -241,9 +263,8 @@ class GeneralTab(SettingsTab): self.customXLabel.setAlignment(QtCore.Qt.AlignCenter) self.customXLabel.setObjectName(u'customXLabel') self.customXLayout.addWidget(self.customXLabel) - self.customXValueEdit = QtGui.QLineEdit(self.displayGroupBox) + self.customXValueEdit = ValidEdit(self.displayGroupBox) self.customXValueEdit.setObjectName(u'customXValueEdit') - self.customXValueEdit.setInputMask(u'99999') self.customXLayout.addWidget(self.customXValueEdit) self.customLayout.addLayout(self.customXLayout) self.customYLayout = QtGui.QVBoxLayout() @@ -254,9 +275,8 @@ class GeneralTab(SettingsTab): self.customYLabel.setAlignment(QtCore.Qt.AlignCenter) self.customYLabel.setObjectName(u'customYLabel') self.customYLayout.addWidget(self.customYLabel) - self.customYValueEdit = QtGui.QLineEdit(self.displayGroupBox) + self.customYValueEdit = ValidEdit(self.displayGroupBox) self.customYValueEdit.setObjectName(u'customYValueEdit') - self.customYValueEdit.setInputMask(u'99999') self.customYLayout.addWidget(self.customYValueEdit) self.customLayout.addLayout(self.customYLayout) self.customWidthLayout = QtGui.QVBoxLayout() @@ -268,9 +288,8 @@ class GeneralTab(SettingsTab): self.customWidthLabel.setAlignment(QtCore.Qt.AlignCenter) self.customWidthLabel.setObjectName(u'customWidthLabel') self.customWidthLayout.addWidget(self.customWidthLabel) - self.customWidthValueEdit = QtGui.QLineEdit(self.displayGroupBox) + self.customWidthValueEdit = ValidEdit(self.displayGroupBox) self.customWidthValueEdit.setObjectName(u'customWidthValueEdit') - self.customWidthValueEdit.setInputMask(u'99999') self.customWidthLayout.addWidget(self.customWidthValueEdit) self.customLayout.addLayout(self.customWidthLayout) self.customHeightLayout = QtGui.QVBoxLayout() @@ -281,9 +300,8 @@ class GeneralTab(SettingsTab): self.customHeightLabel.setAlignment(QtCore.Qt.AlignCenter) self.customHeightLabel.setObjectName(u'customHeightLabel') self.customHeightLayout.addWidget(self.customHeightLabel) - self.customHeightValueEdit = QtGui.QLineEdit(self.displayGroupBox) + self.customHeightValueEdit = ValidEdit(self.displayGroupBox) self.customHeightValueEdit.setObjectName(u'customHeightValueEdit') - self.customHeightValueEdit.setInputMask(u'99999') self.customHeightLayout.addWidget(self.customHeightValueEdit) self.customLayout.addLayout(self.customHeightLayout) self.displayLayout.addLayout(self.customLayout) @@ -470,10 +488,10 @@ class GeneralTab(SettingsTab): # Reset screens after initial definition if self.overrideChanged: self.screens.override[u'size'] = QtCore.QRect( - self._toInt(self.customXValueEdit.text()), - self._toInt(self.customYValueEdit.text()), - self._toInt(self.customWidthValueEdit.text()), - self._toInt(self.customHeightValueEdit.text())) + int(self.customXValueEdit.validText()), + int(self.customYValueEdit.validText()), + int(self.customWidthValueEdit.validText()), + int(self.customHeightValueEdit.validText())) if self.overrideCheckBox.isChecked(): self.screens.set_override_display() else: @@ -492,12 +510,3 @@ class GeneralTab(SettingsTab): self.customHeightValueEdit.setEnabled(checked) self.customWidthValueEdit.setEnabled(checked) self.overrideChanged = True - - def _toInt(self, value): - """ - Make sure a Int returns a value. - """ - try: - return int(value) - except: - return 0 From b405195261dea27d8dc6d271c5d4cbf5d6f03920 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Wed, 8 Dec 2010 19:12:38 +0000 Subject: [PATCH 082/140] Fix size input validation again --- openlp/core/ui/generaltab.py | 2 +- openlp/plugins/songs/lib/mediaitem.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 0ef848410..b8894fe9a 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -46,7 +46,7 @@ class ValidEdit(QtGui.QLineEdit): """ Only return Integers. Space is 0 """ - if len(self.text()) == 0: + if self.text().isEmpty(): return QtCore.QString(u'0') else: return self.text() diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 432eee744..1008df020 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -390,7 +390,7 @@ class SongMediaItem(MediaManagerItem): raw_footer.append(author_list) raw_footer.append(song.copyright ) raw_footer.append(unicode( - translate('SongsPlugin.MediaItem', 'CCLI Licence: ') + + translate('SongsPlugin.MediaItem', 'CCLI License: ') + QtCore.QSettings().value(u'general/ccli number', QtCore.QVariant(u'')).toString())) service_item.raw_footer = raw_footer From cc7780574be6119bf7cb73e22dd677a8a58be14e Mon Sep 17 00:00:00 2001 From: Derek Scotney Date: Wed, 8 Dec 2010 21:14:27 +0200 Subject: [PATCH 083/140] reverted back to revision 1134 --- openlp/plugins/songs/lib/cclifileimport.py | 33 +++++++++++----------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py index adb55ee6d..c22c987f4 100755 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -30,7 +30,6 @@ import chardet import codecs from songimport import SongImport -from openlp.plugins.songs.lib import VerseType log = logging.getLogger(__name__) @@ -171,26 +170,28 @@ class CCLIFileImport(SongImport): words_list = song_words.split(u'/t') for counter in range(0, len(field_list)): if field_list[counter].startswith(u'Ver'): - verse_type = VerseType.to_string(VerseType.Verse) + verse_type = u'V' elif field_list[counter].startswith(u'Ch'): - verse_type = VerseType.to_string(VerseType.Chorus) + verse_type = u'C' elif field_list[counter].startswith(u'Br'): - verse_type = VerseType.to_string(VerseType.Bridge) + verse_type = u'B' else: #Other - verse_type = VerseType.to_string(VerseType.Other) + verse_type = u'O' check_first_verse_line = True verse_text = unicode(words_list[counter]) verse_text = verse_text.replace("/n", "\n") verse_lines = verse_text.split(u'\n', 1) if check_first_verse_line: if verse_lines[0].startswith(u'(PRE-CHORUS'): - verse_type = VerseType.to_string(VerseType.PreChorus) + verse_type = u'P' + log.debug(u'USR verse PRE-CHORUS: %s', verse_lines[0] ) verse_text = verse_lines[1] elif verse_lines[0].startswith(u'(BRIDGE'): - verse_type = VerseType.to_string(VerseType.Bridge) + verse_type = u'B' + log.debug(u'USR verse BRIDGE') verse_text = verse_lines[1] elif verse_lines[0].startswith(u'('): - verse_type = VerseType.to_string(VerseType.Other) + verse_type = u'O' verse_text = verse_lines[1] if len(verse_text) > 0: self.add_verse(verse_text, verse_type) @@ -275,31 +276,31 @@ class CCLIFileImport(SongImport): verse_desc_parts = clean_line.split(' ') if len(verse_desc_parts) == 2: if verse_desc_parts[0].startswith(u'Ver'): - verse_type = VerseType.to_string(VerseType.Verse) + verse_type = u'V' elif verse_desc_parts[0].startswith(u'Ch'): - verse_type = VerseType.to_string(VerseType.Chorus) + verse_type = u'C' elif verse_desc_parts[0].startswith(u'Br'): - verse_type = VerseType.to_string(VerseType.Bridge) + verse_type = u'B' else: #we need to analyse the next line for #verse type, so set flag - verse_type = VerseType.to_string(VerseType.Other) + verse_type = u'O' check_first_verse_line = True verse_number = verse_desc_parts[1] else: - verse_type = VerseType.to_string(VerseType.Other) + verse_type = u'O' verse_number = 1 verse_start = True else: #check first line for verse type if check_first_verse_line: if line.startswith(u'(PRE-CHORUS'): - verse_type = VerseType.to_string(VerseType.PreChorus) + verse_type = u'P' elif line.startswith(u'(BRIDGE'): - verse_type = VerseType.to_string(VerseType.Bridge) + verse_type = u'B' # Handle all other misc types elif line.startswith(u'('): - verse_type = VerseType.to_string(VerseType.Other) + verse_type = u'O' else: verse_text = verse_text + line check_first_verse_line = False From c33654c68c169a5e7cf918bd25b1c0932a3ec392 Mon Sep 17 00:00:00 2001 From: M2j Date: Wed, 8 Dec 2010 23:55:28 +0100 Subject: [PATCH 084/140] Bug #659019 --- openlp/plugins/songs/forms/songimportform.py | 22 ++++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 67ef4d8c1..a2a915efd 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -118,9 +118,6 @@ class SongImportForm(QtGui.QWizard, Ui_SongImportWizard): QtCore.QObject.connect(self.songBeamerRemoveButton, QtCore.SIGNAL(u'clicked()'), self.onSongBeamerRemoveButtonClicked) - QtCore.QObject.connect(self.cancelButton, - QtCore.SIGNAL(u'clicked(bool)'), - self.onCancelButtonClicked) QtCore.QObject.connect(self, QtCore.SIGNAL(u'currentIdChanged(int)'), self.onCurrentIdChanged) @@ -132,6 +129,17 @@ class SongImportForm(QtGui.QWizard, Ui_SongImportWizard): self.setDefaults() return QtGui.QWizard.exec_(self) + def reject(self): + """ + Stop the import on pressing the cancel or close button. + """ + log.debug('Import canceled by user.') + if self.currentId() == 2: + Receiver.send_message(u'songs_stop_import') + else: + self.hide() + self.setResult(-1) + def validateCurrentPage(self): """ Validate the current page before moving on to the next page. @@ -394,14 +402,6 @@ class SongImportForm(QtGui.QWizard, Ui_SongImportWizard): def onSongBeamerRemoveButtonClicked(self): self.removeSelectedItems(self.songBeamerFileListWidget) - def onCancelButtonClicked(self, checked): - """ - Stop the import on pressing the cancel button. - """ - log.debug('Cancel button pressed!') - if self.currentId() == 2: - Receiver.send_message(u'songs_stop_import') - def onCurrentIdChanged(self, id): if id == 2: self.preImport() From b465d763cda7efe8e6852bf61dbfdb589ad6dd30 Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 9 Dec 2010 00:33:38 +0100 Subject: [PATCH 085/140] use the same call as in the Qt sources --- openlp/plugins/songs/forms/songimportform.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index a2a915efd..cade0254a 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -131,14 +131,13 @@ class SongImportForm(QtGui.QWizard, Ui_SongImportWizard): def reject(self): """ - Stop the import on pressing the cancel or close button. + Stop the import on cancel button, close button or ESC key. """ log.debug('Import canceled by user.') if self.currentId() == 2: Receiver.send_message(u'songs_stop_import') else: - self.hide() - self.setResult(-1) + self.done(QtGui.QDialog.Rejected) def validateCurrentPage(self): """ From 20b1c33a4b43e1cab5cc9ec046a35e02cd045841 Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 9 Dec 2010 00:40:28 +0100 Subject: [PATCH 086/140] making 'cancel bible import' work --- .../plugins/bibles/forms/bibleimportform.py | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 749f1f938..98fc5dae2 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -99,9 +99,6 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): QtCore.QObject.connect(self.OpenSongBrowseButton, QtCore.SIGNAL(u'clicked()'), self.onOpenSongBrowseButtonClicked) - QtCore.QObject.connect(self.cancelButton, - QtCore.SIGNAL(u'clicked(bool)'), - self.onCancelButtonClicked) QtCore.QObject.connect(self, QtCore.SIGNAL(u'currentIdChanged(int)'), self.onCurrentIdChanged) @@ -113,6 +110,16 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): self.setDefaults() return QtGui.QWizard.exec_(self) + def reject(self): + """ + Stop the import on cancel button, close button or ESC key. + """ + log.debug('Import canceled by user.') + if self.currentId() == 3: + Receiver.send_message(u'bibles_stop_import') + else: + self.done(QtGui.QDialog.Rejected) + def validateCurrentPage(self): """ Validate the current page before moving on to the next page. @@ -244,14 +251,6 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): translate('BiblesPlugin.ImportWizardForm', 'Open OpenSong Bible'), self.OpenSongFileEdit) - def onCancelButtonClicked(self, checked): - """ - Stop the import on pressing the cancel button. - """ - log.debug('Cancel button pressed!') - if self.currentId() == 3: - Receiver.send_message(u'bibles_stop_import') - def onCurrentIdChanged(self, pageId): if pageId == 3: self.preImport() From 01fad9972c40e1d451f27881e5912f8236bbc73c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 9 Dec 2010 13:49:15 +0100 Subject: [PATCH 087/140] added comments back --- openlp/plugins/bibles/lib/csvbible.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 2b92891ab..d02ff2a70 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -65,6 +65,7 @@ class CSVBible(BibleDB): books_file.seek(0) books_reader = csv.reader(books_file, dialect) for line in books_reader: + # cancel pressed if self.stop_import_flag: break details = chardet.detect(line[1]) @@ -85,7 +86,7 @@ class CSVBible(BibleDB): verse_file.seek(0) verse_reader = csv.reader(verse_file, dialect) for line in verse_reader: - if self.stop_import_flag: + if self.stop_import_flag: # cancel pressed break details = chardet.detect(line[3]) if book_ptr != line[0]: From 465515d71edb486e56fd62aaa44027fd9b5bb60b Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 9 Dec 2010 14:30:23 +0100 Subject: [PATCH 088/140] unicode in song title search strings --- openlp/plugins/songs/lib/mediaitem.py | 6 ++++-- openlp/plugins/songs/songsplugin.py | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index a2281128e..d559809ec 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -25,6 +25,7 @@ ############################################################################### import logging +import re from PyQt4 import QtCore, QtGui @@ -61,6 +62,7 @@ class SongMediaItem(MediaManagerItem): # which Song is required. self.remoteSong = -1 self.editItem = None + self.whitespace = re.compile(r'\W+', re.UNICODE) def requiredIcons(self): MediaManagerItem.requiredIcons(self) @@ -173,8 +175,8 @@ class SongMediaItem(MediaManagerItem): if search_type == 0: log.debug(u'Titles Search') search_results = self.parent.manager.get_all_objects(Song, - Song.search_title.like(u'%' + search_keywords.lower() + u'%'), - Song.search_title.asc()) + Song.search_title.like(u'%' + self.whitespace.sub(u' ', + search_keywords.lower()) + u'%'), Song.search_title.asc()) self.displayResultsSong(search_results) elif search_type == 1: log.debug(u'Lyrics Search') diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index b2df06401..32336c507 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -56,7 +56,7 @@ class SongsPlugin(Plugin): self.manager = Manager(u'songs', init_schema) self.icon_path = u':/plugins/plugin_songs.png' self.icon = build_icon(self.icon_path) - self.whitespace = re.compile(r'\W+') + self.whitespace = re.compile(r'\W+', re.UNICODE) def getSettingsTab(self): visible_name = self.getString(StringContent.VisibleName) From 7e86da26f2b8aae3c6302e44147fb024250a883a Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 9 Dec 2010 14:35:17 +0100 Subject: [PATCH 089/140] close connection when finished, removed unused variable --- openlp/plugins/bibles/lib/openlp1.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 7bd47d99f..7f8a8d17e 100755 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -45,7 +45,6 @@ class OpenLP1Bible(BibleDB): log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) self.filename = kwargs[u'filename'] - self.name = kwargs[u'name'] QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'bibles_stop_import'), self.stop_import) @@ -65,6 +64,7 @@ class OpenLP1Bible(BibleDB): books = cursor.fetchall() for book in books: if self.stop_import_flag: + connection.close() return False book_id = int(book[0]) testament_id = int(book[1]) @@ -80,6 +80,7 @@ class OpenLP1Bible(BibleDB): verses = cursor.fetchall() for verse in verses: if self.stop_import_flag: + connection.close() return False chapter = int(verse[0]) verse_number = int(verse[1]) @@ -87,4 +88,5 @@ class OpenLP1Bible(BibleDB): self.create_verse(book_id, chapter, verse_number, text) Receiver.send_message(u'openlp_process_events') self.session.commit() + connection.close() return True From 7e221a6e9809946d79dae755358de0e1e6052ca9 Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 9 Dec 2010 16:08:04 +0100 Subject: [PATCH 090/140] locale aware song sorting --- openlp/plugins/songs/lib/mediaitem.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index d559809ec..dc8310e9d 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -25,6 +25,7 @@ ############################################################################### import logging +import locale import re from PyQt4 import QtCore, QtGui @@ -215,6 +216,7 @@ class SongMediaItem(MediaManagerItem): def displayResultsSong(self, searchresults): log.debug(u'display results Song') self.listView.clear() + searchresults.sort(cmp=self.collateSongTitles) for song in searchresults: author_list = u'' for author in song.authors: @@ -439,3 +441,9 @@ class SongMediaItem(MediaManagerItem): if editId != 0: Receiver.send_message(u'service_item_update', u'%s:%s' %(editId, uuid)) + + def collateSongTitles(self, song_1, song_2): + """ + Locale aware collation of song titles + """ + return locale.strcoll(unicode(song_1.title), unicode(song_2.title)) From a15aebcc32751eb60364dd848aa9dadf3c5bf2ee Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 9 Dec 2010 17:53:48 +0100 Subject: [PATCH 091/140] latest changes for merge --- .../plugins/bibles/forms/bibleimportform.py | 39 +++++++------------ .../plugins/bibles/forms/bibleimportwizard.py | 2 +- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 2fd82ed1d..0c25f51cf 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -31,7 +31,7 @@ import os.path from PyQt4 import QtCore, QtGui -from bibleimportwizard import uiBibleImportWizard +from bibleimportwizard import Ui_BibleImportWizard from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.lib.db import delete_database from openlp.core.utils import AppLocation @@ -54,7 +54,7 @@ class WebDownload(object): return cls.Names[name] -class BibleImportForm(QtGui.QWizard, uiBibleImportWizard): +class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): """ This is the Bible Import Wizard, which allows easy importing of Bibles into OpenLP from other formats like OSIS, CSV and OpenSong. @@ -166,7 +166,7 @@ class BibleImportForm(QtGui.QWizard, uiBibleImportWizard): self.openSongFileEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == BibleFormat.OpenLP1: - if not self.field(u'OLP1_location').toString(): + if not self.field(u'openlp1_location').toString(): QtGui.QMessageBox.critical(self, translate('BiblesPlugin.ImportWizardForm', 'Invalid Bible Location'), @@ -280,28 +280,19 @@ class BibleImportForm(QtGui.QWizard, uiBibleImportWizard): self.postImport() def registerFields(self): - self.selectPage.registerField( - u'source_format', self.formatComboBox) - self.selectPage.registerField( - u'osis_location', self.OSISLocationEdit) - self.selectPage.registerField( - u'csv_booksfile', self.booksLocationEdit) + self.selectPage.registerField(u'source_format', self.formatComboBox) + self.selectPage.registerField(u'osis_location', self.OSISLocationEdit) + self.selectPage.registerField(u'csv_booksfile', self.booksLocationEdit) self.selectPage.registerField( u'csv_versefile', self.csvVerseLocationEdit) + self.selectPage.registerField(u'opensong_file', self.openSongFileEdit) + self.selectPage.registerField(u'web_location', self.locationComboBox) + self.selectPage.registerField(u'web_biblename', self.bibleComboBox) + self.selectPage.registerField(u'proxy_server', self.addressEdit) + self.selectPage.registerField(u'proxy_username', self.usernameEdit) + self.selectPage.registerField(u'proxy_password', self.passwordEdit) self.selectPage.registerField( - u'opensong_file', self.openSongFileEdit) - self.selectPage.registerField( - u'web_location', self.locationComboBox) - self.selectPage.registerField( - u'web_biblename', self.bibleComboBox) - self.selectPage.registerField( - u'proxy_server', self.addressEdit) - self.selectPage.registerField( - u'proxy_username', self.usernameEdit) - self.selectPage.registerField( - u'proxy_password', self.passwordEdit) - self.selectPage.registerField( - u'OLP1_location', self.openlp1LocationEdit) + u'openlp1_location', self.openlp1LocationEdit) self.licenseDetailsPage.registerField( u'license_version', self.versionNameEdit) self.licenseDetailsPage.registerField( @@ -329,7 +320,7 @@ class BibleImportForm(QtGui.QWizard, uiBibleImportWizard): settings.value(u'proxy username', QtCore.QVariant(u''))) self.setField(u'proxy_password', settings.value(u'proxy password', QtCore.QVariant(u''))) - self.setField(u'OLP1_location', QtCore.QVariant('')) + self.setField(u'openlp1_location', QtCore.QVariant('')) self.setField(u'license_version', QtCore.QVariant(self.versionNameEdit.text())) self.setField(u'license_copyright', @@ -476,7 +467,7 @@ class BibleImportForm(QtGui.QWizard, uiBibleImportWizard): # Import an openlp.org 1.x bible. importer = self.manager.import_bible(BibleFormat.OpenLP1, name=license_version, - filename=unicode(self.field(u'OLP1_location').toString()) + filename=unicode(self.field(u'openlp1_location').toString()) ) if importer.do_import(): self.manager.save_meta_data(license_version, license_version, diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index c60490086..4b68c21a8 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -28,7 +28,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon, translate -class uiBibleImportWizard(object): +class Ui_BibleImportWizard(object): def setupUi(self, bibleImportWizard): bibleImportWizard.setObjectName(u'bibleImportWizard') bibleImportWizard.resize(550, 386) From 9515b84c56616d0bd74f6b595770ea386763ae36 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 9 Dec 2010 18:44:18 +0100 Subject: [PATCH 092/140] whitespaces, string change --- openlp/plugins/alerts/forms/alertdialog.py | 2 +- openlp/plugins/songs/lib/songbeamerimport.py | 8 ++++---- resources/forms/alertdialog.ui | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/alerts/forms/alertdialog.py b/openlp/plugins/alerts/forms/alertdialog.py index 5b4c324dc..24cc4317b 100644 --- a/openlp/plugins/alerts/forms/alertdialog.py +++ b/openlp/plugins/alerts/forms/alertdialog.py @@ -128,7 +128,7 @@ class Ui_AlertDialog(object): self.AlertEntryLabel.setText( translate('AlertsPlugin.AlertForm', 'Alert &text:')) self.AlertParameter.setText( - translate('AlertsPlugin.AlertForm', '&Parameter(s):')) + translate('AlertsPlugin.AlertForm', '&Parameter:')) self.NewButton.setText( translate('AlertsPlugin.AlertForm', '&New')) self.SaveButton.setText( diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index 44e8805c9..4980c2cff 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -42,18 +42,18 @@ class SongBeamerTypes(object): u'Chorus': u'C', u'Vers': u'V', u'Verse': u'V', - u'Strophe': u'V', + u'Strophe': u'V', u'Intro': u'I', u'Coda': u'E', u'Ending': u'E', u'Bridge': u'B', - u'Interlude': u'B', + u'Interlude': u'B', u'Zwischenspiel': u'B', u'Pre-Chorus': u'P', - u'Pre-Refrain': u'P', + u'Pre-Refrain': u'P', u'Pre-Bridge': u'O', u'Pre-Coda': u'O', - u'Unbekannt': u'O', + u'Unbekannt': u'O', u'Unknown': u'O' } diff --git a/resources/forms/alertdialog.ui b/resources/forms/alertdialog.ui index 725fb7c4e..3fa9b96a7 100644 --- a/resources/forms/alertdialog.ui +++ b/resources/forms/alertdialog.ui @@ -57,7 +57,7 @@ - &Parameter(s): + &Parameter: ParameterEdit From 5d3337674035e796294171182717aafb1a222519 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 9 Dec 2010 19:01:04 +0100 Subject: [PATCH 093/140] again changed olp to openlp --- openlp/plugins/bibles/forms/bibleimportform.py | 4 ++-- openlp/plugins/bibles/forms/bibleimportwizard.py | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 0c25f51cf..6c9bef1ba 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -101,7 +101,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): self.onOpenSongBrowseButtonClicked) QtCore.QObject.connect(self.openlp1FileButton, QtCore.SIGNAL(u'clicked()'), - self.onOLP1FileButtonClicked) + self.onOpenlp1FileButtonClicked) QtCore.QObject.connect(self.cancelButton, QtCore.SIGNAL(u'clicked(bool)'), self.onCancelButtonClicked) @@ -257,7 +257,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): translate('BiblesPlugin.ImportWizardForm', 'Open OpenSong Bible'), self.openSongFileEdit) - def onOLP1FileButtonClicked(self): + def onOpenlp1FileButtonClicked(self): """ Show the file open dialog for the openlp.org 1.x file. """ diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index 4b68c21a8..4f6e0f624 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -255,27 +255,27 @@ class Ui_BibleImportWizard(object): self.webDownloadLayout.addWidget(self.webDownloadTabWidget) self.formatWidget.addWidget(self.webDownloadPage) self.openlp1Page = QtGui.QWidget() - self.openlp1Page.setObjectName(u'OLP1Page') + self.openlp1Page.setObjectName(u'Openlp1Page') self.openlp1Layout = QtGui.QFormLayout(self.openlp1Page) self.openlp1Layout.setFieldGrowthPolicy( QtGui.QFormLayout.ExpandingFieldsGrow) self.openlp1Layout.setMargin(0) self.openlp1Layout.setSpacing(8) - self.openlp1Layout.setObjectName(u'OLP1Layout') + self.openlp1Layout.setObjectName(u'Openlp1Layout') self.openlp1LocationLabel = QtGui.QLabel(self.openlp1Page) - self.openlp1LocationLabel.setObjectName(u'OLP1LocationLabel') + self.openlp1LocationLabel.setObjectName(u'Openlp1LocationLabel') self.openlp1Layout.setWidget(1, QtGui.QFormLayout.LabelRole, self.openlp1LocationLabel) self.openlp1LocationLayout = QtGui.QHBoxLayout() self.openlp1LocationLayout.setSpacing(8) - self.openlp1LocationLayout.setObjectName(u'OLP1LocationLayout') + self.openlp1LocationLayout.setObjectName(u'Openlp1LocationLayout') self.openlp1LocationEdit = QtGui.QLineEdit(self.openlp1Page) - self.openlp1LocationEdit.setObjectName(u'OLP1LocationEdit') + self.openlp1LocationEdit.setObjectName(u'Openlp1LocationEdit') self.openlp1LocationLayout.addWidget(self.openlp1LocationEdit) self.openlp1FileButton = QtGui.QToolButton(self.openlp1Page) self.openlp1FileButton.setMaximumSize(QtCore.QSize(32, 16777215)) self.openlp1FileButton.setIcon(generalIcon) - self.openlp1FileButton.setObjectName(u'OLP1FileButton') + self.openlp1FileButton.setObjectName(u'Openlp1FileButton') self.openlp1LocationLayout.addWidget(self.openlp1FileButton) self.openlp1Layout.setLayout(1, QtGui.QFormLayout.FieldRole, self.openlp1LocationLayout) From 88ba36c9ddc7ae9202522a4ac9dd815139ca3fd9 Mon Sep 17 00:00:00 2001 From: M2j Date: Fri, 10 Dec 2010 21:42:20 +0100 Subject: [PATCH 094/140] Bug report features for exception dialog --- openlp/core/ui/aboutform.py | 7 +++ openlp/core/ui/exceptionform.py | 86 ++++++++++++++++++++++++++++++++- 2 files changed, 92 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/aboutform.py b/openlp/core/ui/aboutform.py index 3b49ff274..f3b519465 100644 --- a/openlp/core/ui/aboutform.py +++ b/openlp/core/ui/aboutform.py @@ -54,6 +54,13 @@ class AboutForm(QtGui.QDialog, Ui_AboutDialog): QtCore.QObject.connect(self.contributeButton, QtCore.SIGNAL(u'clicked()'), self.onContributeButtonClicked) + def reject(self): + """ + Raise a exception to test the exception handler. + """ + self.done(QtGui.QDialog.Rejected) + str(u'unvern\u00FCnftig') + def onContributeButtonClicked(self): """ Launch a web browser and go to the contribute page on the site. diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index b40c9e063..b116aa6cf 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -24,7 +24,12 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from PyQt4 import QtGui +import os + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import translate, build_icon, SettingsManager +from openlp.core.ui.mailto import mailto from exceptiondialog import Ui_ExceptionDialog @@ -35,3 +40,82 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): def __init__(self, parent): QtGui.QDialog.__init__(self, parent) self.setupUi(self) + self.settingsSection = u'crashreport' + #TODO: Icons + self.saveReportButton = QtGui.QPushButton(self) + self.saveReportButton.setIcon(build_icon(u':/icon/openlp-logo-16x16.png')) + self.saveReportButton.setText(translate('OpenLP.ExceptionForm', 'Save Report to File')) + self.saveReportButton.setObjectName(u'saveReportButton') + self.sendReportButton = QtGui.QPushButton(self) + self.sendReportButton.setIcon(build_icon(u':/icon/openlp-logo-16x16.png')) + self.sendReportButton.setText(translate('OpenLP.ExceptionForm', 'Send Report Mail')) + self.sendReportButton.setObjectName(u'sendReportButton') + self.exceptionButtonBox.addButton(self.saveReportButton, + QtGui.QDialogButtonBox.ActionRole) + self.exceptionButtonBox.addButton(self.sendReportButton, + QtGui.QDialogButtonBox.ActionRole) + QtCore.QObject.connect(self.saveReportButton, + QtCore.SIGNAL(u'pressed()'), self.onSaveReportButtonPressed) + QtCore.QObject.connect(self.sendReportButton, + QtCore.SIGNAL(u'pressed()'), self.onSendReportButtonPressed) + + def _createReport(self): + system = unicode(translate('OpenLP.ExceptionForm', + 'Operating System: %s\n' + 'Desktop Envoirnment: %s')) + libraries = unicode(translate('OpenLP.ExceptionForm', + 'Python: %s\n' + 'PyQt: %s\n' + 'SQLAlchemy: %s\n' + 'lxml: %s\n' + 'BeautifulSoup: %s\n' + 'PyEnchant: %s\n' + 'Chardet: %s\n' + 'pysqlite: %s')) + #TODO: collect the informations + version = self.parent().applicationVersion[u'full'] + return (version, system, libraries) + + def onSaveReportButtonPressed(self): + """ + Saving exception log and system informations to a file. + """ + report = unicode(translate('OpenLP.ExceptionForm', + '*OpenLP Bug Report*\n' + 'Version: %s\n' + '--- System information. ---\n%s\n' + '--- Library Versions ---\n%s\n')) + filename = QtGui.QFileDialog.getSaveFileName(self, + translate('OpenLP.ExceptionForm', 'Save Crash Report'), + SettingsManager.get_last_dir(self.settingsSection), + translate('OpenLP.ExceptionForm', 'Text files (*.log *.text *.txt)')) + if filename: + filename = unicode(QtCore.QDir.toNativeSeparators(filename)) + SettingsManager.set_last_dir(self.settingsSection, os.path.dirname( + filename)) + report = report % self._createReport() + try: + file = open(filename, u'w') + try: + file.write(report) + except UnicodeError: + file.close() + file = open(filename, u'wb') + file.write(report.encode(u'utf-8')) + file.close() + except IOError: + log.exception(u'Failed to write crash report') + + def onSendReportButtonPressed(self): + """ + Opening systems default email client and inserting exception log and + system informations. + """ + email_body = unicode(translate('OpenLP.ExceptionForm', + '*OpenLP Bug Report*\n' + 'Version: %s\n' + '--- Please enter the report below this line. ---\n\n\n' + '--- System information. ---\n%s\n' + '--- Library Versions ---\n%s\n')) + mailto(address=u'bugs@openlp.org', subject=u'OpenLP Bug Report', + body=email_body % self._createReport()) From 5bae9c74e3c91738bca34c3cb170600ccf72bf3c Mon Sep 17 00:00:00 2001 From: M2j Date: Fri, 10 Dec 2010 22:19:46 +0100 Subject: [PATCH 095/140] added mailto code --- openlp/core/ui/exceptionform.py | 2 +- openlp/core/ui/mailto/README | 4 + openlp/core/ui/mailto/__init__.py | 338 ++++++++++++++++++++++++++++++ 3 files changed, 343 insertions(+), 1 deletion(-) create mode 100644 openlp/core/ui/mailto/README create mode 100644 openlp/core/ui/mailto/__init__.py diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index b116aa6cf..2a7b872c9 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -88,7 +88,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): filename = QtGui.QFileDialog.getSaveFileName(self, translate('OpenLP.ExceptionForm', 'Save Crash Report'), SettingsManager.get_last_dir(self.settingsSection), - translate('OpenLP.ExceptionForm', 'Text files (*.log *.text *.txt)')) + translate('OpenLP.ExceptionForm', 'Text files (*.txt *.log *.text)')) if filename: filename = unicode(QtCore.QDir.toNativeSeparators(filename)) SettingsManager.set_last_dir(self.settingsSection, os.path.dirname( diff --git a/openlp/core/ui/mailto/README b/openlp/core/ui/mailto/README new file mode 100644 index 000000000..d1e278147 --- /dev/null +++ b/openlp/core/ui/mailto/README @@ -0,0 +1,4 @@ +Cross-platform startfile and mailto functions +Author: Antonio Valentino +License: PSF license (http://docs.python.org/license.html) +Source: http://code.activestate.com/recipes/511443-cross-platform-startfile-and-mailto-functions/ diff --git a/openlp/core/ui/mailto/__init__.py b/openlp/core/ui/mailto/__init__.py new file mode 100644 index 000000000..1ec8b6b90 --- /dev/null +++ b/openlp/core/ui/mailto/__init__.py @@ -0,0 +1,338 @@ +#!/usr/bin/env python + +'''Utilities for opening files or URLs in the registered default application +and for sending e-mail using the user's preferred composer. + +''' + +__version__ = '1.1' +__all__ = ['open', 'mailto'] + +import os +import sys +import webbrowser +import subprocess + +from email.Utils import encode_rfc2231 + +_controllers = {} +_open = None + + +class BaseController(object): + '''Base class for open program controllers.''' + + def __init__(self, name): + self.name = name + + def open(self, filename): + raise NotImplementedError + + +class Controller(BaseController): + '''Controller for a generic open program.''' + + def __init__(self, *args): + super(Controller, self).__init__(os.path.basename(args[0])) + self.args = list(args) + + def _invoke(self, cmdline): + if sys.platform[:3] == 'win': + closefds = False + startupinfo = subprocess.STARTUPINFO() + startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW + else: + closefds = True + startupinfo = None + + if (os.environ.get('DISPLAY') or sys.platform[:3] == 'win' or + sys.platform == 'darwin'): + inout = file(os.devnull, 'r+') + else: + # for TTY programs, we need stdin/out + inout = None + + # if possible, put the child precess in separate process group, + # so keyboard interrupts don't affect child precess as well as + # Python + setsid = getattr(os, 'setsid', None) + if not setsid: + setsid = getattr(os, 'setpgrp', None) + + pipe = subprocess.Popen(cmdline, stdin=inout, stdout=inout, + stderr=inout, close_fds=closefds, + preexec_fn=setsid, startupinfo=startupinfo) + + # It is assumed that this kind of tools (gnome-open, kfmclient, + # exo-open, xdg-open and open for OSX) immediately exit after lauching + # the specific application + returncode = pipe.wait() + if hasattr(self, 'fixreturncode'): + returncode = self.fixreturncode(returncode) + return not returncode + + def open(self, filename): + if isinstance(filename, basestring): + cmdline = self.args + [filename] + else: + # assume it is a sequence + cmdline = self.args + filename + try: + return self._invoke(cmdline) + except OSError: + return False + + +# Platform support for Windows +if sys.platform[:3] == 'win': + + class Start(BaseController): + '''Controller for the win32 start progam through os.startfile.''' + + def open(self, filename): + try: + os.startfile(filename) + except WindowsError: + # [Error 22] No application is associated with the specified + # file for this operation: '' + return False + else: + return True + + _controllers['windows-default'] = Start('start') + _open = _controllers['windows-default'].open + + +# Platform support for MacOS +elif sys.platform == 'darwin': + _controllers['open']= Controller('open') + _open = _controllers['open'].open + + +# Platform support for Unix +else: + + import commands + + # @WARNING: use the private API of the webbrowser module + from webbrowser import _iscommand + + class KfmClient(Controller): + '''Controller for the KDE kfmclient program.''' + + def __init__(self, kfmclient='kfmclient'): + super(KfmClient, self).__init__(kfmclient, 'exec') + self.kde_version = self.detect_kde_version() + + def detect_kde_version(self): + kde_version = None + try: + info = commands.getoutput('kde-config --version') + + for line in info.splitlines(): + if line.startswith('KDE'): + kde_version = line.split(':')[-1].strip() + break + except (OSError, RuntimeError): + pass + + return kde_version + + def fixreturncode(self, returncode): + if returncode is not None and self.kde_version > '3.5.4': + return returncode + else: + return os.EX_OK + + def detect_desktop_environment(): + '''Checks for known desktop environments + + Return the desktop environments name, lowercase (kde, gnome, xfce) + or "generic" + + ''' + + desktop_environment = 'generic' + + if os.environ.get('KDE_FULL_SESSION') == 'true': + desktop_environment = 'kde' + elif os.environ.get('GNOME_DESKTOP_SESSION_ID'): + desktop_environment = 'gnome' + else: + try: + info = commands.getoutput('xprop -root _DT_SAVE_MODE') + if ' = "xfce4"' in info: + desktop_environment = 'xfce' + except (OSError, RuntimeError): + pass + + return desktop_environment + + + def register_X_controllers(): + if _iscommand('kfmclient'): + _controllers['kde-open'] = KfmClient() + + for command in ('gnome-open', 'exo-open', 'xdg-open'): + if _iscommand(command): + _controllers[command] = Controller(command) + + def get(): + controllers_map = { + 'gnome': 'gnome-open', + 'kde': 'kde-open', + 'xfce': 'exo-open', + } + + desktop_environment = detect_desktop_environment() + + try: + controller_name = controllers_map[desktop_environment] + return _controllers[controller_name].open + + except KeyError: + if _controllers.has_key('xdg-open'): + return _controllers['xdg-open'].open + else: + return webbrowser.open + + + if os.environ.get("DISPLAY"): + register_X_controllers() + _open = get() + + +def open(filename): + '''Open a file or an URL in the registered default application.''' + + return _open(filename) + + +def _fix_addersses(**kwargs): + for headername in ('address', 'to', 'cc', 'bcc'): + try: + headervalue = kwargs[headername] + if not headervalue: + del kwargs[headername] + continue + elif not isinstance(headervalue, basestring): + # assume it is a sequence + headervalue = ','.join(headervalue) + + except KeyError: + pass + except TypeError: + raise TypeError('string or sequence expected for "%s", ' + '%s found' % (headername, + type(headervalue).__name__)) + else: + translation_map = {'%': '%25', '&': '%26', '?': '%3F'} + for char, replacement in translation_map.items(): + headervalue = headervalue.replace(char, replacement) + kwargs[headername] = headervalue + + return kwargs + + +def mailto_format(**kwargs): + # @TODO: implement utf8 option + + kwargs = _fix_addersses(**kwargs) + parts = [] + for headername in ('to', 'cc', 'bcc', 'subject', 'body', 'attach'): + if kwargs.has_key(headername): + headervalue = kwargs[headername] + if not headervalue: + continue + if headername in ('address', 'to', 'cc', 'bcc'): + parts.append('%s=%s' % (headername, headervalue)) + else: + headervalue = encode_rfc2231(headervalue) # @TODO: check + parts.append('%s=%s' % (headername, headervalue)) + + mailto_string = 'mailto:%s' % kwargs.get('address', '') + if parts: + mailto_string = '%s?%s' % (mailto_string, '&'.join(parts)) + + return mailto_string + + +def mailto(address, to=None, cc=None, bcc=None, subject=None, body=None, + attach=None): + '''Send an e-mail using the user's preferred composer. + + Open the user's preferred e-mail composer in order to send a mail to + address(es) that must follow the syntax of RFC822. Multiple addresses + may be provided (for address, cc and bcc parameters) as separate + arguments. + + All parameters provided are used to prefill corresponding fields in + the user's e-mail composer. The user will have the opportunity to + change any of this information before actually sending the e-mail. + + address - specify the destination recipient + cc - specify a recipient to be copied on the e-mail + bcc - specify a recipient to be blindly copied on the e-mail + subject - specify a subject for the e-mail + body - specify a body for the e-mail. Since the user will be able + to make changes before actually sending the e-mail, this + can be used to provide the user with a template for the + e-mail text may contain linebreaks + attach - specify an attachment for the e-mail. file must point to + an existing file + + ''' + + mailto_string = mailto_format(**locals()) + return open(mailto_string) + + +if __name__ == '__main__': + from optparse import OptionParser + + version = '%%prog %s' % __version__ + usage = ( + '\n\n%prog FILENAME [FILENAME(s)] -- for opening files' + '\n\n%prog -m [OPTIONS] ADDRESS [ADDRESS(es)] -- for sending e-mails' + ) + + parser = OptionParser(usage=usage, version=version, description=__doc__) + parser.add_option('-m', '--mailto', dest='mailto_mode', default=False, + action='store_true', help='set mailto mode. ' + 'If not set any other option is ignored') + parser.add_option('--cc', dest='cc', help='specify a recipient to be ' + 'copied on the e-mail') + parser.add_option('--bcc', dest='bcc', help='specify a recipient to be ' + 'blindly copied on the e-mail') + parser.add_option('--subject', dest='subject', + help='specify a subject for the e-mail') + parser.add_option('--body', dest='body', help='specify a body for the ' + 'e-mail. Since the user will be able to make changes ' + 'before actually sending the e-mail, this can be used ' + 'to provide the user with a template for the e-mail ' + 'text may contain linebreaks') + parser.add_option('--attach', dest='attach', help='specify an attachment ' + 'for the e-mail. file must point to an existing file') + + (options, args) = parser.parse_args() + + if not args: + parser.print_usage() + parser.exit(1) + + if options.mailto_mode: + if not mailto(args, None, options.cc, options.bcc, options.subject, + options.body, options.attach): + sys.exit('Unable to open the e-mail client') + else: + for name in ('cc', 'bcc', 'subject', 'body', 'attach'): + if getattr(options, name): + parser.error('The "cc", "bcc", "subject", "body" and "attach" ' + 'options are only accepten in mailto mode') + success = False + for arg in args: + if not open(arg): + print 'Unable to open "%s"' % arg + else: + success = True + sys.exit(success) From 8ad603b2513684b41e66cf33cc12a6105065e50a Mon Sep 17 00:00:00 2001 From: M2j Date: Sat, 11 Dec 2010 01:26:41 +0100 Subject: [PATCH 096/140] completed exception report dialog --- openlp/core/{ui => lib}/mailto/__init__.py | 0 .../mailto/README => lib/mailto/mailto.INFO} | 0 openlp/core/ui/exceptiondialog.py | 22 +++++- openlp/core/ui/exceptionform.py | 64 +++++++++--------- resources/images/general_email.png | Bin 0 -> 755 bytes resources/images/openlp-2.qrc | 1 + 6 files changed, 53 insertions(+), 34 deletions(-) rename openlp/core/{ui => lib}/mailto/__init__.py (100%) rename openlp/core/{ui/mailto/README => lib/mailto/mailto.INFO} (100%) create mode 100644 resources/images/general_email.png diff --git a/openlp/core/ui/mailto/__init__.py b/openlp/core/lib/mailto/__init__.py similarity index 100% rename from openlp/core/ui/mailto/__init__.py rename to openlp/core/lib/mailto/__init__.py diff --git a/openlp/core/ui/mailto/README b/openlp/core/lib/mailto/mailto.INFO similarity index 100% rename from openlp/core/ui/mailto/README rename to openlp/core/lib/mailto/mailto.INFO diff --git a/openlp/core/ui/exceptiondialog.py b/openlp/core/ui/exceptiondialog.py index 49e2c8151..6fb7c7985 100644 --- a/openlp/core/ui/exceptiondialog.py +++ b/openlp/core/ui/exceptiondialog.py @@ -26,7 +26,7 @@ from PyQt4 import QtCore, QtGui -from openlp.core.lib import translate +from openlp.core.lib import translate, build_icon class Ui_ExceptionDialog(object): def setupUi(self, exceptionDialog): @@ -63,12 +63,26 @@ class Ui_ExceptionDialog(object): self.exceptionButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) self.exceptionButtonBox.setObjectName(u'exceptionButtonBox') self.exceptionLayout.addWidget(self.exceptionButtonBox) - + self.saveReportButton = QtGui.QPushButton(exceptionDialog) + self.saveReportButton.setIcon(build_icon(u':/general/general_save.png')) + self.saveReportButton.setObjectName(u'saveReportButton') + self.exceptionButtonBox.addButton(self.saveReportButton, + QtGui.QDialogButtonBox.ActionRole) + self.sendReportButton = QtGui.QPushButton(exceptionDialog) + self.sendReportButton.setIcon(build_icon( + u':/general/general_email.png')) + self.sendReportButton.setObjectName(u'sendReportButton') + self.exceptionButtonBox.addButton(self.sendReportButton, + QtGui.QDialogButtonBox.ActionRole) self.retranslateUi(exceptionDialog) QtCore.QObject.connect(self.exceptionButtonBox, QtCore.SIGNAL(u'accepted()'), exceptionDialog.accept) QtCore.QObject.connect(self.exceptionButtonBox, QtCore.SIGNAL(u'rejected()'), exceptionDialog.reject) + QtCore.QObject.connect(self.saveReportButton, + QtCore.SIGNAL(u'pressed()'), self.onSaveReportButtonPressed) + QtCore.QObject.connect(self.sendReportButton, + QtCore.SIGNAL(u'pressed()'), self.onSendReportButtonPressed) QtCore.QMetaObject.connectSlotsByName(exceptionDialog) def retranslateUi(self, exceptionDialog): @@ -80,3 +94,7 @@ class Ui_ExceptionDialog(object): 'developers, so please e-mail it to bugs@openlp.org, along with a ' 'detailed description of what you were doing when the problem ' 'occurred.')) + self.saveReportButton.setText(translate('OpenLP.ExceptionDialog', + 'Save Report to File')) + self.sendReportButton.setText(translate('OpenLP.ExceptionDialog', + 'Send Report Mail')) diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index 2a7b872c9..09cdc1414 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -25,11 +25,22 @@ ############################################################################### import os +import platform -from PyQt4 import QtCore, QtGui +import sqlalchemy +import BeautifulSoup +import enchant +import chardet +try: + import sqlite + sqlite_version = sqlite.version +except ImportError: + sqlite_version = u'-' -from openlp.core.lib import translate, build_icon, SettingsManager -from openlp.core.ui.mailto import mailto +from lxml import etree +from PyQt4 import Qt, QtCore, QtGui + +from openlp.core.lib import translate, SettingsManager, mailto from exceptiondialog import Ui_ExceptionDialog @@ -42,48 +53,36 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): self.setupUi(self) self.settingsSection = u'crashreport' #TODO: Icons - self.saveReportButton = QtGui.QPushButton(self) - self.saveReportButton.setIcon(build_icon(u':/icon/openlp-logo-16x16.png')) - self.saveReportButton.setText(translate('OpenLP.ExceptionForm', 'Save Report to File')) - self.saveReportButton.setObjectName(u'saveReportButton') - self.sendReportButton = QtGui.QPushButton(self) - self.sendReportButton.setIcon(build_icon(u':/icon/openlp-logo-16x16.png')) - self.sendReportButton.setText(translate('OpenLP.ExceptionForm', 'Send Report Mail')) - self.sendReportButton.setObjectName(u'sendReportButton') - self.exceptionButtonBox.addButton(self.saveReportButton, - QtGui.QDialogButtonBox.ActionRole) - self.exceptionButtonBox.addButton(self.sendReportButton, - QtGui.QDialogButtonBox.ActionRole) - QtCore.QObject.connect(self.saveReportButton, - QtCore.SIGNAL(u'pressed()'), self.onSaveReportButtonPressed) - QtCore.QObject.connect(self.sendReportButton, - QtCore.SIGNAL(u'pressed()'), self.onSendReportButtonPressed) def _createReport(self): + openlp_version = self.parent().applicationVersion[u'full'] + traceback = unicode(self.exceptionTextEdit.toPlainText()) system = unicode(translate('OpenLP.ExceptionForm', - 'Operating System: %s\n' - 'Desktop Envoirnment: %s')) + 'Platform: %s\n')) % (platform.platform()) libraries = unicode(translate('OpenLP.ExceptionForm', 'Python: %s\n' - 'PyQt: %s\n' + 'PyQt4: %s\n' + 'Qt4: %s\n' 'SQLAlchemy: %s\n' 'lxml: %s\n' 'BeautifulSoup: %s\n' 'PyEnchant: %s\n' 'Chardet: %s\n' - 'pysqlite: %s')) - #TODO: collect the informations - version = self.parent().applicationVersion[u'full'] - return (version, system, libraries) + 'PySQLite: %s\n')) % (platform.python_version(), + Qt.PYQT_VERSION_STR, Qt.qVersion(), sqlalchemy.__version__, + etree.__version__, BeautifulSoup.__version__ , enchant.__version__, + chardet.__version__, sqlite_version) + return (openlp_version, traceback, system, libraries) def onSaveReportButtonPressed(self): """ Saving exception log and system informations to a file. """ report = unicode(translate('OpenLP.ExceptionForm', - '*OpenLP Bug Report*\n' - 'Version: %s\n' - '--- System information. ---\n%s\n' + '**OpenLP Bug Report**\n' + 'Version: %s\n\n' + '--- Exception Traceback ---\n%s\n' + '--- System information ---\n%s\n' '--- Library Versions ---\n%s\n')) filename = QtGui.QFileDialog.getSaveFileName(self, translate('OpenLP.ExceptionForm', 'Save Crash Report'), @@ -113,9 +112,10 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): """ email_body = unicode(translate('OpenLP.ExceptionForm', '*OpenLP Bug Report*\n' - 'Version: %s\n' + 'Version: %s\n\n' '--- Please enter the report below this line. ---\n\n\n' - '--- System information. ---\n%s\n' + '--- Exception Traceback ---\n%s\n' + '--- System information ---\n%s\n' '--- Library Versions ---\n%s\n')) - mailto(address=u'bugs@openlp.org', subject=u'OpenLP Bug Report', + mailto.mailto(address=u'bugs@openlp.org', subject=u'OpenLP Bug Report', body=email_body % self._createReport()) diff --git a/resources/images/general_email.png b/resources/images/general_email.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e9f2b647a6315fbbc0b1c30f87bdcb14e2c5a2 GIT binary patch literal 755 zcmV$)Z`J$S2g%9JmbD3M4! zu{h^&92b_wQFA{5fWR1V_gV*t2*d>flL>Ry1##!fag$$Fw5KU?vj4`-mn*DmD0T$F z&QrROfV3<`n(B;+0EkFC3OgmtzRyAtN6-h{npp$$N*Nx;_vDM)F*F8hAOwdcgqgsY z32g;*mkcwboe1;IG-sMxDa;jqWwYQ6dPK(<%H-jc6<8jv*(chIt&gDn$b1JSgBM{)rOK&F=4NbdZGm$ROV%Q%JNg5MFmQQje@{Autbx*AD?_c3k*N=u9qU0` ztRLNxAjtDj`ScO!j>B;kmN&L>x}{F*3gYt;3SH+hI=up0wMKZG*i0=>_9CRWJNarI zdr;LyetZl7Gb2BqPnzfTNq`=X<7mi-g?ks!Lg@__4u^ZA(WniLs&5VQVkQqwhvy#p lBINeJ^wrhX)c^mDe*n71HFqDb<*xt$002ovPDHLkV1k15PuKte literal 0 HcmV?d00001 diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index 2a3282461..e9ec5c0a3 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -39,6 +39,7 @@ general_new.png general_open.png general_save.png + general_email.png slide_close.png From 1cb9594e5881c1090876a92b073f8b93158d952b Mon Sep 17 00:00:00 2001 From: M2j Date: Sat, 11 Dec 2010 01:29:57 +0100 Subject: [PATCH 097/140] test exception removed --- openlp/core/ui/aboutform.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/openlp/core/ui/aboutform.py b/openlp/core/ui/aboutform.py index f3b519465..3b49ff274 100644 --- a/openlp/core/ui/aboutform.py +++ b/openlp/core/ui/aboutform.py @@ -54,13 +54,6 @@ class AboutForm(QtGui.QDialog, Ui_AboutDialog): QtCore.QObject.connect(self.contributeButton, QtCore.SIGNAL(u'clicked()'), self.onContributeButtonClicked) - def reject(self): - """ - Raise a exception to test the exception handler. - """ - self.done(QtGui.QDialog.Rejected) - str(u'unvern\u00FCnftig') - def onContributeButtonClicked(self): """ Launch a web browser and go to the contribute page on the site. From 62643d7d5e3d94660fe5085b7d5b5c70194f85a9 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 11 Dec 2010 10:40:52 +0100 Subject: [PATCH 098/140] string change, close file, MarkType --- openlp/plugins/songs/lib/songbeamerimport.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index 4980c2cff..30d29c1be 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -32,6 +32,7 @@ import os import chardet import codecs +from openlp.core.lib import translate from openlp.plugins.songs.lib.songimport import SongImport log = logging.getLogger(__name__) @@ -54,7 +55,8 @@ class SongBeamerTypes(object): u'Pre-Bridge': u'O', u'Pre-Coda': u'O', u'Unbekannt': u'O', - u'Unknown': u'O' + u'Unknown': u'O', + u'Unbenannt': u'O' } @@ -100,6 +102,7 @@ class SongBeamerImport(SongImport): detect_file.close() infile = codecs.open(file, u'r', details['encoding']) self.songData = infile.readlines() + infile.close() else: return False for line in self.songData: @@ -127,8 +130,9 @@ class SongBeamerImport(SongImport): 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)) + self.import_wizard.incrementProgressBar(u'%s %s...' % + (translate('SongsPlugin.SongBeamerImport', 'Importing'), + self.file_name)) return True def replace_html_tags(self): @@ -263,6 +267,9 @@ class SongBeamerImport(SongImport): pass elif tag_val[0] == u'#Version': pass + elif tag_val[0] == u'#VerseOrder': + # TODO: add the verse order. + pass def check_verse_marks(self, line): """ From ce0abd19bd1439bbb912e7b34a00e5298fdbfc2e Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 11 Dec 2010 10:53:30 +0100 Subject: [PATCH 099/140] string change, close file, MarkType --- openlp/plugins/bibles/lib/manager.py | 20 +++++++++++++++++++- openlp/plugins/bibles/lib/openlp1.py | 2 +- openlp/plugins/songs/lib/importer.py | 2 +- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 794c9c5f7..8d554b16b 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -35,9 +35,14 @@ from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta from csvbible import CSVBible from http import HTTPBible -from openlp1 import OpenLP1Bible from opensong import OpenSongBible from osis import OSISBible +# Imports that might fail. +try: + from openlp1 import OpenLP1Bible + has_openlp1 = True +except ImportError: + has_openlp1 = False log = logging.getLogger(__name__) @@ -57,6 +62,7 @@ class BibleFormat(object): plus a few helper functions to facilitate generic handling of Bible types for importing. """ + _format_availability = {} Unknown = -1 OSIS = 0 CSV = 1 @@ -98,6 +104,18 @@ class BibleFormat(object): BibleFormat.OpenLP1 ] + @staticmethod + def set_availability(format, available): + BibleFormat._format_availability[format] = available + + @staticmethod + def get_availability(format): + return BibleFormat._format_availability.get(format, True) + +BibleFormat.set_availability(BibleFormat.OpenLP1, has_openlp1) + +__all__ = [u'BibleFormat'] + class BibleManager(object): """ diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 7f8a8d17e..4b12ba52d 100755 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -25,7 +25,7 @@ ############################################################################### import logging -import sqlite +import sqlitse from PyQt4 import QtCore diff --git a/openlp/plugins/songs/lib/importer.py b/openlp/plugins/songs/lib/importer.py index 63d19b95c..2d249b4de 100644 --- a/openlp/plugins/songs/lib/importer.py +++ b/openlp/plugins/songs/lib/importer.py @@ -53,7 +53,7 @@ class SongFormat(object): plus a few helper functions to facilitate generic handling of song types for importing. """ - _format_availability = {} + format_availability = {} Unknown = -1 OpenLP2 = 0 OpenLP1 = 1 From 9d67aea4f762e691fdfcd0bc806e2671d63d1bc6 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 11 Dec 2010 09:59:23 +0000 Subject: [PATCH 100/140] Fix missing authors on song import --- openlp/plugins/songs/lib/xml.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 655ea1e3c..5a5340cb9 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -346,8 +346,11 @@ class OpenLyricsParser(object): song.comments = u'' song.song_number = u'' # Process Authors - for author in properties.authors.author: - self._process_author(author.text, song) + try: + for author in properties.authors.author: + self._process_author(author.text, song) + except: + self._process_author(u'Author Unknown', song) self.manager.save_object(song) return song.id From 9d1eabe2a25f478254dc14bcb2ce7225a25383d1 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 11 Dec 2010 10:46:11 +0000 Subject: [PATCH 101/140] Author is optional --- openlp/plugins/songs/lib/xml.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 5a5340cb9..d26919d79 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -350,7 +350,8 @@ class OpenLyricsParser(object): for author in properties.authors.author: self._process_author(author.text, song) except: - self._process_author(u'Author Unknown', song) + # No Author in XML so ignore + pass self.manager.save_object(song) return song.id From 0cae712cc47fb25fec507d96dedd0e613e9f7a8e Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 11 Dec 2010 13:18:35 +0100 Subject: [PATCH 102/140] fixed openlp bible importer progress bar --- openlp/plugins/bibles/lib/openlp1.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 7f8a8d17e..ba9476fca 100755 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -62,6 +62,7 @@ class OpenLP1Bible(BibleDB): # Create all books. cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') books = cursor.fetchall() + self.wizard.importProgressBar.setMaximum(len(books) + 1) for book in books: if self.stop_import_flag: connection.close() From c28b1294218c68f4ce48dff5926f38454e01e0d0 Mon Sep 17 00:00:00 2001 From: M2j Date: Sat, 11 Dec 2010 16:39:12 +0100 Subject: [PATCH 103/140] format mailto() sources some exception dialog enhancements --- openlp/core/lib/mailto/LICENSE | 38 +++++ openlp/core/lib/mailto/__init__.py | 247 +++++++++++++++++------------ openlp/core/lib/mailto/mailto.INFO | 4 - openlp/core/ui/exceptiondialog.py | 1 + openlp/core/ui/exceptionform.py | 70 +++++--- 5 files changed, 227 insertions(+), 133 deletions(-) create mode 100644 openlp/core/lib/mailto/LICENSE delete mode 100644 openlp/core/lib/mailto/mailto.INFO diff --git a/openlp/core/lib/mailto/LICENSE b/openlp/core/lib/mailto/LICENSE new file mode 100644 index 000000000..967fbb0f4 --- /dev/null +++ b/openlp/core/lib/mailto/LICENSE @@ -0,0 +1,38 @@ +PSF LICENSE AGREEMENT FOR PYTHON 2.7.1 + + 1. This LICENSE AGREEMENT is between the Python Software Foundation (“PSF”), + and the Individual or Organization (“Licensee”) accessing and otherwise + using Python 2.7.1 software in source or binary form and its associated + documentation. + 2. Subject to the terms and conditions of this License Agreement, PSF hereby + grants Licensee a nonexclusive, royalty-free, world-wide license to + reproduce, analyze, test, perform and/or display publicly, prepare + derivative works, distribute, and otherwise use Python 2.7.1 alone or in any + derivative version, provided, however, that PSF’s License Agreement and + PSF’s notice of copyright, i.e., “Copyright © 2001-2010 Python Software + Foundation; All Rights Reserved” are retained in Python 2.7.1 alone or in + any derivative version prepared by Licensee. + 3. In the event Licensee prepares a derivative work that is based on or + incorporates Python 2.7.1 or any part thereof, and wants to make the + derivative work available to others as provided herein, then Licensee hereby + agrees to include in any such work a brief summary of the changes made to + Python 2.7.1. + 4. PSF is making Python 2.7.1 available to Licensee on an “AS IS” basis. PSF + MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF + EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION + OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT + THE USE OF PYTHON 2.7.1 WILL NOT INFRINGE ANY THIRD PARTY RIGHTS. + 5. PSF SHALL NOT BE LIABLE TO LICENSEE OR ANY OTHER USERS OF PYTHON 2.7.1 FOR + ANY INCIDENTAL, SPECIAL, OR CONSEQUENTIAL DAMAGES OR LOSS AS A RESULT OF + MODIFYING, DISTRIBUTING, OR OTHERWISE USING PYTHON 2.7.1, OR ANY DERIVATIVE + THEREOF, EVEN IF ADVISED OF THE POSSIBILITY THEREOF. + 6. This License Agreement will automatically terminate upon a material breach + of its terms and conditions. + 7. Nothing in this License Agreement shall be deemed to create any relationship + of agency, partnership, or joint venture between PSF and Licensee. This + License Agreement does not grant permission to use PSF trademarks or trade + name in a trademark sense to endorse or promote products or services of + Licensee, or any third party. + 8. By copying, installing or otherwise using Python 2.7.1, Licensee agrees to + be bound by the terms and conditions of this License Agreement. + diff --git a/openlp/core/lib/mailto/__init__.py b/openlp/core/lib/mailto/__init__.py index 1ec8b6b90..44f38e31f 100644 --- a/openlp/core/lib/mailto/__init__.py +++ b/openlp/core/lib/mailto/__init__.py @@ -1,12 +1,24 @@ -#!/usr/bin/env python +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 -'''Utilities for opening files or URLs in the registered default application -and for sending e-mail using the user's preferred composer. +############################################################################### +# Utilities for opening files or URLs in the registered default application # +# and for sending e-mail using the user's preferred composer. # +# --------------------------------------------------------------------------- # +# Copyright (c) 2007 Antonio Valentino # +# All rights reserved. # +# --------------------------------------------------------------------------- # +# This program offered under the PSF License as published by the Python # +# Software Foundation. # +# # +# The license text can be found at http://docs.python.org/license.html # +# # +# This code is taken from: http://code.activestate.com/recipes/511443 # +# It is modified to be used in OpenLP (http://openlp.org) # +############################################################################### -''' - -__version__ = '1.1' -__all__ = ['open', 'mailto'] +__version__ = u'1.1' +__all__ = [u'open', u'mailto'] import os import sys @@ -20,7 +32,9 @@ _open = None class BaseController(object): - '''Base class for open program controllers.''' + """ + Base class for open program controllers. + """ def __init__(self, name): self.name = name @@ -30,14 +44,16 @@ class BaseController(object): class Controller(BaseController): - '''Controller for a generic open program.''' + """ + Controller for a generic open program. + """ def __init__(self, *args): super(Controller, self).__init__(os.path.basename(args[0])) self.args = list(args) def _invoke(self, cmdline): - if sys.platform[:3] == 'win': + if sys.platform[:3] == u'win': closefds = False startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW @@ -45,9 +61,9 @@ class Controller(BaseController): closefds = True startupinfo = None - if (os.environ.get('DISPLAY') or sys.platform[:3] == 'win' or - sys.platform == 'darwin'): - inout = file(os.devnull, 'r+') + if (os.environ.get(u'DISPLAY') or sys.platform[:3] == u'win' or \ + sys.platform == u'darwin'): + inout = file(os.devnull, u'r+') else: # for TTY programs, we need stdin/out inout = None @@ -55,19 +71,19 @@ class Controller(BaseController): # if possible, put the child precess in separate process group, # so keyboard interrupts don't affect child precess as well as # Python - setsid = getattr(os, 'setsid', None) + setsid = getattr(os, u'setsid', None) if not setsid: - setsid = getattr(os, 'setpgrp', None) + setsid = getattr(os, u'setpgrp', None) pipe = subprocess.Popen(cmdline, stdin=inout, stdout=inout, - stderr=inout, close_fds=closefds, - preexec_fn=setsid, startupinfo=startupinfo) + stderr=inout, close_fds=closefds, preexec_fn=setsid, + startupinfo=startupinfo) # It is assumed that this kind of tools (gnome-open, kfmclient, # exo-open, xdg-open and open for OSX) immediately exit after lauching # the specific application returncode = pipe.wait() - if hasattr(self, 'fixreturncode'): + if hasattr(self, u'fixreturncode'): returncode = self.fixreturncode(returncode) return not returncode @@ -84,10 +100,12 @@ class Controller(BaseController): # Platform support for Windows -if sys.platform[:3] == 'win': +if sys.platform[:3] == u'win': class Start(BaseController): - '''Controller for the win32 start progam through os.startfile.''' + """ + Controller for the win32 start progam through os.startfile. + """ def open(self, filename): try: @@ -99,14 +117,14 @@ if sys.platform[:3] == 'win': else: return True - _controllers['windows-default'] = Start('start') - _open = _controllers['windows-default'].open + _controllers[u'windows-default'] = Start(u'start') + _open = _controllers[u'windows-default'].open # Platform support for MacOS -elif sys.platform == 'darwin': - _controllers['open']= Controller('open') - _open = _controllers['open'].open +elif sys.platform == u'darwin': + _controllers[u'open']= Controller(u'open') + _open = _controllers[u'open'].open # Platform support for Unix @@ -118,20 +136,22 @@ else: from webbrowser import _iscommand class KfmClient(Controller): - '''Controller for the KDE kfmclient program.''' + """ + Controller for the KDE kfmclient program. + """ - def __init__(self, kfmclient='kfmclient'): - super(KfmClient, self).__init__(kfmclient, 'exec') + def __init__(self, kfmclient=u'kfmclient'): + super(KfmClient, self).__init__(kfmclient, u'exec') self.kde_version = self.detect_kde_version() def detect_kde_version(self): kde_version = None try: - info = commands.getoutput('kde-config --version') + info = commands.getoutput(u'kfmclient --version') for line in info.splitlines(): - if line.startswith('KDE'): - kde_version = line.split(':')[-1].strip() + if line.startswith(u'KDE'): + kde_version = line.split(u':')[-1].strip() break except (OSError, RuntimeError): pass @@ -139,30 +159,30 @@ else: return kde_version def fixreturncode(self, returncode): - if returncode is not None and self.kde_version > '3.5.4': + if returncode is not None and self.kde_version > u'3.5.4': return returncode else: return os.EX_OK def detect_desktop_environment(): - '''Checks for known desktop environments + """ + Checks for known desktop environments Return the desktop environments name, lowercase (kde, gnome, xfce) or "generic" + """ - ''' + desktop_environment = u'generic' - desktop_environment = 'generic' - - if os.environ.get('KDE_FULL_SESSION') == 'true': - desktop_environment = 'kde' - elif os.environ.get('GNOME_DESKTOP_SESSION_ID'): - desktop_environment = 'gnome' + if os.environ.get(u'KDE_FULL_SESSION') == u'true': + desktop_environment = u'kde' + elif os.environ.get(u'GNOME_DESKTOP_SESSION_ID'): + desktop_environment = u'gnome' else: try: - info = commands.getoutput('xprop -root _DT_SAVE_MODE') - if ' = "xfce4"' in info: - desktop_environment = 'xfce' + info = commands.getoutput(u'xprop -root _DT_SAVE_MODE') + if u' = "xfce4"' in info: + desktop_environment = u'xfce' except (OSError, RuntimeError): pass @@ -170,18 +190,19 @@ else: def register_X_controllers(): - if _iscommand('kfmclient'): - _controllers['kde-open'] = KfmClient() + if _iscommand(u'kfmclient'): + _controllers[u'kde-open'] = KfmClient() - for command in ('gnome-open', 'exo-open', 'xdg-open'): + for command in (u'gnome-open', u'exo-open', u'xdg-open'): if _iscommand(command): _controllers[command] = Controller(command) + def get(): controllers_map = { - 'gnome': 'gnome-open', - 'kde': 'kde-open', - 'xfce': 'exo-open', + u'gnome': u'gnome-open', + u'kde': u'kde-open', + u'xfce': u'exo-open', } desktop_environment = detect_desktop_environment() @@ -191,25 +212,26 @@ else: return _controllers[controller_name].open except KeyError: - if _controllers.has_key('xdg-open'): - return _controllers['xdg-open'].open + if _controllers.has_key(u'xdg-open'): + return _controllers[u'xdg-open'].open else: return webbrowser.open - - if os.environ.get("DISPLAY"): + if os.environ.get(u'DISPLAY'): register_X_controllers() _open = get() def open(filename): - '''Open a file or an URL in the registered default application.''' + """ + Open a file or an URL in the registered default application. + """ return _open(filename) def _fix_addersses(**kwargs): - for headername in ('address', 'to', 'cc', 'bcc'): + for headername in (u'address', u'to', u'cc', u'bcc'): try: headervalue = kwargs[headername] if not headervalue: @@ -217,16 +239,14 @@ def _fix_addersses(**kwargs): continue elif not isinstance(headervalue, basestring): # assume it is a sequence - headervalue = ','.join(headervalue) - + headervalue = u','.join(headervalue) except KeyError: pass except TypeError: - raise TypeError('string or sequence expected for "%s", ' - '%s found' % (headername, - type(headervalue).__name__)) + raise TypeError(u'string or sequence expected for "%s", %s ' + u'found' % (headername, type(headervalue).__name__)) else: - translation_map = {'%': '%25', '&': '%26', '?': '%3F'} + translation_map = {u'%': u'%25', u'&': u'%26', u'?': u'%3F'} for char, replacement in translation_map.items(): headervalue = headervalue.replace(char, replacement) kwargs[headername] = headervalue @@ -235,31 +255,35 @@ def _fix_addersses(**kwargs): def mailto_format(**kwargs): + """ + Compile mailto string from call parameters + """ # @TODO: implement utf8 option kwargs = _fix_addersses(**kwargs) parts = [] - for headername in ('to', 'cc', 'bcc', 'subject', 'body', 'attach'): + for headername in (u'to', u'cc', u'bcc', u'subject', u'body', u'attach'): if kwargs.has_key(headername): headervalue = kwargs[headername] if not headervalue: continue - if headername in ('address', 'to', 'cc', 'bcc'): - parts.append('%s=%s' % (headername, headervalue)) + if headername in (u'address', u'to', u'cc', u'bcc'): + parts.append(u'%s=%s' % (headername, headervalue)) else: headervalue = encode_rfc2231(headervalue) # @TODO: check - parts.append('%s=%s' % (headername, headervalue)) + parts.append(u'%s=%s' % (headername, headervalue)) - mailto_string = 'mailto:%s' % kwargs.get('address', '') + mailto_string = u'mailto:%s' % kwargs.get(u'address', '') if parts: - mailto_string = '%s?%s' % (mailto_string, '&'.join(parts)) + mailto_string = u'%s?%s' % (mailto_string, u'&'.join(parts)) return mailto_string def mailto(address, to=None, cc=None, bcc=None, subject=None, body=None, attach=None): - '''Send an e-mail using the user's preferred composer. + """ + Send an e-mail using the user's preferred composer. Open the user's preferred e-mail composer in order to send a mail to address(es) that must follow the syntax of RFC822. Multiple addresses @@ -270,49 +294,61 @@ def mailto(address, to=None, cc=None, bcc=None, subject=None, body=None, the user's e-mail composer. The user will have the opportunity to change any of this information before actually sending the e-mail. - address - specify the destination recipient - cc - specify a recipient to be copied on the e-mail - bcc - specify a recipient to be blindly copied on the e-mail - subject - specify a subject for the e-mail - body - specify a body for the e-mail. Since the user will be able - to make changes before actually sending the e-mail, this - can be used to provide the user with a template for the - e-mail text may contain linebreaks - attach - specify an attachment for the e-mail. file must point to - an existing file + ``address`` + specify the destination recipient - ''' + ``cc`` + specify a recipient to be copied on the e-mail + + ``bcc`` + specify a recipient to be blindly copied on the e-mail + + ``subject`` + specify a subject for the e-mail + + ``body`` + specify a body for the e-mail. Since the user will be able to make + changes before actually sending the e-mail, this can be used to provide + the user with a template for the e-mail text may contain linebreaks + + ``attach`` + specify an attachment for the e-mail. file must point to an existing + file + """ mailto_string = mailto_format(**locals()) return open(mailto_string) -if __name__ == '__main__': +if __name__ == u'__main__': + """ + Option handler for CLI usage + """ + from optparse import OptionParser - version = '%%prog %s' % __version__ + version = u'%%prog %s' % __version__ usage = ( - '\n\n%prog FILENAME [FILENAME(s)] -- for opening files' - '\n\n%prog -m [OPTIONS] ADDRESS [ADDRESS(es)] -- for sending e-mails' + u'\n\n%prog FILENAME [FILENAME(s)] -- for opening files' + u'\n\n%prog -m [OPTIONS] ADDRESS [ADDRESS(es)] -- for sending e-mails' ) parser = OptionParser(usage=usage, version=version, description=__doc__) - parser.add_option('-m', '--mailto', dest='mailto_mode', default=False, - action='store_true', help='set mailto mode. ' - 'If not set any other option is ignored') - parser.add_option('--cc', dest='cc', help='specify a recipient to be ' - 'copied on the e-mail') - parser.add_option('--bcc', dest='bcc', help='specify a recipient to be ' - 'blindly copied on the e-mail') - parser.add_option('--subject', dest='subject', - help='specify a subject for the e-mail') - parser.add_option('--body', dest='body', help='specify a body for the ' - 'e-mail. Since the user will be able to make changes ' - 'before actually sending the e-mail, this can be used ' - 'to provide the user with a template for the e-mail ' - 'text may contain linebreaks') - parser.add_option('--attach', dest='attach', help='specify an attachment ' - 'for the e-mail. file must point to an existing file') + parser.add_option(u'-m', u'--mailto', dest=u'mailto_mode', default=False, + action=u'store_true', help=u'set mailto mode. If not set any other ' + u'option is ignored') + parser.add_option(u'--cc', dest=u'cc', help=u'specify a recipient to be ' + u'copied on the e-mail') + parser.add_option(u'--bcc', dest=u'bcc', help=u'specify a recipient to be ' + u'blindly copied on the e-mail') + parser.add_option(u'--subject', dest=u'subject', help=u'specify a subject ' + u'for the e-mail') + parser.add_option(u'--body', dest=u'body', help=u'specify a body for the ' + u'e-mail. Since the user will be able to make changes before actually ' + u'sending the e-mail, this can be used to provide the user with a ' + u'template for the e-mail text may contain linebreaks') + parser.add_option(u'--attach', dest=u'attach', help=u'specify an ' + u'attachment for the e-mail. file must point to an existing file') (options, args) = parser.parse_args() @@ -322,17 +358,18 @@ if __name__ == '__main__': if options.mailto_mode: if not mailto(args, None, options.cc, options.bcc, options.subject, - options.body, options.attach): - sys.exit('Unable to open the e-mail client') + options.body, options.attach): + sys.exit(u'Unable to open the e-mail client') else: - for name in ('cc', 'bcc', 'subject', 'body', 'attach'): + for name in (u'cc', u'bcc', u'subject', u'body', u'attach'): if getattr(options, name): - parser.error('The "cc", "bcc", "subject", "body" and "attach" ' - 'options are only accepten in mailto mode') + parser.error(u'The "cc", "bcc", "subject", "body" and "attach" ' + u'options are only accepten in mailto mode') success = False for arg in args: if not open(arg): - print 'Unable to open "%s"' % arg + print u'Unable to open "%s"' % arg else: success = True sys.exit(success) + diff --git a/openlp/core/lib/mailto/mailto.INFO b/openlp/core/lib/mailto/mailto.INFO deleted file mode 100644 index d1e278147..000000000 --- a/openlp/core/lib/mailto/mailto.INFO +++ /dev/null @@ -1,4 +0,0 @@ -Cross-platform startfile and mailto functions -Author: Antonio Valentino -License: PSF license (http://docs.python.org/license.html) -Source: http://code.activestate.com/recipes/511443-cross-platform-startfile-and-mailto-functions/ diff --git a/openlp/core/ui/exceptiondialog.py b/openlp/core/ui/exceptiondialog.py index 6fb7c7985..22395af90 100644 --- a/openlp/core/ui/exceptiondialog.py +++ b/openlp/core/ui/exceptiondialog.py @@ -74,6 +74,7 @@ class Ui_ExceptionDialog(object): self.sendReportButton.setObjectName(u'sendReportButton') self.exceptionButtonBox.addButton(self.sendReportButton, QtGui.QDialogButtonBox.ActionRole) + self.retranslateUi(exceptionDialog) QtCore.QObject.connect(self.exceptionButtonBox, QtCore.SIGNAL(u'accepted()'), exceptionDialog.accept) diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index 09cdc1414..5fa0a7dd1 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -24,23 +24,38 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import re import os import platform import sqlalchemy import BeautifulSoup -import enchant -import chardet +from lxml import etree +from PyQt4 import Qt, QtCore, QtGui + +try: + from PyQt4.phonon import Phonon + phonon_version = Phonon.phononVersion() +except ImportError: + phonon_version = u'-' +try: + import chardet + chardet_version = chardet.__version__ +except ImportError: + chardet_version = u'-' +try: + import enchant + enchant_version = enchant.__version__ +except ImportError: + enchant_version = u'-' try: import sqlite sqlite_version = sqlite.version except ImportError: sqlite_version = u'-' -from lxml import etree -from PyQt4 import Qt, QtCore, QtGui - -from openlp.core.lib import translate, SettingsManager, mailto +from openlp.core.lib import translate, SettingsManager +from openlp.core.lib.mailto import mailto from exceptiondialog import Ui_ExceptionDialog @@ -52,26 +67,27 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): QtGui.QDialog.__init__(self, parent) self.setupUi(self) self.settingsSection = u'crashreport' - #TODO: Icons def _createReport(self): openlp_version = self.parent().applicationVersion[u'full'] traceback = unicode(self.exceptionTextEdit.toPlainText()) system = unicode(translate('OpenLP.ExceptionForm', - 'Platform: %s\n')) % (platform.platform()) - libraries = unicode(translate('OpenLP.ExceptionForm', - 'Python: %s\n' - 'PyQt4: %s\n' - 'Qt4: %s\n' - 'SQLAlchemy: %s\n' - 'lxml: %s\n' - 'BeautifulSoup: %s\n' - 'PyEnchant: %s\n' - 'Chardet: %s\n' - 'PySQLite: %s\n')) % (platform.python_version(), - Qt.PYQT_VERSION_STR, Qt.qVersion(), sqlalchemy.__version__, - etree.__version__, BeautifulSoup.__version__ , enchant.__version__, - chardet.__version__, sqlite_version) + 'Platform: %s\n')) % platform.platform() + libraries = u'Python: %s\n' % platform.python_version() + \ + u'Qt4: %s\n' % Qt.qVersion() + \ + u'Phonon: %s\n' % phonon_version + \ + u'PyQt4: %s\n' % Qt.PYQT_VERSION_STR + \ + u'SQLAlchemy: %s\n' % sqlalchemy.__version__ + \ + u'BeautifulSoup: %s\n' % BeautifulSoup.__version__ + \ + u'lxml: %s\n' % etree.__version__ + \ + u'Chardet: %s\n' % chardet_version + \ + u'PyEnchant: %s\n' % enchant_version + \ + u'PySQLite: %s\n' % sqlite_version + if platform.system() == u'Linux': + if os.environ.get(u'KDE_FULL_SESSION') == u'true': + system = system + u'Desktop: KDE SC\n' + elif os.environ.get(u'GNOME_DESKTOP_SESSION_ID'): + system = system + u'Desktop: GNOME\n' return (openlp_version, traceback, system, libraries) def onSaveReportButtonPressed(self): @@ -110,12 +126,18 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): Opening systems default email client and inserting exception log and system informations. """ - email_body = unicode(translate('OpenLP.ExceptionForm', + body = unicode(translate('OpenLP.ExceptionForm', '*OpenLP Bug Report*\n' 'Version: %s\n\n' '--- Please enter the report below this line. ---\n\n\n' '--- Exception Traceback ---\n%s\n' '--- System information ---\n%s\n' '--- Library Versions ---\n%s\n')) - mailto.mailto(address=u'bugs@openlp.org', subject=u'OpenLP Bug Report', - body=email_body % self._createReport()) + content = self._createReport() + for line in content[1].split(u'\n'): + if re.search(r'[/\\]openlp[/\\]', line): + source = re.sub(r'.*[/\\]openlp[/\\](.*)".*', r'\1', line) + if u':' in line: + exception = line.split(u'\n')[-1].split(u':')[0] + subject = u'Bug report: %s in %s' % (exception, source) + mailto(address=u'bugs@openlp.org', subject=subject, body=body % content) From af202e3358f7fb123928471560f6a4dfa8995940 Mon Sep 17 00:00:00 2001 From: M2j Date: Sat, 11 Dec 2010 21:22:03 +0100 Subject: [PATCH 104/140] removed CLI interface of the mailto library --- openlp/core/lib/mailto/__init__.py | 54 ------------------------------ 1 file changed, 54 deletions(-) diff --git a/openlp/core/lib/mailto/__init__.py b/openlp/core/lib/mailto/__init__.py index 44f38e31f..be7125155 100644 --- a/openlp/core/lib/mailto/__init__.py +++ b/openlp/core/lib/mailto/__init__.py @@ -319,57 +319,3 @@ def mailto(address, to=None, cc=None, bcc=None, subject=None, body=None, mailto_string = mailto_format(**locals()) return open(mailto_string) - -if __name__ == u'__main__': - """ - Option handler for CLI usage - """ - - from optparse import OptionParser - - version = u'%%prog %s' % __version__ - usage = ( - u'\n\n%prog FILENAME [FILENAME(s)] -- for opening files' - u'\n\n%prog -m [OPTIONS] ADDRESS [ADDRESS(es)] -- for sending e-mails' - ) - - parser = OptionParser(usage=usage, version=version, description=__doc__) - parser.add_option(u'-m', u'--mailto', dest=u'mailto_mode', default=False, - action=u'store_true', help=u'set mailto mode. If not set any other ' - u'option is ignored') - parser.add_option(u'--cc', dest=u'cc', help=u'specify a recipient to be ' - u'copied on the e-mail') - parser.add_option(u'--bcc', dest=u'bcc', help=u'specify a recipient to be ' - u'blindly copied on the e-mail') - parser.add_option(u'--subject', dest=u'subject', help=u'specify a subject ' - u'for the e-mail') - parser.add_option(u'--body', dest=u'body', help=u'specify a body for the ' - u'e-mail. Since the user will be able to make changes before actually ' - u'sending the e-mail, this can be used to provide the user with a ' - u'template for the e-mail text may contain linebreaks') - parser.add_option(u'--attach', dest=u'attach', help=u'specify an ' - u'attachment for the e-mail. file must point to an existing file') - - (options, args) = parser.parse_args() - - if not args: - parser.print_usage() - parser.exit(1) - - if options.mailto_mode: - if not mailto(args, None, options.cc, options.bcc, options.subject, - options.body, options.attach): - sys.exit(u'Unable to open the e-mail client') - else: - for name in (u'cc', u'bcc', u'subject', u'body', u'attach'): - if getattr(options, name): - parser.error(u'The "cc", "bcc", "subject", "body" and "attach" ' - u'options are only accepten in mailto mode') - success = False - for arg in args: - if not open(arg): - print u'Unable to open "%s"' % arg - else: - success = True - sys.exit(success) - From bc0ca88af5e2e2e880b69bba6f1946d5d6ffc69b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 11 Dec 2010 20:31:47 +0000 Subject: [PATCH 105/140] Add Autocompletion for Authors and Themes --- openlp/plugins/songs/forms/editsongform.py | 34 ++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 247e5e837..778046d0d 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -61,6 +61,14 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.QObject.connect(self.AuthorsListView, QtCore.SIGNAL(u'itemClicked(QListWidgetItem*)'), self.onAuthorsListViewPressed) + QtCore.QObject.connect(self.AuthorsSelectionComboItem, + QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter) + QtCore.QObject.connect(self.AuthorsSelectionComboItem, + QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter)# + QtCore.QObject.connect(self.ThemeSelectionComboItem, + QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter) + QtCore.QObject.connect(self.ThemeSelectionComboItem, + QtCore.SIGNAL(u'activated(int)'), self.updateThemeAutoCompleter) QtCore.QObject.connect(self.TopicAddButton, QtCore.SIGNAL(u'clicked()'), self.onTopicAddButtonClicked) QtCore.QObject.connect(self.TopicRemoveButton, @@ -119,12 +127,23 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): authors = self.manager.get_all_objects(Author, order_by_ref=Author.display_name) self.AuthorsSelectionComboItem.clear() - self.AuthorsSelectionComboItem.addItem(u'') + self.AuthorsSelectionComboItem.addItem(u'')# + self.authors = [] for author in authors: row = self.AuthorsSelectionComboItem.count() self.AuthorsSelectionComboItem.addItem(author.display_name) self.AuthorsSelectionComboItem.setItemData( row, QtCore.QVariant(author.id)) + self.authors.append(author.display_name) + self.updateAuthorAutoCompleter() + + def updateAuthorAutoCompleter(self): + """ + This updates the author completion list for the search field. + """ + completer = QtGui.QCompleter(self.authors) + completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + self.AuthorsSelectionComboItem.setCompleter(completer) def loadTopics(self): topics = self.manager.get_all_objects(Topic, order_by_ref=Topic.name) @@ -147,8 +166,19 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): def loadThemes(self, theme_list): self.ThemeSelectionComboItem.clear() self.ThemeSelectionComboItem.addItem(u'') + self.themes = [] for theme in theme_list: self.ThemeSelectionComboItem.addItem(theme) + self.themes.append(theme) + self.updateThemeAutoCompleter() + + def updateThemeAutoCompleter(self): + """ + This updates the theme completion list for the search field. + """ + completer = QtGui.QCompleter(self.themes) + completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + self.ThemeSelectionComboItem.setCompleter(completer) def newSong(self): log.debug(u'New Song') @@ -644,7 +674,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): Get all the data from the widgets on the form, and then save it to the database. - ``preview`` + ``preview`` Should be ``True`` if the song is also previewed (boolean). """ self.song.title = unicode(self.TitleEditItem.text()) From a25ce9d3cf2d735538315b03a21d490a972da96a Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 11 Dec 2010 20:49:50 +0000 Subject: [PATCH 106/140] Sort out Camels --- openlp/core/lib/plugin.py | 20 +++++----- openlp/core/ui/mainwindow.py | 64 +++++++++++++++---------------- openlp/core/ui/pluginform.py | 4 +- openlp/core/ui/servicemanager.py | 14 +++---- openlp/core/ui/slidecontroller.py | 2 +- openlp/core/ui/thememanager.py | 4 +- 6 files changed, 54 insertions(+), 54 deletions(-) diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index 37ac3d74a..f73b58735 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -108,7 +108,7 @@ class Plugin(QtCore.QObject): """ log.info(u'loaded') - def __init__(self, name, version=None, plugin_helpers=None): + def __init__(self, name, version=None, pluginHelpers=None): """ This is the constructor for the plugin object. This provides an easy way for descendent plugins to populate common data. This method *must* @@ -124,7 +124,7 @@ class Plugin(QtCore.QObject): ``version`` Defaults to *None*. The version of the plugin. - ``plugin_helpers`` + ``pluginHelpers`` Defaults to *None*. A list of helper objects. """ QtCore.QObject.__init__(self) @@ -139,14 +139,14 @@ class Plugin(QtCore.QObject): self.status = PluginStatus.Inactive # Set up logging self.log = logging.getLogger(self.name) - self.previewController = plugin_helpers[u'preview'] - self.liveController = plugin_helpers[u'live'] - self.renderManager = plugin_helpers[u'render'] - self.serviceManager = plugin_helpers[u'service'] - self.settingsForm = plugin_helpers[u'settings form'] - self.mediadock = plugin_helpers[u'toolbox'] - self.pluginManager = plugin_helpers[u'pluginmanager'] - self.formparent = plugin_helpers[u'formparent'] + self.previewController = pluginHelpers[u'preview'] + self.liveController = pluginHelpers[u'live'] + self.renderManager = pluginHelpers[u'render'] + self.serviceManager = pluginHelpers[u'service'] + self.settingsForm = pluginHelpers[u'settings form'] + self.mediadock = pluginHelpers[u'toolbox'] + self.pluginManager = pluginHelpers[u'pluginmanager'] + self.formparent = pluginHelpers[u'formparent'] QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_add_service_item' % self.name), self.processAddServiceEvent) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 3833f1697..a319e005f 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -97,16 +97,16 @@ class Ui_MainWindow(object): self.ControlSplitter.setObjectName(u'ControlSplitter') self.MainContentLayout.addWidget(self.ControlSplitter) # Create slide controllers - self.PreviewController = SlideController(self, self.settingsmanager, + self.previewController = SlideController(self, self.settingsmanager, self.screens) - self.LiveController = SlideController(self, self.settingsmanager, + self.liveController = SlideController(self, self.settingsmanager, self.screens, True) previewVisible = QtCore.QSettings().value( u'user interface/preview panel', QtCore.QVariant(True)).toBool() - self.PreviewController.Panel.setVisible(previewVisible) + self.previewController.Panel.setVisible(previewVisible) liveVisible = QtCore.QSettings().value(u'user interface/live panel', QtCore.QVariant(True)).toBool() - self.LiveController.Panel.setVisible(liveVisible) + self.liveController.Panel.setVisible(liveVisible) # Create menu self.MenuBar = QtGui.QMenuBar(MainWindow) self.MenuBar.setGeometry(QtCore.QRect(0, 0, 1087, 27)) @@ -362,8 +362,8 @@ class Ui_MainWindow(object): """ Splitter between the Preview and Live Controllers. """ - self.LiveController.widthChanged() - self.PreviewController.widthChanged() + self.liveController.widthChanged() + self.previewController.widthChanged() def retranslateUi(self, MainWindow): """ @@ -548,8 +548,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.recentFiles = QtCore.QStringList() # Set up the path with plugins pluginpath = AppLocation.get_directory(AppLocation.PluginsDir) - self.plugin_manager = PluginManager(pluginpath) - self.plugin_helpers = {} + self.pluginManager = PluginManager(pluginpath) + self.pluginHelpers = {} # Set up the interface self.setupUi(self) # Load settings after setupUi so default UI sizes are overwritten @@ -633,33 +633,33 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.mediaDockManager = MediaDockManager(self.MediaToolBox) log.info(u'Load Plugins') # 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'service'] = self.ServiceManagerContents - self.plugin_helpers[u'settings form'] = self.settingsForm - self.plugin_helpers[u'toolbox'] = self.mediaDockManager - self.plugin_helpers[u'pluginmanager'] = self.plugin_manager - self.plugin_helpers[u'formparent'] = self - self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers) + self.pluginHelpers[u'preview'] = self.previewController + self.pluginHelpers[u'live'] = self.liveController + self.pluginHelpers[u'render'] = self.renderManager + self.pluginHelpers[u'service'] = self.ServiceManagerContents + self.pluginHelpers[u'settings form'] = self.settingsForm + self.pluginHelpers[u'toolbox'] = self.mediaDockManager + self.pluginHelpers[u'pluginmanager'] = self.pluginManager + self.pluginHelpers[u'formparent'] = self + self.pluginManager.find_plugins(pluginpath, self.pluginHelpers) # hook methods have to happen after find_plugins. Find plugins needs # the controllers hence the hooks have moved from setupUI() to here # Find and insert settings tabs log.info(u'hook settings') - self.plugin_manager.hook_settings_tabs(self.settingsForm) + self.pluginManager.hook_settings_tabs(self.settingsForm) # Find and insert media manager items log.info(u'hook media') - self.plugin_manager.hook_media_manager(self.mediaDockManager) + self.pluginManager.hook_media_manager(self.mediaDockManager) # Call the hook method to pull in import menus. log.info(u'hook menus') - self.plugin_manager.hook_import_menu(self.FileImportMenu) + self.pluginManager.hook_import_menu(self.FileImportMenu) # Call the hook method to pull in export menus. - self.plugin_manager.hook_export_menu(self.FileExportMenu) + self.pluginManager.hook_export_menu(self.FileExportMenu) # Call the hook method to pull in tools menus. - self.plugin_manager.hook_tools_menu(self.ToolsMenu) + self.pluginManager.hook_tools_menu(self.ToolsMenu) # Call the initialise method to setup plugins. log.info(u'initialise plugins') - self.plugin_manager.initialise_plugins() + self.pluginManager.initialise_plugins() # Once all components are initialised load the Themes log.info(u'Load Themes') self.ThemeManagerContents.loadThemes() @@ -695,10 +695,10 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): Show the main form, as well as the display form """ QtGui.QWidget.show(self) - self.LiveController.display.setup() - self.PreviewController.display.setup() - if self.LiveController.display.isVisible(): - self.LiveController.display.setFocus() + self.liveController.display.setup() + self.previewController.display.setup() + if self.liveController.display.isVisible(): + self.liveController.display.setFocus() self.activateWindow() if QtCore.QSettings().value( self.generalSettingsSection + u'/auto open', @@ -723,7 +723,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): settings = QtCore.QSettings() if settings.value(u'%s/screen blank' % self.generalSettingsSection, QtCore.QVariant(False)).toBool(): - self.LiveController.mainDisplaySetBackground() + self.liveController.mainDisplaySetBackground() if settings.value(u'blank warning', QtCore.QVariant(False)).toBool(): QtGui.QMessageBox.question(self, @@ -852,11 +852,11 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.QVariant(self.MediaToolBox.currentIndex())) # Call the cleanup method to shutdown plugins. log.info(u'cleanup plugins') - self.plugin_manager.finalise_plugins() + self.pluginManager.finalise_plugins() # Save settings self.saveSettings() # Close down the display - self.LiveController.display.close() + self.liveController.display.close() def serviceChanged(self, reset=False, serviceName=None): """ @@ -910,7 +910,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): True - Visible False - Hidden """ - self.PreviewController.Panel.setVisible(visible) + self.previewController.Panel.setVisible(visible) QtCore.QSettings().setValue(u'user interface/preview panel', QtCore.QVariant(visible)) self.ViewPreviewPanel.setChecked(visible) @@ -925,7 +925,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): True - Visible False - Hidden """ - self.LiveController.Panel.setVisible(visible) + self.liveController.Panel.setVisible(visible) QtCore.QSettings().setValue(u'user interface/live panel', QtCore.QVariant(visible)) self.ViewLivePanel.setChecked(visible) diff --git a/openlp/core/ui/pluginform.py b/openlp/core/ui/pluginform.py index a857caee7..3d3a814a0 100644 --- a/openlp/core/ui/pluginform.py +++ b/openlp/core/ui/pluginform.py @@ -61,7 +61,7 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): self.programaticChange = True self._clearDetails() self.programaticChange = True - for plugin in self.parent.plugin_manager.plugins: + for plugin in self.parent.pluginManager.plugins: item = QtGui.QListWidgetItem(self.pluginListWidget) # We do this just to make 100% sure the status is an integer as # sometimes when it's loaded from the config, it isn't cast to int. @@ -110,7 +110,7 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): plugin_name_plural = \ self.pluginListWidget.currentItem().text().split(u' ')[0] self.activePlugin = None - for plugin in self.parent.plugin_manager.plugins: + for plugin in self.parent.pluginManager.plugins: name_string = plugin.getString(StringContent.Name) if name_string[u'plural'] == plugin_name_plural: self.activePlugin = plugin diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 85dff6b91..32e46dffb 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -880,7 +880,7 @@ class ServiceManager(QtGui.QWidget): newItem.merge(item[u'service_item']) item[u'service_item'] = newItem self.repaintServiceList(itemcount + 1, 0) - self.parent.LiveController.replaceServiceManagerItem(newItem) + self.parent.liveController.replaceServiceManagerItem(newItem) self.parent.serviceChanged(False, self.serviceName) def addServiceItem(self, item, rebuild=False, expand=None, replace=False): @@ -902,7 +902,7 @@ class ServiceManager(QtGui.QWidget): item.merge(self.serviceItems[sitem][u'service_item']) self.serviceItems[sitem][u'service_item'] = item self.repaintServiceList(sitem + 1, 0) - self.parent.LiveController.replaceServiceManagerItem(item) + self.parent.liveController.replaceServiceManagerItem(item) else: # nothing selected for dnd if self.droppos == 0: @@ -923,7 +923,7 @@ class ServiceManager(QtGui.QWidget): self.repaintServiceList(self.droppos, 0) # if rebuilding list make sure live is fixed. if rebuild: - self.parent.LiveController.replaceServiceManagerItem(item) + self.parent.liveController.replaceServiceManagerItem(item) self.droppos = 0 self.parent.serviceChanged(False, self.serviceName) @@ -933,7 +933,7 @@ class ServiceManager(QtGui.QWidget): """ item, count = self.findServiceItem() if self.serviceItems[item][u'service_item'].is_valid: - self.parent.PreviewController.addServiceManagerItem( + self.parent.previewController.addServiceManagerItem( self.serviceItems[item][u'service_item'], count) else: QtGui.QMessageBox.critical(self, @@ -957,7 +957,7 @@ class ServiceManager(QtGui.QWidget): """ item, count = self.findServiceItem() if self.serviceItems[item][u'service_item'].is_valid: - self.parent.LiveController.addServiceManagerItem( + self.parent.liveController.addServiceManagerItem( self.serviceItems[item][u'service_item'], count) if QtCore.QSettings().value( self.parent.generalSettingsSection + u'/auto preview', @@ -966,9 +966,9 @@ class ServiceManager(QtGui.QWidget): if self.serviceItems and item < len(self.serviceItems) and \ self.serviceItems[item][u'service_item'].is_capable( ItemCapabilities.AllowsPreview): - self.parent.PreviewController.addServiceManagerItem( + self.parent.previewController.addServiceManagerItem( self.serviceItems[item][u'service_item'], 0) - self.parent.LiveController.PreviewListWidget.setFocus() + self.parent.liveController.PreviewListWidget.setFocus() else: QtGui.QMessageBox.critical(self, translate('OpenLP.ServiceManager', 'Missing Display Handler'), diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index f667c6d3c..6c7fb8538 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -957,7 +957,7 @@ class SlideController(QtGui.QWidget): """ row = self.PreviewListWidget.currentRow() if row > -1 and row < self.PreviewListWidget.rowCount(): - self.parent.LiveController.addServiceManagerItem( + self.parent.liveController.addServiceManagerItem( self.serviceItem, row) def onMediaStart(self, item): diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index da8597cc0..b6e8c3d7a 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -310,7 +310,7 @@ class ThemeManager(QtGui.QWidget): translate('OpenLP.ThemeManager', 'You are unable to delete the default theme.')) else: - for plugin in self.parent.plugin_manager.plugins: + for plugin in self.parent.pluginManager.plugins: if plugin.usesTheme(theme): QtGui.QMessageBox.critical(self, translate('OpenLP.ThemeManager', 'Error'), @@ -663,7 +663,7 @@ class ThemeManager(QtGui.QWidget): (QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No) if self.saveThemeName != u'': - for plugin in self.parent.plugin_manager.plugins: + for plugin in self.parent.pluginManager.plugins: if plugin.usesTheme(self.saveThemeName): plugin.renameTheme(self.saveThemeName, name) if unicode(self.serviceComboBox.currentText()) == name: From 031b23ccda8900f0025794498dab1778fc51433d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 11 Dec 2010 20:57:45 +0000 Subject: [PATCH 107/140] Format errors --- openlp/plugins/songs/forms/editsongform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 778046d0d..59eae1160 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -64,7 +64,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.QObject.connect(self.AuthorsSelectionComboItem, QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter) QtCore.QObject.connect(self.AuthorsSelectionComboItem, - QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter)# + QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter) QtCore.QObject.connect(self.ThemeSelectionComboItem, QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter) QtCore.QObject.connect(self.ThemeSelectionComboItem, @@ -127,7 +127,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): authors = self.manager.get_all_objects(Author, order_by_ref=Author.display_name) self.AuthorsSelectionComboItem.clear() - self.AuthorsSelectionComboItem.addItem(u'')# + self.AuthorsSelectionComboItem.addItem(u'') self.authors = [] for author in authors: row = self.AuthorsSelectionComboItem.count() From f3f2e5cdc8832d60bacf4fd8eda64c3f930fd4d4 Mon Sep 17 00:00:00 2001 From: M2j Date: Sun, 12 Dec 2010 00:25:49 +0100 Subject: [PATCH 108/140] minor changes --- openlp/core/lib/mailto/LICENSE | 12 ++++++------ openlp/core/lib/mailto/__init__.py | 2 +- openlp/core/ui/exceptiondialog.py | 20 ++++++++++---------- resources/images/general_email.png | Bin 755 -> 833 bytes 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/openlp/core/lib/mailto/LICENSE b/openlp/core/lib/mailto/LICENSE index 967fbb0f4..d8ab2d8d2 100644 --- a/openlp/core/lib/mailto/LICENSE +++ b/openlp/core/lib/mailto/LICENSE @@ -1,23 +1,23 @@ PSF LICENSE AGREEMENT FOR PYTHON 2.7.1 - 1. This LICENSE AGREEMENT is between the Python Software Foundation (“PSF”), - and the Individual or Organization (“Licensee”) accessing and otherwise + 1. This LICENSE AGREEMENT is between the Python Software Foundation ("PSF"), + and the Individual or Organization ("Licensee") accessing and otherwise using Python 2.7.1 software in source or binary form and its associated documentation. 2. Subject to the terms and conditions of this License Agreement, PSF hereby grants Licensee a nonexclusive, royalty-free, world-wide license to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use Python 2.7.1 alone or in any - derivative version, provided, however, that PSF’s License Agreement and - PSF’s notice of copyright, i.e., “Copyright © 2001-2010 Python Software - Foundation; All Rights Reserved” are retained in Python 2.7.1 alone or in + derivative version, provided, however, that PSF's License Agreement and + PSF's notice of copyright, i.e., "Copyright (c) 2001-2010 Python Software + Foundation; All Rights Reserved" are retained in Python 2.7.1 alone or in any derivative version prepared by Licensee. 3. In the event Licensee prepares a derivative work that is based on or incorporates Python 2.7.1 or any part thereof, and wants to make the derivative work available to others as provided herein, then Licensee hereby agrees to include in any such work a brief summary of the changes made to Python 2.7.1. - 4. PSF is making Python 2.7.1 available to Licensee on an “AS IS” basis. PSF + 4. PSF is making Python 2.7.1 available to Licensee on an "AS IS" basis. PSF MAKES NO REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED. BY WAY OF EXAMPLE, BUT NOT LIMITATION, PSF MAKES NO AND DISCLAIMS ANY REPRESENTATION OR WARRANTY OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE OR THAT diff --git a/openlp/core/lib/mailto/__init__.py b/openlp/core/lib/mailto/__init__.py index be7125155..102c4c94a 100644 --- a/openlp/core/lib/mailto/__init__.py +++ b/openlp/core/lib/mailto/__init__.py @@ -14,7 +14,7 @@ # The license text can be found at http://docs.python.org/license.html # # # # This code is taken from: http://code.activestate.com/recipes/511443 # -# It is modified to be used in OpenLP (http://openlp.org) # +# Modified for use in OpenLP # ############################################################################### __version__ = u'1.1' diff --git a/openlp/core/ui/exceptiondialog.py b/openlp/core/ui/exceptiondialog.py index 22395af90..03bbde764 100644 --- a/openlp/core/ui/exceptiondialog.py +++ b/openlp/core/ui/exceptiondialog.py @@ -63,27 +63,27 @@ class Ui_ExceptionDialog(object): self.exceptionButtonBox.setStandardButtons(QtGui.QDialogButtonBox.Close) self.exceptionButtonBox.setObjectName(u'exceptionButtonBox') self.exceptionLayout.addWidget(self.exceptionButtonBox) - self.saveReportButton = QtGui.QPushButton(exceptionDialog) - self.saveReportButton.setIcon(build_icon(u':/general/general_save.png')) - self.saveReportButton.setObjectName(u'saveReportButton') - self.exceptionButtonBox.addButton(self.saveReportButton, - QtGui.QDialogButtonBox.ActionRole) self.sendReportButton = QtGui.QPushButton(exceptionDialog) self.sendReportButton.setIcon(build_icon( u':/general/general_email.png')) self.sendReportButton.setObjectName(u'sendReportButton') self.exceptionButtonBox.addButton(self.sendReportButton, QtGui.QDialogButtonBox.ActionRole) + self.saveReportButton = QtGui.QPushButton(exceptionDialog) + self.saveReportButton.setIcon(build_icon(u':/general/general_save.png')) + self.saveReportButton.setObjectName(u'saveReportButton') + self.exceptionButtonBox.addButton(self.saveReportButton, + QtGui.QDialogButtonBox.ActionRole) self.retranslateUi(exceptionDialog) QtCore.QObject.connect(self.exceptionButtonBox, QtCore.SIGNAL(u'accepted()'), exceptionDialog.accept) QtCore.QObject.connect(self.exceptionButtonBox, QtCore.SIGNAL(u'rejected()'), exceptionDialog.reject) - QtCore.QObject.connect(self.saveReportButton, - QtCore.SIGNAL(u'pressed()'), self.onSaveReportButtonPressed) QtCore.QObject.connect(self.sendReportButton, QtCore.SIGNAL(u'pressed()'), self.onSendReportButtonPressed) + QtCore.QObject.connect(self.saveReportButton, + QtCore.SIGNAL(u'pressed()'), self.onSaveReportButtonPressed) QtCore.QMetaObject.connectSlotsByName(exceptionDialog) def retranslateUi(self, exceptionDialog): @@ -95,7 +95,7 @@ class Ui_ExceptionDialog(object): 'developers, so please e-mail it to bugs@openlp.org, along with a ' 'detailed description of what you were doing when the problem ' 'occurred.')) - self.saveReportButton.setText(translate('OpenLP.ExceptionDialog', - 'Save Report to File')) self.sendReportButton.setText(translate('OpenLP.ExceptionDialog', - 'Send Report Mail')) + 'Send E-Mail')) + self.saveReportButton.setText(translate('OpenLP.ExceptionDialog', + 'Save to File')) diff --git a/resources/images/general_email.png b/resources/images/general_email.png index d1e9f2b647a6315fbbc0b1c30f87bdcb14e2c5a2..bb3cab8f309beb40436493078b9cc01283b8e53a 100644 GIT binary patch literal 833 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~&H|6fVxZ#d zAk65bF}ngN$X?><>&kwMQH)7Mw$lIh51^jq0X`wFKq&}dVq)S11DF7U21)@rjEsy3 zA#5y&G6Mqxh@`EpEs!y5)+_-5f!VWX$Hv8(nwd2;G;Ub8{^-$TFJHa-`0-;vP;g*S z@Snf`|Nj5~@83TO2`L%(IkIx{@}Beb!XV0E9Z^5e7>&{=eeEI6l zYgaGbx_kfjy@z)nK7R1%>4V2lA3l2a@bR-pk6%1~`uy38S1(?^dhzPbi&t-7yng%g z)w`Fk-@JP9h`~L06 zukYV~{P_9n$FDy>zkm7p>-W#!e}4V`^Bai%{QdnGi2nci^A{8>fB*gc_a6u@7|mD) z3{Cx#AirP+MkZ!94qkp?ITZtA3oC0Idj~g9FW=zk*u><_{QTmHlc&vJwd35qPv3z- z`tRStNf+CIS{akP-CcTexGy;aIX66A977~7Cnqp4nX#&tv8fzTx_epqc-I4C&Wsl? zGrJ59v+lSOm6bjF>Q2dpHGEI6+_P-Q4i#%tOU<2Uu3g;aHpg+1rmgK_CH?igR%jTjul8+nTxD#% z`{Kc~ch8-*w6WeD-Q~D!`GyU9m|1qM;^wYSkw~cyXwYe1V#76og+Zy*f$`>+IhjB| OGI+ZBxvX0b000?uMObuGZ)S9NVRB^vcXxL#X>MzCV_|S*E^l&Yo9;Xs0007TNkl$)Z`J$S2g%9JmbD3M4!u{h^&92b_wQFA{5fWR1V z_gV*t2*d>flL>Ry1##!fag$$Fw5KU?vj4`-mn*DmD0T$F&QrROfV3<`n(B;+0EkFC z3OgmtzRyAtN6-h{npp$$N*Nx;_vDM)F*F8hAOwdcgnya9mH}};Ph{xkdr_+#9;_SI@9BZ>N5IqdH>Va}O(Df0VInilb>vntk>a*vN z{yGc}4u6`_HO5$}R8ZB1l2b8Vy}eKb+1QBM*Na%2ewwt1F%mu>1ZQ}&uz*6Lfad0A zY;A3Ua}G<^BBwk01BWnhd1!x6I)to&(q1b=t&x$b511Y6L0haJ-H{;3^HBNp5$KM? zaTS&~wsE?pPU{Nd^AZYO=P^3H0$a64c$?TvEniOdBBZxF`Dz_|P}N0#d<+0HBR`%` zn&NdCJ#-A=N|eZ Date: Sun, 12 Dec 2010 00:54:07 +0100 Subject: [PATCH 109/140] Bible web import from Bibleserver.com - first version --- .../plugins/bibles/forms/bibleimportform.py | 31 ++++++- .../plugins/bibles/forms/bibleimportwizard.py | 3 + openlp/plugins/bibles/lib/http.py | 85 ++++++++++++++++++- 3 files changed, 115 insertions(+), 4 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 70a06fc0c..9bacd7fae 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -43,10 +43,12 @@ class WebDownload(object): Unknown = -1 Crosswalk = 0 BibleGateway = 1 + Bibleserver = 2 Names = { 0: u'Crosswalk', - 1: u'BibleGateway' + 1: u'BibleGateway', + 2: u'Bibleserver' } @classmethod @@ -230,8 +232,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): The index of the combo box. """ self.bibleComboBox.clear() - bibles = [unicode(translate('BiblesPlugin.ImportWizardForm', bible)) for - bible in self.web_bible_list[index].keys()] + bibles = self.web_bible_list[index].keys() bibles.sort() for bible in bibles: self.bibleComboBox.addItem(bible) @@ -383,6 +384,27 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): if books_file: books_file.close() + # Load and store Bibleserver Bibles. + filepath = AppLocation.get_directory(AppLocation.PluginsDir) + filepath = os.path.join(filepath, u'bibles', u'resources') + books_file = None + try: + self.web_bible_list[WebDownload.Bibleserver] = {} + books_file = open( + os.path.join(filepath, u'bibleserver.csv'), 'rb') + dialect = csv.Sniffer().sniff(books_file.read(1024)) + books_file.seek(0) + books_reader = csv.reader(books_file, dialect) + for line in books_reader: + ver = unicode(line[0], u'utf-8') + name = unicode(line[1], u'utf-8') + self.web_bible_list[WebDownload.Bibleserver][ver] = name.strip() + except IOError, UnicodeError: + log.exception(u'Bibelserver resources could not be imported') + finally: + if books_file: + books_file.close() + def getFileName(self, title, editbox): filename = QtGui.QFileDialog.getOpenFileName(self, title, SettingsManager.get_last_dir(self.bibleplugin.settingsSection, 1)) @@ -455,6 +477,9 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): elif download_location == WebDownload.BibleGateway: bible = \ self.web_bible_list[WebDownload.BibleGateway][bible_version] + elif download_location == WebDownload.Bibleserver: + bible = \ + self.web_bible_list[WebDownload.Bibleserver][bible_version] importer = self.manager.import_bible( BibleFormat.WebDownload, name=license_version, diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index 4f6e0f624..fbbba22bf 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -208,6 +208,7 @@ class Ui_BibleImportWizard(object): self.locationComboBox.setObjectName(u'LocationComboBox') self.locationComboBox.addItem(u'') self.locationComboBox.addItem(u'') + self.locationComboBox.addItem(u'') self.downloadOptionsLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.locationComboBox) self.bibleLabel = QtGui.QLabel(self.downloadOptionsTab) @@ -383,6 +384,8 @@ class Ui_BibleImportWizard(object): translate('BiblesPlugin.ImportWizardForm', 'Crosswalk')) self.locationComboBox.setItemText(1, translate('BiblesPlugin.ImportWizardForm', 'BibleGateway')) + self.locationComboBox.setItemText(2, + translate('BiblesPlugin.ImportWizardForm', 'Bibleserver')) self.bibleLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Bible:')) self.webDownloadTabWidget.setTabText( diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index dade3ad44..9ee445431 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -240,6 +240,87 @@ class BGExtract(object): return SearchResults(bookname, chapter, verse_list) +class BSExtract(object): + """ + Extract verses from Bibleserver.com + """ + def __init__(self,proxyurl=None): + log.debug(u'init %s', proxyurl) + self.proxyurl = proxyurl + + def get_bible_chapter(self, version, bookname, chapter): + """ + Access and decode bibles via http://m.Bibleserver.com + + ``version`` + The version of the bible like NIV for New International Version + + ``bookname`` + Text name of in english e.g. 'gen' for Genesis + + ``chapter`` + Chapter number + """ + print(bookname) + log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter) + bookindex = self._get_book_index(bookname) + if chapter < 10: + chapter_string = u'00' + unicode(chapter) + elif chapter < 100: + chapter_string = u'0' + unicode(chapter) + else: + chapter_string = unicode(chapter) + chapter_url = u'http://m.bibleserver.com/text/%s/%s%s000' % \ + (version, bookindex, chapter_string) + log.debug(u'URL: %s', chapter_url) + page = None + try: + page = urllib2.urlopen(chapter_url) + Receiver.send_message(u'openlp_process_events') + except urllib2.URLError: + log.exception(u'The web bible page could not be downloaded.') + finally: + if not page: + return None + soup = None + try: + soup = BeautifulSoup(page) + except HTMLParseError: + log.exception(u'BeautifulSoup could not parse the bible page.') + finally: + if not soup: + return None + Receiver.send_message(u'openlp_process_events') + content = soup.find(u'div', u'content').find(u'div').findAll(u'div') + verse_number = re.compile(r'v\d{5}(\d{3}) verse') + verses = {} + for verse in content: + Receiver.send_message(u'openlp_process_events') + versenumber = int(verse_number.sub(r'\1', verse[u'class'])) + verses[versenumber] = verse.contents[1].rstrip(u'\n') + return SearchResults(bookname, chapter, verses) + def _get_book_index(self, bookname): + print bookname + bookmap = {u'Gen': u'01', u'Exod': u'02', u'Lev': u'03', + u'Num': u'04', u'Deut': u'05', u'Josh': u'06', u'Judg': u'07', + u'Ruth': u'08', u'1Sam': u'09', u'2Sam': u'10', u'1Kgs': u'11', + u'2Kgs': u'12', u'1Chr': u'13', u'2Chr': u'14', u'Ezra': u'15', + u'Neh': u'16', u'Esth': u'17', u'Job': u'18', u'Ps': u'19', + u'Prov': u'20', u'Eccl': u'21', u'Song': u'22', u'Isa': u'23', + u'Jer': u'24', u'Lam': u'25', u'Ezek': u'26', u'Dan': u'27', + u'Hos': u'28', u'Joel': u'29', u'Amos': u'30', u'Obad': u'31', + u'Jonah': u'32', u'Mic': u'33', u'Nah': u'34', u'Hab': u'35', + u'Zeph': u'36', u'Hag': u'37', u'Zech': u'38', u'Mal': u'39', + u'Matt': u'40', u'Mark': u'41', u'Luke': u'42', u'John': u'43', + u'Acts': u'44', u'Rom': u'45', u'1Cor': u'46', u'2Cor': u'47', + u'Gal': u'48', u'Eph': u'49', u'Phil': u'50', u'Col': u'51', + u'1Thess':u'52', u'2Thess':u'53', u'1Tim': u'54', u'2Tim': u'55', + u'Titus': u'56', u'Phlm': u'57', u'Heb': u'58', u'Jas': u'59', + u'1Pet': u'60', u'2Pet': u'61', u'1John': u'62', u'2John':u'63', + u'3John': u'64', u'Jude': u'65', u'Rev': u'66'} + return bookmap[bookname] + + class CWExtract(object): """ Extract verses from CrossWalk/BibleStudyTools @@ -426,8 +507,10 @@ class HTTPBible(BibleDB): log.debug(u'source = %s', self.download_source) if self.download_source.lower() == u'crosswalk': ev = CWExtract(self.proxy_server) - else: + elif self.download_source.lower() == u'biblegateway': ev = BGExtract(self.proxy_server) + elif self.download_source.lower() == u'bibleserver': + ev = BSExtract(self.proxy_server) return ev.get_bible_chapter(self.download_name, book, chapter) def get_books(self): From fda30854492fb7a7ce886e3fd04a45c696dd03d6 Mon Sep 17 00:00:00 2001 From: M2j Date: Sun, 12 Dec 2010 01:03:51 +0100 Subject: [PATCH 110/140] resource added --- .../plugins/bibles/resources/bibleserver.csv | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 openlp/plugins/bibles/resources/bibleserver.csv diff --git a/openlp/plugins/bibles/resources/bibleserver.csv b/openlp/plugins/bibles/resources/bibleserver.csv new file mode 100644 index 000000000..cc0a843ce --- /dev/null +++ b/openlp/plugins/bibles/resources/bibleserver.csv @@ -0,0 +1,39 @@ +عربي, ARA +Bible, překlad 21. století, B21 +Bible du Semeur, BDS +Българската Библия, BLG +Český ekumenický překlad, CEP +Hrvatski, CRO +Священное Писание, CRS +Version La Biblia al Dia, CST +中文和合本(简体), CUVS +Bibelen på hverdagsdansk, DK +Rev. Elberfelder, ELB +Einheitsübersetzung, EU +Gute Nachricht Bibel, GNB +Hoffnung für alle, HFA +Hungarian, HUN +Het Boek, HTB +La Parola è Vita, ITA +IBS-fordítás (Új Károli), KAR +King James Version, KJV +Luther 1984, LUT +Septuaginta, LXX +Neue Genfer Übersetzung, NGÜ +New Int. Readers Version, NIRV +New International Version, NIV +Neues Leben, NL +En Levende Bok, NOR +Nádej pre kazdého, NPK +Noua traducere în limba românã, NTR +Nueva Versión Internacional, NVI +Hebrew OT, OT +Słowo Życia, POL +O Livro, PRT +Новый перевод на русский язык, RUS +Slovo na cestu, SNC +Schlachter 2000, SLT +En Levande Bok, SVL +Today's New International Version, TNIV +Türkçe, TR +Vulgata, VUL From 4a7300c6c08738de7aa54fe08f5be6efc6c2860c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 12 Dec 2010 08:35:02 +0000 Subject: [PATCH 111/140] Topic and Book Auto completion --- openlp/plugins/songs/forms/editsongform.py | 47 +++++++++++++--------- 1 file changed, 27 insertions(+), 20 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 59eae1160..b7f4a3f0b 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -61,14 +61,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.QObject.connect(self.AuthorsListView, QtCore.SIGNAL(u'itemClicked(QListWidgetItem*)'), self.onAuthorsListViewPressed) - QtCore.QObject.connect(self.AuthorsSelectionComboItem, - QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter) - QtCore.QObject.connect(self.AuthorsSelectionComboItem, - QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter) - QtCore.QObject.connect(self.ThemeSelectionComboItem, - QtCore.SIGNAL(u'activated(int)'), self.updateAuthorAutoCompleter) - QtCore.QObject.connect(self.ThemeSelectionComboItem, - QtCore.SIGNAL(u'activated(int)'), self.updateThemeAutoCompleter) QtCore.QObject.connect(self.TopicAddButton, QtCore.SIGNAL(u'clicked()'), self.onTopicAddButtonClicked) QtCore.QObject.connect(self.TopicRemoveButton, @@ -135,12 +127,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.AuthorsSelectionComboItem.setItemData( row, QtCore.QVariant(author.id)) self.authors.append(author.display_name) - self.updateAuthorAutoCompleter() - - def updateAuthorAutoCompleter(self): - """ - This updates the author completion list for the search field. - """ completer = QtGui.QCompleter(self.authors) completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.AuthorsSelectionComboItem.setCompleter(completer) @@ -149,19 +135,29 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): topics = self.manager.get_all_objects(Topic, order_by_ref=Topic.name) self.SongTopicCombo.clear() self.SongTopicCombo.addItem(u'') + self.topics = [] for topic in topics: row = self.SongTopicCombo.count() self.SongTopicCombo.addItem(topic.name) + self.topics.append(topic.name) self.SongTopicCombo.setItemData(row, QtCore.QVariant(topic.id)) + completer = QtGui.QCompleter(self.topics) + completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + self.SongTopicCombo.setCompleter(completer) def loadBooks(self): books = self.manager.get_all_objects(Book, order_by_ref=Book.name) self.SongbookCombo.clear() self.SongbookCombo.addItem(u'') + self.books = [] for book in books: row = self.SongbookCombo.count() self.SongbookCombo.addItem(book.name) + self.books.append(book.name) self.SongbookCombo.setItemData(row, QtCore.QVariant(book.id)) + completer = QtGui.QCompleter(self.books) + completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) + self.SongbookCombo.setCompleter(completer) def loadThemes(self, theme_list): self.ThemeSelectionComboItem.clear() @@ -170,12 +166,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): for theme in theme_list: self.ThemeSelectionComboItem.addItem(theme) self.themes.append(theme) - self.updateThemeAutoCompleter() - - def updateThemeAutoCompleter(self): - """ - This updates the theme completion list for the search field. - """ completer = QtGui.QCompleter(self.themes) completer.setCaseSensitivity(QtCore.Qt.CaseInsensitive) self.ThemeSelectionComboItem.setCompleter(completer) @@ -644,12 +634,29 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.saveSong(True): Receiver.send_message(u'songs_preview') + def clearCaches(self): + """ + Free up autocompletion memory on dialog exit + """ + self.authors = [] + self.themes = [] + self.books = [] + self.topics = [] + def closePressed(self): + """ + Exit Dialog and do not save + """ Receiver.send_message(u'songs_edit_clear') + self.clearCaches() self.close() def accept(self): + """ + Exit Dialog and save soong if valid + """ log.debug(u'accept') + self.clearCaches() if not self.song: self.song = Song() item = int(self.SongbookCombo.currentIndex()) From adb765f3fa74458dab2f8970859ac0b3fbaf0bd9 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 12 Dec 2010 11:33:33 +0100 Subject: [PATCH 112/140] fixed a bug, user feedback --- openlp/plugins/alerts/forms/alertform.py | 57 ++++++++++++++++++---- openlp/plugins/alerts/lib/alertsmanager.py | 4 +- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index 377a43f6c..20b225ebb 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -62,6 +62,9 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSingleClick) def loadList(self): + """ + Loads the list with alerts. + """ self.AlertListWidget.clear() alerts = self.manager.get_all_objects(AlertItem, order_by_ref=AlertItem.text) @@ -81,12 +84,16 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): self.close() def onDeleteClick(self): + """ + Deletes the selected item. + """ item = self.AlertListWidget.currentItem() if item: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] self.manager.delete_object(AlertItem, item_id) row = self.AlertListWidget.row(item) self.AlertListWidget.takeItem(row) + self.item_id = None self.AlertTextEdit.setText(u'') self.SaveButton.setEnabled(False) self.DeleteButton.setEnabled(False) @@ -96,8 +103,8 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): QtGui.QMessageBox.information(self, translate('AlertsPlugin.AlertForm', 'New Alert'), translate('AlertsPlugin.AlertForm', 'You haven\'t specified ' - 'any text for your alert. Please type in some text before ' - 'clicking New.')) + 'any text for your alert. Please type in some text before ' + 'clicking New.')) else: alert = AlertItem() alert.text = unicode(self.AlertTextEdit.text()) @@ -107,7 +114,7 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): def onSaveClick(self): """ - Save an alert + Save the alert, we are editing. """ if self.item_id: alert = self.manager.get_object(AlertItem, self.item_id) @@ -115,14 +122,14 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): self.manager.save_object(alert) self.item_id = None self.loadList() - else: - self.onNewClick() def onTextChanged(self): """ Enable save button when data has been changed by editing the form """ - self.SaveButton.setEnabled(True) + # Only enable the button, if we are editing an item. + if self.item_id: + self.SaveButton.setEnabled(True) def onDoubleClick(self): """ @@ -131,8 +138,8 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): items = self.AlertListWidget.selectedIndexes() for item in items: bitem = self.AlertListWidget.item(item.row()) - self.triggerAlert(bitem.text()) - self.AlertTextEdit.setText(bitem.text()) + self.triggerAlert(unicode(bitem.text())) + self.AlertTextEdit.setText(unicode(bitem.text())) self.item_id = (bitem.data(QtCore.Qt.UserRole)).toInt()[0] self.SaveButton.setEnabled(False) self.DeleteButton.setEnabled(True) @@ -145,13 +152,45 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): items = self.AlertListWidget.selectedIndexes() for item in items: bitem = self.AlertListWidget.item(item.row()) - self.AlertTextEdit.setText(bitem.text()) + self.AlertTextEdit.setText(unicode(bitem.text())) self.item_id = (bitem.data(QtCore.Qt.UserRole)).toInt()[0] + # If the alert does not contain '<>' we clear the ParameterEdit field. + if unicode(self.AlertTextEdit.text()).find(u'<>') == -1: + self.ParameterEdit.setText(u'') self.SaveButton.setEnabled(False) self.DeleteButton.setEnabled(True) def triggerAlert(self, text): + """ + Prepares the alert text for displaying. + + ``text`` + The alert text (unicode). + """ if text: + # The ParameterEdit field is not empty, but we have not found '<>' + # in the alert text. + if text.find(u'<>') != -1 and not self.ParameterEdit.text() and \ + QtGui.QMessageBox.question(self, translate( + 'AlertPlugin.AlertForm', 'No Parameter found'), + translate('AlertPlugin.AlertForm', 'You have not entered a ' + 'parameter to be replaced.\nDo you want to continue ' + 'anyway?'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | + QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No: + self.ParameterEdit.setFocus() + return False + # We found '<>' in the alert text, but the ParameterEdit field it + # empty. + elif text.find(u'<>') == -1 and self.ParameterEdit.text() and \ + QtGui.QMessageBox.question(self, translate( + 'AlertPlugin.AlertForm', 'No Placeholder found'), + translate('AlertPlugin.AlertForm', 'The alert text does not' + ' contain \'<>\'.\nDo want to continue anyway?'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | + QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No: + self.ParameterEdit.setFocus() + return False text = text.replace(u'<>', unicode(self.ParameterEdit.text())) self.parent.alertsmanager.displayAlert(text) return True diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index a418c6fec..0f2eb4ec7 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -86,7 +86,7 @@ class AlertsManager(QtCore.QObject): text = self.alertList.pop(0) alertTab = self.parent.alertsTab self.parent.liveController.display.alert(text) - # check to see if we have a timer running + # Check to see if we have a timer running. if self.timer_id == 0: self.timer_id = self.startTimer(int(alertTab.timeout) * 1000) @@ -94,9 +94,9 @@ class AlertsManager(QtCore.QObject): """ Time has finished so if our time then request the next Alert if there is one and reset the timer. + ``event`` the QT event that has been triggered. - """ log.debug(u'timer event') if event.timerId() == self.timer_id: From 90b806c6a481b6663ffddcc0f1555ec06cd24e1f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 12 Dec 2010 16:57:43 +0100 Subject: [PATCH 113/140] comment fix --- openlp/plugins/alerts/forms/alertform.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index 20b225ebb..ff5072560 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -168,8 +168,8 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): The alert text (unicode). """ if text: - # The ParameterEdit field is not empty, but we have not found '<>' - # in the alert text. + # We found '<>' in the alert text, but the ParameterEdit field is + # empty. if text.find(u'<>') != -1 and not self.ParameterEdit.text() and \ QtGui.QMessageBox.question(self, translate( 'AlertPlugin.AlertForm', 'No Parameter found'), @@ -180,8 +180,8 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No: self.ParameterEdit.setFocus() return False - # We found '<>' in the alert text, but the ParameterEdit field it - # empty. + # The ParameterEdit field is not empty, but we have not found '<>' + # in the alert text. elif text.find(u'<>') == -1 and self.ParameterEdit.text() and \ QtGui.QMessageBox.question(self, translate( 'AlertPlugin.AlertForm', 'No Placeholder found'), From d9768b6536f6d64cba63ac5bf53749d3b6b92b23 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 13 Dec 2010 15:24:16 +0100 Subject: [PATCH 114/140] whitespaces --- openlp/core/lib/mailto/__init__.py | 6 +-- openlp/core/ui/exceptionform.py | 4 +- openlp/plugins/bibles/lib/mediaitem.py | 2 +- openlp/plugins/images/imageplugin.py | 14 +++--- .../presentations/lib/impresscontroller.py | 12 ++--- .../presentations/lib/messagelistener.py | 4 +- .../presentations/lib/pptviewcontroller.py | 2 +- .../presentations/lib/presentationtab.py | 2 +- .../presentations/presentationplugin.py | 10 ++-- openlp/plugins/remotes/remoteplugin.py | 2 +- .../songs/forms/songmaintenanceform.py | 2 +- openlp/plugins/songs/lib/ewimport.py | 2 +- openlp/plugins/songs/lib/oooimport.py | 16 +++--- openlp/plugins/songs/lib/opensongimport.py | 4 +- openlp/plugins/songs/lib/sofimport.py | 50 +++++++++---------- openlp/plugins/songs/lib/songbeamerimport.py | 6 +-- scripts/openlp-remoteclient.py | 2 +- 17 files changed, 70 insertions(+), 70 deletions(-) mode change 100755 => 100644 scripts/openlp-remoteclient.py diff --git a/openlp/core/lib/mailto/__init__.py b/openlp/core/lib/mailto/__init__.py index 102c4c94a..9cfc319a8 100644 --- a/openlp/core/lib/mailto/__init__.py +++ b/openlp/core/lib/mailto/__init__.py @@ -300,13 +300,13 @@ def mailto(address, to=None, cc=None, bcc=None, subject=None, body=None, ``cc`` specify a recipient to be copied on the e-mail - ``bcc`` + ``bcc`` specify a recipient to be blindly copied on the e-mail - ``subject`` + ``subject`` specify a subject for the e-mail - ``body`` + ``body`` specify a body for the e-mail. Since the user will be able to make changes before actually sending the e-mail, this can be used to provide the user with a template for the e-mail text may contain linebreaks diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index 5fa0a7dd1..7ccf3fc4c 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -70,7 +70,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): def _createReport(self): openlp_version = self.parent().applicationVersion[u'full'] - traceback = unicode(self.exceptionTextEdit.toPlainText()) + traceback = unicode(self.exceptionTextEdit.toPlainText()) system = unicode(translate('OpenLP.ExceptionForm', 'Platform: %s\n')) % platform.platform() libraries = u'Python: %s\n' % platform.python_version() + \ @@ -89,7 +89,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): elif os.environ.get(u'GNOME_DESKTOP_SESSION_ID'): system = system + u'Desktop: GNOME\n' return (openlp_version, traceback, system, libraries) - + def onSaveReportButtonPressed(self): """ Saving exception log and system informations to a file. diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 949035c0b..339dac41f 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -875,7 +875,7 @@ class BibleMediaItem(MediaManagerItem): 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, second 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. diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index 5bcf75af0..a1e539799 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -75,42 +75,42 @@ class ImagePlugin(Plugin): ## Load Button ## self.textStrings[StringContent.Load] = { u'title': translate('ImagePlugin', 'Load'), - u'tooltip': translate('ImagePlugin', + u'tooltip': translate('ImagePlugin', 'Load a new Image') } ## New Button ## self.textStrings[StringContent.New] = { u'title': translate('ImagePlugin', 'Add'), - u'tooltip': translate('ImagePlugin', + u'tooltip': translate('ImagePlugin', 'Add a new Image') } ## Edit Button ## self.textStrings[StringContent.Edit] = { u'title': translate('ImagePlugin', 'Edit'), - u'tooltip': translate('ImagePlugin', + u'tooltip': translate('ImagePlugin', 'Edit the selected Image') } ## Delete Button ## self.textStrings[StringContent.Delete] = { u'title': translate('ImagePlugin', 'Delete'), - u'tooltip': translate('ImagePlugin', + u'tooltip': translate('ImagePlugin', 'Delete the selected Image') } ## Preview ## self.textStrings[StringContent.Preview] = { u'title': translate('ImagePlugin', 'Preview'), - u'tooltip': translate('ImagePlugin', + u'tooltip': translate('ImagePlugin', 'Preview the selected Image') } ## Live Button ## self.textStrings[StringContent.Live] = { u'title': translate('ImagePlugin', 'Live'), - u'tooltip': translate('ImagePlugin', + u'tooltip': translate('ImagePlugin', 'Send the selected Image live') } ## Add to service Button ## self.textStrings[StringContent.Service] = { u'title': translate('ImagePlugin', 'Service'), - u'tooltip': translate('ImagePlugin', + u'tooltip': translate('ImagePlugin', 'Add the selected Image to the service') } \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 69c9347f9..8f8e06734 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -48,7 +48,7 @@ else: uno_available = True except ImportError: uno_available = False - + from PyQt4 import QtCore from presentationcontroller import PresentationController, PresentationDocument @@ -210,12 +210,12 @@ class ImpressController(PresentationController): class ImpressDocument(PresentationDocument): """ Class which holds information and controls a single presentation - """ - + """ + def __init__(self, controller, presentation): """ - Constructor, store information about the file and initialise - """ + Constructor, store information about the file and initialise + """ log.debug(u'Init Presentation OpenOffice') PresentationDocument.__init__(self, controller, presentation) self.document = None @@ -287,7 +287,7 @@ class ImpressDocument(PresentationDocument): page = pages.getByIndex(idx) doc.getCurrentController().setCurrentPage(page) urlpath = u'%s/%s.png' % (thumbdirurl, unicode(idx + 1)) - path = os.path.join(self.get_temp_folder(), + path = os.path.join(self.get_temp_folder(), unicode(idx + 1) + u'.png') try: doc.storeToURL(urlpath, props) diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 6fd901a86..535744369 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -51,7 +51,7 @@ class Controller(object): def add_handler(self, controller, file, is_blank): """ - Add a handler, which is an instance of a presentation and + Add a handler, which is an instance of a presentation and slidecontroller combination. If the slidecontroller has a display then load the presentation. """ @@ -362,7 +362,7 @@ class MessageListener(object): def timeout(self): """ - The presentation may be timed or might be controlled by the + The presentation may be timed or might be controlled by the application directly, rather than through OpenLP. Poll occassionally to check which slide is currently displayed so the slidecontroller view can be updated diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index 54b09be32..281e647de 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -108,7 +108,7 @@ class PptviewDocument(PresentationDocument): """ def __init__(self, controller, presentation): """ - Constructor, store information about the file and initialise + Constructor, store information about the file and initialise """ log.debug(u'Init Presentation PowerPoint') PresentationDocument.__init__(self, controller, presentation) diff --git a/openlp/plugins/presentations/lib/presentationtab.py b/openlp/plugins/presentations/lib/presentationtab.py index a7b16cd5a..d1ebb570c 100644 --- a/openlp/plugins/presentations/lib/presentationtab.py +++ b/openlp/plugins/presentations/lib/presentationtab.py @@ -133,7 +133,7 @@ class PresentationTab(SettingsTab): self.settingsSection + u'/' + controller.name, QtCore.QVariant(QtCore.Qt.Checked)).toInt()[0]) self.OverrideAppCheckBox.setChecked(QtCore.QSettings().value( - self.settingsSection + u'/override app', + self.settingsSection + u'/override app', QtCore.QVariant(QtCore.Qt.Unchecked)).toInt()[0]) def save(self): diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 8ee3e2811..300314bde 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -163,30 +163,30 @@ class PresentationPlugin(Plugin): ## Load Button ## self.textStrings[StringContent.Load] = { u'title': translate('PresentationPlugin', 'Load'), - u'tooltip': translate('PresentationPlugin', + u'tooltip': translate('PresentationPlugin', 'Load a new Presentation') } ## Delete Button ## self.textStrings[StringContent.Delete] = { u'title': translate('PresentationPlugin', 'Delete'), - u'tooltip': translate('PresentationPlugin', + u'tooltip': translate('PresentationPlugin', 'Delete the selected Presentation') } ## Preview ## self.textStrings[StringContent.Preview] = { u'title': translate('PresentationPlugin', 'Preview'), - u'tooltip': translate('PresentationPlugin', + u'tooltip': translate('PresentationPlugin', 'Preview the selected Presentation') } ## Live Button ## self.textStrings[StringContent.Live] = { u'title': translate('PresentationPlugin', 'Live'), - u'tooltip': translate('PresentationPlugin', + u'tooltip': translate('PresentationPlugin', 'Send the selected Presentation live') } ## Add to service Button ## self.textStrings[StringContent.Service] = { u'title': translate('PresentationPlugin', 'Service'), - u'tooltip': translate('PresentationPlugin', + u'tooltip': translate('PresentationPlugin', 'Add the selected Presentation to the service') } diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index 4302486a3..fe2776802 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -77,7 +77,7 @@ class RemotesPlugin(Plugin): 'a running version of OpenLP on a different computer via a web ' 'browser or through the remote API.') return about_text - + def setPluginTextStrings(self): """ Called to define all translatable texts of the plugin diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py index e057bb516..f004ef026 100644 --- a/openlp/plugins/songs/forms/songmaintenanceform.py +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -411,7 +411,7 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog): """ existing_author = self.manager.get_object_filtered(Author, and_(Author.first_name == old_author.first_name, - Author.last_name == old_author.last_name, + Author.last_name == old_author.last_name, Author.display_name == old_author.display_name)) songs = self.manager.get_all_objects(Song, Song.authors.contains(old_author)) diff --git a/openlp/plugins/songs/lib/ewimport.py b/openlp/plugins/songs/lib/ewimport.py index cb360cf59..6b9b675c5 100644 --- a/openlp/plugins/songs/lib/ewimport.py +++ b/openlp/plugins/songs/lib/ewimport.py @@ -41,7 +41,7 @@ def strip_rtf(blob, encoding): control_word = [] for c in blob: if control: - # for delimiters, set control to False + # for delimiters, set control to False if c == '{': if len(control_word) > 0: depth += 1 diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py index 26a0abfcc..727af2c7b 100644 --- a/openlp/plugins/songs/lib/oooimport.py +++ b/openlp/plugins/songs/lib/oooimport.py @@ -46,7 +46,7 @@ else: class OooImport(SongImport): """ - Import songs from Impress/Powerpoint docs using Impress + Import songs from Impress/Powerpoint docs using Impress """ def __init__(self, master_manager, **kwargs): """ @@ -122,7 +122,7 @@ class OooImport(SongImport): manager = ctx.ServiceManager self.desktop = manager.createInstanceWithContext( "com.sun.star.frame.Desktop", ctx) - + def start_ooo_process(self): try: if os.name == u'nt': @@ -168,11 +168,11 @@ class OooImport(SongImport): u'Processing file ' + filepath, 0) except: pass - return + return def close_ooo_file(self): """ - Close file. + Close file. """ self.document.close(True) self.document = None @@ -187,7 +187,7 @@ class OooImport(SongImport): def process_pres(self): """ Process the file - """ + """ doc = self.document slides = doc.getDrawPages() text = u'' @@ -195,7 +195,7 @@ class OooImport(SongImport): if self.abort: self.import_wizard.incrementProgressBar(u'Import cancelled', 0) return - slide = slides.getByIndex(slide_no) + slide = slides.getByIndex(slide_no) slidetext = u'' for idx in range(slide.getCount()): shape = slide.getByIndex(idx) @@ -209,12 +209,12 @@ class OooImport(SongImport): songs = SongImport.process_songs_text(self.manager, text) for song in songs: song.finish() - return + return def process_doc(self): """ Process the doc file, a paragraph at a time - """ + """ text = u'' paragraphs = self.document.getText().createEnumeration() while paragraphs.hasMoreElements(): diff --git a/openlp/plugins/songs/lib/opensongimport.py b/openlp/plugins/songs/lib/opensongimport.py index 47f4ecee5..767fc012a 100644 --- a/openlp/plugins/songs/lib/opensongimport.py +++ b/openlp/plugins/songs/lib/opensongimport.py @@ -249,7 +249,7 @@ class OpenSongImport(SongImport): words = thisline[1:].strip() if words is None: words = thisline - if not versenum: + if not versenum: versenum = u'1' if versenum is not None: versetag = u'%s%s' % (versetype, versenum) @@ -298,7 +298,7 @@ class OpenSongImport(SongImport): for tag in order: if tag[0].isdigit(): # Assume it's a verse if it has no prefix - tag = u'V' + tag + tag = u'V' + tag elif not re.search('\d+', tag): # Assume it's no.1 if there's no digits tag = tag + u'1' diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index ab91e1923..b9cd428c0 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -56,13 +56,13 @@ class SofImport(OooImport): """ Import songs provided on disks with the Songs of Fellowship music books VOLS1_2.RTF, sof3words.rtf and sof4words.rtf - + Use OpenOffice.org Writer for processing the rtf file - The three books are not only inconsistant with each other, they are + The three books are not only inconsistant with each other, they are inconsistant in themselves too with their formatting. Not only this, but the 1+2 book does not space out verses correctly. This script attempts - to sort it out, but doesn't get it 100% right. But better than having to + to sort it out, but doesn't get it 100% right. But better than having to type them all out! It attempts to detect italiced verses, and treats these as choruses in @@ -96,7 +96,7 @@ class SofImport(OooImport): def process_sof_file(self): """ Process the RTF file, a paragraph at a time - """ + """ self.blanklines = 0 self.new_song() paragraphs = self.document.getText().createEnumeration() @@ -113,11 +113,11 @@ class SofImport(OooImport): def process_paragraph(self, paragraph): """ - Process a paragraph. + Process a paragraph. In the first book, a paragraph is a single line. In the latter ones they may contain multiple lines. Each paragraph contains textportions. Each textportion has it's own - styling, e.g. italics, bold etc. + styling, e.g. italics, bold etc. Also check for page breaks, which indicates a new song in books 1+2. In later books, there may not be line breaks, so check for 3 or more newlines @@ -136,7 +136,7 @@ class SofImport(OooImport): self.new_song() text = u'' self.process_paragraph_text(text) - + def process_paragraph_text(self, text): """ Split the paragraph text into multiple lines and process @@ -147,12 +147,12 @@ class SofImport(OooImport): self.new_song() def process_paragraph_line(self, text): - """ + """ Process a single line. Throw away that text which isn't relevant, i.e. stuff that appears at the end of the song. Anything that is OK, append to the current verse """ - text = text.strip() + text = text.strip() if text == u'': self.blanklines += 1 if self.blanklines > 1: @@ -164,7 +164,7 @@ class SofImport(OooImport): if self.skip_to_close_bracket: if text.endswith(u')'): self.skip_to_close_bracket = False - return + return if text.startswith(u'CCL Licence'): self.italics = False return @@ -264,7 +264,7 @@ class SofImport(OooImport): """ Add the author. OpenLP stores them individually so split by 'and', '&' and comma. - However need to check for "Mr and Mrs Smith" and turn it to + However need to check for "Mr and Mrs Smith" and turn it to "Mr Smith" and "Mrs Smith". """ text = text.replace(u' and ', u' & ') @@ -276,7 +276,7 @@ class SofImport(OooImport): we're beyond the second line of first verse, then this indicates a change of verse. Italics are a chorus """ - if self.italics != self.is_chorus and ((len(self.song.verses) > 0) or + if self.italics != self.is_chorus and ((len(self.song.verses) > 0) or (self.currentverse.count(u'\n') > 1)): self.finish_verse() if self.italics: @@ -307,7 +307,7 @@ class SofImport(OooImport): ln = 0 if line: verse = line + u'\n' - else: + else: verse = u'' else: verse += line + u'\n' @@ -320,34 +320,34 @@ class SofImport(OooImport): def uncap_text(self, text): - """ + """ Words in the title are in all capitals, so we lowercase them. - However some of these words, e.g. referring to God need a leading + However some of these words, e.g. referring to God need a leading capital letter. - - There is a complicated word "One", which is sometimes lower and + + There is a complicated word "One", which is sometimes lower and sometimes upper depending on context. Never mind, keep it lower. """ textarr = re.split(u'(\W+)', text) textarr[0] = textarr[0].capitalize() for i in range(1, len(textarr)): # Do not translate these. Fixed strings in SOF song file - if textarr[i] in (u'JESUS', u'CHRIST', u'KING', u'ALMIGHTY', - u'REDEEMER', u'SHEPHERD', u'SON', u'GOD', u'LORD', u'FATHER', - u'HOLY', u'SPIRIT', u'LAMB', u'YOU', u'YOUR', u'I', u'I\'VE', - u'I\'M', u'I\'LL', u'SAVIOUR', u'O', u'YOU\'RE', u'HE', u'HIS', - u'HIM', u'ZION', u'EMMANUEL', u'MAJESTY', u'JESUS\'', u'JIREH', - u'JUDAH', u'LION', u'LORD\'S', u'ABRAHAM', u'GOD\'S', + if textarr[i] in (u'JESUS', u'CHRIST', u'KING', u'ALMIGHTY', + u'REDEEMER', u'SHEPHERD', u'SON', u'GOD', u'LORD', u'FATHER', + u'HOLY', u'SPIRIT', u'LAMB', u'YOU', u'YOUR', u'I', u'I\'VE', + u'I\'M', u'I\'LL', u'SAVIOUR', u'O', u'YOU\'RE', u'HE', u'HIS', + u'HIM', u'ZION', u'EMMANUEL', u'MAJESTY', u'JESUS\'', u'JIREH', + u'JUDAH', u'LION', u'LORD\'S', u'ABRAHAM', u'GOD\'S', u'FATHER\'S', u'ELIJAH'): textarr[i] = textarr[i].capitalize() else: textarr[i] = textarr[i].lower() text = u''.join(textarr) return text - + def verse_splits(self, song_number): """ - Because someone at Kingsway forgot to check the 1+2 RTF file, + Because someone at Kingsway forgot to check the 1+2 RTF file, some verses were not formatted correctly. """ if song_number == 11: diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index 30d29c1be..f45fcc268 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -24,7 +24,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`songbeamerimport` module provides the functionality for importing +The :mod:`songbeamerimport` module provides the functionality for importing SongBeamer songs into the OpenLP database. """ import logging @@ -90,7 +90,7 @@ class SongBeamerImport(SongImport): len(self.import_source)) for file in self.import_source: # TODO: check that it is a valid SongBeamer file - self.current_verse = u'' + self.current_verse = u'' self.current_verse_type = u'V' read_verses = False self.file_name = os.path.split(file)[1] @@ -115,7 +115,7 @@ class SongBeamerImport(SongImport): self.replace_html_tags() self.add_verse(self.current_verse, self.current_verse_type) - self.current_verse = u'' + self.current_verse = u'' self.current_verse_type = u'V' read_verses = True verse_start = True diff --git a/scripts/openlp-remoteclient.py b/scripts/openlp-remoteclient.py old mode 100755 new mode 100644 index 9d047d478..34fef44a8 --- a/scripts/openlp-remoteclient.py +++ b/scripts/openlp-remoteclient.py @@ -47,7 +47,7 @@ def main(): help="Recipient address ", default="localhost") parser.add_option("-e", "--event", - help="Action to be performed", + help="Action to be performed", default="alerts_text") parser.add_option("-m", "--message", help="Message to be passed for the action", From 6e834900e680d151b27387aa31794f9336924af6 Mon Sep 17 00:00:00 2001 From: M2j Date: Mon, 13 Dec 2010 20:06:07 +0100 Subject: [PATCH 115/140] rewritten bible reference parser with more features and localisation capabilities (first, untested version) --- openlp/plugins/bibles/lib/__init__.py | 108 ++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py index a6fc03045..a1845c0b9 100644 --- a/openlp/plugins/bibles/lib/__init__.py +++ b/openlp/plugins/bibles/lib/__init__.py @@ -32,6 +32,114 @@ import re log = logging.getLogger(__name__) +BIBLE_SEPARATORS = {u'sep_v': r'\s*,\s*', u'sep_r': r'\s*-\s*', u'sep_l': r'\.'} + +BIBLE_RANGE_REGEX = str(r'(?:(?P[0-9]+)%(sep_v)s)?' + r'(?P[0-9]+)(?:%(sep_r)s(?:(?:(?P[0-9]+)%(sep_v)s)?' + r'(?P[0-9]+))?)?' % BIBLE_SEPARATORS) + +BIBLE_RANGE = re.compile(r'^\s*' + BIBLE_RANGE_REGEX + r'\s*$', re.UNICODE) + +BIBLE_REFERENCE_NG = re.compile(str(r'^\s*?(?P[\d]*[^\d]+)\s*?' + r'(?P(?:' + BIBLE_RANGE_REGEX + r'(?:%(sep_l)s|(?=\s*\n)))+)\s*$') % + BIBLE_SEPARATORS, re.UNICODE) + +def parse_reference_ng(reference): + """ + This is the next generation über-awesome function that takes a person's + typed in string and converts it to a reference list, a list of references to + be queried from the Bible database files. + + The ``BIBLE_RANGE`` regular expression produces match groups for verse range + declarations: + + 1. ``(?:(?P[0-9]+)%(sep_v)s)?' + It starts with a optional chapter reference ``from_chapter`` followed by + a verse separator. + 2. ``(?P[0-9]+)`` + The verse reference ``from_verse`` is manditory + ``(?:%(sep_r)s(?:`` ... ``)?)?`` + A range declaration is optional. It starts with a range seperator and + contains a optional chapter and verse declaration + 3. ``(?:(?P[0-9]+)%(sep_v)s)?`` + The ``to_chapter`` reference with seperator is equivalent to group 1. + 4. ``(?P[0-9]+)?)?`` + The ``to_verse`` reference is equivalent to group 2. + + The ``BIBLE_REFERENCE`` regular expression produces matched groups for the + whole reference string: + + 1. ``\s*?(?P[\d]*[^\d]+)\s*?`` + The ``book`` group starts with the first non-whitespace character. There + are optional leading digits followed by non-digits. The group ends + before the whitspace in front of the next digit. + 2. ``(?P(?:`` + BIBLE_RANGE_REGEX + + ``(?:%(sep_l)s|(?=\s*\\n)))+)\s*$`` + The sechon group contains all ``ranges``. This can be multiple + declarations of a BIBLE_RANGE separated by a list separator. + + ``BIBLE_SEPARATORS`` is a dict which defines the separator formats. It might + be used to localize the bible references. + + The reference list is a list of tuples, with each tuple structured like + this:: + + (book, chapter, from_verse, to_verse) + + ``reference`` + The bible reference to parse. + + Returns None or a reference list. + """ + + log.debug('parse_reference("%s")', reference) + if u'' in reference: + return + ref_list = [] + match = BIBLE_REFERENCE_NG.match(reference) + if match: + log.debug(u'Matched reference %s' % reference) + book = match.group(u'book') + ranges = match.group(u'ranges').split(r'\s*\.\s*') + chapter = 0 + for this_range in ranges: + range_match = BIBLE_RANGE.match(this_range) + from_chapter = int(u'0' + range_match.group('from_chapter')) + from_verse = int(u'0' + range_match.group('from_verse')) + to_chapter = int(u'0' + range_match.group('to_chapter')) + to_verse = int(u'0' + range_match.group('to_verse')) + # First reference has to be a chapter + if not unified_ref_list: + if not from_chapter: + from_chapter = from_verse + from_verse = 1 + # Fill missing chapter references with the last chapter + if from_chapter: + chapter = from_chapter + else: + from_chapter = chapter + if not from_verse: + from_verse = 1 + if to_chapter: + if to_chapter > from_chapter: + ref_list.append((book, from_chapter, from_verse, -1)) + for i in range(from_chapter + 1, to_chapter -1): + ref_list.append((book, i, 1, -1)) + ref_list.append((book, to_chapter, 1, to_verse)) + else: + if to_verse < from_verse: + to_verse = from_verse + ref_list.append((book, from_chapter, from_verse, to_verse)) + else: + if to_verse < from_verse: + to_verse = from_verse + ref_list.append((book, from_chapter, from_verse, to_verse)) + else: + log.debug(u'Invalid reference: %s' % reference) + return None + return ref_list + + BIBLE_REFERENCE = re.compile( r'^([\w ]+?) *([0-9]+)' # Initial book and chapter r'(?: *[:|v|V] *([0-9]+))?' # Verse for first chapter From d848dedb792145b0b9fb1496965fd4ac35da6548 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 14 Dec 2010 20:22:01 +0000 Subject: [PATCH 116/140] Fix custom edit bug Fixes: https://launchpad.net/bugs/690335 --- openlp/plugins/custom/forms/editcustomform.py | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index c5281574b..01749b040 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -224,27 +224,27 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): ``edit_all`` Indicates if all slides or only one slide has been edited. """ - if len(slides) == 1: - self.slideListView.currentItem().setText(slides[0]) +# if len(slides) == 1: +# self.slideListView.currentItem().setText(unicode(slides[0])) +# else: + if edit_all: + self.slideListView.clear() + for slide in slides: + self.slideListView.addItem(slide) else: - if edit_all: - self.slideListView.clear() - for slide in slides: - self.slideListView.addItem(slide) - else: - old_slides = [] - old_row = self.slideListView.currentRow() - # Create a list with all (old/unedited) slides. - old_slides = [self.slideListView.item(row).text() for row in \ - range(0, self.slideListView.count())] - self.slideListView.clear() - old_slides.pop(old_row) - # Insert all slides to make the old_slides list complete. - for slide in slides: - old_slides.insert(old_row, slide) - for slide in old_slides: - self.slideListView.addItem(slide) - self.slideListView.repaint() + old_slides = [] + old_row = self.slideListView.currentRow() + # Create a list with all (old/unedited) slides. + old_slides = [self.slideListView.item(row).text() for row in \ + range(0, self.slideListView.count())] + self.slideListView.clear() + old_slides.pop(old_row) + # Insert all slides to make the old_slides list complete. + for slide in slides: + old_slides.insert(old_row, slide) + for slide in old_slides: + self.slideListView.addItem(slide) + self.slideListView.repaint() def onDeleteButtonPressed(self): self.slideListView.takeItem(self.slideListView.currentRow()) From b9a97dd6511cb46d2e39ff3e9e0b39ab21324969 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 14 Dec 2010 20:22:57 +0000 Subject: [PATCH 117/140] Remove comments --- openlp/plugins/custom/forms/editcustomform.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 01749b040..359cc9eae 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -224,9 +224,6 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): ``edit_all`` Indicates if all slides or only one slide has been edited. """ -# if len(slides) == 1: -# self.slideListView.currentItem().setText(unicode(slides[0])) -# else: if edit_all: self.slideListView.clear() for slide in slides: From 0e1383c35d2d7fbcdade859141c8d8a1bad5180a Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 15 Dec 2010 20:22:25 +0100 Subject: [PATCH 118/140] clean ups --- openlp/core/ui/filerenamedialog.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/openlp/core/ui/filerenamedialog.py b/openlp/core/ui/filerenamedialog.py index 02eefe7ed..4b1cf9411 100644 --- a/openlp/core/ui/filerenamedialog.py +++ b/openlp/core/ui/filerenamedialog.py @@ -30,23 +30,23 @@ from openlp.core.lib import translate class Ui_FileRenameDialog(object): def setupUi(self, FileRenameDialog): - FileRenameDialog.setObjectName("FileRenameDialog") + FileRenameDialog.setObjectName(u'FileRenameDialog') FileRenameDialog.resize(400, 87) self.buttonBox = QtGui.QDialogButtonBox(FileRenameDialog) self.buttonBox.setGeometry(QtCore.QRect(210, 50, 171, 25)) self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel | QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName("buttonBox") + self.buttonBox.setObjectName(u'buttonBox') self.widget = QtGui.QWidget(FileRenameDialog) self.widget.setGeometry(QtCore.QRect(10, 10, 381, 35)) - self.widget.setObjectName("widget") + self.widget.setObjectName(u'widget') self.horizontalLayout = QtGui.QHBoxLayout(self.widget) - self.horizontalLayout.setObjectName("horizontalLayout") + self.horizontalLayout.setObjectName(u'horizontalLayout') self.FileRenameLabel = QtGui.QLabel(self.widget) - self.FileRenameLabel.setObjectName("FileRenameLabel") + self.FileRenameLabel.setObjectName(u'FileRenameLabel') self.horizontalLayout.addWidget(self.FileRenameLabel) self.FileNameEdit = QtGui.QLineEdit(self.widget) - self.FileNameEdit.setObjectName("FileNameEdit") + self.FileNameEdit.setObjectName(u'FileNameEdit') self.horizontalLayout.addWidget(self.FileNameEdit) self.retranslateUi(FileRenameDialog) @@ -57,4 +57,3 @@ class Ui_FileRenameDialog(object): 'File Rename')) self.FileRenameLabel.setText(translate('OpenLP.FileRenameForm', 'New File Name:')) - From 58a4d04980aa27cf9985447afaac1de97397697d Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 16 Dec 2010 14:16:53 +0100 Subject: [PATCH 119/140] white spaces --- openlp/plugins/songs/lib/cclifileimport.py | 8 ++--- openlp/plugins/songs/lib/sofimport.py | 4 +-- .../songs/lib/test/test_opensongimport.py | 32 +++++++++---------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py index 3b6019e5f..88b9a8569 100644 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -197,7 +197,7 @@ class CCLIFileImport(SongImport): verse_text = verse_lines[1] elif verse_lines[0].startswith(u'('): verse_type = u'O' - verse_text = verse_lines[1] + verse_text = verse_lines[1] if len(verse_text) > 0: self.add_verse(verse_text, verse_type) check_first_verse_line = False @@ -303,13 +303,13 @@ class CCLIFileImport(SongImport): verse_type = u'P' elif line.startswith(u'(BRIDGE'): verse_type = u'B' - # Handle all other misc types + # Handle all other misc types elif line.startswith(u'('): verse_type = u'O' else: - verse_text = verse_text + line + verse_text = verse_text + line check_first_verse_line = False - else: + else: # We have verse content or the start of the # last part. Add l so as to keep the CRLF verse_text = verse_text + line diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index b9cd428c0..320e5c88a 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -369,7 +369,7 @@ class SofImport(OooImport): if song_number == 50: return 8 if song_number == 70: - return 4 + return 4 if song_number == 75: return 8 if song_number == 79: @@ -529,7 +529,7 @@ class SofImport(OooImport): if song_number == 955: return 9 if song_number == 968: - return 8 + return 8 if song_number == 972: return 7 if song_number == 974: diff --git a/openlp/plugins/songs/lib/test/test_opensongimport.py b/openlp/plugins/songs/lib/test/test_opensongimport.py index b503c65c5..27c7cca48 100644 --- a/openlp/plugins/songs/lib/test/test_opensongimport.py +++ b/openlp/plugins/songs/lib/test/test_opensongimport.py @@ -56,11 +56,11 @@ def test(): assert o.title == u'Martins Test' assert o.alternate_title == u'' assert o.song_number == u'1' - assert [u'C1', u'Chorus 1'] in o.verses - assert [u'C2', u'Chorus 2'] in o.verses - assert not [u'C3', u'Chorus 3'] in o.verses - assert [u'B1', u'Bridge 1\nBridge 1 line 2'] in o.verses - assert [u'V1', u'v1 Line 1\nV1 Line 2'] in o.verses + assert [u'C1', u'Chorus 1'] in o.verses + assert [u'C2', u'Chorus 2'] in o.verses + assert not [u'C3', u'Chorus 3'] in o.verses + assert [u'B1', u'Bridge 1\nBridge 1 line 2'] in o.verses + assert [u'V1', u'v1 Line 1\nV1 Line 2'] in o.verses assert [u'V2', u'v2 Line 1\nV2 Line 2'] in o.verses assert [u'V3A', u'V3 Line 1\nV3 Line 2'] in o.verses assert [u'RAP1', u'Rap 1 Line 1\nRap 1 Line 2'] in o.verses @@ -80,11 +80,11 @@ def test(): assert o.title == u'Martins Test' assert o.alternate_title == u'' assert o.song_number == u'1' - assert [u'B1', u'Bridge 1\nBridge 1 line 2'] in o.verses - assert [u'C1', u'Chorus 1'] in o.verses - assert [u'C2', u'Chorus 2'] in o.verses - assert not [u'C3', u'Chorus 3'] in o.verses - assert [u'V1', u'v1 Line 1\nV1 Line 2'] in o.verses + assert [u'B1', u'Bridge 1\nBridge 1 line 2'] in o.verses + assert [u'C1', u'Chorus 1'] in o.verses + assert [u'C2', u'Chorus 2'] in o.verses + assert not [u'C3', u'Chorus 3'] in o.verses + assert [u'V1', u'v1 Line 1\nV1 Line 2'] in o.verses assert [u'V2', u'v2 Line 1\nV2 Line 2'] in o.verses print o.verse_order_list assert o.verse_order_list == [u'V1', u'C1', u'V2', u'C2', u'V3', u'B1', u'V1'] @@ -99,11 +99,11 @@ def test(): assert o.alternate_title == u'' assert o.song_number == u'2' print o.verses - assert [u'B1', u'Bridge 1\nBridge 1 line 2'] in o.verses - assert [u'C1', u'Chorus 1'] in o.verses - assert [u'C2', u'Chorus 2'] in o.verses - assert not [u'C3', u'Chorus 3'] in o.verses - assert [u'V1', u'v1 Line 1\nV1 Line 2'] in o.verses + assert [u'B1', u'Bridge 1\nBridge 1 line 2'] in o.verses + assert [u'C1', u'Chorus 1'] in o.verses + assert [u'C2', u'Chorus 2'] in o.verses + assert not [u'C3', u'Chorus 3'] in o.verses + assert [u'V1', u'v1 Line 1\nV1 Line 2'] in o.verses assert [u'V2', u'v2 Line 1\nV2 Line 2'] in o.verses print o.verse_order_list assert o.verse_order_list == [u'V1', u'V2', u'B1', u'C1', u'C2'] @@ -120,7 +120,7 @@ def test(): assert o.verse_order_list == [u'V1'] assert o.topics == [u'Worship: Declaration'] print o.verses[0] - assert [u'V1', u'Line 1\nLine 2'] in o.verses + assert [u'V1', u'Line 1\nLine 2'] in o.verses print "Tests passed" From 4e9d6370b3bf2d6e0bd7683e974b0ae15763a087 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 16 Dec 2010 17:08:10 +0100 Subject: [PATCH 120/140] clean up --- openlp/core/ui/filerenamedialog.py | 14 +++++++------- openlp/core/ui/thememanager.py | 8 ++++---- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/openlp/core/ui/filerenamedialog.py b/openlp/core/ui/filerenamedialog.py index 4b1cf9411..600027940 100644 --- a/openlp/core/ui/filerenamedialog.py +++ b/openlp/core/ui/filerenamedialog.py @@ -42,12 +42,12 @@ class Ui_FileRenameDialog(object): self.widget.setObjectName(u'widget') self.horizontalLayout = QtGui.QHBoxLayout(self.widget) self.horizontalLayout.setObjectName(u'horizontalLayout') - self.FileRenameLabel = QtGui.QLabel(self.widget) - self.FileRenameLabel.setObjectName(u'FileRenameLabel') - self.horizontalLayout.addWidget(self.FileRenameLabel) - self.FileNameEdit = QtGui.QLineEdit(self.widget) - self.FileNameEdit.setObjectName(u'FileNameEdit') - self.horizontalLayout.addWidget(self.FileNameEdit) + self.fileRenameLabel = QtGui.QLabel(self.widget) + self.fileRenameLabel.setObjectName(u'fileRenameLabel') + self.horizontalLayout.addWidget(self.fileRenameLabel) + self.fileNameEdit = QtGui.QLineEdit(self.widget) + self.fileNameEdit.setObjectName(u'fileNameEdit') + self.horizontalLayout.addWidget(self.fileNameEdit) self.retranslateUi(FileRenameDialog) QtCore.QMetaObject.connectSlotsByName(FileRenameDialog) @@ -55,5 +55,5 @@ class Ui_FileRenameDialog(object): def retranslateUi(self, FileRenameDialog): FileRenameDialog.setWindowTitle(translate('OpenLP.FileRenameForm', 'File Rename')) - self.FileRenameLabel.setText(translate('OpenLP.FileRenameForm', + self.fileRenameLabel.setText(translate('OpenLP.FileRenameForm', 'New File Name:')) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index b6e8c3d7a..0b0d8281d 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -225,10 +225,10 @@ class ThemeManager(QtGui.QWidget): """ item = self.themeListWidget.currentItem() oldThemeName = unicode(item.data(QtCore.Qt.UserRole).toString()) - self.fileRenameForm.FileNameEdit.setText(oldThemeName) + self.fileRenameForm.fileNameEdit.setText(oldThemeName) self.saveThemeName = u'' if self.fileRenameForm.exec_(): - newThemeName = unicode(self.fileRenameForm.FileNameEdit.text()) + newThemeName = unicode(self.fileRenameForm.fileNameEdit.text()) oldThemeData = self.getThemeData(oldThemeName) self.deleteTheme(oldThemeName) self.cloneThemeData(oldThemeData, newThemeName) @@ -239,10 +239,10 @@ class ThemeManager(QtGui.QWidget): """ item = self.themeListWidget.currentItem() oldThemeName = unicode(item.data(QtCore.Qt.UserRole).toString()) - self.fileRenameForm.FileNameEdit.setText(oldThemeName) + self.fileRenameForm.fileNameEdit.setText(oldThemeName) self.saveThemeName = u'' if self.fileRenameForm.exec_(): - newThemeName = unicode(self.fileRenameForm.FileNameEdit.text()) + newThemeName = unicode(self.fileRenameForm.fileNameEdit.text()) themeData = self.getThemeData(oldThemeName) self.cloneThemeData(themeData, newThemeName) self.loadThemes() From ff9887039180f3e8e9f4b3b385d990389fd98b44 Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 16 Dec 2010 18:11:02 +0100 Subject: [PATCH 121/140] - bible imports broken by variable renaming - removed tab indentation --- openlp/core/ui/exceptionform.py | 2 +- openlp/plugins/bibles/lib/http.py | 2 +- openlp/plugins/bibles/lib/osis.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index 7ccf3fc4c..cc66f21d7 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -138,6 +138,6 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog): if re.search(r'[/\\]openlp[/\\]', line): source = re.sub(r'.*[/\\]openlp[/\\](.*)".*', r'\1', line) if u':' in line: - exception = line.split(u'\n')[-1].split(u':')[0] + exception = line.split(u'\n')[-1].split(u':')[0] subject = u'Bug report: %s in %s' % (exception, source) mailto(address=u'bugs@openlp.org', subject=subject, body=body % content) diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index dade3ad44..099cb1706 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -350,7 +350,7 @@ class HTTPBible(BibleDB): Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on failure. """ - self.wizard.ImportProgressBar.setMaximum(2) + self.wizard.importProgressBar.setMaximum(2) self.wizard.incrementProgressBar('Registering bible...') self.create_meta(u'download source', self.download_source) self.create_meta(u'download name', self.download_name) diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 53a6f152c..f39a4ab0f 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -134,9 +134,9 @@ class OSISBible(BibleDB): testament) if last_chapter == 0: if book == u'Gen': - self.wizard.ImportProgressBar.setMaximum(1188) + self.wizard.importProgressBar.setMaximum(1188) else: - self.wizard.ImportProgressBar.setMaximum(260) + self.wizard.importProgressBar.setMaximum(260) if last_chapter != chapter: if last_chapter != 0: self.session.commit() From 95f30dfb6da75c582c509cfe6c75d617da2c4dc2 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 16 Dec 2010 18:56:08 +0100 Subject: [PATCH 122/140] fixed bug #690774 --- openlp/plugins/songs/lib/mediaitem.py | 33 +++++++++++++++------------ 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index dc8310e9d..224063c47 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -44,6 +44,7 @@ class SongListView(BaseListWithDnD): self.PluginName = u'Songs' BaseListWithDnD.__init__(self, parent) + class SongMediaItem(MediaManagerItem): """ This is the custom media manager item for Songs. @@ -392,7 +393,7 @@ class SongMediaItem(MediaManagerItem): author_audit.append(unicode(author.display_name)) raw_footer.append(song.title) raw_footer.append(author_list) - raw_footer.append(song.copyright ) + raw_footer.append(song.copyright) raw_footer.append(unicode( translate('SongsPlugin.MediaItem', 'CCLI License: ') + QtCore.QSettings().value(u'general/ccli number', @@ -417,26 +418,30 @@ class SongMediaItem(MediaManagerItem): item.data_string[u'title'].split(u'@')[0].lower() , Song.search_title.asc()) author_list = item.data_string[u'authors'].split(u', ') + # The service item always has an author (at least it has u'' + # as author). However, songs saved in the database do not + # have to have an author. + if u'' in author_list: + author_list.remove(u'') editId = 0 uuid = item._uuid + add_song = True if search_results: for song in search_results: - count = 0 + same_author = True for author in song.authors: - if author.display_name in author_list: - count += 1 - # All Authors the same - if count == len(author_list): + if author.display_name not in author_list: + same_author = False + # All Authors the same, so we can stop here and the song + # does not have to be saved. + if same_author: editId = song.id - else: - # Authors different - if self.addSongFromService: - editId = self.openLyrics. \ - xml_to_song(item.xml_version) - else: - # Title does not match + add_song = False + break + if add_song: + # Authors different if self.addSongFromService: - editId = self.openLyrics.xml_to_song(item.xml_version) + editId = self.openLyrics. xml_to_song(item.xml_version) # Update service with correct song id if editId != 0: Receiver.send_message(u'service_item_update', From e6bc3b930348d6c6a9140b86f155a2d7ae8d1023 Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 16 Dec 2010 19:20:46 +0100 Subject: [PATCH 123/140] song search strings: handle unicode and reindex also search_lyric --- openlp/plugins/songs/forms/editsongform.py | 3 ++- openlp/plugins/songs/lib/songimport.py | 2 +- openlp/plugins/songs/songsplugin.py | 12 ++++++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index b7f4a3f0b..58488a6e9 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -108,6 +108,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.TopicsListView.setSortingEnabled(False) self.TopicsListView.setAlternatingRowColors(True) self.findVerseSplit = re.compile(u'---\[\]---\n', re.UNICODE) + self.whitespace = re.compile(r'\W+', re.UNICODE) def initialise(self): self.VerseEditButton.setEnabled(False) @@ -738,7 +739,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): verseId = unicode(item.data(QtCore.Qt.UserRole).toString()) bits = verseId.split(u':') sxml.add_verse_to_lyrics(bits[0], bits[1], unicode(item.text())) - text = text + re.sub(r'\W+', u' ', + text = text + whitespace.sub(u' ', unicode(self.VerseListWidget.item(i, 0).text())) + u' ' if (bits[1] > u'1') and (bits[0][0] not in multiple): multiple.append(bits[0][0]) diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index ea36d55b5..f305b90c7 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -247,7 +247,7 @@ class SongImport(QtCore.QObject): """ Extracts alphanumeric words for searchable fields """ - return re.sub(r'\W+', u' ', text) + return re.sub(r'\W+', u' ', text, re.UNICODE) def finish(self): """ diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 32336c507..b55b05988 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.db import Manager -from openlp.plugins.songs.lib import SongMediaItem, SongsTab +from openlp.plugins.songs.lib import SongMediaItem, SongsTab, SongXMLParser from openlp.plugins.songs.lib.db import init_schema, Song from openlp.plugins.songs.lib.importer import SongFormat @@ -150,9 +150,13 @@ class SongsPlugin(Plugin): song.title = u'' if song.alternate_title is None: song.alternate_title = u'' - song.search_title = self.whitespace.sub(u' ', \ - song.title.lower()) + u' ' + \ - self.whitespace.sub(u' ', song.alternate_title.lower()) + song.search_title = self.whitespace.sub(u' ', song.title.lower() + \ + u' ' + song.alternate_title.lower()) + lyrics = u'' + verses = SongXMLParser(song.lyrics).get_verses() + for verse in verses: + lyrics = lyrics + self.whitespace.sub(u' ', verse[1]) + u' ' + song.search_lyrics = lyrics.lower() progressDialog.setValue(counter) self.manager.save_objects(songs) counter += 1 From fe452bc588b3764f72f4320167dd022c13c5fbc6 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 16 Dec 2010 20:12:34 +0100 Subject: [PATCH 124/140] removed mistakes --- openlp/plugins/songs/lib/mediaitem.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 224063c47..884cf4a8b 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -418,9 +418,9 @@ class SongMediaItem(MediaManagerItem): item.data_string[u'title'].split(u'@')[0].lower() , Song.search_title.asc()) author_list = item.data_string[u'authors'].split(u', ') - # The service item always has an author (at least it has u'' - # as author). However, songs saved in the database do not - # have to have an author. + # The service item always has an author (at least it has u'' as + # author). However, songs saved in the database do not have to have + # an author. if u'' in author_list: author_list.remove(u'') editId = 0 @@ -428,20 +428,20 @@ class SongMediaItem(MediaManagerItem): add_song = True if search_results: for song in search_results: - same_author = True + same_authors = True for author in song.authors: if author.display_name not in author_list: - same_author = False + same_authors = False # All Authors the same, so we can stop here and the song # does not have to be saved. - if same_author: + if same_authors: editId = song.id add_song = False break if add_song: # Authors different if self.addSongFromService: - editId = self.openLyrics. xml_to_song(item.xml_version) + editId = self.openLyrics.xml_to_song(item.xml_version) # Update service with correct song id if editId != 0: Receiver.send_message(u'service_item_update', From f119a4afa59413664199f2b6dae3f1ec8631fe7f Mon Sep 17 00:00:00 2001 From: M2j Date: Thu, 16 Dec 2010 21:00:01 +0100 Subject: [PATCH 125/140] further work on parse_reference and other things --- .../plugins/bibles/forms/bibleimportform.py | 9 +- .../plugins/bibles/forms/bibleimportwizard.py | 10 + openlp/plugins/bibles/lib/__init__.py | 276 ++++++------------ openlp/plugins/bibles/lib/http.py | 10 +- openlp/plugins/bibles/lib/manager.py | 21 +- openlp/plugins/bibles/lib/mediaitem.py | 8 +- openlp/plugins/bibles/lib/openlp1.py | 1 + openlp/plugins/bibles/lib/osis.py | 4 +- .../plugins/bibles/resources/biblegateway.csv | 8 +- .../plugins/bibles/resources/bibleserver.csv | 6 +- 10 files changed, 155 insertions(+), 198 deletions(-) mode change 100755 => 100644 openlp/plugins/bibles/lib/openlp1.py diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 9bacd7fae..326a9a629 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -79,6 +79,12 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): QtGui.QWizard.__init__(self, parent) self.setupUi(self) self.registerFields() + if not BibleFormat.get_availability(BibleFormat.OpenLP1): + self.openlp1Page.setVisible(False) + self.openlp1LocationLabel.setVisible(False) + self.openlp1LocationEdit.setVisible(False) + self.openlp1FileButton.setVisible(False) + self.openlp1DisabledLabel.setVisible(True) self.finishButton = self.button(QtGui.QWizard.FinishButton) self.cancelButton = self.button(QtGui.QWizard.CancelButton) self.manager = manager @@ -104,9 +110,6 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): QtCore.QObject.connect(self.openlp1FileButton, QtCore.SIGNAL(u'clicked()'), self.onOpenlp1FileButtonClicked) - QtCore.QObject.connect(self.cancelButton, - QtCore.SIGNAL(u'clicked(bool)'), - self.onCancelButtonClicked) QtCore.QObject.connect(self, QtCore.SIGNAL(u'currentIdChanged(int)'), self.onCurrentIdChanged) diff --git a/openlp/plugins/bibles/forms/bibleimportwizard.py b/openlp/plugins/bibles/forms/bibleimportwizard.py index fbbba22bf..a0b2b99b9 100644 --- a/openlp/plugins/bibles/forms/bibleimportwizard.py +++ b/openlp/plugins/bibles/forms/bibleimportwizard.py @@ -280,6 +280,11 @@ class Ui_BibleImportWizard(object): self.openlp1LocationLayout.addWidget(self.openlp1FileButton) self.openlp1Layout.setLayout(1, QtGui.QFormLayout.FieldRole, self.openlp1LocationLayout) + self.openlp1DisabledLabel = QtGui.QLabel(self.openlp1Page) + self.openlp1DisabledLabel.setObjectName(u'openlp1DisabledLabel') + self.openlp1DisabledLabel.setVisible(False) + self.openlp1DisabledLabel.setWordWrap(True) + self.openlp1Layout.addWidget(self.openlp1DisabledLabel) self.formatWidget.addWidget(self.openlp1Page) self.selectPageLayout.addWidget(self.formatWidget) bibleImportWizard.addPage(self.selectPage) @@ -420,3 +425,8 @@ class Ui_BibleImportWizard(object): self.importProgressLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Ready.')) self.importProgressBar.setFormat(u'%p%') + self.openlp1DisabledLabel.setText( + translate('BiblesPlugin.ImportWizardForm', 'The openlp.org 1.x ' + 'importer has been disabled due to a missing Python module. If ' + 'you want to use this importer, you will need to install the ' + '"python-sqlite" module.')) diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py index a1845c0b9..253c6cfbc 100644 --- a/openlp/plugins/bibles/lib/__init__.py +++ b/openlp/plugins/bibles/lib/__init__.py @@ -32,24 +32,56 @@ import re log = logging.getLogger(__name__) -BIBLE_SEPARATORS = {u'sep_v': r'\s*,\s*', u'sep_r': r'\s*-\s*', u'sep_l': r'\.'} +# English: +BIBLE_SEPARATORS = {u'sep_v': r'\s*:\s*', u'sep_r': r'\s*-\s*', u'sep_l': r','} +# German: +#BIBLE_SEPARATORS = {u'sep_v': r'\s*,\s*', u'sep_r': r'\s*-\s*', u'sep_l': r'\.'} +# RegEx for a verse span: (:)?(-(:)??)? BIBLE_RANGE_REGEX = str(r'(?:(?P[0-9]+)%(sep_v)s)?' - r'(?P[0-9]+)(?:%(sep_r)s(?:(?:(?P[0-9]+)%(sep_v)s)?' - r'(?P[0-9]+))?)?' % BIBLE_SEPARATORS) + r'(?P[0-9]+)(?P%(sep_r)s(?:(?:(?P[0-9]+)' + r'%(sep_v)s)?(?P[0-9]+))?)?' % BIBLE_SEPARATORS) BIBLE_RANGE = re.compile(r'^\s*' + BIBLE_RANGE_REGEX + r'\s*$', re.UNICODE) -BIBLE_REFERENCE_NG = re.compile(str(r'^\s*?(?P[\d]*[^\d]+)\s*?' - r'(?P(?:' + BIBLE_RANGE_REGEX + r'(?:%(sep_l)s|(?=\s*\n)))+)\s*$') % +BIBLE_RANGE_SPLIT = re.compile(BIBLE_SEPARATORS[u'sep_l']) + +# RegEx for a reference ((,|(?=$)))+ +BIBLE_REFERENCE = re.compile(str(r'^\s*(?!\s)(?P[\d]*[^\d]+)(?(?:' + BIBLE_RANGE_REGEX + r'(?:%(sep_l)s|(?=\s*$)))+)\s*$') % BIBLE_SEPARATORS, re.UNICODE) -def parse_reference_ng(reference): +def parse_reference(reference): """ This is the next generation über-awesome function that takes a person's typed in string and converts it to a reference list, a list of references to be queried from the Bible database files. +##### + This is a user manual like description, how the references are working. + + - Each reference starts with the book name. A chapter name is manditory. + ``John 3`` refers to Gospel of John chapter 3 + - A reference range can be given after a range seperator. + ``John 3-5`` refers to John chapters 3 to 5 + - Single verses can be addressed after a verse seperator + ``John 3:16`` refers to John chapter 3 verse 16 + ``John 3:16-4:3`` refers to John chapter 3 verse 16 to chapter 4 verse 3 + - After a verse reference all further single values are treat as verse in + the last selected chapter. + ``John 3:16-18`` refers to John chapter 3 verses 16 to 18 + - After a list separator it is possible to refer to additional verses. They + are build analog to the first ones. This way it is possible to define each + number of verse references. It is not possible to refer to verses in + additional books. + ``John 3:16,18`` refers to John chapter 3 verses 16 and 18 + ``John 3:16-18,20`` refers to John chapter 3 verses 16 to 18 to 20 + ``John 3:16-18,4:1`` refers to John chapter 3 verses 16 to 18 and + chapter 3 verse 1 + - If there is a range separator without further verse declaration the last + refered chapter is addressed until the end. +##### + The ``BIBLE_RANGE`` regular expression produces match groups for verse range declarations: @@ -58,23 +90,23 @@ def parse_reference_ng(reference): a verse separator. 2. ``(?P[0-9]+)`` The verse reference ``from_verse`` is manditory - ``(?:%(sep_r)s(?:`` ... ``)?)?`` - A range declaration is optional. It starts with a range seperator and - contains a optional chapter and verse declaration - 3. ``(?:(?P[0-9]+)%(sep_v)s)?`` + 3. ``(?P%(sep_r)s(?:`` ... ``)?)?`` + A ``range_to`` declaration is optional. It starts with a range seperator + and contains a optional chapter and verse declaration + 4. ``(?:(?P[0-9]+)%(sep_v)s)?`` The ``to_chapter`` reference with seperator is equivalent to group 1. - 4. ``(?P[0-9]+)?)?`` + 5. ``(?P[0-9]+)?)?`` The ``to_verse`` reference is equivalent to group 2. The ``BIBLE_REFERENCE`` regular expression produces matched groups for the whole reference string: - 1. ``\s*?(?P[\d]*[^\d]+)\s*?`` + 1. ``^\s*(?!\s)(?P[\d]*[^\d]+)(?(?:`` + BIBLE_RANGE_REGEX + - ``(?:%(sep_l)s|(?=\s*\\n)))+)\s*$`` + ``(?:%(sep_l)s|(?=\s*$)))+)\s*$`` The sechon group contains all ``ranges``. This can be multiple declarations of a BIBLE_RANGE separated by a list separator. @@ -93,181 +125,67 @@ def parse_reference_ng(reference): """ log.debug('parse_reference("%s")', reference) - if u'' in reference: - return - ref_list = [] - match = BIBLE_REFERENCE_NG.match(reference) - if match: - log.debug(u'Matched reference %s' % reference) - book = match.group(u'book') - ranges = match.group(u'ranges').split(r'\s*\.\s*') - chapter = 0 - for this_range in ranges: - range_match = BIBLE_RANGE.match(this_range) - from_chapter = int(u'0' + range_match.group('from_chapter')) - from_verse = int(u'0' + range_match.group('from_verse')) - to_chapter = int(u'0' + range_match.group('to_chapter')) - to_verse = int(u'0' + range_match.group('to_verse')) - # First reference has to be a chapter - if not unified_ref_list: - if not from_chapter: - from_chapter = from_verse - from_verse = 1 - # Fill missing chapter references with the last chapter - if from_chapter: - chapter = from_chapter - else: - from_chapter = chapter - if not from_verse: - from_verse = 1 - if to_chapter: - if to_chapter > from_chapter: - ref_list.append((book, from_chapter, from_verse, -1)) - for i in range(from_chapter + 1, to_chapter -1): - ref_list.append((book, i, 1, -1)) - ref_list.append((book, to_chapter, 1, to_verse)) - else: - if to_verse < from_verse: - to_verse = from_verse - ref_list.append((book, from_chapter, from_verse, to_verse)) - else: - if to_verse < from_verse: - to_verse = from_verse - ref_list.append((book, from_chapter, from_verse, to_verse)) - else: - log.debug(u'Invalid reference: %s' % reference) - return None - return ref_list - - -BIBLE_REFERENCE = re.compile( - r'^([\w ]+?) *([0-9]+)' # Initial book and chapter - r'(?: *[:|v|V] *([0-9]+))?' # Verse for first chapter - r'(?: *- *([0-9]+|end$))?' # Range for verses or chapters - r'(?:(?:,([0-9]+))?' # Second chapter - r' *[,|:|v|V] *([0-9]+|end$)' # More range for verses or chapters - r'(?: *- *([0-9]+|end$))?)?$', # End of second verse range - re.UNICODE) - -def check_end(match_group): - """ - Check if a regular expression match group contains the text u'end' or - should be converted to an int. - - ``match_group`` - The match group to check. - """ - if match_group == u'end': - return -1 - else: - return int(match_group) - -def parse_reference(reference): - """ - This is the über-awesome function that takes a person's typed in string - and converts it to a reference list, a list of references to be queried - from the Bible database files. - - The ``BIBLE_REFERENCE`` constant regular expression produces the following - match groups: - - 0. (match string) - This is a special group consisting of the whole string that matched. - 1. ``[\w ]+`` - The book the reference is from. - 2. ``[0-9]+`` - The first (or only) chapter in the reference. - 3. ``None`` or ``[0-9]+`` - ``None``, or the only verse, or the first verse in a verse range or, - the start verse in a chapter range. - 4. ``None`` or ``[0-9]+`` or ``end`` - ``None``, or the end verse of the first verse range, or the end chapter - of a chapter range. - 5. ``None`` or ``[0-9]+`` - ``None``, or the second chapter in multiple (non-ranged) chapters. - 6. ``None`` or ``[0-9]+`` or ``end`` - ``None``, the start of the second verse range. or the end of a chapter - range. - 7. ``None`` or ``[0-9]+`` or ``end`` - ``None``, or the end of the second verse range. - - The reference list is a list of tuples, with each tuple structured like - this:: - - (book, chapter, start_verse, end_verse) - - ``reference`` - The bible reference to parse. - - Returns None or a reference list. - """ - reference = reference.strip() - log.debug('parse_reference("%s")', reference) - unified_ref_list = [] match = BIBLE_REFERENCE.match(reference) if match: log.debug(u'Matched reference %s' % reference) - book = match.group(1) - chapter = int(match.group(2)) - if match.group(7): - # Two verse ranges - vr1_start = int(match.group(3)) - vr1_end = int(match.group(4)) - unified_ref_list.append((book, chapter, vr1_start, vr1_end)) - vr2_start = int(match.group(6)) - vr2_end = check_end(match.group(7)) - if match.group(5): - # One verse range per chapter - chapter2 = int(match.group(5)) - unified_ref_list.append((book, chapter2, vr2_start, vr2_end)) + book = match.group(u'book') + ranges = BIBLE_RANGE_SPLIT.split(match.group(u'ranges')) + ref_list = [] + chapter = 0 + for this_range in ranges: + range_match = BIBLE_RANGE.match(this_range) + from_chapter = range_match.group('from_chapter') + from_verse = range_match.group('from_verse') + has_range = range_match.group('range_to') + to_chapter = range_match.group('to_chapter') + to_verse = range_match.group('to_verse') + if from_chapter: + from_chapter = int(from_chapter) + if from_verse: + from_verse = int(from_verse) + if to_chapter: + to_chapter = int(to_chapter) + if to_verse: + to_verse = int(to_verse) + # Fill chapters with reasonable values. + if from_chapter: + chapter = from_chapter + elif chapter: + from_chapter = chapter else: - unified_ref_list.append((book, chapter, vr2_start, vr2_end)) - elif match.group(6): - # Chapter range with verses - if match.group(3): - vr1_start = int(match.group(3)) - else: - vr1_start = 1 - if match.group(2) == match.group(4): - vr1_end = int(match.group(6)) - unified_ref_list.append((book, chapter, vr1_start, vr1_end)) - else: - vr1_end = -1 - unified_ref_list.append((book, chapter, vr1_start, vr1_end)) - vr2_end = check_end(match.group(6)) - if int(match.group(4)) > chapter: - for i in range(chapter + 1, int(match.group(4)) + 1): - if i == int(match.group(4)): - unified_ref_list.append((book, i, 1, vr2_end)) - else: - unified_ref_list.append((book, i, 1, -1)) - elif match.group(4): - # Chapter range or chapter and verse range - if match.group(3): - vr1_start = int(match.group(3)) - vr1_end = check_end(match.group(4)) - if vr1_end == -1 or vr1_end > vr1_start: - unified_ref_list.append((book, chapter, vr1_start, vr1_end)) + from_chapter = from_verse + from_verse = None + if to_chapter: + if to_chapter < from_chapter: + continue else: - log.debug(u'Ambiguous reference: %s' % reference) - return None - elif match.group(4) != u'end': - for i in range(chapter, int(match.group(4)) + 1): - unified_ref_list.append((book, i, 1, -1)) + chapter = to_chapter + elif to_verse: + if chapter: + to_chapter = chapter + else: + to_chapter = to_verse + # Append references to the list + if has_range: + if not from_verse: + from_verse = 1 + if not to_verse: + to_verse = -1 + if to_chapter > from_chapter: + ref_list.append((book, from_chapter, from_verse, -1)) + for i in range(int(from_chapter) + 1, int(to_chapter) - 1): + ref_list.append((book, i, 1, -1)) + ref_list.append((book, to_chapter, 1, to_verse)) + elif to_verse >= from_verse: + ref_list.append((book, from_chapter, from_verse, to_verse)) + elif from_verse: + ref_list.append((book, from_chapter, from_verse, from_verse)) else: - log.debug(u'Unsupported reference: %s' % reference) - return None - elif match.group(3): - # Single chapter and verse - verse = int(match.group(3)) - unified_ref_list.append((book, chapter, verse, verse)) - else: - # Single chapter - unified_ref_list.append((book, chapter, -1, -1)) + ref_list.append((book, from_chapter, 1, -1)) + return ref_list else: log.debug(u'Invalid reference: %s' % reference) return None - return unified_ref_list class SearchResults(object): diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 9ee445431..8f36d33c5 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -261,8 +261,8 @@ class BSExtract(object): ``chapter`` Chapter number """ - print(bookname) log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter) + ''' bookindex = self._get_book_index(bookname) if chapter < 10: chapter_string = u'00' + unicode(chapter) @@ -272,6 +272,10 @@ class BSExtract(object): chapter_string = unicode(chapter) chapter_url = u'http://m.bibleserver.com/text/%s/%s%s000' % \ (version, bookindex, chapter_string) + ''' + chapter_url = u'http://m.bibleserver.com/#/%s/%s%s' % \ + (version, bookname, chapter) + log.debug(u'URL: %s', chapter_url) page = None try: @@ -299,6 +303,7 @@ class BSExtract(object): versenumber = int(verse_number.sub(r'\1', verse[u'class'])) verses[versenumber] = verse.contents[1].rstrip(u'\n') return SearchResults(bookname, chapter, verses) + ''' def _get_book_index(self, bookname): print bookname bookmap = {u'Gen': u'01', u'Exod': u'02', u'Lev': u'03', @@ -319,6 +324,7 @@ class BSExtract(object): u'1Pet': u'60', u'2Pet': u'61', u'1John': u'62', u'2John':u'63', u'3John': u'64', u'Jude': u'65', u'Rev': u'66'} return bookmap[bookname] + ''' class CWExtract(object): @@ -431,7 +437,7 @@ class HTTPBible(BibleDB): Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on failure. """ - self.wizard.ImportProgressBar.setMaximum(2) + self.wizard.importProgressBar.setMaximum(2) self.wizard.incrementProgressBar('Registering bible...') self.create_meta(u'download source', self.download_source) self.create_meta(u'download name', self.download_name) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 794c9c5f7..39d8b644c 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -35,9 +35,14 @@ from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta from csvbible import CSVBible from http import HTTPBible -from openlp1 import OpenLP1Bible from opensong import OpenSongBible from osis import OSISBible +# Imports that might fail. +try: + from openlp1 import OpenLP1Bible + has_openlp1 = True +except ImportError: + has_openlp1 = False log = logging.getLogger(__name__) @@ -57,6 +62,7 @@ class BibleFormat(object): plus a few helper functions to facilitate generic handling of Bible types for importing. """ + _format_availability = {} Unknown = -1 OSIS = 0 CSV = 1 @@ -98,6 +104,14 @@ class BibleFormat(object): BibleFormat.OpenLP1 ] + @staticmethod + def set_availability(format, available): + BibleFormat._format_availability[format] = available + + @staticmethod + def get_availability(format): + return BibleFormat._format_availability.get(format, True) + class BibleManager(object): """ @@ -339,3 +353,8 @@ class BibleManager(object): """ for bible in self.db_cache: self.db_cache[bible].finalise() + +BibleFormat.set_availability(BibleFormat.OpenLP1, has_openlp1) + +__all__ = [u'BibleFormat'] + diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 949035c0b..717fa03b7 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -750,21 +750,21 @@ class BibleMediaItem(MediaManagerItem): 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, + bible_text = u'%s\u00a0%s\n\n%s\u00a0%s' % (verse_text, text, verse_text, second_text) raw_slides.append(bible_text) bible_text = u'' # If we are 'Verse Per Slide' then create a new slide. elif self.parent.settings_tab.layout_style == 0: - bible_text = u'%s %s' % (verse_text, text) + bible_text = u'%s\u00a0%s' % (verse_text, text) raw_slides.append(bible_text) bible_text = u'' # If we are 'Verse Per Line' then force a new line. elif self.parent.settings_tab.layout_style == 1: - bible_text = u'%s %s %s\n' % (bible_text, verse_text, text) + bible_text = u'%s %s\u00a0%s\n' % (bible_text, verse_text, text) # We have to be 'Continuous'. else: - bible_text = u'%s %s %s\n' % (bible_text, verse_text, text) + bible_text = u'%s %s\u00a0%s\n' % (bible_text, verse_text, text) if first_item: start_item = item first_item = False diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py old mode 100755 new mode 100644 index 7f8a8d17e..ba9476fca --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -62,6 +62,7 @@ class OpenLP1Bible(BibleDB): # Create all books. cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') books = cursor.fetchall() + self.wizard.importProgressBar.setMaximum(len(books) + 1) for book in books: if self.stop_import_flag: connection.close() diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 53a6f152c..f39a4ab0f 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -134,9 +134,9 @@ class OSISBible(BibleDB): testament) if last_chapter == 0: if book == u'Gen': - self.wizard.ImportProgressBar.setMaximum(1188) + self.wizard.importProgressBar.setMaximum(1188) else: - self.wizard.ImportProgressBar.setMaximum(260) + self.wizard.importProgressBar.setMaximum(260) if last_chapter != chapter: if last_chapter != 0: self.session.commit() diff --git a/openlp/plugins/bibles/resources/biblegateway.csv b/openlp/plugins/bibles/resources/biblegateway.csv index deca46d7c..14f167897 100644 --- a/openlp/plugins/bibles/resources/biblegateway.csv +++ b/openlp/plugins/bibles/resources/biblegateway.csv @@ -48,12 +48,12 @@ Hungarian Károli,KAR Icelandic Bible,ICELAND La Nuova Diodati,LND La Parola è Vita,LM -Jacalteco, Oriental,JAC +Jacalteco - Oriental,JAC Kekchi,KEK Korean Bible,KOREAN Maori Bible,MAORI Macedonian New Testament,MNT -Mam, Central,MVC +Mam - Central,MVC Mam de Todos Santos Chuchumatán,MVJ Reimer 2001,REIMER Náhuatl de Guerrero,NGU @@ -62,7 +62,7 @@ Det Norsk Bibelselskap 1930,DNB1930 Levande Bibeln,LB O Livro,OL João Ferreira de Almeida Atualizada,AA -Quiché, Centro Occidental,QUT +Quiché - Centro Occidental,QUT Romanian,RMNN Romanian,TLCR Russian Synodal Version,RUSV @@ -77,4 +77,4 @@ Ukrainian Bible,UKR Uspanteco,USP 1934 Vietnamese Bible,VIET Chinese Union Version (Simplified),CUVS -Chinese Union Version (Traditional),CUV \ No newline at end of file +Chinese Union Version (Traditional),CUV diff --git a/openlp/plugins/bibles/resources/bibleserver.csv b/openlp/plugins/bibles/resources/bibleserver.csv index cc0a843ce..0f2baa0cc 100644 --- a/openlp/plugins/bibles/resources/bibleserver.csv +++ b/openlp/plugins/bibles/resources/bibleserver.csv @@ -1,5 +1,5 @@ عربي, ARA -Bible, překlad 21. století, B21 +Bible – překlad 21. století, B21 Bible du Semeur, BDS Българската Библия, BLG Český ekumenický překlad, CEP @@ -8,7 +8,7 @@ Hrvatski, CRO Version La Biblia al Dia, CST 中文和合本(简体), CUVS Bibelen på hverdagsdansk, DK -Rev. Elberfelder, ELB +Revidierte Elberfelder, ELB Einheitsübersetzung, EU Gute Nachricht Bibel, GNB Hoffnung für alle, HFA @@ -20,7 +20,7 @@ King James Version, KJV Luther 1984, LUT Septuaginta, LXX Neue Genfer Übersetzung, NGÜ -New Int. Readers Version, NIRV +New International Readers Version, NIRV New International Version, NIV Neues Leben, NL En Levende Bok, NOR From a46ea7c4ebcc07ae093bc578bccf0320dfa294a7 Mon Sep 17 00:00:00 2001 From: M2j Date: Fri, 17 Dec 2010 14:21:55 +0100 Subject: [PATCH 126/140] localisation off seperators. --- openlp/plugins/bibles/lib/__init__.py | 92 ++++++++++--------- openlp/plugins/bibles/lib/http.py | 2 +- openlp/plugins/bibles/lib/mediaitem.py | 61 ++++++------ .../plugins/bibles/resources/bibleserver.csv | 4 +- 4 files changed, 82 insertions(+), 77 deletions(-) diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py index 253c6cfbc..7a35508fc 100644 --- a/openlp/plugins/bibles/lib/__init__.py +++ b/openlp/plugins/bibles/lib/__init__.py @@ -32,24 +32,32 @@ import re log = logging.getLogger(__name__) -# English: -BIBLE_SEPARATORS = {u'sep_v': r'\s*:\s*', u'sep_r': r'\s*-\s*', u'sep_l': r','} -# German: -#BIBLE_SEPARATORS = {u'sep_v': r'\s*,\s*', u'sep_r': r'\s*-\s*', u'sep_l': r'\.'} +def get_reference_match(match_type): + local_separator = unicode(u':;;\s*[:vV]\s*;;-;;\s*-\s*;;,;;\s*,\s*;;end' + ).split(u';;') # English + # local_separator = unicode(u',;;\s*,\s*;;-;;\s*-\s*;;.;;\.;;[Ee]nde' + # ).split(u';;') # German + separators = { + u'sep_v_display': local_separator[0], u'sep_v': local_separator[1], + u'sep_r_display': local_separator[2], u'sep_r': local_separator[3], + u'sep_l_display': local_separator[4], u'sep_l': local_separator[5], + u'sep_e': local_separator[6]} -# RegEx for a verse span: (:)?(-(:)??)? -BIBLE_RANGE_REGEX = str(r'(?:(?P[0-9]+)%(sep_v)s)?' - r'(?P[0-9]+)(?P%(sep_r)s(?:(?:(?P[0-9]+)' - r'%(sep_v)s)?(?P[0-9]+))?)?' % BIBLE_SEPARATORS) - -BIBLE_RANGE = re.compile(r'^\s*' + BIBLE_RANGE_REGEX + r'\s*$', re.UNICODE) - -BIBLE_RANGE_SPLIT = re.compile(BIBLE_SEPARATORS[u'sep_l']) - -# RegEx for a reference ((,|(?=$)))+ -BIBLE_REFERENCE = re.compile(str(r'^\s*(?!\s)(?P[\d]*[^\d]+)(?(?:' + BIBLE_RANGE_REGEX + r'(?:%(sep_l)s|(?=\s*$)))+)\s*$') % - BIBLE_SEPARATORS, re.UNICODE) + # verse range match: (:)?(-(:)??)? + range_string = str(r'(?:(?P[0-9]+)%(sep_v)s)?(?P' + r'[0-9]+)(?P%(sep_r)s(?:(?:(?P[0-9]+)%(sep_v)s)?' + r'(?P[0-9]+)|%(sep_e)s)?)?' % separators) + if match_type == u'range': + return re.compile(r'^\s*' + range_string + r'\s*$', re.UNICODE) + elif match_type == u'range_separator': + return re.compile(separators[u'sep_l']) + elif match_type == u'full': + # full reference match: ((,|(?=$)))+ + return re.compile(str(r'^\s*(?!\s)(?P[\d]*[^\d]+)(?(?:' + range_string + r'(?:%(sep_l)s|(?=\s*$)))+)\s*$') + % separators, re.UNICODE) + else: + return separators[match_type] def parse_reference(reference): """ @@ -57,7 +65,6 @@ def parse_reference(reference): typed in string and converts it to a reference list, a list of references to be queried from the Bible database files. -##### This is a user manual like description, how the references are working. - Each reference starts with the book name. A chapter name is manditory. @@ -80,9 +87,8 @@ def parse_reference(reference): chapter 3 verse 1 - If there is a range separator without further verse declaration the last refered chapter is addressed until the end. -##### - The ``BIBLE_RANGE`` regular expression produces match groups for verse range + ``range_string`` is a regular expression which matches for verse range declarations: 1. ``(?:(?P[0-9]+)%(sep_v)s)?' @@ -90,28 +96,25 @@ def parse_reference(reference): a verse separator. 2. ``(?P[0-9]+)`` The verse reference ``from_verse`` is manditory - 3. ``(?P%(sep_r)s(?:`` ... ``)?)?`` + 3. ``(?P%(sep_r)s(?:`` ... ``|%(sep_e)s)?)?`` A ``range_to`` declaration is optional. It starts with a range seperator - and contains a optional chapter and verse declaration + and contains optional a chapter and verse declaration or a end + separator. 4. ``(?:(?P[0-9]+)%(sep_v)s)?`` The ``to_chapter`` reference with seperator is equivalent to group 1. - 5. ``(?P[0-9]+)?)?`` + 5. ``(?P[0-9]+)`` The ``to_verse`` reference is equivalent to group 2. - The ``BIBLE_REFERENCE`` regular expression produces matched groups for the - whole reference string: + The full reference is matched against get_reference_match(u'full'). This + regular expression looks like this: 1. ``^\s*(?!\s)(?P[\d]*[^\d]+)(?(?:`` + BIBLE_RANGE_REGEX + - ``(?:%(sep_l)s|(?=\s*$)))+)\s*$`` - The sechon group contains all ``ranges``. This can be multiple - declarations of a BIBLE_RANGE separated by a list separator. - - ``BIBLE_SEPARATORS`` is a dict which defines the separator formats. It might - be used to localize the bible references. + 2. ``(?P(?:`` + range_string + ``(?:%(sep_l)s|(?=\s*$)))+)\s*$`` + The second group contains all ``ranges``. This can be multiple + declarations of a range_string separated by a list separator. The reference list is a list of tuples, with each tuple structured like this:: @@ -125,20 +128,21 @@ def parse_reference(reference): """ log.debug('parse_reference("%s")', reference) - match = BIBLE_REFERENCE.match(reference) + match = get_reference_match(u'full').match(reference) if match: log.debug(u'Matched reference %s' % reference) book = match.group(u'book') - ranges = BIBLE_RANGE_SPLIT.split(match.group(u'ranges')) + ranges = match.group(u'ranges') + range_list = get_reference_match(u'range_separator').split(ranges) ref_list = [] chapter = 0 - for this_range in ranges: - range_match = BIBLE_RANGE.match(this_range) - from_chapter = range_match.group('from_chapter') - from_verse = range_match.group('from_verse') - has_range = range_match.group('range_to') - to_chapter = range_match.group('to_chapter') - to_verse = range_match.group('to_verse') + for this_range in range_list: + range_match = get_reference_match(u'range').match(this_range) + from_chapter = range_match.group(u'from_chapter') + from_verse = range_match.group(u'from_verse') + has_range = range_match.group(u'range_to') + to_chapter = range_match.group(u'to_chapter') + to_verse = range_match.group(u'to_verse') if from_chapter: from_chapter = int(from_chapter) if from_verse: @@ -147,7 +151,7 @@ def parse_reference(reference): to_chapter = int(to_chapter) if to_verse: to_verse = int(to_verse) - # Fill chapters with reasonable values. + # Fill chapter fields with reasonable values. if from_chapter: chapter = from_chapter elif chapter: @@ -173,10 +177,10 @@ def parse_reference(reference): to_verse = -1 if to_chapter > from_chapter: ref_list.append((book, from_chapter, from_verse, -1)) - for i in range(int(from_chapter) + 1, int(to_chapter) - 1): + for i in range(from_chapter + 1, to_chapter - 1): ref_list.append((book, i, 1, -1)) ref_list.append((book, to_chapter, 1, to_verse)) - elif to_verse >= from_verse: + elif to_verse >= from_verse or to_verse == -1: ref_list.append((book, from_chapter, from_verse, to_verse)) elif from_verse: ref_list.append((book, from_chapter, from_verse, from_verse)) diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 8f36d33c5..4ed6e5394 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -273,7 +273,7 @@ class BSExtract(object): chapter_url = u'http://m.bibleserver.com/text/%s/%s%s000' % \ (version, bookindex, chapter_string) ''' - chapter_url = u'http://m.bibleserver.com/#/%s/%s%s' % \ + chapter_url = u'http://m.bibleserver.com/text/%s/%s%s' % \ (version, bookname, chapter) log.debug(u'URL: %s', chapter_url) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 84505c991..cced544b9 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -32,6 +32,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, Receiver, BaseListWithDnD, \ ItemCapabilities, translate from openlp.plugins.bibles.forms import BibleImportForm +from openlp.plugins.bibles.lib import get_reference_match log = logging.getLogger(__name__) @@ -553,12 +554,15 @@ class BibleMediaItem(MediaManagerItem): bible = unicode(self.AdvancedVersionComboBox.currentText()) second_bible = unicode(self.AdvancedSecondBibleComboBox.currentText()) book = unicode(self.AdvancedBookComboBox.currentText()) - chapter_from = int(self.AdvancedFromChapter.currentText()) - chapter_to = int(self.AdvancedToChapter.currentText()) - verse_from = int(self.AdvancedFromVerse.currentText()) - verse_to = int(self.AdvancedToVerse.currentText()) - versetext = u'%s %s:%s-%s:%s' % (book, chapter_from, verse_from, - chapter_to, verse_to) + chapter_from = self.AdvancedFromChapter.currentText() + chapter_to = self.AdvancedToChapter.currentText() + verse_from = self.AdvancedFromVerse.currentText() + verse_to = self.AdvancedToVerse.currentText() + verse_separator = get_reference_match(u'sep_v_display') + range_separator = get_reference_match(u'sep_r_display') + verse_range = chapter_from + verse_separator + verse_from + \ + range_separator + chapter_to + verse_separator + verse_to + versetext = u'%s %s' % (book, verse_range) self.search_results = self.parent.manager.get_verses(bible, versetext) if second_bible: self.second_search_results = self.parent.manager.get_verses( @@ -709,7 +713,7 @@ class BibleMediaItem(MediaManagerItem): obj = reference[QtCore.QString(key)] if isinstance(obj, QtCore.QVariant): obj = obj.toPyObject() - return unicode(obj) + return unicode(obj).strip() def generateSlideData(self, service_item, item=None, xmlVersion=False): """ @@ -816,36 +820,31 @@ class BibleMediaItem(MediaManagerItem): ``old_item`` The last item of a range. """ + verse_separator = get_reference_match(u'sep_v_display') + range_separator = get_reference_match(u'sep_r_display') old_bitem = self.listView.item(old_item.row()) - old_chapter = int(self._decodeQtObject(old_bitem, 'chapter')) - old_verse = int(self._decodeQtObject(old_bitem, 'verse')) + old_chapter = self._decodeQtObject(old_bitem, 'chapter') + old_verse = self._decodeQtObject(old_bitem, 'verse') start_bitem = self.listView.item(start_item.row()) start_book = self._decodeQtObject(start_bitem, 'book') - start_chapter = int(self._decodeQtObject(start_bitem, 'chapter')) - start_verse = int(self._decodeQtObject(start_bitem, 'verse')) + start_chapter = self._decodeQtObject(start_bitem, 'chapter') + start_verse = self._decodeQtObject(start_bitem, 'verse') start_bible = self._decodeQtObject(start_bitem, '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_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_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_second_bible) + bibles = u'%s, %s' % (start_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, - start_verse, start_bible) - elif start_chapter == old_chapter: - title = u'%s %s:%s-%s (%s)' % (start_book, start_chapter, - start_verse, old_verse, start_bible) + bibles = start_bible + if start_chapter == old_chapter: + if start_verse == old_verse: + verse_range = start_chapter + verse_separator + start_verse else: - title = u'%s %s:%s-%s:%s (%s)' % (start_book, start_chapter, - start_verse, old_chapter, old_verse, start_bible) + verse_range = start_chapter + verse_separator + start_verse + \ + range_separator + old_verse + else: + verse_range = start_chapter + verse_separator + start_verse + \ + range_separator + old_chapter + verse_separator + old_verse + title = u'%s %s (%s)' % (start_book, verse_range, bibles) return title def checkTitle(self, item, old_item): @@ -907,9 +906,11 @@ class BibleMediaItem(MediaManagerItem): ``verse`` The verse number (int). """ + + verse_separator = get_reference_match(u'sep_v_display') if not self.parent.settings_tab.show_new_chapters or \ old_chapter != chapter: - verse_text = u'%s:%s' % (chapter, verse) + verse_text = unicode(chapter) + verse_separator + unicode(verse) else: verse_text = u'%s' % verse if self.parent.settings_tab.display_style == 1: diff --git a/openlp/plugins/bibles/resources/bibleserver.csv b/openlp/plugins/bibles/resources/bibleserver.csv index 0f2baa0cc..d73bf1678 100644 --- a/openlp/plugins/bibles/resources/bibleserver.csv +++ b/openlp/plugins/bibles/resources/bibleserver.csv @@ -23,7 +23,7 @@ Neue Genfer Übersetzung, NGÜ New International Readers Version, NIRV New International Version, NIV Neues Leben, NL -En Levende Bok, NOR +En Levende Bok (NOR), NOR Nádej pre kazdého, NPK Noua traducere în limba românã, NTR Nueva Versión Internacional, NVI @@ -33,7 +33,7 @@ O Livro, PRT Новый перевод на русский язык, RUS Slovo na cestu, SNC Schlachter 2000, SLT -En Levande Bok, SVL +En Levande Bok (SWE), SVL Today's New International Version, TNIV Türkçe, TR Vulgata, VUL From 3cdac511e2955b3d1ba79babed593a2f1cf99650 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 17 Dec 2010 14:30:48 +0100 Subject: [PATCH 127/140] fixed bug #690774 --- openlp/plugins/songs/lib/mediaitem.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 884cf4a8b..e42cb7fa3 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -429,20 +429,26 @@ class SongMediaItem(MediaManagerItem): if search_results: for song in search_results: same_authors = True - for author in song.authors: - if author.display_name not in author_list: - same_authors = False - # All Authors the same, so we can stop here and the song + # If the author counts are different, we do not have to do + # any further checking. This is also important when a song + # does not have any author (because we can not loop over an + # empty list). + if len(song.authors) == len(author_list): + for author in song.authors: + if author.display_name not in author_list: + same_authors = False + else: + same_authors = False + # All authors are the same, so we can stop here and the song # does not have to be saved. if same_authors: - editId = song.id add_song = False + editId = song.id break if add_song: - # Authors different if self.addSongFromService: editId = self.openLyrics.xml_to_song(item.xml_version) - # Update service with correct song id + # Update service with correct song id. if editId != 0: Receiver.send_message(u'service_item_update', u'%s:%s' %(editId, uuid)) From 9c5177b0f71b43372a6713c433d3674f568a57ed Mon Sep 17 00:00:00 2001 From: M2j Date: Fri, 17 Dec 2010 14:33:25 +0100 Subject: [PATCH 128/140] exception, if bibleserver.com response contains no verses --- openlp/plugins/bibles/lib/http.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 4ed6e5394..b1cc188b6 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -295,7 +295,13 @@ class BSExtract(object): if not soup: return None Receiver.send_message(u'openlp_process_events') - content = soup.find(u'div', u'content').find(u'div').findAll(u'div') + try: + content = soup.find(u'div', u'content').find(u'div').findAll(u'div') + except: + log.exception(u'No verses found.') + finally: + if not content: + return None verse_number = re.compile(r'v\d{5}(\d{3}) verse') verses = {} for verse in content: From 04d4d76dcd00b187a37b54b19a39bc46e4be4044 Mon Sep 17 00:00:00 2001 From: M2j Date: Fri, 17 Dec 2010 14:46:34 +0100 Subject: [PATCH 129/140] removed commented code in openlp.plugins.bibles.lib.http --- openlp/plugins/bibles/lib/http.py | 33 ------------------------------- 1 file changed, 33 deletions(-) diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index b1cc188b6..bd24b3f46 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -262,17 +262,6 @@ class BSExtract(object): Chapter number """ log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter) - ''' - bookindex = self._get_book_index(bookname) - if chapter < 10: - chapter_string = u'00' + unicode(chapter) - elif chapter < 100: - chapter_string = u'0' + unicode(chapter) - else: - chapter_string = unicode(chapter) - chapter_url = u'http://m.bibleserver.com/text/%s/%s%s000' % \ - (version, bookindex, chapter_string) - ''' chapter_url = u'http://m.bibleserver.com/text/%s/%s%s' % \ (version, bookname, chapter) @@ -309,28 +298,6 @@ class BSExtract(object): versenumber = int(verse_number.sub(r'\1', verse[u'class'])) verses[versenumber] = verse.contents[1].rstrip(u'\n') return SearchResults(bookname, chapter, verses) - ''' - def _get_book_index(self, bookname): - print bookname - bookmap = {u'Gen': u'01', u'Exod': u'02', u'Lev': u'03', - u'Num': u'04', u'Deut': u'05', u'Josh': u'06', u'Judg': u'07', - u'Ruth': u'08', u'1Sam': u'09', u'2Sam': u'10', u'1Kgs': u'11', - u'2Kgs': u'12', u'1Chr': u'13', u'2Chr': u'14', u'Ezra': u'15', - u'Neh': u'16', u'Esth': u'17', u'Job': u'18', u'Ps': u'19', - u'Prov': u'20', u'Eccl': u'21', u'Song': u'22', u'Isa': u'23', - u'Jer': u'24', u'Lam': u'25', u'Ezek': u'26', u'Dan': u'27', - u'Hos': u'28', u'Joel': u'29', u'Amos': u'30', u'Obad': u'31', - u'Jonah': u'32', u'Mic': u'33', u'Nah': u'34', u'Hab': u'35', - u'Zeph': u'36', u'Hag': u'37', u'Zech': u'38', u'Mal': u'39', - u'Matt': u'40', u'Mark': u'41', u'Luke': u'42', u'John': u'43', - u'Acts': u'44', u'Rom': u'45', u'1Cor': u'46', u'2Cor': u'47', - u'Gal': u'48', u'Eph': u'49', u'Phil': u'50', u'Col': u'51', - u'1Thess':u'52', u'2Thess':u'53', u'1Tim': u'54', u'2Tim': u'55', - u'Titus': u'56', u'Phlm': u'57', u'Heb': u'58', u'Jas': u'59', - u'1Pet': u'60', u'2Pet': u'61', u'1John': u'62', u'2John':u'63', - u'3John': u'64', u'Jude': u'65', u'Rev': u'66'} - return bookmap[bookname] - ''' class CWExtract(object): From fa79dd2cca89638a936459eac89a67600882f8c9 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 17 Dec 2010 15:28:19 +0100 Subject: [PATCH 130/140] keep copyright field empty if imported song does not have any copyright information --- openlp/core/lib/serviceitem.py | 1 + openlp/plugins/songs/lib/xml.py | 4 +++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index b9394030a..9b4a035a5 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -44,6 +44,7 @@ class ServiceItemType(object): Image = 2 Command = 3 + class ItemCapabilities(object): """ Provides an enumeration of a serviceitem's capabilities diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index d26919d79..9d98737dc 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -297,6 +297,8 @@ class OpenLyricsParser(object): song_xml = objectify.fromstring(xml) properties = song_xml.properties song.copyright = unicode(properties.copyright.text) + if song.copyright == u'None': + song.copyright = u'' song.verse_order = unicode(properties.verseOrder.text) if song.verse_order == u'None': song.verse_order = u'' @@ -357,7 +359,7 @@ class OpenLyricsParser(object): def _add_text_to_element(self, tag, parent, text=None, label=None): if label: - element = etree.Element(tag, name = unicode(label)) + element = etree.Element(tag, name=unicode(label)) else: element = etree.Element(tag) if text: From d1c79a595daac3eff4f4d63aa191841fa5a14acf Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 17 Dec 2010 19:15:31 +0000 Subject: [PATCH 131/140] Fix image edit bug --- openlp/core/ui/serviceitemeditform.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/core/ui/serviceitemeditform.py b/openlp/core/ui/serviceitemeditform.py index f385754f5..e57474315 100644 --- a/openlp/core/ui/serviceitemeditform.py +++ b/openlp/core/ui/serviceitemeditform.py @@ -64,8 +64,7 @@ class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog): self.item._raw_frames = [] if self.item.is_image(): for item in self.itemList: - self.item.add_from_image(item[u'path'], item[u'title'], - item[u'image']) + self.item.add_from_image(item[u'path'], item[u'title']) self.item.render() return self.item From c226979f2434c2b14e43021688dbde3fd7e4abe4 Mon Sep 17 00:00:00 2001 From: M2j Date: Fri, 17 Dec 2010 23:10:29 +0100 Subject: [PATCH 132/140] Format fixes, comment fixes and biblegateway.csv updated --- .../plugins/bibles/forms/bibleimportform.py | 19 +-- openlp/plugins/bibles/lib/__init__.py | 22 +-- openlp/plugins/bibles/lib/http.py | 8 +- openlp/plugins/bibles/lib/manager.py | 2 +- openlp/plugins/bibles/lib/mediaitem.py | 1 - .../plugins/bibles/resources/biblegateway.csv | 157 +++++++++--------- .../plugins/bibles/resources/bibleserver.csv | 4 +- .../bibles/resources/crosswalkbooks.csv | 2 +- 8 files changed, 105 insertions(+), 110 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 67c292c5c..a454404d9 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -339,31 +339,27 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): """ Load the list of Crosswalk and BibleGateway bibles. """ - # Load and store Crosswalk Bibles. + # Load Crosswalk Bibles. filepath = AppLocation.get_directory(AppLocation.PluginsDir) filepath = os.path.join(filepath, u'bibles', u'resources') books_file = None try: self.web_bible_list[WebDownload.Crosswalk] = {} books_file = open( - os.path.join(filepath, u'crosswalkbooks.csv'), 'r') + os.path.join(filepath, u'crosswalkbooks.csv'), 'rb') dialect = csv.Sniffer().sniff(books_file.read(1024)) books_file.seek(0) books_reader = csv.reader(books_file, dialect) for line in books_reader: - ver = line[0] - name = line[1] - if not isinstance(ver, unicode): - ver = unicode(ver, u'utf8') - if not isinstance(name, unicode): - name = unicode(name, u'utf8') + ver = unicode(line[0], u'utf-8') + name = unicode(line[1], u'utf-8') self.web_bible_list[WebDownload.Crosswalk][ver] = name.strip() except IOError: log.exception(u'Crosswalk resources missing') finally: if books_file: books_file.close() - # Load and store BibleGateway Bibles. + # Load BibleGateway Bibles. books_file = None try: self.web_bible_list[WebDownload.BibleGateway] = {} @@ -385,8 +381,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): finally: if books_file: books_file.close() - - # Load and store Bibleserver Bibles. + # Load and Bibleserver Bibles. filepath = AppLocation.get_directory(AppLocation.PluginsDir) filepath = os.path.join(filepath, u'bibles', u'resources') books_file = None @@ -402,7 +397,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): name = unicode(line[1], u'utf-8') self.web_bible_list[WebDownload.Bibleserver][ver] = name.strip() except IOError, UnicodeError: - log.exception(u'Bibelserver resources could not be imported') + log.exception(u'Bibelserver resources missing') finally: if books_file: books_file.close() diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py index 7a35508fc..6cb33bcce 100644 --- a/openlp/plugins/bibles/lib/__init__.py +++ b/openlp/plugins/bibles/lib/__init__.py @@ -46,18 +46,18 @@ def get_reference_match(match_type): # verse range match: (:)?(-(:)??)? range_string = str(r'(?:(?P[0-9]+)%(sep_v)s)?(?P' r'[0-9]+)(?P%(sep_r)s(?:(?:(?P[0-9]+)%(sep_v)s)?' - r'(?P[0-9]+)|%(sep_e)s)?)?' % separators) + r'(?P[0-9]+)|%(sep_e)s)?)?') % separators if match_type == u'range': return re.compile(r'^\s*' + range_string + r'\s*$', re.UNICODE) elif match_type == u'range_separator': return re.compile(separators[u'sep_l']) elif match_type == u'full': - # full reference match: ((,|(?=$)))+ - return re.compile(str(r'^\s*(?!\s)(?P[\d]*[^\d]+)(?((,|(?=$)))+ + return re.compile(str(r'^\s*(?!\s)(?P[\d]*[^\d]+)(?(?:' + range_string + r'(?:%(sep_l)s|(?=\s*$)))+)\s*$') % separators, re.UNICODE) else: - return separators[match_type] + return separators[match_type] def parse_reference(reference): """ @@ -69,9 +69,9 @@ def parse_reference(reference): - Each reference starts with the book name. A chapter name is manditory. ``John 3`` refers to Gospel of John chapter 3 - - A reference range can be given after a range seperator. + - A reference range can be given after a range separator. ``John 3-5`` refers to John chapters 3 to 5 - - Single verses can be addressed after a verse seperator + - Single verses can be addressed after a verse separator ``John 3:16`` refers to John chapter 3 verse 16 ``John 3:16-4:3`` refers to John chapter 3 verse 16 to chapter 4 verse 3 - After a verse reference all further single values are treat as verse in @@ -82,7 +82,7 @@ def parse_reference(reference): number of verse references. It is not possible to refer to verses in additional books. ``John 3:16,18`` refers to John chapter 3 verses 16 and 18 - ``John 3:16-18,20`` refers to John chapter 3 verses 16 to 18 to 20 + ``John 3:16-18,20`` refers to John chapter 3 verses 16 to 18 and 20 ``John 3:16-18,4:1`` refers to John chapter 3 verses 16 to 18 and chapter 3 verse 1 - If there is a range separator without further verse declaration the last @@ -97,11 +97,11 @@ def parse_reference(reference): 2. ``(?P[0-9]+)`` The verse reference ``from_verse`` is manditory 3. ``(?P%(sep_r)s(?:`` ... ``|%(sep_e)s)?)?`` - A ``range_to`` declaration is optional. It starts with a range seperator + A ``range_to`` declaration is optional. It starts with a range separator and contains optional a chapter and verse declaration or a end separator. 4. ``(?:(?P[0-9]+)%(sep_v)s)?`` - The ``to_chapter`` reference with seperator is equivalent to group 1. + The ``to_chapter`` reference with separator is equivalent to group 1. 5. ``(?P[0-9]+)`` The ``to_verse`` reference is equivalent to group 2. @@ -126,7 +126,6 @@ def parse_reference(reference): Returns None or a reference list. """ - log.debug('parse_reference("%s")', reference) match = get_reference_match(u'full').match(reference) if match: @@ -135,7 +134,7 @@ def parse_reference(reference): ranges = match.group(u'ranges') range_list = get_reference_match(u'range_separator').split(ranges) ref_list = [] - chapter = 0 + chapter = None for this_range in range_list: range_match = get_reference_match(u'range').match(this_range) from_chapter = range_match.group(u'from_chapter') @@ -169,6 +168,7 @@ def parse_reference(reference): to_chapter = chapter else: to_chapter = to_verse + to_verse = None # Append references to the list if has_range: if not from_verse: diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index bd24b3f46..218f7212e 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -250,13 +250,13 @@ class BSExtract(object): def get_bible_chapter(self, version, bookname, chapter): """ - Access and decode bibles via http://m.Bibleserver.com + Access and decode bibles via Bibleserver mobile website ``version`` The version of the bible like NIV for New International Version ``bookname`` - Text name of in english e.g. 'gen' for Genesis + Text name of bible book e.g. Genesis, 1. John, 1John or Offenbarung ``chapter`` Chapter number @@ -291,11 +291,11 @@ class BSExtract(object): finally: if not content: return None - verse_number = re.compile(r'v\d{5}(\d{3}) verse') + verse_number = re.compile(r'v(\d{2})(\d{3})(\d{3}) verse') verses = {} for verse in content: Receiver.send_message(u'openlp_process_events') - versenumber = int(verse_number.sub(r'\1', verse[u'class'])) + versenumber = int(verse_number.sub(r'\3', verse[u'class'])) verses[versenumber] = verse.contents[1].rstrip(u'\n') return SearchResults(bookname, chapter, verses) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 39d8b644c..93f301713 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -312,7 +312,7 @@ class BibleManager(object): 'Scripture Reference Error'), translate('BiblesPlugin.BibleManager', 'You did not enter a ' 'search keyword.\nYou can separate different keywords by a ' - 'space to search for all of your keywords and you can seperate ' + 'space to search for all of your keywords and you can separate ' 'them by a comma to search for one of them.')) return None diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index cced544b9..c206bd309 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -906,7 +906,6 @@ class BibleMediaItem(MediaManagerItem): ``verse`` The verse number (int). """ - verse_separator = get_reference_match(u'sep_v_display') if not self.parent.settings_tab.show_new_chapters or \ old_chapter != chapter: diff --git a/openlp/plugins/bibles/resources/biblegateway.csv b/openlp/plugins/bibles/resources/biblegateway.csv index 14f167897..ad8052704 100644 --- a/openlp/plugins/bibles/resources/biblegateway.csv +++ b/openlp/plugins/bibles/resources/biblegateway.csv @@ -1,80 +1,81 @@ +João Ferreira de Almeida Atualizada,AA +التفسير التطبيقى للكتاب المقدس,ALAB +Shqip,ALB +Amplified Bible,AMP Amuzgo de Guerrero,AMU -Arabic Life Application Bible,ALAB -Bulgarian Bible,BULG -1940 Bulgarian Bible,BG1940 -Chinanteco de Comaltepec,CCO -Cakchiquel Occidental,CKW -Haitian Creole Version,HCV -Slovo na cestu,SNC -Dette er Biblen pÃ¥ dansk,DN1933 -Hoffnung für Alle,HOF -Luther Bibel 1545,LUTH1545 -New International Version,NIV -New American Standard Bible,NASB -The Message,MSG -Amplified Bible,AMP -New Living Translation,NLT -King James Version,KJV -English Standard Version,ESV -Contemporary English Version,CEV -New King James Version,NKJV -New Century Version,NCV -21st Century King James Version,KJ21 -American Standard Version,ASV -Young's Literal Translation,YLT -Darby Translation,DARBY -Holman Christian Standard Bible,HCSB -New International Reader's Version,NIRV -Wycliffe New Testament,WYC -Worldwide English (New Testament),WE -New International Version - UK,NIVUK -Today's New International Version,TNIV +American Standard Version,ASV +La Bible du Semeur,BDS +Български 1940,BG1940 +Български,BULG +Chinanteco de Comaltepec,CCO +Contemporary English Version,CEV +Cakchiquel Occidental,CKW +Hrvatski,CRO +Castilian,CST +聖經和合本 (简体中文),CUVS +聖經和合本 (繁体中文),CUV +Darby Translation,DARBY +Dette er Biblen på dansk,DN1933 +Det Norsk Bibelselskap 1930,DNB1930 +English Standard Version,ESV +GOD’S WORD Translation,GW +Holman Christian Standard Bible,HCSB +Kreyòl ayisyen bib,HCV +Hiligaynon Bible,HLGN +Hoffnung für Alle,HOF +Het Boek,HTB +Icelandic Bible,ICELAND +Jacalteco – Oriental,JAC +Károlyi-biblia,KAR +Kekchi,KEK +21st Century King James Version,KJ21 +King James Version,KJV +La Biblia de las Américas,LBLA +Levande Bibeln,LB +La Parola è Vita,LM +La Nuova Diodati,LND +Louis Segond,LSG +Luther Bibel 1545,LUTH1545 +Māori Bible,MAORI +Македонски Новиот Завет,MNT +The Message,MSG +Mam de Comitancillo Central,MVC +Mam de Todos Santos Cuchumatán,MVJ +New American Standard Bible,NASB +New Century Version,NCV +Náhuatl de Guerrero,NGU +New International Reader's Version,NIRV +New International Version 1984,NIV1984 +New International Version 2010,NIV +New International Version - UK,NIVUK +New King James Version,NKJV +New Living Translation,NLT +Nádej pre kazdého,NPK +Nueva Versión Internacional,NVI +O Livro,OL +Quiché – Centro Occidental,QUT +Reimer 2001,REIMER +Română Cornilescu,RMNN +Новый перевод на русский язык,RUSV +Reina-Valera Antigua,RVA Reina-Valera 1960,RVR1960 -Nueva Versión Internacional,NVI -Reina-Valera 1995,RVR1995 -Castilian,CST -Reina-Valera Antigua,RVA -Biblia en Lenguaje Sencillo,BLS -La Biblia de las Américas,LBLA -Louis Segond,LSG -La Bible du Semeur,BDS -1881 Westcott-Hort New Testament,WHNU -1550 Stephanus New Testament,TR1550 -1894 Scrivener New Testament,TR1894 -The Westminster Leningrad Codex,WLC -Hiligaynon Bible,HLGN -Croatian Bible,CRO -Hungarian Károli,KAR -Icelandic Bible,ICELAND -La Nuova Diodati,LND -La Parola è Vita,LM -Jacalteco - Oriental,JAC -Kekchi,KEK -Korean Bible,KOREAN -Maori Bible,MAORI -Macedonian New Testament,MNT -Mam - Central,MVC -Mam de Todos Santos Chuchumatán,MVJ -Reimer 2001,REIMER -Náhuatl de Guerrero,NGU -Het Boek,HTB -Det Norsk Bibelselskap 1930,DNB1930 -Levande Bibeln,LB -O Livro,OL -João Ferreira de Almeida Atualizada,AA -Quiché - Centro Occidental,QUT -Romanian,RMNN -Romanian,TLCR -Russian Synodal Version,RUSV -Slovo Zhizny,SZ -Nádej pre kazdého,NPK -Albanian Bible,ALB -Levande Bibeln,SVL -Svenska 1917,SV1917 -Swahili New Testament,SNT -Ang Salita ng Diyos,SND -Ukrainian Bible,UKR -Uspanteco,USP -1934 Vietnamese Bible,VIET -Chinese Union Version (Simplified),CUVS -Chinese Union Version (Traditional),CUV +Reina-Valera 1995,RVR1995 +Slovo na cestu,SNC +Ang Salita ng Diyos,SND +Swahili New Testament,SNT +Svenska 1917,SV1917 +Levande Bibeln,SVL +Создать страницу,SZ +Traducción en lenguaje actual,TLA +New Romanian Translation,TLCR +Today’s New International Version 2005,TNIV +Textus Receptus Stephanus 1550,TR1550 +Textus Receptus Scrivener 1894,TR1894 +Українська Біблія. Переклад Івана Огієнка,UKR +Uspanteco,USP +Kinh Thánh tiếng Việt 1934,VIET +Worldwide English (New Testament),WE +Codex Vaticanus Westcott-Hort 1881,WHNU +Westminster Leningrad Codex,WLC +Wycliffe New Testament,WYC +Young's Literal Translation,YLT diff --git a/openlp/plugins/bibles/resources/bibleserver.csv b/openlp/plugins/bibles/resources/bibleserver.csv index d73bf1678..c0d109f97 100644 --- a/openlp/plugins/bibles/resources/bibleserver.csv +++ b/openlp/plugins/bibles/resources/bibleserver.csv @@ -27,7 +27,7 @@ En Levende Bok (NOR), NOR Nádej pre kazdého, NPK Noua traducere în limba românã, NTR Nueva Versión Internacional, NVI -Hebrew OT, OT +הברית הישנה, OT Słowo Życia, POL O Livro, PRT Новый перевод на русский язык, RUS @@ -36,4 +36,4 @@ Schlachter 2000, SLT En Levande Bok (SWE), SVL Today's New International Version, TNIV Türkçe, TR -Vulgata, VUL +Biblia Vulgata, VUL diff --git a/openlp/plugins/bibles/resources/crosswalkbooks.csv b/openlp/plugins/bibles/resources/crosswalkbooks.csv index 0b6de47de..7957bfdc8 100644 --- a/openlp/plugins/bibles/resources/crosswalkbooks.csv +++ b/openlp/plugins/bibles/resources/crosswalkbooks.csv @@ -24,4 +24,4 @@ New International Reader's Version,nrv The Darby Translation,dby The Webster Bible,wbt The Latin Vulgate,vul -Weymouth New Testament,wnt \ No newline at end of file +Weymouth New Testament,wnt From fc2569cf830b64262b32c167ea6be5b0df38c0c8 Mon Sep 17 00:00:00 2001 From: M2j Date: Sat, 18 Dec 2010 03:12:41 +0100 Subject: [PATCH 133/140] missed some fixes --- openlp/plugins/bibles/forms/bibleimportform.py | 2 +- openlp/plugins/bibles/lib/__init__.py | 6 +++--- openlp/plugins/bibles/lib/mediaitem.py | 7 ++++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index a454404d9..53e659064 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -397,7 +397,7 @@ class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard): name = unicode(line[1], u'utf-8') self.web_bible_list[WebDownload.Bibleserver][ver] = name.strip() except IOError, UnicodeError: - log.exception(u'Bibelserver resources missing') + log.exception(u'Bibleserver resources missing') finally: if books_file: books_file.close() diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py index 6cb33bcce..7975bfed7 100644 --- a/openlp/plugins/bibles/lib/__init__.py +++ b/openlp/plugins/bibles/lib/__init__.py @@ -43,7 +43,7 @@ def get_reference_match(match_type): u'sep_l_display': local_separator[4], u'sep_l': local_separator[5], u'sep_e': local_separator[6]} - # verse range match: (:)?(-(:)??)? + # verse range match: (:)?(-((:)?|end)?)? range_string = str(r'(?:(?P[0-9]+)%(sep_v)s)?(?P' r'[0-9]+)(?P%(sep_r)s(?:(?:(?P[0-9]+)%(sep_v)s)?' r'(?P[0-9]+)|%(sep_e)s)?)?') % separators @@ -54,8 +54,8 @@ def get_reference_match(match_type): elif match_type == u'full': # full reference match: ((,|(?=$)))+ return re.compile(str(r'^\s*(?!\s)(?P[\d]*[^\d]+)(?(?:' + range_string + r'(?:%(sep_l)s|(?=\s*$)))+)\s*$') - % separators, re.UNICODE) + r'(?P(?:' + range_string + r'(?:%(sep_l)s|(?=\s*$)))+)\s*$') + % separators, re.UNICODE) else: return separators[match_type] diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index c206bd309..8fafd0f97 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -743,7 +743,8 @@ class BibleMediaItem(MediaManagerItem): 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_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) @@ -754,8 +755,8 @@ class BibleMediaItem(MediaManagerItem): second_copyright, second_permissions) if footer not in raw_footer: raw_footer.append(footer) - bible_text = u'%s\u00a0%s\n\n%s\u00a0%s' % (verse_text, text, verse_text, - second_text) + bible_text = u'%s\u00a0%s\n\n%s\u00a0%s' % (verse_text, text, + verse_text, second_text) raw_slides.append(bible_text) bible_text = u'' # If we are 'Verse Per Slide' then create a new slide. From 02645f0457665692ab16ca578a2d71489f247546 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 18 Dec 2010 17:11:21 +0000 Subject: [PATCH 134/140] Songs must have an Author --- openlp/plugins/songs/forms/editsongform.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 58488a6e9..21958d403 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -547,14 +547,11 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): if self.AuthorsListView.count() == 0: self.SongTabWidget.setCurrentIndex(1) self.AuthorsListView.setFocus() - answer = QtGui.QMessageBox.warning(self, + QtGui.QMessageBox.critical(self, translate('SongsPlugin.EditSongForm', 'Warning'), translate('SongsPlugin.EditSongForm', - 'You have not added any authors for this song. Do you ' - 'want to add an author now?'), - QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if answer == QtGui.QMessageBox.Yes: - return False + 'You need to have an author for this song.')) + return False if self.song.verse_order: order = [] order_names = self.song.verse_order.split() From 47ac10f413fbce5bb09833f23e23be9d81a3ec18 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 18 Dec 2010 17:28:50 +0000 Subject: [PATCH 135/140] Fix songs with no text being saved Fixes: https://launchpad.net/bugs/691952 --- openlp/plugins/songs/forms/editverseform.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index d954bfb1f..e9f1359d2 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -29,7 +29,7 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.plugins.songs.lib import VerseType +from openlp.plugins.songs.lib import VerseType, translate from editversedialog import Ui_EditVerseDialog @@ -130,7 +130,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): self.verseNumberBox.setValue(verse_number) def setVerse(self, text, single=False, - tag=u'%s:1' % VerseType.to_string(VerseType.Verse)): + tag = u'%s:1' % VerseType.to_string(VerseType.Verse)): if single: verse_type, verse_number = tag.split(u':') verse_type_index = VerseType.from_string(verse_type) @@ -159,3 +159,12 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): text = u'---[%s:1]---\n%s' % (VerseType.to_string(VerseType.Verse), text) return text + + def accept(self): + if len(unicode(self.getVerse()[0])) == 0: + QtGui.QMessageBox.critical(self, + translate('SongsPlugin.EditSongForm', 'Error'), + translate('SongsPlugin.EditSongForm', + 'You need to type some text in to the verse.')) + return False + QtGui.QDialog.accept(self) From b553b2ac89d2cc07c73b054f1fcd08b21c538be9 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 18 Dec 2010 19:24:44 +0000 Subject: [PATCH 136/140] Tighten up the validation --- openlp/plugins/songs/forms/editverseform.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index e9f1359d2..dce8c91d7 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -131,6 +131,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): def setVerse(self, text, single=False, tag = u'%s:1' % VerseType.to_string(VerseType.Verse)): + self.verseType = single if single: verse_type, verse_number = tag.split(u':') verse_type_index = VerseType.from_string(verse_type) @@ -161,7 +162,11 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): return text def accept(self): - if len(unicode(self.getVerse()[0])) == 0: + if self.verseType: + value = unicode(self.getVerse()[0]) + else: + value = self.getVerse()[0].split(u'\n')[1] + if len(value) == 0: QtGui.QMessageBox.critical(self, translate('SongsPlugin.EditSongForm', 'Error'), translate('SongsPlugin.EditSongForm', From bef5479a6a9237ccf628e68e5f8a76ea35b68d8b Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 19 Dec 2010 08:22:48 +0000 Subject: [PATCH 137/140] Fix spacing --- openlp/plugins/songs/forms/editverseform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index dce8c91d7..5711abc6c 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -130,7 +130,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): self.verseNumberBox.setValue(verse_number) def setVerse(self, text, single=False, - tag = u'%s:1' % VerseType.to_string(VerseType.Verse)): + tag=u'%s:1' % VerseType.to_string(VerseType.Verse)): self.verseType = single if single: verse_type, verse_number = tag.split(u':') From 12af5cada389f34fba0658b1de326d4d2fe7aaec Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 20 Dec 2010 14:15:03 +0000 Subject: [PATCH 138/140] Fix field name --- openlp/plugins/songs/forms/editverseform.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index 5711abc6c..8f5f04194 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -131,7 +131,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): def setVerse(self, text, single=False, tag=u'%s:1' % VerseType.to_string(VerseType.Verse)): - self.verseType = single + self.hasSingleVerse = single if single: verse_type, verse_number = tag.split(u':') verse_type_index = VerseType.from_string(verse_type) @@ -162,7 +162,7 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog): return text def accept(self): - if self.verseType: + if self.hasSingleVerse: value = unicode(self.getVerse()[0]) else: value = self.getVerse()[0].split(u'\n')[1] From cb4fa5d03ab5c84d5234c3c19aedc91c6df2846c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 20 Dec 2010 20:22:21 +0000 Subject: [PATCH 139/140] Fix Preview of Theme with Image bug Fix Protection of Single Character Theme titles Add Cursor update to Image import Fixes: https://launchpad.net/bugs/692684 --- openlp/core/lib/imagemanager.py | 10 ++++++++++ openlp/core/lib/rendermanager.py | 2 ++ openlp/core/ui/slidecontroller.py | 2 +- openlp/core/ui/themeform.py | 2 +- openlp/plugins/images/lib/mediaitem.py | 6 +++++- 5 files changed, 19 insertions(+), 3 deletions(-) diff --git a/openlp/core/lib/imagemanager.py b/openlp/core/lib/imagemanager.py index 307ee84df..14de141fc 100644 --- a/openlp/core/lib/imagemanager.py +++ b/openlp/core/lib/imagemanager.py @@ -113,6 +113,14 @@ class ImageManager(QtCore.QObject): time.sleep(0.1) return self._cache[name].image_bytes + def del_image(self, name): + """ + Delete the Image from the Cache + """ + log.debug(u'del_image %s' % name) + if name in self._cache: + del self._cache[name] + def add_image(self, name, path): """ Add image to cache if it is not already there @@ -125,6 +133,8 @@ class ImageManager(QtCore.QObject): image.image = resize_image(path, self.width, self.height) self._cache[name] = image + else: + log.debug(u'Image in cache %s:%s' % (name, path)) self._cache_dirty = True # only one thread please if not self._thread_running: diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index 81cde12a0..fc7ba38b8 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -213,6 +213,8 @@ class RenderManager(object): # make big page for theme edit dialog to get line count if self.force_page: verse = verse + verse + verse + else: + self.image_manager.del_image(self.theme_data.theme_name) footer = [] footer.append(u'Arky Arky (Unknown)' ) footer.append(u'Public Domain') diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 6c7fb8538..0f275a792 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -560,7 +560,7 @@ class SlideController(QtGui.QWidget): [serviceItem, self.isLive, blanked, slideno]) self.slideList = {} width = self.parent.ControlSplitter.sizes()[self.split] - # Set pointing cursor when we have somthing to point at + # Set pointing cursor when we have something to point at self.PreviewListWidget.setCursor(QtCore.Qt.PointingHandCursor) self.serviceItem = serviceItem self.PreviewListWidget.clear() diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index b091427bf..84c6f0aa3 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -444,7 +444,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): def setPreviewTabValues(self): self.setField(u'name', QtCore.QVariant(self.theme.theme_name)) - if len(self.theme.theme_name) > 1: + if len(self.theme.theme_name) > 0: self.themeNameEdit.setEnabled(False) else: self.themeNameEdit.setEnabled(True) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 4f1e9378e..0774787f5 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \ context_menu_action, ItemCapabilities, SettingsManager, translate, \ - check_item_selected + check_item_selected, Receiver from openlp.core.utils import AppLocation, get_images_filter log = logging.getLogger(__name__) @@ -139,6 +139,8 @@ class ImageMediaItem(MediaManagerItem): self.settingsSection, self.getFileList()) def loadList(self, list): + self.listView.setCursor(QtCore.Qt.BusyCursor) + Receiver.send_message(u'openlp_process_events') for file in list: filename = os.path.split(unicode(file))[1] thumb = os.path.join(self.servicePath, filename) @@ -153,6 +155,8 @@ class ImageMediaItem(MediaManagerItem): item_name.setIcon(icon) item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(file)) self.listView.addItem(item_name) + self.listView.setCursor(QtCore.Qt.ArrowCursor) + Receiver.send_message(u'openlp_process_events') def generateSlideData(self, service_item, item=None, xmlVersion=False): items = self.listView.selectedIndexes() From 47ac045f1da61de4e5651328de89fcf64508e92c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 21 Dec 2010 11:09:00 +0000 Subject: [PATCH 140/140] Fix config tag error --- openlp/core/ui/slidecontroller.py | 2 +- openlp/core/ui/themeform.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 0f275a792..4f75a3ce0 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -466,7 +466,7 @@ class SlideController(QtGui.QWidget): self.Toolbar.actions[u'Stop Loop'].setVisible(False) if item.is_text(): if QtCore.QSettings().value( - self.parent.songsSettingsSection + u'/show songbar', + self.parent.songsSettingsSection + u'/display songbar', QtCore.QVariant(True)).toBool() and len(self.slideList) > 0: self.Toolbar.makeWidgetsVisible([u'Song Menu']) if item.is_capable(ItemCapabilities.AllowsLoop) and \ diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index 84c6f0aa3..7ed58e943 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -289,6 +289,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): """ Run the wizard. """ + log.debug(u'Editing theme %s' % self.theme.theme_name) self.updateThemeAllowed = False self.setDefaults() self.updateThemeAllowed = True