From e52a80c9c3fb09d3880e640fdc79324fe0388283 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sat, 12 Mar 2011 11:23:42 +0100 Subject: [PATCH 001/124] rename httpbooks.sqlite to bibles_resources.sqlite and change database scheme moved the content of biblegateway.csv, bibleserver.csv and crosswalkbooks.csv into bibles_resources.sqlite adapt loadWebBibles() process according to the changes above remove class HTTPBible from http.py and add the functions to a new class BiblesResourcesDB in db.py which now handels the reading of bibles_resources.sqlite --- .../plugins/bibles/forms/bibleimportform.py | 44 ++-- openlp/plugins/bibles/lib/db.py | 192 ++++++++++++++++++ openlp/plugins/bibles/lib/http.py | 146 +------------ .../plugins/bibles/resources/biblegateway.csv | 81 -------- .../bibles/resources/bibles_resources.sqlite | Bin 0 -> 63488 bytes .../plugins/bibles/resources/bibleserver.csv | 39 ---- .../bibles/resources/crosswalkbooks.csv | 27 --- .../plugins/bibles/resources/httpbooks.sqlite | Bin 45056 -> 0 bytes 8 files changed, 210 insertions(+), 319 deletions(-) delete mode 100644 openlp/plugins/bibles/resources/biblegateway.csv create mode 100644 openlp/plugins/bibles/resources/bibles_resources.sqlite delete mode 100644 openlp/plugins/bibles/resources/bibleserver.csv delete mode 100644 openlp/plugins/bibles/resources/crosswalkbooks.csv delete mode 100644 openlp/plugins/bibles/resources/httpbooks.sqlite diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 7967b2ec4..9fee25654 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -39,6 +39,7 @@ from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.utils import AppLocation, string_is_unicode from openlp.plugins.bibles.lib.manager import BibleFormat +from openlp.plugins.bibles.lib.db import BiblesResourcesDB log = logging.getLogger(__name__) @@ -634,46 +635,27 @@ class BibleImportForm(OpenLPWizard): """ Load the lists of Crosswalk, BibleGateway and Bibleserver bibles. """ - filepath = AppLocation.get_directory(AppLocation.PluginsDir) - filepath = os.path.join(filepath, u'bibles', u'resources') # Load Crosswalk Bibles. - self.loadBibleResourceFile( - os.path.join(filepath, u'crosswalkbooks.csv'), - WebDownload.Crosswalk) + self.loadBibleResource(WebDownload.Crosswalk) # Load BibleGateway Bibles. - self.loadBibleResourceFile(os.path.join(filepath, u'biblegateway.csv'), - WebDownload.BibleGateway) + self.loadBibleResource(WebDownload.BibleGateway) # Load and Bibleserver Bibles. - self.loadBibleResourceFile(os.path.join(filepath, u'bibleserver.csv'), - WebDownload.Bibleserver) + self.loadBibleResource(WebDownload.Bibleserver) - def loadBibleResourceFile(self, file_path_name, download_type): + def loadBibleResource(self, download_type): """ - Loads a web bible resource file. - - ``file_path_name`` - The file to load including the file's path. + Loads a web bible from bible_resources.sqlite. ``download_type`` - The WebDownload type this file is for. + The WebDownload type e.g. bibleserver. """ self.web_bible_list[download_type] = {} - books_file = None - try: - books_file = open(file_path_name, '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 = string_is_unicode(line[0]) - name = string_is_unicode(line[1]) - self.web_bible_list[download_type][ver] = name.strip() - except IOError: - log.exception(u'%s resources missing' % - WebDownload.Names[download_type]) - finally: - if books_file: - books_file.close() + bibles = BiblesResourcesDB.get_webbibles( + WebDownload.Names[download_type]) + for bible in bibles: + ver = bible[u'name'] + name = bible[u'abbreviation'] + self.web_bible_list[download_type][ver] = name.strip() def preWizard(self): """ diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 5cf000ee1..a1c8fb9a1 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -26,7 +26,9 @@ import logging import chardet +import os import re +import sqlite3 from PyQt4 import QtCore from sqlalchemy import Column, ForeignKey, or_, Table, types @@ -36,6 +38,7 @@ from sqlalchemy.orm.exc import UnmappedClassError from openlp.core.lib import Receiver, translate from openlp.core.lib.db import BaseModel, init_db, Manager from openlp.core.lib.ui import critical_error_message_box +from openlp.core.utils import AppLocation log = logging.getLogger(__name__) @@ -444,3 +447,192 @@ class BibleDB(QtCore.QObject, Manager): log.debug(u'...............................Verses ') verses = self.session.query(Verse).all() log.debug(verses) + + +class BiblesResourcesDB(QtCore.QObject, Manager): + """ + This class represents the database-bound Bible Resources. It provide + some resources which are used in the Bibles plugin. + A wrapper class around a small SQLite database which contains the download + resources, a biblelist from the different download resources, the books, + chapter counts and verse counts for the web download Bibles, a language + reference, the testament reference and some basic spelling variants. This + class contains a singleton "cursor" so that only one connection to the + SQLite database is ever used. + """ + cursor = None + + @staticmethod + def get_cursor(): + """ + Return the cursor object. Instantiate one if it doesn't exist yet. + """ + if BiblesResourcesDB.cursor is None: + filepath = os.path.join( + AppLocation.get_directory(AppLocation.PluginsDir), u'bibles', + u'resources', u'bibles_resources.sqlite') + conn = sqlite3.connect(filepath) + BiblesResourcesDB.cursor = conn.cursor() + return BiblesResourcesDB.cursor + + @staticmethod + def run_sql(query, parameters=()): + """ + Run an SQL query on the database, returning the results. + + ``query`` + The actual SQL query to run. + + ``parameters`` + Any variable parameters to add to the query. + """ + cursor = BiblesResourcesDB.get_cursor() + cursor.execute(query, parameters) + return cursor.fetchall() + + @staticmethod + def get_books(): + """ + Return a list of all the books of the Bible. + """ + books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' + u'abbreviation, chapters FROM book_reference ORDER BY id') + book_list = [] + for book in books: + book_list.append({ + u'id': book[0], + u'testament_id': book[1], + u'name': unicode(book[2]), + u'abbreviation': unicode(book[3]), + u'chapters': book[4] + }) + return book_list + + @staticmethod + def get_book(name): + """ + Return a book by name or abbreviation. + + ``name`` + The name or abbreviation of the book. + """ + if not isinstance(name, unicode): + name = unicode(name) + name = name.title() + books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' + u'abbreviation, chapters FROM book_reference WHERE name = ? OR ' + u'abbreviation = ?', (name, name)) + if books: + return { + u'id': books[0][0], + u'testament_id': books[0][1], + u'name': unicode(books[0][2]), + u'abbreviation': unicode(books[0][3]), + u'chapters': books[0][4] + } + else: + return None + + @staticmethod + def get_chapter(name, chapter): + """ + Return the chapter details for a specific chapter of a book. + + ``name`` + The name or abbreviation of a book. + + ``chapter`` + The chapter number. + """ + if not isinstance(name, int): + chapter = int(chapter) + book = BiblesResourcesDB.get_book(name) + chapters = BiblesResourcesDB.run_sql(u'SELECT id, book_reference_id, ' + u'chapter, verse_count FROM chapters WHERE book_reference_id = ?', + (book[u'id'],)) + if chapters: + return { + u'id': chapters[chapter-1][0], + u'book_reference_id': chapters[chapter-1][1], + u'chapter': chapters[chapter-1][2], + u'verse_count': chapters[chapter-1][3] + } + else: + return None + + @staticmethod + def get_chapter_count(book): + """ + Return the number of chapters in a book. + + ``book`` + The name or abbreviation of the book. + """ + details = BiblesResourcesDB.get_book(book) + if details: + return details[u'chapters'] + return 0 + + @staticmethod + def get_verse_count(book, chapter): + """ + Return the number of verses in a chapter. + + ``book`` + The name or abbreviation of the book. + + ``chapter`` + The number of the chapter. + """ + details = BiblesResourcesDB.get_chapter(book, chapter) + if details: + return details[u'verse_count'] + return 0 + + @staticmethod + def get_download_source(source): + """ + Return a download_source by source. + + ``name`` + The name or abbreviation of the book. + """ + if not isinstance(source, unicode): + source = unicode(source) + source = source.title() + #source = source.lower() + log.debug(u'Test: %s' % source) + dl_source = BiblesResourcesDB.run_sql(u'SELECT id, source FROM ' + u'download_source WHERE source = ?', (source.lower(),)) + if dl_source: + return { + u'id': dl_source[0][0], + u'source': dl_source[0][1] + } + else: + return None + + @staticmethod + def get_webbibles(source): + """ + Return the chapter details for a specific chapter of a book. + + ``name`` + The name of the webbible. + """ + if not isinstance(source, unicode): + source = unicode(source) + source = BiblesResourcesDB.get_download_source(source) + bibles = BiblesResourcesDB.run_sql(u'SELECT id, name, abbreviation, ' + u'language_id, download_source_id FROM webbibles WHERE ' + u'download_source_id = ?', (source[u'id'],)) + bibles_temp = [] + for bible in bibles: + bibles_temp.append({ + u'id': bible[0], + u'name': bible[1], + u'abbreviation': bible[2], + u'language_id': bible[3], + u'download_source_id': bible[4] + }) + return bibles_temp diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index e2dde59fd..d2202909c 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -41,146 +41,10 @@ from openlp.core.lib import Receiver, translate from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, get_web_page from openlp.plugins.bibles.lib import SearchResults -from openlp.plugins.bibles.lib.db import BibleDB, Book +from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB, Book log = logging.getLogger(__name__) -class HTTPBooks(object): - """ - A wrapper class around a small SQLite database which contains the books, - chapter counts and verse counts for the web download Bibles. This class - contains a singleton "cursor" so that only one connection to the SQLite - database is ever used. - """ - cursor = None - - @staticmethod - def get_cursor(): - """ - Return the cursor object. Instantiate one if it doesn't exist yet. - """ - if HTTPBooks.cursor is None: - filepath = os.path.join( - AppLocation.get_directory(AppLocation.PluginsDir), u'bibles', - u'resources', u'httpbooks.sqlite') - conn = sqlite3.connect(filepath) - HTTPBooks.cursor = conn.cursor() - return HTTPBooks.cursor - - @staticmethod - def run_sql(query, parameters=()): - """ - Run an SQL query on the database, returning the results. - - ``query`` - The actual SQL query to run. - - ``parameters`` - Any variable parameters to add to the query. - """ - cursor = HTTPBooks.get_cursor() - cursor.execute(query, parameters) - return cursor.fetchall() - - @staticmethod - def get_books(): - """ - Return a list of all the books of the Bible. - """ - books = HTTPBooks.run_sql(u'SELECT id, testament_id, name, ' - u'abbreviation, chapters FROM books ORDER BY id') - book_list = [] - for book in books: - book_list.append({ - u'id': book[0], - u'testament_id': book[1], - u'name': unicode(book[2]), - u'abbreviation': unicode(book[3]), - u'chapters': book[4] - }) - return book_list - - @staticmethod - def get_book(name): - """ - Return a book by name or abbreviation. - - ``name`` - The name or abbreviation of the book. - """ - if not isinstance(name, unicode): - name = unicode(name) - name = name.title() - books = HTTPBooks.run_sql(u'SELECT id, testament_id, name, ' - u'abbreviation, chapters FROM books WHERE name = ? OR ' - u'abbreviation = ?', (name, name)) - if books: - return { - u'id': books[0][0], - u'testament_id': books[0][1], - u'name': unicode(books[0][2]), - u'abbreviation': unicode(books[0][3]), - u'chapters': books[0][4] - } - else: - return None - - @staticmethod - def get_chapter(name, chapter): - """ - Return the chapter details for a specific chapter of a book. - - ``name`` - The name or abbreviation of a book. - - ``chapter`` - The chapter number. - """ - if not isinstance(name, int): - chapter = int(chapter) - book = HTTPBooks.get_book(name) - chapters = HTTPBooks.run_sql(u'SELECT id, book_id, chapter, ' - u'verses FROM chapters WHERE book_id = ?', (book[u'id'],)) - if chapters: - return { - u'id': chapters[chapter-1][0], - u'book_id': chapters[chapter-1][1], - u'chapter': chapters[chapter-1][2], - u'verses': chapters[chapter-1][3] - } - else: - return None - - @staticmethod - def get_chapter_count(book): - """ - Return the number of chapters in a book. - - ``book`` - The name or abbreviation of the book. - """ - details = HTTPBooks.get_book(book) - if details: - return details[u'chapters'] - return 0 - - @staticmethod - def get_verse_count(book, chapter): - """ - Return the number of verses in a chapter. - - ``book`` - The name or abbreviation of the book. - - ``chapter`` - The number of the chapter. - """ - details = HTTPBooks.get_chapter(book, chapter) - if details: - return details[u'verses'] - return 0 - - class BGExtract(object): """ Extract verses from BibleGateway @@ -447,7 +311,7 @@ class HTTPBible(BibleDB): book = reference[0] db_book = self.get_book(book) if not db_book: - book_details = HTTPBooks.get_book(book) + book_details = BiblesResourcesDB.get_book(book) if not book_details: critical_error_message_box( translate('BiblesPlugin', 'No Book Found'), @@ -497,13 +361,13 @@ class HTTPBible(BibleDB): Return the list of books. """ return [Book.populate(name=book['name']) - for book in HTTPBooks.get_books()] + for book in BiblesResourcesDB.get_books()] def get_chapter_count(self, book): """ Return the number of chapters in a particular book. """ - return HTTPBooks.get_chapter_count(book) + return BiblesResourcesDB.get_chapter_count(book) def get_verse_count(self, book, chapter): """ @@ -515,7 +379,7 @@ class HTTPBible(BibleDB): ``chapter`` The chapter whose verses are being counted. """ - return HTTPBooks.get_verse_count(book, chapter) + return BiblesResourcesDB.get_verse_count(book, chapter) def get_soup_for_bible_ref(reference_url, header=None, pre_parse_regex=None, pre_parse_substitute=None, cleaner=None): diff --git a/openlp/plugins/bibles/resources/biblegateway.csv b/openlp/plugins/bibles/resources/biblegateway.csv deleted file mode 100644 index ad8052704..000000000 --- a/openlp/plugins/bibles/resources/biblegateway.csv +++ /dev/null @@ -1,81 +0,0 @@ -João Ferreira de Almeida Atualizada,AA -التفسير التطبيقى للكتاب المقدس,ALAB -Shqip,ALB -Amplified Bible,AMP -Amuzgo de Guerrero,AMU -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 -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/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..bcb45b8015c5cb6855a3c2d6c0aa821ce2324151 GIT binary patch literal 63488 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 ZtMyvtz$yn;Ik3usRSv9j;2)0z{|gx&Ns|Bo literal 0 HcmV?d00001 diff --git a/openlp/plugins/bibles/resources/bibleserver.csv b/openlp/plugins/bibles/resources/bibleserver.csv deleted file mode 100644 index 942d43116..000000000 --- a/openlp/plugins/bibles/resources/bibleserver.csv +++ /dev/null @@ -1,39 +0,0 @@ -عربي, 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 -Revidierte 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, NGU -New International Readers Version, NIRV -New International Version, NIV -Neues Leben, NL -En Levende Bok (NOR), NOR -Nádej pre kazdého, NPK -Noua traducere în limba românã, NTR -Nueva Versión Internacional, NVI -הברית הישנה, OT -Słowo Życia, POL -O Livro, PRT -Новый перевод на русский язык, RUS -Slovo na cestu, SNC -Schlachter 2000, SLT -En Levande Bok (SWE), SVL -Today's New International Version, TNIV -Türkçe, TR -Biblia Vulgata, VUL diff --git a/openlp/plugins/bibles/resources/crosswalkbooks.csv b/openlp/plugins/bibles/resources/crosswalkbooks.csv deleted file mode 100644 index 7957bfdc8..000000000 --- a/openlp/plugins/bibles/resources/crosswalkbooks.csv +++ /dev/null @@ -1,27 +0,0 @@ -New American Standard,nas -American Standard Version,asv -English Standard Version,esv -New King James Version,nkj -King James Version,kjv -Holman Christian Standard Bible,csb -Third Millennium Bible,tmb -New International Version,niv -New Living Translation,nlt -New Revised Standard,nrs -Revised Standard Version,rsv -Good News Translation,gnt -Douay-Rheims Bible,rhe -The Message,msg -The Complete Jewish Bible,cjb -New Century Version,ncv -GOD'S WORD Translation,gwd -Hebrew Names Version,hnv -World English Bible,web -The Bible in Basic English,bbe -Young's Literal Translation,ylt -Today's New International Version,tnv -New International Reader's Version,nrv -The Darby Translation,dby -The Webster Bible,wbt -The Latin Vulgate,vul -Weymouth New Testament,wnt diff --git a/openlp/plugins/bibles/resources/httpbooks.sqlite b/openlp/plugins/bibles/resources/httpbooks.sqlite deleted file mode 100644 index 406914b63cd5d3159f437b850840db4832113d13..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 45056 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 Date: Sun, 13 Mar 2011 20:45:46 +0100 Subject: [PATCH 002/124] filled tables language, testament_reference, webbibles, download_source in bibles_resources.sqlite with data and extend tables book_reference and chapters add method reload_spelling() in manager.py add class SpellingDB and extend class BiblesResourcesDB --- openlp/plugins/bibles/lib/db.py | 198 ++++++++++++++++-- openlp/plugins/bibles/lib/manager.py | 22 +- .../bibles/resources/bibles_resources.sqlite | Bin 63488 -> 63488 bytes 3 files changed, 205 insertions(+), 15 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index a1c8fb9a1..3eb7c3af1 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -69,6 +69,12 @@ class Verse(BaseModel): """ pass +class Spelling(BaseModel): + """ + Spelling model + """ + pass + def init_schema(url): """ @@ -123,6 +129,29 @@ def init_schema(url): metadata.create_all(checkfirst=True) return session +def init_schema_spelling_extension(url): + """ + Setup a spelling database connection and initialise the database schema. + + ``url`` + The database to setup. + """ + session, metadata = init_db(url) + + spelling_table = Table(u'spelling', metadata, + Column(u'id', types.Integer, primary_key=True), + Column(u'book_reference_id', types.Integer), + Column(u'language_id', types.Integer), + Column(u'name', types.Unicode(50), index=True), + ) + + try: + class_mapper(Spelling) + except UnmappedClassError: + mapper(Spelling, spelling_table) + + metadata.create_all(checkfirst=True) + return session class BibleDB(QtCore.QObject, Manager): """ @@ -592,7 +621,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): @staticmethod def get_download_source(source): """ - Return a download_source by source. + Return a download_source_id by source. ``name`` The name or abbreviation of the book. @@ -600,8 +629,6 @@ class BiblesResourcesDB(QtCore.QObject, Manager): if not isinstance(source, unicode): source = unicode(source) source = source.title() - #source = source.lower() - log.debug(u'Test: %s' % source) dl_source = BiblesResourcesDB.run_sql(u'SELECT id, source FROM ' u'download_source WHERE source = ?', (source.lower(),)) if dl_source: @@ -615,7 +642,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): @staticmethod def get_webbibles(source): """ - Return the chapter details for a specific chapter of a book. + Return the bibles a webbible provide for download. ``name`` The name of the webbible. @@ -626,13 +653,156 @@ class BiblesResourcesDB(QtCore.QObject, Manager): bibles = BiblesResourcesDB.run_sql(u'SELECT id, name, abbreviation, ' u'language_id, download_source_id FROM webbibles WHERE ' u'download_source_id = ?', (source[u'id'],)) - bibles_temp = [] - for bible in bibles: - bibles_temp.append({ - u'id': bible[0], - u'name': bible[1], - u'abbreviation': bible[2], - u'language_id': bible[3], - u'download_source_id': bible[4] - }) - return bibles_temp + if bibles: + bibles_temp = [] + for bible in bibles: + bibles_temp.append({ + u'id': bible[0], + u'name': bible[1], + u'abbreviation': bible[2], + u'language_id': bible[3], + u'download_source_id': bible[4] + }) + return bibles_temp + else: + return None + + @staticmethod + def get_spelling(name, language_id=None): + """ + Return a book_reference_id if the name matches. + """ + if language_id: + id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' + u'FROM spelling WHERE name = ? and language_id = ? ORDER BY id', + (name, language_id)) + else: + id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' + u'FROM spelling WHERE name = ? ORDER BY id', (name, )) + if id: + return int(id[0][0]) + else: + return None + + @staticmethod + def get_language(name): + """ + Return a dict containing the language id, name and code by name or + abbreviation. + + ``name`` + The name or abbreviation of the language. + """ + if not isinstance(name, unicode): + name = unicode(name) + name = name.title() + language = BiblesResourcesDB.run_sql(u'SELECT id, name, code FROM ' + u'language WHERE name = ? OR code = ?', (name, name.lower())) + if language: + return { + u'id': language[0][0], + u'name': unicode(language[0][1]), + u'code': unicode(language[0][2]) + } + else: + return None + + @staticmethod + def get_testament_reference(): + """ + Return a list of all testaments and their id of the Bible. + """ + testaments = BiblesResourcesDB.run_sql(u'SELECT id, name FROM ' + u'testament_reference ORDER BY id') + testament_list = [] + for testament in testaments: + testament_list.append({ + u'id': testament[0], + u'name': unicode(testament[1]) + }) + return testament_list + +class SpellingDB(QtCore.QObject, Manager): + """ + This class represents a database-bound spelling. + """ + + def __init__(self, parent, **kwargs): + """ + The constructor loads up the database and creates and initialises the + tables if the database doesn't exist. + + **Required keyword arguments:** + + ``path`` + The path to the bible database file. + + ``name`` + The name of the database. This is also used as the file name for + SQLite databases. + """ + log.info(u'SpellingDB loaded') + QtCore.QObject.__init__(self) + self.bible_plugin = parent + if u'path' not in kwargs: + raise KeyError(u'Missing keyword argument "path".') + self.stop_import_flag = False + self.name = u'spelling_extension.sqlite' + if not isinstance(self.name, unicode): + self.name = unicode(self.name, u'utf-8') + self.file = self.name + Manager.__init__(self, u'bibles/resources', + init_schema_spelling_extension, self.file) + self.wizard = None + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import) + + def stop_import(self): + """ + Stops the import of the Bible. + """ + log.debug(u'Stopping import') + self.stop_import_flag = True + + def get_book_reference_id(self, name, language=None): + """ + Return the book_reference_id of a name. + + ``name`` + The name to search the id. + + ``language`` + The language for which should be searched + """ + log.debug(u'SpellingDB.get_book_reference_id("%s")', name) + if language: + id = self.session.query(Spelling.book_reference_id)\ + .filter(Spelling.name.like(name))\ + .filter(Spelling.language_id.like(language)).first() + else: + id = self.get_object_filtered(Spelling.book_reference_id, + Spelling.name.like(name)) + if not id: + return None + else: + return id + + def create_spelling(self, name, book_reference_id, language_id): + """ + Add a spelling to the database. + + ``name`` + The name of the spelling. + + ``book_reference_id`` + The book_reference_id of the book. + + ``language_id`` + The language which the spelling of the book name is. + """ + log.debug(u'create_spelling %s, book_reference_id:%s, language_id:%s', + name, book_reference_id, language_id) + spelling = Spelling.populate(name=name, + book_reference_id=book_reference_id, language_id=language_id) + self.save_object(spelling) + return spelling diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index dcbad3e63..46dc0ce3b 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -31,7 +31,8 @@ from PyQt4 import QtCore from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.utils import AppLocation from openlp.plugins.bibles.lib import parse_reference -from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta +from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, SpellingDB, \ + Spelling, BiblesResourcesDB from csvbible import CSVBible from http import HTTPBible @@ -129,6 +130,7 @@ class BibleManager(object): self.suffix = u'.sqlite' self.import_wizard = None self.reload_bibles() + self.reload_spelling() self.media = None def reload_bibles(self): @@ -162,6 +164,24 @@ class BibleManager(object): self.db_cache[name] = web_bible log.debug(u'Bibles reloaded') + def reload_spelling(self): + """ + Reloads the Spelling from the Spelling table and spelling_extension + database on disk. + """ + log.debug(u'Reload spelling') + self.spelling_cache = {} + self.spelling_cache[u'spelling'] = SpellingDB(self.parent, + path=self.path) + #db_spelling = self.spelling_cache[u'spelling'].get_book_reference_id(u'Markus', 40) + #db_spelling = BiblesResourcesDB.get_spelling(u'1.Mose', 30) + #db_spelling = BiblesResourcesDB.get_language(u'de') + #db_spelling = BiblesResourcesDB.get_books() + #db_spelling = BiblesResourcesDB.get_testament_reference() + #db_spelling = self.spelling_cache[u'spelling'] .create_spelling(u'Johannes', 43, 40) + #log.debug(u'Spellings: %s' % db_spelling) + log.debug(u'Spelling reloaded') + def set_process_dialog(self, wizard): """ Sets the reference to the dialog with the progress bar on it. diff --git a/openlp/plugins/bibles/resources/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite index bcb45b8015c5cb6855a3c2d6c0aa821ce2324151..3049657ecce5196e97303df41161553b81f203f1 100644 GIT binary patch delta 116 zcmZqpz})bGd4e=!!bBNo#)ORtOV|b2m|Yl{?=c@|Ud-IZ9L4OiS&_qlSz3gRS(mYx zp@1QkAqNOE8S)s?85p%#nIjn|J9w*YZso3zU}I!{&A|M6v!KXBW)WdVRt82!RYna% U20aE}hJ1!%hSbgf(-|iK0MDizRsaA1 delta 64 zcmV-G0Kfl$@B@JG1CSd5Uy&R`0bj9Tqz4WK16lwB-UG)2qXUWqTC*_>NCO2b1p`?D WlR!%*vxN(PShECpqXe_3XjzYlF%(k( From 1c59fd656f73a4cf01e35547a8be950b2d9204c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 17 Mar 2011 19:36:54 +0100 Subject: [PATCH 003/124] add download of all books a webbible contains add dialog while the import of a webbible if the book could not be assign to a reference_book add dialog while tho import of a webbible if the language is unknown change the bible database --- openlp/plugins/bibles/forms/__init__.py | 1 + .../bibles/forms/bibleimportrequestdialog.py | 95 ++++++++++ .../bibles/forms/bibleimportrequestform.py | 82 +++++++++ openlp/plugins/bibles/lib/csvbible.py | 3 + openlp/plugins/bibles/lib/db.py | 127 +++++++++++--- openlp/plugins/bibles/lib/http.py | 163 ++++++++++++++++-- openlp/plugins/bibles/lib/manager.py | 66 ++++++- openlp/plugins/bibles/lib/mediaitem.py | 6 + openlp/plugins/bibles/lib/openlp1.py | 3 + openlp/plugins/bibles/lib/opensong.py | 3 + openlp/plugins/bibles/lib/osis.py | 3 + .../bibles/resources/bibles_resources.sqlite | Bin 63488 -> 63488 bytes 12 files changed, 504 insertions(+), 48 deletions(-) create mode 100644 openlp/plugins/bibles/forms/bibleimportrequestdialog.py create mode 100644 openlp/plugins/bibles/forms/bibleimportrequestform.py diff --git a/openlp/plugins/bibles/forms/__init__.py b/openlp/plugins/bibles/forms/__init__.py index 15f14de9e..d0966c7ce 100644 --- a/openlp/plugins/bibles/forms/__init__.py +++ b/openlp/plugins/bibles/forms/__init__.py @@ -52,5 +52,6 @@ from the .ui files later if necessary. """ from bibleimportform import BibleImportForm +from bibleimportrequestform import BibleImportRequest __all__ = ['BibleImportForm'] diff --git a/openlp/plugins/bibles/forms/bibleimportrequestdialog.py b/openlp/plugins/bibles/forms/bibleimportrequestdialog.py new file mode 100644 index 000000000..d58c1df9f --- /dev/null +++ b/openlp/plugins/bibles/forms/bibleimportrequestdialog.py @@ -0,0 +1,95 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, 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 translate +from openlp.core.lib.ui import create_accept_reject_button_box + +class Ui_BibleImportRequest(object): + def setupUi(self, bibleImportRequest): + bibleImportRequest.setObjectName("BibleImportRequest") + bibleImportRequest.resize(400, 175) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(bibleImportRequest.sizePolicy() + .hasHeightForWidth()) + bibleImportRequest.setSizePolicy(sizePolicy) + self.widget = QtGui.QWidget(bibleImportRequest) + self.widget.setGeometry(QtCore.QRect(10, 15, 381, 151)) + self.widget.setObjectName("widget") + self.verticalLayout = QtGui.QVBoxLayout(self.widget) + self.verticalLayout.setObjectName("verticalLayout") + self.headlineLabel = QtGui.QLabel(self.widget) + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(11) + font.setWeight(75) + font.setBold(True) + self.headlineLabel.setFont(font) + self.headlineLabel.setObjectName("HeadlineLabel") + self.verticalLayout.addWidget(self.HeadlineLabel) + self.infoLabel = QtGui.QLabel(self.widget) + self.infoLabel.setObjectName("InfoLabel") + self.verticalLayout.addWidget(self.infoLabel) + self.formLayout = QtGui.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.requestLabel = QtGui.QLabel(self.widget) + self.requestLabel.setObjectName("RequestLabel") + self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.requestLabel) + self.requestComboBox = QtGui.QComboBox(self.widget) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.requestComboBox.sizePolicy() + .hasHeightForWidth()) + self.requestComboBox.setSizePolicy(sizePolicy) + self.requestComboBox.setObjectName("RequestComboBox") + self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.requestComboBox) + self.verticalLayout.addLayout(self.formLayout) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.formLayout.addWidget( + create_accept_reject_button_box(bibleImportRequest)) + self.retranslateUi(bibleImportRequest) + QtCore.QMetaObject.connectSlotsByName(bibleImportRequest) + + def retranslateUi(self, bibleImportRequest): + bibleImportRequest.setWindowTitle( + translate("BiblesPlugin.bibleImportRequest", "Dialog")) + self.headlineLabel.setText( + translate("BiblesPlugin.bibleImportRequest", "Choose Book:")) + self.infoLabel.setText(translate("BiblesPlugin.bibleImportRequest", + "The following books cannot be clearly attributed. \n" + "Please choose the book it is.")) + self.requestLabel.setText(translate("BiblesPlugin.bibleImportRequest", + "Book:")) diff --git a/openlp/plugins/bibles/forms/bibleimportrequestform.py b/openlp/plugins/bibles/forms/bibleimportrequestform.py new file mode 100644 index 000000000..caac8e83b --- /dev/null +++ b/openlp/plugins/bibles/forms/bibleimportrequestform.py @@ -0,0 +1,82 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, 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 # +############################################################################### + +""" +Module implementing BibleImportRequest. +""" +import logging + +from PyQt4.QtGui import QDialog + +from openlp.core.lib import translate +from openlp.core.lib.ui import critical_error_message_box +from openlp.plugins.bibles.forms.bibleimportrequestdialog import \ + Ui_BibleImportRequest +from openlp.plugins.bibles.lib.db import BiblesResourcesDB + +log = logging.getLogger(__name__) + +class BibleImportRequest(QDialog, Ui_BibleImportRequest): + """ + Class documentation goes here. + """ + log.info(u'BibleImportRequest loaded') + + def __init__(self, parent = None): + """ + Constructor + """ + QDialog.__init__(self, parent) + self.setupUi(self) + + def exec_(self, case, name=None): + items = [] + self.requestComboBox.addItem(u'') + if case == u'language': + self.headlineLabel.setText(translate( + "BiblesPlugin.BibleImportRequest", "Choose Language:")) + self.infoLabel.setText(translate("BiblesPlugin.BibleImportRequest", + "Please choose the language the bible is.")) + self.requestLabel.setText( + translate("BiblesPlugin.BibleImportRequest", "Language:")) + items = BiblesResourcesDB.get_languages() + elif case == u'book': + self.requestLabel.setText( + translate("BiblesPlugin.BibleImportRequest", name)) + items = BiblesResourcesDB.get_books() + for item in items: + self.requestComboBox.addItem(item[u'name']) + return QDialog.exec_(self) + + def accept(self): + if self.requestComboBox.currentText() == u"": + critical_error_message_box( + message=translate('BiblesPlugin.BibleImportRequest', + 'You need to choose an item.')) + self.requestComboBox.setFocus() + return False + else: + return QDialog.accept(self) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index b96382df2..b5644db81 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -135,6 +135,7 @@ class CSVBible(BibleDB): self.wizard.progressBar.setMinimum(0) self.wizard.progressBar.setMaximum(66) success = True + #TODO: include create_meta language books_file = None book_list = {} # Populate the Tables @@ -148,6 +149,8 @@ class CSVBible(BibleDB): self.wizard.incrementProgressBar(unicode( translate('BibleDB.Wizard', 'Importing books... %s')) % unicode(line[2], details['encoding'])) + #TODO: change create_book to the new database model + #(name, bk_ref_id, testament) self.create_book(unicode(line[2], details['encoding']), unicode(line[3], details['encoding']), int(line[1])) book_list[int(line[0])] = unicode(line[2], details['encoding']) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 3eb7c3af1..68edc55ef 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -95,9 +95,9 @@ def init_schema(url): ) book_table = Table(u'book', metadata, Column(u'id', types.Integer, primary_key=True), - Column(u'testament_id', types.Integer, ForeignKey(u'testament.id')), + Column(u'book_reference_id', types.Integer), + Column(u'testament_reference_id', types.Integer), Column(u'name', types.Unicode(50), index=True), - Column(u'abbreviation', types.Unicode(5), index=True), ) verse_table = Table(u'verse', metadata, Column(u'id', types.Integer, primary_key=True, index=True), @@ -114,8 +114,7 @@ def init_schema(url): try: class_mapper(Testament) except UnmappedClassError: - mapper(Testament, testament_table, - properties={'books': relation(Book, backref='testament')}) + mapper(Testament, testament_table) try: class_mapper(Book) except UnmappedClassError: @@ -251,22 +250,23 @@ class BibleDB(QtCore.QObject, Manager): self.save_object(Testament.populate(name=u'New Testament')) self.save_object(Testament.populate(name=u'Apocrypha')) - def create_book(self, name, abbrev, testament=1): + def create_book(self, name, bk_ref_id, testament=1): """ Add a book to the database. ``name`` The name of the book. - ``abbrev`` - The abbreviation of the book. + ``bk_ref_id`` + The book_reference_id from bibles_resources.sqlite of the book. ``testament`` - *Defaults to 1.* The id of the testament this book belongs to. + *Defaults to 1.* The testament_reference_id from + bibles_resources.sqlite of the testament this book belongs to. """ - log.debug(u'create_book %s,%s', name, abbrev) - book = Book.populate(name=name, abbreviation=abbrev, - testament_id=testament) + log.debug(u'create_book %s,%s', name, bk_ref_id) + book = Book.populate(name=name, book_reference_id=bk_ref_id, + testament_reference_id=testament) self.save_object(book) return book @@ -334,6 +334,8 @@ class BibleDB(QtCore.QObject, Manager): ``value`` The value for this instance. """ + if not isinstance(value, unicode): + value = unicode(value) log.debug(u'save_meta %s/%s', key, value) self.save_object(BibleMeta.populate(key=key, value=value)) @@ -346,9 +348,6 @@ class BibleDB(QtCore.QObject, Manager): """ log.debug(u'BibleDb.get_book("%s")', book) db_book = self.get_object_filtered(Book, Book.name.like(book + u'%')) - if db_book is None: - db_book = self.get_object_filtered(Book, - Book.abbreviation.like(book + u'%')) return db_book def get_books(self): @@ -358,7 +357,7 @@ class BibleDB(QtCore.QObject, Manager): """ return self.get_all_objects(Book, order_by_ref=Book.id) - def get_verses(self, reference_list): + def get_verses(self, reference_list, en_reference_list): """ This is probably the most used function. It retrieves the list of verses based on the user's query. @@ -376,15 +375,18 @@ class BibleDB(QtCore.QObject, Manager): [(u'Genesis', 1, 1, 1), (u'Genesis', 2, 2, 3)] """ - log.debug(u'BibleDB.get_verses: %s', reference_list) + log.debug(u'BibleDB.get_verses: %s - %s', reference_list, + en_reference_list) verse_list = [] - for book, chapter, start_verse, end_verse in reference_list: + for (book, chapter, start_verse, end_verse), (en_book, en_chapter, + en_start_verse, en_end_verse) in zip(reference_list, + en_reference_list): db_book = self.get_book(book) if db_book: book = db_book.name log.debug(u'Book name corrected to "%s"', book) if end_verse == -1: - end_verse = self.get_verse_count(book, chapter) + end_verse = self.get_verse_count(en_book, chapter) verses = self.session.query(Verse)\ .filter_by(book_id=db_book.id)\ .filter_by(chapter=chapter)\ @@ -545,9 +547,9 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the book. """ + log.debug(u'get_book: %s', name) if not isinstance(name, unicode): name = unicode(name) - name = name.title() books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' u'abbreviation, chapters FROM book_reference WHERE name = ? OR ' u'abbreviation = ?', (name, name)) @@ -562,6 +564,30 @@ class BiblesResourcesDB(QtCore.QObject, Manager): else: return None + @staticmethod + def get_book_by_id(id): + """ + Return a book by id. + + ``id`` + The id of the book. + """ + if not isinstance(id, int): + id = int(id) + books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' + u'abbreviation, chapters FROM book_reference WHERE id = ?', + (id, )) + if books: + return { + u'id': books[0][0], + u'testament_id': books[0][1], + u'name': unicode(books[0][2]), + u'abbreviation': unicode(books[0][3]), + u'chapters': books[0][4] + } + else: + return None + @staticmethod def get_chapter(name, chapter): """ @@ -644,8 +670,8 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return the bibles a webbible provide for download. - ``name`` - The name of the webbible. + ``source`` + The source of the webbible. """ if not isinstance(source, unicode): source = unicode(source) @@ -668,7 +694,39 @@ class BiblesResourcesDB(QtCore.QObject, Manager): return None @staticmethod - def get_spelling(name, language_id=None): + def get_webbible(abbreviation, source): + """ + Return the bibles a webbible provide for download. + + ``abbreviation`` + The abbreviation of the webbible. + + ``source`` + The source of the webbible. + """ + if not isinstance(abbreviation, unicode): + abbreviation = unicode(abbreviation) + if not isinstance(source, unicode): + source = unicode(source) + source = BiblesResourcesDB.get_download_source(source) + bible = BiblesResourcesDB.run_sql(u'SELECT id, name, abbreviation, ' + u'language_id, download_source_id FROM webbibles WHERE ' + u'download_source_id = ? AND abbreviation = ?', (source[u'id'], + abbreviation)) + if bible: + bibles_temp = { + u'id': bible[0][0], + u'name': bible[0][1], + u'abbreviation': bible[0][2], + u'language_id': bible[0][3], + u'download_source_id': bible[0][4] + } + return bibles_temp + else: + return None + + @staticmethod + def get_spelling(name, language_id=None): """ Return a book_reference_id if the name matches. """ @@ -678,7 +736,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): (name, language_id)) else: id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' - u'FROM spelling WHERE name = ? ORDER BY id', (name, )) + u'FROM spelling WHERE name = ? ORDER BY id', (name, )) if id: return int(id[0][0]) else: @@ -707,6 +765,25 @@ class BiblesResourcesDB(QtCore.QObject, Manager): else: return None + @staticmethod + def get_languages(): + """ + Return a dict containing all languages with id, name and code. + """ + languages = BiblesResourcesDB.run_sql(u'SELECT id, name, code FROM ' + u'language ORDER by name') + if languages: + languages_temp = [] + for language in languages: + languages_temp.append({ + u'id': language[0], + u'name': unicode(language[1]), + u'code': unicode(language[2]) + }) + return languages_temp + else: + return None + @staticmethod def get_testament_reference(): """ @@ -766,7 +843,7 @@ class SpellingDB(QtCore.QObject, Manager): def get_book_reference_id(self, name, language=None): """ - Return the book_reference_id of a name. + Return the book_reference_id of a book by name. ``name`` The name to search the id. @@ -785,7 +862,7 @@ class SpellingDB(QtCore.QObject, Manager): if not id: return None else: - return id + return id[0] def create_spelling(self, name, book_reference_id, language_id): """ diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index d2202909c..29c86e0bd 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -41,7 +41,8 @@ from openlp.core.lib import Receiver, translate from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, get_web_page from openlp.plugins.bibles.lib import SearchResults -from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB, Book +from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB, \ + SpellingDB, Book log = logging.getLogger(__name__) @@ -123,6 +124,52 @@ class BGExtract(object): return None return SearchResults(bookname, chapter, verse_list) + def get_books_from_http(self, version): + """ + Load a list of all books a bible contaions from BibleGateway website. + + ``version`` + The version of the bible like NIV for New International Version + """ + log.debug(u'get_books_from_http %s', version) + url_params = urllib.urlencode( + {u'search': 'Bible-List', u'version': u'%s' % version}) + reference_url = u'http://www.biblegateway.com/passage/?%s' % url_params + page = get_web_page(reference_url) + if not page: + send_error_message(u'download') + return None + page_source = page.read() + page_source = unicode(page_source, 'utf8') + page_source_temp = re.search(u'.*?
', \ + page_source, re.DOTALL) + if page_source_temp: + soup = page_source_temp.group(0) + else: + soup = None + try: + soup = BeautifulSoup(soup) + except HTMLParseError: + log.exception(u'BeautifulSoup could not parse the bible page.') + if not soup: + send_error_message(u'parse') + return None + Receiver.send_message(u'openlp_process_events') + content = soup.find(u'table', {u'id': u'booklist'}) + content = content.findAll(u'tr') + #log.debug(content) + if not content: + log.exception(u'No books found in the Biblegateway response.') + send_error_message(u'parse') + return None + books = [] + for book in content: + book = book.find(u'td') + if book: + books.append(book.contents[0]) + log.debug(book.contents[0]) + return books + class BSExtract(object): """ @@ -168,6 +215,31 @@ class BSExtract(object): verses[versenumber] = verse.contents[1].rstrip(u'\n') return SearchResults(bookname, chapter, verses) + def get_books_from_http(self, version): + """ + Load a list of all books a bible contains from Bibleserver mobile + website. + + ``version`` + The version of the bible like NIV for New International Version + """ + log.debug(u'get_books_from_http %s', version) + chapter_url = u'http://m.bibleserver.com/overlay/selectBook?'\ + 'translation=%s' % (version) + soup = get_soup_for_bible_ref(chapter_url) + if not soup: + return None + content = soup.find(u'ul') + if not content: + log.exception(u'No books found in the Bibleserver response.') + send_error_message(u'parse') + return None + content = content.findAll(u'li') + books = [] + for book in content: + books.append(book.contents[0].contents[0]) + return books + class CWExtract(object): """ @@ -237,6 +309,33 @@ class CWExtract(object): verses[versenumber] = versetext return SearchResults(bookname, chapter, verses) + def get_books_from_http(self, version): + """ + Load a list of all books a bible contain from the Crosswalk website. + + ``version`` + The version of the bible like NIV for New International Version + """ + log.debug(u'get_books_from_http %s', version) + chapter_url = u'http://www.biblestudytools.com/%s/'\ + % (version) + soup = get_soup_for_bible_ref(chapter_url) + if not soup: + return None + content = soup.find(u'div', {u'class': u'Body'}) + content = content.find(u'ul', {u'class': u'parent'}) + if not content: + log.exception(u'No books found in the Crosswalk response.') + send_error_message(u'parse') + return None + content = content.findAll(u'li') + books = [] + for book in content: + book = book.find(u'a') + books.append(book.contents[0]) + log.debug(book.contents[0]) + return books + class HTTPBible(BibleDB): log.info(u'%s HTTPBible loaded' , __name__) @@ -252,6 +351,7 @@ class HTTPBible(BibleDB): Init confirms the bible exists and stores the database path. """ BibleDB.__init__(self, parent, **kwargs) + self.parent = parent self.download_source = kwargs[u'download_source'] self.download_name = kwargs[u'download_name'] # TODO: Clean up proxy stuff. We probably want one global proxy per @@ -259,6 +359,8 @@ class HTTPBible(BibleDB): self.proxy_server = None self.proxy_username = None self.proxy_password = None + if u'path' in kwargs: + self.path = kwargs[u'path'] if u'proxy_server' in kwargs: self.proxy_server = kwargs[u'proxy_server'] if u'proxy_username' in kwargs: @@ -283,9 +385,37 @@ class HTTPBible(BibleDB): if self.proxy_password: # Store the proxy password. self.create_meta(u'proxy password', self.proxy_password) + if self.download_source.lower() == u'crosswalk': + handler = CWExtract(self.proxy_server) + elif self.download_source.lower() == u'biblegateway': + handler = BGExtract(self.proxy_server) + elif self.download_source.lower() == u'bibleserver': + handler = BSExtract(self.proxy_server) + books = handler.get_books_from_http(self.download_name) + if not books: + log.exception(u'Importing books from %s - download name: "%s" '\ + 'failed' % (self.download_source, self.download_name)) + return False + bible = BiblesResourcesDB.get_webbible(self.download_name, + self.download_source.lower()) + if bible[u'language_id']: + language_id = bible[u'language_id'] + else: + language = self.parent.mediaItem.importRequest(u'language') + language = BiblesResourcesDB.get_language(language) + language_id = language[u'id'] + # Store the language_id. + self.create_meta(u'language_id', language_id) + for book in books: + book_ref_id = self.parent.manager.get_book_ref_id_by_name(book, + language_id) + book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) + log.debug(u'Book details: Name:%s; id:%s; testament_id:%s', + book, book_ref_id, book_details[u'testament_id']) + self.create_book(book, book_ref_id, book_details[u'testament_id']) return True - def get_verses(self, reference_list): + def get_verses(self, reference_list, en_reference_list): """ A reimplementation of the ``BibleDB.get_verses`` method, this one is specifically for web Bibles. It first checks to see if the particular @@ -298,6 +428,13 @@ class HTTPBible(BibleDB): a list of tuples, with the following format:: (book, chapter, start_verse, end_verse) + + ``en_reference_list`` + This is the list of references the media manager item wants. It is + a list of tuples, with the following format with englisch book + names:: + + (book, chapter, start_verse, end_verse) Therefore, when you are looking for multiple items, simply break them up into references like this, bundle them into a list. This @@ -311,17 +448,12 @@ class HTTPBible(BibleDB): book = reference[0] db_book = self.get_book(book) if not db_book: - book_details = BiblesResourcesDB.get_book(book) - if not book_details: - critical_error_message_box( - translate('BiblesPlugin', 'No Book Found'), - translate('BiblesPlugin', 'No matching ' - 'book could be found in this Bible. Check that you ' - 'have spelled the name of the book correctly.')) - return [] - db_book = self.create_book(book_details[u'name'], - book_details[u'abbreviation'], - book_details[u'testament_id']) + critical_error_message_box( + translate('BiblesPlugin', 'No Book Found'), + translate('BiblesPlugin', 'No matching ' + 'book could be found in this Bible. Check that you ' + 'have spelled the name of the book correctly.')) + return [] book = db_book.name if BibleDB.get_verse_count(self, book, reference[1]) == 0: Receiver.send_message(u'cursor_busy') @@ -340,7 +472,7 @@ class HTTPBible(BibleDB): Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'cursor_normal') Receiver.send_message(u'openlp_process_events') - return BibleDB.get_verses(self, reference_list) + return BibleDB.get_verses(self, reference_list, en_reference_list) def get_chapter(self, book, chapter): """ @@ -360,8 +492,7 @@ class HTTPBible(BibleDB): """ Return the list of books. """ - return [Book.populate(name=book['name']) - for book in BiblesResourcesDB.get_books()] + return self.get_all_objects(Book, order_by_ref=Book.id) def get_chapter_count(self, book): """ diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 6a12c3877..de66c38e0 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -220,19 +220,28 @@ class BibleManager(object): Unicode. The Bible to get the list of books from. """ log.debug(u'BibleManager.get_books("%s")', bible) - return [ + language_id = self.get_meta_data(bible, u'language_id') + books = [] + for book in self.db_cache[bible].get_books(): + book_id = self.get_book_ref_id_by_name(book.name, int( + language_id.value)) + book_temp = BiblesResourcesDB.get_book_by_id(book_id) + book_ref = book_temp[u'name'] + books.append( { u'name': book.name, - u'chapters': self.db_cache[bible].get_chapter_count(book.name) - } - for book in self.db_cache[bible].get_books() - ] + u'chapters': self.db_cache[bible].get_chapter_count(book_ref) + }) + return books def get_chapter_count(self, bible, book): """ Returns the number of Chapters for a given book. """ - log.debug(u'get_book_chapter_count %s', book) + log.debug(u'BibleManager.get_book_chapter_count ("%s", "%s")', bible, + book) + language_id = self.get_meta_data(bible, u'language_id') + book = self.get_book_ref(book, int(language_id.value)) return self.db_cache[bible].get_chapter_count(book) def get_verse_count(self, bible, book, chapter): @@ -242,6 +251,8 @@ class BibleManager(object): """ log.debug(u'BibleManager.get_verse_count("%s", "%s", %s)', bible, book, chapter) + language_id = self.get_meta_data(bible, u'language_id') + book = self.get_book_ref(book, int(language_id.value)) return self.db_cache[bible].get_verse_count(book, chapter) def get_verses(self, bible, versetext): @@ -275,7 +286,14 @@ class BibleManager(object): return None reflist = parse_reference(versetext) if reflist: - return self.db_cache[bible].get_verses(reflist) + log.debug(u'reflist:%s', reflist) + en_reflist = [] + for item in reflist: + if item: + book = self.get_book_ref(item[0]) + en_reflist.append((book, item[1], item[2], item[3])) + log.debug(u'en_reflist:%s', en_reflist) + return self.db_cache[bible].get_verses(reflist, en_reflist) else: Receiver.send_message(u'openlp_information_message', { u'title': translate('BiblesPlugin.BibleManager', @@ -293,6 +311,40 @@ class BibleManager(object): }) return None + def get_book_ref(self, book, language_id=None): + log.debug(u'BibleManager.get_book_ref("%s", "%s")', book, language_id) + book_id = self.get_book_ref_id_by_name(book, language_id) + book_temp = BiblesResourcesDB.get_book_by_id(book_id) + log.debug(u'get_book_ref - Return:%s', book_temp[u'name']) + return book_temp[u'name'] + + def get_book_ref_id_by_name(self, book, language_id=None): + log.debug(u'BibleManager.get_book_ref_id_by_name:("%s", "%s")', book, + language_id) + if BiblesResourcesDB.get_book(book): + book_temp = BiblesResourcesDB.get_book(book) + book_id = book_temp[u'id'] + elif BiblesResourcesDB.get_spelling(book, language_id): + book_id = BiblesResourcesDB.get_spelling(book, language_id) + elif self.spelling_cache[u'spelling'].get_book_reference_id(book, + language_id): + book_id = self.spelling_cache[u'spelling'].\ + get_book_reference_id(book, language_id) + else: + book_ref = self.parent.mediaItem.importRequest(u'book', book) + log.debug(book_ref) + book_temp = BiblesResourcesDB.get_book(book_ref) + log.debug(book_temp) + book_id = book_temp[u'id'] + if book_id: + self.spelling_cache[u'spelling'].create_spelling(book, book_id, + language_id) + if book_id: + log.debug(u'get_book_ref_id_by_name - Return:%s', book_id) + return book_id + else: + return None + def verse_search(self, bible, second_bible, text): """ Does a verse search for the given bible and text. diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 2b2f6597e..58fa0eec7 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -36,6 +36,7 @@ from openlp.core.lib.ui import UiStrings, add_widget_completer, \ from openlp.plugins.bibles.forms import BibleImportForm from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ get_reference_match +from openlp.plugins.bibles.forms import BibleImportRequest log = logging.getLogger(__name__) @@ -286,6 +287,11 @@ class BibleMediaItem(MediaManagerItem): if self.import_wizard.exec_(): self.reloadBibles() + def importRequest(self, case, name=None): + self.import_request = BibleImportRequest(self) + if self.import_request.exec_(case, name): + return unicode(self.import_request.RequestComboBox.currentText()) + def loadBibles(self): log.debug(u'Loading Bibles') self.quickVersionComboBox.clear() diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 2d19db20c..f0e12481a 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -56,6 +56,7 @@ class OpenLP1Bible(BibleDB): cursor = connection.cursor() except: return False + #TODO: include create_meta language # Create all books. cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') books = cursor.fetchall() @@ -68,6 +69,8 @@ class OpenLP1Bible(BibleDB): testament_id = int(book[1]) name = unicode(book[2], u'cp1252') abbreviation = unicode(book[3], u'cp1252') + #TODO: change create_book to the new database model + #(name, bk_ref_id, testament) self.create_book(name, abbreviation, testament_id) # Update the progess bar. self.wizard.incrementProgressBar(WizardStrings.ImportingType % name) diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index a7f1eff33..62cf12eaf 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -61,9 +61,12 @@ class OpenSongBible(BibleDB): file = open(self.filename, u'r') opensong = objectify.parse(file) bible = opensong.getroot() + #TODO: include create_meta language for book in bible.b: if self.stop_import_flag: break + #TODO: change create_book to the new database model + #(name, bk_ref_id, testament) db_book = self.create_book(unicode(book.attrib[u'n']), unicode(book.attrib[u'n'][:4])) for chapter in book.c: diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 78e2551d9..05a57bbe4 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -104,6 +104,7 @@ class OSISBible(BibleDB): finally: if detect_file: detect_file.close() + #TODO: include create_meta language with try - except scheme try: osis = codecs.open(self.filename, u'r', details['encoding']) for file_record in osis: @@ -120,6 +121,8 @@ class OSISBible(BibleDB): log.debug(u'New book: "%s"', self.books[book][0]) if book == u'Matt' or book == u'Jdt': testament += 1 + #TODO: change create_book to the new database model + #(name, bk_ref_id, testament) db_book = self.create_book( unicode(self.books[book][0]), unicode(self.books[book][1]), diff --git a/openlp/plugins/bibles/resources/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite index 3049657ecce5196e97303df41161553b81f203f1..102fe25b7b69699a415a795bf7e13f84d392da16 100644 GIT binary patch delta 1076 zcmXw2ZERCj7=F&Z-qXV9SSiC^ww6*mGU}M?l`Wl_Q?^c4SMIRwP-4){Sm$D#QkXgz zvhxcPNo1Uur~ys<;a@dNOw1DFe`5Tg!>^dY4`m;bE%Bex%;(-|nwy?H=Xu}vd7t+^ zv+L&Ux_P-tT%2p}7Z*Pp{rE<*&|rRIK52%HMdNMbbt8j<_(v>=_e4e9hrh9anK`w$ z?jX>1Mj~$up~rr0*=hn0DMO-S>m#-H@Bj+vLo3l9B_v*M)R$^bXAVPXCYDr?$i##= z;9jU)DhJDLY3L_ZMwVd5n-Wjhx^pq*^rJ}l z8G`Y15(g+{5LLW}F`ULJyo3pOjA88da?SX;-dgl>4d5u62s&paMr{4{;=cMm3OxToiw>Qxq~zAyrBm<9U!}Tt7>Pvh*Xj6MAMf z7#_r9%;FXAQup|-zO$MRA0~5i8y#gz9BcqlM^9%EeIbjYOe;L<} z_l;+bfLIX=^LvBWL?Er=5(BpW>W_H(7^4cvu|ibEBw9G3GM`12`*w#;c=Mg%Wl1&b z>Cf|#GE4tIkuKHbOM3opI$Yu~3OGq-o7(NYBmLpsM5sh;)4Q~?_0@0o*O8D{Q4Uhr zSJrx*BCBt%e6zY&Vn3}J_V;3fdtb#XT6#nizzRUCnI|Kgk_a+ZA(rE(-&oLdMAuxpj%5bS-Q~Rxffl$y!*~O_nhy1-**;w zXmN+G*Ne%ehT~%LtI5xQX-b2>pqDA)tT-PzC8t&VBYqH9#jE03{E6>z73n1vt$0y6 z5;LBDzuXq_(T5CDh*Osm5^vV(@5;gRK6){P28t<2bTkUln!PsjK_OIVnGNkOUdre8 z?fN*55sV^_8tT5nH$8o1B?y~v9t9*Rcu(RbPZw8Wfe8+C_!aWsm1y;Z7{CJF#uU!u z9EzC3UPcae)P333`u4wCeK>`BN?ei{@ieVASNRM!gML&~+dC42TuV>=7UjMv#+*lt z(ibHzdivOEvcUucbZ~*13lbjZcFGPJmnWo;Bz;VcH3!9(IMVD*kuC47V~0y~XW{d>Y`C6g+BDl1*n# zQev#LjCFxgPg#-%c(g2650q<}pWZUe4wD+d$59 z^$gBZo2oPB)}L!Zx?4fhYX g%;y|mZlkn%!fx0%kCOY1+eTU3d0G}byA=Ze0*BQ3^Z)<= From 7a15251ffc2a8e5c27a624ec755bc3f6c945b612 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 17 Mar 2011 20:40:01 +0100 Subject: [PATCH 004/124] Clean up changed create_book in cscbible, openlp1, opensong and osis --- .../bibles/forms/bibleimportrequestdialog.py | 2 +- openlp/plugins/bibles/lib/csvbible.py | 15 +- openlp/plugins/bibles/lib/mediaitem.py | 2 +- openlp/plugins/bibles/lib/openlp1.py | 16 +- openlp/plugins/bibles/lib/opensong.py | 17 ++- openlp/plugins/bibles/lib/osis.py | 16 +- resources/forms/bibleimportrequestdialog.ui | 137 ++++++++++++++++++ 7 files changed, 183 insertions(+), 22 deletions(-) create mode 100644 resources/forms/bibleimportrequestdialog.ui diff --git a/openlp/plugins/bibles/forms/bibleimportrequestdialog.py b/openlp/plugins/bibles/forms/bibleimportrequestdialog.py index d58c1df9f..7fcc36932 100644 --- a/openlp/plugins/bibles/forms/bibleimportrequestdialog.py +++ b/openlp/plugins/bibles/forms/bibleimportrequestdialog.py @@ -53,7 +53,7 @@ class Ui_BibleImportRequest(object): font.setBold(True) self.headlineLabel.setFont(font) self.headlineLabel.setObjectName("HeadlineLabel") - self.verticalLayout.addWidget(self.HeadlineLabel) + self.verticalLayout.addWidget(self.headlineLabel) self.infoLabel = QtGui.QLabel(self.widget) self.infoLabel.setObjectName("InfoLabel") self.verticalLayout.addWidget(self.infoLabel) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index b5644db81..7d1791281 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -70,7 +70,7 @@ import chardet import csv from openlp.core.lib import Receiver, translate -from openlp.plugins.bibles.lib.db import BibleDB, Testament +from openlp.plugins.bibles.lib.db import BibleDB, Testament, BiblesResourcesDB log = logging.getLogger(__name__) @@ -86,6 +86,7 @@ class CSVBible(BibleDB): """ log.info(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) + self.parent = parent try: self.testamentsfile = kwargs[u'testamentsfile'] except KeyError: @@ -135,7 +136,10 @@ class CSVBible(BibleDB): self.wizard.progressBar.setMinimum(0) self.wizard.progressBar.setMaximum(66) success = True - #TODO: include create_meta language + language = self.parent.mediaItem.importRequest(u'language') + language = BiblesResourcesDB.get_language(language) + language_id = language[u'id'] + self.create_meta(u'language_id', language_id) books_file = None book_list = {} # Populate the Tables @@ -149,10 +153,11 @@ class CSVBible(BibleDB): self.wizard.incrementProgressBar(unicode( translate('BibleDB.Wizard', 'Importing books... %s')) % unicode(line[2], details['encoding'])) - #TODO: change create_book to the new database model - #(name, bk_ref_id, testament) + book_ref_id = self.parent.manager.get_book_ref_id_by_name( + unicode(line[2], details['encoding']), language_id) + book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) self.create_book(unicode(line[2], details['encoding']), - unicode(line[3], details['encoding']), int(line[1])) + book_ref_id, book_details[u'testament_id']) book_list[int(line[0])] = unicode(line[2], details['encoding']) Receiver.send_message(u'openlp_process_events') except (IOError, IndexError): diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 58fa0eec7..1f1a7e2a0 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -290,7 +290,7 @@ class BibleMediaItem(MediaManagerItem): def importRequest(self, case, name=None): self.import_request = BibleImportRequest(self) if self.import_request.exec_(case, name): - return unicode(self.import_request.RequestComboBox.currentText()) + return unicode(self.import_request.requestComboBox.currentText()) def loadBibles(self): log.debug(u'Loading Bibles') diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index f0e12481a..508add469 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -29,7 +29,7 @@ import sqlite from openlp.core.lib import Receiver from openlp.core.ui.wizard import WizardStrings -from openlp.plugins.bibles.lib.db import BibleDB +from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB log = logging.getLogger(__name__) @@ -43,6 +43,7 @@ class OpenLP1Bible(BibleDB): """ log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) + self.parent = parent self.filename = kwargs[u'filename'] def do_import(self): @@ -56,7 +57,11 @@ class OpenLP1Bible(BibleDB): cursor = connection.cursor() except: return False - #TODO: include create_meta language + #Create the bible language + language = self.parent.mediaItem.importRequest(u'language') + language = BiblesResourcesDB.get_language(language) + language_id = language[u'id'] + self.create_meta(u'language_id', language_id) # Create all books. cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') books = cursor.fetchall() @@ -69,9 +74,10 @@ class OpenLP1Bible(BibleDB): testament_id = int(book[1]) name = unicode(book[2], u'cp1252') abbreviation = unicode(book[3], u'cp1252') - #TODO: change create_book to the new database model - #(name, bk_ref_id, testament) - self.create_book(name, abbreviation, testament_id) + book_ref_id = self.parent.manager.get_book_ref_id_by_name(name, + language_id) + book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) + self.create_book(name, book_ref_id, book_details[u'testament_id']) # Update the progess bar. self.wizard.incrementProgressBar(WizardStrings.ImportingType % name) # Import the verses for this book. diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 62cf12eaf..91b96abf2 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -28,7 +28,7 @@ import logging from lxml import objectify from openlp.core.lib import Receiver, translate -from openlp.plugins.bibles.lib.db import BibleDB +from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB log = logging.getLogger(__name__) @@ -43,6 +43,7 @@ class OpenSongBible(BibleDB): """ log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) + self.parent = parent self.filename = kwargs['filename'] def do_import(self): @@ -61,14 +62,18 @@ class OpenSongBible(BibleDB): file = open(self.filename, u'r') opensong = objectify.parse(file) bible = opensong.getroot() - #TODO: include create_meta language + language = self.parent.mediaItem.importRequest(u'language') + language = BiblesResourcesDB.get_language(language) + language_id = language[u'id'] + self.create_meta(u'language_id', language_id) for book in bible.b: if self.stop_import_flag: break - #TODO: change create_book to the new database model - #(name, bk_ref_id, testament) - db_book = self.create_book(unicode(book.attrib[u'n']), - unicode(book.attrib[u'n'][:4])) + book_ref_id = self.parent.manager.get_book_ref_id_by_name( + unicode(book.attrib[u'n']), language_id) + book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) + db_book = self.create_book(unicode(book.attrib[u'n']), + book_ref_id, book_details[u'testament_id']) for chapter in book.c: if self.stop_import_flag: break diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 05a57bbe4..6c8b2153b 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -33,7 +33,7 @@ import re from openlp.core.lib import Receiver, translate from openlp.core.utils import AppLocation -from openlp.plugins.bibles.lib.db import BibleDB +from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB log = logging.getLogger(__name__) @@ -46,6 +46,7 @@ class OSISBible(BibleDB): def __init__(self, parent, **kwargs): log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) + self.parent = parent self.filename = kwargs[u'filename'] fbibles = None self.books = {} @@ -104,7 +105,11 @@ class OSISBible(BibleDB): finally: if detect_file: detect_file.close() - #TODO: include create_meta language with try - except scheme + # Set meta language_id + language = self.parent.mediaItem.importRequest(u'language') + language = BiblesResourcesDB.get_language(language) + language_id = language[u'id'] + self.create_meta(u'language_id', language_id) try: osis = codecs.open(self.filename, u'r', details['encoding']) for file_record in osis: @@ -123,10 +128,13 @@ class OSISBible(BibleDB): testament += 1 #TODO: change create_book to the new database model #(name, bk_ref_id, testament) + book_ref_id = self.parent.manager.get_book_ref_id_by_name( + unicode(self.books[book][0]), language_id) + book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) db_book = self.create_book( unicode(self.books[book][0]), - unicode(self.books[book][1]), - testament) + book_ref_id, + book_details[u'testament_id']) if last_chapter == 0: if book == u'Gen': self.wizard.progressBar.setMaximum(1188) diff --git a/resources/forms/bibleimportrequestdialog.ui b/resources/forms/bibleimportrequestdialog.ui new file mode 100644 index 000000000..5795300f9 --- /dev/null +++ b/resources/forms/bibleimportrequestdialog.ui @@ -0,0 +1,137 @@ + + + BibleImportRequest + + + + 0 + 0 + 400 + 175 + + + + + 0 + 0 + + + + Dialog + + + + + 10 + 15 + 381 + 151 + + + + + + + + Arial + 12 + 75 + true + + + + Choose Book: + + + + + + + The following books cannot be clearly attributed. +Please choose the book it is. + + + + + + + + + Book: + + + + + + + + 0 + 0 + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + + BibleImportRequestButtonBox + accepted() + BibleImportRequest + accept() + + + 248 + 254 + + + 157 + 274 + + + + + BibleImportRequestButtonBox + rejected() + BibleImportRequest + reject() + + + 316 + 260 + + + 286 + 274 + + + + + From a23d902fa57ac3901a36042e16486ffee148b38e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 17 Mar 2011 21:54:22 +0100 Subject: [PATCH 005/124] adapt the second_bible searchfunction to the new book name scheme --- openlp/plugins/bibles/lib/db.py | 31 ++++++++++++++++++++++++++ openlp/plugins/bibles/lib/manager.py | 22 +++++++++++++++--- openlp/plugins/bibles/lib/mediaitem.py | 4 ++-- 3 files changed, 52 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 68edc55ef..6f2f2e2cb 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -357,6 +357,17 @@ class BibleDB(QtCore.QObject, Manager): """ return self.get_all_objects(Book, order_by_ref=Book.id) + def get_book_by_book_ref_id(self, id): + """ + Return a book object from the database. + + ``book`` + The name of the book to return. + """ + log.debug(u'BibleDb.get_book_by_book_ref_id("%s")', id) + db_book = self.get_object_filtered(Book, Book.book_reference_id.like(id)) + return db_book + def get_verses(self, reference_list, en_reference_list): """ This is probably the most used function. It retrieves the list of @@ -863,6 +874,26 @@ class SpellingDB(QtCore.QObject, Manager): return None else: return id[0] + + def get_book_name_by_reference_id(self, id, language): + """ + Return the name of a book by id and language. + + ``id`` + The name to search the id. + + ``language`` + The language for which should be searched + """ + log.debug(u'SpellingDB.get_book_name_by_reference_id("%s", "%s")', id, + language) + name = self.session.query(Spelling.name)\ + .filter(Spelling.book_reference_id.like(id))\ + .filter(Spelling.language_id.like(language)).first() + if not name: + return None + else: + return unicode(name[0]) def create_spelling(self, name, book_reference_id, language_id): """ diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index de66c38e0..44bb6dcd3 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -255,7 +255,7 @@ class BibleManager(object): book = self.get_book_ref(book, int(language_id.value)) return self.db_cache[bible].get_verse_count(book, chapter) - def get_verses(self, bible, versetext): + def get_verses(self, bible, versetext, secondbible=False): """ Parses a scripture reference, fetches the verses from the Bible specified, and returns a list of ``Verse`` objects. @@ -286,13 +286,29 @@ class BibleManager(object): return None reflist = parse_reference(versetext) if reflist: - log.debug(u'reflist:%s', reflist) + # if we use a second bible we have to rename the book names + if secondbible: + log.debug(u'BibleManager.get_verses("secondbible true")') + meta = self.db_cache[bible].get_object(BibleMeta, + u'language_id') + language_id = meta.value + new_reflist = [] + for item in reflist: + if item: + book = self.get_book_ref(item[0]) + book_ref_id = self.parent.manager.\ + get_book_ref_id_by_name(book, language_id) + book = self.db_cache[bible].get_book_by_book_ref_id( + book_ref_id) + new_reflist.append((book.name, item[1], item[2], item[3])) + reflist = new_reflist + log.debug(u'BibleManager.get_verses("reflist: %s")', reflist) en_reflist = [] for item in reflist: if item: book = self.get_book_ref(item[0]) en_reflist.append((book, item[1], item[2], item[3])) - log.debug(u'en_reflist:%s', en_reflist) + log.debug(u'BibleManager.get_verses("en_reflist: %s")', en_reflist) return self.db_cache[bible].get_verses(reflist, en_reflist) else: Receiver.send_message(u'openlp_information_message', { diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 1f1a7e2a0..d2753cfc5 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -482,7 +482,7 @@ class BibleMediaItem(MediaManagerItem): self.search_results = self.parent.manager.get_verses(bible, versetext) if second_bible: self.second_search_results = self.parent.manager.get_verses( - second_bible, versetext) + second_bible, versetext, True) if self.advancedClearComboBox.currentIndex() == 0: self.listView.clear() if self.listView.count() != 0: @@ -509,7 +509,7 @@ class BibleMediaItem(MediaManagerItem): self.search_results = self.parent.manager.get_verses(bible, text) if second_bible and self.search_results: self.second_search_results = self.parent.manager.get_verses( - second_bible, text) + second_bible, text, True) else: # We are doing a 'Text Search'. Receiver.send_message(u'cursor_busy') From 9a30a4ae6acd1b093dfde57090d638d162971524 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 17 Mar 2011 22:04:54 +0100 Subject: [PATCH 006/124] Clean up --- openlp/plugins/bibles/lib/db.py | 23 ++--------------------- openlp/plugins/bibles/lib/manager.py | 3 ++- 2 files changed, 4 insertions(+), 22 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 6f2f2e2cb..2d1d1efad 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -365,7 +365,8 @@ class BibleDB(QtCore.QObject, Manager): The name of the book to return. """ log.debug(u'BibleDb.get_book_by_book_ref_id("%s")', id) - db_book = self.get_object_filtered(Book, Book.book_reference_id.like(id)) + db_book = self.get_object_filtered(Book, + Book.book_reference_id.like(id)) return db_book def get_verses(self, reference_list, en_reference_list): @@ -874,26 +875,6 @@ class SpellingDB(QtCore.QObject, Manager): return None else: return id[0] - - def get_book_name_by_reference_id(self, id, language): - """ - Return the name of a book by id and language. - - ``id`` - The name to search the id. - - ``language`` - The language for which should be searched - """ - log.debug(u'SpellingDB.get_book_name_by_reference_id("%s", "%s")', id, - language) - name = self.session.query(Spelling.name)\ - .filter(Spelling.book_reference_id.like(id))\ - .filter(Spelling.language_id.like(language)).first() - if not name: - return None - else: - return unicode(name[0]) def create_spelling(self, name, book_reference_id, language_id): """ diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 44bb6dcd3..4fa405c24 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -300,7 +300,8 @@ class BibleManager(object): get_book_ref_id_by_name(book, language_id) book = self.db_cache[bible].get_book_by_book_ref_id( book_ref_id) - new_reflist.append((book.name, item[1], item[2], item[3])) + new_reflist.append((book.name, item[1], item[2], + item[3])) reflist = new_reflist log.debug(u'BibleManager.get_verses("reflist: %s")', reflist) en_reflist = [] From 4071daec18cec5bdae0a0ae86defb6944568206f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Fri, 18 Mar 2011 10:52:54 +0100 Subject: [PATCH 007/124] add error handling if the user abort the dialog --- openlp/plugins/bibles/lib/csvbible.py | 8 ++++++++ openlp/plugins/bibles/lib/http.py | 8 ++++++++ openlp/plugins/bibles/lib/manager.py | 5 ++++- openlp/plugins/bibles/lib/openlp1.py | 8 ++++++++ openlp/plugins/bibles/lib/opensong.py | 8 ++++++++ openlp/plugins/bibles/lib/osis.py | 10 ++++++++-- 6 files changed, 44 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 7d1791281..8884c436a 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -137,6 +137,10 @@ class CSVBible(BibleDB): self.wizard.progressBar.setMaximum(66) success = True language = self.parent.mediaItem.importRequest(u'language') + if not language: + log.exception(u'Importing books from %s " '\ + 'failed' % self.booksfile) + return False language = BiblesResourcesDB.get_language(language) language_id = language[u'id'] self.create_meta(u'language_id', language_id) @@ -155,6 +159,10 @@ class CSVBible(BibleDB): unicode(line[2], details['encoding'])) book_ref_id = self.parent.manager.get_book_ref_id_by_name( unicode(line[2], details['encoding']), language_id) + if not book_ref_id: + log.exception(u'Importing books from %s " '\ + 'failed' % self.booksfile) + return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) self.create_book(unicode(line[2], details['encoding']), book_ref_id, book_details[u'testament_id']) diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index cd5f5a2d9..9d91298d0 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -406,6 +406,10 @@ class HTTPBible(BibleDB): language_id = bible[u'language_id'] else: language = self.parent.mediaItem.importRequest(u'language') + if not language: + log.exception(u'Importing books from %s - download name: "%s" '\ + 'failed' % (self.download_source, self.download_name)) + return False language = BiblesResourcesDB.get_language(language) language_id = language[u'id'] # Store the language_id. @@ -413,6 +417,10 @@ class HTTPBible(BibleDB): for book in books: book_ref_id = self.parent.manager.get_book_ref_id_by_name(book, language_id) + if not book_ref_id: + log.exception(u'Importing books from %s - download name: "%s" '\ + 'failed' % (self.download_source, self.download_name)) + return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) log.debug(u'Book details: Name:%s; id:%s; testament_id:%s', book, book_ref_id, book_details[u'testament_id']) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 4fa405c24..58e7b052f 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -352,7 +352,10 @@ class BibleManager(object): log.debug(book_ref) book_temp = BiblesResourcesDB.get_book(book_ref) log.debug(book_temp) - book_id = book_temp[u'id'] + if book_temp: + book_id = book_temp[u'id'] + else: + return None if book_id: self.spelling_cache[u'spelling'].create_spelling(book, book_id, language_id) diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 508add469..2d7ed903b 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -59,6 +59,10 @@ class OpenLP1Bible(BibleDB): return False #Create the bible language language = self.parent.mediaItem.importRequest(u'language') + if not language: + log.exception(u'Importing books from %s " '\ + 'failed' % self.filename) + return False language = BiblesResourcesDB.get_language(language) language_id = language[u'id'] self.create_meta(u'language_id', language_id) @@ -76,6 +80,10 @@ class OpenLP1Bible(BibleDB): abbreviation = unicode(book[3], u'cp1252') book_ref_id = self.parent.manager.get_book_ref_id_by_name(name, language_id) + if not book_ref_id: + log.exception(u'Importing books from %s " '\ + 'failed' % self.filename) + return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) self.create_book(name, book_ref_id, book_details[u'testament_id']) # Update the progess bar. diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 91b96abf2..f1a64c2e7 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -63,6 +63,10 @@ class OpenSongBible(BibleDB): opensong = objectify.parse(file) bible = opensong.getroot() language = self.parent.mediaItem.importRequest(u'language') + if not language: + log.exception(u'Importing books from %s " '\ + 'failed' % self.filename) + return False language = BiblesResourcesDB.get_language(language) language_id = language[u'id'] self.create_meta(u'language_id', language_id) @@ -71,6 +75,10 @@ class OpenSongBible(BibleDB): break book_ref_id = self.parent.manager.get_book_ref_id_by_name( unicode(book.attrib[u'n']), language_id) + if not book_ref_id: + log.exception(u'Importing books from %s " '\ + 'failed' % self.filename) + return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) db_book = self.create_book(unicode(book.attrib[u'n']), book_ref_id, book_details[u'testament_id']) diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 6c8b2153b..277b73a23 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -107,6 +107,10 @@ class OSISBible(BibleDB): detect_file.close() # Set meta language_id language = self.parent.mediaItem.importRequest(u'language') + if not language: + log.exception(u'Importing books from %s " '\ + 'failed' % self.filename) + return False language = BiblesResourcesDB.get_language(language) language_id = language[u'id'] self.create_meta(u'language_id', language_id) @@ -126,10 +130,12 @@ class OSISBible(BibleDB): log.debug(u'New book: "%s"', self.books[book][0]) if book == u'Matt' or book == u'Jdt': testament += 1 - #TODO: change create_book to the new database model - #(name, bk_ref_id, testament) book_ref_id = self.parent.manager.get_book_ref_id_by_name( unicode(self.books[book][0]), language_id) + if not book_ref_id: + log.exception(u'Importing books from %s " '\ + 'failed' % self.filename) + return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) db_book = self.create_book( unicode(self.books[book][0]), From 599e87695590eb18829cbc1dcf14651f916ddbc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 23 Mar 2011 20:18:51 +0100 Subject: [PATCH 008/124] Bug fixes Changed book handling from name to book_reference_id Comment out unused function to fill the testament table in the local bible database --- openlp/plugins/bibles/lib/csvbible.py | 9 +- openlp/plugins/bibles/lib/db.py | 111 +++++++++++++++---------- openlp/plugins/bibles/lib/http.py | 84 ++++++++++--------- openlp/plugins/bibles/lib/manager.py | 67 +++++++-------- openlp/plugins/bibles/lib/mediaitem.py | 4 +- openlp/plugins/bibles/lib/openlp1.py | 5 +- openlp/plugins/bibles/lib/osis.py | 14 ++-- 7 files changed, 163 insertions(+), 131 deletions(-) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 8884c436a..2a3949dea 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -70,7 +70,7 @@ import chardet import csv from openlp.core.lib import Receiver, translate -from openlp.plugins.bibles.lib.db import BibleDB, Testament, BiblesResourcesDB +from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB#, Testament log = logging.getLogger(__name__) @@ -87,13 +87,16 @@ class CSVBible(BibleDB): log.info(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) self.parent = parent + #TODO: Delete unused code + ''' try: self.testamentsfile = kwargs[u'testamentsfile'] except KeyError: self.testamentsfile = None + ''' self.booksfile = kwargs[u'booksfile'] self.versesfile = kwargs[u'versefile'] - + ''' def setup_testaments(self): """ Overrides parent method so we can handle importing a testament file. @@ -127,7 +130,7 @@ class CSVBible(BibleDB): 'BibleDB.Wizard', 'Importing testaments... done.')), 2) else: BibleDB.setup_testaments(self) - + ''' def do_import(self): """ Import the bible books and verses. diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 2d1d1efad..b4a5b0d3b 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -48,13 +48,14 @@ class BibleMeta(BaseModel): """ pass - +#TODO: Delete unused code +''' class Testament(BaseModel): """ Bible Testaments """ pass - +''' class Book(BaseModel): """ @@ -89,10 +90,13 @@ def init_schema(url): Column(u'key', types.Unicode(255), primary_key=True, index=True), Column(u'value', types.Unicode(255)), ) + #TODO: Delete unused code + ''' testament_table = Table(u'testament', metadata, Column(u'id', types.Integer, primary_key=True), Column(u'name', types.Unicode(50)), ) + ''' book_table = Table(u'book', metadata, Column(u'id', types.Integer, primary_key=True), Column(u'book_reference_id', types.Integer), @@ -101,7 +105,8 @@ def init_schema(url): ) verse_table = Table(u'verse', metadata, Column(u'id', types.Integer, primary_key=True, index=True), - Column(u'book_id', types.Integer, ForeignKey(u'book.id'), index=True), + Column(u'book_id', types.Integer, ForeignKey( + u'book.id'), index=True), Column(u'chapter', types.Integer, index=True), Column(u'verse', types.Integer, index=True), Column(u'text', types.UnicodeText, index=True), @@ -111,10 +116,13 @@ def init_schema(url): class_mapper(BibleMeta) except UnmappedClassError: mapper(BibleMeta, meta_table) + #TODO: Delete unused code + ''' try: class_mapper(Testament) except UnmappedClassError: mapper(Testament, testament_table) + ''' try: class_mapper(Book) except UnmappedClassError: @@ -239,9 +247,12 @@ class BibleDB(QtCore.QObject, Manager): """ self.wizard = wizard self.create_meta(u'dbversion', u'2') - self.setup_testaments() + #TODO: Delete unused code + #self.setup_testaments() return self.name + #TODO: Delete unused code + ''' def setup_testaments(self): """ Initialise the testaments section of a bible with suitable defaults. @@ -249,6 +260,7 @@ class BibleDB(QtCore.QObject, Manager): self.save_object(Testament.populate(name=u'Old Testament')) self.save_object(Testament.populate(name=u'New Testament')) self.save_object(Testament.populate(name=u'Apocrypha')) + ''' def create_book(self, name, bk_ref_id, testament=1): """ @@ -264,7 +276,7 @@ class BibleDB(QtCore.QObject, Manager): *Defaults to 1.* The testament_reference_id from bibles_resources.sqlite of the testament this book belongs to. """ - log.debug(u'create_book %s,%s', name, bk_ref_id) + log.debug(u'BibleDB.create_book("%s", "%s")', name, bk_ref_id) book = Book.populate(name=name, book_reference_id=bk_ref_id, testament_reference_id=testament) self.save_object(book) @@ -284,7 +296,7 @@ class BibleDB(QtCore.QObject, Manager): A dict of the verses to be inserted. The key is the verse number, and the value is the verse text. """ - log.debug(u'create_chapter %s,%s', book_id, chapter) + log.debug(u'BibleDBcreate_chapter("%s", "%s")', book_id, chapter) # Text list has book and chapter as first two elements of the array. for verse_number, verse_text in textlist.iteritems(): verse = Verse.populate( @@ -336,7 +348,7 @@ class BibleDB(QtCore.QObject, Manager): """ if not isinstance(value, unicode): value = unicode(value) - log.debug(u'save_meta %s/%s', key, value) + log.debug(u'BibleDB.save_meta("%s/%s")', key, value) self.save_object(BibleMeta.populate(key=key, value=value)) def get_book(self, book): @@ -346,7 +358,7 @@ class BibleDB(QtCore.QObject, Manager): ``book`` The name of the book to return. """ - log.debug(u'BibleDb.get_book("%s")', book) + log.debug(u'BibleDB.get_book("%s")', book) db_book = self.get_object_filtered(Book, Book.name.like(book + u'%')) return db_book @@ -361,15 +373,15 @@ class BibleDB(QtCore.QObject, Manager): """ Return a book object from the database. - ``book`` - The name of the book to return. + ``id`` + The reference id of the book to return. """ - log.debug(u'BibleDb.get_book_by_book_ref_id("%s")', id) + log.debug(u'BibleDB.get_book_by_book_ref_id("%s")', id) db_book = self.get_object_filtered(Book, Book.book_reference_id.like(id)) return db_book - def get_verses(self, reference_list, en_reference_list): + def get_verses(self, reference_list): """ This is probably the most used function. It retrieves the list of verses based on the user's query. @@ -378,27 +390,24 @@ class BibleDB(QtCore.QObject, Manager): This is the list of references the media manager item wants. It is a list of tuples, with the following format:: - (book, chapter, start_verse, end_verse) + (book_reference_id, chapter, start_verse, end_verse) Therefore, when you are looking for multiple items, simply break them up into references like this, bundle them into a list. This function then runs through the list, and returns an amalgamated list of ``Verse`` objects. For example:: - [(u'Genesis', 1, 1, 1), (u'Genesis', 2, 2, 3)] + [(u'35', 1, 1, 1), (u'35', 2, 2, 3)] """ - log.debug(u'BibleDB.get_verses: %s - %s', reference_list, - en_reference_list) + log.debug(u'BibleDB.get_verses("%s")', reference_list) verse_list = [] - for (book, chapter, start_verse, end_verse), (en_book, en_chapter, - en_start_verse, en_end_verse) in zip(reference_list, - en_reference_list): - db_book = self.get_book(book) + for book_id, chapter, start_verse, end_verse in reference_list: + db_book = self.get_book_by_book_ref_id(book_id) if db_book: - book = db_book.name - log.debug(u'Book name corrected to "%s"', book) + book_id = db_book.book_reference_id + log.debug(u'Book name corrected to "%s"', db_book.name) if end_verse == -1: - end_verse = self.get_verse_count(en_book, chapter) + end_verse = self.get_verse_count(book_id, chapter) verses = self.session.query(Verse)\ .filter_by(book_id=db_book.id)\ .filter_by(chapter=chapter)\ @@ -443,23 +452,23 @@ class BibleDB(QtCore.QObject, Manager): verses = verses.all() return verses - def get_chapter_count(self, book): + def get_chapter_count(self, book_id): """ Return the number of chapters in a book. ``book`` The book to get the chapter count for. """ - log.debug(u'BibleDB.get_chapter_count("%s")', book) + log.debug(u'BibleDB.get_chapter_count("%s")', book_id) count = self.session.query(Verse.chapter).join(Book)\ - .filter(Book.name==book)\ + .filter(Book.book_reference_id==book_id)\ .distinct().count() if not count: return 0 else: return count - def get_verse_count(self, book, chapter): + def get_verse_count(self, book_id, chapter): """ Return the number of verses in a chapter. @@ -469,9 +478,9 @@ class BibleDB(QtCore.QObject, Manager): ``chapter`` The chapter to get the verse count for. """ - log.debug(u'BibleDB.get_verse_count("%s", %s)', book, chapter) + log.debug(u'BibleDB.get_verse_count("%s", "%s")', book_id, chapter) count = self.session.query(Verse).join(Book)\ - .filter(Book.name==book)\ + .filter(Book.book_reference_id==book_id)\ .filter(Verse.chapter==chapter)\ .count() if not count: @@ -538,6 +547,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return a list of all the books of the Bible. """ + log.debug(u'BiblesResourcesDB.get_books()') books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' u'abbreviation, chapters FROM book_reference ORDER BY id') book_list = [] @@ -559,7 +569,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the book. """ - log.debug(u'get_book: %s', name) + log.debug(u'BiblesResourcesDB.get_book("%s")', name) if not isinstance(name, unicode): name = unicode(name) books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' @@ -584,6 +594,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``id`` The id of the book. """ + log.debug(u'BiblesResourcesDB.get_book_by_id("%s")', id) if not isinstance(id, int): id = int(id) books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' @@ -601,22 +612,22 @@ class BiblesResourcesDB(QtCore.QObject, Manager): return None @staticmethod - def get_chapter(name, chapter): + def get_chapter(book_id, chapter): """ Return the chapter details for a specific chapter of a book. - ``name`` - The name or abbreviation of a book. + ``book_id`` + The id of a book. ``chapter`` The chapter number. """ - if not isinstance(name, int): + log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_id, chapter) + if not isinstance(chapter, int): chapter = int(chapter) - book = BiblesResourcesDB.get_book(name) chapters = BiblesResourcesDB.run_sql(u'SELECT id, book_reference_id, ' u'chapter, verse_count FROM chapters WHERE book_reference_id = ?', - (book[u'id'],)) + (book_id,)) if chapters: return { u'id': chapters[chapter-1][0], @@ -628,30 +639,33 @@ class BiblesResourcesDB(QtCore.QObject, Manager): return None @staticmethod - def get_chapter_count(book): + def get_chapter_count(book_id): """ Return the number of chapters in a book. - ``book`` - The name or abbreviation of the book. + ``book_id`` + The id of the book. """ - details = BiblesResourcesDB.get_book(book) + log.debug(u'BiblesResourcesDB.get_chapter_count("%s")', book_id) + details = BiblesResourcesDB.get_book_by_id(book_id) if details: return details[u'chapters'] return 0 @staticmethod - def get_verse_count(book, chapter): + def get_verse_count(book_id, chapter): """ Return the number of verses in a chapter. ``book`` - The name or abbreviation of the book. + The id of the book. ``chapter`` The number of the chapter. """ - details = BiblesResourcesDB.get_chapter(book, chapter) + log.debug(u'BiblesResourcesDB.get_verse_count("%s", "%s")', book_id, + chapter) + details = BiblesResourcesDB.get_chapter(book_id, chapter) if details: return details[u'verse_count'] return 0 @@ -664,6 +678,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the book. """ + log.debug(u'BiblesResourcesDB.get_download_source("%s")', source) if not isinstance(source, unicode): source = unicode(source) source = source.title() @@ -685,6 +700,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``source`` The source of the webbible. """ + log.debug(u'BiblesResourcesDB.get_webbibles("%s")', source) if not isinstance(source, unicode): source = unicode(source) source = BiblesResourcesDB.get_download_source(source) @@ -716,6 +732,8 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``source`` The source of the webbible. """ + log.debug(u'BiblesResourcesDB.get_webbibles("%s", "%s")', abbreviation, + source) if not isinstance(abbreviation, unicode): abbreviation = unicode(abbreviation) if not isinstance(source, unicode): @@ -742,6 +760,8 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return a book_reference_id if the name matches. """ + log.debug(u'BiblesResourcesDB.get_spelling("%s", "%s")', name, + language_id) if language_id: id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' u'FROM spelling WHERE name = ? and language_id = ? ORDER BY id', @@ -763,6 +783,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the language. """ + log.debug(u'BiblesResourcesDB.get_language("%s", "%s")', name) if not isinstance(name, unicode): name = unicode(name) name = name.title() @@ -782,6 +803,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return a dict containing all languages with id, name and code. """ + log.debug(u'BiblesResourcesDB.get_languages()') languages = BiblesResourcesDB.run_sql(u'SELECT id, name, code FROM ' u'language ORDER by name') if languages: @@ -801,6 +823,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): """ Return a list of all testaments and their id of the Bible. """ + log.debug(u'BiblesResourcesDB.get_testament_reference()') testaments = BiblesResourcesDB.run_sql(u'SELECT id, name FROM ' u'testament_reference ORDER BY id') testament_list = [] @@ -889,7 +912,7 @@ class SpellingDB(QtCore.QObject, Manager): ``language_id`` The language which the spelling of the book name is. """ - log.debug(u'create_spelling %s, book_reference_id:%s, language_id:%s', + log.debug(u'SpellingDBcreate_spelling("%s", "%s", "%s"', name, book_reference_id, language_id) spelling = Spelling.populate(name=name, book_reference_id=book_reference_id, language_id=language_id) diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 9d91298d0..39a2e3699 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -42,7 +42,7 @@ from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, get_web_page from openlp.plugins.bibles.lib import SearchResults from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB, \ - SpellingDB, Book + SpellingDB, Book, BibleMeta log = logging.getLogger(__name__) @@ -51,7 +51,7 @@ class BGExtract(object): Extract verses from BibleGateway """ def __init__(self, proxyurl=None): - log.debug(u'init %s', proxyurl) + log.debug(u'BGExtract.init("%s")', proxyurl) self.proxyurl = proxyurl socket.setdefaulttimeout(30) @@ -68,9 +68,11 @@ class BGExtract(object): ``chapter`` Chapter number. """ - log.debug(u'get_bible_chapter %s, %s, %s', version, bookname, chapter) + log.debug(u'BGExtract.get_bible_chapter("%s", "%s", "%s")', version, + bookname, chapter) + urlbookname = urllib.quote(bookname.encode("utf-8")) url_params = urllib.urlencode( - {u'search': u'%s %s' % (bookname, chapter), + {u'search': u'%s %s' % (urlbookname, chapter), u'version': u'%s' % version}) cleaner = [(re.compile(' |
|\'\+\''), lambda match: '')] soup = get_soup_for_bible_ref( @@ -135,7 +137,7 @@ class BGExtract(object): ``version`` The version of the bible like NIV for New International Version """ - log.debug(u'get_books_from_http %s', version) + log.debug(u'BGExtract.get_books_from_http("%s")', version) url_params = urllib.urlencode( {u'search': 'Bible-List', u'version': u'%s' % version}) reference_url = u'http://www.biblegateway.com/passage/?%s' % url_params @@ -161,7 +163,6 @@ class BGExtract(object): Receiver.send_message(u'openlp_process_events') content = soup.find(u'table', {u'id': u'booklist'}) content = content.findAll(u'tr') - #log.debug(content) if not content: log.exception(u'No books found in the Biblegateway response.') send_error_message(u'parse') @@ -171,7 +172,6 @@ class BGExtract(object): book = book.find(u'td') if book: books.append(book.contents[0]) - log.debug(book.contents[0]) return books @@ -180,7 +180,7 @@ class BSExtract(object): Extract verses from Bibleserver.com """ def __init__(self, proxyurl=None): - log.debug(u'init %s', proxyurl) + log.debug(u'BSExtract.init("%s")', proxyurl) self.proxyurl = proxyurl socket.setdefaulttimeout(30) @@ -197,9 +197,11 @@ class BSExtract(object): ``chapter`` Chapter number """ - log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter) + log.debug(u'BSExtract.get_bible_chapter("%s", "%s", "%s")', version, + bookname, chapter) + urlbookname = urllib.quote(bookname.encode("utf-8")) chapter_url = u'http://m.bibleserver.com/text/%s/%s%s' % \ - (version, bookname, chapter) + (version, urlbookname, chapter) header = (u'Accept-Language', u'en') soup = get_soup_for_bible_ref(chapter_url, header) if not soup: @@ -227,7 +229,7 @@ class BSExtract(object): ``version`` The version of the bible like NIV for New International Version """ - log.debug(u'get_books_from_http %s', version) + log.debug(u'BSExtract.get_books_from_http("%s")', version) chapter_url = u'http://m.bibleserver.com/overlay/selectBook?'\ 'translation=%s' % (version) soup = get_soup_for_bible_ref(chapter_url) @@ -250,7 +252,7 @@ class CWExtract(object): Extract verses from CrossWalk/BibleStudyTools """ def __init__(self, proxyurl=None): - log.debug(u'init %s', proxyurl) + log.debug(u'CWExtract.init("%s")', proxyurl) self.proxyurl = proxyurl socket.setdefaulttimeout(30) @@ -267,10 +269,13 @@ class CWExtract(object): ``chapter`` Chapter number """ - log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter) + log.debug(u'CWExtract.get_bible_chapter("%s", "%s", "%s")', version, + bookname, chapter) urlbookname = bookname.replace(u' ', u'-') + urlbookname = urlbookname.lower() + urlbookname = urllib.quote(urlbookname.encode("utf-8")) chapter_url = u'http://www.biblestudytools.com/%s/%s/%s.html' % \ - (version, urlbookname.lower(), chapter) + (version, urlbookname, chapter) soup = get_soup_for_bible_ref(chapter_url) if not soup: return None @@ -320,7 +325,7 @@ class CWExtract(object): ``version`` The version of the bible like NIV for New International Version """ - log.debug(u'get_books_from_http %s', version) + log.debug(u'CWExtract.get_books_from_http("%s")', version) chapter_url = u'http://www.biblestudytools.com/%s/'\ % (version) soup = get_soup_for_bible_ref(chapter_url) @@ -337,7 +342,6 @@ class CWExtract(object): for book in content: book = book.find(u'a') books.append(book.contents[0]) - log.debug(book.contents[0]) return books @@ -377,8 +381,10 @@ class HTTPBible(BibleDB): Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on failure. """ - self.wizard.progressBar.setMaximum(2) - self.wizard.incrementProgressBar('Registering bible...') + self.wizard.progressBar.setMaximum(68) + self.wizard.incrementProgressBar(unicode(translate( + 'BiblesPlugin.HTTPBible', + 'Registering bible and loading books...'))) self.create_meta(u'download source', self.download_source) self.create_meta(u'download name', self.download_name) if self.proxy_server: @@ -400,6 +406,9 @@ class HTTPBible(BibleDB): log.exception(u'Importing books from %s - download name: "%s" '\ 'failed' % (self.download_source, self.download_name)) return False + self.wizard.progressBar.setMaximum(len(books)+2) + self.wizard.incrementProgressBar(unicode(translate( + 'BiblesPlugin.HTTPBible', 'Registering Language...'))) bible = BiblesResourcesDB.get_webbible(self.download_name, self.download_source.lower()) if bible[u'language_id']: @@ -415,6 +424,9 @@ class HTTPBible(BibleDB): # Store the language_id. self.create_meta(u'language_id', language_id) for book in books: + self.wizard.incrementProgressBar(unicode(translate( + 'BiblesPlugin.HTTPBible', 'Importing %s...', + 'Importing ...')) % book) book_ref_id = self.parent.manager.get_book_ref_id_by_name(book, language_id) if not book_ref_id: @@ -427,7 +439,7 @@ class HTTPBible(BibleDB): self.create_book(book, book_ref_id, book_details[u'testament_id']) return True - def get_verses(self, reference_list, en_reference_list): + def get_verses(self, reference_list): """ A reimplementation of the ``BibleDB.get_verses`` method, this one is specifically for web Bibles. It first checks to see if the particular @@ -439,26 +451,19 @@ class HTTPBible(BibleDB): This is the list of references the media manager item wants. It is a list of tuples, with the following format:: - (book, chapter, start_verse, end_verse) - - ``en_reference_list`` - This is the list of references the media manager item wants. It is - a list of tuples, with the following format with englisch book - names:: - - (book, chapter, start_verse, end_verse) + (book_reference_id, chapter, start_verse, end_verse) Therefore, when you are looking for multiple items, simply break them up into references like this, bundle them into a list. This function then runs through the list, and returns an amalgamated list of ``Verse`` objects. For example:: - [(u'Genesis', 1, 1, 1), (u'Genesis', 2, 2, 3)] + [(u'35', 1, 1, 1), (u'35', 2, 2, 3)] """ + log.debug(u'HTTPBible.get_verses("%s")', reference_list) for reference in reference_list: - log.debug(u'Reference: %s', reference) - book = reference[0] - db_book = self.get_book(book) + book_id = reference[0] + db_book = self.get_book_by_book_ref_id(book_id) if not db_book: critical_error_message_box( translate('BiblesPlugin', 'No Book Found'), @@ -467,7 +472,7 @@ class HTTPBible(BibleDB): 'have spelled the name of the book correctly.')) return [] book = db_book.name - if BibleDB.get_verse_count(self, book, reference[1]) == 0: + if BibleDB.get_verse_count(self, book_id, reference[1]) == 0: Receiver.send_message(u'cursor_busy') search_results = self.get_chapter(book, reference[1]) if search_results and search_results.has_verselist(): @@ -484,13 +489,13 @@ class HTTPBible(BibleDB): Receiver.send_message(u'openlp_process_events') Receiver.send_message(u'cursor_normal') Receiver.send_message(u'openlp_process_events') - return BibleDB.get_verses(self, reference_list, en_reference_list) + return BibleDB.get_verses(self, reference_list) def get_chapter(self, book, chapter): """ Receive the request and call the relevant handler methods. """ - log.debug(u'get_chapter %s, %s', book, chapter) + log.debug(u'HTTPBible.get_chapter("%s", "%s")', book, chapter) log.debug(u'source = %s', self.download_source) if self.download_source.lower() == u'crosswalk': handler = CWExtract(self.proxy_server) @@ -504,15 +509,17 @@ class HTTPBible(BibleDB): """ Return the list of books. """ + log.debug(u'HTTPBible.get_books("%s")', Book.name) return self.get_all_objects(Book, order_by_ref=Book.id) - def get_chapter_count(self, book): + def get_chapter_count(self, book_id): """ Return the number of chapters in a particular book. """ - return BiblesResourcesDB.get_chapter_count(book) + log.debug(u'HTTPBible.get_chapter_count("%s")', book_id) + return BiblesResourcesDB.get_chapter_count(book_id) - def get_verse_count(self, book, chapter): + def get_verse_count(self, book_id, chapter): """ Return the number of verses for the specified chapter and book. @@ -522,7 +529,8 @@ class HTTPBible(BibleDB): ``chapter`` The chapter whose verses are being counted. """ - return BiblesResourcesDB.get_verse_count(book, chapter) + log.debug(u'HTTPBible.get_verse_count("%s", %s)', book_id, chapter) + return BiblesResourcesDB.get_verse_count(book_id, chapter) def get_soup_for_bible_ref(reference_url, header=None, pre_parse_regex=None, pre_parse_substitute=None, cleaner=None): diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 58e7b052f..5f0890f0e 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -30,10 +30,11 @@ import os from PyQt4 import QtCore from openlp.core.lib import Receiver, SettingsManager, translate +from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, delete_file from openlp.plugins.bibles.lib import parse_reference from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, SpellingDB, \ - Spelling, BiblesResourcesDB + BiblesResourcesDB from csvbible import CSVBible from http import HTTPBible from opensong import OpenSongBible @@ -223,14 +224,10 @@ class BibleManager(object): language_id = self.get_meta_data(bible, u'language_id') books = [] for book in self.db_cache[bible].get_books(): - book_id = self.get_book_ref_id_by_name(book.name, int( - language_id.value)) - book_temp = BiblesResourcesDB.get_book_by_id(book_id) - book_ref = book_temp[u'name'] books.append( { u'name': book.name, - u'chapters': self.db_cache[bible].get_chapter_count(book_ref) + u'chapters': self.db_cache[bible].get_chapter_count(book.book_reference_id) }) return books @@ -240,8 +237,6 @@ class BibleManager(object): """ log.debug(u'BibleManager.get_book_chapter_count ("%s", "%s")', bible, book) - language_id = self.get_meta_data(bible, u'language_id') - book = self.get_book_ref(book, int(language_id.value)) return self.db_cache[bible].get_chapter_count(book) def get_verse_count(self, bible, book, chapter): @@ -251,11 +246,11 @@ class BibleManager(object): """ log.debug(u'BibleManager.get_verse_count("%s", "%s", %s)', bible, book, chapter) - language_id = self.get_meta_data(bible, u'language_id') - book = self.get_book_ref(book, int(language_id.value)) - return self.db_cache[bible].get_verse_count(book, chapter) + db_book = self.db_cache[bible].get_book(book) + book_ref_id = db_book.book_reference_id + return self.db_cache[bible].get_verse_count(book_ref_id, chapter) - def get_verses(self, bible, versetext, secondbible=False): + def get_verses(self, bible, versetext, firstbible=False): """ Parses a scripture reference, fetches the verses from the Bible specified, and returns a list of ``Verse`` objects. @@ -286,31 +281,29 @@ class BibleManager(object): return None reflist = parse_reference(versetext) if reflist: - # if we use a second bible we have to rename the book names - if secondbible: - log.debug(u'BibleManager.get_verses("secondbible true")') - meta = self.db_cache[bible].get_object(BibleMeta, - u'language_id') - language_id = meta.value - new_reflist = [] - for item in reflist: - if item: - book = self.get_book_ref(item[0]) - book_ref_id = self.parent.manager.\ - get_book_ref_id_by_name(book, language_id) - book = self.db_cache[bible].get_book_by_book_ref_id( - book_ref_id) - new_reflist.append((book.name, item[1], item[2], - item[3])) - reflist = new_reflist - log.debug(u'BibleManager.get_verses("reflist: %s")', reflist) - en_reflist = [] + new_reflist = [] for item in reflist: if item: - book = self.get_book_ref(item[0]) - en_reflist.append((book, item[1], item[2], item[3])) - log.debug(u'BibleManager.get_verses("en_reflist: %s")', en_reflist) - return self.db_cache[bible].get_verses(reflist, en_reflist) + if firstbible: + db_book = self.db_cache[firstbible].get_book(item[0]) + db_book = self.db_cache[bible].get_book_by_book_ref_id( + db_book.book_reference_id) + else: + db_book = self.db_cache[bible].get_book(item[0]) + if db_book: + book_id = db_book.book_reference_id + log.debug(u'Book name corrected to "%s"', db_book.name) + new_reflist.append((book_id, item[1], item[2], + item[3])) + else: + log.debug(u'OpenLP failed to find book %s', item[0]) + critical_error_message_box( + translate('BiblesPlugin', 'No Book Found'), + translate('BiblesPlugin', 'No matching book ' + 'could be found in this Bible. Check that you have ' + 'spelled the name of the book correctly.')) + reflist = new_reflist + return self.db_cache[bible].get_verses(reflist) else: Receiver.send_message(u'openlp_information_message', { u'title': translate('BiblesPlugin.BibleManager', @@ -332,7 +325,8 @@ class BibleManager(object): log.debug(u'BibleManager.get_book_ref("%s", "%s")', book, language_id) book_id = self.get_book_ref_id_by_name(book, language_id) book_temp = BiblesResourcesDB.get_book_by_id(book_id) - log.debug(u'get_book_ref - Return:%s', book_temp[u'name']) + log.debug(u'BibleManager.get_book_ref("Return: %s")', + book_temp[u'name']) return book_temp[u'name'] def get_book_ref_id_by_name(self, book, language_id=None): @@ -360,7 +354,6 @@ class BibleManager(object): self.spelling_cache[u'spelling'].create_spelling(book, book_id, language_id) if book_id: - log.debug(u'get_book_ref_id_by_name - Return:%s', book_id) return book_id else: return None diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index d2753cfc5..43a20325f 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -482,7 +482,7 @@ class BibleMediaItem(MediaManagerItem): self.search_results = self.parent.manager.get_verses(bible, versetext) if second_bible: self.second_search_results = self.parent.manager.get_verses( - second_bible, versetext, True) + second_bible, versetext, bible) if self.advancedClearComboBox.currentIndex() == 0: self.listView.clear() if self.listView.count() != 0: @@ -509,7 +509,7 @@ class BibleMediaItem(MediaManagerItem): self.search_results = self.parent.manager.get_verses(bible, text) if second_bible and self.search_results: self.second_search_results = self.parent.manager.get_verses( - second_bible, text, True) + second_bible, text, bible) else: # We are doing a 'Text Search'. Receiver.send_message(u'cursor_busy') diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 2d7ed903b..4cdb1e3fc 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -85,7 +85,8 @@ class OpenLP1Bible(BibleDB): 'failed' % self.filename) return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) - self.create_book(name, book_ref_id, book_details[u'testament_id']) + db_book = self.create_book(name, book_ref_id, + book_details[u'testament_id']) # Update the progess bar. self.wizard.incrementProgressBar(WizardStrings.ImportingType % name) # Import the verses for this book. @@ -99,7 +100,7 @@ class OpenLP1Bible(BibleDB): 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.create_verse(db_book.id, chapter, verse_number, text) Receiver.send_message(u'openlp_process_events') self.session.commit() connection.close() diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 277b73a23..df9083da2 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -92,7 +92,8 @@ class OSISBible(BibleDB): osis = None success = True last_chapter = 0 - testament = 1 + #TODO: Delete unused code + #testament = 1 match_count = 0 self.wizard.incrementProgressBar(translate('BiblesPlugin.OsisImport', 'Detecting encoding (this may take a few minutes)...')) @@ -128,15 +129,18 @@ class OSISBible(BibleDB): verse_text = match.group(4) if not db_book or db_book.name != self.books[book][0]: log.debug(u'New book: "%s"', self.books[book][0]) - if book == u'Matt' or book == u'Jdt': - testament += 1 - book_ref_id = self.parent.manager.get_book_ref_id_by_name( + #TODO: Delete unused code + #if book == u'Matt' or book == u'Jdt': + # testament += 1 + book_ref_id = self.parent.manager.\ + get_book_ref_id_by_name( unicode(self.books[book][0]), language_id) if not book_ref_id: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) return False - book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) + book_details = BiblesResourcesDB.get_book_by_id( + book_ref_id) db_book = self.create_book( unicode(self.books[book][0]), book_ref_id, From 27e635144dc7e8dfd1b0e56704d4463e635aa898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 23 Mar 2011 21:08:49 +0100 Subject: [PATCH 009/124] rename spelling to alternative_book_name --- openlp/plugins/bibles/lib/db.py | 71 +++++++++--------- openlp/plugins/bibles/lib/http.py | 2 +- openlp/plugins/bibles/lib/manager.py | 32 ++++---- .../bibles/resources/bibles_resources.sqlite | Bin 63488 -> 63488 bytes 4 files changed, 54 insertions(+), 51 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index b4a5b0d3b..abd0ebb9b 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -70,9 +70,9 @@ class Verse(BaseModel): """ pass -class Spelling(BaseModel): +class AlternativeBookNames(BaseModel): """ - Spelling model + Alternative Book Names model """ pass @@ -136,16 +136,17 @@ def init_schema(url): metadata.create_all(checkfirst=True) return session -def init_schema_spelling_extension(url): +def init_schema_alternative_book_names(url): """ - Setup a spelling database connection and initialise the database schema. + Setup a alternative book names database connection and initialise the + database schema. ``url`` The database to setup. """ session, metadata = init_db(url) - spelling_table = Table(u'spelling', metadata, + alternative_book_names_table = Table(u'alternative_book_names', metadata, Column(u'id', types.Integer, primary_key=True), Column(u'book_reference_id', types.Integer), Column(u'language_id', types.Integer), @@ -153,9 +154,9 @@ def init_schema_spelling_extension(url): ) try: - class_mapper(Spelling) + class_mapper(AlternativeBookNames) except UnmappedClassError: - mapper(Spelling, spelling_table) + mapper(AlternativeBookNames, alternative_book_names_table) metadata.create_all(checkfirst=True) return session @@ -508,7 +509,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): A wrapper class around a small SQLite database which contains the download resources, a biblelist from the different download resources, the books, chapter counts and verse counts for the web download Bibles, a language - reference, the testament reference and some basic spelling variants. This + reference, the testament reference and some alternative book names. This class contains a singleton "cursor" so that only one connection to the SQLite database is ever used. """ @@ -756,19 +757,20 @@ class BiblesResourcesDB(QtCore.QObject, Manager): return None @staticmethod - def get_spelling(name, language_id=None): + def get_alternative_book_name(name, language_id=None): """ Return a book_reference_id if the name matches. """ - log.debug(u'BiblesResourcesDB.get_spelling("%s", "%s")', name, - language_id) + log.debug(u'BiblesResourcesDB.get_alternative_book_name("%s", "%s")', + name, language_id) if language_id: id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' - u'FROM spelling WHERE name = ? and language_id = ? ORDER BY id', - (name, language_id)) + u'FROM alternative_book_names WHERE name = ? and language_id ' + u'= ? ORDER BY id', (name, language_id)) else: id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' - u'FROM spelling WHERE name = ? ORDER BY id', (name, )) + u'FROM alternative_book_names WHERE name = ? ORDER BY id', ( + name, )) if id: return int(id[0][0]) else: @@ -834,9 +836,9 @@ class BiblesResourcesDB(QtCore.QObject, Manager): }) return testament_list -class SpellingDB(QtCore.QObject, Manager): +class AlternativeBookNamesDB(QtCore.QObject, Manager): """ - This class represents a database-bound spelling. + This class represents a database-bound alternative book names system. """ def __init__(self, parent, **kwargs): @@ -853,18 +855,18 @@ class SpellingDB(QtCore.QObject, Manager): The name of the database. This is also used as the file name for SQLite databases. """ - log.info(u'SpellingDB loaded') + log.info(u'AlternativeBookNamesDB loaded') QtCore.QObject.__init__(self) self.bible_plugin = parent if u'path' not in kwargs: raise KeyError(u'Missing keyword argument "path".') self.stop_import_flag = False - self.name = u'spelling_extension.sqlite' + self.name = u'alternative_book_names.sqlite' if not isinstance(self.name, unicode): self.name = unicode(self.name, u'utf-8') self.file = self.name Manager.__init__(self, u'bibles/resources', - init_schema_spelling_extension, self.file) + init_schema_alternative_book_names, self.file) self.wizard = None QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import) @@ -886,35 +888,36 @@ class SpellingDB(QtCore.QObject, Manager): ``language`` The language for which should be searched """ - log.debug(u'SpellingDB.get_book_reference_id("%s")', name) + log.debug(u'AlternativeBookNamesDB.get_book_reference_id("%s")', name) if language: - id = self.session.query(Spelling.book_reference_id)\ - .filter(Spelling.name.like(name))\ - .filter(Spelling.language_id.like(language)).first() + id = self.session.query(AlternativeBookNames.book_reference_id)\ + .filter(AlternativeBookNames.name.like(name))\ + .filter(AlternativeBookNames.language_id.like(language)).first() else: - id = self.get_object_filtered(Spelling.book_reference_id, - Spelling.name.like(name)) + id = self.get_object_filtered(AlternativeBookNames.book_reference_id, + AlternativeBookNames.name.like(name)) if not id: return None else: return id[0] - def create_spelling(self, name, book_reference_id, language_id): + def create_alternative_book_name(self, name, book_reference_id, + language_id): """ - Add a spelling to the database. + Add an alternative book name to the database. ``name`` - The name of the spelling. + The name of the alternative book name. ``book_reference_id`` The book_reference_id of the book. ``language_id`` - The language which the spelling of the book name is. + The language to which the alternative book name belong. """ - log.debug(u'SpellingDBcreate_spelling("%s", "%s", "%s"', - name, book_reference_id, language_id) - spelling = Spelling.populate(name=name, + log.debug(u'AlternativeBookNamesDB.create_alternative_book_name("%s", ' + '"%s", "%s"', name, book_reference_id, language_id) + alternative_book_name = AlternativeBookNames.populate(name=name, book_reference_id=book_reference_id, language_id=language_id) - self.save_object(spelling) - return spelling + self.save_object(alternative_book_name) + return alternative_book_name diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 39a2e3699..9fe21c09e 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -42,7 +42,7 @@ from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, get_web_page from openlp.plugins.bibles.lib import SearchResults from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB, \ - SpellingDB, Book, BibleMeta + Book, BibleMeta log = logging.getLogger(__name__) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 5f0890f0e..3657d1028 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -33,8 +33,8 @@ from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, delete_file from openlp.plugins.bibles.lib import parse_reference -from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, SpellingDB, \ - BiblesResourcesDB +from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, \ + AlternativeBookNamesDB, BiblesResourcesDB from csvbible import CSVBible from http import HTTPBible from opensong import OpenSongBible @@ -131,7 +131,7 @@ class BibleManager(object): self.suffix = u'.sqlite' self.import_wizard = None self.reload_bibles() - self.reload_spelling() + self.reload_alternative_book_names() self.media = None def reload_bibles(self): @@ -169,16 +169,15 @@ class BibleManager(object): self.db_cache[name] = web_bible log.debug(u'Bibles reloaded') - def reload_spelling(self): + def reload_alternative_book_names(self): """ - Reloads the Spelling from the Spelling table and spelling_extension + Reloads the alternative book names from the local alternative book names database on disk. """ - log.debug(u'Reload spelling') - self.spelling_cache = {} - self.spelling_cache[u'spelling'] = SpellingDB(self.parent, + log.debug(u'Reload AlternativeBookNames') + self.alternative_book_names_cache = AlternativeBookNamesDB(self.parent, path=self.path) - log.debug(u'Spelling reloaded') + log.debug(u'AlternativeBookNames reloaded') def set_process_dialog(self, wizard): """ @@ -335,12 +334,13 @@ class BibleManager(object): if BiblesResourcesDB.get_book(book): book_temp = BiblesResourcesDB.get_book(book) book_id = book_temp[u'id'] - elif BiblesResourcesDB.get_spelling(book, language_id): - book_id = BiblesResourcesDB.get_spelling(book, language_id) - elif self.spelling_cache[u'spelling'].get_book_reference_id(book, + elif BiblesResourcesDB.get_alternative_book_name(book, language_id): + book_id = BiblesResourcesDB.get_alternative_book_name(book, + language_id) + elif self.alternative_book_names_cache.get_book_reference_id(book, language_id): - book_id = self.spelling_cache[u'spelling'].\ - get_book_reference_id(book, language_id) + book_id = self.alternative_book_names_cache.get_book_reference_id( + book, language_id) else: book_ref = self.parent.mediaItem.importRequest(u'book', book) log.debug(book_ref) @@ -351,8 +351,8 @@ class BibleManager(object): else: return None if book_id: - self.spelling_cache[u'spelling'].create_spelling(book, book_id, - language_id) + self.alternative_book_names_cache.create_alternative_book_name( + book, book_id, language_id) if book_id: return book_id else: diff --git a/openlp/plugins/bibles/resources/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite index 102fe25b7b69699a415a795bf7e13f84d392da16..47d136618a8b30aa35673472486e38a1cac239a3 100644 GIT binary patch delta 306 zcmZqpz})bGd4jZH7Xt%>9T4jRF*6V=Pt-AH?An;HjGa$|f%zWuapuL$UCdF;8k-e4 zM3~JD*qBop6B%+CN*GcZiWu@35`nBthB6>8o*{`L9|*I7ERc9EP^_4NQHzy1l5w(w zx7y}b?gkrnh9?XRPnZr*Y`l@%9K+A9n3~GiT37;9o&+>B6-X0rG%0GOCckHt(o`bW Z{K*rSm2T$r`YpMcrD8G5=H(fY{Q&wHNofE8 delta 224 zcmZqpz})bGd4jZH2Ll6x9T4jRF*6V=P1G@F?AVyFjGfPgf%zWuapuL$UCdF;E}IQ` z449=w*qC)0ix~RIdm9} zn>qN|6?JtPTP;f%5*dfhMPJ{-4e`0RXkvGWP%g From e2ae3025c99d8889e8bc3e0f73397e2c080fec41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 23 Mar 2011 22:07:04 +0100 Subject: [PATCH 010/124] fill up bibles_resources database with alternative book names in different languages (EN, DE, FR, IT, ES, PT, RU, SV, NO, NL, CS, SK, RO, HR, HU, BG, AR, TR, PL, DA, ZH) --- .../bibles/resources/bibles_resources.sqlite | Bin 63488 -> 101376 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/openlp/plugins/bibles/resources/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite index 47d136618a8b30aa35673472486e38a1cac239a3..23c89b5df80e39da39e81eb94cc6a0e9b8dd1474 100644 GIT binary patch literal 101376 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 IF{VWQzbF2-(f|Me delta 354 zcmZpe!PfABd4e==7Xt%>9T4jRG4n(XbH=WX3Cq~|G#HrgF&}4M%-qEs#jLT}kVk}> z)qssTm2q;erw$vV7Atck<75YKwau;E)e)O2ma}YLo)PI@4>SY>n1I+8h(QK}Xni0y z0Ad>;wgzG|AT|MFb0D??VoM;l0Af8L)`ns&AZ-N1#y|{GYYN05eIPv`wIDsBKnyYu zWUep}v+@H8z0HCmHO!MFST?h4VHROzn9OlPmvP-@vlA7Jk`i$&44RTb45bXkK$yvp z$dJcS1mr1fK7P`HO`L)G8S@$DZOn_9o0zkh1DI`?`Ivq&-PtU6VIPyMi~$RSp`-^; hbsj@HP-hWTe+F3p&r9sGK#SiqZ&na_z&vq+Apo51LIMB) From 9d1c1b1fbb64a1b0f0466437a28067c353927ad2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Fri, 1 Apr 2011 19:54:12 +0200 Subject: [PATCH 011/124] mark and comment out some unused code in csv import form bug fix --- .../plugins/bibles/forms/bibleimportform.py | 42 ++++++++++++++----- openlp/plugins/bibles/lib/opensong.py | 2 +- 2 files changed, 32 insertions(+), 12 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 9fee25654..7857a9151 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -114,9 +114,10 @@ class BibleImportForm(OpenLPWizard): QtCore.QObject.connect(self.osisBrowseButton, QtCore.SIGNAL(u'clicked()'), self.onOsisBrowseButtonClicked) - QtCore.QObject.connect(self.csvTestamentsButton, - QtCore.SIGNAL(u'clicked()'), - self.onCsvTestamentsBrowseButtonClicked) + #TODO: Delete unused code + #QtCore.QObject.connect(self.csvTestamentsButton, + # QtCore.SIGNAL(u'clicked()'), + # self.onCsvTestamentsBrowseButtonClicked) QtCore.QObject.connect(self.csvBooksButton, QtCore.SIGNAL(u'clicked()'), self.onCsvBooksBrowseButtonClicked) @@ -177,6 +178,8 @@ class BibleImportForm(OpenLPWizard): self.csvLayout = QtGui.QFormLayout(self.csvWidget) self.csvLayout.setMargin(0) self.csvLayout.setObjectName(u'CsvLayout') + #TODO: Delete unused code + ''' self.csvTestamentsLabel = QtGui.QLabel(self.csvWidget) self.csvTestamentsLabel.setObjectName(u'CsvTestamentsLabel') self.csvTestamentsLayout = QtGui.QHBoxLayout() @@ -184,11 +187,13 @@ class BibleImportForm(OpenLPWizard): self.csvTestamentsEdit = QtGui.QLineEdit(self.csvWidget) self.csvTestamentsEdit.setObjectName(u'CsvTestamentsEdit') self.csvTestamentsLayout.addWidget(self.csvTestamentsEdit) + self.csvTestamentsButton = QtGui.QToolButton(self.csvWidget) self.csvTestamentsButton.setIcon(self.openIcon) self.csvTestamentsButton.setObjectName(u'CsvTestamentsButton') self.csvTestamentsLayout.addWidget(self.csvTestamentsButton) self.csvLayout.addRow(self.csvTestamentsLabel, self.csvTestamentsLayout) + ''' self.csvBooksLabel = QtGui.QLabel(self.csvWidget) self.csvBooksLabel.setObjectName(u'CsvBooksLabel') self.csvBooksLayout = QtGui.QHBoxLayout() @@ -373,8 +378,9 @@ class BibleImportForm(OpenLPWizard): translate('BiblesPlugin.ImportWizardForm', 'Bible file:')) self.osisFileLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Bible file:')) - self.csvTestamentsLabel.setText( - translate('BiblesPlugin.ImportWizardForm', 'Testaments file:')) + #TODO: Delete unused code + #self.csvTestamentsLabel.setText( + # translate('BiblesPlugin.ImportWizardForm', 'Testaments file:')) self.csvBooksLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Books file:')) self.csvVersesLabel.setText( @@ -425,7 +431,8 @@ class BibleImportForm(OpenLPWizard): # Align all QFormLayouts towards each other. labelWidth = max(self.formatLabel.minimumSizeHint().width(), self.osisFileLabel.minimumSizeHint().width(), - self.csvTestamentsLabel.minimumSizeHint().width(), + #TODO: Delete unused code + #self.csvTestamentsLabel.minimumSizeHint().width(), self.csvBooksLabel.minimumSizeHint().width(), self.csvVersesLabel.minimumSizeHint().width(), self.openSongFileLabel.minimumSizeHint().width(), @@ -447,6 +454,8 @@ class BibleImportForm(OpenLPWizard): self.osisFileEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == BibleFormat.CSV: + #TODO: Delete unused code + ''' if not self.field(u'csv_testamentsfile').toString(): answer = critical_error_message_box(UiStrings.NFSs, translate('BiblesPlugin.ImportWizardForm', @@ -455,6 +464,7 @@ class BibleImportForm(OpenLPWizard): if answer == QtGui.QMessageBox.No: self.csvTestamentsEdit.setFocus() return False + ''' if not self.field(u'csv_booksfile').toString(): critical_error_message_box(UiStrings.NFSs, translate('BiblesPlugin.ImportWizardForm', @@ -531,7 +541,8 @@ class BibleImportForm(OpenLPWizard): """ self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.OSIS, self.osisFileEdit) - + #TODO: Delete unused code + ''' def onCsvTestamentsBrowseButtonClicked(self): """ Show the file open dialog for the testaments CSV file. @@ -539,7 +550,7 @@ class BibleImportForm(OpenLPWizard): self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.CSV, self.csvTestamentsEdit, u'%s (*.csv)' % translate('BiblesPlugin.ImportWizardForm', 'CSV File')) - + ''' def onCsvBooksBrowseButtonClicked(self): """ Show the file open dialog for the books CSV file. @@ -578,8 +589,9 @@ class BibleImportForm(OpenLPWizard): """ self.selectPage.registerField(u'source_format', self.formatComboBox) self.selectPage.registerField(u'osis_location', self.osisFileEdit) - self.selectPage.registerField( - u'csv_testamentsfile', self.csvTestamentsEdit) + #TODO: Delete unused code + #self.selectPage.registerField( + # u'csv_testamentsfile', self.csvTestamentsEdit) self.selectPage.registerField(u'csv_booksfile', self.csvBooksEdit) self.selectPage.registerField(u'csv_versefile', self.csvVersesEdit) self.selectPage.registerField(u'opensong_file', self.openSongFileEdit) @@ -608,7 +620,8 @@ class BibleImportForm(OpenLPWizard): self.cancelButton.setVisible(True) self.setField(u'source_format', QtCore.QVariant(0)) self.setField(u'osis_location', QtCore.QVariant('')) - self.setField(u'csv_testamentsfile', QtCore.QVariant('')) + #TODO: Delete unused code + #self.setField(u'csv_testamentsfile', QtCore.QVariant('')) self.setField(u'csv_booksfile', QtCore.QVariant('')) self.setField(u'csv_versefile', QtCore.QVariant('')) self.setField(u'opensong_file', QtCore.QVariant('')) @@ -689,11 +702,18 @@ class BibleImportForm(OpenLPWizard): ) elif bible_type == BibleFormat.CSV: # Import a CSV bible. + #TODO: Delete unused code + ''' importer = self.manager.import_bible(BibleFormat.CSV, name=license_version, testamentsfile=unicode( self.field(u'csv_testamentsfile').toString()), booksfile=unicode(self.field(u'csv_booksfile').toString()), versefile=unicode(self.field(u'csv_versefile').toString()) + ''' + 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. diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index f1a64c2e7..a1f65ad04 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -66,7 +66,7 @@ class OpenSongBible(BibleDB): if not language: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) - return False + return False language = BiblesResourcesDB.get_language(language) language_id = language[u'id'] self.create_meta(u'language_id', language_id) From c04a76e12dde1de9781dad696c30368e4ccae198 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Fri, 1 Apr 2011 22:26:25 +0200 Subject: [PATCH 012/124] split BibleImportRequest in BookNameForm and LanugageForm --- openlp/plugins/bibles/forms/__init__.py | 3 +- ...portrequestdialog.py => booknamedialog.py} | 32 +++---- ...leimportrequestform.py => booknameform.py} | 31 +++--- openlp/plugins/bibles/forms/languagedialog.py | 94 +++++++++++++++++++ openlp/plugins/bibles/forms/languageform.py | 71 ++++++++++++++ openlp/plugins/bibles/lib/csvbible.py | 2 +- openlp/plugins/bibles/lib/db.py | 2 +- openlp/plugins/bibles/lib/http.py | 2 +- openlp/plugins/bibles/lib/manager.py | 12 ++- openlp/plugins/bibles/lib/mediaitem.py | 17 ++-- openlp/plugins/bibles/lib/openlp1.py | 2 +- openlp/plugins/bibles/lib/opensong.py | 2 +- openlp/plugins/bibles/lib/osis.py | 4 +- 13 files changed, 221 insertions(+), 53 deletions(-) rename openlp/plugins/bibles/forms/{bibleimportrequestdialog.py => booknamedialog.py} (82%) rename openlp/plugins/bibles/forms/{bibleimportrequestform.py => booknameform.py} (72%) create mode 100644 openlp/plugins/bibles/forms/languagedialog.py create mode 100644 openlp/plugins/bibles/forms/languageform.py diff --git a/openlp/plugins/bibles/forms/__init__.py b/openlp/plugins/bibles/forms/__init__.py index aed6f71f3..367ebcefc 100644 --- a/openlp/plugins/bibles/forms/__init__.py +++ b/openlp/plugins/bibles/forms/__init__.py @@ -52,6 +52,7 @@ from the .ui files later if necessary. """ from bibleimportform import BibleImportForm -from bibleimportrequestform import BibleImportRequest +from booknameform import BookNameForm +from languageform import LanguageForm __all__ = ['BibleImportForm'] diff --git a/openlp/plugins/bibles/forms/bibleimportrequestdialog.py b/openlp/plugins/bibles/forms/booknamedialog.py similarity index 82% rename from openlp/plugins/bibles/forms/bibleimportrequestdialog.py rename to openlp/plugins/bibles/forms/booknamedialog.py index 7fcc36932..d17bd8522 100644 --- a/openlp/plugins/bibles/forms/bibleimportrequestdialog.py +++ b/openlp/plugins/bibles/forms/booknamedialog.py @@ -29,18 +29,18 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate from openlp.core.lib.ui import create_accept_reject_button_box -class Ui_BibleImportRequest(object): - def setupUi(self, bibleImportRequest): - bibleImportRequest.setObjectName("BibleImportRequest") - bibleImportRequest.resize(400, 175) +class Ui_BookNameDialog(object): + def setupUi(self, bookNameDialog): + bookNameDialog.setObjectName("BookNameDialog") + bookNameDialog.resize(400, 175) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(bibleImportRequest.sizePolicy() + sizePolicy.setHeightForWidth(bookNameDialog.sizePolicy() .hasHeightForWidth()) - bibleImportRequest.setSizePolicy(sizePolicy) - self.widget = QtGui.QWidget(bibleImportRequest) + bookNameDialog.setSizePolicy(sizePolicy) + self.widget = QtGui.QWidget(bookNameDialog) self.widget.setGeometry(QtCore.QRect(10, 15, 381, 151)) self.widget.setObjectName("widget") self.verticalLayout = QtGui.QVBoxLayout(self.widget) @@ -79,17 +79,17 @@ class Ui_BibleImportRequest(object): QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.formLayout.addWidget( - create_accept_reject_button_box(bibleImportRequest)) - self.retranslateUi(bibleImportRequest) - QtCore.QMetaObject.connectSlotsByName(bibleImportRequest) + create_accept_reject_button_box(bookNameDialog)) + self.retranslateUi(bookNameDialog) + QtCore.QMetaObject.connectSlotsByName(bookNameDialog) - def retranslateUi(self, bibleImportRequest): - bibleImportRequest.setWindowTitle( - translate("BiblesPlugin.bibleImportRequest", "Dialog")) + def retranslateUi(self, bookNameDialog): + bookNameDialog.setWindowTitle( + translate("BiblesPlugin.BookNameDialog", "Choose Book")) self.headlineLabel.setText( - translate("BiblesPlugin.bibleImportRequest", "Choose Book:")) - self.infoLabel.setText(translate("BiblesPlugin.bibleImportRequest", + translate("BiblesPlugin.BookNameDialog", "Choose Book:")) + self.infoLabel.setText(translate("BiblesPlugin.BookNameDialog", "The following books cannot be clearly attributed. \n" "Please choose the book it is.")) - self.requestLabel.setText(translate("BiblesPlugin.bibleImportRequest", + self.requestLabel.setText(translate("BiblesPlugin.BookNameDialog", "Book:")) diff --git a/openlp/plugins/bibles/forms/bibleimportrequestform.py b/openlp/plugins/bibles/forms/booknameform.py similarity index 72% rename from openlp/plugins/bibles/forms/bibleimportrequestform.py rename to openlp/plugins/bibles/forms/booknameform.py index caac8e83b..f3923cb63 100644 --- a/openlp/plugins/bibles/forms/bibleimportrequestform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -25,7 +25,7 @@ ############################################################################### """ -Module implementing BibleImportRequest. +Module implementing BookNameForm. """ import logging @@ -33,17 +33,17 @@ from PyQt4.QtGui import QDialog from openlp.core.lib import translate from openlp.core.lib.ui import critical_error_message_box -from openlp.plugins.bibles.forms.bibleimportrequestdialog import \ - Ui_BibleImportRequest +from openlp.plugins.bibles.forms.booknamedialog import \ + Ui_BookNameDialog from openlp.plugins.bibles.lib.db import BiblesResourcesDB log = logging.getLogger(__name__) -class BibleImportRequest(QDialog, Ui_BibleImportRequest): +class BookNameForm(QDialog, Ui_BookNameDialog): """ Class documentation goes here. """ - log.info(u'BibleImportRequest loaded') + log.info(u'BookNameForm loaded') def __init__(self, parent = None): """ @@ -52,21 +52,12 @@ class BibleImportRequest(QDialog, Ui_BibleImportRequest): QDialog.__init__(self, parent) self.setupUi(self) - def exec_(self, case, name=None): + def exec_(self, name): items = [] self.requestComboBox.addItem(u'') - if case == u'language': - self.headlineLabel.setText(translate( - "BiblesPlugin.BibleImportRequest", "Choose Language:")) - self.infoLabel.setText(translate("BiblesPlugin.BibleImportRequest", - "Please choose the language the bible is.")) - self.requestLabel.setText( - translate("BiblesPlugin.BibleImportRequest", "Language:")) - items = BiblesResourcesDB.get_languages() - elif case == u'book': - self.requestLabel.setText( - translate("BiblesPlugin.BibleImportRequest", name)) - items = BiblesResourcesDB.get_books() + self.requestLabel.setText( + translate("BiblesPlugin.BookNameForm", name)) + items = BiblesResourcesDB.get_books() for item in items: self.requestComboBox.addItem(item[u'name']) return QDialog.exec_(self) @@ -74,8 +65,8 @@ class BibleImportRequest(QDialog, Ui_BibleImportRequest): def accept(self): if self.requestComboBox.currentText() == u"": critical_error_message_box( - message=translate('BiblesPlugin.BibleImportRequest', - 'You need to choose an item.')) + message=translate('BiblesPlugin.BookNameForm', + 'You need to choose a book.')) self.requestComboBox.setFocus() return False else: diff --git a/openlp/plugins/bibles/forms/languagedialog.py b/openlp/plugins/bibles/forms/languagedialog.py new file mode 100644 index 000000000..08155a5b2 --- /dev/null +++ b/openlp/plugins/bibles/forms/languagedialog.py @@ -0,0 +1,94 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, 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 translate +from openlp.core.lib.ui import create_accept_reject_button_box + +class Ui_LanguageDialog(object): + def setupUi(self, languageDialog): + languageDialog.setObjectName("LanugageDialog") + languageDialog.resize(400, 175) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.MinimumExpanding) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(languageDialog.sizePolicy() + .hasHeightForWidth()) + languageDialog.setSizePolicy(sizePolicy) + self.widget = QtGui.QWidget(languageDialog) + self.widget.setGeometry(QtCore.QRect(10, 15, 381, 151)) + self.widget.setObjectName("widget") + self.verticalLayout = QtGui.QVBoxLayout(self.widget) + self.verticalLayout.setObjectName("verticalLayout") + self.headlineLabel = QtGui.QLabel(self.widget) + font = QtGui.QFont() + font.setFamily("Arial") + font.setPointSize(11) + font.setWeight(75) + font.setBold(True) + self.headlineLabel.setFont(font) + self.headlineLabel.setObjectName("HeadlineLabel") + self.verticalLayout.addWidget(self.headlineLabel) + self.infoLabel = QtGui.QLabel(self.widget) + self.infoLabel.setObjectName("InfoLabel") + self.verticalLayout.addWidget(self.infoLabel) + self.formLayout = QtGui.QFormLayout() + self.formLayout.setObjectName("formLayout") + self.requestLabel = QtGui.QLabel(self.widget) + self.requestLabel.setObjectName("RequestLabel") + self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, + self.requestLabel) + self.requestComboBox = QtGui.QComboBox(self.widget) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.requestComboBox.sizePolicy() + .hasHeightForWidth()) + self.requestComboBox.setSizePolicy(sizePolicy) + self.requestComboBox.setObjectName("RequestComboBox") + self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, + self.requestComboBox) + self.verticalLayout.addLayout(self.formLayout) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Expanding) + self.verticalLayout.addItem(spacerItem) + self.formLayout.addWidget( + create_accept_reject_button_box(languageDialog)) + self.retranslateUi(languageDialog) + QtCore.QMetaObject.connectSlotsByName(languageDialog) + + def retranslateUi(self, languageDialog): + languageDialog.setWindowTitle( + translate("BiblesPlugin.LanguageDialog", "Choose Language")) + self.headlineLabel.setText( + translate("BiblesPlugin.LanguageDialog", "Choose Language:")) + self.infoLabel.setText(translate("BiblesPlugin.LanguageDialog", + "Please choose the language the bible is.")) + self.requestLabel.setText(translate("BiblesPlugin.languageDialog", + "Language:")) diff --git a/openlp/plugins/bibles/forms/languageform.py b/openlp/plugins/bibles/forms/languageform.py new file mode 100644 index 000000000..220e28271 --- /dev/null +++ b/openlp/plugins/bibles/forms/languageform.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Meinert Jordan, Armin Köhler, 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 # +############################################################################### + +""" +Module implementing BookNameForm. +""" +import logging + +from PyQt4.QtGui import QDialog + +from openlp.core.lib import translate +from openlp.core.lib.ui import critical_error_message_box +from openlp.plugins.bibles.forms.languagedialog import \ + Ui_LanguageDialog +from openlp.plugins.bibles.lib.db import BiblesResourcesDB + +log = logging.getLogger(__name__) + +class LanguageForm(QDialog, Ui_LanguageDialog): + """ + Class documentation goes here. + """ + log.info(u'LanguageForm loaded') + + def __init__(self, parent = None): + """ + Constructor + """ + QDialog.__init__(self, parent) + self.setupUi(self) + + def exec_(self): + items = [] + self.requestComboBox.addItem(u'') + items = BiblesResourcesDB.get_languages() + for item in items: + self.requestComboBox.addItem(item[u'name']) + return QDialog.exec_(self) + + def accept(self): + if self.requestComboBox.currentText() == u"": + critical_error_message_box( + message=translate('BiblesPlugin.LanguageForm', + 'You need to choose a language.')) + self.requestComboBox.setFocus() + return False + else: + return QDialog.accept(self) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 8ce1c87e5..1c53383ac 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -139,7 +139,7 @@ class CSVBible(BibleDB): self.wizard.progressBar.setMinimum(0) self.wizard.progressBar.setMaximum(66) success = True - language = self.parent.mediaItem.importRequest(u'language') + language = self.parent.mediaItem.languageDialog() if not language: log.exception(u'Importing books from %s " '\ 'failed' % self.booksfile) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 4d4f401d4..e1abecd89 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -198,7 +198,7 @@ class BibleDB(QtCore.QObject, Manager): self.file = self.clean_filename(self.name) if u'file' in kwargs: self.file = kwargs[u'file'] - Manager.__init__(self, u'bibles', init_schema, self.file) + Manager.__init__(self, u'bibles/bibles', init_schema, self.file) if u'file' in kwargs: self.get_name() self.wizard = None diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 5923fc565..dc751052a 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -414,7 +414,7 @@ class HTTPBible(BibleDB): if bible[u'language_id']: language_id = bible[u'language_id'] else: - language = self.parent.mediaItem.importRequest(u'language') + language = self.parent.mediaItem.languageDialog() if not language: log.exception(u'Importing books from %s - download name: "%s" '\ 'failed' % (self.download_source, self.download_name)) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 09f71de91..0e6cc1e3a 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -121,7 +121,7 @@ class BibleManager(object): """ log.debug(u'Bible Initialising') self.parent = parent - self.settingsSection = u'bibles' + self.settingsSection = u'bibles/bibles' self.web = u'Web' self.db_cache = None self.path = AppLocation.get_section_data_path(self.settingsSection) @@ -131,7 +131,8 @@ class BibleManager(object): self.suffix = u'.sqlite' self.import_wizard = None self.reload_bibles() - self.reload_alternative_book_names() + #TODO: Delete unused code + #self.reload_alternative_book_names() self.media = None def reload_bibles(self): @@ -169,6 +170,8 @@ class BibleManager(object): self.db_cache[name] = web_bible log.debug(u'Bibles reloaded') + #TODO: Delete unused code + ''' def reload_alternative_book_names(self): """ Reloads the alternative book names from the local alternative book names @@ -178,6 +181,7 @@ class BibleManager(object): self.alternative_book_names_cache = AlternativeBookNamesDB(self.parent, path=self.path) log.debug(u'AlternativeBookNames reloaded') + ''' def set_process_dialog(self, wizard): """ @@ -331,6 +335,8 @@ class BibleManager(object): def get_book_ref_id_by_name(self, book, language_id=None): log.debug(u'BibleManager.get_book_ref_id_by_name:("%s", "%s")', book, language_id) + self.alternative_book_names_cache = AlternativeBookNamesDB(self.parent, + path=self.path) if BiblesResourcesDB.get_book(book): book_temp = BiblesResourcesDB.get_book(book) book_id = book_temp[u'id'] @@ -342,7 +348,7 @@ class BibleManager(object): book_id = self.alternative_book_names_cache.get_book_reference_id( book, language_id) else: - book_ref = self.parent.mediaItem.importRequest(u'book', book) + book_ref = self.parent.mediaItem.bookNameDialog(book) log.debug(book_ref) book_temp = BiblesResourcesDB.get_book(book_ref) log.debug(book_temp) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 1cb53d99c..e55d4fe14 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -33,10 +33,10 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings, add_widget_completer, \ media_item_combo_box, critical_error_message_box -from openlp.plugins.bibles.forms import BibleImportForm +from openlp.plugins.bibles.forms import BibleImportForm, BookNameForm, \ + LanguageForm from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ VerseReferenceList, get_reference_match -from openlp.plugins.bibles.forms import BibleImportRequest log = logging.getLogger(__name__) @@ -287,10 +287,15 @@ class BibleMediaItem(MediaManagerItem): if self.import_wizard.exec_(): self.reloadBibles() - def importRequest(self, case, name=None): - self.import_request = BibleImportRequest(self) - if self.import_request.exec_(case, name): - return unicode(self.import_request.requestComboBox.currentText()) + def bookNameDialog(self, name): + self.book_name = BookNameForm(self) + if self.book_name.exec_(name): + return unicode(self.book_name.requestComboBox.currentText()) + + def languageDialog(self): + self.language = LanguageForm(self) + if self.language.exec_(): + return unicode(self.language.requestComboBox.currentText()) def loadBibles(self): log.debug(u'Loading Bibles') diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 46c83c3c3..7a6ebbece 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -58,7 +58,7 @@ class OpenLP1Bible(BibleDB): except: return False #Create the bible language - language = self.parent.mediaItem.importRequest(u'language') + language = self.parent.mediaItem.languageDialog() if not language: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 074a8833d..55f83c33a 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -62,7 +62,7 @@ class OpenSongBible(BibleDB): file = open(self.filename, u'r') opensong = objectify.parse(file) bible = opensong.getroot() - language = self.parent.mediaItem.importRequest(u'language') + language = self.parent.mediaItem.languageDialog() if not language: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index f525512ba..83a5a2974 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -107,7 +107,7 @@ class OSISBible(BibleDB): if detect_file: detect_file.close() # Set meta language_id - language = self.parent.mediaItem.importRequest(u'language') + language = self.parent.mediaItem.languageDialog() if not language: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) @@ -128,7 +128,7 @@ class OSISBible(BibleDB): verse = int(match.group(3)) verse_text = match.group(4) if not db_book or db_book.name != self.books[book][0]: - log.debug(u'New book: "%s"', self.books[book][0]) + log.debug(u'New book: "%s"' % self.books[book][0]) #TODO: Delete unused code #if book == u'Matt' or book == u'Jdt': # testament += 1 From 9de33cf1949636c85d27b4c2171db58b82488730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sat, 2 Apr 2011 21:17:48 +0200 Subject: [PATCH 013/124] moved Dialog from mediaitem.py to bibleimportform.py some fixes --- openlp/plugins/bibles/forms/__init__.py | 3 +- .../plugins/bibles/forms/bibleimportform.py | 11 +++++++ openlp/plugins/bibles/forms/booknamedialog.py | 32 +++++++++---------- openlp/plugins/bibles/forms/booknameform.py | 7 ++-- openlp/plugins/bibles/forms/languagedialog.py | 30 ++++++++--------- openlp/plugins/bibles/forms/languageform.py | 4 +-- openlp/plugins/bibles/lib/csvbible.py | 2 +- openlp/plugins/bibles/lib/db.py | 2 +- openlp/plugins/bibles/lib/http.py | 2 +- openlp/plugins/bibles/lib/manager.py | 2 +- openlp/plugins/bibles/lib/mediaitem.py | 13 +------- openlp/plugins/bibles/lib/openlp1.py | 2 +- openlp/plugins/bibles/lib/opensong.py | 2 +- openlp/plugins/bibles/lib/osis.py | 2 +- 14 files changed, 57 insertions(+), 57 deletions(-) diff --git a/openlp/plugins/bibles/forms/__init__.py b/openlp/plugins/bibles/forms/__init__.py index 367ebcefc..561944563 100644 --- a/openlp/plugins/bibles/forms/__init__.py +++ b/openlp/plugins/bibles/forms/__init__.py @@ -50,9 +50,8 @@ This allows OpenLP to use ``self.object`` for all the GUI elements while keeping them separate from the functionality, so that it is easier to recreate the GUI from the .ui files later if necessary. """ - -from bibleimportform import BibleImportForm from booknameform import BookNameForm from languageform import LanguageForm +from bibleimportform import BibleImportForm __all__ = ['BibleImportForm'] diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index fd6690888..ea7156193 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -40,6 +40,7 @@ from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.utils import AppLocation, string_is_unicode from openlp.plugins.bibles.lib.manager import BibleFormat from openlp.plugins.bibles.lib.db import BiblesResourcesDB +from openlp.plugins.bibles.forms import BookNameForm, LanguageForm log = logging.getLogger(__name__) @@ -758,3 +759,13 @@ class BibleImportForm(OpenLPWizard): 'BiblesPlugin.ImportWizardForm', 'Your Bible import failed.')) del self.manager.db_cache[importer.name] delete_database(self.plugin.settingsSection, importer.file) + + def bookNameDialog(self, name): + self.book_name = BookNameForm(self) + if self.book_name.exec_(name): + return unicode(self.book_name.requestComboBox.currentText()) + + def languageDialog(self): + self.language = LanguageForm(self) + if self.language.exec_(): + return unicode(self.language.requestComboBox.currentText()) diff --git a/openlp/plugins/bibles/forms/booknamedialog.py b/openlp/plugins/bibles/forms/booknamedialog.py index d17bd8522..bb48548c0 100644 --- a/openlp/plugins/bibles/forms/booknamedialog.py +++ b/openlp/plugins/bibles/forms/booknamedialog.py @@ -31,7 +31,7 @@ from openlp.core.lib.ui import create_accept_reject_button_box class Ui_BookNameDialog(object): def setupUi(self, bookNameDialog): - bookNameDialog.setObjectName("BookNameDialog") + bookNameDialog.setObjectName(u'BookNameDialog') bookNameDialog.resize(400, 175) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.MinimumExpanding) @@ -42,25 +42,25 @@ class Ui_BookNameDialog(object): bookNameDialog.setSizePolicy(sizePolicy) self.widget = QtGui.QWidget(bookNameDialog) self.widget.setGeometry(QtCore.QRect(10, 15, 381, 151)) - self.widget.setObjectName("widget") + self.widget.setObjectName(u'widget') self.verticalLayout = QtGui.QVBoxLayout(self.widget) - self.verticalLayout.setObjectName("verticalLayout") + self.verticalLayout.setObjectName(u'verticalLayout') self.headlineLabel = QtGui.QLabel(self.widget) font = QtGui.QFont() - font.setFamily("Arial") + font.setFamily(u'Arial') font.setPointSize(11) font.setWeight(75) font.setBold(True) self.headlineLabel.setFont(font) - self.headlineLabel.setObjectName("HeadlineLabel") + self.headlineLabel.setObjectName(u'HeadlineLabel') self.verticalLayout.addWidget(self.headlineLabel) self.infoLabel = QtGui.QLabel(self.widget) - self.infoLabel.setObjectName("InfoLabel") + self.infoLabel.setObjectName(u'InfoLabel') self.verticalLayout.addWidget(self.infoLabel) self.formLayout = QtGui.QFormLayout() - self.formLayout.setObjectName("formLayout") + self.formLayout.setObjectName(u'formLayout') self.requestLabel = QtGui.QLabel(self.widget) - self.requestLabel.setObjectName("RequestLabel") + self.requestLabel.setObjectName(u'RequestLabel') self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.requestLabel) self.requestComboBox = QtGui.QComboBox(self.widget) @@ -71,7 +71,7 @@ class Ui_BookNameDialog(object): sizePolicy.setHeightForWidth(self.requestComboBox.sizePolicy() .hasHeightForWidth()) self.requestComboBox.setSizePolicy(sizePolicy) - self.requestComboBox.setObjectName("RequestComboBox") + self.requestComboBox.setObjectName(u'RequestComboBox') self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.requestComboBox) self.verticalLayout.addLayout(self.formLayout) @@ -85,11 +85,11 @@ class Ui_BookNameDialog(object): def retranslateUi(self, bookNameDialog): bookNameDialog.setWindowTitle( - translate("BiblesPlugin.BookNameDialog", "Choose Book")) + translate('BiblesPlugin.BookNameDialog', 'Choose Book')) self.headlineLabel.setText( - translate("BiblesPlugin.BookNameDialog", "Choose Book:")) - self.infoLabel.setText(translate("BiblesPlugin.BookNameDialog", - "The following books cannot be clearly attributed. \n" - "Please choose the book it is.")) - self.requestLabel.setText(translate("BiblesPlugin.BookNameDialog", - "Book:")) + translate('BiblesPlugin.BookNameDialog', 'Choose Book:')) + self.infoLabel.setText(translate('BiblesPlugin.BookNameDialog', + 'The following books cannot be clearly attributed. \n' + 'Please choose the book it is.')) + self.requestLabel.setText(translate('BiblesPlugin.BookNameDialog', + 'Book:')) diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index f3923cb63..58603226c 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -41,7 +41,8 @@ log = logging.getLogger(__name__) class BookNameForm(QDialog, Ui_BookNameDialog): """ - Class documentation goes here. + Class to manage a dialog which help the user to refer a book name a + to a english book name """ log.info(u'BookNameForm loaded') @@ -56,14 +57,14 @@ class BookNameForm(QDialog, Ui_BookNameDialog): items = [] self.requestComboBox.addItem(u'') self.requestLabel.setText( - translate("BiblesPlugin.BookNameForm", name)) + translate('BiblesPlugin.BookNameForm', name)) items = BiblesResourcesDB.get_books() for item in items: self.requestComboBox.addItem(item[u'name']) return QDialog.exec_(self) def accept(self): - if self.requestComboBox.currentText() == u"": + if self.requestComboBox.currentText() == u'': critical_error_message_box( message=translate('BiblesPlugin.BookNameForm', 'You need to choose a book.')) diff --git a/openlp/plugins/bibles/forms/languagedialog.py b/openlp/plugins/bibles/forms/languagedialog.py index 08155a5b2..c4ede8e77 100644 --- a/openlp/plugins/bibles/forms/languagedialog.py +++ b/openlp/plugins/bibles/forms/languagedialog.py @@ -31,7 +31,7 @@ from openlp.core.lib.ui import create_accept_reject_button_box class Ui_LanguageDialog(object): def setupUi(self, languageDialog): - languageDialog.setObjectName("LanugageDialog") + languageDialog.setObjectName(u'LanugageDialog') languageDialog.resize(400, 175) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.MinimumExpanding) @@ -42,25 +42,25 @@ class Ui_LanguageDialog(object): languageDialog.setSizePolicy(sizePolicy) self.widget = QtGui.QWidget(languageDialog) self.widget.setGeometry(QtCore.QRect(10, 15, 381, 151)) - self.widget.setObjectName("widget") + self.widget.setObjectName(u'widget') self.verticalLayout = QtGui.QVBoxLayout(self.widget) - self.verticalLayout.setObjectName("verticalLayout") + self.verticalLayout.setObjectName(u'verticalLayout') self.headlineLabel = QtGui.QLabel(self.widget) font = QtGui.QFont() - font.setFamily("Arial") + font.setFamily(u'Arial') font.setPointSize(11) font.setWeight(75) font.setBold(True) self.headlineLabel.setFont(font) - self.headlineLabel.setObjectName("HeadlineLabel") + self.headlineLabel.setObjectName(u'HeadlineLabel') self.verticalLayout.addWidget(self.headlineLabel) self.infoLabel = QtGui.QLabel(self.widget) - self.infoLabel.setObjectName("InfoLabel") + self.infoLabel.setObjectName(u'InfoLabel') self.verticalLayout.addWidget(self.infoLabel) self.formLayout = QtGui.QFormLayout() - self.formLayout.setObjectName("formLayout") + self.formLayout.setObjectName(u'formLayout') self.requestLabel = QtGui.QLabel(self.widget) - self.requestLabel.setObjectName("RequestLabel") + self.requestLabel.setObjectName(u'RequestLabel') self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.requestLabel) self.requestComboBox = QtGui.QComboBox(self.widget) @@ -71,7 +71,7 @@ class Ui_LanguageDialog(object): sizePolicy.setHeightForWidth(self.requestComboBox.sizePolicy() .hasHeightForWidth()) self.requestComboBox.setSizePolicy(sizePolicy) - self.requestComboBox.setObjectName("RequestComboBox") + self.requestComboBox.setObjectName(u'RequestComboBox') self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.requestComboBox) self.verticalLayout.addLayout(self.formLayout) @@ -85,10 +85,10 @@ class Ui_LanguageDialog(object): def retranslateUi(self, languageDialog): languageDialog.setWindowTitle( - translate("BiblesPlugin.LanguageDialog", "Choose Language")) + translate('BiblesPlugin.LanguageDialog', 'Choose Language')) self.headlineLabel.setText( - translate("BiblesPlugin.LanguageDialog", "Choose Language:")) - self.infoLabel.setText(translate("BiblesPlugin.LanguageDialog", - "Please choose the language the bible is.")) - self.requestLabel.setText(translate("BiblesPlugin.languageDialog", - "Language:")) + translate('BiblesPlugin.LanguageDialog', 'Choose Language:')) + self.infoLabel.setText(translate('BiblesPlugin.LanguageDialog', + 'Please choose the language the bible is.')) + self.requestLabel.setText(translate('BiblesPlugin.languageDialog', + 'Language:')) diff --git a/openlp/plugins/bibles/forms/languageform.py b/openlp/plugins/bibles/forms/languageform.py index 220e28271..f074a9dc5 100644 --- a/openlp/plugins/bibles/forms/languageform.py +++ b/openlp/plugins/bibles/forms/languageform.py @@ -41,7 +41,7 @@ log = logging.getLogger(__name__) class LanguageForm(QDialog, Ui_LanguageDialog): """ - Class documentation goes here. + Class to manage a dialog which ask the user for a language. """ log.info(u'LanguageForm loaded') @@ -61,7 +61,7 @@ class LanguageForm(QDialog, Ui_LanguageDialog): return QDialog.exec_(self) def accept(self): - if self.requestComboBox.currentText() == u"": + if self.requestComboBox.currentText() == u'': critical_error_message_box( message=translate('BiblesPlugin.LanguageForm', 'You need to choose a language.')) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 1c53383ac..2e1accb45 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -139,7 +139,7 @@ class CSVBible(BibleDB): self.wizard.progressBar.setMinimum(0) self.wizard.progressBar.setMaximum(66) success = True - language = self.parent.mediaItem.languageDialog() + language = self.parent.manager.import_wizard.languageDialog() if not language: log.exception(u'Importing books from %s " '\ 'failed' % self.booksfile) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index e1abecd89..6cfb48c21 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -785,7 +785,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the language. """ - log.debug(u'BiblesResourcesDB.get_language("%s", "%s")', name) + log.debug(u'BiblesResourcesDB.get_language("%s")', name) if not isinstance(name, unicode): name = unicode(name) name = name.title() diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index dc751052a..d0a911b32 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -414,7 +414,7 @@ class HTTPBible(BibleDB): if bible[u'language_id']: language_id = bible[u'language_id'] else: - language = self.parent.mediaItem.languageDialog() + language = self.parent.manager.import_wizard.languageDialog() if not language: log.exception(u'Importing books from %s - download name: "%s" '\ 'failed' % (self.download_source, self.download_name)) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 0e6cc1e3a..7cca6f4a0 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -348,7 +348,7 @@ class BibleManager(object): book_id = self.alternative_book_names_cache.get_book_reference_id( book, language_id) else: - book_ref = self.parent.mediaItem.bookNameDialog(book) + book_ref = self.import_wizard.bookNameDialog(book) log.debug(book_ref) book_temp = BiblesResourcesDB.get_book(book_ref) log.debug(book_temp) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index e55d4fe14..e0d2a031c 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -33,8 +33,7 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings, add_widget_completer, \ media_item_combo_box, critical_error_message_box -from openlp.plugins.bibles.forms import BibleImportForm, BookNameForm, \ - LanguageForm +from openlp.plugins.bibles.forms import BibleImportForm from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ VerseReferenceList, get_reference_match @@ -287,16 +286,6 @@ class BibleMediaItem(MediaManagerItem): if self.import_wizard.exec_(): self.reloadBibles() - def bookNameDialog(self, name): - self.book_name = BookNameForm(self) - if self.book_name.exec_(name): - return unicode(self.book_name.requestComboBox.currentText()) - - def languageDialog(self): - self.language = LanguageForm(self) - if self.language.exec_(): - return unicode(self.language.requestComboBox.currentText()) - def loadBibles(self): log.debug(u'Loading Bibles') self.quickVersionComboBox.clear() diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 7a6ebbece..bc3624479 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -58,7 +58,7 @@ class OpenLP1Bible(BibleDB): except: return False #Create the bible language - language = self.parent.mediaItem.languageDialog() + language = self.parent.manager.import_wizard.languageDialog() if not language: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 55f83c33a..6e4c4826f 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -62,7 +62,7 @@ class OpenSongBible(BibleDB): file = open(self.filename, u'r') opensong = objectify.parse(file) bible = opensong.getroot() - language = self.parent.mediaItem.languageDialog() + language = self.parent.manager.import_wizard.languageDialog() if not language: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 83a5a2974..cd006bb78 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -107,7 +107,7 @@ class OSISBible(BibleDB): if detect_file: detect_file.close() # Set meta language_id - language = self.parent.mediaItem.languageDialog() + language = self.parent.manager.import_wizard.languageDialog() if not language: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) From fbce21baaa2884fdc3bfde9bb2bf810eac13a5fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sat, 2 Apr 2011 22:22:35 +0200 Subject: [PATCH 014/124] new function get_language in BibleDB which ask for the language a bible is and return a language_id --- openlp/plugins/bibles/lib/csvbible.py | 11 ++++------- openlp/plugins/bibles/lib/db.py | 16 ++++++++++++++++ openlp/plugins/bibles/lib/http.py | 15 ++++++--------- openlp/plugins/bibles/lib/manager.py | 2 -- openlp/plugins/bibles/lib/openlp1.py | 7 ++----- openlp/plugins/bibles/lib/opensong.py | 7 ++----- openlp/plugins/bibles/lib/osis.py | 7 ++----- 7 files changed, 32 insertions(+), 33 deletions(-) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 2e1accb45..389ee1aac 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -139,14 +139,11 @@ class CSVBible(BibleDB): self.wizard.progressBar.setMinimum(0) self.wizard.progressBar.setMaximum(66) success = True - language = self.parent.manager.import_wizard.languageDialog() - if not language: - log.exception(u'Importing books from %s " '\ - 'failed' % self.booksfile) + language_id = self.get_language() + if not language_id: + log.exception(u'Importing books from %s " '\ + 'failed' % self.filename) return False - language = BiblesResourcesDB.get_language(language) - language_id = language[u'id'] - self.create_meta(u'language_id', language_id) books_file = None book_list = {} # Populate the Tables diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 6cfb48c21..1960e155b 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -489,6 +489,22 @@ class BibleDB(QtCore.QObject, Manager): else: return count + def get_language(self): + """ + Return the language of a bible. + + ``book`` + The language the bible is. + """ + log.debug(u'BibleDB.get_language()') + language = self.bible_plugin.manager.import_wizard.languageDialog() + if not language: + return False + language = BiblesResourcesDB.get_language(language) + language_id = language[u'id'] + self.create_meta(u'language_id', language_id) + return language_id + def dump_bible(self): """ Utility debugging method to dump the contents of a bible. diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index d0a911b32..75f2c37fc 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -413,16 +413,13 @@ class HTTPBible(BibleDB): self.download_source.lower()) if bible[u'language_id']: language_id = bible[u'language_id'] + self.create_meta(u'language_id', language_id) else: - language = self.parent.manager.import_wizard.languageDialog() - if not language: - log.exception(u'Importing books from %s - download name: "%s" '\ - 'failed' % (self.download_source, self.download_name)) - return False - language = BiblesResourcesDB.get_language(language) - language_id = language[u'id'] - # Store the language_id. - self.create_meta(u'language_id', language_id) + language_id = self.get_language() + if not language_id: + log.exception(u'Importing books from %s " '\ + 'failed' % self.filename) + return False for book in books: self.wizard.incrementProgressBar(unicode(translate( 'BiblesPlugin.HTTPBible', 'Importing %s...', diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 7cca6f4a0..aef00e61b 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -349,9 +349,7 @@ class BibleManager(object): book, language_id) else: book_ref = self.import_wizard.bookNameDialog(book) - log.debug(book_ref) book_temp = BiblesResourcesDB.get_book(book_ref) - log.debug(book_temp) if book_temp: book_id = book_temp[u'id'] else: diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index bc3624479..23c456dda 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -58,14 +58,11 @@ class OpenLP1Bible(BibleDB): except: return False #Create the bible language - language = self.parent.manager.import_wizard.languageDialog() - if not language: + language_id = self.get_language() + if not language_id: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) return False - language = BiblesResourcesDB.get_language(language) - language_id = language[u'id'] - self.create_meta(u'language_id', language_id) # Create all books. cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') books = cursor.fetchall() diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 6e4c4826f..714f021cc 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -62,14 +62,11 @@ class OpenSongBible(BibleDB): file = open(self.filename, u'r') opensong = objectify.parse(file) bible = opensong.getroot() - language = self.parent.manager.import_wizard.languageDialog() - if not language: + language_id = self.get_language() + if not language_id: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) return False - language = BiblesResourcesDB.get_language(language) - language_id = language[u'id'] - self.create_meta(u'language_id', language_id) for book in bible.b: if self.stop_import_flag: break diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index cd006bb78..4938e505a 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -107,14 +107,11 @@ class OSISBible(BibleDB): if detect_file: detect_file.close() # Set meta language_id - language = self.parent.manager.import_wizard.languageDialog() - if not language: + language_id = self.get_language() + if not language_id: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) return False - language = BiblesResourcesDB.get_language(language) - language_id = language[u'id'] - self.create_meta(u'language_id', language_id) try: osis = codecs.open(self.filename, u'r', details['encoding']) for file_record in osis: From 3d184f89a40a630a5403278a4aedbac9e6b9ebbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sun, 3 Apr 2011 20:44:08 +0200 Subject: [PATCH 015/124] moved languageDialog() into BIBLEDB.get_language() --- openlp/plugins/bibles/forms/bibleimportform.py | 7 +------ openlp/plugins/bibles/lib/csvbible.py | 2 ++ openlp/plugins/bibles/lib/db.py | 11 +++++++++-- 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index ea7156193..c406c4db3 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -40,7 +40,7 @@ from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.utils import AppLocation, string_is_unicode from openlp.plugins.bibles.lib.manager import BibleFormat from openlp.plugins.bibles.lib.db import BiblesResourcesDB -from openlp.plugins.bibles.forms import BookNameForm, LanguageForm +from openlp.plugins.bibles.forms import BookNameForm log = logging.getLogger(__name__) @@ -764,8 +764,3 @@ class BibleImportForm(OpenLPWizard): self.book_name = BookNameForm(self) if self.book_name.exec_(name): return unicode(self.book_name.requestComboBox.currentText()) - - def languageDialog(self): - self.language = LanguageForm(self) - if self.language.exec_(): - return unicode(self.language.requestComboBox.currentText()) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 389ee1aac..407c90d2f 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -78,6 +78,8 @@ class CSVBible(BibleDB): """ This class provides a specialisation for importing of CSV Bibles. """ + log.info(u'CSVBible loaded') + def __init__(self, parent, **kwargs): """ Loads a Bible from a set of CVS files. diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 1960e155b..3f50bed47 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -168,6 +168,7 @@ class BibleDB(QtCore.QObject, Manager): methods, but benefit from the database methods in here via inheritance, rather than depending on yet another object. """ + log.info(u'BibleDB loaded') def __init__(self, parent, **kwargs): """ @@ -491,13 +492,19 @@ class BibleDB(QtCore.QObject, Manager): def get_language(self): """ - Return the language of a bible. + If no language is given it calls a dialog window where the user could + choose the bible language. + Return the language id of a bible. ``book`` The language the bible is. """ log.debug(u'BibleDB.get_language()') - language = self.bible_plugin.manager.import_wizard.languageDialog() + from openlp.plugins.bibles.forms import LanguageForm + language = None + lang = LanguageForm(self.wizard) + if lang.exec_(): + language = unicode(lang.requestComboBox.currentText()) if not language: return False language = BiblesResourcesDB.get_language(language) From a9c87798ebf9bbc64cc6ce9611cb0000e7808469 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sun, 3 Apr 2011 22:09:18 +0200 Subject: [PATCH 016/124] moved get_book_ref_id_by_name() from BibleManager to BibleDB moved content from BookNameDialog() from bibleimport.py in BibleDB.get_book_ref_id_by_name(). --- .../plugins/bibles/forms/bibleimportform.py | 6 --- openlp/plugins/bibles/forms/languageform.py | 2 +- openlp/plugins/bibles/lib/csvbible.py | 2 +- openlp/plugins/bibles/lib/db.py | 39 ++++++++++++++ openlp/plugins/bibles/lib/http.py | 3 +- openlp/plugins/bibles/lib/manager.py | 54 +------------------ openlp/plugins/bibles/lib/openlp1.py | 3 +- openlp/plugins/bibles/lib/opensong.py | 2 +- openlp/plugins/bibles/lib/osis.py | 3 +- 9 files changed, 46 insertions(+), 68 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index c406c4db3..fd6690888 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -40,7 +40,6 @@ from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.utils import AppLocation, string_is_unicode from openlp.plugins.bibles.lib.manager import BibleFormat from openlp.plugins.bibles.lib.db import BiblesResourcesDB -from openlp.plugins.bibles.forms import BookNameForm log = logging.getLogger(__name__) @@ -759,8 +758,3 @@ class BibleImportForm(OpenLPWizard): 'BiblesPlugin.ImportWizardForm', 'Your Bible import failed.')) del self.manager.db_cache[importer.name] delete_database(self.plugin.settingsSection, importer.file) - - def bookNameDialog(self, name): - self.book_name = BookNameForm(self) - if self.book_name.exec_(name): - return unicode(self.book_name.requestComboBox.currentText()) diff --git a/openlp/plugins/bibles/forms/languageform.py b/openlp/plugins/bibles/forms/languageform.py index f074a9dc5..e96a005c2 100644 --- a/openlp/plugins/bibles/forms/languageform.py +++ b/openlp/plugins/bibles/forms/languageform.py @@ -25,7 +25,7 @@ ############################################################################### """ -Module implementing BookNameForm. +Module implementing LanguageForm. """ import logging diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 407c90d2f..f0abb9a1d 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -159,7 +159,7 @@ class CSVBible(BibleDB): self.wizard.incrementProgressBar(unicode( translate('BibleDB.Wizard', 'Importing books... %s')) % unicode(line[2], details['encoding'])) - book_ref_id = self.parent.manager.get_book_ref_id_by_name( + book_ref_id = self.get_book_ref_id_by_name( unicode(line[2], details['encoding']), language_id) if not book_ref_id: log.exception(u'Importing books from %s " '\ diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 3f50bed47..191d18d65 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -202,6 +202,8 @@ class BibleDB(QtCore.QObject, Manager): Manager.__init__(self, u'bibles/bibles', init_schema, self.file) if u'file' in kwargs: self.get_name() + if u'path' in kwargs: + self.path = kwargs[u'path'] self.wizard = None QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import) @@ -383,6 +385,43 @@ class BibleDB(QtCore.QObject, Manager): Book.book_reference_id.like(id)) return db_book + def get_book_ref_id_by_name(self, book, language_id=None): + log.debug(u'BibleManager.get_book_ref_id_by_name:("%s", "%s")', book, + language_id) + self.alternative_book_names_cache = AlternativeBookNamesDB(self.bible_plugin, + path=self.path) + if BiblesResourcesDB.get_book(book): + book_temp = BiblesResourcesDB.get_book(book) + book_id = book_temp[u'id'] + elif BiblesResourcesDB.get_alternative_book_name(book, language_id): + book_id = BiblesResourcesDB.get_alternative_book_name(book, + language_id) + elif self.alternative_book_names_cache.get_book_reference_id(book, + language_id): + book_id = self.alternative_book_names_cache.get_book_reference_id( + book, language_id) + else: + from openlp.plugins.bibles.forms import BookNameForm + book_ref = None + book_name = BookNameForm(self.wizard) + if book_name.exec_(book): + book_ref = unicode(book_name.requestComboBox.currentText()) + if not book_ref: + return None + else: + book_temp = BiblesResourcesDB.get_book(book_ref) + if book_temp: + book_id = book_temp[u'id'] + else: + return None + if book_id: + self.alternative_book_names_cache.create_alternative_book_name( + book, book_id, language_id) + if book_id: + return book_id + else: + return None + def get_verses(self, reference_list): """ This is probably the most used function. It retrieves the list of diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 75f2c37fc..85f7405a6 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -424,8 +424,7 @@ class HTTPBible(BibleDB): self.wizard.incrementProgressBar(unicode(translate( 'BiblesPlugin.HTTPBible', 'Importing %s...', 'Importing ...')) % book) - book_ref_id = self.parent.manager.get_book_ref_id_by_name(book, - language_id) + book_ref_id = self.get_book_ref_id_by_name(book, language_id) if not book_ref_id: log.exception(u'Importing books from %s - download name: "%s" '\ 'failed' % (self.download_source, self.download_name)) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index aef00e61b..e1e32cc80 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -33,8 +33,7 @@ from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, delete_file from openlp.plugins.bibles.lib import parse_reference -from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, \ - AlternativeBookNamesDB, BiblesResourcesDB +from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta from csvbible import CSVBible from http import HTTPBible from opensong import OpenSongBible @@ -170,19 +169,6 @@ class BibleManager(object): self.db_cache[name] = web_bible log.debug(u'Bibles reloaded') - #TODO: Delete unused code - ''' - def reload_alternative_book_names(self): - """ - Reloads the alternative book names from the local alternative book names - database on disk. - """ - log.debug(u'Reload AlternativeBookNames') - self.alternative_book_names_cache = AlternativeBookNamesDB(self.parent, - path=self.path) - log.debug(u'AlternativeBookNames reloaded') - ''' - def set_process_dialog(self, wizard): """ Sets the reference to the dialog with the progress bar on it. @@ -324,44 +310,6 @@ class BibleManager(object): }) return None - def get_book_ref(self, book, language_id=None): - log.debug(u'BibleManager.get_book_ref("%s", "%s")', book, language_id) - book_id = self.get_book_ref_id_by_name(book, language_id) - book_temp = BiblesResourcesDB.get_book_by_id(book_id) - log.debug(u'BibleManager.get_book_ref("Return: %s")', - book_temp[u'name']) - return book_temp[u'name'] - - def get_book_ref_id_by_name(self, book, language_id=None): - log.debug(u'BibleManager.get_book_ref_id_by_name:("%s", "%s")', book, - language_id) - self.alternative_book_names_cache = AlternativeBookNamesDB(self.parent, - path=self.path) - if BiblesResourcesDB.get_book(book): - book_temp = BiblesResourcesDB.get_book(book) - book_id = book_temp[u'id'] - elif BiblesResourcesDB.get_alternative_book_name(book, language_id): - book_id = BiblesResourcesDB.get_alternative_book_name(book, - language_id) - elif self.alternative_book_names_cache.get_book_reference_id(book, - language_id): - book_id = self.alternative_book_names_cache.get_book_reference_id( - book, language_id) - else: - book_ref = self.import_wizard.bookNameDialog(book) - book_temp = BiblesResourcesDB.get_book(book_ref) - if book_temp: - book_id = book_temp[u'id'] - else: - return None - if book_id: - self.alternative_book_names_cache.create_alternative_book_name( - book, book_id, language_id) - if book_id: - return book_id - else: - return None - def verse_search(self, bible, second_bible, text): """ Does a verse search for the given bible and text. diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 23c456dda..0de89b4a7 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -75,8 +75,7 @@ class OpenLP1Bible(BibleDB): testament_id = int(book[1]) name = unicode(book[2], u'cp1252') abbreviation = unicode(book[3], u'cp1252') - book_ref_id = self.parent.manager.get_book_ref_id_by_name(name, - language_id) + book_ref_id = self.get_book_ref_id_by_name(name, language_id) if not book_ref_id: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 714f021cc..37428cc7a 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -70,7 +70,7 @@ class OpenSongBible(BibleDB): for book in bible.b: if self.stop_import_flag: break - book_ref_id = self.parent.manager.get_book_ref_id_by_name( + book_ref_id = self.get_book_ref_id_by_name( unicode(book.attrib[u'n']), language_id) if not book_ref_id: log.exception(u'Importing books from %s " '\ diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 4938e505a..ba6cf5d63 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -129,8 +129,7 @@ class OSISBible(BibleDB): #TODO: Delete unused code #if book == u'Matt' or book == u'Jdt': # testament += 1 - book_ref_id = self.parent.manager.\ - get_book_ref_id_by_name( + book_ref_id = self.get_book_ref_id_by_name( unicode(self.books[book][0]), language_id) if not book_ref_id: log.exception(u'Importing books from %s " '\ From 7cdf2bc320f00d670c8db5f5818dd8555e66ca23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Mon, 11 Apr 2011 18:21:54 +0200 Subject: [PATCH 017/124] small cleanups --- openlp/plugins/bibles/lib/csvbible.py | 3 ++- openlp/plugins/bibles/lib/db.py | 6 +++--- openlp/plugins/bibles/lib/http.py | 1 - openlp/plugins/bibles/lib/manager.py | 2 -- openlp/plugins/bibles/lib/openlp1.py | 1 - openlp/plugins/bibles/lib/opensong.py | 3 +-- openlp/plugins/bibles/lib/osis.py | 1 - 7 files changed, 6 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index f0abb9a1d..71af33ca7 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -88,7 +88,6 @@ class CSVBible(BibleDB): """ log.info(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) - self.parent = parent #TODO: Delete unused code ''' try: @@ -98,6 +97,8 @@ class CSVBible(BibleDB): ''' self.booksfile = kwargs[u'booksfile'] self.versesfile = kwargs[u'versefile'] + + #TODO: Delete unused code ''' def setup_testaments(self): """ diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 191d18d65..e520aec3f 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -386,10 +386,10 @@ class BibleDB(QtCore.QObject, Manager): return db_book def get_book_ref_id_by_name(self, book, language_id=None): - log.debug(u'BibleManager.get_book_ref_id_by_name:("%s", "%s")', book, + log.debug(u'BibleDB.get_book_ref_id_by_name:("%s", "%s")', book, language_id) - self.alternative_book_names_cache = AlternativeBookNamesDB(self.bible_plugin, - path=self.path) + self.alternative_book_names_cache = AlternativeBookNamesDB( + self.bible_plugin, path=self.path) if BiblesResourcesDB.get_book(book): book_temp = BiblesResourcesDB.get_book(book) book_id = book_temp[u'id'] diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 85f7405a6..bd59d0cc9 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -359,7 +359,6 @@ class HTTPBible(BibleDB): Init confirms the bible exists and stores the database path. """ BibleDB.__init__(self, parent, **kwargs) - self.parent = parent self.download_source = kwargs[u'download_source'] self.download_name = kwargs[u'download_name'] # TODO: Clean up proxy stuff. We probably want one global proxy per diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index e1e32cc80..dd1669b23 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -130,8 +130,6 @@ class BibleManager(object): self.suffix = u'.sqlite' self.import_wizard = None self.reload_bibles() - #TODO: Delete unused code - #self.reload_alternative_book_names() self.media = None def reload_bibles(self): diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 0de89b4a7..0ef5f95a9 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -43,7 +43,6 @@ class OpenLP1Bible(BibleDB): """ log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) - self.parent = parent self.filename = kwargs[u'filename'] def do_import(self): diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 37428cc7a..875977bbd 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -1,4 +1,4 @@ -# -*- coding: utf-8 -*- +song# -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 ############################################################################### @@ -43,7 +43,6 @@ class OpenSongBible(BibleDB): """ log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) - self.parent = parent self.filename = kwargs['filename'] def do_import(self): diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index ba6cf5d63..9b65bb8d8 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -46,7 +46,6 @@ class OSISBible(BibleDB): def __init__(self, parent, **kwargs): log.debug(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) - self.parent = parent self.filename = kwargs[u'filename'] fbibles = None self.books = {} From 0ad2d851715448af24ad0c2454b36c7bea9c87e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Mon, 11 Apr 2011 22:57:00 +0200 Subject: [PATCH 018/124] small fix --- openlp/plugins/bibles/lib/opensong.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 875977bbd..cb971fa99 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -1,4 +1,4 @@ -song# -*- coding: utf-8 -*- +# -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 ############################################################################### From 6c047fc83ef2bd95d52240dca7215c55e15a6ade Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Tue, 12 Apr 2011 13:33:29 +0200 Subject: [PATCH 019/124] changed content of book drop list in advanced search. If a second bible is choosen the combobox only contains books which both bibles (first and second) contains. changed autocomplete in quick search. If a second bible is choosen it now suggest only books which both bibles contains. --- openlp/plugins/bibles/lib/manager.py | 1 + openlp/plugins/bibles/lib/mediaitem.py | 38 ++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index dd1669b23..75db89af2 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -214,6 +214,7 @@ class BibleManager(object): books.append( { u'name': book.name, + u'book_reference_id': book.book_reference_id, u'chapters': self.db_cache[bible].get_chapter_count(book.book_reference_id) }) return books diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 9f43b99cc..279ecc1cf 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -202,8 +202,14 @@ class BibleMediaItem(MediaManagerItem): # Add the search tab widget to the page layout. self.pageLayout.addWidget(self.searchTabWidget) # Combo Boxes + QtCore.QObject.connect(self.quickVersionComboBox, + QtCore.SIGNAL(u'activated(int)'), self.onQuickVersionComboBox) + QtCore.QObject.connect(self.quickSecondComboBox, + QtCore.SIGNAL(u'activated(int)'), self.onQuickSecondComboBox) QtCore.QObject.connect(self.advancedVersionComboBox, QtCore.SIGNAL(u'activated(int)'), self.onAdvancedVersionComboBox) + QtCore.QObject.connect(self.advancedSecondComboBox, + QtCore.SIGNAL(u'activated(int)'), self.onAdvancedSecondComboBox) QtCore.QObject.connect(self.advancedBookComboBox, QtCore.SIGNAL(u'activated(int)'), self.onAdvancedBookComboBox) QtCore.QObject.connect(self.advancedFromChapter, @@ -346,6 +352,16 @@ class BibleMediaItem(MediaManagerItem): """ log.debug(u'initialiseAdvancedBible %s', bible) book_data = self.parent.manager.get_books(bible) + secondbible = unicode(self.advancedSecondComboBox.currentText()) + if secondbible != u'': + secondbook_data = self.parent.manager.get_books(secondbible) + book_data_temp = [] + for book in book_data: + for secondbook in secondbook_data: + if book['book_reference_id'] == \ + secondbook['book_reference_id']: + book_data_temp.append(book) + book_data = book_data_temp self.advancedBookComboBox.clear() first = True for book in book_data: @@ -395,16 +411,38 @@ class BibleMediaItem(MediaManagerItem): bible = unicode(self.quickVersionComboBox.currentText()) if bible: book_data = bibles[bible].get_books() + secondbible = unicode(self.quickSecondComboBox.currentText()) + if secondbible != u'': + secondbook_data = bibles[secondbible].get_books() + book_data_temp = [] + for book in book_data: + for secondbook in secondbook_data: + if book.book_reference_id == \ + secondbook.book_reference_id: + book_data_temp.append(book) + book_data = book_data_temp books = [book.name for book in book_data] books.sort() add_widget_completer(books, self.quickSearchEdit) + def onQuickVersionComboBox(self): + self.updateAutoCompleter() + + def onQuickSecondComboBox(self): + self.updateAutoCompleter() + def onAdvancedVersionComboBox(self): QtCore.QSettings().setValue(self.settingsSection + u'/advanced bible', QtCore.QVariant(self.advancedVersionComboBox.currentText())) self.initialiseAdvancedBible( unicode(self.advancedVersionComboBox.currentText())) + def onAdvancedSecondComboBox(self): + QtCore.QSettings().setValue(self.settingsSection + u'/advanced bible', + QtCore.QVariant(self.advancedVersionComboBox.currentText())) + self.initialiseAdvancedBible( + unicode(self.advancedVersionComboBox.currentText())) + def onAdvancedBookComboBox(self): item = int(self.advancedBookComboBox.currentIndex()) self.initialiseChapterVerse( From df0d9244ebe1e6dfd44abe4354a364fde2af9797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 14 Apr 2011 10:40:30 +0200 Subject: [PATCH 020/124] Changed layout of AlternativeBookNamesDB from sqlalchemy to sqlite3 --- openlp/plugins/bibles/lib/db.py | 155 +++++++++++++++----------------- 1 file changed, 70 insertions(+), 85 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index e520aec3f..a0780e7b8 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -70,13 +70,6 @@ class Verse(BaseModel): """ pass -class AlternativeBookNames(BaseModel): - """ - Alternative Book Names model - """ - pass - - def init_schema(url): """ Setup a bible database connection and initialise the database schema. @@ -136,30 +129,6 @@ def init_schema(url): metadata.create_all(checkfirst=True) return session -def init_schema_alternative_book_names(url): - """ - Setup a alternative book names database connection and initialise the - database schema. - - ``url`` - The database to setup. - """ - session, metadata = init_db(url) - - alternative_book_names_table = Table(u'alternative_book_names', metadata, - Column(u'id', types.Integer, primary_key=True), - Column(u'book_reference_id', types.Integer), - Column(u'language_id', types.Integer), - Column(u'name', types.Unicode(50), index=True), - ) - - try: - class_mapper(AlternativeBookNames) - except UnmappedClassError: - mapper(AlternativeBookNames, alternative_book_names_table) - - metadata.create_all(checkfirst=True) - return session class BibleDB(QtCore.QObject, Manager): """ @@ -388,17 +357,15 @@ class BibleDB(QtCore.QObject, Manager): def get_book_ref_id_by_name(self, book, language_id=None): log.debug(u'BibleDB.get_book_ref_id_by_name:("%s", "%s")', book, language_id) - self.alternative_book_names_cache = AlternativeBookNamesDB( - self.bible_plugin, path=self.path) if BiblesResourcesDB.get_book(book): book_temp = BiblesResourcesDB.get_book(book) book_id = book_temp[u'id'] elif BiblesResourcesDB.get_alternative_book_name(book, language_id): book_id = BiblesResourcesDB.get_alternative_book_name(book, language_id) - elif self.alternative_book_names_cache.get_book_reference_id(book, + elif AlternativeBookNamesDB.get_book_reference_id(book, language_id): - book_id = self.alternative_book_names_cache.get_book_reference_id( + book_id = AlternativeBookNamesDB.get_book_reference_id( book, language_id) else: from openlp.plugins.bibles.forms import BookNameForm @@ -415,7 +382,7 @@ class BibleDB(QtCore.QObject, Manager): else: return None if book_id: - self.alternative_book_names_cache.create_alternative_book_name( + AlternativeBookNamesDB.create_alternative_book_name( book, book_id, language_id) if book_id: return book_id @@ -822,6 +789,12 @@ class BiblesResourcesDB(QtCore.QObject, Manager): def get_alternative_book_name(name, language_id=None): """ Return a book_reference_id if the name matches. + + ``name`` + The name to search the id. + + ``language_id`` + The language_id for which language should be searched """ log.debug(u'BiblesResourcesDB.get_alternative_book_name("%s", "%s")', name, language_id) @@ -898,73 +871,85 @@ class BiblesResourcesDB(QtCore.QObject, Manager): }) return testament_list + class AlternativeBookNamesDB(QtCore.QObject, Manager): """ This class represents a database-bound alternative book names system. """ + cursor = None + conn = None - def __init__(self, parent, **kwargs): + @staticmethod + def get_cursor(): """ - The constructor loads up the database and creates and initialises the - tables if the database doesn't exist. - - **Required keyword arguments:** - - ``path`` - The path to the bible database file. - - ``name`` - The name of the database. This is also used as the file name for - SQLite databases. + Return the cursor object. Instantiate one if it doesn't exist yet. + If necessary loads up the database and creates the tables if the + database doesn't exist. """ - log.info(u'AlternativeBookNamesDB loaded') - QtCore.QObject.__init__(self) - self.bible_plugin = parent - if u'path' not in kwargs: - raise KeyError(u'Missing keyword argument "path".') - self.stop_import_flag = False - self.name = u'alternative_book_names.sqlite' - if not isinstance(self.name, unicode): - self.name = unicode(self.name, u'utf-8') - self.file = self.name - Manager.__init__(self, u'bibles/resources', - init_schema_alternative_book_names, self.file) - self.wizard = None - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import) + if AlternativeBookNamesDB.cursor is None: + filepath = os.path.join( + AppLocation.get_directory(AppLocation.DataDir), u'bibles', + u'resources', u'alternative_book_names.sqlite') + log.debug(u'Filepath: %s' % filepath) + if not os.path.exists(filepath): + #create new DB, create table alternative_book_names + AlternativeBookNamesDB.conn = sqlite3.connect(filepath) + AlternativeBookNamesDB.conn.execute(u'CREATE TABLE ' + u'alternative_book_names(id INTEGER NOT NULL, ' + u'book_reference_id INTEGER, language_id INTEGER, name ' + u'VARCHAR(50), PRIMARY KEY (id))') + else: + #use existing DB + AlternativeBookNamesDB.conn = sqlite3.connect(filepath) + AlternativeBookNamesDB.cursor = AlternativeBookNamesDB.conn.cursor() + return AlternativeBookNamesDB.cursor - def stop_import(self): + @staticmethod + def run_sql(query, parameters=(), commit=None): """ - Stops the import of the Bible. - """ - log.debug(u'Stopping import') - self.stop_import_flag = True + Run an SQL query on the database, returning the results. - def get_book_reference_id(self, name, language=None): + ``query`` + The actual SQL query to run. + + ``parameters`` + Any variable parameters to add to the query + + ``commit`` + If a commit statement is necessary this should be True. """ - Return the book_reference_id of a book by name. + cursor = AlternativeBookNamesDB.get_cursor() + cursor.execute(query, parameters) + if commit: + AlternativeBookNamesDB.conn.commit() + return cursor.fetchall() + + @staticmethod + def get_book_reference_id(name, language_id=None): + """ + Return a book_reference_id if the name matches. ``name`` The name to search the id. - ``language`` - The language for which should be searched + ``language_id`` + The language_id for which language should be searched """ - log.debug(u'AlternativeBookNamesDB.get_book_reference_id("%s")', name) - if language: - id = self.session.query(AlternativeBookNames.book_reference_id)\ - .filter(AlternativeBookNames.name.like(name))\ - .filter(AlternativeBookNames.language_id.like(language)).first() + log.debug(u'AlternativeBookNamesDB.get_book_reference_id("%s", "%s")', + name, language_id) + if language_id: + id = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id FROM ' + u'alternative_book_names WHERE name = ? AND language_id = ?', (name, language_id)) else: - id = self.get_object_filtered(AlternativeBookNames.book_reference_id, - AlternativeBookNames.name.like(name)) + id = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id FROM ' + u'alternative_book_names WHERE name = ?', name) if not id: return None else: - return id[0] + return id[0][0] - def create_alternative_book_name(self, name, book_reference_id, - language_id): + @staticmethod + def create_alternative_book_name(name, book_reference_id, language_id): """ Add an alternative book name to the database. @@ -979,7 +964,7 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager): """ log.debug(u'AlternativeBookNamesDB.create_alternative_book_name("%s", ' '"%s", "%s"', name, book_reference_id, language_id) - alternative_book_name = AlternativeBookNames.populate(name=name, - book_reference_id=book_reference_id, language_id=language_id) - self.save_object(alternative_book_name) + alternative_book_name = AlternativeBookNamesDB.run_sql(u'INSERT INTO ' + u'alternative_book_names(book_reference_id, language_id, name) ' + u'VALUES (?, ?, ?)', (book_reference_id, language_id, name), True) return alternative_book_name From fbace696541325e810a11b09e9ed225e3c32b279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 14 Apr 2011 11:08:58 +0200 Subject: [PATCH 021/124] remove bibleimportrequestdialog.ui --- resources/forms/bibleimportrequestdialog.ui | 137 -------------------- 1 file changed, 137 deletions(-) delete mode 100644 resources/forms/bibleimportrequestdialog.ui diff --git a/resources/forms/bibleimportrequestdialog.ui b/resources/forms/bibleimportrequestdialog.ui deleted file mode 100644 index 5795300f9..000000000 --- a/resources/forms/bibleimportrequestdialog.ui +++ /dev/null @@ -1,137 +0,0 @@ - - - BibleImportRequest - - - - 0 - 0 - 400 - 175 - - - - - 0 - 0 - - - - Dialog - - - - - 10 - 15 - 381 - 151 - - - - - - - - Arial - 12 - 75 - true - - - - Choose Book: - - - - - - - The following books cannot be clearly attributed. -Please choose the book it is. - - - - - - - - - Book: - - - - - - - - 0 - 0 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - - - - - BibleImportRequestButtonBox - accepted() - BibleImportRequest - accept() - - - 248 - 254 - - - 157 - 274 - - - - - BibleImportRequestButtonBox - rejected() - BibleImportRequest - reject() - - - 316 - 260 - - - 286 - 274 - - - - - From 77f43e32b993708c41cc251ac797ae627451536d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 14 Apr 2011 22:18:23 +0200 Subject: [PATCH 022/124] small cleanups --- openlp/plugins/bibles/lib/db.py | 9 +++++---- openlp/plugins/bibles/lib/http.py | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index a0780e7b8..d3c93cdfa 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -938,11 +938,12 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager): log.debug(u'AlternativeBookNamesDB.get_book_reference_id("%s", "%s")', name, language_id) if language_id: - id = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id FROM ' - u'alternative_book_names WHERE name = ? AND language_id = ?', (name, language_id)) + id = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id FROM' + u' alternative_book_names WHERE name = ? AND language_id = ?', + (name, language_id)) else: - id = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id FROM ' - u'alternative_book_names WHERE name = ?', name) + id = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id FROM' + u' alternative_book_names WHERE name = ?', name) if not id: return None else: diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index bd59d0cc9..a9f31a3ea 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -42,7 +42,7 @@ from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, get_web_page from openlp.plugins.bibles.lib import SearchResults from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB, \ - Book, BibleMeta + Book log = logging.getLogger(__name__) From e8202924f7650062be5f4863ec97b3bd101694fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 14 Apr 2011 22:33:02 +0200 Subject: [PATCH 023/124] delete unused testament stuff --- .../plugins/bibles/forms/bibleimportform.py | 60 +------------------ openlp/plugins/bibles/lib/csvbible.py | 45 +------------- openlp/plugins/bibles/lib/db.py | 36 +---------- openlp/plugins/bibles/lib/osis.py | 5 -- 4 files changed, 3 insertions(+), 143 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index a18e3a4e1..ebf8a6c30 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -124,10 +124,6 @@ class BibleImportForm(OpenLPWizard): QtCore.QObject.connect(self.osisBrowseButton, QtCore.SIGNAL(u'clicked()'), self.onOsisBrowseButtonClicked) - #TODO: Delete unused code - #QtCore.QObject.connect(self.csvTestamentsButton, - # QtCore.SIGNAL(u'clicked()'), - # self.onCsvTestamentsBrowseButtonClicked) QtCore.QObject.connect(self.csvBooksButton, QtCore.SIGNAL(u'clicked()'), self.onCsvBooksBrowseButtonClicked) @@ -188,22 +184,6 @@ class BibleImportForm(OpenLPWizard): self.csvLayout = QtGui.QFormLayout(self.csvWidget) self.csvLayout.setMargin(0) self.csvLayout.setObjectName(u'CsvLayout') - #TODO: Delete unused code - ''' - self.csvTestamentsLabel = QtGui.QLabel(self.csvWidget) - self.csvTestamentsLabel.setObjectName(u'CsvTestamentsLabel') - self.csvTestamentsLayout = QtGui.QHBoxLayout() - self.csvTestamentsLayout.setObjectName(u'CsvTestamentsLayout') - self.csvTestamentsEdit = QtGui.QLineEdit(self.csvWidget) - self.csvTestamentsEdit.setObjectName(u'CsvTestamentsEdit') - self.csvTestamentsLayout.addWidget(self.csvTestamentsEdit) - - self.csvTestamentsButton = QtGui.QToolButton(self.csvWidget) - self.csvTestamentsButton.setIcon(self.openIcon) - self.csvTestamentsButton.setObjectName(u'CsvTestamentsButton') - self.csvTestamentsLayout.addWidget(self.csvTestamentsButton) - self.csvLayout.addRow(self.csvTestamentsLabel, self.csvTestamentsLayout) - ''' self.csvBooksLabel = QtGui.QLabel(self.csvWidget) self.csvBooksLabel.setObjectName(u'CsvBooksLabel') self.csvBooksLayout = QtGui.QHBoxLayout() @@ -388,9 +368,6 @@ class BibleImportForm(OpenLPWizard): translate('BiblesPlugin.ImportWizardForm', 'Bible file:')) self.osisFileLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Bible file:')) - #TODO: Delete unused code - #self.csvTestamentsLabel.setText( - # translate('BiblesPlugin.ImportWizardForm', 'Testaments file:')) self.csvBooksLabel.setText( translate('BiblesPlugin.ImportWizardForm', 'Books file:')) self.csvVersesLabel.setText( @@ -441,8 +418,6 @@ class BibleImportForm(OpenLPWizard): # Align all QFormLayouts towards each other. labelWidth = max(self.formatLabel.minimumSizeHint().width(), self.osisFileLabel.minimumSizeHint().width(), - #TODO: Delete unused code - #self.csvTestamentsLabel.minimumSizeHint().width(), self.csvBooksLabel.minimumSizeHint().width(), self.csvVersesLabel.minimumSizeHint().width(), self.openSongFileLabel.minimumSizeHint().width(), @@ -464,17 +439,6 @@ class BibleImportForm(OpenLPWizard): self.osisFileEdit.setFocus() return False elif self.field(u'source_format').toInt()[0] == BibleFormat.CSV: - #TODO: Delete unused code - ''' - if not self.field(u'csv_testamentsfile').toString(): - answer = critical_error_message_box(UiStrings.NFSs, - translate('BiblesPlugin.ImportWizardForm', - 'You have not specified a testaments file. Do you ' - 'want to proceed with the import?'), question=True) - if answer == QtGui.QMessageBox.No: - self.csvTestamentsEdit.setFocus() - return False - ''' if not self.field(u'csv_booksfile').toString(): critical_error_message_box(UiStrings.NFSs, translate('BiblesPlugin.ImportWizardForm', @@ -551,16 +515,7 @@ class BibleImportForm(OpenLPWizard): """ self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.OSIS, self.osisFileEdit) - #TODO: Delete unused code - ''' - def onCsvTestamentsBrowseButtonClicked(self): - """ - Show the file open dialog for the testaments CSV file. - """ - self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.CSV, - self.csvTestamentsEdit, u'%s (*.csv)' - % translate('BiblesPlugin.ImportWizardForm', 'CSV File')) - ''' + def onCsvBooksBrowseButtonClicked(self): """ Show the file open dialog for the books CSV file. @@ -599,9 +554,6 @@ class BibleImportForm(OpenLPWizard): """ self.selectPage.registerField(u'source_format', self.formatComboBox) self.selectPage.registerField(u'osis_location', self.osisFileEdit) - #TODO: Delete unused code - #self.selectPage.registerField( - # u'csv_testamentsfile', self.csvTestamentsEdit) self.selectPage.registerField(u'csv_booksfile', self.csvBooksEdit) self.selectPage.registerField(u'csv_versefile', self.csvVersesEdit) self.selectPage.registerField(u'opensong_file', self.openSongFileEdit) @@ -630,8 +582,6 @@ class BibleImportForm(OpenLPWizard): self.cancelButton.setVisible(True) self.setField(u'source_format', QtCore.QVariant(0)) self.setField(u'osis_location', QtCore.QVariant('')) - #TODO: Delete unused code - #self.setField(u'csv_testamentsfile', QtCore.QVariant('')) self.setField(u'csv_booksfile', QtCore.QVariant('')) self.setField(u'csv_versefile', QtCore.QVariant('')) self.setField(u'opensong_file', QtCore.QVariant('')) @@ -712,14 +662,6 @@ class BibleImportForm(OpenLPWizard): ) elif bible_type == BibleFormat.CSV: # Import a CSV bible. - #TODO: Delete unused code - ''' - importer = self.manager.import_bible(BibleFormat.CSV, - name=license_version, testamentsfile=unicode( - self.field(u'csv_testamentsfile').toString()), - booksfile=unicode(self.field(u'csv_booksfile').toString()), - versefile=unicode(self.field(u'csv_versefile').toString()) - ''' importer = self.manager.import_bible(BibleFormat.CSV, name=license_version, booksfile=unicode(self.field(u'csv_booksfile').toString()), diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 71af33ca7..be45bfeb9 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -88,52 +88,9 @@ class CSVBible(BibleDB): """ log.info(self.__class__.__name__) BibleDB.__init__(self, parent, **kwargs) - #TODO: Delete unused code - ''' - try: - self.testamentsfile = kwargs[u'testamentsfile'] - except KeyError: - self.testamentsfile = None - ''' self.booksfile = kwargs[u'booksfile'] self.versesfile = kwargs[u'versefile'] - - #TODO: Delete unused code - ''' - def setup_testaments(self): - """ - Overrides parent method so we can handle importing a testament file. - """ - if self.testamentsfile: - self.wizard.progressBar.setMinimum(0) - self.wizard.progressBar.setMaximum(2) - self.wizard.progressBar.setValue(0) - testaments_file = None - try: - details = get_file_encoding(self.testamentsfile) - testaments_file = open(self.testamentsfile, 'rb') - testaments_reader = csv.reader(testaments_file, delimiter=',', - quotechar='"') - for line in testaments_reader: - if self.stop_import_flag: - break - self.wizard.incrementProgressBar(unicode( - translate('BibleDB.Wizard', - 'Importing testaments... %s')) % - unicode(line[1], details['encoding']), 0) - self.save_object(Testament.populate( - name=unicode(line[1], details['encoding']))) - Receiver.send_message(u'openlp_process_events') - except (IOError, IndexError): - log.exception(u'Loading testaments from file failed') - finally: - if testaments_file: - testaments_file.close() - self.wizard.incrementProgressBar(unicode(translate( - 'BibleDB.Wizard', 'Importing testaments... done.')), 2) - else: - BibleDB.setup_testaments(self) - ''' + def do_import(self): """ Import the bible books and verses. diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index d3c93cdfa..4afc5bccf 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -48,14 +48,6 @@ class BibleMeta(BaseModel): """ pass -#TODO: Delete unused code -''' -class Testament(BaseModel): - """ - Bible Testaments - """ - pass -''' class Book(BaseModel): """ @@ -83,13 +75,7 @@ def init_schema(url): Column(u'key', types.Unicode(255), primary_key=True, index=True), Column(u'value', types.Unicode(255)), ) - #TODO: Delete unused code - ''' - testament_table = Table(u'testament', metadata, - Column(u'id', types.Integer, primary_key=True), - Column(u'name', types.Unicode(50)), - ) - ''' + book_table = Table(u'book', metadata, Column(u'id', types.Integer, primary_key=True), Column(u'book_reference_id', types.Integer), @@ -109,13 +95,6 @@ def init_schema(url): class_mapper(BibleMeta) except UnmappedClassError: mapper(BibleMeta, meta_table) - #TODO: Delete unused code - ''' - try: - class_mapper(Testament) - except UnmappedClassError: - mapper(Testament, testament_table) - ''' try: class_mapper(Book) except UnmappedClassError: @@ -220,21 +199,8 @@ class BibleDB(QtCore.QObject, Manager): """ self.wizard = wizard self.create_meta(u'dbversion', u'2') - #TODO: Delete unused code - #self.setup_testaments() return self.name - #TODO: Delete unused code - ''' - def setup_testaments(self): - """ - Initialise the testaments section of a bible with suitable defaults. - """ - self.save_object(Testament.populate(name=u'Old Testament')) - self.save_object(Testament.populate(name=u'New Testament')) - self.save_object(Testament.populate(name=u'Apocrypha')) - ''' - def create_book(self, name, bk_ref_id, testament=1): """ Add a book to the database. diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 9b65bb8d8..47f512961 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -91,8 +91,6 @@ class OSISBible(BibleDB): osis = None success = True last_chapter = 0 - #TODO: Delete unused code - #testament = 1 match_count = 0 self.wizard.incrementProgressBar(translate('BiblesPlugin.OsisImport', 'Detecting encoding (this may take a few minutes)...')) @@ -125,9 +123,6 @@ class OSISBible(BibleDB): verse_text = match.group(4) if not db_book or db_book.name != self.books[book][0]: log.debug(u'New book: "%s"' % self.books[book][0]) - #TODO: Delete unused code - #if book == u'Matt' or book == u'Jdt': - # testament += 1 book_ref_id = self.get_book_ref_id_by_name( unicode(self.books[book][0]), language_id) if not book_ref_id: From 23c8ea867948f24b1e752aae0dbbc853d4186338 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sat, 16 Apr 2011 13:52:20 +0200 Subject: [PATCH 024/124] small cleanups --- openlp/plugins/bibles/lib/csvbible.py | 4 ++-- openlp/plugins/bibles/lib/db.py | 7 ++++--- openlp/plugins/bibles/lib/http.py | 4 ++-- openlp/plugins/bibles/lib/manager.py | 5 +++-- openlp/plugins/bibles/lib/openlp1.py | 4 ++-- openlp/plugins/bibles/lib/opensong.py | 4 ++-- openlp/plugins/bibles/lib/osis.py | 4 ++-- 7 files changed, 17 insertions(+), 15 deletions(-) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index be45bfeb9..80216a73e 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -101,7 +101,7 @@ class CSVBible(BibleDB): success = True language_id = self.get_language() if not language_id: - log.exception(u'Importing books from %s " '\ + log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) return False books_file = None @@ -120,7 +120,7 @@ class CSVBible(BibleDB): book_ref_id = self.get_book_ref_id_by_name( unicode(line[2], details['encoding']), language_id) if not book_ref_id: - log.exception(u'Importing books from %s " '\ + log.exception(u'Importing books from "%s" '\ 'failed' % self.booksfile) return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 4afc5bccf..617832d33 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -618,7 +618,8 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``chapter`` The chapter number. """ - log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_id, chapter) + log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_id, + chapter) if not isinstance(chapter, int): chapter = int(chapter) chapters = BiblesResourcesDB.run_sql(u'SELECT id, book_reference_id, ' @@ -770,8 +771,8 @@ class BiblesResourcesDB(QtCore.QObject, Manager): u'= ? ORDER BY id', (name, language_id)) else: id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' - u'FROM alternative_book_names WHERE name = ? ORDER BY id', ( - name, )) + u'FROM alternative_book_names WHERE name = ? ORDER BY id', + (name, )) if id: return int(id[0][0]) else: diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index a9f31a3ea..9795b0120 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -147,8 +147,8 @@ class BGExtract(object): return None page_source = page.read() page_source = unicode(page_source, 'utf8') - page_source_temp = re.search(u'.*?
', \ - page_source, re.DOTALL) + page_source_temp = re.search(u'.*?
', \ + page_source, re.DOTALL) if page_source_temp: soup = page_source_temp.group(0) else: diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index dd1669b23..cab665179 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -214,7 +214,8 @@ class BibleManager(object): books.append( { u'name': book.name, - u'chapters': self.db_cache[bible].get_chapter_count(book.book_reference_id) + u'chapters': self.db_cache[bible].get_chapter_count( + book.book_reference_id) }) return books @@ -222,7 +223,7 @@ class BibleManager(object): """ Returns the number of Chapters for a given book. """ - log.debug(u'BibleManager.get_book_chapter_count ("%s", "%s")', bible, + log.debug(u'BibleManager.get_book_chapter_count ("%s", "%s")', bible, book) return self.db_cache[bible].get_chapter_count(book) diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 0ef5f95a9..0ed22797e 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -59,7 +59,7 @@ class OpenLP1Bible(BibleDB): #Create the bible language language_id = self.get_language() if not language_id: - log.exception(u'Importing books from %s " '\ + log.exception(u'Importing books from "%s " '\ 'failed' % self.filename) return False # Create all books. @@ -76,7 +76,7 @@ class OpenLP1Bible(BibleDB): abbreviation = unicode(book[3], u'cp1252') book_ref_id = self.get_book_ref_id_by_name(name, language_id) if not book_ref_id: - log.exception(u'Importing books from %s " '\ + log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index cb971fa99..fd79cd440 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -63,7 +63,7 @@ class OpenSongBible(BibleDB): bible = opensong.getroot() language_id = self.get_language() if not language_id: - log.exception(u'Importing books from %s " '\ + log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) return False for book in bible.b: @@ -72,7 +72,7 @@ class OpenSongBible(BibleDB): book_ref_id = self.get_book_ref_id_by_name( unicode(book.attrib[u'n']), language_id) if not book_ref_id: - log.exception(u'Importing books from %s " '\ + log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) return False book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 47f512961..e3dea40ce 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -106,7 +106,7 @@ class OSISBible(BibleDB): # Set meta language_id language_id = self.get_language() if not language_id: - log.exception(u'Importing books from %s " '\ + log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) return False try: @@ -126,7 +126,7 @@ class OSISBible(BibleDB): book_ref_id = self.get_book_ref_id_by_name( unicode(self.books[book][0]), language_id) if not book_ref_id: - log.exception(u'Importing books from %s " '\ + log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) return False book_details = BiblesResourcesDB.get_book_by_id( From e8c2d7e805c79d4191409582495c214bde301f10 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Tue, 19 Apr 2011 22:25:27 +0200 Subject: [PATCH 025/124] add reimportwizard for older bible databases --- openlp/plugins/bibles/bibleplugin.py | 33 +- openlp/plugins/bibles/forms/__init__.py | 1 + .../plugins/bibles/forms/biblereimportform.py | 697 ++++++++++++++++++ openlp/plugins/bibles/lib/db.py | 122 +++ openlp/plugins/bibles/lib/mediaitem.py | 12 +- resources/images/bibles_reimport_alert.png | Bin 0 -> 762 bytes 6 files changed, 862 insertions(+), 3 deletions(-) create mode 100644 openlp/plugins/bibles/forms/biblereimportform.py create mode 100644 resources/images/bibles_reimport_alert.png diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 5a631bf00..13b5924d7 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -58,6 +58,7 @@ class BiblePlugin(Plugin): #action_list.add_action(self.exportBibleItem, UiStrings().Export) # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) + self.toolsReimportItem.setVisible(True) def finalise(self): """ @@ -87,6 +88,36 @@ class BiblePlugin(Plugin): export_menu.addAction(self.exportBibleItem) self.exportBibleItem.setVisible(False) + def addToolsMenuItem(self, tools_menu): + """ + Give the alerts plugin the opportunity to add items to the + **Tools** menu. + + ``tools_menu`` + The actual **Tools** menu item, so that your actions can + use it as their parent. + """ + log.info(u'add tools menu') + self.toolsReimportItem = QtGui.QAction(tools_menu) + self.toolsReimportItem.setObjectName(u'toolsReimportItem') + self.toolsReimportItem.setText( + translate('BiblePlugin', 'Re-&import older bible databases')) + self.toolsReimportItem.setStatusTip( + translate('BiblePlugin', 'Re-import the bible databases to addapt ' + 'the database scheme.')) + tools_menu.addAction(self.toolsReimportItem) + QtCore.QObject.connect(self.toolsReimportItem, + QtCore.SIGNAL(u'triggered()'), self.onToolsReimportItemTriggered) + self.toolsReimportItem.setVisible(False) + + def onToolsReimportItemTriggered(self): + """ + Re-import older bible databases. + """ + #self.manager.import_old_bible_databases() + if self.mediaItem: + self.mediaItem.onReImportClick() + def onBibleImportClick(self): if self.mediaItem: self.mediaItem.onImportClick() @@ -146,4 +177,4 @@ class BiblePlugin(Plugin): u'service': translate('BiblesPlugin', 'Add the selected Bible to the service') } - self.setPluginUiTextStrings(tooltips) \ No newline at end of file + self.setPluginUiTextStrings(tooltips) diff --git a/openlp/plugins/bibles/forms/__init__.py b/openlp/plugins/bibles/forms/__init__.py index 561944563..bd7ba3828 100644 --- a/openlp/plugins/bibles/forms/__init__.py +++ b/openlp/plugins/bibles/forms/__init__.py @@ -53,5 +53,6 @@ from the .ui files later if necessary. from booknameform import BookNameForm from languageform import LanguageForm from bibleimportform import BibleImportForm +from biblereimportform import BibleReImportForm __all__ = ['BibleImportForm'] diff --git a/openlp/plugins/bibles/forms/biblereimportform.py b/openlp/plugins/bibles/forms/biblereimportform.py new file mode 100644 index 000000000..5a311f017 --- /dev/null +++ b/openlp/plugins/bibles/forms/biblereimportform.py @@ -0,0 +1,697 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 # +############################################################################### +""" +The bible import functions for OpenLP +""" +import logging +import os +import os.path +import re + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import Receiver, SettingsManager, translate +from openlp.core.lib.db import delete_database +from openlp.core.lib.ui import UiStrings, critical_error_message_box +from openlp.core.ui.wizard import OpenLPWizard, WizardStrings +from openlp.core.utils import AppLocation, delete_file +from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB,\ + BiblesResourcesDB +from openlp.plugins.bibles.lib.http import BSExtract, BGExtract, CWExtract + +log = logging.getLogger(__name__) + + +class BibleReImportForm(OpenLPWizard): + """ + This is the Bible ReImport Wizard, which allows easy importing of Bibles + into OpenLP from older OpenLP2 database versions. + """ + log.info(u'BibleReImportForm loaded') + + def __init__(self, parent, manager, bibleplugin): + """ + Instantiate the wizard, and run any extra setup we need to. + + ``parent`` + The QWidget-derived parent of the wizard. + + ``manager`` + The Bible manager. + + ``bibleplugin`` + The Bible plugin. + """ + self.manager = manager + self.parent = parent + self.suffix = u'.sqlite' + self.settingsSection = u'bibles/bibles' + self.oldsettingsSection = u'bibles' + self.oldpath = AppLocation.get_section_data_path( + self.oldsettingsSection) + self.newpath = AppLocation.get_section_data_path( + self.settingsSection) + self.files = SettingsManager.get_files(self.oldsettingsSection, + self.suffix) + self.success = {} + self.newbibles = {} + self.maxBibles = len(self.files) + self.stop_import_flag = False + OpenLPWizard.__init__(self, parent, bibleplugin, u'bibleImportWizard', + u':/wizards/wizard_importbible.bmp') + + def setupUi(self, image): + """ + Set up the UI for the bible wizard. + """ + OpenLPWizard.setupUi(self, image) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import) + + def stop_import(self): + """ + Stops the import of the Bible. + """ + log.debug(u'Stopping import') + self.stop_import_flag = True + + def clean_filename(self, old_filename): + """ + Clean up the version name of the Bible and convert it into a valid + file name. + + ``old_filename`` + The "dirty" file name or version name. + """ + if not isinstance(old_filename, unicode): + old_filename = unicode(old_filename, u'utf-8') + old_filename = re.sub(r'[^\w]+', u'_', old_filename).strip(u'_') + return old_filename + u'.sqlite' + + def onCheckBoxIndexChanged(self, index): + ''' + Some cleanup while finishing + ''' + for number, filename in enumerate(self.files): + if not self.checkBox[number].checkState() == 2: + self.verticalWidget[number].hide() + self.formWidget[number].hide() + else: + if os.path.exists(os.path.join(self.newpath, filename)): + self.verticalWidget[number].setVisible(1) + self.formWidget[number].setVisible(1) + + def reject(self): + """ + Stop the wizard on cancel button, close button or ESC key. + """ + log.debug(u'Wizard cancelled by user') + if self.currentPage() == self.progressPage: + Receiver.send_message(u'openlp_stop_wizard') + for bible in self.newbibles.itervalues(): + delete_database(self.newpath, bible.clean_filename( + bible.get_name())) + self.done(QtGui.QDialog.Rejected) + + def onCurrentIdChanged(self, pageId): + """ + Perform necessary functions depending on which wizard page is active. + """ + if self.page(pageId) == self.progressPage: + self.preWizard() + self.performWizard() + self.postWizard() + elif self.page(pageId) == self.selectPage and self.maxBibles == 0: + self.next() + + def onFinishButton(self): + ''' + Some cleanup while finishing + ''' + if self.deleteCheckBox.checkState() == 2 or \ + self.deleteAllCheckBox.checkState() == 2: + for number, filename in enumerate(self.files): + if self.deleteAllCheckBox.checkState() == 2 or \ + (self.checkBox[number].checkState() == 2 and \ + self.success[number] == True): + delete_file(os.path.join(self.oldpath, filename)) + + def customInit(self): + """ + Perform any custom initialisation for bible importing. + """ + self.manager.set_process_dialog(self) + self.restart() + + def customSignals(self): + """ + Set up the signals used in the bible importer. + """ + for number, filename in enumerate(self.files): + QtCore.QObject.connect(self.checkBox[number], + QtCore.SIGNAL(u'stateChanged(int)'), + self.onCheckBoxIndexChanged) + QtCore.QObject.connect(self.finishButton, + QtCore.SIGNAL(u'clicked()'), self.onFinishButton) + + def addCustomPages(self): + """ + Add the bible import specific wizard pages. + """ + self.selectPage = QtGui.QWizardPage() + self.selectPage.setObjectName(u'SelectPage') + self.pageLayout = QtGui.QVBoxLayout(self.selectPage) + self.pageLayout.setObjectName(u'pageLayout') + self.scrollArea = QtGui.QScrollArea(self.selectPage) + self.scrollArea.setWidgetResizable(True) + self.scrollArea.setObjectName(u'scrollArea') + self.scrollArea.setHorizontalScrollBarPolicy( + QtCore.Qt.ScrollBarAlwaysOff) + self.scrollAreaContents = QtGui.QWidget(self.scrollArea) + self.scrollAreaContents.setObjectName(u'scrollAreaContents') + self.formLayout = QtGui.QVBoxLayout(self.scrollAreaContents) + self.formLayout.setSpacing(2) + self.formLayout.setObjectName(u'formLayout') + self.addScrollArea() + self.pageLayout.addWidget(self.scrollArea) + self.addPage(self.selectPage) + + def addScrollArea(self): + """ + Add the content to the scrollArea. + """ + self.checkBox = {} + self.versionNameEdit = {} + self.versionNameLabel = {} + self.versionInfoLabel = {} + self.versionInfoPixmap = {} + self.verticalWidget = {} + self.horizontalLayout = {} + self.formWidget = {} + self.formLayoutAttention = {} + for number, filename in enumerate(self.files): + bible = OldBibleDB(self.parent, path=self.oldpath, file=filename) + self.checkBox[number] = QtGui.QCheckBox(self.scrollAreaContents) + checkBoxName = u'checkBox['+unicode(number)+u']' + self.checkBox[number].setObjectName(checkBoxName) + self.checkBox[number].setText(bible.get_name()) + self.checkBox[number].setCheckState(2) + self.formLayout.addWidget(self.checkBox[number]) + self.verticalWidget[number] = QtGui.QWidget(self.scrollAreaContents) + verticalWidgetName = u'verticalWidget['+unicode(number)+u']' + self.verticalWidget[number].setObjectName(verticalWidgetName) + self.horizontalLayout[number] = QtGui.QHBoxLayout( + self.verticalWidget[number]) + self.horizontalLayout[number].setContentsMargins(25, 0, 0, 0) + horizontalLayoutName = u'horizontalLayout['+unicode(number)+u']' + self.horizontalLayout[number].setObjectName(horizontalLayoutName) + self.versionInfoPixmap[number] = QtGui.QLabel( + self.verticalWidget[number]) + versionInfoPixmapName = u'versionInfoPixmap['+unicode(number)+u']' + self.versionInfoPixmap[number].setObjectName(versionInfoPixmapName) + self.versionInfoPixmap[number].setPixmap(QtGui.QPixmap( + u':/plugins/plugin_alerts.png')) + #u':/bibles/bibles_reimport_alert.png')) + self.versionInfoPixmap[number].setAlignment(QtCore.Qt.AlignRight) + self.horizontalLayout[number].addWidget( + self.versionInfoPixmap[number]) + self.versionInfoLabel[number] = QtGui.QLabel( + self.verticalWidget[number]) + versionInfoLabelName = u'versionInfoLabel['+unicode(number)+u']' + self.versionInfoLabel[number].setObjectName(versionInfoLabelName) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, + QtGui.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth( + self.versionInfoLabel[number].sizePolicy().hasHeightForWidth()) + self.versionInfoLabel[number].setSizePolicy(sizePolicy) + self.horizontalLayout[number].addWidget( + self.versionInfoLabel[number]) + self.formLayout.addWidget(self.verticalWidget[number]) + self.formWidget[number] = QtGui.QWidget(self.scrollAreaContents) + formWidgetName = u'formWidget['+unicode(number)+u']' + self.formWidget[number].setObjectName(formWidgetName) + self.formLayoutAttention[number] = QtGui.QFormLayout( + self.formWidget[number]) + self.formLayoutAttention[number].setContentsMargins(25, 0, 0, 5) + formLayoutAttentionName = u'formLayoutAttention['+unicode(number)+\ + u']' + self.formLayoutAttention[number].setObjectName( + formLayoutAttentionName) + self.versionNameLabel[number] = QtGui.QLabel( + self.formWidget[number]) + self.versionNameLabel[number].setObjectName(u'VersionNameLabel') + self.formLayoutAttention[number].setWidget(0, + QtGui.QFormLayout.LabelRole, self.versionNameLabel[number]) + self.versionNameEdit[number] = QtGui.QLineEdit( + self.formWidget[number]) + self.versionNameEdit[number].setObjectName(u'VersionNameEdit') + self.formLayoutAttention[number].setWidget(0, + QtGui.QFormLayout.FieldRole, self.versionNameEdit[number]) + self.versionNameEdit[number].setText(bible.get_name()) + self.formLayout.addWidget(self.formWidget[number]) + self.spacerItem = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum, + QtGui.QSizePolicy.Expanding) + self.formLayout.addItem(self.spacerItem) + self.scrollArea.setWidget(self.scrollAreaContents) + + def clearScrollArea(self): + """ + Remove the content from the scrollArea. + """ + for number, filename in enumerate(self.files): + self.formLayout.removeWidget(self.checkBox[number]) + self.checkBox[number].setParent(None) + self.horizontalLayout[number].removeWidget( + self.versionInfoPixmap[number]) + self.versionInfoPixmap[number].setParent(None) + self.horizontalLayout[number].removeWidget( + self.versionInfoLabel[number]) + self.versionInfoLabel[number].setParent(None) + self.formLayout.removeWidget(self.verticalWidget[number]) + self.verticalWidget[number].setParent(None) + self.formLayoutAttention[number].removeWidget( + self.versionNameLabel[number]) + self.versionNameLabel[number].setParent(None) + self.formLayoutAttention[number].removeWidget( + self.versionNameEdit[number]) + self.formLayoutAttention[number].deleteLater() + self.versionNameEdit[number].setParent(None) + self.formLayout.removeWidget(self.formWidget[number]) + self.formWidget[number].setParent(None) + self.formLayout.removeItem(self.spacerItem) + + def addProgressPage(self): + """ + Add the progress page for the wizard. This page informs the user how + the wizard is progressing with its task. + """ + OpenLPWizard.addProgressPage(self) + self.progressLayout.setContentsMargins(48, 30, 48, 30) + self.progressLabelAfter = QtGui.QLabel(self.progressPage) + self.progressLabelAfter.setObjectName(u'progressLabelAfter') + self.progressLayout.addWidget(self.progressLabelAfter) + self.deleteCheckBox = QtGui.QCheckBox(self.progressPage) + self.deleteCheckBox.setObjectName(u'deleteCheckBox') + self.progressLayout.addWidget(self.deleteCheckBox) + self.deleteAllCheckBox = QtGui.QCheckBox(self.progressPage) + self.deleteAllCheckBox.setObjectName(u'deleteAllCheckBox') + self.progressLayout.addWidget(self.deleteAllCheckBox) + + def retranslateUi(self): + """ + Allow for localisation of the bible import wizard. + """ + self.setWindowTitle(translate('BiblesPlugin.ReImportWizardForm', + 'Bible ReImport Wizard')) + self.titleLabel.setText(WizardStrings.HeaderStyle % + translate('OpenLP.Ui', 'Welcome to the Bible ReImport Wizard')) + self.informationLabel.setText( + translate('BiblesPlugin.ReImportWizardForm', + 'This wizard will help you to reimport your existing Bibles from a ' + 'prior version of OpenLP 2. Click the next button below to start ' + 'the process by selecting the bibles to reimport.')) + self.selectPage.setTitle( + translate('BiblesPlugin.ReImportWizardForm', + 'Please choose')) + self.selectPage.setSubTitle( + translate('BiblesPlugin.ReImportWizardForm', + 'Please choose the bibles which should be reimported')) + for number, bible in enumerate(self.files): + self.versionNameLabel[number].setText( + translate('BiblesPlugin.ReImportWizardForm', 'Version name:')) + self.versionInfoLabel[number].setText( + translate('BiblesPlugin.ReImportWizardForm', 'This ' + 'bible still exists. Please change the name or uncheck it.')) + self.progressPage.setTitle(WizardStrings.Importing) + self.progressPage.setSubTitle( + translate('BiblesPlugin.ReImportWizardForm', + 'Please wait while your Bibles are imported.')) + self.progressLabel.setText(WizardStrings.Ready) + self.progressBar.setFormat(u'%p%') + self.deleteCheckBox.setText( + translate('BiblesPlugin.ReImportWizardForm', 'Delete old bible ' + 'database(s) from bibles which was imported\nsucessful right now')) + self.deleteAllCheckBox.setText( + translate('BiblesPlugin.ReImportWizardForm', 'Delete all old bible ' + 'database(s) (including not imported bibles)')) + self.progressLabelAfter.setText( + translate('BiblesPlugin.ReImportWizardForm', '\nIf OpenLP should ' + 'delete the old bible databases please choose:')) + + def validateCurrentPage(self): + """ + Validate the current page before moving on to the next page. + """ + if self.currentPage() == self.welcomePage: + return True + elif self.currentPage() == self.selectPage: + for number, filename in enumerate(self.files): + if not self.checkBox[number].checkState() == 2: + continue + version_name = unicode(self.versionNameEdit[number].text()) + oldbible = OldBibleDB(self.parent, path=self.oldpath, + file=filename) + oldname = oldbible.get_name() + if not version_name: + critical_error_message_box(UiStrings().EmptyField, + translate('BiblesPlugin.ReImportWizardForm', + 'You need to specify a version name for your Bible.')) + self.versionNameEdit[number].setFocus() + return False + elif self.manager.exists(version_name): + critical_error_message_box( + translate('BiblesPlugin.ReImportWizardForm', + 'Bible Exists'), + translate('BiblesPlugin.ReImportWizardForm', + 'This Bible already exists. Please import ' + 'a different Bible, delete the existing one or ' + 'uncheck.')) + self.versionNameEdit[number].setFocus() + return False + elif os.path.exists(os.path.join(self.newpath, filename)) and \ + version_name == oldname: + critical_error_message_box( + translate('BiblesPlugin.ReImportWizardForm', + 'Bible Exists'), + translate('BiblesPlugin.ReImportWizardForm', + 'This Bible already exists. Please import ' + 'a different Bible, delete the existing one or ' + 'uncheck.')) + self.versionNameEdit[number].setFocus() + return False + elif os.path.exists(os.path.join(self.newpath, + self.clean_filename(version_name))): + critical_error_message_box( + translate('BiblesPlugin.ReImportWizardForm', + 'Bible Exists'), + translate('BiblesPlugin.ReImportWizardForm', + 'This Bible already exists. Please import ' + 'a different Bible, delete the existing one or ' + 'uncheck.')) + self.versionNameEdit[number].setFocus() + return False + return True + if self.currentPage() == self.progressPage: + return True + + def setDefaults(self): + """ + Set default values for the wizard pages. + """ + log.debug(u'BibleReImport setDefaults') + settings = QtCore.QSettings() + settings.beginGroup(self.plugin.settingsSection) + self.stop_import_flag = False + self.success.clear() + self.newbibles.clear() + self.clearScrollArea() + self.files = SettingsManager.get_files(self.oldsettingsSection, + self.suffix) + self.addScrollArea() + self.customSignals() + self.retranslateUi() + self.maxBibles = len(self.files) + self.finishButton.setVisible(False) + self.cancelButton.setVisible(True) + for number, filename in enumerate(self.files): + self.checkBox[number].setCheckState(2) + if os.path.exists(os.path.join(self.newpath, filename)): + self.verticalWidget[number].setVisible(1) + self.formWidget[number].setVisible(1) + else: + self.verticalWidget[number].hide() + self.formWidget[number].hide() + self.progressLabelAfter.hide() + self.deleteCheckBox.hide() + self.deleteCheckBox.setCheckState(0) + self.deleteAllCheckBox.hide() + self.deleteAllCheckBox.setCheckState(0) + self.restart() + settings.endGroup() + + def preWizard(self): + """ + Prepare the UI for the import. + """ + OpenLPWizard.preWizard(self) + self.progressLabel.setText(translate( + 'BiblesPlugin.ImportWizardForm', + 'Starting Importing bible...')) + Receiver.send_message(u'openlp_process_events') + + def performWizard(self): + """ + Perform the actual import. + """ + include_webbible = False + proxy_server = None + if self.maxBibles == 0: + self.progressLabel.setText( + translate('BiblesPlugin.ReImportWizardForm', 'Sorry, but OpenLP' + ' could not find a Bible to reimport.')) + self.progressBar.hide() + return + self.maxBibles = 0 + for number, file in enumerate(self.files): + if self.checkBox[number].checkState() == 2: + self.maxBibles += 1 + number = 0 + for biblenumber, filename in enumerate(self.files): + bible_failed = False + self.success[biblenumber] = False + if not self.checkBox[biblenumber].checkState() == 2: + continue + self.progressBar.reset() + oldbible = OldBibleDB(self.parent, path=self.oldpath, file=filename) + name = oldbible.get_name() + if name is None: + delete_file(os.path.join(self.oldpath, filename)) + self.incrementProgressBar(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Reimporting Bible %s of %s: "%s"\nFailed')) % + (number+1, self.maxBibles, name), + self.progressBar.maximum()-self.progressBar.value()) + number += 1 + continue + self.progressLabel.setText(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Reimporting Bible %s of %s: "%s"\nImporting ...')) % + (number+1, self.maxBibles, name)) + if os.path.exists(os.path.join(self.newpath, filename)): + name = unicode(self.versionNameEdit[biblenumber].text()) + self.newbibles[number] = BibleDB(self.parent, path=self.oldpath, + name=name) + metadata = oldbible.get_metadata() + webbible = False + meta_data = {} + for meta in metadata: + meta_data[meta[u'key']] = meta[u'value'] + if not meta[u'key'] == u'Version': + self.newbibles[number].create_meta(meta[u'key'], + meta[u'value']) + else: + self.newbibles[number].create_meta(meta[u'key'], name) + if meta[u'key'] == u'download source': + webbible = True + include_webbible = True + if meta.has_key(u'proxy server'): + proxy_server = meta[u'proxy server'] + if webbible: + if meta_data[u'download source'].lower() == u'crosswalk': + handler = CWExtract(proxy_server) + elif meta_data[u'download source'].lower() == u'biblegateway': + handler = BGExtract(proxy_server) + elif meta_data[u'download source'].lower() == u'bibleserver': + handler = BSExtract(proxy_server) + books = handler.get_books_from_http(meta_data[u'download name']) + if not books: + log.exception(u'Importing books from %s - download '\ + u'name: "%s" failed' % ( + meta_data[u'download source'], + meta_data[u'download name'])) + delete_database(self.newpath, self.newbibles[number].\ + clean_filename(self.newbibles[number].get_name())) + del self.newbibles[number] + critical_error_message_box( + translate('BiblesPlugin.ReImportWizardForm', + 'Download Error'), + translate('BiblesPlugin.ReImportWizardForm', + 'To Re-Import your webbibles a Internet connection is ' + 'necessary. Please check your Internet connection, and ' + 'if this error continues to occur please consider ' + 'reporting a bug.')) + self.incrementProgressBar(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Reimporting Bible %s of %s: "%s"\nFailed')) % + (number+1, self.maxBibles, name), + self.progressBar.maximum()-self.progressBar.value()) + number += 1 + continue + bible = BiblesResourcesDB.get_webbible( + meta_data[u'download name'], + meta_data[u'download source'].lower()) + if bible[u'language_id']: + language_id = bible[u'language_id'] + self.newbibles[number].create_meta(u'language_id', + language_id) + else: + language_id = self.newbibles[number].get_language() + if not language_id: + log.exception(u'Re-Importing from "%s" '\ + 'failed' % filename) + delete_database(self.newpath, self.newbibles[number].\ + clean_filename(self.newbibles[number].get_name())) + del self.newbibles[number] + self.incrementProgressBar(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Reimporting Bible %s of %s: "%s"\nFailed')) % + (number+1, self.maxBibles, name), + self.progressBar.maximum()-self.progressBar.value()) + number += 1 + continue + self.progressBar.setMaximum(len(books)) + for book in books: + self.incrementProgressBar(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Reimporting Bible %s of %s: "%s"\n' + 'Importing %s ...')) % + (number+1, self.maxBibles, name, book)) + book_ref_id = self.newbibles[number].\ + get_book_ref_id_by_name(book, language_id) + if not book_ref_id: + log.exception(u'Importing books from %s - download '\ + u'name: "%s" aborted by user' % ( + meta_data[u'download source'], + meta_data[u'download name'])) + delete_database(self.newpath, self.newbibles[number].\ + clean_filename(self.newbibles[number].get_name())) + del self.newbibles[number] + bible_failed = True + break + book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) + self.newbibles[number].create_book(book, book_ref_id, + book_details[u'testament_id']) + else: + language_id = self.newbibles[number].get_object(BibleMeta, + u'language_id') + if not language_id: + language_id = self.newbibles[number].get_language() + if not language_id: + log.exception(u'Importing books from "%s" '\ + 'failed' % name) + delete_database(self.newpath, self.newbibles[number].\ + clean_filename(self.newbibles[number].get_name())) + del self.newbibles[number] + self.incrementProgressBar(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Reimporting Bible %s of %s: "%s"\nFailed')) % + (number+1, self.maxBibles, name), + self.progressBar.maximum()-self.progressBar.value()) + number += 1 + continue + books = oldbible.get_books() + self.progressBar.setMaximum(len(books)) + for book in books: + self.incrementProgressBar(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Reimporting Bible %s of %s: "%s"\n' + 'Importing %s ...')) % + (number+1, self.maxBibles, name, book[u'name'])) + book_ref_id = self.newbibles[number].\ + get_book_ref_id_by_name(book[u'name'], language_id) + if not book_ref_id: + log.exception(u'Importing books from %s " '\ + 'failed - aborted by user' % name) + delete_database(self.newpath, self.newbibles[number].\ + clean_filename(self.newbibles[number].get_name())) + del self.newbibles[number] + bible_failed = True + break + book_details = BiblesResourcesDB.get_book_by_id(book_ref_id) + db_book = self.newbibles[number].create_book(book[u'name'], + book_ref_id, book_details[u'testament_id']) + verses = oldbible.get_verses(book[u'id']) + for verse in verses: + self.newbibles[number].create_verse(db_book.id, + int(verse[u'chapter']), + int(verse[u'verse']), unicode(verse[u'text'])) + Receiver.send_message(u'openlp_process_events') + if not bible_failed: + self.incrementProgressBar(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Reimporting Bible %s of %s: "%s"\n' + 'Done')) % + (number+1, self.maxBibles, name)) + self.success[biblenumber] = True + else: + self.incrementProgressBar(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Reimporting Bible %s of %s: "%s"\nFailed')) % + (number+1, self.maxBibles, name), + self.progressBar.maximum()-self.progressBar.value()) + number += 1 + self.parent.reloadBibles() + successful_import = 0 + failed_import = 0 + for number, success in self.success.iteritems(): + if success == True: + successful_import += 1 + elif success == False and self.checkBox[number].checkState() == 2: + failed_import += 1 + if failed_import > 0: + failed_import_text = u' And ' + unicode(failed_import) + \ + u' reimport fails.' + else: + failed_import_text = u'' + if successful_import > 0: + if include_webbible: + self.progressLabel.setText(unicode( + translate('BiblesPlugin.ReImportWizardForm', 'Reimport %s ' + 'bibles successful.%s\nPlease note, that verses from ' + 'webbibles will be downloaded\non demand and thus an ' + 'internet connection is required.')) % + (successful_import, failed_import_text)) + else: + self.progressLabel.setText(unicode( + translate('BiblesPlugin.ReImportWizardForm', 'Reimport %s ' + 'bibles successful.%s')) % (successful_import, + failed_import_text)) + self.deleteCheckBox.setVisible(1) + bibles = u'' + for bible in self.newbibles.itervalues(): + name = bible.get_name() + bibles += u'\n"' + name + u'"' + self.deleteCheckBox.setToolTip(unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + 'Sucessful imported bible(s):%s')) % bibles) + else: + self.progressLabel.setText( + translate('BiblesPlugin.ReImportWizardForm', 'Reimport ' + 'failed.')) + self.progressLabelAfter.setVisible(1) + self.deleteAllCheckBox.setVisible(1) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 7b22b9483..6dd7b3cbc 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -931,3 +931,125 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager): u'alternative_book_names(book_reference_id, language_id, name) ' u'VALUES (?, ?, ?)', (book_reference_id, language_id, name), True) return alternative_book_name + + +class OldBibleDB(QtCore.QObject, Manager): + """ + This class conects to the old bible databases to reimport them to the new + database scheme. + """ + cursor = None + + def __init__(self, parent, **kwargs): + """ + The constructor loads up the database and creates and initialises the + tables if the database doesn't exist. + + **Required keyword arguments:** + + ``path`` + The path to the bible database file. + + ``name`` + The name of the database. This is also used as the file name for + SQLite databases. + """ + log.info(u'OldBibleDB loaded') + QtCore.QObject.__init__(self) + if u'path' not in kwargs: + raise KeyError(u'Missing keyword argument "path".') + if u'file' not in kwargs: + raise KeyError(u'Missing keyword argument "file".') + if u'path' in kwargs: + self.path = kwargs[u'path'] + if u'file' in kwargs: + self.file = kwargs[u'file'] + + def get_cursor(self): + """ + Return the cursor object. Instantiate one if it doesn't exist yet. + """ + if self.cursor is None: + filepath = os.path.join(self.path, self.file) + conn = sqlite3.connect(filepath) + self.cursor = conn.cursor() + return self.cursor + + def run_sql(self, query, parameters=()): + """ + Run an SQL query on the database, returning the results. + + ``query`` + The actual SQL query to run. + + ``parameters`` + Any variable parameters to add to the query. + """ + cursor = self.get_cursor() + cursor.execute(query, parameters) + return cursor.fetchall() + + def get_name(self): + """ + Returns the version name of the Bible. + """ + version_name = self.run_sql(u'SELECT value FROM ' + u'metadata WHERE key = "Version"') + if version_name: + self.name = version_name[0][0] + else: + self.name = None + return self.name + + def get_metadata(self): + """ + Returns the metadata of the Bible. + """ + metadata = self.run_sql(u'SELECT key, value FROM metadata ' + u'ORDER BY rowid') + if metadata: + metadata_list = [] + for meta in metadata: + metadata_list.append({ + u'key': unicode(meta[0]), + u'value': unicode(meta[1]) + }) + else: + metadata_list = None + return metadata_list + + def get_books(self): + """ + Returns the books of the Bible. + """ + books = self.run_sql(u'SELECT name, id FROM book ORDER BY id') + if books: + book_list = [] + for book in books: + book_list.append({ + u'name': unicode(book[0]), + u'id':int(book[1]) + }) + else: + book_list = None + return book_list + + def get_verses(self, book_id): + """ + Returns the verses of the Bible. + """ + verses = self.run_sql(u'SELECT book_id, chapter, verse, text FROM ' + u'verse WHERE book_id = ? ORDER BY id', (book_id, )) + if verses: + verse_list = [] + for verse in verses: + verse_list.append({ + u'book_id': int(verse[0]), + u'chapter': int(verse[1]), + u'verse': int(verse[2]), + u'text': unicode(verse[3]) + }) + else: + verse_list = None + return verse_list + diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index bd7a5ae85..1b7bf90ce 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -33,7 +33,7 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings, add_widget_completer, \ media_item_combo_box, critical_error_message_box, find_and_set_in_combo_box -from openlp.plugins.bibles.forms import BibleImportForm +from openlp.plugins.bibles.forms import BibleImportForm, BibleReImportForm from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ VerseReferenceList, get_reference_match @@ -310,6 +310,14 @@ class BibleMediaItem(MediaManagerItem): if self.import_wizard.exec_(): self.reloadBibles() + def onReImportClick(self): + if not hasattr(self, u'import_wizard'): + self.import_wizard = BibleReImportForm(self, self.parent.manager, + self.parent) + # If the import was not cancelled then reload. + if self.import_wizard.exec_(): + self.reloadBibles() + def loadBibles(self): log.debug(u'Loading Bibles') self.quickVersionComboBox.clear() @@ -849,4 +857,4 @@ class BibleMediaItem(MediaManagerItem): self.settings.layout_style) QtCore.QSettings().setValue( self.settingsSection + u'/verse layout style', - QtCore.QVariant(self.settings.layout_style)) \ No newline at end of file + QtCore.QVariant(self.settings.layout_style)) diff --git a/resources/images/bibles_reimport_alert.png b/resources/images/bibles_reimport_alert.png new file mode 100644 index 0000000000000000000000000000000000000000..331aa268725a4edff3fa6cab7dfaf5af24708c2c GIT binary patch literal 762 zcmVz8xpUII{8&=iH{wnUDxx6o*XQpr9@S zFA7f~5wyArj)7engn2gzstbkiqQW4^o2U%CF~JzoO$Y@oEjOFGxwX#D=9!*z-Y(o0 zQwbk<`S`x?dETGrWkiIXV2m*U4FEj(r*8lvv=^C(b_IaeKp-$7%W^`Nt(9kFmQEb*nE7Psy^?IqR ztBayjPKwQXiHJy&qz3@_5)S~tZnyVDm%lIP5+5is35raDTrL;6T(06>jn7at{N)#b z6NTa?0O;-Qt@Qi-eRcKC_36+(fN|S~@H}|_-^lXUJE&`DvkeRkTqt;90$|BxGRLp` z`_FAAgHTsr1Ed20I-3=AHY>#hx%don>+f;v=GF56+8JZu1VM0DR8;s+oj!Xq`ROt= zB~%pnI#Td;q)OJLXMdu$eUO)BITH*9=a|Ri@x7aV`>56uZi>(Ll#p-S-98`QF5Pu? z_YC6M`lSYE%SBUFRn<|4v#}`^ewD>Op@g67c8A+32*R;4RaJ9_VQ3cj;Fel`NG<2K z4it!wpY0ZJYUYhH+a;BVtcGD|0MIfrGV&yqO2ufONT<`uv9Yli0FE#K41f(l8-N-B s|?9jsO4v literal 0 HcmV?d00001 From 81fe6f13e31c198f2d98190eb13c2e966d6cfaa0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 20 Apr 2011 09:25:16 +0200 Subject: [PATCH 026/124] add attention picture --- openlp/plugins/bibles/forms/biblereimportform.py | 3 +-- resources/images/openlp-2.qrc | 1 + 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/bibles/forms/biblereimportform.py b/openlp/plugins/bibles/forms/biblereimportform.py index 5a311f017..48af1c558 100644 --- a/openlp/plugins/bibles/forms/biblereimportform.py +++ b/openlp/plugins/bibles/forms/biblereimportform.py @@ -233,8 +233,7 @@ class BibleReImportForm(OpenLPWizard): versionInfoPixmapName = u'versionInfoPixmap['+unicode(number)+u']' self.versionInfoPixmap[number].setObjectName(versionInfoPixmapName) self.versionInfoPixmap[number].setPixmap(QtGui.QPixmap( - u':/plugins/plugin_alerts.png')) - #u':/bibles/bibles_reimport_alert.png')) + u':/bibles/bibles_reimport_alert.png')) self.versionInfoPixmap[number].setAlignment(QtCore.Qt.AlignRight) self.horizontalLayout[number].addWidget( self.versionInfoPixmap[number]) diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index 0d3191eff..f3bfd100e 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -24,6 +24,7 @@ bibles_search_text.png bibles_search_reference.png + bibles_reimport_alert.png plugin_alerts.png From b0b127022cc1e7c48b0d4558d505341615c606b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 20 Apr 2011 11:00:29 +0200 Subject: [PATCH 027/124] bug fixes add some additional Apocrypha books --- .../plugins/bibles/forms/bibleimportform.py | 24 ++++++++++++++++++ .../plugins/bibles/forms/biblereimportform.py | 11 ++++---- openlp/plugins/bibles/forms/booknameform.py | 3 +-- openlp/plugins/bibles/lib/mediaitem.py | 6 ++--- .../bibles/resources/bibles_resources.sqlite | Bin 101376 -> 101376 bytes 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 57a38538f..a85230611 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -30,6 +30,7 @@ import csv import logging import os import os.path +import re from PyQt4 import QtCore, QtGui @@ -471,6 +472,7 @@ class BibleImportForm(OpenLPWizard): license_version = unicode(self.field(u'license_version').toString()) license_copyright = \ unicode(self.field(u'license_copyright').toString()) + path = AppLocation.get_section_data_path(u'bibles/bibles') if not license_version: critical_error_message_box(UiStrings().EmptyField, translate('BiblesPlugin.ImportWizardForm', @@ -492,10 +494,32 @@ class BibleImportForm(OpenLPWizard): 'a different Bible or first delete the existing one.')) self.versionNameEdit.setFocus() return False + elif os.path.exists(os.path.join(path, self.clean_filename( + license_version))): + critical_error_message_box( + translate('BiblesPlugin.ImportWizardForm', 'Bible Exists'), + translate('BiblesPlugin.ImportWizardForm', + 'This Bible already exists. Please import ' + 'a different Bible or first delete the existing one.')) + self.versionNameEdit.setFocus() + return False return True if self.currentPage() == self.progressPage: return True + def clean_filename(self, old_filename): + """ + Clean up the version name of the Bible and convert it into a valid + file name. + + ``old_filename`` + The "dirty" file name or version name. + """ + if not isinstance(old_filename, unicode): + old_filename = unicode(old_filename, u'utf-8') + old_filename = re.sub(r'[^\w]+', u'_', old_filename).strip(u'_') + return old_filename + u'.sqlite' + def onWebSourceComboBoxIndexChanged(self, index): """ Setup the list of Bibles when you select a different source on the web diff --git a/openlp/plugins/bibles/forms/biblereimportform.py b/openlp/plugins/bibles/forms/biblereimportform.py index 48af1c558..5895f710a 100644 --- a/openlp/plugins/bibles/forms/biblereimportform.py +++ b/openlp/plugins/bibles/forms/biblereimportform.py @@ -310,7 +310,7 @@ class BibleReImportForm(OpenLPWizard): the wizard is progressing with its task. """ OpenLPWizard.addProgressPage(self) - self.progressLayout.setContentsMargins(48, 30, 48, 30) + self.progressLayout.setContentsMargins(48, 48, 48, 30) self.progressLabelAfter = QtGui.QLabel(self.progressPage) self.progressLabelAfter.setObjectName(u'progressLabelAfter') self.progressLayout.addWidget(self.progressLabelAfter) @@ -663,22 +663,23 @@ class BibleReImportForm(OpenLPWizard): elif success == False and self.checkBox[number].checkState() == 2: failed_import += 1 if failed_import > 0: - failed_import_text = u' And ' + unicode(failed_import) + \ - u' reimport fails.' + failed_import_text = unicode(translate( + 'BiblesPlugin.ReImportWizardForm', + ' - %s reimport fail')) % failed_import else: failed_import_text = u'' if successful_import > 0: if include_webbible: self.progressLabel.setText(unicode( translate('BiblesPlugin.ReImportWizardForm', 'Reimport %s ' - 'bibles successful.%s\nPlease note, that verses from ' + 'bible(s) successful%s.\nPlease note, that verses from ' 'webbibles will be downloaded\non demand and thus an ' 'internet connection is required.')) % (successful_import, failed_import_text)) else: self.progressLabel.setText(unicode( translate('BiblesPlugin.ReImportWizardForm', 'Reimport %s ' - 'bibles successful.%s')) % (successful_import, + 'bible(s) successful.%s')) % (successful_import, failed_import_text)) self.deleteCheckBox.setVisible(1) bibles = u'' diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index 58603226c..b8bdbb493 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -56,8 +56,7 @@ class BookNameForm(QDialog, Ui_BookNameDialog): def exec_(self, name): items = [] self.requestComboBox.addItem(u'') - self.requestLabel.setText( - translate('BiblesPlugin.BookNameForm', name)) + self.requestLabel.setText(name) items = BiblesResourcesDB.get_books() for item in items: self.requestComboBox.addItem(item[u'name']) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 1b7bf90ce..ec65a37d0 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -311,11 +311,11 @@ class BibleMediaItem(MediaManagerItem): self.reloadBibles() def onReImportClick(self): - if not hasattr(self, u'import_wizard'): - self.import_wizard = BibleReImportForm(self, self.parent.manager, + if not hasattr(self, u'reimport_wizard'): + self.reimport_wizard = BibleReImportForm(self, self.parent.manager, self.parent) # If the import was not cancelled then reload. - if self.import_wizard.exec_(): + if self.reimport_wizard.exec_(): self.reloadBibles() def loadBibles(self): diff --git a/openlp/plugins/bibles/resources/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite index 23c89b5df80e39da39e81eb94cc6a0e9b8dd1474..4645fcf9ca76a4d0aecb2a5d227198e2f2a696bc 100644 GIT binary patch delta 1861 zcma)6du)?c6hDt{LtMugg>Bthx~&`C?7FslF(6|_!O^iN4q1YM!G=S|Fyo;i12@ru z2F==Q$YO}X0>MXQx)LL(iTEJkAAo=hiG&d}5J01dAx2R=x9uhp{;g-@W+dXUZL+Xg#9cqf%g4n9g#byL^j4C$ndN6xJ zg;5-)!y@3ze3akfS9v`@#%?yzFLauQsGqh_3;D$riKBxU#HVl`CcyRqoz^?L1UxeS-LNd4g{Qo|m*I^c1r3k8|#6B)x!r&?LyRQ`f=n%c6X)EM;@q%qf{d&k%ZzP}^XGBs22H>c@PuI+1Txy9#XT z^?dUZEt)*&0?MKa%%P=l4*k@Lr*J22qrEtpzJO1$l!oy=d=3pT0Ndy~{SG&w3vY4^ zPhk(ma}6)$r+F*)@qRwcC$XI`^3V80pvUIZLYX6%X@>?gmthgu!lzy#H)w|C0|EO~0Hcd$243TWJ+)x{usd{qH##q^h9(B=~ ziZ0ceH`k!oYQ$;Ag3#GKCqAhy%@=laRN~1x2-DyUP$ey-WweI6@HV}Ir|Ate(#Im3 z5&D(xa1v*TkmmAYdVuobGM4aa?#6Chir;g92XGG$!WpvS5FX*vd^OOsIXQ`QaiJVo zJL`~tGt}pBJ*sa8O|yKkN!FdwL)1CA5f{iUbi#EB+C)Mt<#}&G)@q^{uw#w#6`PE6 z#dt(8olq@1He8^V7kk3-@{8*haiH;s)$!sS^>^`XwJBJndP~kv)Q78;Bs7OPq7=2J zbRK8&e0AJD6{jehB{_7pG`VhuE~!-5s4MrFl+<=^<4SgL0$rmM;gaf-sFhGWUc!&C z7aPzF7vUY)0UHB7vu2nYM2)Gb$Ppbxo|s-Aku?7|JdqU^)d^a!P7EeD-V-K?Ok@YA z*9xaG8~Oi4Ey9V!5=&~-*MlYGtyb;sLJ8Myw`XCM7%R&_zQ00?##Ec+@JE^V7i{4e zGftgyUr^@@?I|ff`6SX7bUs=or{P)cF3c>q&K58`1IZgscBF53$2tdE%cHpGF5EMU ztBS&`vRT5=-9t0#!V=N~@F`jEs-pg zz{U6%UgJ4jizA`w+xKAAT}7-liYbC3zBhMJ@$ucb}&A_eJ9Iv_Q7jJ_q8vh}4-no6^!xoqZMsj*%BHXkHY rsIu=U&d{fd$faJps2fv8oj%ds39lW+b^Gjqnov#fLkt<-zx~}m@EVm% delta 2917 zcmahLeQ?v|`S~cJEe%jxN|GjNntqU^N!kRP43v)|RVbz9`0(hahqM$6rLEUgMK=e< z$ta9T`=X-9>ELw3xnqtnZ<}r>I61uC&FNUTKalmD`w+(My4#H%y1D21B^h|KExGsi z{+_S*_k2I^&O^4HhinJR?fU_sOP2K;4J2{@_wIR~*D+5jCd?o4-+7W3vX5=_0iC9! zw2RhLluGe$IF7I53-~B@U<8X{65fIrVLzmxqiVJdB9+DHhvfopge|gqoNlu&aLykp zvjH}F5ZAx}^uxX2lYO&1b8sr%9^8Yt(flSFnB`wDp!#pF@wIFbJeW9x|` z+sqx81Oe0e60e~P@I`j;LO6rR@z?wm-Aym?dHfT-!oRjckP`e6uq#KwNH zwqB_*i~3n&)Ql!)?PwB@4+(3yh&|XM=J$wXodT_JKlDO3gcMjQCk_f2yorMrFl2qE z8yP&<=raG4OKg(EM$`OmP zQ`matubNa%=Spl7gdW)keg#*GK$nH8R8aNrw?LmN-3}_h2`Ut55}5%p)T@9pcEdLC z%vG^v7NJ{s-KybIc~MQ2p=psc>E+76YzF3VuHmz(~3 zZb6xe&GnexWUaf9ot93WaFd?VEP84b_4s1bkep>#rB#hV(QStLYTUyTT60gxS!!1e zH3L?N7MjB;C^8%3vv(+Njj;EL_cn?tg{rb9!}Z7lJ$SWn=;!kF+bsfYl4H8%ps5*z zx~<1L#pdF9;-79yK($kU56CATf+?y;n-KcM>q1&7LV218tpYtDx(&(d5_$?aW8-#_ z++-mDrYY)Et|KWX%v632Po|6W{=iGC)K8gcx$S%i9B>L?5@$%ww__hZfoXgPFOi+< zshtMsX?la+qknQa$GDaI;S~RrCq{=yOfcARs~e^EgHFUdM8AGnDbX(l87S^1q1H%e zXohQQ=H3J5XkC>jFDrkY%_5(Hs?A+>L9?jNV|;a9mm^0F`VLQ;M}@B=7z&H~!~eTC{-;ak8+*`gE(d%&3TYkGz}rNh z!vbufLHZ%~(_{F1e2Jcci#U(Y!Q1!+`XipkgBYNXxqvoOK9}(vUP6_;f$!sCKFCM- z2mCXhz+s-eQ6s#*#reSxap`^o+UgRSPWahg_x~H=6sr-MA2*ceY0;YBMqF5L7RM`0 zUaZ4xi=Fd`L!{?xryT&z)+OS(K}lcjad$|?HQNBRJj|lKWwRuq^t_C+_r(`w+`uio8OHfFzA!p`*o;TQ`L#|7)dDA) zBMIl!R;!$+m=^**GZJu{fq<*c;mHO(*VA%4JG@y+uJz^i0*7BHm6H3JcB(a-d1G^| z-fO;I?<(Ula9ziuZA4his`_fvAgi?AV)mtYB&{MH5Z4Ak2FmjWlIDDYwruEm4<=M%{&>sIbTYr;i}|(;T4zBGHE)UVy+I+6l5T~;})SxXsE@C zwYDXFOTiR#Y@g5U*;i?{$i7@wa9@R)zRzVY?yX*1$emCNR{;M)3uv|6H@4D)v>V^2 zr}z{dqc`b1eW>LoW227eb349*{~|wJ;Q{^%Hp%VcEq;Q(iJfSu1XH++-{lX@aJY0@ z9JnfJgP5ln&2wQ_eH`+t5*b*FVXZVxovS)N9)egFj)QG(qYakV6q}c074Ep8b(p2f zBQ~gU7UOD>=o72tj$#sx0cM+G>^Wvj^7aZzgz33Up3f@h%-qv4)dRPs z-%UnWO)V6zTFN(556mg#Mk<$1wS?Q#3lAK@(F65<)vZY;*e1{(t8y!}FJw^GB_bUf zdxX;8`r6&Rw1yS|wNZyu{D55R9-}dOj*io-l6=3S3A#l8V3xV);Q-H-EADc>le=h< z^utHwdN|65`9(gNZu`y|`Ety%ewAd7mP Date: Thu, 21 Apr 2011 16:32:04 +0200 Subject: [PATCH 028/124] little bug fix add check if openlp/bibles/resources directory exists and mkdir if not --- openlp/plugins/bibles/forms/biblereimportform.py | 1 + openlp/plugins/bibles/lib/db.py | 6 ++++++ 2 files changed, 7 insertions(+) diff --git a/openlp/plugins/bibles/forms/biblereimportform.py b/openlp/plugins/bibles/forms/biblereimportform.py index 5895f710a..3ca4966ba 100644 --- a/openlp/plugins/bibles/forms/biblereimportform.py +++ b/openlp/plugins/bibles/forms/biblereimportform.py @@ -445,6 +445,7 @@ class BibleReImportForm(OpenLPWizard): else: self.verticalWidget[number].hide() self.formWidget[number].hide() + self.progressBar.show() self.progressLabelAfter.hide() self.deleteCheckBox.hide() self.deleteCheckBox.setCheckState(0) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 6dd7b3cbc..c2b2fa1b1 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -849,6 +849,12 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager): database doesn't exist. """ if AlternativeBookNamesDB.cursor is None: + if not os.path.exists(os.path.join( + AppLocation.get_directory(AppLocation.DataDir), u'bibles', + u'resources')): + os.mkdir(os.path.join( + AppLocation.get_directory(AppLocation.DataDir), u'bibles', + u'resources')) filepath = os.path.join( AppLocation.get_directory(AppLocation.DataDir), u'bibles', u'resources', u'alternative_book_names.sqlite') From d7dc4def5345639ed54ce6a75b9561243785eee2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Tue, 26 Apr 2011 20:18:13 +0200 Subject: [PATCH 029/124] change name from reimport to upgrade fix speed problem while changing the advanced bible change some "for" loops --- openlp/plugins/bibles/bibleplugin.py | 38 ++-- openlp/plugins/bibles/forms/__init__.py | 5 +- ...blereimportform.py => bibleupgradeform.py} | 169 +++++++++--------- openlp/plugins/bibles/lib/db.py | 154 ++++++++-------- openlp/plugins/bibles/lib/http.py | 15 +- openlp/plugins/bibles/lib/manager.py | 24 +-- openlp/plugins/bibles/lib/mediaitem.py | 10 +- ...ort_alert.png => bibles_upgrade_alert.png} | Bin resources/images/openlp-2.qrc | 2 +- 9 files changed, 207 insertions(+), 210 deletions(-) rename openlp/plugins/bibles/forms/{biblereimportform.py => bibleupgradeform.py} (84%) rename resources/images/{bibles_reimport_alert.png => bibles_upgrade_alert.png} (100%) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 13b5924d7..a8a8fdf79 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -32,6 +32,7 @@ from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.ui import base_action, UiStrings from openlp.core.utils.actions import ActionList from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem +from openlp.plugins.bibles.forms import BibleUpgradeForm log = logging.getLogger(__name__) @@ -58,7 +59,7 @@ class BiblePlugin(Plugin): #action_list.add_action(self.exportBibleItem, UiStrings().Export) # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) - self.toolsReimportItem.setVisible(True) + self.toolsUpgradeItem.setVisible(True) def finalise(self): """ @@ -90,7 +91,7 @@ class BiblePlugin(Plugin): def addToolsMenuItem(self, tools_menu): """ - Give the alerts plugin the opportunity to add items to the + Give the bible plugin the opportunity to add items to the **Tools** menu. ``tools_menu`` @@ -98,25 +99,28 @@ class BiblePlugin(Plugin): use it as their parent. """ log.info(u'add tools menu') - self.toolsReimportItem = QtGui.QAction(tools_menu) - self.toolsReimportItem.setObjectName(u'toolsReimportItem') - self.toolsReimportItem.setText( - translate('BiblePlugin', 'Re-&import older bible databases')) - self.toolsReimportItem.setStatusTip( - translate('BiblePlugin', 'Re-import the bible databases to addapt ' + self.toolsUpgradeItem = QtGui.QAction(tools_menu) + self.toolsUpgradeItem.setObjectName(u'toolsUpgradeItem') + self.toolsUpgradeItem.setText( + translate('BiblePlugin', '&Upgrade older bible databases')) + self.toolsUpgradeItem.setStatusTip( + translate('BiblePlugin', 'Upgrade the bible databases to addapt ' 'the database scheme.')) - tools_menu.addAction(self.toolsReimportItem) - QtCore.QObject.connect(self.toolsReimportItem, - QtCore.SIGNAL(u'triggered()'), self.onToolsReimportItemTriggered) - self.toolsReimportItem.setVisible(False) + tools_menu.addAction(self.toolsUpgradeItem) + QtCore.QObject.connect(self.toolsUpgradeItem, + QtCore.SIGNAL(u'triggered()'), self.onToolsUpgradeItemTriggered) + self.toolsUpgradeItem.setVisible(False) - def onToolsReimportItemTriggered(self): + def onToolsUpgradeItemTriggered(self): """ - Re-import older bible databases. + Upgrade older bible databases. """ - #self.manager.import_old_bible_databases() - if self.mediaItem: - self.mediaItem.onReImportClick() + if not hasattr(self, u'upgrade_wizard'): + self.upgrade_wizard = BibleUpgradeForm(self.formparent, + self.manager, self) + # If the import was not cancelled then reload. + if self.upgrade_wizard.exec_(): + self.mediaItem.reloadBibles() def onBibleImportClick(self): if self.mediaItem: diff --git a/openlp/plugins/bibles/forms/__init__.py b/openlp/plugins/bibles/forms/__init__.py index bd7ba3828..2838a5101 100644 --- a/openlp/plugins/bibles/forms/__init__.py +++ b/openlp/plugins/bibles/forms/__init__.py @@ -53,6 +53,7 @@ from the .ui files later if necessary. from booknameform import BookNameForm from languageform import LanguageForm from bibleimportform import BibleImportForm -from biblereimportform import BibleReImportForm +from bibleupgradeform import BibleUpgradeForm -__all__ = ['BibleImportForm'] +__all__ = [u'BookNameForm', u'LanguageForm', u'BibleImportForm', + u'BibleUpgradeForm'] diff --git a/openlp/plugins/bibles/forms/biblereimportform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py similarity index 84% rename from openlp/plugins/bibles/forms/biblereimportform.py rename to openlp/plugins/bibles/forms/bibleupgradeform.py index 3ca4966ba..b64231195 100644 --- a/openlp/plugins/bibles/forms/biblereimportform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -45,12 +45,12 @@ from openlp.plugins.bibles.lib.http import BSExtract, BGExtract, CWExtract log = logging.getLogger(__name__) -class BibleReImportForm(OpenLPWizard): +class BibleUpgradeForm(OpenLPWizard): """ - This is the Bible ReImport Wizard, which allows easy importing of Bibles + This is the Bible Upgrade Wizard, which allows easy importing of Bibles into OpenLP from older OpenLP2 database versions. """ - log.info(u'BibleReImportForm loaded') + log.info(u'BibleUpgradeForm loaded') def __init__(self, parent, manager, bibleplugin): """ @@ -66,7 +66,7 @@ class BibleReImportForm(OpenLPWizard): The Bible plugin. """ self.manager = manager - self.parent = parent + self.mediaItem = bibleplugin.mediaItem self.suffix = u'.sqlite' self.settingsSection = u'bibles/bibles' self.oldsettingsSection = u'bibles' @@ -80,7 +80,7 @@ class BibleReImportForm(OpenLPWizard): self.newbibles = {} self.maxBibles = len(self.files) self.stop_import_flag = False - OpenLPWizard.__init__(self, parent, bibleplugin, u'bibleImportWizard', + OpenLPWizard.__init__(self, parent, bibleplugin, u'bibleUpgradeWizard', u':/wizards/wizard_importbible.bmp') def setupUi(self, image): @@ -113,7 +113,7 @@ class BibleReImportForm(OpenLPWizard): def onCheckBoxIndexChanged(self, index): ''' - Some cleanup while finishing + Show/ Hide warnings if CheckBox state has changed ''' for number, filename in enumerate(self.files): if not self.checkBox[number].checkState() == 2: @@ -121,8 +121,8 @@ class BibleReImportForm(OpenLPWizard): self.formWidget[number].hide() else: if os.path.exists(os.path.join(self.newpath, filename)): - self.verticalWidget[number].setVisible(1) - self.formWidget[number].setVisible(1) + self.verticalWidget[number].show() + self.formWidget[number].show() def reject(self): """ @@ -161,7 +161,7 @@ class BibleReImportForm(OpenLPWizard): def customInit(self): """ - Perform any custom initialisation for bible importing. + Perform any custom initialisation for bible upgrading. """ self.manager.set_process_dialog(self) self.restart() @@ -213,7 +213,7 @@ class BibleReImportForm(OpenLPWizard): self.formWidget = {} self.formLayoutAttention = {} for number, filename in enumerate(self.files): - bible = OldBibleDB(self.parent, path=self.oldpath, file=filename) + bible = OldBibleDB(self.mediaItem, path=self.oldpath, file=filename) self.checkBox[number] = QtGui.QCheckBox(self.scrollAreaContents) checkBoxName = u'checkBox['+unicode(number)+u']' self.checkBox[number].setObjectName(checkBoxName) @@ -233,7 +233,7 @@ class BibleReImportForm(OpenLPWizard): versionInfoPixmapName = u'versionInfoPixmap['+unicode(number)+u']' self.versionInfoPixmap[number].setObjectName(versionInfoPixmapName) self.versionInfoPixmap[number].setPixmap(QtGui.QPixmap( - u':/bibles/bibles_reimport_alert.png')) + u':/bibles/bibles_upgrade_alert.png')) self.versionInfoPixmap[number].setAlignment(QtCore.Qt.AlignRight) self.horizontalLayout[number].addWidget( self.versionInfoPixmap[number]) @@ -325,41 +325,41 @@ class BibleReImportForm(OpenLPWizard): """ Allow for localisation of the bible import wizard. """ - self.setWindowTitle(translate('BiblesPlugin.ReImportWizardForm', - 'Bible ReImport Wizard')) + self.setWindowTitle(translate('BiblesPlugin.UpgradeWizardForm', + 'Bible Upgrade Wizard')) self.titleLabel.setText(WizardStrings.HeaderStyle % - translate('OpenLP.Ui', 'Welcome to the Bible ReImport Wizard')) + translate('OpenLP.Ui', 'Welcome to the Bible Upgrade Wizard')) self.informationLabel.setText( - translate('BiblesPlugin.ReImportWizardForm', - 'This wizard will help you to reimport your existing Bibles from a ' + translate('BiblesPlugin.UpgradeWizardForm', + 'This wizard will help you to upgrade your existing Bibles from a ' 'prior version of OpenLP 2. Click the next button below to start ' - 'the process by selecting the bibles to reimport.')) + 'the process by selecting the bibles to upgrade.')) self.selectPage.setTitle( - translate('BiblesPlugin.ReImportWizardForm', + translate('BiblesPlugin.UpgradeWizardForm', 'Please choose')) self.selectPage.setSubTitle( - translate('BiblesPlugin.ReImportWizardForm', - 'Please choose the bibles which should be reimported')) + translate('BiblesPlugin.UpgradeWizardForm', + 'Please choose the bibles which should be upgraded')) for number, bible in enumerate(self.files): self.versionNameLabel[number].setText( - translate('BiblesPlugin.ReImportWizardForm', 'Version name:')) + translate('BiblesPlugin.UpgradeWizardForm', 'Version name:')) self.versionInfoLabel[number].setText( - translate('BiblesPlugin.ReImportWizardForm', 'This ' + translate('BiblesPlugin.UpgradeWizardForm', 'This ' 'bible still exists. Please change the name or uncheck it.')) self.progressPage.setTitle(WizardStrings.Importing) self.progressPage.setSubTitle( - translate('BiblesPlugin.ReImportWizardForm', - 'Please wait while your Bibles are imported.')) + translate('BiblesPlugin.UpgradeWizardForm', + 'Please wait while your Bibles are upgraded.')) self.progressLabel.setText(WizardStrings.Ready) self.progressBar.setFormat(u'%p%') self.deleteCheckBox.setText( - translate('BiblesPlugin.ReImportWizardForm', 'Delete old bible ' - 'database(s) from bibles which was imported\nsucessful right now')) + translate('BiblesPlugin.UpgradeWizardForm', 'Delete old bible ' + 'database(s) from bibles which was upgraded\nsucessful right now')) self.deleteAllCheckBox.setText( - translate('BiblesPlugin.ReImportWizardForm', 'Delete all old bible ' - 'database(s) (including not imported bibles)')) + translate('BiblesPlugin.UpgradeWizardForm', 'Delete all old bible ' + 'database(s) (including not upgraded bibles)')) self.progressLabelAfter.setText( - translate('BiblesPlugin.ReImportWizardForm', '\nIf OpenLP should ' + translate('BiblesPlugin.UpgradeWizardForm', '\nIf OpenLP should ' 'delete the old bible databases please choose:')) def validateCurrentPage(self): @@ -373,21 +373,21 @@ class BibleReImportForm(OpenLPWizard): if not self.checkBox[number].checkState() == 2: continue version_name = unicode(self.versionNameEdit[number].text()) - oldbible = OldBibleDB(self.parent, path=self.oldpath, + oldbible = OldBibleDB(self.mediaItem, path=self.oldpath, file=filename) oldname = oldbible.get_name() if not version_name: critical_error_message_box(UiStrings().EmptyField, - translate('BiblesPlugin.ReImportWizardForm', + translate('BiblesPlugin.UpgradeWizardForm', 'You need to specify a version name for your Bible.')) self.versionNameEdit[number].setFocus() return False elif self.manager.exists(version_name): critical_error_message_box( - translate('BiblesPlugin.ReImportWizardForm', + translate('BiblesPlugin.UpgradeWizardForm', 'Bible Exists'), - translate('BiblesPlugin.ReImportWizardForm', - 'This Bible already exists. Please import ' + translate('BiblesPlugin.UpgradeWizardForm', + 'This Bible already exists. Please upgrade ' 'a different Bible, delete the existing one or ' 'uncheck.')) self.versionNameEdit[number].setFocus() @@ -395,10 +395,10 @@ class BibleReImportForm(OpenLPWizard): elif os.path.exists(os.path.join(self.newpath, filename)) and \ version_name == oldname: critical_error_message_box( - translate('BiblesPlugin.ReImportWizardForm', + translate('BiblesPlugin.UpgradeWizardForm', 'Bible Exists'), - translate('BiblesPlugin.ReImportWizardForm', - 'This Bible already exists. Please import ' + translate('BiblesPlugin.UpgradeWizardForm', + 'This Bible already exists. Please upgrade ' 'a different Bible, delete the existing one or ' 'uncheck.')) self.versionNameEdit[number].setFocus() @@ -406,10 +406,10 @@ class BibleReImportForm(OpenLPWizard): elif os.path.exists(os.path.join(self.newpath, self.clean_filename(version_name))): critical_error_message_box( - translate('BiblesPlugin.ReImportWizardForm', + translate('BiblesPlugin.UpgradeWizardForm', 'Bible Exists'), - translate('BiblesPlugin.ReImportWizardForm', - 'This Bible already exists. Please import ' + translate('BiblesPlugin.UpgradeWizardForm', + 'This Bible already exists. Please upgrade ' 'a different Bible, delete the existing one or ' 'uncheck.')) self.versionNameEdit[number].setFocus() @@ -422,7 +422,7 @@ class BibleReImportForm(OpenLPWizard): """ Set default values for the wizard pages. """ - log.debug(u'BibleReImport setDefaults') + log.debug(u'BibleUpgrade setDefaults') settings = QtCore.QSettings() settings.beginGroup(self.plugin.settingsSection) self.stop_import_flag = False @@ -440,8 +440,8 @@ class BibleReImportForm(OpenLPWizard): for number, filename in enumerate(self.files): self.checkBox[number].setCheckState(2) if os.path.exists(os.path.join(self.newpath, filename)): - self.verticalWidget[number].setVisible(1) - self.formWidget[number].setVisible(1) + self.verticalWidget[number].show() + self.formWidget[number].show() else: self.verticalWidget[number].hide() self.formWidget[number].hide() @@ -456,24 +456,24 @@ class BibleReImportForm(OpenLPWizard): def preWizard(self): """ - Prepare the UI for the import. + Prepare the UI for the upgrade. """ OpenLPWizard.preWizard(self) self.progressLabel.setText(translate( - 'BiblesPlugin.ImportWizardForm', - 'Starting Importing bible...')) + 'BiblesPlugin.UpgradeWizardForm', + 'Starting upgrading bible(s)...')) Receiver.send_message(u'openlp_process_events') def performWizard(self): """ - Perform the actual import. + Perform the actual upgrade. """ include_webbible = False proxy_server = None if self.maxBibles == 0: self.progressLabel.setText( - translate('BiblesPlugin.ReImportWizardForm', 'Sorry, but OpenLP' - ' could not find a Bible to reimport.')) + translate('BiblesPlugin.UpgradeWizardForm', 'Sorry, but OpenLP' + ' could not find a Bible to upgrade.')) self.progressBar.hide() return self.maxBibles = 0 @@ -487,24 +487,25 @@ class BibleReImportForm(OpenLPWizard): if not self.checkBox[biblenumber].checkState() == 2: continue self.progressBar.reset() - oldbible = OldBibleDB(self.parent, path=self.oldpath, file=filename) + oldbible = OldBibleDB(self.mediaItem, path=self.oldpath, + file=filename) name = oldbible.get_name() if name is None: delete_file(os.path.join(self.oldpath, filename)) self.incrementProgressBar(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Reimporting Bible %s of %s: "%s"\nFailed')) % + 'BiblesPlugin.UpgradeWizardForm', + 'Upgrading Bible %s of %s: "%s"\nFailed')) % (number+1, self.maxBibles, name), self.progressBar.maximum()-self.progressBar.value()) number += 1 continue self.progressLabel.setText(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Reimporting Bible %s of %s: "%s"\nImporting ...')) % + 'BiblesPlugin.UpgradeWizardForm', + 'Upgrading Bible %s of %s: "%s"\nImporting ...')) % (number+1, self.maxBibles, name)) if os.path.exists(os.path.join(self.newpath, filename)): name = unicode(self.versionNameEdit[biblenumber].text()) - self.newbibles[number] = BibleDB(self.parent, path=self.oldpath, + self.newbibles[number] = BibleDB(self.mediaItem, path=self.oldpath, name=name) metadata = oldbible.get_metadata() webbible = False @@ -538,16 +539,16 @@ class BibleReImportForm(OpenLPWizard): clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] critical_error_message_box( - translate('BiblesPlugin.ReImportWizardForm', + translate('BiblesPlugin.UpgradeWizardForm', 'Download Error'), - translate('BiblesPlugin.ReImportWizardForm', - 'To Re-Import your webbibles a Internet connection is ' + translate('BiblesPlugin.UpgradeWizardForm', + 'To upgrade your webbibles a Internet connection is ' 'necessary. Please check your Internet connection, and ' 'if this error continues to occur please consider ' 'reporting a bug.')) self.incrementProgressBar(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Reimporting Bible %s of %s: "%s"\nFailed')) % + 'BiblesPlugin.UpgradeWizardForm', + 'Upgrading Bible %s of %s: "%s"\nFailed')) % (number+1, self.maxBibles, name), self.progressBar.maximum()-self.progressBar.value()) number += 1 @@ -562,14 +563,14 @@ class BibleReImportForm(OpenLPWizard): else: language_id = self.newbibles[number].get_language() if not language_id: - log.exception(u'Re-Importing from "%s" '\ + log.exception(u'Upgrading from "%s" '\ 'failed' % filename) delete_database(self.newpath, self.newbibles[number].\ clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] self.incrementProgressBar(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Reimporting Bible %s of %s: "%s"\nFailed')) % + 'BiblesPlugin.UpgradeWizardForm', + 'Upgrading Bible %s of %s: "%s"\nFailed')) % (number+1, self.maxBibles, name), self.progressBar.maximum()-self.progressBar.value()) number += 1 @@ -577,8 +578,8 @@ class BibleReImportForm(OpenLPWizard): self.progressBar.setMaximum(len(books)) for book in books: self.incrementProgressBar(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Reimporting Bible %s of %s: "%s"\n' + 'BiblesPlugin.UpgradeWizardForm', + 'Upgrading Bible %s of %s: "%s"\n' 'Importing %s ...')) % (number+1, self.maxBibles, name, book)) book_ref_id = self.newbibles[number].\ @@ -608,8 +609,8 @@ class BibleReImportForm(OpenLPWizard): clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] self.incrementProgressBar(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Reimporting Bible %s of %s: "%s"\nFailed')) % + 'BiblesPlugin.UpgradeWizardForm', + 'Upgrading Bible %s of %s: "%s"\nFailed')) % (number+1, self.maxBibles, name), self.progressBar.maximum()-self.progressBar.value()) number += 1 @@ -618,8 +619,8 @@ class BibleReImportForm(OpenLPWizard): self.progressBar.setMaximum(len(books)) for book in books: self.incrementProgressBar(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Reimporting Bible %s of %s: "%s"\n' + 'BiblesPlugin.UpgradeWizardForm', + 'Upgrading Bible %s of %s: "%s"\n' 'Importing %s ...')) % (number+1, self.maxBibles, name, book[u'name'])) book_ref_id = self.newbibles[number].\ @@ -643,19 +644,19 @@ class BibleReImportForm(OpenLPWizard): Receiver.send_message(u'openlp_process_events') if not bible_failed: self.incrementProgressBar(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Reimporting Bible %s of %s: "%s"\n' + 'BiblesPlugin.UpgradeWizardForm', + 'Upgrading Bible %s of %s: "%s"\n' 'Done')) % (number+1, self.maxBibles, name)) self.success[biblenumber] = True else: self.incrementProgressBar(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Reimporting Bible %s of %s: "%s"\nFailed')) % + 'BiblesPlugin.UpgradeWizardForm', + 'Upgrading Bible %s of %s: "%s"\nFailed')) % (number+1, self.maxBibles, name), self.progressBar.maximum()-self.progressBar.value()) number += 1 - self.parent.reloadBibles() + self.mediaItem.reloadBibles() successful_import = 0 failed_import = 0 for number, success in self.success.iteritems(): @@ -665,34 +666,34 @@ class BibleReImportForm(OpenLPWizard): failed_import += 1 if failed_import > 0: failed_import_text = unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - ' - %s reimport fail')) % failed_import + 'BiblesPlugin.UpgradeWizardForm', + ' - %s upgrade fail')) % failed_import else: failed_import_text = u'' if successful_import > 0: if include_webbible: self.progressLabel.setText(unicode( - translate('BiblesPlugin.ReImportWizardForm', 'Reimport %s ' + translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade %s ' 'bible(s) successful%s.\nPlease note, that verses from ' 'webbibles will be downloaded\non demand and thus an ' 'internet connection is required.')) % (successful_import, failed_import_text)) else: self.progressLabel.setText(unicode( - translate('BiblesPlugin.ReImportWizardForm', 'Reimport %s ' + translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade %s ' 'bible(s) successful.%s')) % (successful_import, failed_import_text)) - self.deleteCheckBox.setVisible(1) + self.deleteCheckBox.show() bibles = u'' for bible in self.newbibles.itervalues(): name = bible.get_name() bibles += u'\n"' + name + u'"' self.deleteCheckBox.setToolTip(unicode(translate( - 'BiblesPlugin.ReImportWizardForm', - 'Sucessful imported bible(s):%s')) % bibles) + 'BiblesPlugin.UpgradeWizardForm', + 'Sucessful upgraded bible(s):%s')) % bibles) else: self.progressLabel.setText( - translate('BiblesPlugin.ReImportWizardForm', 'Reimport ' + translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade ' 'failed.')) - self.progressLabelAfter.setVisible(1) - self.deleteAllCheckBox.setVisible(1) + self.progressLabelAfter.show() + self.deleteAllCheckBox.show() diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index c2b2fa1b1..8e0eec849 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -35,7 +35,7 @@ from sqlalchemy import Column, ForeignKey, or_, Table, types from sqlalchemy.orm import class_mapper, mapper, relation from sqlalchemy.orm.exc import UnmappedClassError -from openlp.core.lib import Receiver, translate +from openlp.core.lib import Receiver, translate, check_directory_exists from openlp.core.lib.db import BaseModel, init_db, Manager from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation @@ -295,14 +295,14 @@ class BibleDB(QtCore.QObject, Manager): The name of the book to return. """ log.debug(u'BibleDB.get_book("%s")', book) - db_book = self.get_object_filtered(Book, Book.name.like(book + u'%')) - return db_book + return self.get_object_filtered(Book, Book.name.like(book + u'%')) def get_books(self): """ A wrapper so both local and web bibles have a get_books() method that manager can call. Used in the media manager advanced search tab. """ + log.debug(u'BibleDB.get_books()') return self.get_all_objects(Book, order_by_ref=Book.id) def get_book_by_book_ref_id(self, id): @@ -313,9 +313,7 @@ class BibleDB(QtCore.QObject, Manager): The reference id of the book to return. """ log.debug(u'BibleDB.get_book_by_book_ref_id("%s")', id) - db_book = self.get_object_filtered(Book, - Book.book_reference_id.like(id)) - return db_book + return self.get_object_filtered(Book, Book.book_reference_id.like(id)) def get_book_ref_id_by_name(self, book, language_id=None): log.debug(u'BibleDB.get_book_ref_id_by_name:("%s", "%s")', book, @@ -421,16 +419,16 @@ class BibleDB(QtCore.QObject, Manager): verses = verses.all() return verses - def get_chapter_count(self, book_id): + def get_chapter_count(self, book): """ Return the number of chapters in a book. ``book`` - The book to get the chapter count for. + The book object to get the chapter count for. """ - log.debug(u'BibleDB.get_chapter_count("%s")', book_id) + log.debug(u'BibleDB.get_chapter_count("%s")', book.name) count = self.session.query(Verse.chapter).join(Book)\ - .filter(Book.book_reference_id==book_id)\ + .filter(Book.name==book.name)\ .distinct().count() if not count: return 0 @@ -541,16 +539,16 @@ class BiblesResourcesDB(QtCore.QObject, Manager): log.debug(u'BiblesResourcesDB.get_books()') books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' u'abbreviation, chapters FROM book_reference ORDER BY id') - book_list = [] - for book in books: - book_list.append({ - u'id': book[0], - u'testament_id': book[1], - u'name': unicode(book[2]), - u'abbreviation': unicode(book[3]), - u'chapters': book[4] - }) - return book_list + return [ + { + u'id': book[0], + u'testament_id': book[1], + u'name': unicode(book[2]), + u'abbreviation': unicode(book[3]), + u'chapters': book[4] + } + for book in books + ] @staticmethod def get_book(name): @@ -700,16 +698,16 @@ class BiblesResourcesDB(QtCore.QObject, Manager): u'language_id, download_source_id FROM webbibles WHERE ' u'download_source_id = ?', (source[u'id'],)) if bibles: - bibles_temp = [] - for bible in bibles: - bibles_temp.append({ - u'id': bible[0], - u'name': bible[1], - u'abbreviation': bible[2], - u'language_id': bible[3], - u'download_source_id': bible[4] - }) - return bibles_temp + return [ + { + u'id': bible[0], + u'name': bible[1], + u'abbreviation': bible[2], + u'language_id': bible[3], + u'download_source_id': bible[4] + } + for bible in bibles + ] else: return None @@ -736,14 +734,13 @@ class BiblesResourcesDB(QtCore.QObject, Manager): u'download_source_id = ? AND abbreviation = ?', (source[u'id'], abbreviation)) if bible: - bibles_temp = { + return { u'id': bible[0][0], u'name': bible[0][1], u'abbreviation': bible[0][2], u'language_id': bible[0][3], u'download_source_id': bible[0][4] } - return bibles_temp else: return None @@ -806,14 +803,14 @@ class BiblesResourcesDB(QtCore.QObject, Manager): languages = BiblesResourcesDB.run_sql(u'SELECT id, name, code FROM ' u'language ORDER by name') if languages: - languages_temp = [] - for language in languages: - languages_temp.append({ - u'id': language[0], - u'name': unicode(language[1]), - u'code': unicode(language[2]) - }) - return languages_temp + return [ + { + u'id': language[0], + u'name': unicode(language[1]), + u'code': unicode(language[2]) + } + for language in languages + ] else: return None @@ -825,13 +822,13 @@ class BiblesResourcesDB(QtCore.QObject, Manager): log.debug(u'BiblesResourcesDB.get_testament_reference()') testaments = BiblesResourcesDB.run_sql(u'SELECT id, name FROM ' u'testament_reference ORDER BY id') - testament_list = [] - for testament in testaments: - testament_list.append({ - u'id': testament[0], - u'name': unicode(testament[1]) - }) - return testament_list + return [ + { + u'id': testament[0], + u'name': unicode(testament[1]) + } + for testament in testaments + ] class AlternativeBookNamesDB(QtCore.QObject, Manager): @@ -849,12 +846,8 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager): database doesn't exist. """ if AlternativeBookNamesDB.cursor is None: - if not os.path.exists(os.path.join( - AppLocation.get_directory(AppLocation.DataDir), u'bibles', - u'resources')): - os.mkdir(os.path.join( - AppLocation.get_directory(AppLocation.DataDir), u'bibles', - u'resources')) + check_directory_exists(os.path.join(AppLocation.get_directory( + AppLocation.DataDir), u'bibles', u'resources')) filepath = os.path.join( AppLocation.get_directory(AppLocation.DataDir), u'bibles', u'resources', u'alternative_book_names.sqlite') @@ -933,10 +926,9 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager): """ log.debug(u'AlternativeBookNamesDB.create_alternative_book_name("%s", ' '"%s", "%s"', name, book_reference_id, language_id) - alternative_book_name = AlternativeBookNamesDB.run_sql(u'INSERT INTO ' + return AlternativeBookNamesDB.run_sql(u'INSERT INTO ' u'alternative_book_names(book_reference_id, language_id, name) ' u'VALUES (?, ?, ?)', (book_reference_id, language_id, name), True) - return alternative_book_name class OldBibleDB(QtCore.QObject, Manager): @@ -1014,15 +1006,15 @@ class OldBibleDB(QtCore.QObject, Manager): metadata = self.run_sql(u'SELECT key, value FROM metadata ' u'ORDER BY rowid') if metadata: - metadata_list = [] - for meta in metadata: - metadata_list.append({ - u'key': unicode(meta[0]), - u'value': unicode(meta[1]) - }) + return [ + { + u'key': unicode(meta[0]), + u'value': unicode(meta[1]) + } + for meta in metadata + ] else: - metadata_list = None - return metadata_list + return None def get_books(self): """ @@ -1030,15 +1022,16 @@ class OldBibleDB(QtCore.QObject, Manager): """ books = self.run_sql(u'SELECT name, id FROM book ORDER BY id') if books: + return [ + { + u'name': unicode(book[0]), + u'id':int(book[1]) + } + for book in books + ] book_list = [] - for book in books: - book_list.append({ - u'name': unicode(book[0]), - u'id':int(book[1]) - }) else: - book_list = None - return book_list + return None def get_verses(self, book_id): """ @@ -1047,15 +1040,14 @@ class OldBibleDB(QtCore.QObject, Manager): verses = self.run_sql(u'SELECT book_id, chapter, verse, text FROM ' u'verse WHERE book_id = ? ORDER BY id', (book_id, )) if verses: - verse_list = [] - for verse in verses: - verse_list.append({ - u'book_id': int(verse[0]), - u'chapter': int(verse[1]), - u'verse': int(verse[2]), - u'text': unicode(verse[3]) - }) + return [ + { + u'book_id': int(verse[0]), + u'chapter': int(verse[1]), + u'verse': int(verse[2]), + u'text': unicode(verse[3]) + } + for verse in verses + ] else: - verse_list = None - return verse_list - + return None diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 9795b0120..b799f24a9 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -241,10 +241,10 @@ class BSExtract(object): send_error_message(u'parse') return None content = content.findAll(u'li') - books = [] - for book in content: + return [ books.append(book.contents[0].contents[0]) - return books + for book in content + ] class CWExtract(object): @@ -507,12 +507,15 @@ class HTTPBible(BibleDB): log.debug(u'HTTPBible.get_books("%s")', Book.name) return self.get_all_objects(Book, order_by_ref=Book.id) - def get_chapter_count(self, book_id): + def get_chapter_count(self, book): """ Return the number of chapters in a particular book. + + ``book`` + The book object to get the chapter count for. """ - log.debug(u'HTTPBible.get_chapter_count("%s")', book_id) - return BiblesResourcesDB.get_chapter_count(book_id) + log.debug(u'HTTPBible.get_chapter_count("%s")', book.name) + return BiblesResourcesDB.get_chapter_count(book.book_reference_id) def get_verse_count(self, book_id, chapter): """ diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index cab665179..7d8ca77db 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -208,23 +208,27 @@ class BibleManager(object): Unicode. The Bible to get the list of books from. """ log.debug(u'BibleManager.get_books("%s")', bible) - language_id = self.get_meta_data(bible, u'language_id') - books = [] - for book in self.db_cache[bible].get_books(): - books.append( + return [ { - u'name': book.name, - u'chapters': self.db_cache[bible].get_chapter_count( - book.book_reference_id) - }) - return books + u'name': book.name, + u'chapters': self.db_cache[bible].get_chapter_count( + book) + } + for book in self.db_cache[bible].get_books() + ] def get_chapter_count(self, bible, book): """ Returns the number of Chapters for a given book. + + ``bible`` + Unicode. The Bible to get the list of books from. + + ``book`` + The book object to get the chapter count for. """ log.debug(u'BibleManager.get_book_chapter_count ("%s", "%s")', bible, - book) + book.name) return self.db_cache[bible].get_chapter_count(book) def get_verse_count(self, bible, book, chapter): diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index ec65a37d0..d902772b8 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -33,7 +33,7 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings, add_widget_completer, \ media_item_combo_box, critical_error_message_box, find_and_set_in_combo_box -from openlp.plugins.bibles.forms import BibleImportForm, BibleReImportForm +from openlp.plugins.bibles.forms import BibleImportForm from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ VerseReferenceList, get_reference_match @@ -310,14 +310,6 @@ class BibleMediaItem(MediaManagerItem): if self.import_wizard.exec_(): self.reloadBibles() - def onReImportClick(self): - if not hasattr(self, u'reimport_wizard'): - self.reimport_wizard = BibleReImportForm(self, self.parent.manager, - self.parent) - # If the import was not cancelled then reload. - if self.reimport_wizard.exec_(): - self.reloadBibles() - def loadBibles(self): log.debug(u'Loading Bibles') self.quickVersionComboBox.clear() diff --git a/resources/images/bibles_reimport_alert.png b/resources/images/bibles_upgrade_alert.png similarity index 100% rename from resources/images/bibles_reimport_alert.png rename to resources/images/bibles_upgrade_alert.png diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index f3bfd100e..785250ab7 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -24,7 +24,7 @@ bibles_search_text.png bibles_search_reference.png - bibles_reimport_alert.png + bibles_upgrade_alert.png plugin_alerts.png From 3b99f531f33e62e8e4443dac8a350ac61b7ca50e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Tue, 26 Apr 2011 20:39:08 +0200 Subject: [PATCH 030/124] small fixes --- openlp/plugins/bibles/forms/bibleupgradeform.py | 2 +- openlp/plugins/bibles/lib/http.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index b64231195..b08454374 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -359,7 +359,7 @@ class BibleUpgradeForm(OpenLPWizard): translate('BiblesPlugin.UpgradeWizardForm', 'Delete all old bible ' 'database(s) (including not upgraded bibles)')) self.progressLabelAfter.setText( - translate('BiblesPlugin.UpgradeWizardForm', '\nIf OpenLP should ' + translate('BiblesPlugin.UpgradeWizardForm', 'If OpenLP should ' 'delete the old bible databases please choose:')) def validateCurrentPage(self): diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index b799f24a9..fb60a2b1a 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -242,8 +242,7 @@ class BSExtract(object): return None content = content.findAll(u'li') return [ - books.append(book.contents[0].contents[0]) - for book in content + book.contents[0].contents[0] for book in content ] From 2f346ee450310fd117f690d02b40920d8be680be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Tue, 26 Apr 2011 20:55:13 +0200 Subject: [PATCH 031/124] small changes --- openlp/plugins/bibles/lib/db.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 8e0eec849..feeeb9b4f 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -78,7 +78,7 @@ def init_schema(url): book_table = Table(u'book', metadata, Column(u'id', types.Integer, primary_key=True), - Column(u'book_reference_id', types.Integer), + Column(u'book_reference_id', types.Integer, index=True), Column(u'testament_reference_id', types.Integer), Column(u'name', types.Unicode(50), index=True), ) @@ -428,7 +428,7 @@ class BibleDB(QtCore.QObject, Manager): """ log.debug(u'BibleDB.get_chapter_count("%s")', book.name) count = self.session.query(Verse.chapter).join(Book)\ - .filter(Book.name==book.name)\ + .filter(Book.book_reference_id==book.book_reference_id)\ .distinct().count() if not count: return 0 From b4c3d1d5ae5afcbf13d8d4a29a7a4764b7e69ff1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Mon, 2 May 2011 06:21:18 +0200 Subject: [PATCH 032/124] code cleaning --- openlp/plugins/bibles/lib/db.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index feeeb9b4f..abc17b194 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -1029,7 +1029,6 @@ class OldBibleDB(QtCore.QObject, Manager): } for book in books ] - book_list = [] else: return None From 3eca8f6b505b45d8c14f18439083e9c2251afcc2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Mon, 2 May 2011 15:45:30 +0200 Subject: [PATCH 033/124] updated bibles_resources.sqlite with some additional apocryph books comparing books with lower() display only which are not added to a bible in BookNameForm small fixes --- .../plugins/bibles/forms/bibleupgradeform.py | 7 +- openlp/plugins/bibles/forms/booknameform.py | 10 ++- openlp/plugins/bibles/lib/db.py | 69 +++++++++++------- .../bibles/resources/bibles_resources.sqlite | Bin 101376 -> 101376 bytes 4 files changed, 57 insertions(+), 29 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index b08454374..92d704690 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -27,7 +27,7 @@ The bible import functions for OpenLP """ import logging -import os +#import os import os.path import re @@ -637,6 +637,11 @@ class BibleUpgradeForm(OpenLPWizard): db_book = self.newbibles[number].create_book(book[u'name'], book_ref_id, book_details[u'testament_id']) verses = oldbible.get_verses(book[u'id']) + if not verses: + log.exception(u'No verses found to import for book ' + u'"%s"', book[u'name']) + self.newbibles[number].delete_book(db_book) + continue for verse in verses: self.newbibles[number].create_verse(db_book.id, int(verse[u'chapter']), diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index b8bdbb493..84e1deb96 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -53,13 +53,19 @@ class BookNameForm(QDialog, Ui_BookNameDialog): QDialog.__init__(self, parent) self.setupUi(self) - def exec_(self, name): + def exec_(self, name, books): items = [] self.requestComboBox.addItem(u'') self.requestLabel.setText(name) items = BiblesResourcesDB.get_books() for item in items: - self.requestComboBox.addItem(item[u'name']) + addBook = True + for book in books: + if book.book_reference_id == item[u'id']: + addBook = False + break + if addBook == True: + self.requestComboBox.addItem(item[u'name']) return QDialog.exec_(self) def accept(self): diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index abc17b194..a53413063 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -218,6 +218,18 @@ class BibleDB(QtCore.QObject, Manager): self.save_object(book) return book + def delete_book(self, db_book): + """ + Delete a book from the database. + + ``db_book`` + The book objekt. + """ + log.debug(u'BibleDB.delete_book("%s")', db_book.name) + if self.delete_object(Book, db_book.id): + return True + return False + def create_chapter(self, book_id, chapter, textlist): """ Add a chapter and its verses to a book. @@ -318,8 +330,8 @@ class BibleDB(QtCore.QObject, Manager): def get_book_ref_id_by_name(self, book, language_id=None): log.debug(u'BibleDB.get_book_ref_id_by_name:("%s", "%s")', book, language_id) - if BiblesResourcesDB.get_book(book): - book_temp = BiblesResourcesDB.get_book(book) + if BiblesResourcesDB.get_book(book, True): + book_temp = BiblesResourcesDB.get_book(book, True) book_id = book_temp[u'id'] elif BiblesResourcesDB.get_alternative_book_name(book, language_id): book_id = BiblesResourcesDB.get_alternative_book_name(book, @@ -332,7 +344,7 @@ class BibleDB(QtCore.QObject, Manager): from openlp.plugins.bibles.forms import BookNameForm book_ref = None book_name = BookNameForm(self.wizard) - if book_name.exec_(book): + if book_name.exec_(book, self.get_books()): book_ref = unicode(book_name.requestComboBox.currentText()) if not book_ref: return None @@ -551,7 +563,7 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ] @staticmethod - def get_book(name): + def get_book(name, lower=False): """ Return a book by name or abbreviation. @@ -561,9 +573,15 @@ class BiblesResourcesDB(QtCore.QObject, Manager): log.debug(u'BiblesResourcesDB.get_book("%s")', name) if not isinstance(name, unicode): name = unicode(name) - books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' - u'abbreviation, chapters FROM book_reference WHERE name = ? OR ' - u'abbreviation = ?', (name, name)) + if lower: + books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' + u'abbreviation, chapters FROM book_reference WHERE ' + u'LOWER(name) = ? OR LOWER(abbreviation) = ?', + (name.lower(), name.lower())) + else: + books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, ' + u'abbreviation, chapters FROM book_reference WHERE name = ?' + u' OR abbreviation = ?', (name, name)) if books: return { u'id': books[0][0], @@ -758,17 +776,16 @@ class BiblesResourcesDB(QtCore.QObject, Manager): log.debug(u'BiblesResourcesDB.get_alternative_book_name("%s", "%s")', name, language_id) if language_id: - id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' - u'FROM alternative_book_names WHERE name = ? and language_id ' - u'= ? ORDER BY id', (name, language_id)) + books = BiblesResourcesDB.run_sql(u'SELECT book_reference_id, name ' + u'FROM alternative_book_names WHERE language_id = ? ORDER BY ' + u'id', (language_id, )) else: - id = BiblesResourcesDB.run_sql(u'SELECT book_reference_id ' - u'FROM alternative_book_names WHERE name = ? ORDER BY id', - (name, )) - if id: - return int(id[0][0]) - else: - return None + books = BiblesResourcesDB.run_sql(u'SELECT book_reference_id, name ' + u'FROM alternative_book_names ORDER BY id') + for book in books: + if book[1].lower() == name.lower(): + return book[0] + return None @staticmethod def get_language(name): @@ -899,16 +916,16 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager): log.debug(u'AlternativeBookNamesDB.get_book_reference_id("%s", "%s")', name, language_id) if language_id: - id = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id FROM' - u' alternative_book_names WHERE name = ? AND language_id = ?', - (name, language_id)) + books = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id, ' + u'name FROM alternative_book_names WHERE language_id = ?', + (language_id, )) else: - id = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id FROM' - u' alternative_book_names WHERE name = ?', name) - if not id: - return None - else: - return id[0][0] + books = AlternativeBookNamesDB.run_sql(u'SELECT book_reference_id, ' + u'name FROM alternative_book_names') + for book in books: + if book[1].lower() == name.lower(): + return book[0] + return None @staticmethod def create_alternative_book_name(name, book_reference_id, language_id): diff --git a/openlp/plugins/bibles/resources/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite index 4645fcf9ca76a4d0aecb2a5d227198e2f2a696bc..302c6a1c83ff0b9b7530a7df2ddf34f2737089d9 100644 GIT binary patch delta 2172 zcmai!TWpj?6oAi}+3wDk?F~xrT`0B9ZlU(J-9k(0ozj-l%T@uUNNFpry(KIl7?Ul= zM3{gn854<7RP@2bAi^4Bf)GgX1!IEvAP+_e7<@21kQ!p5F`n}erNkHdcQ)U-pE)!C zKYP+Wd(u6Zn{*ohhG{u}CjvDIx1sb--no&FWU`bGSeq#SmJj8Fc$({u6orxaLyy;m z1LuA2RCS;2$?`tgevuj3EJ0GTEWk}L15p@-A;>$u(v_G*dX(2dUL()TG8`Ik1NIf5 ztb~=&MxG22bNrJcxtXh(XLk5Bv$g!*#d_ zpTWEECN)|t`|#;~bq_3+LE7gi?50jf;Z^FsHdPjpY6$kwGX&#MlrBph#cmQO=-E%J zkOSK(WSUl#yrO_+t}3(HC-bol?8Z~riG@*$7^mM!$l>g5aF9kjLW!avtRf2gV2nKW zLYnba=9=oN>{yOmhpnXBPd2v9P_Y@9fNLd0C{!iN zY;30RN$BUGW(wL%8HcG_JNMc|2|2`Xg<+}{g*9B-TsfLyJ}%Eo&B|U9ZR7RkVtH<0LEl9^Pt$Cp;N#5fx{$fSFPqTZ zD$T(%^HybkW`?Z53bGGS2)D^IIs{>Jy`pdp*Jj(3wY^+}m5a64J6mbc8JjmP7#AB@ z!VR$hLIWH4-mv2T_xVXV2ocj*xkBd2db6t}ds|W>UAPiB1@wOwF2PUmEBpa}p@(i} z5r(lHNANg)is$eu{)oTfybvN&l!$uKFQ&vh;-a`A?n;*|k{e`?+##procu(dm!>b& zUd0`D(5(0-4$<~A`OWNf=FJzcj>pjHT#r#2k>g_yei1gWhttaVNIU6RM#$d8iL9`P z#3*jUdNwLOYSB%;BZM)koUm5uVXJn9l-_MoKBM%IML|vMvWNkt zUve2dZ?%ZD(dQlP z#}cKVbFdE^l^$@g7h9E%IM{=fxZlC9rCCb%Sxh7BwV0Z%bdSZ9l}c~1n4GS3H)9OD zl5&;aY}LMHN_SaYLfTG?iOZGlu;`@}n=Gn)rQ0ofGL_zF(Osx?o5h4;rCTk!a+Ged zC@ER9ML}K0nk*y5H9FYI*%~amgGz6(m_SEfZ_!05)?1V`wK|KUK84D>3oGdw*k$)x@Uy*x1lUeK4WXqz(4L*o{?VW1ac81omWdX1|#;^PO+b zKfmgjUv;c_Qda@s1-2A6jFktIR-x(__osbl$))HvgHTHU(rqgvbCaxpoDKuK&bb`v z<_!s@(G3p#OxdZKRD~hvhe@_k7=j)cgxs|vW3Qy$`&IH@#wL5|JwJ{2G`q$dxrSww z*Q5S1o@sS@KXV+ffLTzbstNb0Zukj9Y7#Hwo9dK$7qiqw_!@)i2mBD{(10~KrEaRf zAr7+`rzFZIpK{R?)J+rg8m-WK^d)_dBXo^^#}l!IqFpKE#unx}0$q93fcnBxw!Y=d z*9(4+ey+wdmri9I@8SDQvpj=vSb!QRf)I@J-!W(sz`p}{Q~=)&;NWiZ+8LePXUf** zfIyP74Ly=Z#jIQptJV(@Xq1e0NbQGSTgw+2dsy%B=jc0r4{<+T{a2R0Tj?5#|wmQjr!(X7k@$U(5-DdlMOAd$xI}fC|r~sQ;vneiFnfNnmGb$8;4%wuJ?AjiE zf{8Wx3R)!6#`#k$t-PU(1n?4{>*E1LKuPyDILXmrCM-r#a&^v}Bpv49 z7@OQb0w@&QIiZ(rnAbF0sZEDtDt>FV}spF9wSA!C;{wPg`G#7h<-x9`tvT8)md~u{QQanqPg*++ml>^10K{%h!c~02pK#GIqdwaW eQHvR^PPoczM)xON>yNLl2lUIqOzUPmYxRHc@FaEs From b9204fa62b650a8c2c926eb9b4ce3ff5d0e90a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Mon, 2 May 2011 20:20:38 +0200 Subject: [PATCH 034/124] small changes --- openlp/plugins/bibles/lib/db.py | 14 +++++++------- .../bibles/resources/bibles_resources.sqlite | Bin 101376 -> 104448 bytes 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index a53413063..2311c7f00 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -333,13 +333,10 @@ class BibleDB(QtCore.QObject, Manager): if BiblesResourcesDB.get_book(book, True): book_temp = BiblesResourcesDB.get_book(book, True) book_id = book_temp[u'id'] - elif BiblesResourcesDB.get_alternative_book_name(book, language_id): - book_id = BiblesResourcesDB.get_alternative_book_name(book, - language_id) - elif AlternativeBookNamesDB.get_book_reference_id(book, - language_id): - book_id = AlternativeBookNamesDB.get_book_reference_id( - book, language_id) + elif BiblesResourcesDB.get_alternative_book_name(book): + book_id = BiblesResourcesDB.get_alternative_book_name(book) + elif AlternativeBookNamesDB.get_book_reference_id(book): + book_id = AlternativeBookNamesDB.get_book_reference_id(book) else: from openlp.plugins.bibles.forms import BookNameForm book_ref = None @@ -569,6 +566,9 @@ class BiblesResourcesDB(QtCore.QObject, Manager): ``name`` The name or abbreviation of the book. + + ``lower`` + True if the comparsion should be only lowercase """ log.debug(u'BiblesResourcesDB.get_book("%s")', name) if not isinstance(name, unicode): diff --git a/openlp/plugins/bibles/resources/bibles_resources.sqlite b/openlp/plugins/bibles/resources/bibles_resources.sqlite index 302c6a1c83ff0b9b7530a7df2ddf34f2737089d9..9336918f2d187da2a2e0a96819dfc2ceda31dabe 100644 GIT binary patch delta 2688 zcmZuzOH7nk6u$Sr3?L5yhhZFba7G4ZMi_MvwD_n>f7GfVAS&3_GQ1HObY^JPK7Nz7 ziT9=pn@L*Zvgx96rPaj5HeGblxM)mQT{P*!#x$l)nl4%}O&9&n8BiYbXNI}ocb@m0 zbMJrUdj6GL`PbIF9tj~vJ_+oTk8bxrEh=z@H@j4y%F}8^sp! z3Ye6b7D;du;9h60)Q+#2!Gz!CBeTJE0R$I#SF;m1kC*Xcc%s^uj zI=#%SVx7fIsXk4Nuh8y>YzB#(qII;ucDfPeAR^AdL`qcXlSBmb?IXw_4dH}v>mI^t zU3N1vXlHyF=m|#i?4~7XH>1klz69-J)Z&nzTj+EN2Zklby8u_{<0Kq(S9c1(e(fGQ0E&EP|upN3QhzXGBSzcXB}l-Q_`k^J7) z$Z;`(r-IB4z)%XgCdH@-+-o!PYw47t-ZkQ^P=BhQ)VJyjbycO*8MR9VRFU=6dTjk* z-L-C5SF91M)7oQglC$zx`JMb+8kv%(Ya}PMhg0uFQW=gQ zEj&gL<3x9(1PL_IG{T!f1|H4565VAVhWG%)A9Kn4`h8Mp*~y#RgY2iElgpR%{Q5oS zcd)CKd|1Cre0%e}KDBjPWLxGci^BRHrkd<*Y%b{N%e0DZw~xZXBtB_8)HObRiI{k! z-HB};2RAOx;~~zYFA^7x+igH{#&h`FjBm3Kagh@UnQ*^;i}04M91eL(!CDfmP0A!N z!vb44pTz<>zCve+55~~zv)BvLiRv_AT@7}2@~;|4r)U+c=O!P6`y?L9xXUK=vug-^}+$@ z)*+6J)SL84p&|#3kf7(62Sx-#M&Iq|$IqrV5j`t?Xpw4EjwK^IO=-O5SZe#Mj0m-AIwT zh(h<7NW1N}oL#Nv1eV>{ri{5#4t_be8k{5JCC@Ua7R)fW8(Y#30610d>71_Q7UB##sX{=uY7cwl_>4IUuDIm0^)z1F%kJoSVX%#$x@tnb= z(XqDPxCm?BZ)eM9Jw+yuSNrV7Z24^Et48tiWj(K$&!vtC z^`p9vvFley@EZ1#a@;0N8nuUTf9I~+G%Q9<9id%z^=a&28i7rt69R&6=H-)BZ)!>Q zWCz{~sM#-}h^c3?)Gu`4ZGtrG0|o|$ Date: Tue, 3 May 2011 09:41:03 +0200 Subject: [PATCH 035/124] add a dialog at startup which inform the user that the bible format has changed and provide a possibility to upgrade small cleanup --- openlp.pyw | 15 ++++++++++++++- openlp/plugins/bibles/forms/bibleupgradeform.py | 1 - 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 0d4e8c200..9196186a3 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -37,7 +37,8 @@ from traceback import format_exception from PyQt4 import QtCore, QtGui -from openlp.core.lib import Receiver, check_directory_exists +from openlp.core.lib import Receiver, check_directory_exists, SettingsManager, \ + translate from openlp.core.lib.ui import UiStrings from openlp.core.resources import qInitResources from openlp.core.ui.mainwindow import MainWindow @@ -130,6 +131,18 @@ class OpenLP(QtGui.QApplication): u'general/update check', QtCore.QVariant(True)).toBool() if update_check: VersionThread(self.mainWindow).start() + for plugin in self.mainWindow.pluginManager.plugins: + if plugin.name == u'Bibles' and plugin.isActive() and len( + SettingsManager.get_files(u'bibles/bibles', u'.sqlite')) == 0 \ + and len(SettingsManager.get_files(u'bibles', u'.sqlite')) > 0: + if QtGui.QMessageBox.information(self.mainWindow, + translate('OpenLP', 'Information'), translate('OpenLP', + 'Bible format has changed.\nYou have to upgrade your ' + 'existing bibles.\nShould OpenLP upgrade now?'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | + QtGui.QMessageBox.No)) == QtGui.QMessageBox.Yes: + plugin.onToolsUpgradeItemTriggered() + break DelayStartThread(self.mainWindow).start() return self.exec_() diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 92d704690..220942b42 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -27,7 +27,6 @@ The bible import functions for OpenLP """ import logging -#import os import os.path import re From d44b42aaff0049ddb318e8a2e530182ab04e7d85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Tue, 3 May 2011 13:44:23 +0200 Subject: [PATCH 036/124] improve BookNameForm (add possibility to reduce the books in the ComboBox and try to autodetect if a bible only contains only parts of a bible, so that only a part of the bible books are displayed at startup) --- .../plugins/bibles/forms/bibleupgradeform.py | 5 +- openlp/plugins/bibles/forms/booknamedialog.py | 33 ++++++++++-- openlp/plugins/bibles/forms/booknameform.py | 51 +++++++++++++++++-- openlp/plugins/bibles/lib/csvbible.py | 2 +- openlp/plugins/bibles/lib/db.py | 4 +- openlp/plugins/bibles/lib/http.py | 3 +- openlp/plugins/bibles/lib/openlp1.py | 3 +- openlp/plugins/bibles/lib/opensong.py | 2 +- openlp/plugins/bibles/lib/osis.py | 4 +- 9 files changed, 89 insertions(+), 18 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 220942b42..4feb4bd90 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -582,7 +582,7 @@ class BibleUpgradeForm(OpenLPWizard): 'Importing %s ...')) % (number+1, self.maxBibles, name, book)) book_ref_id = self.newbibles[number].\ - get_book_ref_id_by_name(book, language_id) + get_book_ref_id_by_name(book, len(books), language_id) if not book_ref_id: log.exception(u'Importing books from %s - download '\ u'name: "%s" aborted by user' % ( @@ -623,7 +623,8 @@ class BibleUpgradeForm(OpenLPWizard): 'Importing %s ...')) % (number+1, self.maxBibles, name, book[u'name'])) book_ref_id = self.newbibles[number].\ - get_book_ref_id_by_name(book[u'name'], language_id) + get_book_ref_id_by_name(book[u'name'], len(books), + language_id) if not book_ref_id: log.exception(u'Importing books from %s " '\ 'failed - aborted by user' % name) diff --git a/openlp/plugins/bibles/forms/booknamedialog.py b/openlp/plugins/bibles/forms/booknamedialog.py index bb48548c0..ad30812bc 100644 --- a/openlp/plugins/bibles/forms/booknamedialog.py +++ b/openlp/plugins/bibles/forms/booknamedialog.py @@ -32,7 +32,7 @@ from openlp.core.lib.ui import create_accept_reject_button_box class Ui_BookNameDialog(object): def setupUi(self, bookNameDialog): bookNameDialog.setObjectName(u'BookNameDialog') - bookNameDialog.resize(400, 175) + bookNameDialog.resize(400, 275) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) @@ -41,7 +41,7 @@ class Ui_BookNameDialog(object): .hasHeightForWidth()) bookNameDialog.setSizePolicy(sizePolicy) self.widget = QtGui.QWidget(bookNameDialog) - self.widget.setGeometry(QtCore.QRect(10, 15, 381, 151)) + self.widget.setGeometry(QtCore.QRect(10, 15, 381, 251)) self.widget.setObjectName(u'widget') self.verticalLayout = QtGui.QVBoxLayout(self.widget) self.verticalLayout.setObjectName(u'verticalLayout') @@ -75,13 +75,28 @@ class Ui_BookNameDialog(object): self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.requestComboBox) self.verticalLayout.addLayout(self.formLayout) + self.infoLabelTestaments = QtGui.QLabel(self.widget) + self.infoLabelTestaments.setObjectName(u'InfoLabelTestaments') + self.verticalLayout.addWidget(self.infoLabelTestaments) + self.checkBoxOldTestament = QtGui.QCheckBox(self.widget) + self.checkBoxOldTestament.setObjectName(u'OldTestament') + self.checkBoxOldTestament.setCheckState(2) + self.verticalLayout.addWidget(self.checkBoxOldTestament) + self.checkBoxNewTestament = QtGui.QCheckBox(self.widget) + self.checkBoxNewTestament.setObjectName(u'OldTestament') + self.checkBoxNewTestament.setCheckState(2) + self.verticalLayout.addWidget(self.checkBoxNewTestament) + self.checkBoxApocrypha = QtGui.QCheckBox(self.widget) + self.checkBoxApocrypha.setObjectName(u'OldTestament') + self.checkBoxApocrypha.setCheckState(2) + self.verticalLayout.addWidget(self.checkBoxApocrypha) + self.verticalLayout.addWidget( + create_accept_reject_button_box(bookNameDialog)) spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) - self.formLayout.addWidget( - create_accept_reject_button_box(bookNameDialog)) self.retranslateUi(bookNameDialog) - QtCore.QMetaObject.connectSlotsByName(bookNameDialog) + QtCore.QMetaObject.connectSlotsByName(self) def retranslateUi(self, bookNameDialog): bookNameDialog.setWindowTitle( @@ -93,3 +108,11 @@ class Ui_BookNameDialog(object): 'Please choose the book it is.')) self.requestLabel.setText(translate('BiblesPlugin.BookNameDialog', 'Book:')) + self.infoLabelTestaments.setText(translate( + 'BiblesPlugin.BookNameDialog', 'Show books from:')) + self.checkBoxOldTestament.setText(translate( + 'BiblesPlugin.BookNameDialog', 'Old Testament')) + self.checkBoxNewTestament.setText(translate( + 'BiblesPlugin.BookNameDialog', 'New Testament')) + self.checkBoxApocrypha.setText(translate('BiblesPlugin.BookNameDialog', + 'Apocrypha')) diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index 84e1deb96..4ad8270e6 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -30,6 +30,7 @@ Module implementing BookNameForm. import logging from PyQt4.QtGui import QDialog +from PyQt4 import QtCore from openlp.core.lib import translate from openlp.core.lib.ui import critical_error_message_box @@ -52,20 +53,64 @@ class BookNameForm(QDialog, Ui_BookNameDialog): """ QDialog.__init__(self, parent) self.setupUi(self) + self.customSignals() - def exec_(self, name, books): + def customSignals(self): + """ + Set up the signals used in the booknameform. + """ + QtCore.QObject.connect(self.checkBoxOldTestament, + QtCore.SIGNAL(u'stateChanged(int)'), + self.onCheckBoxIndexChanged) + QtCore.QObject.connect(self.checkBoxNewTestament, + QtCore.SIGNAL(u'stateChanged(int)'), + self.onCheckBoxIndexChanged) + QtCore.QObject.connect(self.checkBoxApocrypha, + QtCore.SIGNAL(u'stateChanged(int)'), + self.onCheckBoxIndexChanged) + + def onCheckBoxIndexChanged(self, index): + ''' + Reload Combobox if CheckBox state has changed + ''' + self.reloadComboBox() + + def reloadComboBox(self): + ''' + Reload the Combobox items + ''' items = [] + self.requestComboBox.clear() self.requestComboBox.addItem(u'') - self.requestLabel.setText(name) items = BiblesResourcesDB.get_books() for item in items: addBook = True - for book in books: + for book in self.books: if book.book_reference_id == item[u'id']: addBook = False break + if self.checkBoxOldTestament.checkState() == 0 and \ + item[u'testament_id'] == 1: + addBook = False + elif self.checkBoxNewTestament.checkState() == 0 and \ + item[u'testament_id'] == 2: + addBook = False + elif self.checkBoxApocrypha.checkState() == 0 and \ + item[u'testament_id'] == 3: + addBook = False if addBook == True: self.requestComboBox.addItem(item[u'name']) + + def exec_(self, name, books, maxbooks): + self.books = books + log.debug(maxbooks) + if maxbooks <= 27: + self.checkBoxOldTestament.setCheckState(0) + self.checkBoxApocrypha.setCheckState(0) + elif maxbooks <= 66: + self.checkBoxApocrypha.setCheckState(0) + self.reloadComboBox() + self.requestLabel.setText(name) return QDialog.exec_(self) def accept(self): diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index 80216a73e..a5fe59ccc 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -118,7 +118,7 @@ class CSVBible(BibleDB): translate('BibleDB.Wizard', 'Importing books... %s')) % unicode(line[2], details['encoding'])) book_ref_id = self.get_book_ref_id_by_name( - unicode(line[2], details['encoding']), language_id) + unicode(line[2], details['encoding']), 67, language_id) if not book_ref_id: log.exception(u'Importing books from "%s" '\ 'failed' % self.booksfile) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 2311c7f00..be3beac2f 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -327,7 +327,7 @@ class BibleDB(QtCore.QObject, Manager): log.debug(u'BibleDB.get_book_by_book_ref_id("%s")', id) return self.get_object_filtered(Book, Book.book_reference_id.like(id)) - def get_book_ref_id_by_name(self, book, language_id=None): + def get_book_ref_id_by_name(self, book, maxbooks, language_id=None): log.debug(u'BibleDB.get_book_ref_id_by_name:("%s", "%s")', book, language_id) if BiblesResourcesDB.get_book(book, True): @@ -341,7 +341,7 @@ class BibleDB(QtCore.QObject, Manager): from openlp.plugins.bibles.forms import BookNameForm book_ref = None book_name = BookNameForm(self.wizard) - if book_name.exec_(book, self.get_books()): + if book_name.exec_(book, self.get_books(), maxbooks): book_ref = unicode(book_name.requestComboBox.currentText()) if not book_ref: return None diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index fb60a2b1a..a7f8d1b7e 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -422,7 +422,8 @@ class HTTPBible(BibleDB): self.wizard.incrementProgressBar(unicode(translate( 'BiblesPlugin.HTTPBible', 'Importing %s...', 'Importing ...')) % book) - book_ref_id = self.get_book_ref_id_by_name(book, language_id) + book_ref_id = self.get_book_ref_id_by_name(book, len(books), + language_id) if not book_ref_id: log.exception(u'Importing books from %s - download name: "%s" '\ 'failed' % (self.download_source, self.download_name)) diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 0ed22797e..f1104ffc2 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -74,7 +74,8 @@ class OpenLP1Bible(BibleDB): testament_id = int(book[1]) name = unicode(book[2], u'cp1252') abbreviation = unicode(book[3], u'cp1252') - book_ref_id = self.get_book_ref_id_by_name(name, language_id) + book_ref_id = self.get_book_ref_id_by_name(name, len(books), + language_id) if not book_ref_id: log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index fd79cd440..48a6dc6e3 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -70,7 +70,7 @@ class OpenSongBible(BibleDB): if self.stop_import_flag: break book_ref_id = self.get_book_ref_id_by_name( - unicode(book.attrib[u'n']), language_id) + unicode(book.attrib[u'n']), len(bible.b), language_id) if not book_ref_id: log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 2735648ce..b9039677b 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -128,8 +128,8 @@ class OSISBible(BibleDB): verse_text = match.group(4) if not db_book or db_book.name != self.books[book][0]: log.debug(u'New book: "%s"' % self.books[book][0]) - book_ref_id = self.get_book_ref_id_by_name( - unicode(self.books[book][0]), language_id) + book_ref_id = self.get_book_ref_id_by_name(unicode( + self.books[book][0]), 67, language_id) if not book_ref_id: log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) From 368987bb67461c9393c3a205a0d0401c3432c688 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Tue, 3 May 2011 19:09:30 +0200 Subject: [PATCH 037/124] code cleanup --- .../plugins/bibles/forms/bibleimportform.py | 17 ++--------- .../plugins/bibles/forms/bibleupgradeform.py | 30 ++++++------------- openlp/plugins/bibles/lib/csvbible.py | 2 +- openlp/plugins/bibles/lib/db.py | 28 ++++++++--------- 4 files changed, 26 insertions(+), 51 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index a85230611..edecbd89c 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -40,7 +40,7 @@ from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.utils import AppLocation, string_is_unicode from openlp.plugins.bibles.lib.manager import BibleFormat -from openlp.plugins.bibles.lib.db import BiblesResourcesDB +from openlp.plugins.bibles.lib.db import BiblesResourcesDB, clean_filename log = logging.getLogger(__name__) @@ -494,7 +494,7 @@ class BibleImportForm(OpenLPWizard): 'a different Bible or first delete the existing one.')) self.versionNameEdit.setFocus() return False - elif os.path.exists(os.path.join(path, self.clean_filename( + elif os.path.exists(os.path.join(path, clean_filename( license_version))): critical_error_message_box( translate('BiblesPlugin.ImportWizardForm', 'Bible Exists'), @@ -507,19 +507,6 @@ class BibleImportForm(OpenLPWizard): if self.currentPage() == self.progressPage: return True - def clean_filename(self, old_filename): - """ - Clean up the version name of the Bible and convert it into a valid - file name. - - ``old_filename`` - The "dirty" file name or version name. - """ - if not isinstance(old_filename, unicode): - old_filename = unicode(old_filename, u'utf-8') - old_filename = re.sub(r'[^\w]+', u'_', old_filename).strip(u'_') - return old_filename + u'.sqlite' - def onWebSourceComboBoxIndexChanged(self, index): """ Setup the list of Bibles when you select a different source on the web diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 4feb4bd90..52e2651cd 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -38,7 +38,7 @@ from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.ui.wizard import OpenLPWizard, WizardStrings from openlp.core.utils import AppLocation, delete_file from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB,\ - BiblesResourcesDB + BiblesResourcesDB, clean_filename from openlp.plugins.bibles.lib.http import BSExtract, BGExtract, CWExtract log = logging.getLogger(__name__) @@ -97,19 +97,6 @@ class BibleUpgradeForm(OpenLPWizard): log.debug(u'Stopping import') self.stop_import_flag = True - def clean_filename(self, old_filename): - """ - Clean up the version name of the Bible and convert it into a valid - file name. - - ``old_filename`` - The "dirty" file name or version name. - """ - if not isinstance(old_filename, unicode): - old_filename = unicode(old_filename, u'utf-8') - old_filename = re.sub(r'[^\w]+', u'_', old_filename).strip(u'_') - return old_filename + u'.sqlite' - def onCheckBoxIndexChanged(self, index): ''' Show/ Hide warnings if CheckBox state has changed @@ -131,7 +118,7 @@ class BibleUpgradeForm(OpenLPWizard): if self.currentPage() == self.progressPage: Receiver.send_message(u'openlp_stop_wizard') for bible in self.newbibles.itervalues(): - delete_database(self.newpath, bible.clean_filename( + delete_database(self.newpath, clean_filename( bible.get_name())) self.done(QtGui.QDialog.Rejected) @@ -403,7 +390,7 @@ class BibleUpgradeForm(OpenLPWizard): self.versionNameEdit[number].setFocus() return False elif os.path.exists(os.path.join(self.newpath, - self.clean_filename(version_name))): + clean_filename(version_name))): critical_error_message_box( translate('BiblesPlugin.UpgradeWizardForm', 'Bible Exists'), @@ -534,7 +521,7 @@ class BibleUpgradeForm(OpenLPWizard): u'name: "%s" failed' % ( meta_data[u'download source'], meta_data[u'download name'])) - delete_database(self.newpath, self.newbibles[number].\ + delete_database(self.newpath, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] critical_error_message_box( @@ -564,7 +551,7 @@ class BibleUpgradeForm(OpenLPWizard): if not language_id: log.exception(u'Upgrading from "%s" '\ 'failed' % filename) - delete_database(self.newpath, self.newbibles[number].\ + delete_database(self.newpath, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] self.incrementProgressBar(unicode(translate( @@ -588,7 +575,7 @@ class BibleUpgradeForm(OpenLPWizard): u'name: "%s" aborted by user' % ( meta_data[u'download source'], meta_data[u'download name'])) - delete_database(self.newpath, self.newbibles[number].\ + delete_database(self.newpath, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] bible_failed = True @@ -604,7 +591,7 @@ class BibleUpgradeForm(OpenLPWizard): if not language_id: log.exception(u'Importing books from "%s" '\ 'failed' % name) - delete_database(self.newpath, self.newbibles[number].\ + delete_database(self.newpath, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] self.incrementProgressBar(unicode(translate( @@ -628,7 +615,7 @@ class BibleUpgradeForm(OpenLPWizard): if not book_ref_id: log.exception(u'Importing books from %s " '\ 'failed - aborted by user' % name) - delete_database(self.newpath, self.newbibles[number].\ + delete_database(self.newpath, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] bible_failed = True @@ -647,6 +634,7 @@ class BibleUpgradeForm(OpenLPWizard): int(verse[u'chapter']), int(verse[u'verse']), unicode(verse[u'text'])) Receiver.send_message(u'openlp_process_events') + self.newbibles[number].session.commit() if not bible_failed: self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index a5fe59ccc..85b2b27e4 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -70,7 +70,7 @@ import chardet import csv from openlp.core.lib import Receiver, translate -from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB#, Testament +from openlp.plugins.bibles.lib.db import BibleDB, BiblesResourcesDB log = logging.getLogger(__name__) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index be3beac2f..d47d01c32 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -62,6 +62,19 @@ class Verse(BaseModel): """ pass +def clean_filename(old_filename): + """ + Clean up the version name of the Bible and convert it into a valid + file name. + + ``old_filename`` + The "dirty" file name or version name. + """ + if not isinstance(old_filename, unicode): + old_filename = unicode(old_filename, u'utf-8') + old_filename = re.sub(r'[^\w]+', u'_', old_filename).strip(u'_') + return old_filename + u'.sqlite' + def init_schema(url): """ Setup a bible database connection and initialise the database schema. @@ -144,7 +157,7 @@ class BibleDB(QtCore.QObject, Manager): self.name = kwargs[u'name'] if not isinstance(self.name, unicode): self.name = unicode(self.name, u'utf-8') - self.file = self.clean_filename(self.name) + self.file = clean_filename(self.name) if u'file' in kwargs: self.file = kwargs[u'file'] Manager.__init__(self, u'bibles/bibles', init_schema, self.file) @@ -171,19 +184,6 @@ class BibleDB(QtCore.QObject, Manager): self.name = version_name.value if version_name else None return self.name - def clean_filename(self, old_filename): - """ - Clean up the version name of the Bible and convert it into a valid - file name. - - ``old_filename`` - The "dirty" file name or version name. - """ - if not isinstance(old_filename, unicode): - old_filename = unicode(old_filename, u'utf-8') - old_filename = re.sub(r'[^\w]+', u'_', old_filename).strip(u'_') - return old_filename + u'.sqlite' - def register(self, wizard): """ This method basically just initialialises the database. It is called From 4ee247c8b176de1601bb73b73f5acce0556c8aef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Tue, 3 May 2011 22:34:39 +0200 Subject: [PATCH 038/124] code cleanup small fixes --- openlp.pyw | 6 +-- .../plugins/bibles/forms/bibleimportform.py | 7 ++-- .../plugins/bibles/forms/bibleupgradeform.py | 37 ++++++++++--------- openlp/plugins/bibles/forms/booknamedialog.py | 6 +-- openlp/plugins/bibles/forms/booknameform.py | 21 +++++------ openlp/plugins/bibles/forms/languageform.py | 1 - openlp/plugins/bibles/lib/db.py | 16 ++++---- openlp/plugins/bibles/lib/http.py | 11 ++++-- 8 files changed, 55 insertions(+), 50 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 00263ccb6..253f93718 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -132,9 +132,9 @@ class OpenLP(QtGui.QApplication): if update_check: VersionThread(self.mainWindow).start() for plugin in self.mainWindow.pluginManager.plugins: - if plugin.name == u'Bibles' and plugin.isActive() and len( - SettingsManager.get_files(u'bibles/bibles', u'.sqlite')) == 0 \ - and len(SettingsManager.get_files(u'bibles', u'.sqlite')) > 0: + if plugin.name == u'Bibles' and plugin.isActive() and not \ + len(SettingsManager.get_files( u'bibles/bibles', u'.sqlite')) \ + and SettingsManager.get_files(u'bibles', u'.sqlite'): if QtGui.QMessageBox.information(self.mainWindow, translate('OpenLP', 'Information'), translate('OpenLP', 'Bible format has changed.\nYou have to upgrade your ' diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index edecbd89c..8e9073775 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -637,9 +637,9 @@ class BibleImportForm(OpenLPWizard): bibles = BiblesResourcesDB.get_webbibles( WebDownload.Names[download_type]) for bible in bibles: - ver = bible[u'name'] + version = bible[u'name'] name = bible[u'abbreviation'] - self.web_bible_list[download_type][ver] = name.strip() + self.web_bible_list[download_type][version] = name.strip() def preWizard(self): """ @@ -720,4 +720,5 @@ class BibleImportForm(OpenLPWizard): self.progressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Your Bible import failed.')) del self.manager.db_cache[importer.name] - delete_database(self.plugin.settingsSection, importer.file) + delete_database(AppLocation.get_section_data_path(u'bibles/bibles'), + importer.file) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 52e2651cd..0dad17336 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -98,11 +98,11 @@ class BibleUpgradeForm(OpenLPWizard): self.stop_import_flag = True def onCheckBoxIndexChanged(self, index): - ''' + """ Show/ Hide warnings if CheckBox state has changed - ''' + """ for number, filename in enumerate(self.files): - if not self.checkBox[number].checkState() == 2: + if not self.checkBox[number].checkState() == QtCore.Qt.Checked: self.verticalWidget[number].hide() self.formWidget[number].hide() else: @@ -134,15 +134,15 @@ class BibleUpgradeForm(OpenLPWizard): self.next() def onFinishButton(self): - ''' + """ Some cleanup while finishing - ''' - if self.deleteCheckBox.checkState() == 2 or \ - self.deleteAllCheckBox.checkState() == 2: + """ + if self.deleteCheckBox.checkState() == QtCore.Qt.Checked or \ + self.deleteAllCheckBox.checkState() == QtCore.Qt.Checked: for number, filename in enumerate(self.files): - if self.deleteAllCheckBox.checkState() == 2 or \ - (self.checkBox[number].checkState() == 2 and \ - self.success[number] == True): + if self.deleteAllCheckBox.checkState() == QtCore.Qt.Checked or \ + (self.checkBox[number].checkState() == QtCore.Qt.Checked \ + and self.success[number]): delete_file(os.path.join(self.oldpath, filename)) def customInit(self): @@ -204,7 +204,7 @@ class BibleUpgradeForm(OpenLPWizard): checkBoxName = u'checkBox['+unicode(number)+u']' self.checkBox[number].setObjectName(checkBoxName) self.checkBox[number].setText(bible.get_name()) - self.checkBox[number].setCheckState(2) + self.checkBox[number].setCheckState(QtCore.Qt.Checked) self.formLayout.addWidget(self.checkBox[number]) self.verticalWidget[number] = QtGui.QWidget(self.scrollAreaContents) verticalWidgetName = u'verticalWidget['+unicode(number)+u']' @@ -356,7 +356,7 @@ class BibleUpgradeForm(OpenLPWizard): return True elif self.currentPage() == self.selectPage: for number, filename in enumerate(self.files): - if not self.checkBox[number].checkState() == 2: + if not self.checkBox[number].checkState() == QtCore.Qt.Checked: continue version_name = unicode(self.versionNameEdit[number].text()) oldbible = OldBibleDB(self.mediaItem, path=self.oldpath, @@ -424,7 +424,7 @@ class BibleUpgradeForm(OpenLPWizard): self.finishButton.setVisible(False) self.cancelButton.setVisible(True) for number, filename in enumerate(self.files): - self.checkBox[number].setCheckState(2) + self.checkBox[number].setCheckState(QtCore.Qt.Checked) if os.path.exists(os.path.join(self.newpath, filename)): self.verticalWidget[number].show() self.formWidget[number].show() @@ -434,9 +434,9 @@ class BibleUpgradeForm(OpenLPWizard): self.progressBar.show() self.progressLabelAfter.hide() self.deleteCheckBox.hide() - self.deleteCheckBox.setCheckState(0) + self.deleteCheckBox.setCheckState(QtCore.Qt.Unchecked) self.deleteAllCheckBox.hide() - self.deleteAllCheckBox.setCheckState(0) + self.deleteAllCheckBox.setCheckState(QtCore.Qt.Unchecked) self.restart() settings.endGroup() @@ -464,13 +464,13 @@ class BibleUpgradeForm(OpenLPWizard): return self.maxBibles = 0 for number, file in enumerate(self.files): - if self.checkBox[number].checkState() == 2: + if self.checkBox[number].checkState() == QtCore.Qt.Checked: self.maxBibles += 1 number = 0 for biblenumber, filename in enumerate(self.files): bible_failed = False self.success[biblenumber] = False - if not self.checkBox[biblenumber].checkState() == 2: + if not self.checkBox[biblenumber].checkState() == QtCore.Qt.Checked: continue self.progressBar.reset() oldbible = OldBibleDB(self.mediaItem, path=self.oldpath, @@ -655,7 +655,8 @@ class BibleUpgradeForm(OpenLPWizard): for number, success in self.success.iteritems(): if success == True: successful_import += 1 - elif success == False and self.checkBox[number].checkState() == 2: + elif success == False and self.checkBox[number].checkState() == \ + QtCore.Qt.Checked: failed_import += 1 if failed_import > 0: failed_import_text = unicode(translate( diff --git a/openlp/plugins/bibles/forms/booknamedialog.py b/openlp/plugins/bibles/forms/booknamedialog.py index ad30812bc..027131a39 100644 --- a/openlp/plugins/bibles/forms/booknamedialog.py +++ b/openlp/plugins/bibles/forms/booknamedialog.py @@ -80,15 +80,15 @@ class Ui_BookNameDialog(object): self.verticalLayout.addWidget(self.infoLabelTestaments) self.checkBoxOldTestament = QtGui.QCheckBox(self.widget) self.checkBoxOldTestament.setObjectName(u'OldTestament') - self.checkBoxOldTestament.setCheckState(2) + self.checkBoxOldTestament.setCheckState(QtCore.Qt.Checked) self.verticalLayout.addWidget(self.checkBoxOldTestament) self.checkBoxNewTestament = QtGui.QCheckBox(self.widget) self.checkBoxNewTestament.setObjectName(u'OldTestament') - self.checkBoxNewTestament.setCheckState(2) + self.checkBoxNewTestament.setCheckState(QtCore.Qt.Checked) self.verticalLayout.addWidget(self.checkBoxNewTestament) self.checkBoxApocrypha = QtGui.QCheckBox(self.widget) self.checkBoxApocrypha.setObjectName(u'OldTestament') - self.checkBoxApocrypha.setCheckState(2) + self.checkBoxApocrypha.setCheckState(QtCore.Qt.Checked) self.verticalLayout.addWidget(self.checkBoxApocrypha) self.verticalLayout.addWidget( create_accept_reject_button_box(bookNameDialog)) diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index 4ad8270e6..425e20e41 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -79,7 +79,6 @@ class BookNameForm(QDialog, Ui_BookNameDialog): ''' Reload the Combobox items ''' - items = [] self.requestComboBox.clear() self.requestComboBox.addItem(u'') items = BiblesResourcesDB.get_books() @@ -89,26 +88,26 @@ class BookNameForm(QDialog, Ui_BookNameDialog): if book.book_reference_id == item[u'id']: addBook = False break - if self.checkBoxOldTestament.checkState() == 0 and \ - item[u'testament_id'] == 1: + if self.checkBoxOldTestament.checkState() == QtCore.Qt.Unchecked \ + and item[u'testament_id'] == 1: addBook = False - elif self.checkBoxNewTestament.checkState() == 0 and \ - item[u'testament_id'] == 2: + elif self.checkBoxNewTestament.checkState() == QtCore.Qt.Unchecked \ + and item[u'testament_id'] == 2: addBook = False - elif self.checkBoxApocrypha.checkState() == 0 and \ - item[u'testament_id'] == 3: + elif self.checkBoxApocrypha.checkState() == QtCore.Qt.Unchecked \ + and item[u'testament_id'] == 3: addBook = False - if addBook == True: + if addBook: self.requestComboBox.addItem(item[u'name']) def exec_(self, name, books, maxbooks): self.books = books log.debug(maxbooks) if maxbooks <= 27: - self.checkBoxOldTestament.setCheckState(0) - self.checkBoxApocrypha.setCheckState(0) + self.checkBoxOldTestament.setCheckState(QtCore.Qt.Unchecked) + self.checkBoxApocrypha.setCheckState(QtCore.Qt.Unchecked) elif maxbooks <= 66: - self.checkBoxApocrypha.setCheckState(0) + self.checkBoxApocrypha.setCheckState(QtCore.Qt.Unchecked) self.reloadComboBox() self.requestLabel.setText(name) return QDialog.exec_(self) diff --git a/openlp/plugins/bibles/forms/languageform.py b/openlp/plugins/bibles/forms/languageform.py index e96a005c2..6235c6385 100644 --- a/openlp/plugins/bibles/forms/languageform.py +++ b/openlp/plugins/bibles/forms/languageform.py @@ -53,7 +53,6 @@ class LanguageForm(QDialog, Ui_LanguageDialog): self.setupUi(self) def exec_(self): - items = [] self.requestComboBox.addItem(u'') items = BiblesResourcesDB.get_languages() for item in items: diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index d47d01c32..805b0e7ad 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -476,9 +476,9 @@ class BibleDB(QtCore.QObject, Manager): log.debug(u'BibleDB.get_language()') from openlp.plugins.bibles.forms import LanguageForm language = None - lang = LanguageForm(self.wizard) - if lang.exec_(): - language = unicode(lang.requestComboBox.currentText()) + language_form = LanguageForm(self.wizard) + if language_form.exec_(): + language = unicode(language_form.requestComboBox.currentText()) if not language: return False language = BiblesResourcesDB.get_language(language) @@ -550,11 +550,11 @@ class BiblesResourcesDB(QtCore.QObject, Manager): u'abbreviation, chapters FROM book_reference ORDER BY id') return [ { - u'id': book[0], - u'testament_id': book[1], - u'name': unicode(book[2]), - u'abbreviation': unicode(book[3]), - u'chapters': book[4] + u'id': book[0], + u'testament_id': book[1], + u'name': unicode(book[2]), + u'abbreviation': unicode(book[3]), + u'chapters': book[4] } for book in books ] diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index a7f8d1b7e..e0261570e 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -419,9 +419,11 @@ class HTTPBible(BibleDB): 'failed' % self.filename) return False for book in books: + if self.stop_import_flag: + break self.wizard.incrementProgressBar(unicode(translate( - 'BiblesPlugin.HTTPBible', 'Importing %s...', - 'Importing ...')) % book) + 'BiblesPlugin.HTTPBible', 'Importing %s...', + 'Importing ...')) % book) book_ref_id = self.get_book_ref_id_by_name(book, len(books), language_id) if not book_ref_id: @@ -432,7 +434,10 @@ class HTTPBible(BibleDB): log.debug(u'Book details: Name:%s; id:%s; testament_id:%s', book, book_ref_id, book_details[u'testament_id']) self.create_book(book, book_ref_id, book_details[u'testament_id']) - return True + if self.stop_import_flag: + return False + else: + return True def get_verses(self, reference_list): """ From 4ffa5c59d7188d5e27340d074d554671c55132c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 12 May 2011 22:04:33 +0200 Subject: [PATCH 039/124] change some strings to better english small fixes --- openlp/plugins/bibles/bibleplugin.py | 6 +-- .../plugins/bibles/forms/bibleupgradeform.py | 48 +++++++++---------- openlp/plugins/bibles/forms/booknamedialog.py | 2 +- openlp/plugins/bibles/forms/languagedialog.py | 2 +- openlp/plugins/bibles/lib/db.py | 2 +- 5 files changed, 30 insertions(+), 30 deletions(-) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index b6f1a91ec..bc986e464 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -102,10 +102,10 @@ class BiblePlugin(Plugin): self.toolsUpgradeItem = QtGui.QAction(tools_menu) self.toolsUpgradeItem.setObjectName(u'toolsUpgradeItem') self.toolsUpgradeItem.setText( - translate('BiblePlugin', '&Upgrade older bible databases')) + translate('BiblePlugin', '&Upgrade Bible databases')) self.toolsUpgradeItem.setStatusTip( - translate('BiblePlugin', 'Upgrade the bible databases to addapt ' - 'the database scheme.')) + translate('BiblePlugin', 'Upgrade the Bible databases to the ' + 'latest format')) tools_menu.addAction(self.toolsUpgradeItem) QtCore.QObject.connect(self.toolsUpgradeItem, QtCore.SIGNAL(u'triggered()'), self.onToolsUpgradeItemTriggered) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 0dad17336..f521fffc5 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -296,7 +296,7 @@ class BibleUpgradeForm(OpenLPWizard): the wizard is progressing with its task. """ OpenLPWizard.addProgressPage(self) - self.progressLayout.setContentsMargins(48, 48, 48, 30) + self.progressLayout.setContentsMargins(48, 48, 48, 20) self.progressLabelAfter = QtGui.QLabel(self.progressPage) self.progressLabelAfter.setObjectName(u'progressLabelAfter') self.progressLayout.addWidget(self.progressLabelAfter) @@ -319,19 +319,19 @@ class BibleUpgradeForm(OpenLPWizard): translate('BiblesPlugin.UpgradeWizardForm', 'This wizard will help you to upgrade your existing Bibles from a ' 'prior version of OpenLP 2. Click the next button below to start ' - 'the process by selecting the bibles to upgrade.')) + 'the process by selecting the Bibles to upgrade.')) self.selectPage.setTitle( translate('BiblesPlugin.UpgradeWizardForm', - 'Please choose')) + 'Select Bibles')) self.selectPage.setSubTitle( translate('BiblesPlugin.UpgradeWizardForm', - 'Please choose the bibles which should be upgraded')) + 'Please select the Bibles to upgrade')) for number, bible in enumerate(self.files): self.versionNameLabel[number].setText( translate('BiblesPlugin.UpgradeWizardForm', 'Version name:')) self.versionInfoLabel[number].setText( translate('BiblesPlugin.UpgradeWizardForm', 'This ' - 'bible still exists. Please change the name or uncheck it.')) + 'Bible still exists. Please change the name or uncheck it.')) self.progressPage.setTitle(WizardStrings.Importing) self.progressPage.setSubTitle( translate('BiblesPlugin.UpgradeWizardForm', @@ -339,14 +339,15 @@ class BibleUpgradeForm(OpenLPWizard): self.progressLabel.setText(WizardStrings.Ready) self.progressBar.setFormat(u'%p%') self.deleteCheckBox.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'Delete old bible ' - 'database(s) from bibles which was upgraded\nsucessful right now')) + translate('BiblesPlugin.UpgradeWizardForm', 'Delete those files ' + 'which have been successfully upgraded.')) self.deleteAllCheckBox.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'Delete all old bible ' - 'database(s) (including not upgraded bibles)')) + translate('BiblesPlugin.UpgradeWizardForm', 'Delete all the old ' + 'files, including those which have not been \nupgraded.')) self.progressLabelAfter.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'If OpenLP should ' - 'delete the old bible databases please choose:')) + translate('BiblesPlugin.UpgradeWizardForm', 'A copy of the ' + 'pre-upgraded Bible database files have been made. \nWould you ' + 'like to:')) def validateCurrentPage(self): """ @@ -458,8 +459,8 @@ class BibleUpgradeForm(OpenLPWizard): proxy_server = None if self.maxBibles == 0: self.progressLabel.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'Sorry, but OpenLP' - ' could not find a Bible to upgrade.')) + translate('BiblesPlugin.UpgradeWizardForm', 'There are no ' + 'Bibles available to upgrade.')) self.progressBar.hide() return self.maxBibles = 0 @@ -482,13 +483,13 @@ class BibleUpgradeForm(OpenLPWizard): 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % (number+1, self.maxBibles, name), - self.progressBar.maximum()-self.progressBar.value()) + self.progressBar.maximum() - self.progressBar.value()) number += 1 continue self.progressLabel.setText(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nImporting ...')) % - (number+1, self.maxBibles, name)) + (number + 1, self.maxBibles, name)) if os.path.exists(os.path.join(self.newpath, filename)): name = unicode(self.versionNameEdit[biblenumber].text()) self.newbibles[number] = BibleDB(self.mediaItem, path=self.oldpath, @@ -528,10 +529,9 @@ class BibleUpgradeForm(OpenLPWizard): translate('BiblesPlugin.UpgradeWizardForm', 'Download Error'), translate('BiblesPlugin.UpgradeWizardForm', - 'To upgrade your webbibles a Internet connection is ' - 'necessary. Please check your Internet connection, and ' - 'if this error continues to occur please consider ' - 'reporting a bug.')) + 'To upgrade your Web Bibles an Internet connection is ' + 'required. If you have a working Internet connection ' + 'and this error still occurs, please report a bug.')) self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % @@ -668,14 +668,14 @@ class BibleUpgradeForm(OpenLPWizard): if include_webbible: self.progressLabel.setText(unicode( translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade %s ' - 'bible(s) successful%s.\nPlease note, that verses from ' - 'webbibles will be downloaded\non demand and thus an ' - 'internet connection is required.')) % + 'Bible(s) successful%s.\nPlease note, that verses from ' + 'Web Bibles will be downloaded\non demand and so an ' + 'Internet connection is required.')) % (successful_import, failed_import_text)) else: self.progressLabel.setText(unicode( translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade %s ' - 'bible(s) successful.%s')) % (successful_import, + 'Bible(s) successful.%s')) % (successful_import, failed_import_text)) self.deleteCheckBox.show() bibles = u'' @@ -684,7 +684,7 @@ class BibleUpgradeForm(OpenLPWizard): bibles += u'\n"' + name + u'"' self.deleteCheckBox.setToolTip(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', - 'Sucessful upgraded bible(s):%s')) % bibles) + 'Successfully upgraded Bible(s):%s')) % bibles) else: self.progressLabel.setText( translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade ' diff --git a/openlp/plugins/bibles/forms/booknamedialog.py b/openlp/plugins/bibles/forms/booknamedialog.py index 027131a39..20e96b922 100644 --- a/openlp/plugins/bibles/forms/booknamedialog.py +++ b/openlp/plugins/bibles/forms/booknamedialog.py @@ -105,7 +105,7 @@ class Ui_BookNameDialog(object): translate('BiblesPlugin.BookNameDialog', 'Choose Book:')) self.infoLabel.setText(translate('BiblesPlugin.BookNameDialog', 'The following books cannot be clearly attributed. \n' - 'Please choose the book it is.')) + 'Please choose which book it is.')) self.requestLabel.setText(translate('BiblesPlugin.BookNameDialog', 'Book:')) self.infoLabelTestaments.setText(translate( diff --git a/openlp/plugins/bibles/forms/languagedialog.py b/openlp/plugins/bibles/forms/languagedialog.py index c4ede8e77..7f3580279 100644 --- a/openlp/plugins/bibles/forms/languagedialog.py +++ b/openlp/plugins/bibles/forms/languagedialog.py @@ -89,6 +89,6 @@ class Ui_LanguageDialog(object): self.headlineLabel.setText( translate('BiblesPlugin.LanguageDialog', 'Choose Language:')) self.infoLabel.setText(translate('BiblesPlugin.LanguageDialog', - 'Please choose the language the bible is.')) + 'Please choose the Bible\'s language')) self.requestLabel.setText(translate('BiblesPlugin.languageDialog', 'Language:')) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 805b0e7ad..3ef73e334 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -223,7 +223,7 @@ class BibleDB(QtCore.QObject, Manager): Delete a book from the database. ``db_book`` - The book objekt. + The book object. """ log.debug(u'BibleDB.delete_book("%s")', db_book.name) if self.delete_object(Book, db_book.id): From fbd5349c2f2ce4f1d355667263da88883cb3b8e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sun, 15 May 2011 20:42:08 +0200 Subject: [PATCH 040/124] small bugfixes hide entry in tools menu if there are no bibles to upgrade --- openlp/plugins/bibles/bibleplugin.py | 6 ++++-- openlp/plugins/bibles/forms/bibleupgradeform.py | 10 ++++++++-- openlp/plugins/bibles/lib/db.py | 1 - 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index bc986e464..fd56d9d32 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -28,7 +28,8 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import Plugin, StringContent, build_icon, translate +from openlp.core.lib import Plugin, StringContent, build_icon, translate, \ + SettingsManager from openlp.core.lib.ui import base_action, UiStrings from openlp.core.utils.actions import ActionList from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem @@ -59,7 +60,8 @@ class BiblePlugin(Plugin): #action_list.add_action(self.exportBibleItem, UiStrings().Export) # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) - self.toolsUpgradeItem.setVisible(True) + if SettingsManager.get_files(u'bibles', u'.sqlite'): + self.toolsUpgradeItem.setVisible(True) def finalise(self): """ diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index f521fffc5..7e55a6c41 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -422,8 +422,6 @@ class BibleUpgradeForm(OpenLPWizard): self.customSignals() self.retranslateUi() self.maxBibles = len(self.files) - self.finishButton.setVisible(False) - self.cancelButton.setVisible(True) for number, filename in enumerate(self.files): self.checkBox[number].setCheckState(QtCore.Qt.Checked) if os.path.exists(os.path.join(self.newpath, filename)): @@ -439,6 +437,8 @@ class BibleUpgradeForm(OpenLPWizard): self.deleteAllCheckBox.hide() self.deleteAllCheckBox.setCheckState(QtCore.Qt.Unchecked) self.restart() + self.finishButton.setVisible(False) + self.cancelButton.setVisible(True) settings.endGroup() def preWizard(self): @@ -469,6 +469,8 @@ class BibleUpgradeForm(OpenLPWizard): self.maxBibles += 1 number = 0 for biblenumber, filename in enumerate(self.files): + if self.stop_import_flag: + break bible_failed = False self.success[biblenumber] = False if not self.checkBox[biblenumber].checkState() == QtCore.Qt.Checked: @@ -563,6 +565,8 @@ class BibleUpgradeForm(OpenLPWizard): continue self.progressBar.setMaximum(len(books)) for book in books: + if self.stop_import_flag: + break self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\n' @@ -604,6 +608,8 @@ class BibleUpgradeForm(OpenLPWizard): books = oldbible.get_books() self.progressBar.setMaximum(len(books)) for book in books: + if self.stop_import_flag: + break self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\n' diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 3ef73e334..6452a2fca 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -799,7 +799,6 @@ class BiblesResourcesDB(QtCore.QObject, Manager): log.debug(u'BiblesResourcesDB.get_language("%s")', name) if not isinstance(name, unicode): name = unicode(name) - name = name.title() language = BiblesResourcesDB.run_sql(u'SELECT id, name, code FROM ' u'language WHERE name = ? OR code = ?', (name, name.lower())) if language: From c51d8182a60ea90d9bfb82bb53f58b0df907d6de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 18 May 2011 20:19:11 +0200 Subject: [PATCH 042/124] delete all sucessfull imported bibles by default remove the possibility to choose which bibles should be deleted after the upgrade --- .../plugins/bibles/forms/bibleupgradeform.py | 52 ++----------------- 1 file changed, 3 insertions(+), 49 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 7e55a6c41..da75d9553 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -137,13 +137,9 @@ class BibleUpgradeForm(OpenLPWizard): """ Some cleanup while finishing """ - if self.deleteCheckBox.checkState() == QtCore.Qt.Checked or \ - self.deleteAllCheckBox.checkState() == QtCore.Qt.Checked: - for number, filename in enumerate(self.files): - if self.deleteAllCheckBox.checkState() == QtCore.Qt.Checked or \ - (self.checkBox[number].checkState() == QtCore.Qt.Checked \ - and self.success[number]): - delete_file(os.path.join(self.oldpath, filename)) + for number, filename in enumerate(self.files): + if self.success[number]: + delete_file(os.path.join(self.oldpath, filename)) def customInit(self): """ @@ -290,23 +286,6 @@ class BibleUpgradeForm(OpenLPWizard): self.formWidget[number].setParent(None) self.formLayout.removeItem(self.spacerItem) - def addProgressPage(self): - """ - Add the progress page for the wizard. This page informs the user how - the wizard is progressing with its task. - """ - OpenLPWizard.addProgressPage(self) - self.progressLayout.setContentsMargins(48, 48, 48, 20) - self.progressLabelAfter = QtGui.QLabel(self.progressPage) - self.progressLabelAfter.setObjectName(u'progressLabelAfter') - self.progressLayout.addWidget(self.progressLabelAfter) - self.deleteCheckBox = QtGui.QCheckBox(self.progressPage) - self.deleteCheckBox.setObjectName(u'deleteCheckBox') - self.progressLayout.addWidget(self.deleteCheckBox) - self.deleteAllCheckBox = QtGui.QCheckBox(self.progressPage) - self.deleteAllCheckBox.setObjectName(u'deleteAllCheckBox') - self.progressLayout.addWidget(self.deleteAllCheckBox) - def retranslateUi(self): """ Allow for localisation of the bible import wizard. @@ -338,16 +317,6 @@ class BibleUpgradeForm(OpenLPWizard): 'Please wait while your Bibles are upgraded.')) self.progressLabel.setText(WizardStrings.Ready) self.progressBar.setFormat(u'%p%') - self.deleteCheckBox.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'Delete those files ' - 'which have been successfully upgraded.')) - self.deleteAllCheckBox.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'Delete all the old ' - 'files, including those which have not been \nupgraded.')) - self.progressLabelAfter.setText( - translate('BiblesPlugin.UpgradeWizardForm', 'A copy of the ' - 'pre-upgraded Bible database files have been made. \nWould you ' - 'like to:')) def validateCurrentPage(self): """ @@ -431,11 +400,6 @@ class BibleUpgradeForm(OpenLPWizard): self.verticalWidget[number].hide() self.formWidget[number].hide() self.progressBar.show() - self.progressLabelAfter.hide() - self.deleteCheckBox.hide() - self.deleteCheckBox.setCheckState(QtCore.Qt.Unchecked) - self.deleteAllCheckBox.hide() - self.deleteAllCheckBox.setCheckState(QtCore.Qt.Unchecked) self.restart() self.finishButton.setVisible(False) self.cancelButton.setVisible(True) @@ -683,17 +647,7 @@ class BibleUpgradeForm(OpenLPWizard): translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade %s ' 'Bible(s) successful.%s')) % (successful_import, failed_import_text)) - self.deleteCheckBox.show() - bibles = u'' - for bible in self.newbibles.itervalues(): - name = bible.get_name() - bibles += u'\n"' + name + u'"' - self.deleteCheckBox.setToolTip(unicode(translate( - 'BiblesPlugin.UpgradeWizardForm', - 'Successfully upgraded Bible(s):%s')) % bibles) else: self.progressLabel.setText( translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade ' 'failed.')) - self.progressLabelAfter.show() - self.deleteAllCheckBox.show() From eedecf643409da5210ef0d0cea433f40401fd12a Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Sat, 21 May 2011 15:01:40 -0400 Subject: [PATCH 043/124] testing --- openlp/core/ui/generaltab.py | 16 +++++++++++++--- openlp/core/ui/slidecontroller.py | 5 +++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 75cb8fa98..0f238ca0a 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -95,7 +95,10 @@ class GeneralTab(SettingsTab): self.settingsLayout.addRow(self.autoUnblankCheckBox) self.autoPreviewCheckBox = QtGui.QCheckBox(self.settingsGroupBox) self.autoPreviewCheckBox.setObjectName(u'autoPreviewCheckBox') - self.settingsLayout.addRow(self.autoPreviewCheckBox) + self.settingsLayout.addRow(self.autoPreviewCheckBox) + self.stopLoopCheckBox = QtGui.QCheckBox(self.settingsGroupBox) + self.stopLoopCheckBox.setObjectName(u'stopLoopCheckBox') + self.settingsLayout.addRow(self.stopLoopCheckBox) # Moved here from image tab self.timeoutLabel = QtGui.QLabel(self.settingsGroupBox) self.timeoutLabel.setObjectName(u'timeoutLabel') @@ -217,7 +220,9 @@ class GeneralTab(SettingsTab): self.autoUnblankCheckBox.setText(translate('OpenLP.GeneralTab', 'Unblank display when adding new live item')) self.autoPreviewCheckBox.setText(translate('OpenLP.GeneralTab', - 'Automatically preview next item in service')) + 'Automatically preview next item in service')) + self.stopLoopCheckBox.setText(translate('OpenLP.GeneralTab', + 'Enable slide loop')) self.timeoutLabel.setText(translate('OpenLP.GeneralTab', 'Slide loop delay:')) self.timeoutSpinBox.setSuffix(translate('OpenLP.GeneralTab', ' sec')) @@ -269,6 +274,8 @@ class GeneralTab(SettingsTab): self.checkForUpdatesCheckBox.setChecked(settings.value(u'update check', QtCore.QVariant(True)).toBool()) self.autoPreviewCheckBox.setChecked(settings.value(u'auto preview', + QtCore.QVariant(False)).toBool()) + self.stopLoopCheckBox.setChecked(settings.value(u'stop Loop', QtCore.QVariant(False)).toBool()) self.timeoutSpinBox.setValue(settings.value(u'loop delay', QtCore.QVariant(5)).toInt()[0]) @@ -312,7 +319,9 @@ class GeneralTab(SettingsTab): settings.setValue(u'auto unblank', QtCore.QVariant(self.autoUnblankCheckBox.isChecked())) settings.setValue(u'auto preview', - QtCore.QVariant(self.autoPreviewCheckBox.isChecked())) + QtCore.QVariant(self.autoPreviewCheckBox.isChecked())) + settings.setValue(u'stoploop', + QtCore.QVariant(self.stopLoopCheckBox.isChecked())) settings.setValue(u'loop delay', QtCore.QVariant(self.timeoutSpinBox.value())) settings.setValue(u'ccli number', @@ -378,3 +387,4 @@ class GeneralTab(SettingsTab): Called when the width, height, x position or y position has changed. """ self.display_changed = True + diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index c298f897f..66e5f100a 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -935,7 +935,7 @@ class SlideController(QtGui.QWidget): def onSlideSelectedNextNoloop(self): self.onSlideSelectedNext(False) - def onSlideSelectedNext(self, loop=True): + def onSlideSelectedNext(self, loop=QtCore.QSettings().setValue('stop loop', 'stoploop')): """ Go to the next slide. """ @@ -959,7 +959,7 @@ class SlideController(QtGui.QWidget): def onSlideSelectedPreviousNoloop(self): self.onSlideSelectedPrevious(False) - def onSlideSelectedPrevious(self, loop=True): + def onSlideSelectedPrevious(self, loop=QtCore.QSettings().setValue('stop loop', 'stoploop')): """ Go to the previous slide. """ @@ -1168,3 +1168,4 @@ class SlideController(QtGui.QWidget): return HideMode.Screen else: return None + From 33dcf7c439c2ee3c78a7ca54b7c6209ef3b17774 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Sun, 22 May 2011 14:49:16 -0400 Subject: [PATCH 044/124] This is a run of the 'enable slide loop' code that gushie showed me plus my checkbox code for it --- openlp/core/ui/generaltab.py | 778 +++++++++++++++--------------- openlp/core/ui/slidecontroller.py | 4 +- 2 files changed, 391 insertions(+), 391 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 0f238ca0a..e12752338 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -1,390 +1,390 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import SettingsTab, Receiver, translate -from openlp.core.lib.ui import UiStrings -from openlp.core.ui import ScreenList - -log = logging.getLogger(__name__) - -class GeneralTab(SettingsTab): - """ - GeneralTab is the general settings tab in the settings dialog. - """ - def __init__(self, parent): - """ - Initialise the general settings tab - """ - self.screens = ScreenList.get_instance() - self.icon_path = u':/icon/openlp-logo-16x16.png' - generalTranslated = translate('GeneralTab', 'General') - SettingsTab.__init__(self, parent, u'General', generalTranslated) - - def setupUi(self): - """ - Create the user interface for the general settings tab - """ - self.setObjectName(u'GeneralTab') - SettingsTab.setupUi(self) - self.monitorGroupBox = QtGui.QGroupBox(self.leftColumn) - self.monitorGroupBox.setObjectName(u'monitorGroupBox') - self.monitorLayout = QtGui.QFormLayout(self.monitorGroupBox) - self.monitorLayout.setObjectName(u'monitorLayout') - self.monitorLabel = QtGui.QLabel(self.monitorGroupBox) - self.monitorLabel.setObjectName(u'monitorLabel') - self.monitorLayout.addRow(self.monitorLabel) - self.monitorComboBox = QtGui.QComboBox(self.monitorGroupBox) - self.monitorComboBox.setObjectName(u'monitorComboBox') - self.monitorLayout.addRow(self.monitorComboBox) - self.displayOnMonitorCheck = QtGui.QCheckBox(self.monitorGroupBox) - self.displayOnMonitorCheck.setObjectName(u'monitorComboBox') - self.monitorLayout.addRow(self.displayOnMonitorCheck) - self.leftLayout.addWidget(self.monitorGroupBox) - self.startupGroupBox = QtGui.QGroupBox(self.leftColumn) - self.startupGroupBox.setObjectName(u'startupGroupBox') - self.startupLayout = QtGui.QVBoxLayout(self.startupGroupBox) - self.startupLayout.setObjectName(u'startupLayout') - self.warningCheckBox = QtGui.QCheckBox(self.startupGroupBox) - self.warningCheckBox.setObjectName(u'warningCheckBox') - self.startupLayout.addWidget(self.warningCheckBox) - self.autoOpenCheckBox = QtGui.QCheckBox(self.startupGroupBox) - self.autoOpenCheckBox.setObjectName(u'autoOpenCheckBox') - self.startupLayout.addWidget(self.autoOpenCheckBox) - self.showSplashCheckBox = QtGui.QCheckBox(self.startupGroupBox) - self.showSplashCheckBox.setObjectName(u'showSplashCheckBox') - self.startupLayout.addWidget(self.showSplashCheckBox) - self.checkForUpdatesCheckBox = QtGui.QCheckBox(self.startupGroupBox) - self.checkForUpdatesCheckBox.setObjectName(u'checkForUpdatesCheckBox') - self.startupLayout.addWidget(self.checkForUpdatesCheckBox) - self.leftLayout.addWidget(self.startupGroupBox) - self.settingsGroupBox = QtGui.QGroupBox(self.leftColumn) - self.settingsGroupBox.setObjectName(u'settingsGroupBox') - self.settingsLayout = QtGui.QFormLayout(self.settingsGroupBox) - self.settingsLayout.setObjectName(u'settingsLayout') - self.saveCheckServiceCheckBox = QtGui.QCheckBox(self.settingsGroupBox) - self.saveCheckServiceCheckBox.setObjectName(u'saveCheckServiceCheckBox') - self.settingsLayout.addRow(self.saveCheckServiceCheckBox) - self.autoUnblankCheckBox = QtGui.QCheckBox(self.settingsGroupBox) - self.autoUnblankCheckBox.setObjectName(u'autoUnblankCheckBox') - self.settingsLayout.addRow(self.autoUnblankCheckBox) - self.autoPreviewCheckBox = QtGui.QCheckBox(self.settingsGroupBox) - self.autoPreviewCheckBox.setObjectName(u'autoPreviewCheckBox') - self.settingsLayout.addRow(self.autoPreviewCheckBox) - self.stopLoopCheckBox = QtGui.QCheckBox(self.settingsGroupBox) - self.stopLoopCheckBox.setObjectName(u'stopLoopCheckBox') - self.settingsLayout.addRow(self.stopLoopCheckBox) - # Moved here from image tab - self.timeoutLabel = QtGui.QLabel(self.settingsGroupBox) - self.timeoutLabel.setObjectName(u'timeoutLabel') - self.timeoutSpinBox = QtGui.QSpinBox(self.settingsGroupBox) - self.timeoutSpinBox.setObjectName(u'timeoutSpinBox') - self.timeoutSpinBox.setRange(1, 180) - self.settingsLayout.addRow(self.timeoutLabel, self.timeoutSpinBox) - self.leftLayout.addWidget(self.settingsGroupBox) - self.leftLayout.addStretch() - self.ccliGroupBox = QtGui.QGroupBox(self.rightColumn) - self.ccliGroupBox.setObjectName(u'ccliGroupBox') - self.ccliLayout = QtGui.QFormLayout(self.ccliGroupBox) - self.ccliLayout.setObjectName(u'ccliLayout') - self.numberLabel = QtGui.QLabel(self.ccliGroupBox) - self.numberLabel.setObjectName(u'numberLabel') - self.numberEdit = QtGui.QLineEdit(self.ccliGroupBox) - self.numberEdit.setValidator(QtGui.QIntValidator()) - self.numberEdit.setObjectName(u'numberEdit') - self.ccliLayout.addRow(self.numberLabel, self.numberEdit) - self.usernameLabel = QtGui.QLabel(self.ccliGroupBox) - self.usernameLabel.setObjectName(u'usernameLabel') - self.usernameEdit = QtGui.QLineEdit(self.ccliGroupBox) - self.usernameEdit.setObjectName(u'usernameEdit') - self.ccliLayout.addRow(self.usernameLabel, self.usernameEdit) - self.passwordLabel = QtGui.QLabel(self.ccliGroupBox) - self.passwordLabel.setObjectName(u'passwordLabel') - self.passwordEdit = QtGui.QLineEdit(self.ccliGroupBox) - self.passwordEdit.setEchoMode(QtGui.QLineEdit.Password) - self.passwordEdit.setObjectName(u'passwordEdit') - self.ccliLayout.addRow(self.passwordLabel, self.passwordEdit) - self.rightLayout.addWidget(self.ccliGroupBox) - # Moved here from display tab - self.displayGroupBox = QtGui.QGroupBox(self.rightColumn) - self.displayGroupBox.setObjectName(u'displayGroupBox') - self.displayLayout = QtGui.QGridLayout(self.displayGroupBox) - self.displayLayout.setObjectName(u'displayLayout') - self.overrideCheckBox = QtGui.QCheckBox(self.displayGroupBox) - self.overrideCheckBox.setObjectName(u'overrideCheckBox') - self.displayLayout.addWidget(self.overrideCheckBox, 2, 0, 1, 4) - self.rightLayout.addWidget(self.displayGroupBox) - # Custom position - self.customXLabel = QtGui.QLabel(self.displayGroupBox) - self.customXLabel.setObjectName(u'customXLabel') - self.displayLayout.addWidget(self.customXLabel, 3, 0) - self.customXValueEdit = QtGui.QSpinBox(self.displayGroupBox) - self.customXValueEdit.setObjectName(u'customXValueEdit') - self.customXValueEdit.setRange(-9999, 9999) - self.displayLayout.addWidget(self.customXValueEdit, 4, 0) - self.customYLabel = QtGui.QLabel(self.displayGroupBox) - self.customYLabel.setObjectName(u'customYLabel') - self.displayLayout.addWidget(self.customYLabel, 3, 1) - self.customYValueEdit = QtGui.QSpinBox(self.displayGroupBox) - self.customYValueEdit.setObjectName(u'customYValueEdit') - self.customYValueEdit.setRange(-9999, 9999) - self.displayLayout.addWidget(self.customYValueEdit, 4, 1) - self.customWidthLabel = QtGui.QLabel(self.displayGroupBox) - self.customWidthLabel.setObjectName(u'customWidthLabel') - self.displayLayout.addWidget(self.customWidthLabel, 3, 2) - self.customWidthValueEdit = QtGui.QSpinBox(self.displayGroupBox) - self.customWidthValueEdit.setObjectName(u'customWidthValueEdit') - self.customWidthValueEdit.setMaximum(9999) - self.displayLayout.addWidget(self.customWidthValueEdit, 4, 2) - self.customHeightLabel = QtGui.QLabel(self.displayGroupBox) - self.customHeightLabel.setObjectName(u'customHeightLabel') - self.displayLayout.addWidget(self.customHeightLabel, 3, 3) - self.customHeightValueEdit = QtGui.QSpinBox(self.displayGroupBox) - self.customHeightValueEdit.setObjectName(u'customHeightValueEdit') - self.customHeightValueEdit.setMaximum(9999) - self.displayLayout.addWidget(self.customHeightValueEdit, 4, 3) - self.rightLayout.addWidget(self.displayGroupBox) - self.rightLayout.addStretch() - # Signals and slots - QtCore.QObject.connect(self.overrideCheckBox, - QtCore.SIGNAL(u'toggled(bool)'), self.onOverrideCheckBoxToggled) - QtCore.QObject.connect(self.customHeightValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) - QtCore.QObject.connect(self.customWidthValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) - QtCore.QObject.connect(self.customYValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) - QtCore.QObject.connect(self.customXValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) - QtCore.QObject.connect(self.monitorComboBox, - QtCore.SIGNAL(u'currentIndexChanged(int)'), self.onDisplayChanged) - # Reload the tab, as the screen resolution/count may have changed. - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'config_screen_changed'), self.load) - # Remove for now - self.usernameLabel.setVisible(False) - self.usernameEdit.setVisible(False) - self.passwordLabel.setVisible(False) - self.passwordEdit.setVisible(False) - - def retranslateUi(self): - """ - Translate the general settings tab to the currently selected language - """ - self.tabTitleVisible = translate('OpenLP.GeneralTab', 'General') - self.monitorGroupBox.setTitle(translate('OpenLP.GeneralTab', - 'Monitors')) - self.monitorLabel.setText(translate('OpenLP.GeneralTab', - 'Select monitor for output display:')) - self.displayOnMonitorCheck.setText( - translate('OpenLP.GeneralTab', 'Display if a single screen')) - self.startupGroupBox.setTitle( - translate('OpenLP.GeneralTab', 'Application Startup')) - self.warningCheckBox.setText( - translate('OpenLP.GeneralTab', 'Show blank screen warning')) - self.autoOpenCheckBox.setText(translate('OpenLP.GeneralTab', - 'Automatically open the last service')) - self.showSplashCheckBox.setText( - translate('OpenLP.GeneralTab', 'Show the splash screen')) - self.checkForUpdatesCheckBox.setText( - translate('OpenLP.GeneralTab', 'Check for updates to OpenLP')) - self.settingsGroupBox.setTitle( - translate('OpenLP.GeneralTab', 'Application Settings')) - self.saveCheckServiceCheckBox.setText(translate('OpenLP.GeneralTab', - 'Prompt to save before starting a new service')) - self.autoUnblankCheckBox.setText(translate('OpenLP.GeneralTab', - 'Unblank display when adding new live item')) - self.autoPreviewCheckBox.setText(translate('OpenLP.GeneralTab', - 'Automatically preview next item in service')) - self.stopLoopCheckBox.setText(translate('OpenLP.GeneralTab', - 'Enable slide loop')) - self.timeoutLabel.setText(translate('OpenLP.GeneralTab', - 'Slide loop delay:')) - self.timeoutSpinBox.setSuffix(translate('OpenLP.GeneralTab', ' sec')) - self.ccliGroupBox.setTitle( - translate('OpenLP.GeneralTab', 'CCLI Details')) - self.numberLabel.setText(UiStrings().CCLINumberLabel) - self.usernameLabel.setText( - translate('OpenLP.GeneralTab', 'SongSelect username:')) - self.passwordLabel.setText( - translate('OpenLP.GeneralTab', 'SongSelect password:')) - # Moved from display tab - self.displayGroupBox.setTitle( - translate('OpenLP.GeneralTab', 'Display Position')) - self.overrideCheckBox.setText(translate('OpenLP.GeneralTab', - 'Override display position')) - self.customXLabel.setText(translate('OpenLP.GeneralTab', 'X')) - self.customYLabel.setText(translate('OpenLP.GeneralTab', 'Y')) - self.customHeightLabel.setText(translate('OpenLP.GeneralTab', 'Height')) - self.customWidthLabel.setText(translate('OpenLP.GeneralTab', 'Width')) - - def load(self): - """ - Load the settings to populate the form - """ - settings = QtCore.QSettings() - settings.beginGroup(self.settingsSection) - self.monitorComboBox.clear() - self.monitorComboBox.addItems(self.screens.get_screen_list()) - monitorNumber = settings.value(u'monitor', - QtCore.QVariant(self.screens.display_count - 1)).toInt()[0] - self.monitorComboBox.setCurrentIndex(monitorNumber) - self.numberEdit.setText(unicode(settings.value( - u'ccli number', QtCore.QVariant(u'')).toString())) - self.usernameEdit.setText(unicode(settings.value( - u'songselect username', QtCore.QVariant(u'')).toString())) - self.passwordEdit.setText(unicode(settings.value( - u'songselect password', QtCore.QVariant(u'')).toString())) - self.saveCheckServiceCheckBox.setChecked(settings.value(u'save prompt', - QtCore.QVariant(False)).toBool()) - self.autoUnblankCheckBox.setChecked(settings.value(u'auto unblank', - QtCore.QVariant(False)).toBool()) - self.displayOnMonitorCheck.setChecked(self.screens.display) - self.warningCheckBox.setChecked(settings.value(u'blank warning', - QtCore.QVariant(False)).toBool()) - self.autoOpenCheckBox.setChecked(settings.value(u'auto open', - QtCore.QVariant(False)).toBool()) - self.showSplashCheckBox.setChecked(settings.value(u'show splash', - QtCore.QVariant(True)).toBool()) - self.checkForUpdatesCheckBox.setChecked(settings.value(u'update check', - QtCore.QVariant(True)).toBool()) - self.autoPreviewCheckBox.setChecked(settings.value(u'auto preview', - QtCore.QVariant(False)).toBool()) - self.stopLoopCheckBox.setChecked(settings.value(u'stop Loop', - QtCore.QVariant(False)).toBool()) - self.timeoutSpinBox.setValue(settings.value(u'loop delay', - QtCore.QVariant(5)).toInt()[0]) - self.overrideCheckBox.setChecked(settings.value(u'override position', - QtCore.QVariant(False)).toBool()) - self.customXValueEdit.setValue(settings.value(u'x position', - QtCore.QVariant(self.screens.current[u'size'].x())).toInt()[0]) - self.customYValueEdit.setValue(settings.value(u'y position', - QtCore.QVariant(self.screens.current[u'size'].y())).toInt()[0]) - self.customHeightValueEdit.setValue(settings.value(u'height', - QtCore.QVariant(self.screens.current[u'size'].height())).toInt()[0]) - self.customWidthValueEdit.setValue(settings.value(u'width', - QtCore.QVariant(self.screens.current[u'size'].width())).toInt()[0]) - settings.endGroup() - self.customXValueEdit.setEnabled(self.overrideCheckBox.isChecked()) - self.customYValueEdit.setEnabled(self.overrideCheckBox.isChecked()) - self.customHeightValueEdit.setEnabled(self.overrideCheckBox.isChecked()) - self.customWidthValueEdit.setEnabled(self.overrideCheckBox.isChecked()) - self.display_changed = False - - def save(self): - """ - Save the settings from the form - """ - settings = QtCore.QSettings() - settings.beginGroup(self.settingsSection) - settings.setValue(u'monitor', - QtCore.QVariant(self.monitorComboBox.currentIndex())) - settings.setValue(u'display on monitor', - QtCore.QVariant(self.displayOnMonitorCheck.isChecked())) - settings.setValue(u'blank warning', - QtCore.QVariant(self.warningCheckBox.isChecked())) - settings.setValue(u'auto open', - QtCore.QVariant(self.autoOpenCheckBox.isChecked())) - settings.setValue(u'show splash', - QtCore.QVariant(self.showSplashCheckBox.isChecked())) - settings.setValue(u'update check', - QtCore.QVariant(self.checkForUpdatesCheckBox.isChecked())) - settings.setValue(u'save prompt', - QtCore.QVariant(self.saveCheckServiceCheckBox.isChecked())) - settings.setValue(u'auto unblank', - QtCore.QVariant(self.autoUnblankCheckBox.isChecked())) - settings.setValue(u'auto preview', - QtCore.QVariant(self.autoPreviewCheckBox.isChecked())) - settings.setValue(u'stoploop', - QtCore.QVariant(self.stopLoopCheckBox.isChecked())) - settings.setValue(u'loop delay', - QtCore.QVariant(self.timeoutSpinBox.value())) - settings.setValue(u'ccli number', - QtCore.QVariant(self.numberEdit.displayText())) - settings.setValue(u'songselect username', - QtCore.QVariant(self.usernameEdit.displayText())) - settings.setValue(u'songselect password', - QtCore.QVariant(self.passwordEdit.displayText())) - settings.setValue(u'x position', - QtCore.QVariant(self.customXValueEdit.value())) - settings.setValue(u'y position', - QtCore.QVariant(self.customYValueEdit.value())) - settings.setValue(u'height', - QtCore.QVariant(self.customHeightValueEdit.value())) - settings.setValue(u'width', - QtCore.QVariant(self.customWidthValueEdit.value())) - settings.setValue(u'override position', - QtCore.QVariant(self.overrideCheckBox.isChecked())) - settings.endGroup() - # On save update the screens as well - self.postSetUp(True) - - def postSetUp(self, postUpdate=False): - """ - Apply settings after settings tab has loaded and most of the - system so must be delayed - """ - Receiver.send_message(u'slidecontroller_live_spin_delay', - self.timeoutSpinBox.value()) - # Do not continue on start up. - if not postUpdate: - return - self.screens.set_current_display(self.monitorComboBox.currentIndex()) - self.screens.display = self.displayOnMonitorCheck.isChecked() - self.screens.override[u'size'] = QtCore.QRect( - self.customXValueEdit.value(), - self.customYValueEdit.value(), - self.customWidthValueEdit.value(), - self.customHeightValueEdit.value()) - if self.overrideCheckBox.isChecked(): - self.screens.set_override_display() - else: - self.screens.reset_current_display() - if self.display_changed: - Receiver.send_message(u'config_screen_changed') - self.display_changed = False - - def onOverrideCheckBoxToggled(self, checked): - """ - Toggle screen state depending on check box state. - - ``checked`` - The state of the check box (boolean). - """ - self.customXValueEdit.setEnabled(checked) - self.customYValueEdit.setEnabled(checked) - self.customHeightValueEdit.setEnabled(checked) - self.customWidthValueEdit.setEnabled(checked) - self.display_changed = True - - def onDisplayChanged(self): - """ - Called when the width, height, x position or y position has changed. - """ - self.display_changed = True +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import SettingsTab, Receiver, translate +from openlp.core.lib.ui import UiStrings +from openlp.core.ui import ScreenList + +log = logging.getLogger(__name__) + +class GeneralTab(SettingsTab): + """ + GeneralTab is the general settings tab in the settings dialog. + """ + def __init__(self, parent): + """ + Initialise the general settings tab + """ + self.screens = ScreenList.get_instance() + self.icon_path = u':/icon/openlp-logo-16x16.png' + generalTranslated = translate('GeneralTab', 'General') + SettingsTab.__init__(self, parent, u'General', generalTranslated) + + def setupUi(self): + """ + Create the user interface for the general settings tab + """ + self.setObjectName(u'GeneralTab') + SettingsTab.setupUi(self) + self.monitorGroupBox = QtGui.QGroupBox(self.leftColumn) + self.monitorGroupBox.setObjectName(u'monitorGroupBox') + self.monitorLayout = QtGui.QFormLayout(self.monitorGroupBox) + self.monitorLayout.setObjectName(u'monitorLayout') + self.monitorLabel = QtGui.QLabel(self.monitorGroupBox) + self.monitorLabel.setObjectName(u'monitorLabel') + self.monitorLayout.addRow(self.monitorLabel) + self.monitorComboBox = QtGui.QComboBox(self.monitorGroupBox) + self.monitorComboBox.setObjectName(u'monitorComboBox') + self.monitorLayout.addRow(self.monitorComboBox) + self.displayOnMonitorCheck = QtGui.QCheckBox(self.monitorGroupBox) + self.displayOnMonitorCheck.setObjectName(u'monitorComboBox') + self.monitorLayout.addRow(self.displayOnMonitorCheck) + self.leftLayout.addWidget(self.monitorGroupBox) + self.startupGroupBox = QtGui.QGroupBox(self.leftColumn) + self.startupGroupBox.setObjectName(u'startupGroupBox') + self.startupLayout = QtGui.QVBoxLayout(self.startupGroupBox) + self.startupLayout.setObjectName(u'startupLayout') + self.warningCheckBox = QtGui.QCheckBox(self.startupGroupBox) + self.warningCheckBox.setObjectName(u'warningCheckBox') + self.startupLayout.addWidget(self.warningCheckBox) + self.autoOpenCheckBox = QtGui.QCheckBox(self.startupGroupBox) + self.autoOpenCheckBox.setObjectName(u'autoOpenCheckBox') + self.startupLayout.addWidget(self.autoOpenCheckBox) + self.showSplashCheckBox = QtGui.QCheckBox(self.startupGroupBox) + self.showSplashCheckBox.setObjectName(u'showSplashCheckBox') + self.startupLayout.addWidget(self.showSplashCheckBox) + self.checkForUpdatesCheckBox = QtGui.QCheckBox(self.startupGroupBox) + self.checkForUpdatesCheckBox.setObjectName(u'checkForUpdatesCheckBox') + self.startupLayout.addWidget(self.checkForUpdatesCheckBox) + self.leftLayout.addWidget(self.startupGroupBox) + self.settingsGroupBox = QtGui.QGroupBox(self.leftColumn) + self.settingsGroupBox.setObjectName(u'settingsGroupBox') + self.settingsLayout = QtGui.QFormLayout(self.settingsGroupBox) + self.settingsLayout.setObjectName(u'settingsLayout') + self.saveCheckServiceCheckBox = QtGui.QCheckBox(self.settingsGroupBox) + self.saveCheckServiceCheckBox.setObjectName(u'saveCheckServiceCheckBox') + self.settingsLayout.addRow(self.saveCheckServiceCheckBox) + self.autoUnblankCheckBox = QtGui.QCheckBox(self.settingsGroupBox) + self.autoUnblankCheckBox.setObjectName(u'autoUnblankCheckBox') + self.settingsLayout.addRow(self.autoUnblankCheckBox) + self.autoPreviewCheckBox = QtGui.QCheckBox(self.settingsGroupBox) + self.autoPreviewCheckBox.setObjectName(u'autoPreviewCheckBox') + self.settingsLayout.addRow(self.autoPreviewCheckBox) + self.enableLoopCheckbox = QtGui.QCheckBox(self.settingsGroupBox) + self.enableLoopCheckbox.setObjectName(u'enableLoopCheckbox') + self.settingsLayout.addRow(self.enableLoopCheckbox) + # Moved here from image tab + self.timeoutLabel = QtGui.QLabel(self.settingsGroupBox) + self.timeoutLabel.setObjectName(u'timeoutLabel') + self.timeoutSpinBox = QtGui.QSpinBox(self.settingsGroupBox) + self.timeoutSpinBox.setObjectName(u'timeoutSpinBox') + self.timeoutSpinBox.setRange(1, 180) + self.settingsLayout.addRow(self.timeoutLabel, self.timeoutSpinBox) + self.leftLayout.addWidget(self.settingsGroupBox) + self.leftLayout.addStretch() + self.ccliGroupBox = QtGui.QGroupBox(self.rightColumn) + self.ccliGroupBox.setObjectName(u'ccliGroupBox') + self.ccliLayout = QtGui.QFormLayout(self.ccliGroupBox) + self.ccliLayout.setObjectName(u'ccliLayout') + self.numberLabel = QtGui.QLabel(self.ccliGroupBox) + self.numberLabel.setObjectName(u'numberLabel') + self.numberEdit = QtGui.QLineEdit(self.ccliGroupBox) + self.numberEdit.setValidator(QtGui.QIntValidator()) + self.numberEdit.setObjectName(u'numberEdit') + self.ccliLayout.addRow(self.numberLabel, self.numberEdit) + self.usernameLabel = QtGui.QLabel(self.ccliGroupBox) + self.usernameLabel.setObjectName(u'usernameLabel') + self.usernameEdit = QtGui.QLineEdit(self.ccliGroupBox) + self.usernameEdit.setObjectName(u'usernameEdit') + self.ccliLayout.addRow(self.usernameLabel, self.usernameEdit) + self.passwordLabel = QtGui.QLabel(self.ccliGroupBox) + self.passwordLabel.setObjectName(u'passwordLabel') + self.passwordEdit = QtGui.QLineEdit(self.ccliGroupBox) + self.passwordEdit.setEchoMode(QtGui.QLineEdit.Password) + self.passwordEdit.setObjectName(u'passwordEdit') + self.ccliLayout.addRow(self.passwordLabel, self.passwordEdit) + self.rightLayout.addWidget(self.ccliGroupBox) + # Moved here from display tab + self.displayGroupBox = QtGui.QGroupBox(self.rightColumn) + self.displayGroupBox.setObjectName(u'displayGroupBox') + self.displayLayout = QtGui.QGridLayout(self.displayGroupBox) + self.displayLayout.setObjectName(u'displayLayout') + self.overrideCheckBox = QtGui.QCheckBox(self.displayGroupBox) + self.overrideCheckBox.setObjectName(u'overrideCheckBox') + self.displayLayout.addWidget(self.overrideCheckBox, 2, 0, 1, 4) + self.rightLayout.addWidget(self.displayGroupBox) + # Custom position + self.customXLabel = QtGui.QLabel(self.displayGroupBox) + self.customXLabel.setObjectName(u'customXLabel') + self.displayLayout.addWidget(self.customXLabel, 3, 0) + self.customXValueEdit = QtGui.QSpinBox(self.displayGroupBox) + self.customXValueEdit.setObjectName(u'customXValueEdit') + self.customXValueEdit.setRange(-9999, 9999) + self.displayLayout.addWidget(self.customXValueEdit, 4, 0) + self.customYLabel = QtGui.QLabel(self.displayGroupBox) + self.customYLabel.setObjectName(u'customYLabel') + self.displayLayout.addWidget(self.customYLabel, 3, 1) + self.customYValueEdit = QtGui.QSpinBox(self.displayGroupBox) + self.customYValueEdit.setObjectName(u'customYValueEdit') + self.customYValueEdit.setRange(-9999, 9999) + self.displayLayout.addWidget(self.customYValueEdit, 4, 1) + self.customWidthLabel = QtGui.QLabel(self.displayGroupBox) + self.customWidthLabel.setObjectName(u'customWidthLabel') + self.displayLayout.addWidget(self.customWidthLabel, 3, 2) + self.customWidthValueEdit = QtGui.QSpinBox(self.displayGroupBox) + self.customWidthValueEdit.setObjectName(u'customWidthValueEdit') + self.customWidthValueEdit.setMaximum(9999) + self.displayLayout.addWidget(self.customWidthValueEdit, 4, 2) + self.customHeightLabel = QtGui.QLabel(self.displayGroupBox) + self.customHeightLabel.setObjectName(u'customHeightLabel') + self.displayLayout.addWidget(self.customHeightLabel, 3, 3) + self.customHeightValueEdit = QtGui.QSpinBox(self.displayGroupBox) + self.customHeightValueEdit.setObjectName(u'customHeightValueEdit') + self.customHeightValueEdit.setMaximum(9999) + self.displayLayout.addWidget(self.customHeightValueEdit, 4, 3) + self.rightLayout.addWidget(self.displayGroupBox) + self.rightLayout.addStretch() + # Signals and slots + QtCore.QObject.connect(self.overrideCheckBox, + QtCore.SIGNAL(u'toggled(bool)'), self.onOverrideCheckBoxToggled) + QtCore.QObject.connect(self.customHeightValueEdit, + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) + QtCore.QObject.connect(self.customWidthValueEdit, + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) + QtCore.QObject.connect(self.customYValueEdit, + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) + QtCore.QObject.connect(self.customXValueEdit, + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) + QtCore.QObject.connect(self.monitorComboBox, + QtCore.SIGNAL(u'currentIndexChanged(int)'), self.onDisplayChanged) + # Reload the tab, as the screen resolution/count may have changed. + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'config_screen_changed'), self.load) + # Remove for now + self.usernameLabel.setVisible(False) + self.usernameEdit.setVisible(False) + self.passwordLabel.setVisible(False) + self.passwordEdit.setVisible(False) + + def retranslateUi(self): + """ + Translate the general settings tab to the currently selected language + """ + self.tabTitleVisible = translate('OpenLP.GeneralTab', 'General') + self.monitorGroupBox.setTitle(translate('OpenLP.GeneralTab', + 'Monitors')) + self.monitorLabel.setText(translate('OpenLP.GeneralTab', + 'Select monitor for output display:')) + self.displayOnMonitorCheck.setText( + translate('OpenLP.GeneralTab', 'Display if a single screen')) + self.startupGroupBox.setTitle( + translate('OpenLP.GeneralTab', 'Application Startup')) + self.warningCheckBox.setText( + translate('OpenLP.GeneralTab', 'Show blank screen warning')) + self.autoOpenCheckBox.setText(translate('OpenLP.GeneralTab', + 'Automatically open the last service')) + self.showSplashCheckBox.setText( + translate('OpenLP.GeneralTab', 'Show the splash screen')) + self.checkForUpdatesCheckBox.setText( + translate('OpenLP.GeneralTab', 'Check for updates to OpenLP')) + self.settingsGroupBox.setTitle( + translate('OpenLP.GeneralTab', 'Application Settings')) + self.saveCheckServiceCheckBox.setText(translate('OpenLP.GeneralTab', + 'Prompt to save before starting a new service')) + self.autoUnblankCheckBox.setText(translate('OpenLP.GeneralTab', + 'Unblank display when adding new live item')) + self.autoPreviewCheckBox.setText(translate('OpenLP.GeneralTab', + 'Automatically preview next item in service')) + self.enableLoopCheckbox.setText(translate('OpenLP.GeneralTab', + 'Enable slide loop')) + self.timeoutLabel.setText(translate('OpenLP.GeneralTab', + 'Slide loop delay:')) + self.timeoutSpinBox.setSuffix(translate('OpenLP.GeneralTab', ' sec')) + self.ccliGroupBox.setTitle( + translate('OpenLP.GeneralTab', 'CCLI Details')) + self.numberLabel.setText(UiStrings().CCLINumberLabel) + self.usernameLabel.setText( + translate('OpenLP.GeneralTab', 'SongSelect username:')) + self.passwordLabel.setText( + translate('OpenLP.GeneralTab', 'SongSelect password:')) + # Moved from display tab + self.displayGroupBox.setTitle( + translate('OpenLP.GeneralTab', 'Display Position')) + self.overrideCheckBox.setText(translate('OpenLP.GeneralTab', + 'Override display position')) + self.customXLabel.setText(translate('OpenLP.GeneralTab', 'X')) + self.customYLabel.setText(translate('OpenLP.GeneralTab', 'Y')) + self.customHeightLabel.setText(translate('OpenLP.GeneralTab', 'Height')) + self.customWidthLabel.setText(translate('OpenLP.GeneralTab', 'Width')) + + def load(self): + """ + Load the settings to populate the form + """ + settings = QtCore.QSettings() + settings.beginGroup(self.settingsSection) + self.monitorComboBox.clear() + self.monitorComboBox.addItems(self.screens.get_screen_list()) + monitorNumber = settings.value(u'monitor', + QtCore.QVariant(self.screens.display_count - 1)).toInt()[0] + self.monitorComboBox.setCurrentIndex(monitorNumber) + self.numberEdit.setText(unicode(settings.value( + u'ccli number', QtCore.QVariant(u'')).toString())) + self.usernameEdit.setText(unicode(settings.value( + u'songselect username', QtCore.QVariant(u'')).toString())) + self.passwordEdit.setText(unicode(settings.value( + u'songselect password', QtCore.QVariant(u'')).toString())) + self.saveCheckServiceCheckBox.setChecked(settings.value(u'save prompt', + QtCore.QVariant(False)).toBool()) + self.autoUnblankCheckBox.setChecked(settings.value(u'auto unblank', + QtCore.QVariant(False)).toBool()) + self.displayOnMonitorCheck.setChecked(self.screens.display) + self.warningCheckBox.setChecked(settings.value(u'blank warning', + QtCore.QVariant(False)).toBool()) + self.autoOpenCheckBox.setChecked(settings.value(u'auto open', + QtCore.QVariant(False)).toBool()) + self.showSplashCheckBox.setChecked(settings.value(u'show splash', + QtCore.QVariant(True)).toBool()) + self.checkForUpdatesCheckBox.setChecked(settings.value(u'update check', + QtCore.QVariant(True)).toBool()) + self.autoPreviewCheckBox.setChecked(settings.value(u'auto preview', + QtCore.QVariant(False)).toBool()) + self.enableLoopCheckbox.setChecked(settings.value(u'enable slide loop', + QtCore.QVariant(True)).toBool()) + self.timeoutSpinBox.setValue(settings.value(u'loop delay', + QtCore.QVariant(5)).toInt()[0]) + self.overrideCheckBox.setChecked(settings.value(u'override position', + QtCore.QVariant(False)).toBool()) + self.customXValueEdit.setValue(settings.value(u'x position', + QtCore.QVariant(self.screens.current[u'size'].x())).toInt()[0]) + self.customYValueEdit.setValue(settings.value(u'y position', + QtCore.QVariant(self.screens.current[u'size'].y())).toInt()[0]) + self.customHeightValueEdit.setValue(settings.value(u'height', + QtCore.QVariant(self.screens.current[u'size'].height())).toInt()[0]) + self.customWidthValueEdit.setValue(settings.value(u'width', + QtCore.QVariant(self.screens.current[u'size'].width())).toInt()[0]) + settings.endGroup() + self.customXValueEdit.setEnabled(self.overrideCheckBox.isChecked()) + self.customYValueEdit.setEnabled(self.overrideCheckBox.isChecked()) + self.customHeightValueEdit.setEnabled(self.overrideCheckBox.isChecked()) + self.customWidthValueEdit.setEnabled(self.overrideCheckBox.isChecked()) + self.display_changed = False + + def save(self): + """ + Save the settings from the form + """ + settings = QtCore.QSettings() + settings.beginGroup(self.settingsSection) + settings.setValue(u'monitor', + QtCore.QVariant(self.monitorComboBox.currentIndex())) + settings.setValue(u'display on monitor', + QtCore.QVariant(self.displayOnMonitorCheck.isChecked())) + settings.setValue(u'blank warning', + QtCore.QVariant(self.warningCheckBox.isChecked())) + settings.setValue(u'auto open', + QtCore.QVariant(self.autoOpenCheckBox.isChecked())) + settings.setValue(u'show splash', + QtCore.QVariant(self.showSplashCheckBox.isChecked())) + settings.setValue(u'update check', + QtCore.QVariant(self.checkForUpdatesCheckBox.isChecked())) + settings.setValue(u'save prompt', + QtCore.QVariant(self.saveCheckServiceCheckBox.isChecked())) + settings.setValue(u'auto unblank', + QtCore.QVariant(self.autoUnblankCheckBox.isChecked())) + settings.setValue(u'auto preview', + QtCore.QVariant(self.autoPreviewCheckBox.isChecked())) + settings.setValue(u'Enable slide loop', + QtCore.QVariant(self.enableLoopCheckbox.isChecked())) + settings.setValue(u'loop delay', + QtCore.QVariant(self.timeoutSpinBox.value())) + settings.setValue(u'ccli number', + QtCore.QVariant(self.numberEdit.displayText())) + settings.setValue(u'songselect username', + QtCore.QVariant(self.usernameEdit.displayText())) + settings.setValue(u'songselect password', + QtCore.QVariant(self.passwordEdit.displayText())) + settings.setValue(u'x position', + QtCore.QVariant(self.customXValueEdit.value())) + settings.setValue(u'y position', + QtCore.QVariant(self.customYValueEdit.value())) + settings.setValue(u'height', + QtCore.QVariant(self.customHeightValueEdit.value())) + settings.setValue(u'width', + QtCore.QVariant(self.customWidthValueEdit.value())) + settings.setValue(u'override position', + QtCore.QVariant(self.overrideCheckBox.isChecked())) + settings.endGroup() + # On save update the screens as well + self.postSetUp(True) + + def postSetUp(self, postUpdate=False): + """ + Apply settings after settings tab has loaded and most of the + system so must be delayed + """ + Receiver.send_message(u'slidecontroller_live_spin_delay', + self.timeoutSpinBox.value()) + # Do not continue on start up. + if not postUpdate: + return + self.screens.set_current_display(self.monitorComboBox.currentIndex()) + self.screens.display = self.displayOnMonitorCheck.isChecked() + self.screens.override[u'size'] = QtCore.QRect( + self.customXValueEdit.value(), + self.customYValueEdit.value(), + self.customWidthValueEdit.value(), + self.customHeightValueEdit.value()) + if self.overrideCheckBox.isChecked(): + self.screens.set_override_display() + else: + self.screens.reset_current_display() + if self.display_changed: + Receiver.send_message(u'config_screen_changed') + self.display_changed = False + + def onOverrideCheckBoxToggled(self, checked): + """ + Toggle screen state depending on check box state. + + ``checked`` + The state of the check box (boolean). + """ + self.customXValueEdit.setEnabled(checked) + self.customYValueEdit.setEnabled(checked) + self.customHeightValueEdit.setEnabled(checked) + self.customWidthValueEdit.setEnabled(checked) + self.display_changed = True + + def onDisplayChanged(self): + """ + Called when the width, height, x position or y position has changed. + """ + self.display_changed = True diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 66e5f100a..899a283b3 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -935,7 +935,7 @@ class SlideController(QtGui.QWidget): def onSlideSelectedNextNoloop(self): self.onSlideSelectedNext(False) - def onSlideSelectedNext(self, loop=QtCore.QSettings().setValue('stop loop', 'stoploop')): + def onSlideSelectedNext(self, loop=(not QtCore.QSettings().value(u'enable slide loop', QtCore.QVariant(True)).toBool())): """ Go to the next slide. """ @@ -959,7 +959,7 @@ class SlideController(QtGui.QWidget): def onSlideSelectedPreviousNoloop(self): self.onSlideSelectedPrevious(False) - def onSlideSelectedPrevious(self, loop=QtCore.QSettings().setValue('stop loop', 'stoploop')): + def onSlideSelectedPrevious(self, loop=(not QtCore.QSettings().value(u'enable slide loop', QtCore.QVariant(True)).toBool())): """ Go to the previous slide. """ From 6d577395a4ab0a62aabac9e83907b013d2269787 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Sun, 22 May 2011 17:39:37 -0400 Subject: [PATCH 045/124] A switch of code to see if it worked and doesn't for the enable loop --- openlp/core/ui/generaltab.py | 4 ++-- openlp/core/ui/slidecontroller.py | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index e12752338..ad01a592f 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -222,7 +222,7 @@ class GeneralTab(SettingsTab): self.autoPreviewCheckBox.setText(translate('OpenLP.GeneralTab', 'Automatically preview next item in service')) self.enableLoopCheckbox.setText(translate('OpenLP.GeneralTab', - 'Enable slide loop')) + 'enable slide loop')) self.timeoutLabel.setText(translate('OpenLP.GeneralTab', 'Slide loop delay:')) self.timeoutSpinBox.setSuffix(translate('OpenLP.GeneralTab', ' sec')) @@ -320,7 +320,7 @@ class GeneralTab(SettingsTab): QtCore.QVariant(self.autoUnblankCheckBox.isChecked())) settings.setValue(u'auto preview', QtCore.QVariant(self.autoPreviewCheckBox.isChecked())) - settings.setValue(u'Enable slide loop', + settings.setValue(u'enable slide loop', QtCore.QVariant(self.enableLoopCheckbox.isChecked())) settings.setValue(u'loop delay', QtCore.QVariant(self.timeoutSpinBox.value())) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 899a283b3..df595fba5 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -935,10 +935,15 @@ class SlideController(QtGui.QWidget): def onSlideSelectedNextNoloop(self): self.onSlideSelectedNext(False) - def onSlideSelectedNext(self, loop=(not QtCore.QSettings().value(u'enable slide loop', QtCore.QVariant(True)).toBool())): + def onSlideSelectedNext(self, loop): """ Go to the next slide. - """ + """ + if checked: + loop = QtCore.QSettings().remove(self.parent.generalSettingsSection + u'general/enable slide loop', QtCore.QVariant(True)).toBool() + else: + loop = QtCore.QSettings().value( + u'general/enable slide loop') if not self.serviceItem: return Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), @@ -959,10 +964,15 @@ class SlideController(QtGui.QWidget): def onSlideSelectedPreviousNoloop(self): self.onSlideSelectedPrevious(False) - def onSlideSelectedPrevious(self, loop=(not QtCore.QSettings().value(u'enable slide loop', QtCore.QVariant(True)).toBool())): + def onSlideSelectedPrevious(self, loop): """ Go to the previous slide. - """ + """ + if checked: + loop = QtCore.QSettings().remove(self.parent.generalSettingsSection + u'/enable slide loop', QtCore.QVariant(True)).toBool() + else: + loop = QtCore.QSettings().value( + u'general/enable slide loop') if not self.serviceItem: return Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), From 6b046d9afb20f67d6b33a10d946a9a37ed810821 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Mon, 23 May 2011 19:23:00 -0400 Subject: [PATCH 046/124] Another try at the code for enabling loop through a checkbox in general settings as the signal but ignores it in slidecontroller for some odd reason acting like it's not there... --- openlp.pyw | 1 + openlp/core/ui/generaltab.py | 2 +- openlp/core/ui/slidecontroller.py | 2334 ++++++++++++++--------------- 3 files changed, 1156 insertions(+), 1181 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 76d334bae..f3b380c7a 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -257,3 +257,4 @@ if __name__ == u'__main__': Instantiate and run the application. """ main() + diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index ad01a592f..8c9336656 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -272,7 +272,7 @@ class GeneralTab(SettingsTab): self.showSplashCheckBox.setChecked(settings.value(u'show splash', QtCore.QVariant(True)).toBool()) self.checkForUpdatesCheckBox.setChecked(settings.value(u'update check', - QtCore.QVariant(True)).toBool()) + QtCore.QVariant(False)).toBool()) self.autoPreviewCheckBox.setChecked(settings.value(u'auto preview', QtCore.QVariant(False)).toBool()) self.enableLoopCheckbox.setChecked(settings.value(u'enable slide loop', diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index df595fba5..4da75ebb6 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1,1181 +1,1155 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 - -from PyQt4 import QtCore, QtGui -from PyQt4.phonon import Phonon - -from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ - ItemCapabilities, translate -from openlp.core.lib.ui import UiStrings, shortcut_action -from openlp.core.ui import HideMode, MainDisplay, ScreenList -from openlp.core.utils.actions import ActionList, CategoryOrder - -log = logging.getLogger(__name__) - -class SlideList(QtGui.QTableWidget): - """ - Customised version of QTableWidget which can respond to keyboard - events. - """ - def __init__(self, parent=None, name=None): - QtGui.QTableWidget.__init__(self, parent.controller) - self.parent = parent - - -class SlideController(QtGui.QWidget): - """ - SlideController is the slide controller widget. This widget is what the - user uses to control the displaying of verses/slides/etc on the screen. - """ - def __init__(self, parent, isLive=False): - """ - Set up the Slide Controller. - """ - QtGui.QWidget.__init__(self, parent) - self.isLive = isLive - self.parent = parent - self.screens = ScreenList.get_instance() - self.ratio = float(self.screens.current[u'size'].width()) / \ - float(self.screens.current[u'size'].height()) - self.image_manager = self.parent.image_manager - self.loopList = [ - u'Start Loop', - u'Loop Separator', - u'Image SpinBox' - ] - self.songEditList = [ - u'Edit Song', - ] - self.volume = 10 - self.timer_id = 0 - self.songEdit = False - self.selectedRow = 0 - self.serviceItem = None - self.alertTab = None - self.panel = QtGui.QWidget(parent.controlSplitter) - self.slideList = {} - # Layout for holding panel - self.panelLayout = QtGui.QVBoxLayout(self.panel) - self.panelLayout.setSpacing(0) - self.panelLayout.setMargin(0) - # Type label for the top of the slide controller - self.typeLabel = QtGui.QLabel(self.panel) - if self.isLive: - self.typeLabel.setText(UiStrings().Live) - self.split = 1 - self.typePrefix = u'live' - else: - self.typeLabel.setText(UiStrings().Preview) - self.split = 0 - self.typePrefix = u'preview' - self.typeLabel.setStyleSheet(u'font-weight: bold; font-size: 12pt;') - self.typeLabel.setAlignment(QtCore.Qt.AlignCenter) - self.panelLayout.addWidget(self.typeLabel) - # Splitter - self.splitter = QtGui.QSplitter(self.panel) - self.splitter.setOrientation(QtCore.Qt.Vertical) - self.panelLayout.addWidget(self.splitter) - # Actual controller section - self.controller = QtGui.QWidget(self.splitter) - self.controller.setGeometry(QtCore.QRect(0, 0, 100, 536)) - self.controller.setSizePolicy( - QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, - QtGui.QSizePolicy.Maximum)) - self.controllerLayout = QtGui.QVBoxLayout(self.controller) - self.controllerLayout.setSpacing(0) - self.controllerLayout.setMargin(0) - # Controller list view - self.previewListWidget = SlideList(self) - self.previewListWidget.setColumnCount(1) - self.previewListWidget.horizontalHeader().setVisible(False) - self.previewListWidget.setColumnWidth(0, self.controller.width()) - self.previewListWidget.isLive = self.isLive - self.previewListWidget.setObjectName(u'PreviewListWidget') - self.previewListWidget.setSelectionBehavior( - QtGui.QAbstractItemView.SelectRows) - self.previewListWidget.setSelectionMode( - QtGui.QAbstractItemView.SingleSelection) - self.previewListWidget.setEditTriggers( - QtGui.QAbstractItemView.NoEditTriggers) - self.previewListWidget.setHorizontalScrollBarPolicy( - QtCore.Qt.ScrollBarAlwaysOff) - self.previewListWidget.setAlternatingRowColors(True) - self.controllerLayout.addWidget(self.previewListWidget) - # Build the full toolbar - self.toolbar = OpenLPToolbar(self) - sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) - sizeToolbarPolicy.setHorizontalStretch(0) - sizeToolbarPolicy.setVerticalStretch(0) - sizeToolbarPolicy.setHeightForWidth( - self.toolbar.sizePolicy().hasHeightForWidth()) - self.toolbar.setSizePolicy(sizeToolbarPolicy) - self.previousItem = self.toolbar.addToolbarButton( - translate('OpenLP.SlideController', 'Previous Slide'), - u':/slides/slide_previous.png', - translate('OpenLP.SlideController', 'Move to previous'), - self.onSlideSelectedPrevious, - shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.nextItem = self.toolbar.addToolbarButton( - translate('OpenLP.SlideController', 'Next Slide'), - u':/slides/slide_next.png', - translate('OpenLP.SlideController', 'Move to next'), - self.onSlideSelectedNext, - shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.toolbar.addToolbarSeparator(u'Close Separator') - if self.isLive: - self.hideMenu = QtGui.QToolButton(self.toolbar) - self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide')) - self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) - self.toolbar.addToolbarWidget(u'Hide Menu', self.hideMenu) - self.hideMenu.setMenu(QtGui.QMenu( - translate('OpenLP.SlideController', 'Hide'), self.toolbar)) - self.blankScreen = shortcut_action(self.hideMenu, u'blankScreen', - [QtCore.Qt.Key_Period], self.onBlankDisplay, - u':/slides/slide_blank.png', False, UiStrings().LiveToolbar) - self.blankScreen.setText( - translate('OpenLP.SlideController', 'Blank Screen')) - self.themeScreen = shortcut_action(self.hideMenu, u'themeScreen', - [QtGui.QKeySequence(u'T')], self.onThemeDisplay, - u':/slides/slide_theme.png', False, UiStrings().LiveToolbar) - self.themeScreen.setText( - translate('OpenLP.SlideController', 'Blank to Theme')) - self.desktopScreen = shortcut_action(self.hideMenu, - u'desktopScreen', [QtGui.QKeySequence(u'D')], - self.onHideDisplay, u':/slides/slide_desktop.png', False, - UiStrings().LiveToolbar) - self.desktopScreen.setText( - translate('OpenLP.SlideController', 'Show Desktop')) - self.hideMenu.setDefaultAction(self.blankScreen) - self.hideMenu.menu().addAction(self.blankScreen) - self.hideMenu.menu().addAction(self.themeScreen) - self.hideMenu.menu().addAction(self.desktopScreen) - self.toolbar.addToolbarSeparator(u'Loop Separator') - startLoop = self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Start Loop', u':/media/media_time.png', - translate('OpenLP.SlideController', 'Start continuous loop'), - self.onStartLoop) - action_list = ActionList.get_instance() - action_list.add_action(startLoop, UiStrings().LiveToolbar) - stopLoop = self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Stop Loop', u':/media/media_stop.png', - translate('OpenLP.SlideController', 'Stop continuous loop'), - self.onStopLoop) - action_list.add_action(stopLoop, UiStrings().LiveToolbar) - self.toogleLoop = shortcut_action(self, u'toogleLoop', - [QtGui.QKeySequence(u'L')], self.onToggleLoop, - category=UiStrings().LiveToolbar) - self.toogleLoop.setText(translate('OpenLP.SlideController', - 'Start/Stop continuous loop')) - self.addAction(self.toogleLoop) - self.delaySpinBox = QtGui.QSpinBox() - self.delaySpinBox.setRange(1, 180) - self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox) - self.delaySpinBox.setSuffix(UiStrings().Seconds) - self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', - 'Delay between slides in seconds')) - else: - self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Go Live', u':/general/general_live.png', - translate('OpenLP.SlideController', 'Move to live'), - self.onGoLive) - self.toolbar.addToolbarSeparator(u'Close Separator') - self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Edit Song', u':/general/general_edit.png', - translate('OpenLP.SlideController', - 'Edit and reload song preview'), - self.onEditSong) - self.controllerLayout.addWidget(self.toolbar) - # Build a Media ToolBar - self.mediabar = OpenLPToolbar(self) - self.mediabar.addToolbarButton( - u'Media Start', u':/slides/media_playback_start.png', - translate('OpenLP.SlideController', 'Start playing media'), - self.onMediaPlay) - self.mediabar.addToolbarButton( - u'Media Pause', u':/slides/media_playback_pause.png', - translate('OpenLP.SlideController', 'Start playing media'), - self.onMediaPause) - self.mediabar.addToolbarButton( - u'Media Stop', u':/slides/media_playback_stop.png', - translate('OpenLP.SlideController', 'Start playing media'), - self.onMediaStop) - if self.isLive: - # Build the Song Toolbar - self.songMenu = QtGui.QToolButton(self.toolbar) - self.songMenu.setText(translate('OpenLP.SlideController', 'Go To')) - self.songMenu.setPopupMode(QtGui.QToolButton.InstantPopup) - self.toolbar.addToolbarWidget(u'Song Menu', self.songMenu) - self.songMenu.setMenu(QtGui.QMenu( - translate('OpenLP.SlideController', 'Go To'), self.toolbar)) - self.toolbar.makeWidgetsInvisible([u'Song Menu']) - # Build the volumeSlider. - self.volumeSlider = QtGui.QSlider(QtCore.Qt.Horizontal) - self.volumeSlider.setTickInterval(1) - self.volumeSlider.setTickPosition(QtGui.QSlider.TicksAbove) - self.volumeSlider.setMinimum(0) - self.volumeSlider.setMaximum(10) - else: - # Build the seekSlider. - self.seekSlider = Phonon.SeekSlider() - self.seekSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) - self.seekSlider.setObjectName(u'seekSlider') - self.mediabar.addToolbarWidget(u'Seek Slider', self.seekSlider) - self.volumeSlider = Phonon.VolumeSlider() - self.volumeSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) - self.volumeSlider.setObjectName(u'volumeSlider') - self.mediabar.addToolbarWidget(u'Audio Volume', self.volumeSlider) - self.controllerLayout.addWidget(self.mediabar) - # Screen preview area - self.previewFrame = QtGui.QFrame(self.splitter) - self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) - self.previewFrame.setMinimumHeight(100) - self.previewFrame.setSizePolicy(QtGui.QSizePolicy( - QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored, - QtGui.QSizePolicy.Label)) - self.previewFrame.setFrameShape(QtGui.QFrame.StyledPanel) - self.previewFrame.setFrameShadow(QtGui.QFrame.Sunken) - self.previewFrame.setObjectName(u'PreviewFrame') - self.grid = QtGui.QGridLayout(self.previewFrame) - self.grid.setMargin(8) - self.grid.setObjectName(u'grid') - self.slideLayout = QtGui.QVBoxLayout() - self.slideLayout.setSpacing(0) - self.slideLayout.setMargin(0) - self.slideLayout.setObjectName(u'SlideLayout') - if not self.isLive: - self.mediaObject = Phonon.MediaObject(self) - self.video = Phonon.VideoWidget() - self.video.setVisible(False) - self.audio = Phonon.AudioOutput(Phonon.VideoCategory, - self.mediaObject) - Phonon.createPath(self.mediaObject, self.video) - Phonon.createPath(self.mediaObject, self.audio) - self.video.setGeometry(QtCore.QRect(0, 0, 300, 225)) - self.slideLayout.insertWidget(0, self.video) - # Actual preview screen - self.slidePreview = QtGui.QLabel(self) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.slidePreview.sizePolicy().hasHeightForWidth()) - self.slidePreview.setSizePolicy(sizePolicy) - self.slidePreview.setFrameShape(QtGui.QFrame.Box) - self.slidePreview.setFrameShadow(QtGui.QFrame.Plain) - self.slidePreview.setLineWidth(1) - self.slidePreview.setScaledContents(True) - self.slidePreview.setObjectName(u'SlidePreview') - self.slideLayout.insertWidget(0, self.slidePreview) - self.grid.addLayout(self.slideLayout, 0, 0, 1, 1) - # Signals - QtCore.QObject.connect(self.previewListWidget, - QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) - 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) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), - self.receiveSpinDelay) - self.toolbar.makeWidgetsInvisible(self.loopList) - self.toolbar.actions[u'Stop Loop'].setVisible(False) - else: - QtCore.QObject.connect(self.previewListWidget, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.onGoLiveClick) - self.toolbar.makeWidgetsInvisible(self.songEditList) - self.mediabar.setVisible(False) - if self.isLive: - self.setLiveHotkeys(self) - self.__addActionsToWidget(self.previewListWidget) - else: - self.setPreviewHotkeys() - self.previewListWidget.addActions( - [self.nextItem, - self.previousItem]) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.typePrefix), - self.onStopLoop) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_first' % self.typePrefix), - self.onSlideSelectedFirst) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_next' % self.typePrefix), - self.onSlideSelectedNext) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.typePrefix), - self.onSlideSelectedPrevious) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_next_noloop' % self.typePrefix), - self.onSlideSelectedNextNoloop) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_previous_noloop' % - self.typePrefix), - self.onSlideSelectedPreviousNoloop) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_last' % self.typePrefix), - self.onSlideSelectedLast) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_change' % self.typePrefix), - self.onSlideChange) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_set' % self.typePrefix), - self.onSlideSelectedIndex) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.typePrefix), - self.onSlideBlank) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix), - self.onSlideUnblank) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.typePrefix), - self.onTextRequest) - - def setPreviewHotkeys(self, parent=None): - self.previousItem.setObjectName(u'previousItemPreview') - self.nextItem.setObjectName(u'nextItemPreview') - action_list = ActionList.get_instance() - action_list.add_action(self.previousItem) - action_list.add_action(self.nextItem) - - def setLiveHotkeys(self, parent=None): - self.previousItem.setObjectName(u'previousItemLive') - self.nextItem.setObjectName(u'nextItemLive') - action_list = ActionList.get_instance() - action_list.add_category( - UiStrings().LiveToolbar, CategoryOrder.standardToolbar) - action_list.add_action(self.previousItem) - action_list.add_action(self.nextItem) - self.previousService = shortcut_action(parent, u'previousService', - [QtCore.Qt.Key_Left], self.servicePrevious, - category=UiStrings().LiveToolbar, - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.previousService.setText( - translate('OpenLP.SlideController', 'Previous Service')) - self.nextService = shortcut_action(parent, 'nextService', - [QtCore.Qt.Key_Right], self.serviceNext, - category=UiStrings().LiveToolbar, - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.nextService.setText( - translate('OpenLP.SlideController', 'Next Service')) - self.escapeItem = shortcut_action(parent, 'escapeItem', - [QtCore.Qt.Key_Escape], self.liveEscape, - category=UiStrings().LiveToolbar, - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.escapeItem.setText( - translate('OpenLP.SlideController', 'Escape Item')) - - def liveEscape(self): - self.display.setVisible(False) - self.display.videoStop() - - def servicePrevious(self): - Receiver.send_message('servicemanager_previous_item') - - def serviceNext(self): - Receiver.send_message('servicemanager_next_item') - - def screenSizeChanged(self): - """ - Settings dialog has changed the screen size of adjust output and - screen previews. - """ - # rebuild display as screen size changed - self.display = MainDisplay(self, self.image_manager, self.isLive) - self.display.alertTab = self.alertTab - self.display.setup() - if self.isLive: - self.__addActionsToWidget(self.display) - # The SlidePreview's ratio. - self.ratio = float(self.screens.current[u'size'].width()) / \ - float(self.screens.current[u'size'].height()) - self.previewSizeChanged() - if self.serviceItem: - self.refreshServiceItem() - - def __addActionsToWidget(self, widget): - widget.addActions([ - self.previousItem, self.nextItem, - self.previousService, self.nextService, - self.escapeItem]) - - def previewSizeChanged(self): - """ - Takes care of the SlidePreview's size. Is called when one of the the - splitters is moved or when the screen size is changed. Note, that this - method is (also) called frequently from the mainwindow *paintEvent*. - """ - if self.ratio < float(self.previewFrame.width()) / float( - self.previewFrame.height()): - # We have to take the height as limit. - max_height = self.previewFrame.height() - self.grid.margin() * 2 - self.slidePreview.setFixedSize(QtCore.QSize(max_height * self.ratio, - max_height)) - else: - # We have to take the width as limit. - max_width = self.previewFrame.width() - self.grid.margin() * 2 - self.slidePreview.setFixedSize(QtCore.QSize(max_width, - max_width / self.ratio)) - # Make sure that the frames have the correct size. - self.previewListWidget.setColumnWidth(0, - self.previewListWidget.viewport().size().width()) - if self.serviceItem: - # Sort out songs, bibles, etc. - if self.serviceItem.is_text(): - self.previewListWidget.resizeRowsToContents() - else: - # Sort out image heights. - width = self.parent.controlSplitter.sizes()[self.split] - for framenumber in range(len(self.serviceItem.get_frames())): - self.previewListWidget.setRowHeight( - framenumber, width / self.ratio) - - def onSongBarHandler(self): - request = unicode(self.sender().text()) - slideno = self.slideList[request] - self.__updatePreviewSelection(slideno) - self.slideSelected() - - def receiveSpinDelay(self, value): - """ - Adjusts the value of the ``delaySpinBox`` to the given one. - """ - self.delaySpinBox.setValue(int(value)) - - def enableToolBar(self, item): - """ - Allows the toolbars to be reconfigured based on Controller Type - and ServiceItem Type - """ - if self.isLive: - self.enableLiveToolBar(item) - else: - self.enablePreviewToolBar(item) - - def enableLiveToolBar(self, item): - """ - Allows the live toolbar to be customised - """ - self.toolbar.setVisible(True) - self.mediabar.setVisible(False) - self.toolbar.makeWidgetsInvisible([u'Song Menu']) - self.toolbar.makeWidgetsInvisible(self.loopList) - self.toogleLoop.setEnabled(False) - self.toolbar.actions[u'Start Loop'].setEnabled(False) - self.toolbar.actions[u'Stop Loop'].setEnabled(False) - self.toolbar.actions[u'Stop Loop'].setVisible(False) - if item.is_text(): - if QtCore.QSettings().value( - 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 \ - len(item.get_frames()) > 1: - self.toolbar.makeWidgetsVisible(self.loopList) - self.toogleLoop.setEnabled(True) - self.toolbar.actions[u'Start Loop'].setEnabled(True) - self.toolbar.actions[u'Stop Loop'].setEnabled(True) - if item.is_media(): - self.toolbar.setVisible(False) - self.mediabar.setVisible(True) - - def enablePreviewToolBar(self, item): - """ - Allows the Preview toolbar to be customised - """ - self.toolbar.setVisible(True) - self.mediabar.setVisible(False) - self.toolbar.makeWidgetsInvisible(self.songEditList) - if item.is_capable(ItemCapabilities.AllowsEdit) and item.from_plugin: - self.toolbar.makeWidgetsVisible(self.songEditList) - elif item.is_media(): - self.toolbar.setVisible(False) - self.mediabar.setVisible(True) - self.volumeSlider.setAudioOutput(self.audio) - - def refreshServiceItem(self): - """ - Method to update the service item if the screen has changed - """ - log.debug(u'refreshServiceItem live = %s' % self.isLive) - if self.serviceItem.is_text() or self.serviceItem.is_image(): - item = self.serviceItem - item.render() - self._processItem(item, self.selectedRow) - - def addServiceItem(self, item): - """ - Method to install the service item into the controller - Called by plugins - """ - log.debug(u'addServiceItem live = %s' % self.isLive) - item.render() - slideno = 0 - if self.songEdit: - slideno = self.selectedRow - self.songEdit = False - self._processItem(item, slideno) - - def replaceServiceManagerItem(self, item): - """ - Replacement item following a remote edit - """ - if item.__eq__(self.serviceItem): - self._processItem(item, self.previewListWidget.currentRow()) - - def addServiceManagerItem(self, item, slideno): - """ - Method to install the service item into the controller and - request the correct toolbar for the plugin. - Called by ServiceManager - """ - log.debug(u'addServiceManagerItem live = %s' % self.isLive) - # If no valid slide number is specified we take the first one. - if slideno == -1: - slideno = 0 - # If service item is the same as the current on only change slide - if item.__eq__(self.serviceItem): - self.__checkUpdateSelectedSlide(slideno) - self.slideSelected() - return - self._processItem(item, slideno) - - def _processItem(self, serviceItem, slideno): - """ - Loads a ServiceItem into the system from ServiceManager - Display the slide number passed - """ - log.debug(u'processManagerItem live = %s' % self.isLive) - self.onStopLoop() - old_item = self.serviceItem - self.serviceItem = serviceItem - if old_item and self.isLive and old_item.is_capable( - ItemCapabilities.ProvidesOwnDisplay): - self._resetBlank() - Receiver.send_message(u'%s_start' % serviceItem.name.lower(), - [serviceItem, self.isLive, self.hideMode(), slideno]) - self.slideList = {} - width = self.parent.controlSplitter.sizes()[self.split] - self.previewListWidget.clear() - self.previewListWidget.setRowCount(0) - self.previewListWidget.setColumnWidth(0, width) - if self.isLive: - self.songMenu.menu().clear() - row = 0 - text = [] - for framenumber, frame in enumerate(self.serviceItem.get_frames()): - self.previewListWidget.setRowCount( - self.previewListWidget.rowCount() + 1) - item = QtGui.QTableWidgetItem() - slideHeight = 0 - if self.serviceItem.is_text(): - if frame[u'verseTag']: - # These tags are already translated. - verse_def = frame[u'verseTag'] - verse_def = u'%s%s' % (verse_def[0], verse_def[1:]) - two_line_def = u'%s\n%s' % (verse_def[0], verse_def[1:]) - row = two_line_def - if self.isLive: - if verse_def not in self.slideList: - self.slideList[verse_def] = framenumber - self.songMenu.menu().addAction(verse_def, - self.onSongBarHandler) - else: - row += 1 - item.setText(frame[u'text']) - else: - label = QtGui.QLabel() - label.setMargin(4) - label.setScaledContents(True) - if self.serviceItem.is_command(): - image = resize_image(frame[u'image'], - self.parent.renderer.width, - self.parent.renderer.height) - else: - # If current slide set background to image - if framenumber == slideno: - self.serviceItem.bg_image_bytes = \ - self.image_manager.get_image_bytes(frame[u'title']) - image = self.image_manager.get_image(frame[u'title']) - label.setPixmap(QtGui.QPixmap.fromImage(image)) - self.previewListWidget.setCellWidget(framenumber, 0, label) - slideHeight = width * self.parent.renderer.screen_ratio - row += 1 - text.append(unicode(row)) - self.previewListWidget.setItem(framenumber, 0, item) - if slideHeight != 0: - self.previewListWidget.setRowHeight(framenumber, slideHeight) - self.previewListWidget.setVerticalHeaderLabels(text) - if self.serviceItem.is_text(): - self.previewListWidget.resizeRowsToContents() - self.previewListWidget.setColumnWidth(0, - self.previewListWidget.viewport().size().width()) - self.__updatePreviewSelection(slideno) - self.enableToolBar(serviceItem) - # Pass to display for viewing. - # Postpone image build, we need to do this later to avoid the theme - # flashing on the screen - if not self.serviceItem.is_image(): - self.display.buildHtml(self.serviceItem) - if serviceItem.is_media(): - self.onMediaStart(serviceItem) - self.slideSelected(True) - self.previewListWidget.setFocus() - if old_item: - # Close the old item after the new one is opened - # This avoids the service theme/desktop flashing on screen - # However opening a new item of the same type will automatically - # close the previous, so make sure we don't close the new one. - if old_item.is_command() and not serviceItem.is_command(): - Receiver.send_message(u'%s_stop' % - old_item.name.lower(), [old_item, self.isLive]) - if old_item.is_media() and not serviceItem.is_media(): - self.onMediaClose() - Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, - [serviceItem]) - - def __updatePreviewSelection(self, slideno): - """ - Utility method to update the selected slide in the list. - """ - if slideno > self.previewListWidget.rowCount(): - self.previewListWidget.selectRow( - self.previewListWidget.rowCount() - 1) - else: - self.__checkUpdateSelectedSlide(slideno) - - def onTextRequest(self): - """ - Return the text for the current item in controller - """ - data = [] - if self.serviceItem: - for framenumber, frame in enumerate(self.serviceItem.get_frames()): - dataItem = {} - if self.serviceItem.is_text(): - dataItem[u'tag'] = unicode(frame[u'verseTag']) - dataItem[u'text'] = unicode(frame[u'html']) - else: - dataItem[u'tag'] = unicode(framenumber) - dataItem[u'text'] = u'' - dataItem[u'selected'] = \ - (self.previewListWidget.currentRow() == framenumber) - data.append(dataItem) - Receiver.send_message(u'slidecontroller_%s_text_response' - % self.typePrefix, data) - - # Screen event methods - def onSlideSelectedFirst(self): - """ - Go to the first slide. - """ - if not self.serviceItem: - return - if self.serviceItem.is_command(): - Receiver.send_message(u'%s_first' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - self.updatePreview() - else: - self.previewListWidget.selectRow(0) - self.slideSelected() - - def onSlideSelectedIndex(self, message): - """ - Go to the requested slide - """ - index = int(message[0]) - if not self.serviceItem: - return - if self.serviceItem.is_command(): - Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive, index]) - self.updatePreview() - else: - self.__checkUpdateSelectedSlide(index) - self.slideSelected() - - def mainDisplaySetBackground(self): - """ - Allow the main display to blank the main display at startup time - """ - log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) - display_type = QtCore.QSettings().value( - self.parent.generalSettingsSection + u'/screen blank', - QtCore.QVariant(u'')).toString() - if not self.display.primary: - # Order done to handle initial conversion - if display_type == u'themed': - self.onThemeDisplay(True) - elif display_type == u'hidden': - self.onHideDisplay(True) - else: - self.onBlankDisplay(True) - - def onSlideBlank(self): - """ - Handle the slidecontroller blank event - """ - self.onBlankDisplay(True) - - def onSlideUnblank(self): - """ - Handle the slidecontroller unblank event - """ - self.onBlankDisplay(False) - - def onBlankDisplay(self, checked=None): - """ - Handle the blank screen button actions - """ - if checked is None: - checked = self.blankScreen.isChecked() - log.debug(u'onBlankDisplay %s' % checked) - self.hideMenu.setDefaultAction(self.blankScreen) - self.blankScreen.setChecked(checked) - self.themeScreen.setChecked(False) - self.desktopScreen.setChecked(False) - if checked: - QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', - QtCore.QVariant(u'blanked')) - else: - QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') - self.blankPlugin() - self.updatePreview() - - def onThemeDisplay(self, checked=None): - """ - Handle the Theme screen button - """ - if checked is None: - checked = self.themeScreen.isChecked() - log.debug(u'onThemeDisplay %s' % checked) - self.hideMenu.setDefaultAction(self.themeScreen) - self.blankScreen.setChecked(False) - self.themeScreen.setChecked(checked) - self.desktopScreen.setChecked(False) - if checked: - QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', - QtCore.QVariant(u'themed')) - else: - QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') - self.blankPlugin() - self.updatePreview() - - def onHideDisplay(self, checked=None): - """ - Handle the Hide screen button - """ - if checked is None: - checked = self.desktopScreen.isChecked() - log.debug(u'onHideDisplay %s' % checked) - self.hideMenu.setDefaultAction(self.desktopScreen) - self.blankScreen.setChecked(False) - self.themeScreen.setChecked(False) - self.desktopScreen.setChecked(checked) - if checked: - QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', - QtCore.QVariant(u'hidden')) - else: - QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') - self.hidePlugin(checked) - self.updatePreview() - - def blankPlugin(self): - """ - Blank/Hide the display screen within a plugin if required. - """ - hide_mode = self.hideMode() - log.debug(u'blankPlugin %s ', hide_mode) - if self.serviceItem is not None: - if hide_mode: - if not self.serviceItem.is_command(): - Receiver.send_message(u'maindisplay_hide', hide_mode) - Receiver.send_message(u'%s_blank' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive, hide_mode]) - else: - if not self.serviceItem.is_command(): - Receiver.send_message(u'maindisplay_show') - Receiver.send_message(u'%s_unblank' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - - def hidePlugin(self, hide): - """ - Tell the plugin to hide the display screen. - """ - log.debug(u'hidePlugin %s ', hide) - if self.serviceItem is not None: - if hide: - Receiver.send_message(u'maindisplay_hide', HideMode.Screen) - Receiver.send_message(u'%s_hide' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - else: - if not self.serviceItem.is_command(): - Receiver.send_message(u'maindisplay_show') - Receiver.send_message(u'%s_unblank' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - - def onSlideSelected(self, start=False): - """ - Slide selected in controller - """ - self.slideSelected() - - def slideSelected(self, start=False): - """ - Generate the preview when you click on a slide. - if this is the Live Controller also display on the screen - """ - row = self.previewListWidget.currentRow() - self.selectedRow = 0 - if row > -1 and row < self.previewListWidget.rowCount(): - if self.serviceItem.is_command(): - if self.isLive and not start: - Receiver.send_message( - u'%s_slide' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive, row]) - self.updatePreview() - else: - toDisplay = self.serviceItem.get_rendered_frame(row) - if self.serviceItem.is_text(): - frame = self.display.text(toDisplay) - else: - if start: - self.display.buildHtml(self.serviceItem, toDisplay) - frame = self.display.preview() - else: - frame = self.display.image(toDisplay) - # reset the store used to display first image - self.serviceItem.bg_image_bytes = None - self.slidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) - self.selectedRow = row - self.__checkUpdateSelectedSlide(row) - Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, - row) - - def onSlideChange(self, row): - """ - The slide has been changed. Update the slidecontroller accordingly - """ - self.__checkUpdateSelectedSlide(row) - self.updatePreview() - Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, - row) - - def updatePreview(self): - """ - This updates the preview frame, for example after changing a slide or - using *Blank to Theme*. - """ - log.debug(u'updatePreview %s ' % self.screens.current[u'primary']) - if not self.screens.current[u'primary'] and self.serviceItem and \ - self.serviceItem.is_capable(ItemCapabilities.ProvidesOwnDisplay): - # 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: - self.slidePreview.setPixmap( - QtGui.QPixmap.fromImage(self.display.preview())) - - def grabMainDisplay(self): - """ - Creates an image of the current screen and updates the preview frame. - """ - winid = QtGui.QApplication.desktop().winId() - rect = self.screens.current[u'size'] - winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), - rect.y(), rect.width(), rect.height()) - self.slidePreview.setPixmap(winimg) - - def onSlideSelectedNextNoloop(self): - self.onSlideSelectedNext(False) - - def onSlideSelectedNext(self, loop): - """ - Go to the next slide. - """ - if checked: - loop = QtCore.QSettings().remove(self.parent.generalSettingsSection + u'general/enable slide loop', QtCore.QVariant(True)).toBool() - else: - loop = QtCore.QSettings().value( - u'general/enable slide loop') - if not self.serviceItem: - return - Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command() and self.isLive: - self.updatePreview() - else: - row = self.previewListWidget.currentRow() + 1 - if row == self.previewListWidget.rowCount(): - if loop: - row = 0 - else: - Receiver.send_message('servicemanager_next_item') - return - self.__checkUpdateSelectedSlide(row) - self.slideSelected() - - def onSlideSelectedPreviousNoloop(self): - self.onSlideSelectedPrevious(False) - - def onSlideSelectedPrevious(self, loop): - """ - Go to the previous slide. - """ - if checked: - loop = QtCore.QSettings().remove(self.parent.generalSettingsSection + u'/enable slide loop', QtCore.QVariant(True)).toBool() - else: - loop = QtCore.QSettings().value( - u'general/enable slide loop') - if not self.serviceItem: - return - Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command() and self.isLive: - self.updatePreview() - else: - row = self.previewListWidget.currentRow() - 1 - if row == -1: - if loop: - row = self.previewListWidget.rowCount() - 1 - else: - row = 0 - self.__checkUpdateSelectedSlide(row) - self.slideSelected() - - def __checkUpdateSelectedSlide(self, row): - if row + 1 < self.previewListWidget.rowCount(): - self.previewListWidget.scrollToItem( - self.previewListWidget.item(row + 1, 0)) - self.previewListWidget.selectRow(row) - - def onSlideSelectedLast(self): - """ - Go to the last slide. - """ - if not self.serviceItem: - return - Receiver.send_message(u'%s_last' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command(): - self.updatePreview() - else: - self.previewListWidget.selectRow( - self.previewListWidget.rowCount() - 1) - self.slideSelected() - - def onToggleLoop(self, toggled): - """ - Toggles the loop state. - """ - if self.toolbar.actions[u'Start Loop'].isVisible(): - self.onStartLoop() - else: - self.onStopLoop() - - def onStartLoop(self): - """ - Start the timer loop running and store the timer id - """ - if self.previewListWidget.rowCount() > 1: - self.timer_id = self.startTimer( - int(self.delaySpinBox.value()) * 1000) - self.toolbar.actions[u'Stop Loop'].setVisible(True) - self.toolbar.actions[u'Start Loop'].setVisible(False) - - def onStopLoop(self): - """ - Stop the timer loop running - """ - if self.timer_id != 0: - self.killTimer(self.timer_id) - self.timer_id = 0 - self.toolbar.actions[u'Start Loop'].setVisible(True) - self.toolbar.actions[u'Stop Loop'].setVisible(False) - - def timerEvent(self, event): - """ - If the timer event is for this window select next slide - """ - if event.timerId() == self.timer_id: - self.onSlideSelectedNext() - - def onEditSong(self): - """ - From the preview display requires the service Item to be editied - """ - self.songEdit = True - 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 - """ - row = self.previewListWidget.currentRow() - if row > -1 and row < self.previewListWidget.rowCount(): - if self.serviceItem.from_service: - Receiver.send_message('servicemanager_preview_live', - u'%s:%s' % (self.serviceItem._uuid, row)) - else: - self.parent.liveController.addServiceManagerItem( - self.serviceItem, row) - - def onMediaStart(self, item): - """ - Respond to the arrival of a media service item - """ - log.debug(u'SlideController onMediaStart') - file = os.path.join(item.get_frame_path(), item.get_frame_title()) - if self.isLive: - self.display.video(file, self.volume) - self.volumeSlider.setValue(self.volume) - else: - self.mediaObject.stop() - self.mediaObject.clearQueue() - self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) - self.seekSlider.setMediaObject(self.mediaObject) - self.seekSlider.show() - self.onMediaPlay() - - def mediaVolume(self): - """ - Respond to the release of Volume Slider - """ - log.debug(u'SlideController mediaVolume') - self.volume = self.volumeSlider.value() - self.display.videoVolume(self.volume) - - def onMediaPause(self): - """ - Respond to the Pause from the media Toolbar - """ - log.debug(u'SlideController onMediaPause') - if self.isLive: - self.display.videoPause() - else: - self.mediaObject.pause() - - def onMediaPlay(self): - """ - Respond to the Play from the media Toolbar - """ - log.debug(u'SlideController onMediaPlay') - if self.isLive: - self.display.videoPlay() - else: - self.slidePreview.hide() - self.video.show() - self.mediaObject.play() - - def onMediaStop(self): - """ - Respond to the Stop from the media Toolbar - """ - log.debug(u'SlideController onMediaStop') - if self.isLive: - self.display.videoStop() - else: - self.mediaObject.stop() - self.video.hide() - self.slidePreview.clear() - self.slidePreview.show() - - def onMediaClose(self): - """ - Respond to a request to close the Video - """ - log.debug(u'SlideController onMediaStop') - if self.isLive: - self.display.resetVideo() - else: - self.mediaObject.stop() - self.mediaObject.clearQueue() - self.video.hide() - self.slidePreview.clear() - self.slidePreview.show() - - def _resetBlank(self): - """ - Used by command items which provide their own displays to reset the - screen hide attributes - """ - hide_mode = self.hideMode() - if hide_mode == HideMode.Blank: - self.onBlankDisplay(True) - elif hide_mode == HideMode.Theme: - self.onThemeDisplay(True) - elif hide_mode == HideMode.Screen: - self.onHideDisplay(True) - else: - self.hidePlugin(False) - - def hideMode(self): - """ - Determine what the hide mode should be according to the blank button - """ - if not self.isLive: - return None - elif self.blankScreen.isChecked(): - return HideMode.Blank - elif self.themeScreen.isChecked(): - return HideMode.Theme - elif self.desktopScreen.isChecked(): - return HideMode.Screen - else: - return None +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 + +from PyQt4 import QtCore, QtGui +from PyQt4.phonon import Phonon + +from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ + ItemCapabilities, translate +from openlp.core.lib.ui import UiStrings, shortcut_action +from openlp.core.ui import HideMode, MainDisplay, ScreenList +from openlp.core.utils.actions import ActionList, CategoryOrder + +log = logging.getLogger(__name__) + +class SlideList(QtGui.QTableWidget): + """ + Customised version of QTableWidget which can respond to keyboard + events. + """ + def __init__(self, parent=None, name=None): + QtGui.QTableWidget.__init__(self, parent.controller) + self.parent = parent + + +class SlideController(QtGui.QWidget): + """ + SlideController is the slide controller widget. This widget is what the + user uses to control the displaying of verses/slides/etc on the screen. + """ + def __init__(self, parent, isLive=False): + """ + Set up the Slide Controller. + """ + QtGui.QWidget.__init__(self, parent) + self.isLive = isLive + self.parent = parent + self.screens = ScreenList.get_instance() + self.ratio = float(self.screens.current[u'size'].width()) / \ + float(self.screens.current[u'size'].height()) + self.image_manager = self.parent.image_manager + self.loopList = [ + u'Start Loop', + u'Loop Separator', + u'Image SpinBox' + ] + self.songEditList = [ + u'Edit Song', + ] + self.volume = 10 + self.timer_id = 0 + self.songEdit = False + self.selectedRow = 0 + self.serviceItem = None + self.alertTab = None + self.panel = QtGui.QWidget(parent.controlSplitter) + self.slideList = {} + # Layout for holding panel + self.panelLayout = QtGui.QVBoxLayout(self.panel) + self.panelLayout.setSpacing(0) + self.panelLayout.setMargin(0) + # Type label for the top of the slide controller + self.typeLabel = QtGui.QLabel(self.panel) + if self.isLive: + self.typeLabel.setText(UiStrings().Live) + self.split = 1 + self.typePrefix = u'live' + else: + self.typeLabel.setText(UiStrings().Preview) + self.split = 0 + self.typePrefix = u'preview' + self.typeLabel.setStyleSheet(u'font-weight: bold; font-size: 12pt;') + self.typeLabel.setAlignment(QtCore.Qt.AlignCenter) + self.panelLayout.addWidget(self.typeLabel) + # Splitter + self.splitter = QtGui.QSplitter(self.panel) + self.splitter.setOrientation(QtCore.Qt.Vertical) + self.panelLayout.addWidget(self.splitter) + # Actual controller section + self.controller = QtGui.QWidget(self.splitter) + self.controller.setGeometry(QtCore.QRect(0, 0, 100, 536)) + self.controller.setSizePolicy( + QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.Maximum)) + self.controllerLayout = QtGui.QVBoxLayout(self.controller) + self.controllerLayout.setSpacing(0) + self.controllerLayout.setMargin(0) + # Controller list view + self.previewListWidget = SlideList(self) + self.previewListWidget.setColumnCount(1) + self.previewListWidget.horizontalHeader().setVisible(False) + self.previewListWidget.setColumnWidth(0, self.controller.width()) + self.previewListWidget.isLive = self.isLive + self.previewListWidget.setObjectName(u'PreviewListWidget') + self.previewListWidget.setSelectionBehavior( + QtGui.QAbstractItemView.SelectRows) + self.previewListWidget.setSelectionMode( + QtGui.QAbstractItemView.SingleSelection) + self.previewListWidget.setEditTriggers( + QtGui.QAbstractItemView.NoEditTriggers) + self.previewListWidget.setHorizontalScrollBarPolicy( + QtCore.Qt.ScrollBarAlwaysOff) + self.previewListWidget.setAlternatingRowColors(True) + self.controllerLayout.addWidget(self.previewListWidget) + # Build the full toolbar + self.toolbar = OpenLPToolbar(self) + sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) + sizeToolbarPolicy.setHorizontalStretch(0) + sizeToolbarPolicy.setVerticalStretch(0) + sizeToolbarPolicy.setHeightForWidth( + self.toolbar.sizePolicy().hasHeightForWidth()) + self.toolbar.setSizePolicy(sizeToolbarPolicy) + self.previousItem = self.toolbar.addToolbarButton( + translate('OpenLP.SlideController', 'Previous Slide'), + u':/slides/slide_previous.png', + translate('OpenLP.SlideController', 'Move to previous'), + self.onSlideSelectedPrevious, + shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.nextItem = self.toolbar.addToolbarButton( + translate('OpenLP.SlideController', 'Next Slide'), + u':/slides/slide_next.png', + translate('OpenLP.SlideController', 'Move to next'), + self.onSlideSelectedNext, + shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.toolbar.addToolbarSeparator(u'Close Separator') + if self.isLive: + self.hideMenu = QtGui.QToolButton(self.toolbar) + self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide')) + self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) + self.toolbar.addToolbarWidget(u'Hide Menu', self.hideMenu) + self.hideMenu.setMenu(QtGui.QMenu( + translate('OpenLP.SlideController', 'Hide'), self.toolbar)) + self.blankScreen = shortcut_action(self.hideMenu, u'blankScreen', + [QtCore.Qt.Key_Period], self.onBlankDisplay, + u':/slides/slide_blank.png', False, UiStrings().LiveToolbar) + self.blankScreen.setText( + translate('OpenLP.SlideController', 'Blank Screen')) + self.themeScreen = shortcut_action(self.hideMenu, u'themeScreen', + [QtGui.QKeySequence(u'T')], self.onThemeDisplay, + u':/slides/slide_theme.png', False, UiStrings().LiveToolbar) + self.themeScreen.setText( + translate('OpenLP.SlideController', 'Blank to Theme')) + self.desktopScreen = shortcut_action(self.hideMenu, + u'desktopScreen', [QtGui.QKeySequence(u'D')], + self.onHideDisplay, u':/slides/slide_desktop.png', False, + UiStrings().LiveToolbar) + self.desktopScreen.setText( + translate('OpenLP.SlideController', 'Show Desktop')) + self.hideMenu.setDefaultAction(self.blankScreen) + self.hideMenu.menu().addAction(self.blankScreen) + self.hideMenu.menu().addAction(self.themeScreen) + self.hideMenu.menu().addAction(self.desktopScreen) + self.toolbar.addToolbarSeparator(u'Loop Separator') + startLoop = self.toolbar.addToolbarButton( + # Does not need translating - control string. + u'Start Loop', u':/media/media_time.png', + translate('OpenLP.SlideController', 'Start continuous loop'), + self.onStartLoop) + action_list = ActionList.get_instance() + action_list.add_action(startLoop, UiStrings().LiveToolbar) + stopLoop = self.toolbar.addToolbarButton( + # Does not need translating - control string. + u'Stop Loop', u':/media/media_stop.png', + translate('OpenLP.SlideController', 'Stop continuous loop'), + self.onStopLoop) + action_list.add_action(stopLoop, UiStrings().LiveToolbar) + self.toogleLoop = shortcut_action(self, u'toogleLoop', + [QtGui.QKeySequence(u'L')], self.onToggleLoop, + category=UiStrings().LiveToolbar) + self.toogleLoop.setText(translate('OpenLP.SlideController', + 'Start/Stop continuous loop')) + self.addAction(self.toogleLoop) + self.delaySpinBox = QtGui.QSpinBox() + self.delaySpinBox.setRange(1, 180) + self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox) + self.delaySpinBox.setSuffix(UiStrings().Seconds) + self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', + 'Delay between slides in seconds')) + else: + self.toolbar.addToolbarButton( + # Does not need translating - control string. + u'Go Live', u':/general/general_live.png', + translate('OpenLP.SlideController', 'Move to live'), + self.onGoLive) + self.toolbar.addToolbarSeparator(u'Close Separator') + self.toolbar.addToolbarButton( + # Does not need translating - control string. + u'Edit Song', u':/general/general_edit.png', + translate('OpenLP.SlideController', + 'Edit and reload song preview'), + self.onEditSong) + self.controllerLayout.addWidget(self.toolbar) + # Build a Media ToolBar + self.mediabar = OpenLPToolbar(self) + self.mediabar.addToolbarButton( + u'Media Start', u':/slides/media_playback_start.png', + translate('OpenLP.SlideController', 'Start playing media'), + self.onMediaPlay) + self.mediabar.addToolbarButton( + u'Media Pause', u':/slides/media_playback_pause.png', + translate('OpenLP.SlideController', 'Start playing media'), + self.onMediaPause) + self.mediabar.addToolbarButton( + u'Media Stop', u':/slides/media_playback_stop.png', + translate('OpenLP.SlideController', 'Start playing media'), + self.onMediaStop) + if self.isLive: + # Build the Song Toolbar + self.songMenu = QtGui.QToolButton(self.toolbar) + self.songMenu.setText(translate('OpenLP.SlideController', 'Go To')) + self.songMenu.setPopupMode(QtGui.QToolButton.InstantPopup) + self.toolbar.addToolbarWidget(u'Song Menu', self.songMenu) + self.songMenu.setMenu(QtGui.QMenu( + translate('OpenLP.SlideController', 'Go To'), self.toolbar)) + self.toolbar.makeWidgetsInvisible([u'Song Menu']) + # Build the volumeSlider. + self.volumeSlider = QtGui.QSlider(QtCore.Qt.Horizontal) + self.volumeSlider.setTickInterval(1) + self.volumeSlider.setTickPosition(QtGui.QSlider.TicksAbove) + self.volumeSlider.setMinimum(0) + self.volumeSlider.setMaximum(10) + else: + # Build the seekSlider. + self.seekSlider = Phonon.SeekSlider() + self.seekSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) + self.seekSlider.setObjectName(u'seekSlider') + self.mediabar.addToolbarWidget(u'Seek Slider', self.seekSlider) + self.volumeSlider = Phonon.VolumeSlider() + self.volumeSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) + self.volumeSlider.setObjectName(u'volumeSlider') + self.mediabar.addToolbarWidget(u'Audio Volume', self.volumeSlider) + self.controllerLayout.addWidget(self.mediabar) + # Screen preview area + self.previewFrame = QtGui.QFrame(self.splitter) + self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) + self.previewFrame.setMinimumHeight(100) + self.previewFrame.setSizePolicy(QtGui.QSizePolicy( + QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored, + QtGui.QSizePolicy.Label)) + self.previewFrame.setFrameShape(QtGui.QFrame.StyledPanel) + self.previewFrame.setFrameShadow(QtGui.QFrame.Sunken) + self.previewFrame.setObjectName(u'PreviewFrame') + self.grid = QtGui.QGridLayout(self.previewFrame) + self.grid.setMargin(8) + self.grid.setObjectName(u'grid') + self.slideLayout = QtGui.QVBoxLayout() + self.slideLayout.setSpacing(0) + self.slideLayout.setMargin(0) + self.slideLayout.setObjectName(u'SlideLayout') + if not self.isLive: + self.mediaObject = Phonon.MediaObject(self) + self.video = Phonon.VideoWidget() + self.video.setVisible(False) + self.audio = Phonon.AudioOutput(Phonon.VideoCategory, + self.mediaObject) + Phonon.createPath(self.mediaObject, self.video) + Phonon.createPath(self.mediaObject, self.audio) + self.video.setGeometry(QtCore.QRect(0, 0, 300, 225)) + self.slideLayout.insertWidget(0, self.video) + # Actual preview screen + self.slidePreview = QtGui.QLabel(self) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth( + self.slidePreview.sizePolicy().hasHeightForWidth()) + self.slidePreview.setSizePolicy(sizePolicy) + self.slidePreview.setFrameShape(QtGui.QFrame.Box) + self.slidePreview.setFrameShadow(QtGui.QFrame.Plain) + self.slidePreview.setLineWidth(1) + self.slidePreview.setScaledContents(True) + self.slidePreview.setObjectName(u'SlidePreview') + self.slideLayout.insertWidget(0, self.slidePreview) + self.grid.addLayout(self.slideLayout, 0, 0, 1, 1) + # Signals + QtCore.QObject.connect(self.previewListWidget, + QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) + 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) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), + self.receiveSpinDelay) + self.toolbar.makeWidgetsInvisible(self.loopList) + self.toolbar.actions[u'Stop Loop'].setVisible(False) + else: + QtCore.QObject.connect(self.previewListWidget, + QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), + self.onGoLiveClick) + self.toolbar.makeWidgetsInvisible(self.songEditList) + self.mediabar.setVisible(False) + if self.isLive: + self.setLiveHotkeys(self) + self.__addActionsToWidget(self.previewListWidget) + else: + self.setPreviewHotkeys() + self.previewListWidget.addActions( + [self.nextItem, + self.previousItem]) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.typePrefix), + self.onStopLoop) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_first' % self.typePrefix), + self.onSlideSelectedFirst) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_next' % self.typePrefix), + self.onSlideSelectedNext) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.typePrefix), + self.onSlideSelectedPrevious) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_last' % self.typePrefix), + self.onSlideSelectedLast) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_change' % self.typePrefix), + self.onSlideChange) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_set' % self.typePrefix), + self.onSlideSelectedIndex) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.typePrefix), + self.onSlideBlank) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix), + self.onSlideUnblank) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.typePrefix), + self.onTextRequest) + + def setPreviewHotkeys(self, parent=None): + self.previousItem.setObjectName(u'previousItemPreview') + self.nextItem.setObjectName(u'nextItemPreview') + action_list = ActionList.get_instance() + action_list.add_action(self.previousItem) + action_list.add_action(self.nextItem) + + def setLiveHotkeys(self, parent=None): + self.previousItem.setObjectName(u'previousItemLive') + self.nextItem.setObjectName(u'nextItemLive') + action_list = ActionList.get_instance() + action_list.add_category( + UiStrings().LiveToolbar, CategoryOrder.standardToolbar) + action_list.add_action(self.previousItem) + action_list.add_action(self.nextItem) + self.previousService = shortcut_action(parent, u'previousService', + [QtCore.Qt.Key_Left], self.servicePrevious, + category=UiStrings().LiveToolbar, + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.previousService.setText( + translate('OpenLP.SlideController', 'Previous Service')) + self.nextService = shortcut_action(parent, 'nextService', + [QtCore.Qt.Key_Right], self.serviceNext, + category=UiStrings().LiveToolbar, + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.nextService.setText( + translate('OpenLP.SlideController', 'Next Service')) + self.escapeItem = shortcut_action(parent, 'escapeItem', + [QtCore.Qt.Key_Escape], self.liveEscape, + category=UiStrings().LiveToolbar, + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.escapeItem.setText( + translate('OpenLP.SlideController', 'Escape Item')) + + def liveEscape(self): + self.display.setVisible(False) + self.display.videoStop() + + def servicePrevious(self): + Receiver.send_message('servicemanager_previous_item') + + def serviceNext(self): + Receiver.send_message('servicemanager_next_item') + + def screenSizeChanged(self): + """ + Settings dialog has changed the screen size of adjust output and + screen previews. + """ + # rebuild display as screen size changed + self.display = MainDisplay(self, self.image_manager, self.isLive) + self.display.alertTab = self.alertTab + self.display.setup() + if self.isLive: + self.__addActionsToWidget(self.display) + # The SlidePreview's ratio. + self.ratio = float(self.screens.current[u'size'].width()) / \ + float(self.screens.current[u'size'].height()) + self.previewSizeChanged() + if self.serviceItem: + self.refreshServiceItem() + + def __addActionsToWidget(self, widget): + widget.addActions([ + self.previousItem, self.nextItem, + self.previousService, self.nextService, + self.escapeItem]) + + def previewSizeChanged(self): + """ + Takes care of the SlidePreview's size. Is called when one of the the + splitters is moved or when the screen size is changed. Note, that this + method is (also) called frequently from the mainwindow *paintEvent*. + """ + if self.ratio < float(self.previewFrame.width()) / float( + self.previewFrame.height()): + # We have to take the height as limit. + max_height = self.previewFrame.height() - self.grid.margin() * 2 + self.slidePreview.setFixedSize(QtCore.QSize(max_height * self.ratio, + max_height)) + else: + # We have to take the width as limit. + max_width = self.previewFrame.width() - self.grid.margin() * 2 + self.slidePreview.setFixedSize(QtCore.QSize(max_width, + max_width / self.ratio)) + # Make sure that the frames have the correct size. + self.previewListWidget.setColumnWidth(0, + self.previewListWidget.viewport().size().width()) + if self.serviceItem: + # Sort out songs, bibles, etc. + if self.serviceItem.is_text(): + self.previewListWidget.resizeRowsToContents() + else: + # Sort out image heights. + width = self.parent.controlSplitter.sizes()[self.split] + for framenumber in range(len(self.serviceItem.get_frames())): + self.previewListWidget.setRowHeight( + framenumber, width / self.ratio) + + def onSongBarHandler(self): + request = unicode(self.sender().text()) + slideno = self.slideList[request] + self.__updatePreviewSelection(slideno) + self.slideSelected() + + def receiveSpinDelay(self, value): + """ + Adjusts the value of the ``delaySpinBox`` to the given one. + """ + self.delaySpinBox.setValue(int(value)) + + def enableToolBar(self, item): + """ + Allows the toolbars to be reconfigured based on Controller Type + and ServiceItem Type + """ + if self.isLive: + self.enableLiveToolBar(item) + else: + self.enablePreviewToolBar(item) + + def enableLiveToolBar(self, item): + """ + Allows the live toolbar to be customised + """ + self.toolbar.setVisible(True) + self.mediabar.setVisible(False) + self.toolbar.makeWidgetsInvisible([u'Song Menu']) + self.toolbar.makeWidgetsInvisible(self.loopList) + self.toogleLoop.setEnabled(False) + self.toolbar.actions[u'Start Loop'].setEnabled(False) + self.toolbar.actions[u'Stop Loop'].setEnabled(False) + self.toolbar.actions[u'Stop Loop'].setVisible(False) + if item.is_text(): + if QtCore.QSettings().value( + 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 \ + len(item.get_frames()) > 1: + self.toolbar.makeWidgetsVisible(self.loopList) + self.toogleLoop.setEnabled(True) + self.toolbar.actions[u'Start Loop'].setEnabled(True) + self.toolbar.actions[u'Stop Loop'].setEnabled(True) + if item.is_media(): + self.toolbar.setVisible(False) + self.mediabar.setVisible(True) + + def enablePreviewToolBar(self, item): + """ + Allows the Preview toolbar to be customised + """ + self.toolbar.setVisible(True) + self.mediabar.setVisible(False) + self.toolbar.makeWidgetsInvisible(self.songEditList) + if item.is_capable(ItemCapabilities.AllowsEdit) and item.from_plugin: + self.toolbar.makeWidgetsVisible(self.songEditList) + elif item.is_media(): + self.toolbar.setVisible(False) + self.mediabar.setVisible(True) + self.volumeSlider.setAudioOutput(self.audio) + + def refreshServiceItem(self): + """ + Method to update the service item if the screen has changed + """ + log.debug(u'refreshServiceItem live = %s' % self.isLive) + if self.serviceItem.is_text() or self.serviceItem.is_image(): + item = self.serviceItem + item.render() + self._processItem(item, self.selectedRow) + + def addServiceItem(self, item): + """ + Method to install the service item into the controller + Called by plugins + """ + log.debug(u'addServiceItem live = %s' % self.isLive) + item.render() + slideno = 0 + if self.songEdit: + slideno = self.selectedRow + self.songEdit = False + self._processItem(item, slideno) + + def replaceServiceManagerItem(self, item): + """ + Replacement item following a remote edit + """ + if item.__eq__(self.serviceItem): + self._processItem(item, self.previewListWidget.currentRow()) + + def addServiceManagerItem(self, item, slideno): + """ + Method to install the service item into the controller and + request the correct toolbar for the plugin. + Called by ServiceManager + """ + log.debug(u'addServiceManagerItem live = %s' % self.isLive) + # If no valid slide number is specified we take the first one. + if slideno == -1: + slideno = 0 + # If service item is the same as the current on only change slide + if item.__eq__(self.serviceItem): + self.__checkUpdateSelectedSlide(slideno) + self.slideSelected() + return + self._processItem(item, slideno) + + def _processItem(self, serviceItem, slideno): + """ + Loads a ServiceItem into the system from ServiceManager + Display the slide number passed + """ + log.debug(u'processManagerItem live = %s' % self.isLive) + self.onStopLoop() + old_item = self.serviceItem + self.serviceItem = serviceItem + if old_item and self.isLive and old_item.is_capable( + ItemCapabilities.ProvidesOwnDisplay): + self._resetBlank() + Receiver.send_message(u'%s_start' % serviceItem.name.lower(), + [serviceItem, self.isLive, self.hideMode(), slideno]) + self.slideList = {} + width = self.parent.controlSplitter.sizes()[self.split] + self.previewListWidget.clear() + self.previewListWidget.setRowCount(0) + self.previewListWidget.setColumnWidth(0, width) + if self.isLive: + self.songMenu.menu().clear() + row = 0 + text = [] + for framenumber, frame in enumerate(self.serviceItem.get_frames()): + self.previewListWidget.setRowCount( + self.previewListWidget.rowCount() + 1) + item = QtGui.QTableWidgetItem() + slideHeight = 0 + if self.serviceItem.is_text(): + if frame[u'verseTag']: + # These tags are already translated. + verse_def = frame[u'verseTag'] + verse_def = u'%s%s' % (verse_def[0], verse_def[1:]) + two_line_def = u'%s\n%s' % (verse_def[0], verse_def[1:]) + row = two_line_def + if self.isLive: + if verse_def not in self.slideList: + self.slideList[verse_def] = framenumber + self.songMenu.menu().addAction(verse_def, + self.onSongBarHandler) + else: + row += 1 + item.setText(frame[u'text']) + else: + label = QtGui.QLabel() + label.setMargin(4) + label.setScaledContents(True) + if self.serviceItem.is_command(): + image = resize_image(frame[u'image'], + self.parent.renderer.width, + self.parent.renderer.height) + else: + # If current slide set background to image + if framenumber == slideno: + self.serviceItem.bg_image_bytes = \ + self.image_manager.get_image_bytes(frame[u'title']) + image = self.image_manager.get_image(frame[u'title']) + label.setPixmap(QtGui.QPixmap.fromImage(image)) + self.previewListWidget.setCellWidget(framenumber, 0, label) + slideHeight = width * self.parent.renderer.screen_ratio + row += 1 + text.append(unicode(row)) + self.previewListWidget.setItem(framenumber, 0, item) + if slideHeight != 0: + self.previewListWidget.setRowHeight(framenumber, slideHeight) + self.previewListWidget.setVerticalHeaderLabels(text) + if self.serviceItem.is_text(): + self.previewListWidget.resizeRowsToContents() + self.previewListWidget.setColumnWidth(0, + self.previewListWidget.viewport().size().width()) + self.__updatePreviewSelection(slideno) + self.enableToolBar(serviceItem) + # Pass to display for viewing. + # Postpone image build, we need to do this later to avoid the theme + # flashing on the screen + if not self.serviceItem.is_image(): + self.display.buildHtml(self.serviceItem) + if serviceItem.is_media(): + self.onMediaStart(serviceItem) + self.slideSelected(True) + self.previewListWidget.setFocus() + if old_item: + # Close the old item after the new one is opened + # This avoids the service theme/desktop flashing on screen + # However opening a new item of the same type will automatically + # close the previous, so make sure we don't close the new one. + if old_item.is_command() and not serviceItem.is_command(): + Receiver.send_message(u'%s_stop' % + old_item.name.lower(), [old_item, self.isLive]) + if old_item.is_media() and not serviceItem.is_media(): + self.onMediaClose() + Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, + [serviceItem]) + + def __updatePreviewSelection(self, slideno): + """ + Utility method to update the selected slide in the list. + """ + if slideno > self.previewListWidget.rowCount(): + self.previewListWidget.selectRow( + self.previewListWidget.rowCount() - 1) + else: + self.__checkUpdateSelectedSlide(slideno) + + def onTextRequest(self): + """ + Return the text for the current item in controller + """ + data = [] + if self.serviceItem: + for framenumber, frame in enumerate(self.serviceItem.get_frames()): + dataItem = {} + if self.serviceItem.is_text(): + dataItem[u'tag'] = unicode(frame[u'verseTag']) + dataItem[u'text'] = unicode(frame[u'html']) + else: + dataItem[u'tag'] = unicode(framenumber) + dataItem[u'text'] = u'' + dataItem[u'selected'] = \ + (self.previewListWidget.currentRow() == framenumber) + data.append(dataItem) + Receiver.send_message(u'slidecontroller_%s_text_response' + % self.typePrefix, data) + + # Screen event methods + def onSlideSelectedFirst(self): + """ + Go to the first slide. + """ + if not self.serviceItem: + return + if self.serviceItem.is_command(): + Receiver.send_message(u'%s_first' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + self.updatePreview() + else: + self.previewListWidget.selectRow(0) + self.slideSelected() + + def onSlideSelectedIndex(self, message): + """ + Go to the requested slide + """ + index = int(message[0]) + if not self.serviceItem: + return + if self.serviceItem.is_command(): + Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive, index]) + self.updatePreview() + else: + self.__checkUpdateSelectedSlide(index) + self.slideSelected() + + def mainDisplaySetBackground(self): + """ + Allow the main display to blank the main display at startup time + """ + log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) + display_type = QtCore.QSettings().value( + self.parent.generalSettingsSection + u'/screen blank', + QtCore.QVariant(u'')).toString() + if not self.display.primary: + # Order done to handle initial conversion + if display_type == u'themed': + self.onThemeDisplay(True) + elif display_type == u'hidden': + self.onHideDisplay(True) + else: + self.onBlankDisplay(True) + + def onSlideBlank(self): + """ + Handle the slidecontroller blank event + """ + self.onBlankDisplay(True) + + def onSlideUnblank(self): + """ + Handle the slidecontroller unblank event + """ + self.onBlankDisplay(False) + + def onBlankDisplay(self, checked=None): + """ + Handle the blank screen button actions + """ + if checked is None: + checked = self.blankScreen.isChecked() + log.debug(u'onBlankDisplay %s' % checked) + self.hideMenu.setDefaultAction(self.blankScreen) + self.blankScreen.setChecked(checked) + self.themeScreen.setChecked(False) + self.desktopScreen.setChecked(False) + if checked: + QtCore.QSettings().setValue( + self.parent.generalSettingsSection + u'/screen blank', + QtCore.QVariant(u'blanked')) + else: + QtCore.QSettings().remove( + self.parent.generalSettingsSection + u'/screen blank') + self.blankPlugin() + self.updatePreview() + + def onThemeDisplay(self, checked=None): + """ + Handle the Theme screen button + """ + if checked is None: + checked = self.themeScreen.isChecked() + log.debug(u'onThemeDisplay %s' % checked) + self.hideMenu.setDefaultAction(self.themeScreen) + self.blankScreen.setChecked(False) + self.themeScreen.setChecked(checked) + self.desktopScreen.setChecked(False) + if checked: + QtCore.QSettings().setValue( + self.parent.generalSettingsSection + u'/screen blank', + QtCore.QVariant(u'themed')) + else: + QtCore.QSettings().remove( + self.parent.generalSettingsSection + u'/screen blank') + self.blankPlugin() + self.updatePreview() + + def onHideDisplay(self, checked=None): + """ + Handle the Hide screen button + """ + if checked is None: + checked = self.desktopScreen.isChecked() + log.debug(u'onHideDisplay %s' % checked) + self.hideMenu.setDefaultAction(self.desktopScreen) + self.blankScreen.setChecked(False) + self.themeScreen.setChecked(False) + self.desktopScreen.setChecked(checked) + if checked: + QtCore.QSettings().setValue( + self.parent.generalSettingsSection + u'/screen blank', + QtCore.QVariant(u'hidden')) + else: + QtCore.QSettings().remove( + self.parent.generalSettingsSection + u'/screen blank') + self.hidePlugin(checked) + self.updatePreview() + + def blankPlugin(self): + """ + Blank/Hide the display screen within a plugin if required. + """ + hide_mode = self.hideMode() + log.debug(u'blankPlugin %s ', hide_mode) + if self.serviceItem is not None: + if hide_mode: + if not self.serviceItem.is_command(): + Receiver.send_message(u'maindisplay_hide', hide_mode) + Receiver.send_message(u'%s_blank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive, hide_mode]) + else: + if not self.serviceItem.is_command(): + Receiver.send_message(u'maindisplay_show') + Receiver.send_message(u'%s_unblank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + + def hidePlugin(self, hide): + """ + Tell the plugin to hide the display screen. + """ + log.debug(u'hidePlugin %s ', hide) + if self.serviceItem is not None: + if hide: + Receiver.send_message(u'maindisplay_hide', HideMode.Screen) + Receiver.send_message(u'%s_hide' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + else: + if not self.serviceItem.is_command(): + Receiver.send_message(u'maindisplay_show') + Receiver.send_message(u'%s_unblank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + + def onSlideSelected(self, start=False): + """ + Slide selected in controller + """ + self.slideSelected() + + def slideSelected(self, start=False): + """ + Generate the preview when you click on a slide. + if this is the Live Controller also display on the screen + """ + row = self.previewListWidget.currentRow() + self.selectedRow = 0 + if row > -1 and row < self.previewListWidget.rowCount(): + if self.serviceItem.is_command(): + if self.isLive and not start: + Receiver.send_message( + u'%s_slide' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive, row]) + self.updatePreview() + else: + toDisplay = self.serviceItem.get_rendered_frame(row) + if self.serviceItem.is_text(): + frame = self.display.text(toDisplay) + else: + if start: + self.display.buildHtml(self.serviceItem, toDisplay) + frame = self.display.preview() + else: + frame = self.display.image(toDisplay) + # reset the store used to display first image + self.serviceItem.bg_image_bytes = None + self.slidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) + self.selectedRow = row + self.__checkUpdateSelectedSlide(row) + Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, + row) + + def onSlideChange(self, row): + """ + The slide has been changed. Update the slidecontroller accordingly + """ + self.__checkUpdateSelectedSlide(row) + self.updatePreview() + Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, + row) + + def updatePreview(self): + """ + This updates the preview frame, for example after changing a slide or + using *Blank to Theme*. + """ + log.debug(u'updatePreview %s ' % self.screens.current[u'primary']) + if not self.screens.current[u'primary'] and self.serviceItem and \ + self.serviceItem.is_capable(ItemCapabilities.ProvidesOwnDisplay): + # 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: + self.slidePreview.setPixmap( + QtGui.QPixmap.fromImage(self.display.preview())) + + def grabMainDisplay(self): + """ + Creates an image of the current screen and updates the preview frame. + """ + winid = QtGui.QApplication.desktop().winId() + rect = self.screens.current[u'size'] + winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), + rect.y(), rect.width(), rect.height()) + self.slidePreview.setPixmap(winimg) + def onSlideSelectedNext(self): + """ + Go to the next slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command() and self.isLive: + self.updatePreview() + else: + row = self.previewListWidget.currentRow() + 1 + if row == self.previewListWidget.rowCount(): + if QtCore.QSettings().value(u'generalSettingsSection/enable slide loop', QtCore.QVariant(True)).toBool(): + row = 0 + else: + Receiver.send_message('servicemanager_next_item') + return + self.__checkUpdateSelectedSlide(row) + self.slideSelected() + def onSlideSelectedPrevious(self): + """ + Go to the previous slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command() and self.isLive: + self.updatePreview() + else: + row = self.previewListWidget.currentRow() - 1 + if row == -1: + if QtCore.QSettings().value(u'generalSettingsSection/enable slide loop', QtCore.QVariant(True)).toBool(): + row = self.previewListWidget.rowCount() - 1 + else: + row = 0 + self.__checkUpdateSelectedSlide(row) + self.slideSelected() + + def __checkUpdateSelectedSlide(self, row): + if row + 1 < self.previewListWidget.rowCount(): + self.previewListWidget.scrollToItem( + self.previewListWidget.item(row + 1, 0)) + self.previewListWidget.selectRow(row) + + def onSlideSelectedLast(self): + """ + Go to the last slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_last' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command(): + self.updatePreview() + else: + self.previewListWidget.selectRow( + self.previewListWidget.rowCount() - 1) + self.slideSelected() + + def onToggleLoop(self, toggled): + """ + Toggles the loop state. + """ + if self.toolbar.actions[u'Start Loop'].isVisible(): + self.onStartLoop() + else: + self.onStopLoop() + + def onStartLoop(self): + """ + Start the timer loop running and store the timer id + """ + if self.previewListWidget.rowCount() > 1: + self.timer_id = self.startTimer( + int(self.delaySpinBox.value()) * 1000) + self.toolbar.actions[u'Stop Loop'].setVisible(True) + self.toolbar.actions[u'Start Loop'].setVisible(False) + + def onStopLoop(self): + """ + Stop the timer loop running + """ + if self.timer_id != 0: + self.killTimer(self.timer_id) + self.timer_id = 0 + self.toolbar.actions[u'Start Loop'].setVisible(True) + self.toolbar.actions[u'Stop Loop'].setVisible(False) + + def timerEvent(self, event): + """ + If the timer event is for this window select next slide + """ + if event.timerId() == self.timer_id: + self.onSlideSelectedNext() + + def onEditSong(self): + """ + From the preview display requires the service Item to be editied + """ + self.songEdit = True + 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 + """ + row = self.previewListWidget.currentRow() + if row > -1 and row < self.previewListWidget.rowCount(): + if self.serviceItem.from_service: + Receiver.send_message('servicemanager_preview_live', + u'%s:%s' % (self.serviceItem._uuid, row)) + else: + self.parent.liveController.addServiceManagerItem( + self.serviceItem, row) + + def onMediaStart(self, item): + """ + Respond to the arrival of a media service item + """ + log.debug(u'SlideController onMediaStart') + file = os.path.join(item.get_frame_path(), item.get_frame_title()) + if self.isLive: + self.display.video(file, self.volume) + self.volumeSlider.setValue(self.volume) + else: + self.mediaObject.stop() + self.mediaObject.clearQueue() + self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) + self.seekSlider.setMediaObject(self.mediaObject) + self.seekSlider.show() + self.onMediaPlay() + + def mediaVolume(self): + """ + Respond to the release of Volume Slider + """ + log.debug(u'SlideController mediaVolume') + self.volume = self.volumeSlider.value() + self.display.videoVolume(self.volume) + + def onMediaPause(self): + """ + Respond to the Pause from the media Toolbar + """ + log.debug(u'SlideController onMediaPause') + if self.isLive: + self.display.videoPause() + else: + self.mediaObject.pause() + + def onMediaPlay(self): + """ + Respond to the Play from the media Toolbar + """ + log.debug(u'SlideController onMediaPlay') + if self.isLive: + self.display.videoPlay() + else: + self.slidePreview.hide() + self.video.show() + self.mediaObject.play() + + def onMediaStop(self): + """ + Respond to the Stop from the media Toolbar + """ + log.debug(u'SlideController onMediaStop') + if self.isLive: + self.display.videoStop() + else: + self.mediaObject.stop() + self.video.hide() + self.slidePreview.clear() + self.slidePreview.show() + + def onMediaClose(self): + """ + Respond to a request to close the Video + """ + log.debug(u'SlideController onMediaStop') + if self.isLive: + self.display.resetVideo() + else: + self.mediaObject.stop() + self.mediaObject.clearQueue() + self.video.hide() + self.slidePreview.clear() + self.slidePreview.show() + + def _resetBlank(self): + """ + Used by command items which provide their own displays to reset the + screen hide attributes + """ + hide_mode = self.hideMode() + if hide_mode == HideMode.Blank: + self.onBlankDisplay(True) + elif hide_mode == HideMode.Theme: + self.onThemeDisplay(True) + elif hide_mode == HideMode.Screen: + self.onHideDisplay(True) + else: + self.hidePlugin(False) + + def hideMode(self): + """ + Determine what the hide mode should be according to the blank button + """ + if not self.isLive: + return None + elif self.blankScreen.isChecked(): + return HideMode.Blank + elif self.themeScreen.isChecked(): + return HideMode.Theme + elif self.desktopScreen.isChecked(): + return HideMode.Screen + else: + return None From 541feef8ea07185a9ffc0031dbe1b6cd41daf15d Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Tue, 24 May 2011 07:23:55 -0400 Subject: [PATCH 047/124] Another try at the code for enabling loop through a checkbox, seems to work as far as i see --- openlp/core/ui/slidecontroller.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 4da75ebb6..722905c0b 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -928,6 +928,7 @@ class SlideController(QtGui.QWidget): """ Go to the next slide. """ + loopcheck = QtCore.QSettings().value( self.parent.generalSettingsSection + u'generalSettingsSection/enable slide loop', QtCore.QVariant(True).toBool) if not self.serviceItem: return Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), @@ -937,10 +938,9 @@ class SlideController(QtGui.QWidget): else: row = self.previewListWidget.currentRow() + 1 if row == self.previewListWidget.rowCount(): - if QtCore.QSettings().value(u'generalSettingsSection/enable slide loop', QtCore.QVariant(True)).toBool(): + if loopcheck == True: row = 0 else: - Receiver.send_message('servicemanager_next_item') return self.__checkUpdateSelectedSlide(row) self.slideSelected() @@ -948,6 +948,7 @@ class SlideController(QtGui.QWidget): """ Go to the previous slide. """ + loopcheck =QtCore.QSettings().value( self.parent.generalSettingsSection + u'enable slide loop', QtCore.QVariant(True).toBool) if not self.serviceItem: return Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), @@ -957,10 +958,10 @@ class SlideController(QtGui.QWidget): else: row = self.previewListWidget.currentRow() - 1 if row == -1: - if QtCore.QSettings().value(u'generalSettingsSection/enable slide loop', QtCore.QVariant(True)).toBool(): + if loopcheck == True: row = self.previewListWidget.rowCount() - 1 else: - row = 0 + return self.__checkUpdateSelectedSlide(row) self.slideSelected() From b92b733828595284fc61529ff9d076d10381e50e Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Tue, 24 May 2011 18:32:30 -0400 Subject: [PATCH 048/124] corrections and enable slide loop updates --- openlp.pyw | 1 - openlp/core/ui/generaltab.py | 780 +++++----- openlp/core/ui/slidecontroller.py | 2314 +++++++++++++++-------------- 3 files changed, 1548 insertions(+), 1547 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index f3b380c7a..76d334bae 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -257,4 +257,3 @@ if __name__ == u'__main__': Instantiate and run the application. """ main() - diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 8c9336656..95e8dda4e 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -1,390 +1,390 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import SettingsTab, Receiver, translate -from openlp.core.lib.ui import UiStrings -from openlp.core.ui import ScreenList - -log = logging.getLogger(__name__) - -class GeneralTab(SettingsTab): - """ - GeneralTab is the general settings tab in the settings dialog. - """ - def __init__(self, parent): - """ - Initialise the general settings tab - """ - self.screens = ScreenList.get_instance() - self.icon_path = u':/icon/openlp-logo-16x16.png' - generalTranslated = translate('GeneralTab', 'General') - SettingsTab.__init__(self, parent, u'General', generalTranslated) - - def setupUi(self): - """ - Create the user interface for the general settings tab - """ - self.setObjectName(u'GeneralTab') - SettingsTab.setupUi(self) - self.monitorGroupBox = QtGui.QGroupBox(self.leftColumn) - self.monitorGroupBox.setObjectName(u'monitorGroupBox') - self.monitorLayout = QtGui.QFormLayout(self.monitorGroupBox) - self.monitorLayout.setObjectName(u'monitorLayout') - self.monitorLabel = QtGui.QLabel(self.monitorGroupBox) - self.monitorLabel.setObjectName(u'monitorLabel') - self.monitorLayout.addRow(self.monitorLabel) - self.monitorComboBox = QtGui.QComboBox(self.monitorGroupBox) - self.monitorComboBox.setObjectName(u'monitorComboBox') - self.monitorLayout.addRow(self.monitorComboBox) - self.displayOnMonitorCheck = QtGui.QCheckBox(self.monitorGroupBox) - self.displayOnMonitorCheck.setObjectName(u'monitorComboBox') - self.monitorLayout.addRow(self.displayOnMonitorCheck) - self.leftLayout.addWidget(self.monitorGroupBox) - self.startupGroupBox = QtGui.QGroupBox(self.leftColumn) - self.startupGroupBox.setObjectName(u'startupGroupBox') - self.startupLayout = QtGui.QVBoxLayout(self.startupGroupBox) - self.startupLayout.setObjectName(u'startupLayout') - self.warningCheckBox = QtGui.QCheckBox(self.startupGroupBox) - self.warningCheckBox.setObjectName(u'warningCheckBox') - self.startupLayout.addWidget(self.warningCheckBox) - self.autoOpenCheckBox = QtGui.QCheckBox(self.startupGroupBox) - self.autoOpenCheckBox.setObjectName(u'autoOpenCheckBox') - self.startupLayout.addWidget(self.autoOpenCheckBox) - self.showSplashCheckBox = QtGui.QCheckBox(self.startupGroupBox) - self.showSplashCheckBox.setObjectName(u'showSplashCheckBox') - self.startupLayout.addWidget(self.showSplashCheckBox) - self.checkForUpdatesCheckBox = QtGui.QCheckBox(self.startupGroupBox) - self.checkForUpdatesCheckBox.setObjectName(u'checkForUpdatesCheckBox') - self.startupLayout.addWidget(self.checkForUpdatesCheckBox) - self.leftLayout.addWidget(self.startupGroupBox) - self.settingsGroupBox = QtGui.QGroupBox(self.leftColumn) - self.settingsGroupBox.setObjectName(u'settingsGroupBox') - self.settingsLayout = QtGui.QFormLayout(self.settingsGroupBox) - self.settingsLayout.setObjectName(u'settingsLayout') - self.saveCheckServiceCheckBox = QtGui.QCheckBox(self.settingsGroupBox) - self.saveCheckServiceCheckBox.setObjectName(u'saveCheckServiceCheckBox') - self.settingsLayout.addRow(self.saveCheckServiceCheckBox) - self.autoUnblankCheckBox = QtGui.QCheckBox(self.settingsGroupBox) - self.autoUnblankCheckBox.setObjectName(u'autoUnblankCheckBox') - self.settingsLayout.addRow(self.autoUnblankCheckBox) - self.autoPreviewCheckBox = QtGui.QCheckBox(self.settingsGroupBox) - self.autoPreviewCheckBox.setObjectName(u'autoPreviewCheckBox') - self.settingsLayout.addRow(self.autoPreviewCheckBox) - self.enableLoopCheckbox = QtGui.QCheckBox(self.settingsGroupBox) - self.enableLoopCheckbox.setObjectName(u'enableLoopCheckbox') - self.settingsLayout.addRow(self.enableLoopCheckbox) - # Moved here from image tab - self.timeoutLabel = QtGui.QLabel(self.settingsGroupBox) - self.timeoutLabel.setObjectName(u'timeoutLabel') - self.timeoutSpinBox = QtGui.QSpinBox(self.settingsGroupBox) - self.timeoutSpinBox.setObjectName(u'timeoutSpinBox') - self.timeoutSpinBox.setRange(1, 180) - self.settingsLayout.addRow(self.timeoutLabel, self.timeoutSpinBox) - self.leftLayout.addWidget(self.settingsGroupBox) - self.leftLayout.addStretch() - self.ccliGroupBox = QtGui.QGroupBox(self.rightColumn) - self.ccliGroupBox.setObjectName(u'ccliGroupBox') - self.ccliLayout = QtGui.QFormLayout(self.ccliGroupBox) - self.ccliLayout.setObjectName(u'ccliLayout') - self.numberLabel = QtGui.QLabel(self.ccliGroupBox) - self.numberLabel.setObjectName(u'numberLabel') - self.numberEdit = QtGui.QLineEdit(self.ccliGroupBox) - self.numberEdit.setValidator(QtGui.QIntValidator()) - self.numberEdit.setObjectName(u'numberEdit') - self.ccliLayout.addRow(self.numberLabel, self.numberEdit) - self.usernameLabel = QtGui.QLabel(self.ccliGroupBox) - self.usernameLabel.setObjectName(u'usernameLabel') - self.usernameEdit = QtGui.QLineEdit(self.ccliGroupBox) - self.usernameEdit.setObjectName(u'usernameEdit') - self.ccliLayout.addRow(self.usernameLabel, self.usernameEdit) - self.passwordLabel = QtGui.QLabel(self.ccliGroupBox) - self.passwordLabel.setObjectName(u'passwordLabel') - self.passwordEdit = QtGui.QLineEdit(self.ccliGroupBox) - self.passwordEdit.setEchoMode(QtGui.QLineEdit.Password) - self.passwordEdit.setObjectName(u'passwordEdit') - self.ccliLayout.addRow(self.passwordLabel, self.passwordEdit) - self.rightLayout.addWidget(self.ccliGroupBox) - # Moved here from display tab - self.displayGroupBox = QtGui.QGroupBox(self.rightColumn) - self.displayGroupBox.setObjectName(u'displayGroupBox') - self.displayLayout = QtGui.QGridLayout(self.displayGroupBox) - self.displayLayout.setObjectName(u'displayLayout') - self.overrideCheckBox = QtGui.QCheckBox(self.displayGroupBox) - self.overrideCheckBox.setObjectName(u'overrideCheckBox') - self.displayLayout.addWidget(self.overrideCheckBox, 2, 0, 1, 4) - self.rightLayout.addWidget(self.displayGroupBox) - # Custom position - self.customXLabel = QtGui.QLabel(self.displayGroupBox) - self.customXLabel.setObjectName(u'customXLabel') - self.displayLayout.addWidget(self.customXLabel, 3, 0) - self.customXValueEdit = QtGui.QSpinBox(self.displayGroupBox) - self.customXValueEdit.setObjectName(u'customXValueEdit') - self.customXValueEdit.setRange(-9999, 9999) - self.displayLayout.addWidget(self.customXValueEdit, 4, 0) - self.customYLabel = QtGui.QLabel(self.displayGroupBox) - self.customYLabel.setObjectName(u'customYLabel') - self.displayLayout.addWidget(self.customYLabel, 3, 1) - self.customYValueEdit = QtGui.QSpinBox(self.displayGroupBox) - self.customYValueEdit.setObjectName(u'customYValueEdit') - self.customYValueEdit.setRange(-9999, 9999) - self.displayLayout.addWidget(self.customYValueEdit, 4, 1) - self.customWidthLabel = QtGui.QLabel(self.displayGroupBox) - self.customWidthLabel.setObjectName(u'customWidthLabel') - self.displayLayout.addWidget(self.customWidthLabel, 3, 2) - self.customWidthValueEdit = QtGui.QSpinBox(self.displayGroupBox) - self.customWidthValueEdit.setObjectName(u'customWidthValueEdit') - self.customWidthValueEdit.setMaximum(9999) - self.displayLayout.addWidget(self.customWidthValueEdit, 4, 2) - self.customHeightLabel = QtGui.QLabel(self.displayGroupBox) - self.customHeightLabel.setObjectName(u'customHeightLabel') - self.displayLayout.addWidget(self.customHeightLabel, 3, 3) - self.customHeightValueEdit = QtGui.QSpinBox(self.displayGroupBox) - self.customHeightValueEdit.setObjectName(u'customHeightValueEdit') - self.customHeightValueEdit.setMaximum(9999) - self.displayLayout.addWidget(self.customHeightValueEdit, 4, 3) - self.rightLayout.addWidget(self.displayGroupBox) - self.rightLayout.addStretch() - # Signals and slots - QtCore.QObject.connect(self.overrideCheckBox, - QtCore.SIGNAL(u'toggled(bool)'), self.onOverrideCheckBoxToggled) - QtCore.QObject.connect(self.customHeightValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) - QtCore.QObject.connect(self.customWidthValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) - QtCore.QObject.connect(self.customYValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) - QtCore.QObject.connect(self.customXValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) - QtCore.QObject.connect(self.monitorComboBox, - QtCore.SIGNAL(u'currentIndexChanged(int)'), self.onDisplayChanged) - # Reload the tab, as the screen resolution/count may have changed. - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'config_screen_changed'), self.load) - # Remove for now - self.usernameLabel.setVisible(False) - self.usernameEdit.setVisible(False) - self.passwordLabel.setVisible(False) - self.passwordEdit.setVisible(False) - - def retranslateUi(self): - """ - Translate the general settings tab to the currently selected language - """ - self.tabTitleVisible = translate('OpenLP.GeneralTab', 'General') - self.monitorGroupBox.setTitle(translate('OpenLP.GeneralTab', - 'Monitors')) - self.monitorLabel.setText(translate('OpenLP.GeneralTab', - 'Select monitor for output display:')) - self.displayOnMonitorCheck.setText( - translate('OpenLP.GeneralTab', 'Display if a single screen')) - self.startupGroupBox.setTitle( - translate('OpenLP.GeneralTab', 'Application Startup')) - self.warningCheckBox.setText( - translate('OpenLP.GeneralTab', 'Show blank screen warning')) - self.autoOpenCheckBox.setText(translate('OpenLP.GeneralTab', - 'Automatically open the last service')) - self.showSplashCheckBox.setText( - translate('OpenLP.GeneralTab', 'Show the splash screen')) - self.checkForUpdatesCheckBox.setText( - translate('OpenLP.GeneralTab', 'Check for updates to OpenLP')) - self.settingsGroupBox.setTitle( - translate('OpenLP.GeneralTab', 'Application Settings')) - self.saveCheckServiceCheckBox.setText(translate('OpenLP.GeneralTab', - 'Prompt to save before starting a new service')) - self.autoUnblankCheckBox.setText(translate('OpenLP.GeneralTab', - 'Unblank display when adding new live item')) - self.autoPreviewCheckBox.setText(translate('OpenLP.GeneralTab', - 'Automatically preview next item in service')) - self.enableLoopCheckbox.setText(translate('OpenLP.GeneralTab', - 'enable slide loop')) - self.timeoutLabel.setText(translate('OpenLP.GeneralTab', - 'Slide loop delay:')) - self.timeoutSpinBox.setSuffix(translate('OpenLP.GeneralTab', ' sec')) - self.ccliGroupBox.setTitle( - translate('OpenLP.GeneralTab', 'CCLI Details')) - self.numberLabel.setText(UiStrings().CCLINumberLabel) - self.usernameLabel.setText( - translate('OpenLP.GeneralTab', 'SongSelect username:')) - self.passwordLabel.setText( - translate('OpenLP.GeneralTab', 'SongSelect password:')) - # Moved from display tab - self.displayGroupBox.setTitle( - translate('OpenLP.GeneralTab', 'Display Position')) - self.overrideCheckBox.setText(translate('OpenLP.GeneralTab', - 'Override display position')) - self.customXLabel.setText(translate('OpenLP.GeneralTab', 'X')) - self.customYLabel.setText(translate('OpenLP.GeneralTab', 'Y')) - self.customHeightLabel.setText(translate('OpenLP.GeneralTab', 'Height')) - self.customWidthLabel.setText(translate('OpenLP.GeneralTab', 'Width')) - - def load(self): - """ - Load the settings to populate the form - """ - settings = QtCore.QSettings() - settings.beginGroup(self.settingsSection) - self.monitorComboBox.clear() - self.monitorComboBox.addItems(self.screens.get_screen_list()) - monitorNumber = settings.value(u'monitor', - QtCore.QVariant(self.screens.display_count - 1)).toInt()[0] - self.monitorComboBox.setCurrentIndex(monitorNumber) - self.numberEdit.setText(unicode(settings.value( - u'ccli number', QtCore.QVariant(u'')).toString())) - self.usernameEdit.setText(unicode(settings.value( - u'songselect username', QtCore.QVariant(u'')).toString())) - self.passwordEdit.setText(unicode(settings.value( - u'songselect password', QtCore.QVariant(u'')).toString())) - self.saveCheckServiceCheckBox.setChecked(settings.value(u'save prompt', - QtCore.QVariant(False)).toBool()) - self.autoUnblankCheckBox.setChecked(settings.value(u'auto unblank', - QtCore.QVariant(False)).toBool()) - self.displayOnMonitorCheck.setChecked(self.screens.display) - self.warningCheckBox.setChecked(settings.value(u'blank warning', - QtCore.QVariant(False)).toBool()) - self.autoOpenCheckBox.setChecked(settings.value(u'auto open', - QtCore.QVariant(False)).toBool()) - self.showSplashCheckBox.setChecked(settings.value(u'show splash', - QtCore.QVariant(True)).toBool()) - self.checkForUpdatesCheckBox.setChecked(settings.value(u'update check', - QtCore.QVariant(False)).toBool()) - self.autoPreviewCheckBox.setChecked(settings.value(u'auto preview', - QtCore.QVariant(False)).toBool()) - self.enableLoopCheckbox.setChecked(settings.value(u'enable slide loop', - QtCore.QVariant(True)).toBool()) - self.timeoutSpinBox.setValue(settings.value(u'loop delay', - QtCore.QVariant(5)).toInt()[0]) - self.overrideCheckBox.setChecked(settings.value(u'override position', - QtCore.QVariant(False)).toBool()) - self.customXValueEdit.setValue(settings.value(u'x position', - QtCore.QVariant(self.screens.current[u'size'].x())).toInt()[0]) - self.customYValueEdit.setValue(settings.value(u'y position', - QtCore.QVariant(self.screens.current[u'size'].y())).toInt()[0]) - self.customHeightValueEdit.setValue(settings.value(u'height', - QtCore.QVariant(self.screens.current[u'size'].height())).toInt()[0]) - self.customWidthValueEdit.setValue(settings.value(u'width', - QtCore.QVariant(self.screens.current[u'size'].width())).toInt()[0]) - settings.endGroup() - self.customXValueEdit.setEnabled(self.overrideCheckBox.isChecked()) - self.customYValueEdit.setEnabled(self.overrideCheckBox.isChecked()) - self.customHeightValueEdit.setEnabled(self.overrideCheckBox.isChecked()) - self.customWidthValueEdit.setEnabled(self.overrideCheckBox.isChecked()) - self.display_changed = False - - def save(self): - """ - Save the settings from the form - """ - settings = QtCore.QSettings() - settings.beginGroup(self.settingsSection) - settings.setValue(u'monitor', - QtCore.QVariant(self.monitorComboBox.currentIndex())) - settings.setValue(u'display on monitor', - QtCore.QVariant(self.displayOnMonitorCheck.isChecked())) - settings.setValue(u'blank warning', - QtCore.QVariant(self.warningCheckBox.isChecked())) - settings.setValue(u'auto open', - QtCore.QVariant(self.autoOpenCheckBox.isChecked())) - settings.setValue(u'show splash', - QtCore.QVariant(self.showSplashCheckBox.isChecked())) - settings.setValue(u'update check', - QtCore.QVariant(self.checkForUpdatesCheckBox.isChecked())) - settings.setValue(u'save prompt', - QtCore.QVariant(self.saveCheckServiceCheckBox.isChecked())) - settings.setValue(u'auto unblank', - QtCore.QVariant(self.autoUnblankCheckBox.isChecked())) - settings.setValue(u'auto preview', - QtCore.QVariant(self.autoPreviewCheckBox.isChecked())) - settings.setValue(u'enable slide loop', - QtCore.QVariant(self.enableLoopCheckbox.isChecked())) - settings.setValue(u'loop delay', - QtCore.QVariant(self.timeoutSpinBox.value())) - settings.setValue(u'ccli number', - QtCore.QVariant(self.numberEdit.displayText())) - settings.setValue(u'songselect username', - QtCore.QVariant(self.usernameEdit.displayText())) - settings.setValue(u'songselect password', - QtCore.QVariant(self.passwordEdit.displayText())) - settings.setValue(u'x position', - QtCore.QVariant(self.customXValueEdit.value())) - settings.setValue(u'y position', - QtCore.QVariant(self.customYValueEdit.value())) - settings.setValue(u'height', - QtCore.QVariant(self.customHeightValueEdit.value())) - settings.setValue(u'width', - QtCore.QVariant(self.customWidthValueEdit.value())) - settings.setValue(u'override position', - QtCore.QVariant(self.overrideCheckBox.isChecked())) - settings.endGroup() - # On save update the screens as well - self.postSetUp(True) - - def postSetUp(self, postUpdate=False): - """ - Apply settings after settings tab has loaded and most of the - system so must be delayed - """ - Receiver.send_message(u'slidecontroller_live_spin_delay', - self.timeoutSpinBox.value()) - # Do not continue on start up. - if not postUpdate: - return - self.screens.set_current_display(self.monitorComboBox.currentIndex()) - self.screens.display = self.displayOnMonitorCheck.isChecked() - self.screens.override[u'size'] = QtCore.QRect( - self.customXValueEdit.value(), - self.customYValueEdit.value(), - self.customWidthValueEdit.value(), - self.customHeightValueEdit.value()) - if self.overrideCheckBox.isChecked(): - self.screens.set_override_display() - else: - self.screens.reset_current_display() - if self.display_changed: - Receiver.send_message(u'config_screen_changed') - self.display_changed = False - - def onOverrideCheckBoxToggled(self, checked): - """ - Toggle screen state depending on check box state. - - ``checked`` - The state of the check box (boolean). - """ - self.customXValueEdit.setEnabled(checked) - self.customYValueEdit.setEnabled(checked) - self.customHeightValueEdit.setEnabled(checked) - self.customWidthValueEdit.setEnabled(checked) - self.display_changed = True - - def onDisplayChanged(self): - """ - Called when the width, height, x position or y position has changed. - """ - self.display_changed = True - +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 + +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import SettingsTab, Receiver, translate +from openlp.core.lib.ui import UiStrings +from openlp.core.ui import ScreenList + +log = logging.getLogger(__name__) + +class GeneralTab(SettingsTab): + """ + GeneralTab is the general settings tab in the settings dialog. + """ + def __init__(self, parent): + """ + Initialise the general settings tab + """ + self.screens = ScreenList.get_instance() + self.icon_path = u':/icon/openlp-logo-16x16.png' + generalTranslated = translate('GeneralTab', 'General') + SettingsTab.__init__(self, parent, u'General', generalTranslated) + + def setupUi(self): + """ + Create the user interface for the general settings tab + """ + self.setObjectName(u'GeneralTab') + SettingsTab.setupUi(self) + self.monitorGroupBox = QtGui.QGroupBox(self.leftColumn) + self.monitorGroupBox.setObjectName(u'monitorGroupBox') + self.monitorLayout = QtGui.QFormLayout(self.monitorGroupBox) + self.monitorLayout.setObjectName(u'monitorLayout') + self.monitorLabel = QtGui.QLabel(self.monitorGroupBox) + self.monitorLabel.setObjectName(u'monitorLabel') + self.monitorLayout.addRow(self.monitorLabel) + self.monitorComboBox = QtGui.QComboBox(self.monitorGroupBox) + self.monitorComboBox.setObjectName(u'monitorComboBox') + self.monitorLayout.addRow(self.monitorComboBox) + self.displayOnMonitorCheck = QtGui.QCheckBox(self.monitorGroupBox) + self.displayOnMonitorCheck.setObjectName(u'monitorComboBox') + self.monitorLayout.addRow(self.displayOnMonitorCheck) + self.leftLayout.addWidget(self.monitorGroupBox) + self.startupGroupBox = QtGui.QGroupBox(self.leftColumn) + self.startupGroupBox.setObjectName(u'startupGroupBox') + self.startupLayout = QtGui.QVBoxLayout(self.startupGroupBox) + self.startupLayout.setObjectName(u'startupLayout') + self.warningCheckBox = QtGui.QCheckBox(self.startupGroupBox) + self.warningCheckBox.setObjectName(u'warningCheckBox') + self.startupLayout.addWidget(self.warningCheckBox) + self.autoOpenCheckBox = QtGui.QCheckBox(self.startupGroupBox) + self.autoOpenCheckBox.setObjectName(u'autoOpenCheckBox') + self.startupLayout.addWidget(self.autoOpenCheckBox) + self.showSplashCheckBox = QtGui.QCheckBox(self.startupGroupBox) + self.showSplashCheckBox.setObjectName(u'showSplashCheckBox') + self.startupLayout.addWidget(self.showSplashCheckBox) + self.checkForUpdatesCheckBox = QtGui.QCheckBox(self.startupGroupBox) + self.checkForUpdatesCheckBox.setObjectName(u'checkForUpdatesCheckBox') + self.startupLayout.addWidget(self.checkForUpdatesCheckBox) + self.leftLayout.addWidget(self.startupGroupBox) + self.settingsGroupBox = QtGui.QGroupBox(self.leftColumn) + self.settingsGroupBox.setObjectName(u'settingsGroupBox') + self.settingsLayout = QtGui.QFormLayout(self.settingsGroupBox) + self.settingsLayout.setObjectName(u'settingsLayout') + self.saveCheckServiceCheckBox = QtGui.QCheckBox(self.settingsGroupBox) + self.saveCheckServiceCheckBox.setObjectName(u'saveCheckServiceCheckBox') + self.settingsLayout.addRow(self.saveCheckServiceCheckBox) + self.autoUnblankCheckBox = QtGui.QCheckBox(self.settingsGroupBox) + self.autoUnblankCheckBox.setObjectName(u'autoUnblankCheckBox') + self.settingsLayout.addRow(self.autoUnblankCheckBox) + self.autoPreviewCheckBox = QtGui.QCheckBox(self.settingsGroupBox) + self.autoPreviewCheckBox.setObjectName(u'autoPreviewCheckBox') + self.settingsLayout.addRow(self.autoPreviewCheckBox) + self.enableLoopCheckBox = QtGui.QCheckBox(self.settingsGroupBox) + self.enableLoopCheckBox.setObjectName(u'enableLoopCheckBox') + self.settingsLayout.addRow(self.enableLoopCheckBox) + # Moved here from image tab + self.timeoutLabel = QtGui.QLabel(self.settingsGroupBox) + self.timeoutLabel.setObjectName(u'timeoutLabel') + self.timeoutSpinBox = QtGui.QSpinBox(self.settingsGroupBox) + self.timeoutSpinBox.setObjectName(u'timeoutSpinBox') + self.timeoutSpinBox.setRange(1, 180) + self.settingsLayout.addRow(self.timeoutLabel, self.timeoutSpinBox) + self.leftLayout.addWidget(self.settingsGroupBox) + self.leftLayout.addStretch() + self.ccliGroupBox = QtGui.QGroupBox(self.rightColumn) + self.ccliGroupBox.setObjectName(u'ccliGroupBox') + self.ccliLayout = QtGui.QFormLayout(self.ccliGroupBox) + self.ccliLayout.setObjectName(u'ccliLayout') + self.numberLabel = QtGui.QLabel(self.ccliGroupBox) + self.numberLabel.setObjectName(u'numberLabel') + self.numberEdit = QtGui.QLineEdit(self.ccliGroupBox) + self.numberEdit.setValidator(QtGui.QIntValidator()) + self.numberEdit.setObjectName(u'numberEdit') + self.ccliLayout.addRow(self.numberLabel, self.numberEdit) + self.usernameLabel = QtGui.QLabel(self.ccliGroupBox) + self.usernameLabel.setObjectName(u'usernameLabel') + self.usernameEdit = QtGui.QLineEdit(self.ccliGroupBox) + self.usernameEdit.setObjectName(u'usernameEdit') + self.ccliLayout.addRow(self.usernameLabel, self.usernameEdit) + self.passwordLabel = QtGui.QLabel(self.ccliGroupBox) + self.passwordLabel.setObjectName(u'passwordLabel') + self.passwordEdit = QtGui.QLineEdit(self.ccliGroupBox) + self.passwordEdit.setEchoMode(QtGui.QLineEdit.Password) + self.passwordEdit.setObjectName(u'passwordEdit') + self.ccliLayout.addRow(self.passwordLabel, self.passwordEdit) + self.rightLayout.addWidget(self.ccliGroupBox) + # Moved here from display tab + self.displayGroupBox = QtGui.QGroupBox(self.rightColumn) + self.displayGroupBox.setObjectName(u'displayGroupBox') + self.displayLayout = QtGui.QGridLayout(self.displayGroupBox) + self.displayLayout.setObjectName(u'displayLayout') + self.overrideCheckBox = QtGui.QCheckBox(self.displayGroupBox) + self.overrideCheckBox.setObjectName(u'overrideCheckBox') + self.displayLayout.addWidget(self.overrideCheckBox, 2, 0, 1, 4) + self.rightLayout.addWidget(self.displayGroupBox) + # Custom position + self.customXLabel = QtGui.QLabel(self.displayGroupBox) + self.customXLabel.setObjectName(u'customXLabel') + self.displayLayout.addWidget(self.customXLabel, 3, 0) + self.customXValueEdit = QtGui.QSpinBox(self.displayGroupBox) + self.customXValueEdit.setObjectName(u'customXValueEdit') + self.customXValueEdit.setRange(-9999, 9999) + self.displayLayout.addWidget(self.customXValueEdit, 4, 0) + self.customYLabel = QtGui.QLabel(self.displayGroupBox) + self.customYLabel.setObjectName(u'customYLabel') + self.displayLayout.addWidget(self.customYLabel, 3, 1) + self.customYValueEdit = QtGui.QSpinBox(self.displayGroupBox) + self.customYValueEdit.setObjectName(u'customYValueEdit') + self.customYValueEdit.setRange(-9999, 9999) + self.displayLayout.addWidget(self.customYValueEdit, 4, 1) + self.customWidthLabel = QtGui.QLabel(self.displayGroupBox) + self.customWidthLabel.setObjectName(u'customWidthLabel') + self.displayLayout.addWidget(self.customWidthLabel, 3, 2) + self.customWidthValueEdit = QtGui.QSpinBox(self.displayGroupBox) + self.customWidthValueEdit.setObjectName(u'customWidthValueEdit') + self.customWidthValueEdit.setMaximum(9999) + self.displayLayout.addWidget(self.customWidthValueEdit, 4, 2) + self.customHeightLabel = QtGui.QLabel(self.displayGroupBox) + self.customHeightLabel.setObjectName(u'customHeightLabel') + self.displayLayout.addWidget(self.customHeightLabel, 3, 3) + self.customHeightValueEdit = QtGui.QSpinBox(self.displayGroupBox) + self.customHeightValueEdit.setObjectName(u'customHeightValueEdit') + self.customHeightValueEdit.setMaximum(9999) + self.displayLayout.addWidget(self.customHeightValueEdit, 4, 3) + self.rightLayout.addWidget(self.displayGroupBox) + self.rightLayout.addStretch() + # Signals and slots + QtCore.QObject.connect(self.overrideCheckBox, + QtCore.SIGNAL(u'toggled(bool)'), self.onOverrideCheckBoxToggled) + QtCore.QObject.connect(self.customHeightValueEdit, + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) + QtCore.QObject.connect(self.customWidthValueEdit, + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) + QtCore.QObject.connect(self.customYValueEdit, + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) + QtCore.QObject.connect(self.customXValueEdit, + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) + QtCore.QObject.connect(self.monitorComboBox, + QtCore.SIGNAL(u'currentIndexChanged(int)'), self.onDisplayChanged) + # Reload the tab, as the screen resolution/count may have changed. + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'config_screen_changed'), self.load) + # Remove for now + self.usernameLabel.setVisible(False) + self.usernameEdit.setVisible(False) + self.passwordLabel.setVisible(False) + self.passwordEdit.setVisible(False) + + def retranslateUi(self): + """ + Translate the general settings tab to the currently selected language + """ + self.tabTitleVisible = translate('OpenLP.GeneralTab', 'General') + self.monitorGroupBox.setTitle(translate('OpenLP.GeneralTab', + 'Monitors')) + self.monitorLabel.setText(translate('OpenLP.GeneralTab', + 'Select monitor for output display:')) + self.displayOnMonitorCheck.setText( + translate('OpenLP.GeneralTab', 'Display if a single screen')) + self.startupGroupBox.setTitle( + translate('OpenLP.GeneralTab', 'Application Startup')) + self.warningCheckBox.setText( + translate('OpenLP.GeneralTab', 'Show blank screen warning')) + self.autoOpenCheckBox.setText(translate('OpenLP.GeneralTab', + 'Automatically open the last service')) + self.showSplashCheckBox.setText( + translate('OpenLP.GeneralTab', 'Show the splash screen')) + self.checkForUpdatesCheckBox.setText( + translate('OpenLP.GeneralTab', 'Check for updates to OpenLP')) + self.settingsGroupBox.setTitle( + translate('OpenLP.GeneralTab', 'Application Settings')) + self.saveCheckServiceCheckBox.setText(translate('OpenLP.GeneralTab', + 'Prompt to save before starting a new service')) + self.autoUnblankCheckBox.setText(translate('OpenLP.GeneralTab', + 'Unblank display when adding new live item')) + self.autoPreviewCheckBox.setText(translate('OpenLP.GeneralTab', + 'Automatically preview next item in service')) + self.enableLoopCheckBox.setText(translate('OpenLP.GeneralTab', + 'Enable slide loop')) + self.timeoutLabel.setText(translate('OpenLP.GeneralTab', + 'Slide loop delay:')) + self.timeoutSpinBox.setSuffix(translate('OpenLP.GeneralTab', ' sec')) + self.ccliGroupBox.setTitle( + translate('OpenLP.GeneralTab', 'CCLI Details')) + self.numberLabel.setText(UiStrings().CCLINumberLabel) + self.usernameLabel.setText( + translate('OpenLP.GeneralTab', 'SongSelect username:')) + self.passwordLabel.setText( + translate('OpenLP.GeneralTab', 'SongSelect password:')) + # Moved from display tab + self.displayGroupBox.setTitle( + translate('OpenLP.GeneralTab', 'Display Position')) + self.overrideCheckBox.setText(translate('OpenLP.GeneralTab', + 'Override display position')) + self.customXLabel.setText(translate('OpenLP.GeneralTab', 'X')) + self.customYLabel.setText(translate('OpenLP.GeneralTab', 'Y')) + self.customHeightLabel.setText(translate('OpenLP.GeneralTab', 'Height')) + self.customWidthLabel.setText(translate('OpenLP.GeneralTab', 'Width')) + + def load(self): + """ + Load the settings to populate the form + """ + settings = QtCore.QSettings() + settings.beginGroup(self.settingsSection) + self.monitorComboBox.clear() + self.monitorComboBox.addItems(self.screens.get_screen_list()) + monitorNumber = settings.value(u'monitor', + QtCore.QVariant(self.screens.display_count - 1)).toInt()[0] + self.monitorComboBox.setCurrentIndex(monitorNumber) + self.numberEdit.setText(unicode(settings.value( + u'ccli number', QtCore.QVariant(u'')).toString())) + self.usernameEdit.setText(unicode(settings.value( + u'songselect username', QtCore.QVariant(u'')).toString())) + self.passwordEdit.setText(unicode(settings.value( + u'songselect password', QtCore.QVariant(u'')).toString())) + self.saveCheckServiceCheckBox.setChecked(settings.value(u'save prompt', + QtCore.QVariant(False)).toBool()) + self.autoUnblankCheckBox.setChecked(settings.value(u'auto unblank', + QtCore.QVariant(False)).toBool()) + self.displayOnMonitorCheck.setChecked(self.screens.display) + self.warningCheckBox.setChecked(settings.value(u'blank warning', + QtCore.QVariant(False)).toBool()) + self.autoOpenCheckBox.setChecked(settings.value(u'auto open', + QtCore.QVariant(False)).toBool()) + self.showSplashCheckBox.setChecked(settings.value(u'show splash', + QtCore.QVariant(True)).toBool()) + self.checkForUpdatesCheckBox.setChecked(settings.value(u'update check', + QtCore.QVariant(True)).toBool()) + self.autoPreviewCheckBox.setChecked(settings.value(u'auto preview', + QtCore.QVariant(False)).toBool()) + self.enableLoopCheckBox.setChecked(settings.value(u'enable slide loop', + QtCore.QVariant(True)).toBool()) + self.timeoutSpinBox.setValue(settings.value(u'loop delay', + QtCore.QVariant(5)).toInt()[0]) + self.overrideCheckBox.setChecked(settings.value(u'override position', + QtCore.QVariant(False)).toBool()) + self.customXValueEdit.setValue(settings.value(u'x position', + QtCore.QVariant(self.screens.current[u'size'].x())).toInt()[0]) + self.customYValueEdit.setValue(settings.value(u'y position', + QtCore.QVariant(self.screens.current[u'size'].y())).toInt()[0]) + self.customHeightValueEdit.setValue(settings.value(u'height', + QtCore.QVariant(self.screens.current[u'size'].height())).toInt()[0]) + self.customWidthValueEdit.setValue(settings.value(u'width', + QtCore.QVariant(self.screens.current[u'size'].width())).toInt()[0]) + settings.endGroup() + self.customXValueEdit.setEnabled(self.overrideCheckBox.isChecked()) + self.customYValueEdit.setEnabled(self.overrideCheckBox.isChecked()) + self.customHeightValueEdit.setEnabled(self.overrideCheckBox.isChecked()) + self.customWidthValueEdit.setEnabled(self.overrideCheckBox.isChecked()) + self.display_changed = False + + def save(self): + """ + Save the settings from the form + """ + settings = QtCore.QSettings() + settings.beginGroup(self.settingsSection) + settings.setValue(u'monitor', + QtCore.QVariant(self.monitorComboBox.currentIndex())) + settings.setValue(u'display on monitor', + QtCore.QVariant(self.displayOnMonitorCheck.isChecked())) + settings.setValue(u'blank warning', + QtCore.QVariant(self.warningCheckBox.isChecked())) + settings.setValue(u'auto open', + QtCore.QVariant(self.autoOpenCheckBox.isChecked())) + settings.setValue(u'show splash', + QtCore.QVariant(self.showSplashCheckBox.isChecked())) + settings.setValue(u'update check', + QtCore.QVariant(self.checkForUpdatesCheckBox.isChecked())) + settings.setValue(u'save prompt', + QtCore.QVariant(self.saveCheckServiceCheckBox.isChecked())) + settings.setValue(u'auto unblank', + QtCore.QVariant(self.autoUnblankCheckBox.isChecked())) + settings.setValue(u'auto preview', + QtCore.QVariant(self.autoPreviewCheckBox.isChecked())) + settings.setValue(u'enable slide loop', + QtCore.QVariant(self.enableLoopCheckBox.isChecked())) + settings.setValue(u'loop delay', + QtCore.QVariant(self.timeoutSpinBox.value())) + settings.setValue(u'ccli number', + QtCore.QVariant(self.numberEdit.displayText())) + settings.setValue(u'songselect username', + QtCore.QVariant(self.usernameEdit.displayText())) + settings.setValue(u'songselect password', + QtCore.QVariant(self.passwordEdit.displayText())) + settings.setValue(u'x position', + QtCore.QVariant(self.customXValueEdit.value())) + settings.setValue(u'y position', + QtCore.QVariant(self.customYValueEdit.value())) + settings.setValue(u'height', + QtCore.QVariant(self.customHeightValueEdit.value())) + settings.setValue(u'width', + QtCore.QVariant(self.customWidthValueEdit.value())) + settings.setValue(u'override position', + QtCore.QVariant(self.overrideCheckBox.isChecked())) + settings.endGroup() + # On save update the screens as well + self.postSetUp(True) + + def postSetUp(self, postUpdate=False): + """ + Apply settings after settings tab has loaded and most of the + system so must be delayed + """ + Receiver.send_message(u'slidecontroller_live_spin_delay', + self.timeoutSpinBox.value()) + # Do not continue on start up. + if not postUpdate: + return + self.screens.set_current_display(self.monitorComboBox.currentIndex()) + self.screens.display = self.displayOnMonitorCheck.isChecked() + self.screens.override[u'size'] = QtCore.QRect( + self.customXValueEdit.value(), + self.customYValueEdit.value(), + self.customWidthValueEdit.value(), + self.customHeightValueEdit.value()) + if self.overrideCheckBox.isChecked(): + self.screens.set_override_display() + else: + self.screens.reset_current_display() + if self.display_changed: + Receiver.send_message(u'config_screen_changed') + self.display_changed = False + + def onOverrideCheckBoxToggled(self, checked): + """ + Toggle screen state depending on check box state. + + ``checked`` + The state of the check box (boolean). + """ + self.customXValueEdit.setEnabled(checked) + self.customYValueEdit.setEnabled(checked) + self.customHeightValueEdit.setEnabled(checked) + self.customWidthValueEdit.setEnabled(checked) + self.display_changed = True + + def onDisplayChanged(self): + """ + Called when the width, height, x position or y position has changed. + """ + self.display_changed = True + diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 722905c0b..4a0a3bf39 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1,1156 +1,1158 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 - -from PyQt4 import QtCore, QtGui -from PyQt4.phonon import Phonon - -from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ - ItemCapabilities, translate -from openlp.core.lib.ui import UiStrings, shortcut_action -from openlp.core.ui import HideMode, MainDisplay, ScreenList -from openlp.core.utils.actions import ActionList, CategoryOrder - -log = logging.getLogger(__name__) - -class SlideList(QtGui.QTableWidget): - """ - Customised version of QTableWidget which can respond to keyboard - events. - """ - def __init__(self, parent=None, name=None): - QtGui.QTableWidget.__init__(self, parent.controller) - self.parent = parent - - -class SlideController(QtGui.QWidget): - """ - SlideController is the slide controller widget. This widget is what the - user uses to control the displaying of verses/slides/etc on the screen. - """ - def __init__(self, parent, isLive=False): - """ - Set up the Slide Controller. - """ - QtGui.QWidget.__init__(self, parent) - self.isLive = isLive - self.parent = parent - self.screens = ScreenList.get_instance() - self.ratio = float(self.screens.current[u'size'].width()) / \ - float(self.screens.current[u'size'].height()) - self.image_manager = self.parent.image_manager - self.loopList = [ - u'Start Loop', - u'Loop Separator', - u'Image SpinBox' - ] - self.songEditList = [ - u'Edit Song', - ] - self.volume = 10 - self.timer_id = 0 - self.songEdit = False - self.selectedRow = 0 - self.serviceItem = None - self.alertTab = None - self.panel = QtGui.QWidget(parent.controlSplitter) - self.slideList = {} - # Layout for holding panel - self.panelLayout = QtGui.QVBoxLayout(self.panel) - self.panelLayout.setSpacing(0) - self.panelLayout.setMargin(0) - # Type label for the top of the slide controller - self.typeLabel = QtGui.QLabel(self.panel) - if self.isLive: - self.typeLabel.setText(UiStrings().Live) - self.split = 1 - self.typePrefix = u'live' - else: - self.typeLabel.setText(UiStrings().Preview) - self.split = 0 - self.typePrefix = u'preview' - self.typeLabel.setStyleSheet(u'font-weight: bold; font-size: 12pt;') - self.typeLabel.setAlignment(QtCore.Qt.AlignCenter) - self.panelLayout.addWidget(self.typeLabel) - # Splitter - self.splitter = QtGui.QSplitter(self.panel) - self.splitter.setOrientation(QtCore.Qt.Vertical) - self.panelLayout.addWidget(self.splitter) - # Actual controller section - self.controller = QtGui.QWidget(self.splitter) - self.controller.setGeometry(QtCore.QRect(0, 0, 100, 536)) - self.controller.setSizePolicy( - QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, - QtGui.QSizePolicy.Maximum)) - self.controllerLayout = QtGui.QVBoxLayout(self.controller) - self.controllerLayout.setSpacing(0) - self.controllerLayout.setMargin(0) - # Controller list view - self.previewListWidget = SlideList(self) - self.previewListWidget.setColumnCount(1) - self.previewListWidget.horizontalHeader().setVisible(False) - self.previewListWidget.setColumnWidth(0, self.controller.width()) - self.previewListWidget.isLive = self.isLive - self.previewListWidget.setObjectName(u'PreviewListWidget') - self.previewListWidget.setSelectionBehavior( - QtGui.QAbstractItemView.SelectRows) - self.previewListWidget.setSelectionMode( - QtGui.QAbstractItemView.SingleSelection) - self.previewListWidget.setEditTriggers( - QtGui.QAbstractItemView.NoEditTriggers) - self.previewListWidget.setHorizontalScrollBarPolicy( - QtCore.Qt.ScrollBarAlwaysOff) - self.previewListWidget.setAlternatingRowColors(True) - self.controllerLayout.addWidget(self.previewListWidget) - # Build the full toolbar - self.toolbar = OpenLPToolbar(self) - sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) - sizeToolbarPolicy.setHorizontalStretch(0) - sizeToolbarPolicy.setVerticalStretch(0) - sizeToolbarPolicy.setHeightForWidth( - self.toolbar.sizePolicy().hasHeightForWidth()) - self.toolbar.setSizePolicy(sizeToolbarPolicy) - self.previousItem = self.toolbar.addToolbarButton( - translate('OpenLP.SlideController', 'Previous Slide'), - u':/slides/slide_previous.png', - translate('OpenLP.SlideController', 'Move to previous'), - self.onSlideSelectedPrevious, - shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.nextItem = self.toolbar.addToolbarButton( - translate('OpenLP.SlideController', 'Next Slide'), - u':/slides/slide_next.png', - translate('OpenLP.SlideController', 'Move to next'), - self.onSlideSelectedNext, - shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.toolbar.addToolbarSeparator(u'Close Separator') - if self.isLive: - self.hideMenu = QtGui.QToolButton(self.toolbar) - self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide')) - self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) - self.toolbar.addToolbarWidget(u'Hide Menu', self.hideMenu) - self.hideMenu.setMenu(QtGui.QMenu( - translate('OpenLP.SlideController', 'Hide'), self.toolbar)) - self.blankScreen = shortcut_action(self.hideMenu, u'blankScreen', - [QtCore.Qt.Key_Period], self.onBlankDisplay, - u':/slides/slide_blank.png', False, UiStrings().LiveToolbar) - self.blankScreen.setText( - translate('OpenLP.SlideController', 'Blank Screen')) - self.themeScreen = shortcut_action(self.hideMenu, u'themeScreen', - [QtGui.QKeySequence(u'T')], self.onThemeDisplay, - u':/slides/slide_theme.png', False, UiStrings().LiveToolbar) - self.themeScreen.setText( - translate('OpenLP.SlideController', 'Blank to Theme')) - self.desktopScreen = shortcut_action(self.hideMenu, - u'desktopScreen', [QtGui.QKeySequence(u'D')], - self.onHideDisplay, u':/slides/slide_desktop.png', False, - UiStrings().LiveToolbar) - self.desktopScreen.setText( - translate('OpenLP.SlideController', 'Show Desktop')) - self.hideMenu.setDefaultAction(self.blankScreen) - self.hideMenu.menu().addAction(self.blankScreen) - self.hideMenu.menu().addAction(self.themeScreen) - self.hideMenu.menu().addAction(self.desktopScreen) - self.toolbar.addToolbarSeparator(u'Loop Separator') - startLoop = self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Start Loop', u':/media/media_time.png', - translate('OpenLP.SlideController', 'Start continuous loop'), - self.onStartLoop) - action_list = ActionList.get_instance() - action_list.add_action(startLoop, UiStrings().LiveToolbar) - stopLoop = self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Stop Loop', u':/media/media_stop.png', - translate('OpenLP.SlideController', 'Stop continuous loop'), - self.onStopLoop) - action_list.add_action(stopLoop, UiStrings().LiveToolbar) - self.toogleLoop = shortcut_action(self, u'toogleLoop', - [QtGui.QKeySequence(u'L')], self.onToggleLoop, - category=UiStrings().LiveToolbar) - self.toogleLoop.setText(translate('OpenLP.SlideController', - 'Start/Stop continuous loop')) - self.addAction(self.toogleLoop) - self.delaySpinBox = QtGui.QSpinBox() - self.delaySpinBox.setRange(1, 180) - self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox) - self.delaySpinBox.setSuffix(UiStrings().Seconds) - self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', - 'Delay between slides in seconds')) - else: - self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Go Live', u':/general/general_live.png', - translate('OpenLP.SlideController', 'Move to live'), - self.onGoLive) - self.toolbar.addToolbarSeparator(u'Close Separator') - self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Edit Song', u':/general/general_edit.png', - translate('OpenLP.SlideController', - 'Edit and reload song preview'), - self.onEditSong) - self.controllerLayout.addWidget(self.toolbar) - # Build a Media ToolBar - self.mediabar = OpenLPToolbar(self) - self.mediabar.addToolbarButton( - u'Media Start', u':/slides/media_playback_start.png', - translate('OpenLP.SlideController', 'Start playing media'), - self.onMediaPlay) - self.mediabar.addToolbarButton( - u'Media Pause', u':/slides/media_playback_pause.png', - translate('OpenLP.SlideController', 'Start playing media'), - self.onMediaPause) - self.mediabar.addToolbarButton( - u'Media Stop', u':/slides/media_playback_stop.png', - translate('OpenLP.SlideController', 'Start playing media'), - self.onMediaStop) - if self.isLive: - # Build the Song Toolbar - self.songMenu = QtGui.QToolButton(self.toolbar) - self.songMenu.setText(translate('OpenLP.SlideController', 'Go To')) - self.songMenu.setPopupMode(QtGui.QToolButton.InstantPopup) - self.toolbar.addToolbarWidget(u'Song Menu', self.songMenu) - self.songMenu.setMenu(QtGui.QMenu( - translate('OpenLP.SlideController', 'Go To'), self.toolbar)) - self.toolbar.makeWidgetsInvisible([u'Song Menu']) - # Build the volumeSlider. - self.volumeSlider = QtGui.QSlider(QtCore.Qt.Horizontal) - self.volumeSlider.setTickInterval(1) - self.volumeSlider.setTickPosition(QtGui.QSlider.TicksAbove) - self.volumeSlider.setMinimum(0) - self.volumeSlider.setMaximum(10) - else: - # Build the seekSlider. - self.seekSlider = Phonon.SeekSlider() - self.seekSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) - self.seekSlider.setObjectName(u'seekSlider') - self.mediabar.addToolbarWidget(u'Seek Slider', self.seekSlider) - self.volumeSlider = Phonon.VolumeSlider() - self.volumeSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) - self.volumeSlider.setObjectName(u'volumeSlider') - self.mediabar.addToolbarWidget(u'Audio Volume', self.volumeSlider) - self.controllerLayout.addWidget(self.mediabar) - # Screen preview area - self.previewFrame = QtGui.QFrame(self.splitter) - self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) - self.previewFrame.setMinimumHeight(100) - self.previewFrame.setSizePolicy(QtGui.QSizePolicy( - QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored, - QtGui.QSizePolicy.Label)) - self.previewFrame.setFrameShape(QtGui.QFrame.StyledPanel) - self.previewFrame.setFrameShadow(QtGui.QFrame.Sunken) - self.previewFrame.setObjectName(u'PreviewFrame') - self.grid = QtGui.QGridLayout(self.previewFrame) - self.grid.setMargin(8) - self.grid.setObjectName(u'grid') - self.slideLayout = QtGui.QVBoxLayout() - self.slideLayout.setSpacing(0) - self.slideLayout.setMargin(0) - self.slideLayout.setObjectName(u'SlideLayout') - if not self.isLive: - self.mediaObject = Phonon.MediaObject(self) - self.video = Phonon.VideoWidget() - self.video.setVisible(False) - self.audio = Phonon.AudioOutput(Phonon.VideoCategory, - self.mediaObject) - Phonon.createPath(self.mediaObject, self.video) - Phonon.createPath(self.mediaObject, self.audio) - self.video.setGeometry(QtCore.QRect(0, 0, 300, 225)) - self.slideLayout.insertWidget(0, self.video) - # Actual preview screen - self.slidePreview = QtGui.QLabel(self) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.slidePreview.sizePolicy().hasHeightForWidth()) - self.slidePreview.setSizePolicy(sizePolicy) - self.slidePreview.setFrameShape(QtGui.QFrame.Box) - self.slidePreview.setFrameShadow(QtGui.QFrame.Plain) - self.slidePreview.setLineWidth(1) - self.slidePreview.setScaledContents(True) - self.slidePreview.setObjectName(u'SlidePreview') - self.slideLayout.insertWidget(0, self.slidePreview) - self.grid.addLayout(self.slideLayout, 0, 0, 1, 1) - # Signals - QtCore.QObject.connect(self.previewListWidget, - QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) - 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) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), - self.receiveSpinDelay) - self.toolbar.makeWidgetsInvisible(self.loopList) - self.toolbar.actions[u'Stop Loop'].setVisible(False) - else: - QtCore.QObject.connect(self.previewListWidget, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.onGoLiveClick) - self.toolbar.makeWidgetsInvisible(self.songEditList) - self.mediabar.setVisible(False) - if self.isLive: - self.setLiveHotkeys(self) - self.__addActionsToWidget(self.previewListWidget) - else: - self.setPreviewHotkeys() - self.previewListWidget.addActions( - [self.nextItem, - self.previousItem]) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.typePrefix), - self.onStopLoop) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_first' % self.typePrefix), - self.onSlideSelectedFirst) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_next' % self.typePrefix), - self.onSlideSelectedNext) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.typePrefix), - self.onSlideSelectedPrevious) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_last' % self.typePrefix), - self.onSlideSelectedLast) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_change' % self.typePrefix), - self.onSlideChange) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_set' % self.typePrefix), - self.onSlideSelectedIndex) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.typePrefix), - self.onSlideBlank) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix), - self.onSlideUnblank) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.typePrefix), - self.onTextRequest) - - def setPreviewHotkeys(self, parent=None): - self.previousItem.setObjectName(u'previousItemPreview') - self.nextItem.setObjectName(u'nextItemPreview') - action_list = ActionList.get_instance() - action_list.add_action(self.previousItem) - action_list.add_action(self.nextItem) - - def setLiveHotkeys(self, parent=None): - self.previousItem.setObjectName(u'previousItemLive') - self.nextItem.setObjectName(u'nextItemLive') - action_list = ActionList.get_instance() - action_list.add_category( - UiStrings().LiveToolbar, CategoryOrder.standardToolbar) - action_list.add_action(self.previousItem) - action_list.add_action(self.nextItem) - self.previousService = shortcut_action(parent, u'previousService', - [QtCore.Qt.Key_Left], self.servicePrevious, - category=UiStrings().LiveToolbar, - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.previousService.setText( - translate('OpenLP.SlideController', 'Previous Service')) - self.nextService = shortcut_action(parent, 'nextService', - [QtCore.Qt.Key_Right], self.serviceNext, - category=UiStrings().LiveToolbar, - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.nextService.setText( - translate('OpenLP.SlideController', 'Next Service')) - self.escapeItem = shortcut_action(parent, 'escapeItem', - [QtCore.Qt.Key_Escape], self.liveEscape, - category=UiStrings().LiveToolbar, - context=QtCore.Qt.WidgetWithChildrenShortcut) - self.escapeItem.setText( - translate('OpenLP.SlideController', 'Escape Item')) - - def liveEscape(self): - self.display.setVisible(False) - self.display.videoStop() - - def servicePrevious(self): - Receiver.send_message('servicemanager_previous_item') - - def serviceNext(self): - Receiver.send_message('servicemanager_next_item') - - def screenSizeChanged(self): - """ - Settings dialog has changed the screen size of adjust output and - screen previews. - """ - # rebuild display as screen size changed - self.display = MainDisplay(self, self.image_manager, self.isLive) - self.display.alertTab = self.alertTab - self.display.setup() - if self.isLive: - self.__addActionsToWidget(self.display) - # The SlidePreview's ratio. - self.ratio = float(self.screens.current[u'size'].width()) / \ - float(self.screens.current[u'size'].height()) - self.previewSizeChanged() - if self.serviceItem: - self.refreshServiceItem() - - def __addActionsToWidget(self, widget): - widget.addActions([ - self.previousItem, self.nextItem, - self.previousService, self.nextService, - self.escapeItem]) - - def previewSizeChanged(self): - """ - Takes care of the SlidePreview's size. Is called when one of the the - splitters is moved or when the screen size is changed. Note, that this - method is (also) called frequently from the mainwindow *paintEvent*. - """ - if self.ratio < float(self.previewFrame.width()) / float( - self.previewFrame.height()): - # We have to take the height as limit. - max_height = self.previewFrame.height() - self.grid.margin() * 2 - self.slidePreview.setFixedSize(QtCore.QSize(max_height * self.ratio, - max_height)) - else: - # We have to take the width as limit. - max_width = self.previewFrame.width() - self.grid.margin() * 2 - self.slidePreview.setFixedSize(QtCore.QSize(max_width, - max_width / self.ratio)) - # Make sure that the frames have the correct size. - self.previewListWidget.setColumnWidth(0, - self.previewListWidget.viewport().size().width()) - if self.serviceItem: - # Sort out songs, bibles, etc. - if self.serviceItem.is_text(): - self.previewListWidget.resizeRowsToContents() - else: - # Sort out image heights. - width = self.parent.controlSplitter.sizes()[self.split] - for framenumber in range(len(self.serviceItem.get_frames())): - self.previewListWidget.setRowHeight( - framenumber, width / self.ratio) - - def onSongBarHandler(self): - request = unicode(self.sender().text()) - slideno = self.slideList[request] - self.__updatePreviewSelection(slideno) - self.slideSelected() - - def receiveSpinDelay(self, value): - """ - Adjusts the value of the ``delaySpinBox`` to the given one. - """ - self.delaySpinBox.setValue(int(value)) - - def enableToolBar(self, item): - """ - Allows the toolbars to be reconfigured based on Controller Type - and ServiceItem Type - """ - if self.isLive: - self.enableLiveToolBar(item) - else: - self.enablePreviewToolBar(item) - - def enableLiveToolBar(self, item): - """ - Allows the live toolbar to be customised - """ - self.toolbar.setVisible(True) - self.mediabar.setVisible(False) - self.toolbar.makeWidgetsInvisible([u'Song Menu']) - self.toolbar.makeWidgetsInvisible(self.loopList) - self.toogleLoop.setEnabled(False) - self.toolbar.actions[u'Start Loop'].setEnabled(False) - self.toolbar.actions[u'Stop Loop'].setEnabled(False) - self.toolbar.actions[u'Stop Loop'].setVisible(False) - if item.is_text(): - if QtCore.QSettings().value( - 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 \ - len(item.get_frames()) > 1: - self.toolbar.makeWidgetsVisible(self.loopList) - self.toogleLoop.setEnabled(True) - self.toolbar.actions[u'Start Loop'].setEnabled(True) - self.toolbar.actions[u'Stop Loop'].setEnabled(True) - if item.is_media(): - self.toolbar.setVisible(False) - self.mediabar.setVisible(True) - - def enablePreviewToolBar(self, item): - """ - Allows the Preview toolbar to be customised - """ - self.toolbar.setVisible(True) - self.mediabar.setVisible(False) - self.toolbar.makeWidgetsInvisible(self.songEditList) - if item.is_capable(ItemCapabilities.AllowsEdit) and item.from_plugin: - self.toolbar.makeWidgetsVisible(self.songEditList) - elif item.is_media(): - self.toolbar.setVisible(False) - self.mediabar.setVisible(True) - self.volumeSlider.setAudioOutput(self.audio) - - def refreshServiceItem(self): - """ - Method to update the service item if the screen has changed - """ - log.debug(u'refreshServiceItem live = %s' % self.isLive) - if self.serviceItem.is_text() or self.serviceItem.is_image(): - item = self.serviceItem - item.render() - self._processItem(item, self.selectedRow) - - def addServiceItem(self, item): - """ - Method to install the service item into the controller - Called by plugins - """ - log.debug(u'addServiceItem live = %s' % self.isLive) - item.render() - slideno = 0 - if self.songEdit: - slideno = self.selectedRow - self.songEdit = False - self._processItem(item, slideno) - - def replaceServiceManagerItem(self, item): - """ - Replacement item following a remote edit - """ - if item.__eq__(self.serviceItem): - self._processItem(item, self.previewListWidget.currentRow()) - - def addServiceManagerItem(self, item, slideno): - """ - Method to install the service item into the controller and - request the correct toolbar for the plugin. - Called by ServiceManager - """ - log.debug(u'addServiceManagerItem live = %s' % self.isLive) - # If no valid slide number is specified we take the first one. - if slideno == -1: - slideno = 0 - # If service item is the same as the current on only change slide - if item.__eq__(self.serviceItem): - self.__checkUpdateSelectedSlide(slideno) - self.slideSelected() - return - self._processItem(item, slideno) - - def _processItem(self, serviceItem, slideno): - """ - Loads a ServiceItem into the system from ServiceManager - Display the slide number passed - """ - log.debug(u'processManagerItem live = %s' % self.isLive) - self.onStopLoop() - old_item = self.serviceItem - self.serviceItem = serviceItem - if old_item and self.isLive and old_item.is_capable( - ItemCapabilities.ProvidesOwnDisplay): - self._resetBlank() - Receiver.send_message(u'%s_start' % serviceItem.name.lower(), - [serviceItem, self.isLive, self.hideMode(), slideno]) - self.slideList = {} - width = self.parent.controlSplitter.sizes()[self.split] - self.previewListWidget.clear() - self.previewListWidget.setRowCount(0) - self.previewListWidget.setColumnWidth(0, width) - if self.isLive: - self.songMenu.menu().clear() - row = 0 - text = [] - for framenumber, frame in enumerate(self.serviceItem.get_frames()): - self.previewListWidget.setRowCount( - self.previewListWidget.rowCount() + 1) - item = QtGui.QTableWidgetItem() - slideHeight = 0 - if self.serviceItem.is_text(): - if frame[u'verseTag']: - # These tags are already translated. - verse_def = frame[u'verseTag'] - verse_def = u'%s%s' % (verse_def[0], verse_def[1:]) - two_line_def = u'%s\n%s' % (verse_def[0], verse_def[1:]) - row = two_line_def - if self.isLive: - if verse_def not in self.slideList: - self.slideList[verse_def] = framenumber - self.songMenu.menu().addAction(verse_def, - self.onSongBarHandler) - else: - row += 1 - item.setText(frame[u'text']) - else: - label = QtGui.QLabel() - label.setMargin(4) - label.setScaledContents(True) - if self.serviceItem.is_command(): - image = resize_image(frame[u'image'], - self.parent.renderer.width, - self.parent.renderer.height) - else: - # If current slide set background to image - if framenumber == slideno: - self.serviceItem.bg_image_bytes = \ - self.image_manager.get_image_bytes(frame[u'title']) - image = self.image_manager.get_image(frame[u'title']) - label.setPixmap(QtGui.QPixmap.fromImage(image)) - self.previewListWidget.setCellWidget(framenumber, 0, label) - slideHeight = width * self.parent.renderer.screen_ratio - row += 1 - text.append(unicode(row)) - self.previewListWidget.setItem(framenumber, 0, item) - if slideHeight != 0: - self.previewListWidget.setRowHeight(framenumber, slideHeight) - self.previewListWidget.setVerticalHeaderLabels(text) - if self.serviceItem.is_text(): - self.previewListWidget.resizeRowsToContents() - self.previewListWidget.setColumnWidth(0, - self.previewListWidget.viewport().size().width()) - self.__updatePreviewSelection(slideno) - self.enableToolBar(serviceItem) - # Pass to display for viewing. - # Postpone image build, we need to do this later to avoid the theme - # flashing on the screen - if not self.serviceItem.is_image(): - self.display.buildHtml(self.serviceItem) - if serviceItem.is_media(): - self.onMediaStart(serviceItem) - self.slideSelected(True) - self.previewListWidget.setFocus() - if old_item: - # Close the old item after the new one is opened - # This avoids the service theme/desktop flashing on screen - # However opening a new item of the same type will automatically - # close the previous, so make sure we don't close the new one. - if old_item.is_command() and not serviceItem.is_command(): - Receiver.send_message(u'%s_stop' % - old_item.name.lower(), [old_item, self.isLive]) - if old_item.is_media() and not serviceItem.is_media(): - self.onMediaClose() - Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, - [serviceItem]) - - def __updatePreviewSelection(self, slideno): - """ - Utility method to update the selected slide in the list. - """ - if slideno > self.previewListWidget.rowCount(): - self.previewListWidget.selectRow( - self.previewListWidget.rowCount() - 1) - else: - self.__checkUpdateSelectedSlide(slideno) - - def onTextRequest(self): - """ - Return the text for the current item in controller - """ - data = [] - if self.serviceItem: - for framenumber, frame in enumerate(self.serviceItem.get_frames()): - dataItem = {} - if self.serviceItem.is_text(): - dataItem[u'tag'] = unicode(frame[u'verseTag']) - dataItem[u'text'] = unicode(frame[u'html']) - else: - dataItem[u'tag'] = unicode(framenumber) - dataItem[u'text'] = u'' - dataItem[u'selected'] = \ - (self.previewListWidget.currentRow() == framenumber) - data.append(dataItem) - Receiver.send_message(u'slidecontroller_%s_text_response' - % self.typePrefix, data) - - # Screen event methods - def onSlideSelectedFirst(self): - """ - Go to the first slide. - """ - if not self.serviceItem: - return - if self.serviceItem.is_command(): - Receiver.send_message(u'%s_first' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - self.updatePreview() - else: - self.previewListWidget.selectRow(0) - self.slideSelected() - - def onSlideSelectedIndex(self, message): - """ - Go to the requested slide - """ - index = int(message[0]) - if not self.serviceItem: - return - if self.serviceItem.is_command(): - Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive, index]) - self.updatePreview() - else: - self.__checkUpdateSelectedSlide(index) - self.slideSelected() - - def mainDisplaySetBackground(self): - """ - Allow the main display to blank the main display at startup time - """ - log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) - display_type = QtCore.QSettings().value( - self.parent.generalSettingsSection + u'/screen blank', - QtCore.QVariant(u'')).toString() - if not self.display.primary: - # Order done to handle initial conversion - if display_type == u'themed': - self.onThemeDisplay(True) - elif display_type == u'hidden': - self.onHideDisplay(True) - else: - self.onBlankDisplay(True) - - def onSlideBlank(self): - """ - Handle the slidecontroller blank event - """ - self.onBlankDisplay(True) - - def onSlideUnblank(self): - """ - Handle the slidecontroller unblank event - """ - self.onBlankDisplay(False) - - def onBlankDisplay(self, checked=None): - """ - Handle the blank screen button actions - """ - if checked is None: - checked = self.blankScreen.isChecked() - log.debug(u'onBlankDisplay %s' % checked) - self.hideMenu.setDefaultAction(self.blankScreen) - self.blankScreen.setChecked(checked) - self.themeScreen.setChecked(False) - self.desktopScreen.setChecked(False) - if checked: - QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', - QtCore.QVariant(u'blanked')) - else: - QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') - self.blankPlugin() - self.updatePreview() - - def onThemeDisplay(self, checked=None): - """ - Handle the Theme screen button - """ - if checked is None: - checked = self.themeScreen.isChecked() - log.debug(u'onThemeDisplay %s' % checked) - self.hideMenu.setDefaultAction(self.themeScreen) - self.blankScreen.setChecked(False) - self.themeScreen.setChecked(checked) - self.desktopScreen.setChecked(False) - if checked: - QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', - QtCore.QVariant(u'themed')) - else: - QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') - self.blankPlugin() - self.updatePreview() - - def onHideDisplay(self, checked=None): - """ - Handle the Hide screen button - """ - if checked is None: - checked = self.desktopScreen.isChecked() - log.debug(u'onHideDisplay %s' % checked) - self.hideMenu.setDefaultAction(self.desktopScreen) - self.blankScreen.setChecked(False) - self.themeScreen.setChecked(False) - self.desktopScreen.setChecked(checked) - if checked: - QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', - QtCore.QVariant(u'hidden')) - else: - QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') - self.hidePlugin(checked) - self.updatePreview() - - def blankPlugin(self): - """ - Blank/Hide the display screen within a plugin if required. - """ - hide_mode = self.hideMode() - log.debug(u'blankPlugin %s ', hide_mode) - if self.serviceItem is not None: - if hide_mode: - if not self.serviceItem.is_command(): - Receiver.send_message(u'maindisplay_hide', hide_mode) - Receiver.send_message(u'%s_blank' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive, hide_mode]) - else: - if not self.serviceItem.is_command(): - Receiver.send_message(u'maindisplay_show') - Receiver.send_message(u'%s_unblank' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - - def hidePlugin(self, hide): - """ - Tell the plugin to hide the display screen. - """ - log.debug(u'hidePlugin %s ', hide) - if self.serviceItem is not None: - if hide: - Receiver.send_message(u'maindisplay_hide', HideMode.Screen) - Receiver.send_message(u'%s_hide' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - else: - if not self.serviceItem.is_command(): - Receiver.send_message(u'maindisplay_show') - Receiver.send_message(u'%s_unblank' - % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - - def onSlideSelected(self, start=False): - """ - Slide selected in controller - """ - self.slideSelected() - - def slideSelected(self, start=False): - """ - Generate the preview when you click on a slide. - if this is the Live Controller also display on the screen - """ - row = self.previewListWidget.currentRow() - self.selectedRow = 0 - if row > -1 and row < self.previewListWidget.rowCount(): - if self.serviceItem.is_command(): - if self.isLive and not start: - Receiver.send_message( - u'%s_slide' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive, row]) - self.updatePreview() - else: - toDisplay = self.serviceItem.get_rendered_frame(row) - if self.serviceItem.is_text(): - frame = self.display.text(toDisplay) - else: - if start: - self.display.buildHtml(self.serviceItem, toDisplay) - frame = self.display.preview() - else: - frame = self.display.image(toDisplay) - # reset the store used to display first image - self.serviceItem.bg_image_bytes = None - self.slidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) - self.selectedRow = row - self.__checkUpdateSelectedSlide(row) - Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, - row) - - def onSlideChange(self, row): - """ - The slide has been changed. Update the slidecontroller accordingly - """ - self.__checkUpdateSelectedSlide(row) - self.updatePreview() - Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, - row) - - def updatePreview(self): - """ - This updates the preview frame, for example after changing a slide or - using *Blank to Theme*. - """ - log.debug(u'updatePreview %s ' % self.screens.current[u'primary']) - if not self.screens.current[u'primary'] and self.serviceItem and \ - self.serviceItem.is_capable(ItemCapabilities.ProvidesOwnDisplay): - # 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: - self.slidePreview.setPixmap( - QtGui.QPixmap.fromImage(self.display.preview())) - - def grabMainDisplay(self): - """ - Creates an image of the current screen and updates the preview frame. - """ - winid = QtGui.QApplication.desktop().winId() - rect = self.screens.current[u'size'] - winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), - rect.y(), rect.width(), rect.height()) - self.slidePreview.setPixmap(winimg) - def onSlideSelectedNext(self): - """ - Go to the next slide. - """ - loopcheck = QtCore.QSettings().value( self.parent.generalSettingsSection + u'generalSettingsSection/enable slide loop', QtCore.QVariant(True).toBool) - if not self.serviceItem: - return - Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command() and self.isLive: - self.updatePreview() - else: - row = self.previewListWidget.currentRow() + 1 - if row == self.previewListWidget.rowCount(): - if loopcheck == True: - row = 0 - else: - return - self.__checkUpdateSelectedSlide(row) - self.slideSelected() - def onSlideSelectedPrevious(self): - """ - Go to the previous slide. - """ - loopcheck =QtCore.QSettings().value( self.parent.generalSettingsSection + u'enable slide loop', QtCore.QVariant(True).toBool) - if not self.serviceItem: - return - Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command() and self.isLive: - self.updatePreview() - else: - row = self.previewListWidget.currentRow() - 1 - if row == -1: - if loopcheck == True: - row = self.previewListWidget.rowCount() - 1 - else: - return - self.__checkUpdateSelectedSlide(row) - self.slideSelected() - - def __checkUpdateSelectedSlide(self, row): - if row + 1 < self.previewListWidget.rowCount(): - self.previewListWidget.scrollToItem( - self.previewListWidget.item(row + 1, 0)) - self.previewListWidget.selectRow(row) - - def onSlideSelectedLast(self): - """ - Go to the last slide. - """ - if not self.serviceItem: - return - Receiver.send_message(u'%s_last' % self.serviceItem.name.lower(), - [self.serviceItem, self.isLive]) - if self.serviceItem.is_command(): - self.updatePreview() - else: - self.previewListWidget.selectRow( - self.previewListWidget.rowCount() - 1) - self.slideSelected() - - def onToggleLoop(self, toggled): - """ - Toggles the loop state. - """ - if self.toolbar.actions[u'Start Loop'].isVisible(): - self.onStartLoop() - else: - self.onStopLoop() - - def onStartLoop(self): - """ - Start the timer loop running and store the timer id - """ - if self.previewListWidget.rowCount() > 1: - self.timer_id = self.startTimer( - int(self.delaySpinBox.value()) * 1000) - self.toolbar.actions[u'Stop Loop'].setVisible(True) - self.toolbar.actions[u'Start Loop'].setVisible(False) - - def onStopLoop(self): - """ - Stop the timer loop running - """ - if self.timer_id != 0: - self.killTimer(self.timer_id) - self.timer_id = 0 - self.toolbar.actions[u'Start Loop'].setVisible(True) - self.toolbar.actions[u'Stop Loop'].setVisible(False) - - def timerEvent(self, event): - """ - If the timer event is for this window select next slide - """ - if event.timerId() == self.timer_id: - self.onSlideSelectedNext() - - def onEditSong(self): - """ - From the preview display requires the service Item to be editied - """ - self.songEdit = True - 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 - """ - row = self.previewListWidget.currentRow() - if row > -1 and row < self.previewListWidget.rowCount(): - if self.serviceItem.from_service: - Receiver.send_message('servicemanager_preview_live', - u'%s:%s' % (self.serviceItem._uuid, row)) - else: - self.parent.liveController.addServiceManagerItem( - self.serviceItem, row) - - def onMediaStart(self, item): - """ - Respond to the arrival of a media service item - """ - log.debug(u'SlideController onMediaStart') - file = os.path.join(item.get_frame_path(), item.get_frame_title()) - if self.isLive: - self.display.video(file, self.volume) - self.volumeSlider.setValue(self.volume) - else: - self.mediaObject.stop() - self.mediaObject.clearQueue() - self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) - self.seekSlider.setMediaObject(self.mediaObject) - self.seekSlider.show() - self.onMediaPlay() - - def mediaVolume(self): - """ - Respond to the release of Volume Slider - """ - log.debug(u'SlideController mediaVolume') - self.volume = self.volumeSlider.value() - self.display.videoVolume(self.volume) - - def onMediaPause(self): - """ - Respond to the Pause from the media Toolbar - """ - log.debug(u'SlideController onMediaPause') - if self.isLive: - self.display.videoPause() - else: - self.mediaObject.pause() - - def onMediaPlay(self): - """ - Respond to the Play from the media Toolbar - """ - log.debug(u'SlideController onMediaPlay') - if self.isLive: - self.display.videoPlay() - else: - self.slidePreview.hide() - self.video.show() - self.mediaObject.play() - - def onMediaStop(self): - """ - Respond to the Stop from the media Toolbar - """ - log.debug(u'SlideController onMediaStop') - if self.isLive: - self.display.videoStop() - else: - self.mediaObject.stop() - self.video.hide() - self.slidePreview.clear() - self.slidePreview.show() - - def onMediaClose(self): - """ - Respond to a request to close the Video - """ - log.debug(u'SlideController onMediaStop') - if self.isLive: - self.display.resetVideo() - else: - self.mediaObject.stop() - self.mediaObject.clearQueue() - self.video.hide() - self.slidePreview.clear() - self.slidePreview.show() - - def _resetBlank(self): - """ - Used by command items which provide their own displays to reset the - screen hide attributes - """ - hide_mode = self.hideMode() - if hide_mode == HideMode.Blank: - self.onBlankDisplay(True) - elif hide_mode == HideMode.Theme: - self.onThemeDisplay(True) - elif hide_mode == HideMode.Screen: - self.onHideDisplay(True) - else: - self.hidePlugin(False) - - def hideMode(self): - """ - Determine what the hide mode should be according to the blank button - """ - if not self.isLive: - return None - elif self.blankScreen.isChecked(): - return HideMode.Blank - elif self.themeScreen.isChecked(): - return HideMode.Theme - elif self.desktopScreen.isChecked(): - return HideMode.Screen - else: - return None +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2011 Raoul Snyman # +# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # +# Maikel Stuivenberg, Martin Thompson, Jon Tibble, 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 + +from PyQt4 import QtCore, QtGui +from PyQt4.phonon import Phonon + +from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ + ItemCapabilities, translate +from openlp.core.lib.ui import UiStrings, shortcut_action +from openlp.core.ui import HideMode, MainDisplay, ScreenList +from openlp.core.utils.actions import ActionList, CategoryOrder + +log = logging.getLogger(__name__) + +class SlideList(QtGui.QTableWidget): + """ + Customised version of QTableWidget which can respond to keyboard + events. + """ + def __init__(self, parent=None, name=None): + QtGui.QTableWidget.__init__(self, parent.controller) + self.parent = parent + + +class SlideController(QtGui.QWidget): + """ + SlideController is the slide controller widget. This widget is what the + user uses to control the displaying of verses/slides/etc on the screen. + """ + def __init__(self, parent, isLive=False): + """ + Set up the Slide Controller. + """ + QtGui.QWidget.__init__(self, parent) + self.isLive = isLive + self.parent = parent + self.screens = ScreenList.get_instance() + self.ratio = float(self.screens.current[u'size'].width()) / \ + float(self.screens.current[u'size'].height()) + self.image_manager = self.parent.image_manager + self.loopList = [ + u'Start Loop', + u'Loop Separator', + u'Image SpinBox' + ] + self.songEditList = [ + u'Edit Song', + ] + self.volume = 10 + self.timer_id = 0 + self.songEdit = False + self.selectedRow = 0 + self.serviceItem = None + self.alertTab = None + self.panel = QtGui.QWidget(parent.controlSplitter) + self.slideList = {} + # Layout for holding panel + self.panelLayout = QtGui.QVBoxLayout(self.panel) + self.panelLayout.setSpacing(0) + self.panelLayout.setMargin(0) + # Type label for the top of the slide controller + self.typeLabel = QtGui.QLabel(self.panel) + if self.isLive: + self.typeLabel.setText(UiStrings().Live) + self.split = 1 + self.typePrefix = u'live' + else: + self.typeLabel.setText(UiStrings().Preview) + self.split = 0 + self.typePrefix = u'preview' + self.typeLabel.setStyleSheet(u'font-weight: bold; font-size: 12pt;') + self.typeLabel.setAlignment(QtCore.Qt.AlignCenter) + self.panelLayout.addWidget(self.typeLabel) + # Splitter + self.splitter = QtGui.QSplitter(self.panel) + self.splitter.setOrientation(QtCore.Qt.Vertical) + self.panelLayout.addWidget(self.splitter) + # Actual controller section + self.controller = QtGui.QWidget(self.splitter) + self.controller.setGeometry(QtCore.QRect(0, 0, 100, 536)) + self.controller.setSizePolicy( + QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + QtGui.QSizePolicy.Maximum)) + self.controllerLayout = QtGui.QVBoxLayout(self.controller) + self.controllerLayout.setSpacing(0) + self.controllerLayout.setMargin(0) + # Controller list view + self.previewListWidget = SlideList(self) + self.previewListWidget.setColumnCount(1) + self.previewListWidget.horizontalHeader().setVisible(False) + self.previewListWidget.setColumnWidth(0, self.controller.width()) + self.previewListWidget.isLive = self.isLive + self.previewListWidget.setObjectName(u'PreviewListWidget') + self.previewListWidget.setSelectionBehavior( + QtGui.QAbstractItemView.SelectRows) + self.previewListWidget.setSelectionMode( + QtGui.QAbstractItemView.SingleSelection) + self.previewListWidget.setEditTriggers( + QtGui.QAbstractItemView.NoEditTriggers) + self.previewListWidget.setHorizontalScrollBarPolicy( + QtCore.Qt.ScrollBarAlwaysOff) + self.previewListWidget.setAlternatingRowColors(True) + self.controllerLayout.addWidget(self.previewListWidget) + # Build the full toolbar + self.toolbar = OpenLPToolbar(self) + sizeToolbarPolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) + sizeToolbarPolicy.setHorizontalStretch(0) + sizeToolbarPolicy.setVerticalStretch(0) + sizeToolbarPolicy.setHeightForWidth( + self.toolbar.sizePolicy().hasHeightForWidth()) + self.toolbar.setSizePolicy(sizeToolbarPolicy) + self.previousItem = self.toolbar.addToolbarButton( + translate('OpenLP.SlideController', 'Previous Slide'), + u':/slides/slide_previous.png', + translate('OpenLP.SlideController', 'Move to previous'), + self.onSlideSelectedPrevious, + shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.nextItem = self.toolbar.addToolbarButton( + translate('OpenLP.SlideController', 'Next Slide'), + u':/slides/slide_next.png', + translate('OpenLP.SlideController', 'Move to next'), + self.onSlideSelectedNext, + shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.toolbar.addToolbarSeparator(u'Close Separator') + if self.isLive: + self.hideMenu = QtGui.QToolButton(self.toolbar) + self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide')) + self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) + self.toolbar.addToolbarWidget(u'Hide Menu', self.hideMenu) + self.hideMenu.setMenu(QtGui.QMenu( + translate('OpenLP.SlideController', 'Hide'), self.toolbar)) + self.blankScreen = shortcut_action(self.hideMenu, u'blankScreen', + [QtCore.Qt.Key_Period], self.onBlankDisplay, + u':/slides/slide_blank.png', False, UiStrings().LiveToolbar) + self.blankScreen.setText( + translate('OpenLP.SlideController', 'Blank Screen')) + self.themeScreen = shortcut_action(self.hideMenu, u'themeScreen', + [QtGui.QKeySequence(u'T')], self.onThemeDisplay, + u':/slides/slide_theme.png', False, UiStrings().LiveToolbar) + self.themeScreen.setText( + translate('OpenLP.SlideController', 'Blank to Theme')) + self.desktopScreen = shortcut_action(self.hideMenu, + u'desktopScreen', [QtGui.QKeySequence(u'D')], + self.onHideDisplay, u':/slides/slide_desktop.png', False, + UiStrings().LiveToolbar) + self.desktopScreen.setText( + translate('OpenLP.SlideController', 'Show Desktop')) + self.hideMenu.setDefaultAction(self.blankScreen) + self.hideMenu.menu().addAction(self.blankScreen) + self.hideMenu.menu().addAction(self.themeScreen) + self.hideMenu.menu().addAction(self.desktopScreen) + self.toolbar.addToolbarSeparator(u'Loop Separator') + startLoop = self.toolbar.addToolbarButton( + # Does not need translating - control string. + u'Start Loop', u':/media/media_time.png', + translate('OpenLP.SlideController', 'Start continuous loop'), + self.onStartLoop) + action_list = ActionList.get_instance() + action_list.add_action(startLoop, UiStrings().LiveToolbar) + stopLoop = self.toolbar.addToolbarButton( + # Does not need translating - control string. + u'Stop Loop', u':/media/media_stop.png', + translate('OpenLP.SlideController', 'Stop continuous loop'), + self.onStopLoop) + action_list.add_action(stopLoop, UiStrings().LiveToolbar) + self.toogleLoop = shortcut_action(self, u'toogleLoop', + [QtGui.QKeySequence(u'L')], self.onToggleLoop, + category=UiStrings().LiveToolbar) + self.toogleLoop.setText(translate('OpenLP.SlideController', + 'Start/Stop continuous loop')) + self.addAction(self.toogleLoop) + self.delaySpinBox = QtGui.QSpinBox() + self.delaySpinBox.setRange(1, 180) + self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox) + self.delaySpinBox.setSuffix(UiStrings().Seconds) + self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', + 'Delay between slides in seconds')) + else: + self.toolbar.addToolbarButton( + # Does not need translating - control string. + u'Go Live', u':/general/general_live.png', + translate('OpenLP.SlideController', 'Move to live'), + self.onGoLive) + self.toolbar.addToolbarSeparator(u'Close Separator') + self.toolbar.addToolbarButton( + # Does not need translating - control string. + u'Edit Song', u':/general/general_edit.png', + translate('OpenLP.SlideController', + 'Edit and reload song preview'), + self.onEditSong) + self.controllerLayout.addWidget(self.toolbar) + # Build a Media ToolBar + self.mediabar = OpenLPToolbar(self) + self.mediabar.addToolbarButton( + u'Media Start', u':/slides/media_playback_start.png', + translate('OpenLP.SlideController', 'Start playing media'), + self.onMediaPlay) + self.mediabar.addToolbarButton( + u'Media Pause', u':/slides/media_playback_pause.png', + translate('OpenLP.SlideController', 'Start playing media'), + self.onMediaPause) + self.mediabar.addToolbarButton( + u'Media Stop', u':/slides/media_playback_stop.png', + translate('OpenLP.SlideController', 'Start playing media'), + self.onMediaStop) + if self.isLive: + # Build the Song Toolbar + self.songMenu = QtGui.QToolButton(self.toolbar) + self.songMenu.setText(translate('OpenLP.SlideController', 'Go To')) + self.songMenu.setPopupMode(QtGui.QToolButton.InstantPopup) + self.toolbar.addToolbarWidget(u'Song Menu', self.songMenu) + self.songMenu.setMenu(QtGui.QMenu( + translate('OpenLP.SlideController', 'Go To'), self.toolbar)) + self.toolbar.makeWidgetsInvisible([u'Song Menu']) + # Build the volumeSlider. + self.volumeSlider = QtGui.QSlider(QtCore.Qt.Horizontal) + self.volumeSlider.setTickInterval(1) + self.volumeSlider.setTickPosition(QtGui.QSlider.TicksAbove) + self.volumeSlider.setMinimum(0) + self.volumeSlider.setMaximum(10) + else: + # Build the seekSlider. + self.seekSlider = Phonon.SeekSlider() + self.seekSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) + self.seekSlider.setObjectName(u'seekSlider') + self.mediabar.addToolbarWidget(u'Seek Slider', self.seekSlider) + self.volumeSlider = Phonon.VolumeSlider() + self.volumeSlider.setGeometry(QtCore.QRect(90, 260, 221, 24)) + self.volumeSlider.setObjectName(u'volumeSlider') + self.mediabar.addToolbarWidget(u'Audio Volume', self.volumeSlider) + self.controllerLayout.addWidget(self.mediabar) + # Screen preview area + self.previewFrame = QtGui.QFrame(self.splitter) + self.previewFrame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) + self.previewFrame.setMinimumHeight(100) + self.previewFrame.setSizePolicy(QtGui.QSizePolicy( + QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored, + QtGui.QSizePolicy.Label)) + self.previewFrame.setFrameShape(QtGui.QFrame.StyledPanel) + self.previewFrame.setFrameShadow(QtGui.QFrame.Sunken) + self.previewFrame.setObjectName(u'PreviewFrame') + self.grid = QtGui.QGridLayout(self.previewFrame) + self.grid.setMargin(8) + self.grid.setObjectName(u'grid') + self.slideLayout = QtGui.QVBoxLayout() + self.slideLayout.setSpacing(0) + self.slideLayout.setMargin(0) + self.slideLayout.setObjectName(u'SlideLayout') + if not self.isLive: + self.mediaObject = Phonon.MediaObject(self) + self.video = Phonon.VideoWidget() + self.video.setVisible(False) + self.audio = Phonon.AudioOutput(Phonon.VideoCategory, + self.mediaObject) + Phonon.createPath(self.mediaObject, self.video) + Phonon.createPath(self.mediaObject, self.audio) + self.video.setGeometry(QtCore.QRect(0, 0, 300, 225)) + self.slideLayout.insertWidget(0, self.video) + # Actual preview screen + self.slidePreview = QtGui.QLabel(self) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth( + self.slidePreview.sizePolicy().hasHeightForWidth()) + self.slidePreview.setSizePolicy(sizePolicy) + self.slidePreview.setFrameShape(QtGui.QFrame.Box) + self.slidePreview.setFrameShadow(QtGui.QFrame.Plain) + self.slidePreview.setLineWidth(1) + self.slidePreview.setScaledContents(True) + self.slidePreview.setObjectName(u'SlidePreview') + self.slideLayout.insertWidget(0, self.slidePreview) + self.grid.addLayout(self.slideLayout, 0, 0, 1, 1) + # Signals + QtCore.QObject.connect(self.previewListWidget, + QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) + 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) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), + self.receiveSpinDelay) + self.toolbar.makeWidgetsInvisible(self.loopList) + self.toolbar.actions[u'Stop Loop'].setVisible(False) + else: + QtCore.QObject.connect(self.previewListWidget, + QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), + self.onGoLiveClick) + self.toolbar.makeWidgetsInvisible(self.songEditList) + self.mediabar.setVisible(False) + if self.isLive: + self.setLiveHotkeys(self) + self.__addActionsToWidget(self.previewListWidget) + else: + self.setPreviewHotkeys() + self.previewListWidget.addActions( + [self.nextItem, + self.previousItem]) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_stop_loop' % self.typePrefix), + self.onStopLoop) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_first' % self.typePrefix), + self.onSlideSelectedFirst) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_next' % self.typePrefix), + self.onSlideSelectedNext) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_previous' % self.typePrefix), + self.onSlideSelectedPrevious) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_last' % self.typePrefix), + self.onSlideSelectedLast) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_change' % self.typePrefix), + self.onSlideChange) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_set' % self.typePrefix), + self.onSlideSelectedIndex) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_blank' % self.typePrefix), + self.onSlideBlank) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix), + self.onSlideUnblank) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.typePrefix), + self.onTextRequest) + + def setPreviewHotkeys(self, parent=None): + self.previousItem.setObjectName(u'previousItemPreview') + self.nextItem.setObjectName(u'nextItemPreview') + action_list = ActionList.get_instance() + action_list.add_action(self.previousItem) + action_list.add_action(self.nextItem) + + def setLiveHotkeys(self, parent=None): + self.previousItem.setObjectName(u'previousItemLive') + self.nextItem.setObjectName(u'nextItemLive') + action_list = ActionList.get_instance() + action_list.add_category( + UiStrings().LiveToolbar, CategoryOrder.standardToolbar) + action_list.add_action(self.previousItem) + action_list.add_action(self.nextItem) + self.previousService = shortcut_action(parent, u'previousService', + [QtCore.Qt.Key_Left], self.servicePrevious, + category=UiStrings().LiveToolbar, + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.previousService.setText( + translate('OpenLP.SlideController', 'Previous Service')) + self.nextService = shortcut_action(parent, 'nextService', + [QtCore.Qt.Key_Right], self.serviceNext, + category=UiStrings().LiveToolbar, + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.nextService.setText( + translate('OpenLP.SlideController', 'Next Service')) + self.escapeItem = shortcut_action(parent, 'escapeItem', + [QtCore.Qt.Key_Escape], self.liveEscape, + category=UiStrings().LiveToolbar, + context=QtCore.Qt.WidgetWithChildrenShortcut) + self.escapeItem.setText( + translate('OpenLP.SlideController', 'Escape Item')) + + def liveEscape(self): + self.display.setVisible(False) + self.display.videoStop() + + def servicePrevious(self): + Receiver.send_message('servicemanager_previous_item') + + def serviceNext(self): + Receiver.send_message('servicemanager_next_item') + + def screenSizeChanged(self): + """ + Settings dialog has changed the screen size of adjust output and + screen previews. + """ + # rebuild display as screen size changed + self.display = MainDisplay(self, self.image_manager, self.isLive) + self.display.alertTab = self.alertTab + self.display.setup() + if self.isLive: + self.__addActionsToWidget(self.display) + # The SlidePreview's ratio. + self.ratio = float(self.screens.current[u'size'].width()) / \ + float(self.screens.current[u'size'].height()) + self.previewSizeChanged() + if self.serviceItem: + self.refreshServiceItem() + + def __addActionsToWidget(self, widget): + widget.addActions([ + self.previousItem, self.nextItem, + self.previousService, self.nextService, + self.escapeItem]) + + def previewSizeChanged(self): + """ + Takes care of the SlidePreview's size. Is called when one of the the + splitters is moved or when the screen size is changed. Note, that this + method is (also) called frequently from the mainwindow *paintEvent*. + """ + if self.ratio < float(self.previewFrame.width()) / float( + self.previewFrame.height()): + # We have to take the height as limit. + max_height = self.previewFrame.height() - self.grid.margin() * 2 + self.slidePreview.setFixedSize(QtCore.QSize(max_height * self.ratio, + max_height)) + else: + # We have to take the width as limit. + max_width = self.previewFrame.width() - self.grid.margin() * 2 + self.slidePreview.setFixedSize(QtCore.QSize(max_width, + max_width / self.ratio)) + # Make sure that the frames have the correct size. + self.previewListWidget.setColumnWidth(0, + self.previewListWidget.viewport().size().width()) + if self.serviceItem: + # Sort out songs, bibles, etc. + if self.serviceItem.is_text(): + self.previewListWidget.resizeRowsToContents() + else: + # Sort out image heights. + width = self.parent.controlSplitter.sizes()[self.split] + for framenumber in range(len(self.serviceItem.get_frames())): + self.previewListWidget.setRowHeight( + framenumber, width / self.ratio) + + def onSongBarHandler(self): + request = unicode(self.sender().text()) + slideno = self.slideList[request] + self.__updatePreviewSelection(slideno) + self.slideSelected() + + def receiveSpinDelay(self, value): + """ + Adjusts the value of the ``delaySpinBox`` to the given one. + """ + self.delaySpinBox.setValue(int(value)) + + def enableToolBar(self, item): + """ + Allows the toolbars to be reconfigured based on Controller Type + and ServiceItem Type + """ + if self.isLive: + self.enableLiveToolBar(item) + else: + self.enablePreviewToolBar(item) + + def enableLiveToolBar(self, item): + """ + Allows the live toolbar to be customised + """ + self.toolbar.setVisible(True) + self.mediabar.setVisible(False) + self.toolbar.makeWidgetsInvisible([u'Song Menu']) + self.toolbar.makeWidgetsInvisible(self.loopList) + self.toogleLoop.setEnabled(False) + self.toolbar.actions[u'Start Loop'].setEnabled(False) + self.toolbar.actions[u'Stop Loop'].setEnabled(False) + self.toolbar.actions[u'Stop Loop'].setVisible(False) + if item.is_text(): + if QtCore.QSettings().value( + 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 \ + len(item.get_frames()) > 1: + self.toolbar.makeWidgetsVisible(self.loopList) + self.toogleLoop.setEnabled(True) + self.toolbar.actions[u'Start Loop'].setEnabled(True) + self.toolbar.actions[u'Stop Loop'].setEnabled(True) + if item.is_media(): + self.toolbar.setVisible(False) + self.mediabar.setVisible(True) + + def enablePreviewToolBar(self, item): + """ + Allows the Preview toolbar to be customised + """ + self.toolbar.setVisible(True) + self.mediabar.setVisible(False) + self.toolbar.makeWidgetsInvisible(self.songEditList) + if item.is_capable(ItemCapabilities.AllowsEdit) and item.from_plugin: + self.toolbar.makeWidgetsVisible(self.songEditList) + elif item.is_media(): + self.toolbar.setVisible(False) + self.mediabar.setVisible(True) + self.volumeSlider.setAudioOutput(self.audio) + + def refreshServiceItem(self): + """ + Method to update the service item if the screen has changed + """ + log.debug(u'refreshServiceItem live = %s' % self.isLive) + if self.serviceItem.is_text() or self.serviceItem.is_image(): + item = self.serviceItem + item.render() + self._processItem(item, self.selectedRow) + + def addServiceItem(self, item): + """ + Method to install the service item into the controller + Called by plugins + """ + log.debug(u'addServiceItem live = %s' % self.isLive) + item.render() + slideno = 0 + if self.songEdit: + slideno = self.selectedRow + self.songEdit = False + self._processItem(item, slideno) + + def replaceServiceManagerItem(self, item): + """ + Replacement item following a remote edit + """ + if item.__eq__(self.serviceItem): + self._processItem(item, self.previewListWidget.currentRow()) + + def addServiceManagerItem(self, item, slideno): + """ + Method to install the service item into the controller and + request the correct toolbar for the plugin. + Called by ServiceManager + """ + log.debug(u'addServiceManagerItem live = %s' % self.isLive) + # If no valid slide number is specified we take the first one. + if slideno == -1: + slideno = 0 + # If service item is the same as the current on only change slide + if item.__eq__(self.serviceItem): + self.__checkUpdateSelectedSlide(slideno) + self.slideSelected() + return + self._processItem(item, slideno) + + def _processItem(self, serviceItem, slideno): + """ + Loads a ServiceItem into the system from ServiceManager + Display the slide number passed + """ + log.debug(u'processManagerItem live = %s' % self.isLive) + self.onStopLoop() + old_item = self.serviceItem + self.serviceItem = serviceItem + if old_item and self.isLive and old_item.is_capable( + ItemCapabilities.ProvidesOwnDisplay): + self._resetBlank() + Receiver.send_message(u'%s_start' % serviceItem.name.lower(), + [serviceItem, self.isLive, self.hideMode(), slideno]) + self.slideList = {} + width = self.parent.controlSplitter.sizes()[self.split] + self.previewListWidget.clear() + self.previewListWidget.setRowCount(0) + self.previewListWidget.setColumnWidth(0, width) + if self.isLive: + self.songMenu.menu().clear() + row = 0 + text = [] + for framenumber, frame in enumerate(self.serviceItem.get_frames()): + self.previewListWidget.setRowCount( + self.previewListWidget.rowCount() + 1) + item = QtGui.QTableWidgetItem() + slideHeight = 0 + if self.serviceItem.is_text(): + if frame[u'verseTag']: + # These tags are already translated. + verse_def = frame[u'verseTag'] + verse_def = u'%s%s' % (verse_def[0], verse_def[1:]) + two_line_def = u'%s\n%s' % (verse_def[0], verse_def[1:]) + row = two_line_def + if self.isLive: + if verse_def not in self.slideList: + self.slideList[verse_def] = framenumber + self.songMenu.menu().addAction(verse_def, + self.onSongBarHandler) + else: + row += 1 + item.setText(frame[u'text']) + else: + label = QtGui.QLabel() + label.setMargin(4) + label.setScaledContents(True) + if self.serviceItem.is_command(): + image = resize_image(frame[u'image'], + self.parent.renderer.width, + self.parent.renderer.height) + else: + # If current slide set background to image + if framenumber == slideno: + self.serviceItem.bg_image_bytes = \ + self.image_manager.get_image_bytes(frame[u'title']) + image = self.image_manager.get_image(frame[u'title']) + label.setPixmap(QtGui.QPixmap.fromImage(image)) + self.previewListWidget.setCellWidget(framenumber, 0, label) + slideHeight = width * self.parent.renderer.screen_ratio + row += 1 + text.append(unicode(row)) + self.previewListWidget.setItem(framenumber, 0, item) + if slideHeight != 0: + self.previewListWidget.setRowHeight(framenumber, slideHeight) + self.previewListWidget.setVerticalHeaderLabels(text) + if self.serviceItem.is_text(): + self.previewListWidget.resizeRowsToContents() + self.previewListWidget.setColumnWidth(0, + self.previewListWidget.viewport().size().width()) + self.__updatePreviewSelection(slideno) + self.enableToolBar(serviceItem) + # Pass to display for viewing. + # Postpone image build, we need to do this later to avoid the theme + # flashing on the screen + if not self.serviceItem.is_image(): + self.display.buildHtml(self.serviceItem) + if serviceItem.is_media(): + self.onMediaStart(serviceItem) + self.slideSelected(True) + self.previewListWidget.setFocus() + if old_item: + # Close the old item after the new one is opened + # This avoids the service theme/desktop flashing on screen + # However opening a new item of the same type will automatically + # close the previous, so make sure we don't close the new one. + if old_item.is_command() and not serviceItem.is_command(): + Receiver.send_message(u'%s_stop' % + old_item.name.lower(), [old_item, self.isLive]) + if old_item.is_media() and not serviceItem.is_media(): + self.onMediaClose() + Receiver.send_message(u'slidecontroller_%s_started' % self.typePrefix, + [serviceItem]) + + def __updatePreviewSelection(self, slideno): + """ + Utility method to update the selected slide in the list. + """ + if slideno > self.previewListWidget.rowCount(): + self.previewListWidget.selectRow( + self.previewListWidget.rowCount() - 1) + else: + self.__checkUpdateSelectedSlide(slideno) + + def onTextRequest(self): + """ + Return the text for the current item in controller + """ + data = [] + if self.serviceItem: + for framenumber, frame in enumerate(self.serviceItem.get_frames()): + dataItem = {} + if self.serviceItem.is_text(): + dataItem[u'tag'] = unicode(frame[u'verseTag']) + dataItem[u'text'] = unicode(frame[u'html']) + else: + dataItem[u'tag'] = unicode(framenumber) + dataItem[u'text'] = u'' + dataItem[u'selected'] = \ + (self.previewListWidget.currentRow() == framenumber) + data.append(dataItem) + Receiver.send_message(u'slidecontroller_%s_text_response' + % self.typePrefix, data) + + # Screen event methods + def onSlideSelectedFirst(self): + """ + Go to the first slide. + """ + if not self.serviceItem: + return + if self.serviceItem.is_command(): + Receiver.send_message(u'%s_first' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + self.updatePreview() + else: + self.previewListWidget.selectRow(0) + self.slideSelected() + + def onSlideSelectedIndex(self, message): + """ + Go to the requested slide + """ + index = int(message[0]) + if not self.serviceItem: + return + if self.serviceItem.is_command(): + Receiver.send_message(u'%s_slide' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive, index]) + self.updatePreview() + else: + self.__checkUpdateSelectedSlide(index) + self.slideSelected() + + def mainDisplaySetBackground(self): + """ + Allow the main display to blank the main display at startup time + """ + log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) + display_type = QtCore.QSettings().value( + self.parent.generalSettingsSection + u'/screen blank', + QtCore.QVariant(u'')).toString() + if not self.display.primary: + # Order done to handle initial conversion + if display_type == u'themed': + self.onThemeDisplay(True) + elif display_type == u'hidden': + self.onHideDisplay(True) + else: + self.onBlankDisplay(True) + + def onSlideBlank(self): + """ + Handle the slidecontroller blank event + """ + self.onBlankDisplay(True) + + def onSlideUnblank(self): + """ + Handle the slidecontroller unblank event + """ + self.onBlankDisplay(False) + + def onBlankDisplay(self, checked=None): + """ + Handle the blank screen button actions + """ + if checked is None: + checked = self.blankScreen.isChecked() + log.debug(u'onBlankDisplay %s' % checked) + self.hideMenu.setDefaultAction(self.blankScreen) + self.blankScreen.setChecked(checked) + self.themeScreen.setChecked(False) + self.desktopScreen.setChecked(False) + if checked: + QtCore.QSettings().setValue( + self.parent.generalSettingsSection + u'/screen blank', + QtCore.QVariant(u'blanked')) + else: + QtCore.QSettings().remove( + self.parent.generalSettingsSection + u'/screen blank') + self.blankPlugin() + self.updatePreview() + + def onThemeDisplay(self, checked=None): + """ + Handle the Theme screen button + """ + if checked is None: + checked = self.themeScreen.isChecked() + log.debug(u'onThemeDisplay %s' % checked) + self.hideMenu.setDefaultAction(self.themeScreen) + self.blankScreen.setChecked(False) + self.themeScreen.setChecked(checked) + self.desktopScreen.setChecked(False) + if checked: + QtCore.QSettings().setValue( + self.parent.generalSettingsSection + u'/screen blank', + QtCore.QVariant(u'themed')) + else: + QtCore.QSettings().remove( + self.parent.generalSettingsSection + u'/screen blank') + self.blankPlugin() + self.updatePreview() + + def onHideDisplay(self, checked=None): + """ + Handle the Hide screen button + """ + if checked is None: + checked = self.desktopScreen.isChecked() + log.debug(u'onHideDisplay %s' % checked) + self.hideMenu.setDefaultAction(self.desktopScreen) + self.blankScreen.setChecked(False) + self.themeScreen.setChecked(False) + self.desktopScreen.setChecked(checked) + if checked: + QtCore.QSettings().setValue( + self.parent.generalSettingsSection + u'/screen blank', + QtCore.QVariant(u'hidden')) + else: + QtCore.QSettings().remove( + self.parent.generalSettingsSection + u'/screen blank') + self.hidePlugin(checked) + self.updatePreview() + + def blankPlugin(self): + """ + Blank/Hide the display screen within a plugin if required. + """ + hide_mode = self.hideMode() + log.debug(u'blankPlugin %s ', hide_mode) + if self.serviceItem is not None: + if hide_mode: + if not self.serviceItem.is_command(): + Receiver.send_message(u'maindisplay_hide', hide_mode) + Receiver.send_message(u'%s_blank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive, hide_mode]) + else: + if not self.serviceItem.is_command(): + Receiver.send_message(u'maindisplay_show') + Receiver.send_message(u'%s_unblank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + + def hidePlugin(self, hide): + """ + Tell the plugin to hide the display screen. + """ + log.debug(u'hidePlugin %s ', hide) + if self.serviceItem is not None: + if hide: + Receiver.send_message(u'maindisplay_hide', HideMode.Screen) + Receiver.send_message(u'%s_hide' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + else: + if not self.serviceItem.is_command(): + Receiver.send_message(u'maindisplay_show') + Receiver.send_message(u'%s_unblank' + % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + + def onSlideSelected(self, start=False): + """ + Slide selected in controller + """ + self.slideSelected() + + def slideSelected(self, start=False): + """ + Generate the preview when you click on a slide. + if this is the Live Controller also display on the screen + """ + row = self.previewListWidget.currentRow() + self.selectedRow = 0 + if row > -1 and row < self.previewListWidget.rowCount(): + if self.serviceItem.is_command(): + if self.isLive and not start: + Receiver.send_message( + u'%s_slide' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive, row]) + self.updatePreview() + else: + toDisplay = self.serviceItem.get_rendered_frame(row) + if self.serviceItem.is_text(): + frame = self.display.text(toDisplay) + else: + if start: + self.display.buildHtml(self.serviceItem, toDisplay) + frame = self.display.preview() + else: + frame = self.display.image(toDisplay) + # reset the store used to display first image + self.serviceItem.bg_image_bytes = None + self.slidePreview.setPixmap(QtGui.QPixmap.fromImage(frame)) + self.selectedRow = row + self.__checkUpdateSelectedSlide(row) + Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, + row) + + def onSlideChange(self, row): + """ + The slide has been changed. Update the slidecontroller accordingly + """ + self.__checkUpdateSelectedSlide(row) + self.updatePreview() + Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, + row) + + def updatePreview(self): + """ + This updates the preview frame, for example after changing a slide or + using *Blank to Theme*. + """ + log.debug(u'updatePreview %s ' % self.screens.current[u'primary']) + if not self.screens.current[u'primary'] and self.serviceItem and \ + self.serviceItem.is_capable(ItemCapabilities.ProvidesOwnDisplay): + # 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: + self.slidePreview.setPixmap( + QtGui.QPixmap.fromImage(self.display.preview())) + + def grabMainDisplay(self): + """ + Creates an image of the current screen and updates the preview frame. + """ + winid = QtGui.QApplication.desktop().winId() + rect = self.screens.current[u'size'] + winimg = QtGui.QPixmap.grabWindow(winid, rect.x(), + rect.y(), rect.width(), rect.height()) + self.slidePreview.setPixmap(winimg) + + def onSlideSelectedNext(self): + """ + Go to the next slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_next' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command() and self.isLive: + self.updatePreview() + else: + row = self.previewListWidget.currentRow() + 1 + if row == self.previewListWidget.rowCount(): + if QtCore.QSettings().value(self.parent.generalSettingsSection + + u'generalSettingsSection/enable slide loop', QtCore.QVariant(True).toBool): + row = 0 + else: + return + self.__checkUpdateSelectedSlide(row) + self.slideSelected() + + def onSlideSelectedPrevious(self): + """ + Go to the previous slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_previous' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command() and self.isLive: + self.updatePreview() + else: + row = self.previewListWidget.currentRow() - 1 + if row == -1: + if QtCore.QSettings().value(self.parent.generalSettingsSection + + u'generalSettingsSection/enable slide loop', QtCore.QVariant(True).toBool): + row = self.previewListWidget.rowCount() - 1 + else: + return + self.__checkUpdateSelectedSlide(row) + self.slideSelected() + + def __checkUpdateSelectedSlide(self, row): + if row + 1 < self.previewListWidget.rowCount(): + self.previewListWidget.scrollToItem( + self.previewListWidget.item(row + 1, 0)) + self.previewListWidget.selectRow(row) + + def onSlideSelectedLast(self): + """ + Go to the last slide. + """ + if not self.serviceItem: + return + Receiver.send_message(u'%s_last' % self.serviceItem.name.lower(), + [self.serviceItem, self.isLive]) + if self.serviceItem.is_command(): + self.updatePreview() + else: + self.previewListWidget.selectRow( + self.previewListWidget.rowCount() - 1) + self.slideSelected() + + def onToggleLoop(self, toggled): + """ + Toggles the loop state. + """ + if self.toolbar.actions[u'Start Loop'].isVisible(): + self.onStartLoop() + else: + self.onStopLoop() + + def onStartLoop(self): + """ + Start the timer loop running and store the timer id + """ + if self.previewListWidget.rowCount() > 1: + self.timer_id = self.startTimer( + int(self.delaySpinBox.value()) * 1000) + self.toolbar.actions[u'Stop Loop'].setVisible(True) + self.toolbar.actions[u'Start Loop'].setVisible(False) + + def onStopLoop(self): + """ + Stop the timer loop running + """ + if self.timer_id != 0: + self.killTimer(self.timer_id) + self.timer_id = 0 + self.toolbar.actions[u'Start Loop'].setVisible(True) + self.toolbar.actions[u'Stop Loop'].setVisible(False) + + def timerEvent(self, event): + """ + If the timer event is for this window select next slide + """ + if event.timerId() == self.timer_id: + self.onSlideSelectedNext() + + def onEditSong(self): + """ + From the preview display requires the service Item to be editied + """ + self.songEdit = True + 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 + """ + row = self.previewListWidget.currentRow() + if row > -1 and row < self.previewListWidget.rowCount(): + if self.serviceItem.from_service: + Receiver.send_message('servicemanager_preview_live', + u'%s:%s' % (self.serviceItem._uuid, row)) + else: + self.parent.liveController.addServiceManagerItem( + self.serviceItem, row) + + def onMediaStart(self, item): + """ + Respond to the arrival of a media service item + """ + log.debug(u'SlideController onMediaStart') + file = os.path.join(item.get_frame_path(), item.get_frame_title()) + if self.isLive: + self.display.video(file, self.volume) + self.volumeSlider.setValue(self.volume) + else: + self.mediaObject.stop() + self.mediaObject.clearQueue() + self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) + self.seekSlider.setMediaObject(self.mediaObject) + self.seekSlider.show() + self.onMediaPlay() + + def mediaVolume(self): + """ + Respond to the release of Volume Slider + """ + log.debug(u'SlideController mediaVolume') + self.volume = self.volumeSlider.value() + self.display.videoVolume(self.volume) + + def onMediaPause(self): + """ + Respond to the Pause from the media Toolbar + """ + log.debug(u'SlideController onMediaPause') + if self.isLive: + self.display.videoPause() + else: + self.mediaObject.pause() + + def onMediaPlay(self): + """ + Respond to the Play from the media Toolbar + """ + log.debug(u'SlideController onMediaPlay') + if self.isLive: + self.display.videoPlay() + else: + self.slidePreview.hide() + self.video.show() + self.mediaObject.play() + + def onMediaStop(self): + """ + Respond to the Stop from the media Toolbar + """ + log.debug(u'SlideController onMediaStop') + if self.isLive: + self.display.videoStop() + else: + self.mediaObject.stop() + self.video.hide() + self.slidePreview.clear() + self.slidePreview.show() + + def onMediaClose(self): + """ + Respond to a request to close the Video + """ + log.debug(u'SlideController onMediaStop') + if self.isLive: + self.display.resetVideo() + else: + self.mediaObject.stop() + self.mediaObject.clearQueue() + self.video.hide() + self.slidePreview.clear() + self.slidePreview.show() + + def _resetBlank(self): + """ + Used by command items which provide their own displays to reset the + screen hide attributes + """ + hide_mode = self.hideMode() + if hide_mode == HideMode.Blank: + self.onBlankDisplay(True) + elif hide_mode == HideMode.Theme: + self.onThemeDisplay(True) + elif hide_mode == HideMode.Screen: + self.onHideDisplay(True) + else: + self.hidePlugin(False) + + def hideMode(self): + """ + Determine what the hide mode should be according to the blank button + """ + if not self.isLive: + return None + elif self.blankScreen.isChecked(): + return HideMode.Blank + elif self.themeScreen.isChecked(): + return HideMode.Theme + elif self.desktopScreen.isChecked(): + return HideMode.Screen + else: + return None From 0c83471ee46af92b8ca1bea64d158b92e333fb11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 25 May 2011 16:18:03 +0200 Subject: [PATCH 049/124] move some code stop moving bibles to subfolders some fixes --- openlp.pyw | 16 +-- openlp/core/ui/mainwindow.py | 9 ++ openlp/plugins/bibles/bibleplugin.py | 16 ++- .../plugins/bibles/forms/bibleimportform.py | 4 +- .../plugins/bibles/forms/bibleupgradeform.py | 105 +++++++++--------- openlp/plugins/bibles/lib/db.py | 29 +++-- openlp/plugins/bibles/lib/manager.py | 11 +- 7 files changed, 110 insertions(+), 80 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 34980b1c6..6cf3dd2da 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -37,8 +37,7 @@ from traceback import format_exception from PyQt4 import QtCore, QtGui -from openlp.core.lib import Receiver, check_directory_exists, SettingsManager, \ - translate +from openlp.core.lib import Receiver, check_directory_exists from openlp.core.lib.ui import UiStrings from openlp.core.resources import qInitResources from openlp.core.ui.mainwindow import MainWindow @@ -130,18 +129,7 @@ class OpenLP(QtGui.QApplication): u'general/update check', QtCore.QVariant(True)).toBool() if update_check: VersionThread(self.mainWindow).start() - for plugin in self.mainWindow.pluginManager.plugins: - if plugin.name == u'Bibles' and plugin.isActive() and not \ - len(SettingsManager.get_files( u'bibles/bibles', u'.sqlite')) \ - and SettingsManager.get_files(u'bibles', u'.sqlite'): - if QtGui.QMessageBox.information(self.mainWindow, - translate('OpenLP', 'Information'), translate('OpenLP', - 'Bible format has changed.\nYou have to upgrade your ' - 'existing bibles.\nShould OpenLP upgrade now?'), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | - QtGui.QMessageBox.No)) == QtGui.QMessageBox.Yes: - plugin.onToolsUpgradeItemTriggered() - break + self.mainWindow.appStartup() DelayStartThread(self.mainWindow).start() return self.exec_() diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 09e2ec9e7..8535670fa 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -639,6 +639,15 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.setViewMode(False, True, False, False, True) self.ModeLiveItem.setChecked(True) + def appStartup(self): + # Give all the plugins a chance to perform some tasks at startup + Receiver.send_message(u'openlp_process_events') + for plugin in self.pluginManager.plugins: + if hasattr(plugin, u'appStartup'): + Receiver.send_message(u'openlp_process_events') + plugin.appStartup() + Receiver.send_message(u'openlp_process_events') + def firstTime(self): # Import themes if first time Receiver.send_message(u'openlp_process_events') diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index fd56d9d32..c326d6c00 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -60,7 +60,7 @@ class BiblePlugin(Plugin): #action_list.add_action(self.exportBibleItem, UiStrings().Export) # Set to invisible until we can export bibles self.exportBibleItem.setVisible(False) - if SettingsManager.get_files(u'bibles', u'.sqlite'): + if len(self.manager.old_bible_databases): self.toolsUpgradeItem.setVisible(True) def finalise(self): @@ -76,6 +76,20 @@ class BiblePlugin(Plugin): #action_list.remove_action(self.exportBibleItem, UiStrings().Export) self.exportBibleItem.setVisible(False) + def appStartup(self): + """ + Perform tasks on application starup + """ + if not len(self.manager.db_cache) and \ + len(self.manager.old_bible_databases): + if QtGui.QMessageBox.information(self.formparent, + translate('OpenLP', 'Information'), translate('OpenLP', + 'Bible format has changed.\nYou have to upgrade your ' + 'existing bibles.\nShould OpenLP upgrade now?'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | + QtGui.QMessageBox.No)) == QtGui.QMessageBox.Yes: + self.onToolsUpgradeItemTriggered() + def addImportMenuItem(self, import_menu): self.importBibleItem = base_action(import_menu, u'importBibleItem') self.importBibleItem.setText(translate('BiblesPlugin', '&Bible')) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 8e9073775..1df6946dd 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -472,7 +472,7 @@ class BibleImportForm(OpenLPWizard): license_version = unicode(self.field(u'license_version').toString()) license_copyright = \ unicode(self.field(u'license_copyright').toString()) - path = AppLocation.get_section_data_path(u'bibles/bibles') + path = AppLocation.get_section_data_path(u'bibles') if not license_version: critical_error_message_box(UiStrings().EmptyField, translate('BiblesPlugin.ImportWizardForm', @@ -720,5 +720,5 @@ class BibleImportForm(OpenLPWizard): self.progressLabel.setText(translate( 'BiblesPlugin.ImportWizardForm', 'Your Bible import failed.')) del self.manager.db_cache[importer.name] - delete_database(AppLocation.get_section_data_path(u'bibles/bibles'), + delete_database(AppLocation.get_section_data_path(u'bibles'), importer.file) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index da75d9553..4a8ad488d 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -67,18 +67,12 @@ class BibleUpgradeForm(OpenLPWizard): self.manager = manager self.mediaItem = bibleplugin.mediaItem self.suffix = u'.sqlite' - self.settingsSection = u'bibles/bibles' - self.oldsettingsSection = u'bibles' - self.oldpath = AppLocation.get_section_data_path( - self.oldsettingsSection) - self.newpath = AppLocation.get_section_data_path( + self.settingsSection = u'bibles' + self.path = AppLocation.get_section_data_path( self.settingsSection) - self.files = SettingsManager.get_files(self.oldsettingsSection, - self.suffix) + self.files = self.manager.old_bible_databases self.success = {} self.newbibles = {} - self.maxBibles = len(self.files) - self.stop_import_flag = False OpenLPWizard.__init__(self, parent, bibleplugin, u'bibleUpgradeWizard', u':/wizards/wizard_importbible.bmp') @@ -106,7 +100,8 @@ class BibleUpgradeForm(OpenLPWizard): self.verticalWidget[number].hide() self.formWidget[number].hide() else: - if os.path.exists(os.path.join(self.newpath, filename)): + version_name = unicode(self.versionNameEdit[number].text()) + if self.manager.exists(version_name): self.verticalWidget[number].show() self.formWidget[number].show() @@ -118,7 +113,7 @@ class BibleUpgradeForm(OpenLPWizard): if self.currentPage() == self.progressPage: Receiver.send_message(u'openlp_stop_wizard') for bible in self.newbibles.itervalues(): - delete_database(self.newpath, clean_filename( + delete_database(self.path, clean_filename( bible.get_name())) self.done(QtGui.QDialog.Rejected) @@ -139,7 +134,7 @@ class BibleUpgradeForm(OpenLPWizard): """ for number, filename in enumerate(self.files): if self.success[number]: - delete_file(os.path.join(self.oldpath, filename)) + delete_file(os.path.join(self.path, filename)) def customInit(self): """ @@ -152,10 +147,6 @@ class BibleUpgradeForm(OpenLPWizard): """ Set up the signals used in the bible importer. """ - for number, filename in enumerate(self.files): - QtCore.QObject.connect(self.checkBox[number], - QtCore.SIGNAL(u'stateChanged(int)'), - self.onCheckBoxIndexChanged) QtCore.QObject.connect(self.finishButton, QtCore.SIGNAL(u'clicked()'), self.onFinishButton) @@ -195,24 +186,24 @@ class BibleUpgradeForm(OpenLPWizard): self.formWidget = {} self.formLayoutAttention = {} for number, filename in enumerate(self.files): - bible = OldBibleDB(self.mediaItem, path=self.oldpath, file=filename) + bible = OldBibleDB(self.mediaItem, path=self.path, file=filename) self.checkBox[number] = QtGui.QCheckBox(self.scrollAreaContents) - checkBoxName = u'checkBox['+unicode(number)+u']' + checkBoxName = u'checkBox[%d]' % number self.checkBox[number].setObjectName(checkBoxName) self.checkBox[number].setText(bible.get_name()) self.checkBox[number].setCheckState(QtCore.Qt.Checked) self.formLayout.addWidget(self.checkBox[number]) self.verticalWidget[number] = QtGui.QWidget(self.scrollAreaContents) - verticalWidgetName = u'verticalWidget['+unicode(number)+u']' + verticalWidgetName = u'verticalWidget[%d]' % number self.verticalWidget[number].setObjectName(verticalWidgetName) self.horizontalLayout[number] = QtGui.QHBoxLayout( self.verticalWidget[number]) self.horizontalLayout[number].setContentsMargins(25, 0, 0, 0) - horizontalLayoutName = u'horizontalLayout['+unicode(number)+u']' + horizontalLayoutName = u'horizontalLayout[%d]' % number self.horizontalLayout[number].setObjectName(horizontalLayoutName) self.versionInfoPixmap[number] = QtGui.QLabel( self.verticalWidget[number]) - versionInfoPixmapName = u'versionInfoPixmap['+unicode(number)+u']' + versionInfoPixmapName = u'versionInfoPixmap[%d]' % number self.versionInfoPixmap[number].setObjectName(versionInfoPixmapName) self.versionInfoPixmap[number].setPixmap(QtGui.QPixmap( u':/bibles/bibles_upgrade_alert.png')) @@ -221,7 +212,7 @@ class BibleUpgradeForm(OpenLPWizard): self.versionInfoPixmap[number]) self.versionInfoLabel[number] = QtGui.QLabel( self.verticalWidget[number]) - versionInfoLabelName = u'versionInfoLabel['+unicode(number)+u']' + versionInfoLabelName = u'versionInfoLabel[%d]' % number self.versionInfoLabel[number].setObjectName(versionInfoLabelName) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) @@ -234,13 +225,12 @@ class BibleUpgradeForm(OpenLPWizard): self.versionInfoLabel[number]) self.formLayout.addWidget(self.verticalWidget[number]) self.formWidget[number] = QtGui.QWidget(self.scrollAreaContents) - formWidgetName = u'formWidget['+unicode(number)+u']' + formWidgetName = u'formWidget[%d]' % number self.formWidget[number].setObjectName(formWidgetName) self.formLayoutAttention[number] = QtGui.QFormLayout( self.formWidget[number]) self.formLayoutAttention[number].setContentsMargins(25, 0, 0, 5) - formLayoutAttentionName = u'formLayoutAttention['+unicode(number)+\ - u']' + formLayoutAttentionName = u'formLayoutAttention[%d]' % number self.formLayoutAttention[number].setObjectName( formLayoutAttentionName) self.versionNameLabel[number] = QtGui.QLabel( @@ -255,6 +245,10 @@ class BibleUpgradeForm(OpenLPWizard): QtGui.QFormLayout.FieldRole, self.versionNameEdit[number]) self.versionNameEdit[number].setText(bible.get_name()) self.formLayout.addWidget(self.formWidget[number]) + #Set up the Signal for the checkbox + QtCore.QObject.connect(self.checkBox[number], + QtCore.SIGNAL(u'stateChanged(int)'), + self.onCheckBoxIndexChanged) self.spacerItem = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.formLayout.addItem(self.spacerItem) @@ -329,7 +323,7 @@ class BibleUpgradeForm(OpenLPWizard): if not self.checkBox[number].checkState() == QtCore.Qt.Checked: continue version_name = unicode(self.versionNameEdit[number].text()) - oldbible = OldBibleDB(self.mediaItem, path=self.oldpath, + oldbible = OldBibleDB(self.mediaItem, path=self.path, file=filename) oldname = oldbible.get_name() if not version_name: @@ -348,18 +342,28 @@ class BibleUpgradeForm(OpenLPWizard): 'uncheck.')) self.versionNameEdit[number].setFocus() return False - elif os.path.exists(os.path.join(self.newpath, filename)) and \ - version_name == oldname: - critical_error_message_box( - translate('BiblesPlugin.UpgradeWizardForm', + elif os.path.exists(os.path.join(self.path, clean_filename( + version_name))) and version_name == oldname: + newfilename = u'old_database_%s' % filename + if not os.path.exists(os.path.join(self.path, + newfilename)): + os.rename(os.path.join(self.path, filename), + os.path.join(self.path, newfilename)) + self.files[number] = newfilename + continue + else: + critical_error_message_box( + translate('BiblesPlugin.UpgradeWizardForm', 'Bible Exists'), - translate('BiblesPlugin.UpgradeWizardForm', - 'This Bible already exists. Please upgrade ' - 'a different Bible, delete the existing one or ' - 'uncheck.')) - self.versionNameEdit[number].setFocus() - return False - elif os.path.exists(os.path.join(self.newpath, + translate('BiblesPlugin.UpgradeWizardForm', + 'This Bible already exists. Please upgrade ' + 'a different Bible, delete the existing one or ' + 'uncheck.')) + self.verticalWidget[number].show() + self.formWidget[number].show() + self.versionNameEdit[number].setFocus() + return False + elif os.path.exists(os.path.join(self.path, clean_filename(version_name))): critical_error_message_box( translate('BiblesPlugin.UpgradeWizardForm', @@ -385,15 +389,16 @@ class BibleUpgradeForm(OpenLPWizard): self.success.clear() self.newbibles.clear() self.clearScrollArea() - self.files = SettingsManager.get_files(self.oldsettingsSection, - self.suffix) + self.files = self.manager.old_bible_databases self.addScrollArea() - self.customSignals() self.retranslateUi() self.maxBibles = len(self.files) for number, filename in enumerate(self.files): self.checkBox[number].setCheckState(QtCore.Qt.Checked) - if os.path.exists(os.path.join(self.newpath, filename)): + oldbible = OldBibleDB(self.mediaItem, path=self.path, + file=filename) + oldname = oldbible.get_name() + if self.manager.exists(oldname): self.verticalWidget[number].show() self.formWidget[number].show() else: @@ -440,11 +445,11 @@ class BibleUpgradeForm(OpenLPWizard): if not self.checkBox[biblenumber].checkState() == QtCore.Qt.Checked: continue self.progressBar.reset() - oldbible = OldBibleDB(self.mediaItem, path=self.oldpath, + oldbible = OldBibleDB(self.mediaItem, path=self.path, file=filename) name = oldbible.get_name() if name is None: - delete_file(os.path.join(self.oldpath, filename)) + delete_file(os.path.join(self.path, filename)) self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % @@ -456,9 +461,9 @@ class BibleUpgradeForm(OpenLPWizard): 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nImporting ...')) % (number + 1, self.maxBibles, name)) - if os.path.exists(os.path.join(self.newpath, filename)): + if os.path.exists(os.path.join(self.path, filename)): name = unicode(self.versionNameEdit[biblenumber].text()) - self.newbibles[number] = BibleDB(self.mediaItem, path=self.oldpath, + self.newbibles[number] = BibleDB(self.mediaItem, path=self.path, name=name) metadata = oldbible.get_metadata() webbible = False @@ -488,7 +493,7 @@ class BibleUpgradeForm(OpenLPWizard): u'name: "%s" failed' % ( meta_data[u'download source'], meta_data[u'download name'])) - delete_database(self.newpath, + delete_database(self.path, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] critical_error_message_box( @@ -517,7 +522,7 @@ class BibleUpgradeForm(OpenLPWizard): if not language_id: log.exception(u'Upgrading from "%s" '\ 'failed' % filename) - delete_database(self.newpath, + delete_database(self.path, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] self.incrementProgressBar(unicode(translate( @@ -543,7 +548,7 @@ class BibleUpgradeForm(OpenLPWizard): u'name: "%s" aborted by user' % ( meta_data[u'download source'], meta_data[u'download name'])) - delete_database(self.newpath, + delete_database(self.path, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] bible_failed = True @@ -559,7 +564,7 @@ class BibleUpgradeForm(OpenLPWizard): if not language_id: log.exception(u'Importing books from "%s" '\ 'failed' % name) - delete_database(self.newpath, + delete_database(self.path, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] self.incrementProgressBar(unicode(translate( @@ -585,7 +590,7 @@ class BibleUpgradeForm(OpenLPWizard): if not book_ref_id: log.exception(u'Importing books from %s " '\ 'failed - aborted by user' % name) - delete_database(self.newpath, + delete_database(self.path, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] bible_failed = True diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 0bbaaaf1b..9ece16500 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -62,18 +62,18 @@ class Verse(BaseModel): """ pass -def clean_filename(old_filename): +def clean_filename(filename): """ Clean up the version name of the Bible and convert it into a valid file name. - ``old_filename`` + ``filename`` The "dirty" file name or version name. """ - if not isinstance(old_filename, unicode): - old_filename = unicode(old_filename, u'utf-8') - old_filename = re.sub(r'[^\w]+', u'_', old_filename).strip(u'_') - return old_filename + u'.sqlite' + if not isinstance(filename, unicode): + filename = unicode(filename, u'utf-8') + filename = re.sub(r'[^\w]+', u'_', filename).strip(u'_') + return filename + u'.sqlite' def init_schema(url): """ @@ -160,7 +160,7 @@ class BibleDB(QtCore.QObject, Manager): self.file = clean_filename(self.name) if u'file' in kwargs: self.file = kwargs[u'file'] - Manager.__init__(self, u'bibles/bibles', init_schema, self.file) + Manager.__init__(self, u'bibles', init_schema, self.file) if u'file' in kwargs: self.get_name() if u'path' in kwargs: @@ -487,6 +487,16 @@ class BibleDB(QtCore.QObject, Manager): self.create_meta(u'language_id', language_id) return language_id + def find_old_database(self): + """ + Returns true if it is an old bible database. + """ + try: + columns = self.session.query(Book).all() + except: + return True + return False + def dump_bible(self): """ Utility debugging method to dump the contents of a bible. @@ -863,12 +873,9 @@ class AlternativeBookNamesDB(QtCore.QObject, Manager): database doesn't exist. """ if AlternativeBookNamesDB.cursor is None: - check_directory_exists(os.path.join(AppLocation.get_directory( - AppLocation.DataDir), u'bibles', u'resources')) filepath = os.path.join( AppLocation.get_directory(AppLocation.DataDir), u'bibles', - u'resources', u'alternative_book_names.sqlite') - log.debug(u'Filepath: %s' % filepath) + u'alternative_book_names.sqlite') if not os.path.exists(filepath): #create new DB, create table alternative_book_names AlternativeBookNamesDB.conn = sqlite3.connect(filepath) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index ee5491878..12490ba24 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -33,7 +33,7 @@ from openlp.core.lib import Receiver, SettingsManager, translate from openlp.core.lib.ui import critical_error_message_box from openlp.core.utils import AppLocation, delete_file from openlp.plugins.bibles.lib import parse_reference -from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta +from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta, OldBibleDB from csvbible import CSVBible from http import HTTPBible from opensong import OpenSongBible @@ -120,7 +120,7 @@ class BibleManager(object): """ log.debug(u'Bible Initialising') self.parent = parent - self.settingsSection = u'bibles/bibles' + self.settingsSection = u'bibles' self.web = u'Web' self.db_cache = None self.path = AppLocation.get_section_data_path(self.settingsSection) @@ -140,8 +140,11 @@ class BibleManager(object): """ log.debug(u'Reload bibles') files = SettingsManager.get_files(self.settingsSection, self.suffix) + if u'alternative_book_names.sqlite' in files: + files.remove(u'alternative_book_names.sqlite') log.debug(u'Bible Files %s', files) self.db_cache = {} + self.old_bible_databases = [] for filename in files: bible = BibleDB(self.parent, path=self.path, file=filename) name = bible.get_name() @@ -149,6 +152,10 @@ class BibleManager(object): if name is None: delete_file(os.path.join(self.path, filename)) continue + # Find old database versions + if bible.find_old_database(): + self.old_bible_databases.append(filename) + continue log.debug(u'Bible Name: "%s"', name) self.db_cache[name] = bible # Look to see if lazy load bible exists and get create getter. From e8cdba44bece32d6dcbc42f1c8cad548af9e636b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 25 May 2011 16:52:46 +0200 Subject: [PATCH 050/124] small clean up --- openlp/plugins/bibles/bibleplugin.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 75432a0e9..16607d569 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -29,8 +29,7 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import Plugin, StringContent, build_icon, translate, \ - SettingsManager +from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.ui import base_action, UiStrings from openlp.core.utils.actions import ActionList from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem From 175d6cebb24d168931c1161b9e06d7462aa21fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 25 May 2011 21:13:37 +0200 Subject: [PATCH 051/124] add Bible Name to LanguageDialog renamed "Importing" to "Upgrading" and "Choose" to "Select" fixed traceback while textsearch removed unnecessary code --- openlp/plugins/bibles/bibleplugin.py | 5 ++--- .../plugins/bibles/forms/bibleimportform.py | 1 - .../plugins/bibles/forms/bibleupgradeform.py | 21 ++++++++++--------- openlp/plugins/bibles/forms/booknamedialog.py | 6 +++--- openlp/plugins/bibles/forms/booknameform.py | 2 +- openlp/plugins/bibles/forms/languagedialog.py | 6 +++--- openlp/plugins/bibles/forms/languageform.py | 9 ++++++-- openlp/plugins/bibles/lib/db.py | 13 ++++++------ openlp/plugins/bibles/lib/manager.py | 2 +- 9 files changed, 35 insertions(+), 30 deletions(-) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 16607d569..4d43ab76d 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -80,8 +80,7 @@ class BiblePlugin(Plugin): """ Perform tasks on application starup """ - if not len(self.manager.db_cache) and \ - len(self.manager.old_bible_databases): + if len(self.manager.old_bible_databases): if QtGui.QMessageBox.information(self.formparent, translate('OpenLP', 'Information'), translate('OpenLP', 'Bible format has changed.\nYou have to upgrade your ' @@ -114,7 +113,7 @@ class BiblePlugin(Plugin): The actual **Tools** menu item, so that your actions can use it as their parent. """ - log.info(u'add tools menu') + log.debug(u'add tools menu') self.toolsUpgradeItem = QtGui.QAction(tools_menu) self.toolsUpgradeItem.setObjectName(u'toolsUpgradeItem') self.toolsUpgradeItem.setText( diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 81db1597d..cd793f7e7 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -31,7 +31,6 @@ import csv import logging import os import os.path -import re from PyQt4 import QtCore, QtGui diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 4a8ad488d..3ddf66f10 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -305,7 +305,8 @@ class BibleUpgradeForm(OpenLPWizard): self.versionInfoLabel[number].setText( translate('BiblesPlugin.UpgradeWizardForm', 'This ' 'Bible still exists. Please change the name or uncheck it.')) - self.progressPage.setTitle(WizardStrings.Importing) + self.progressPage.setTitle(translate('BiblesPlugin.UpgradeWizardForm', + 'Upgrading')) self.progressPage.setSubTitle( translate('BiblesPlugin.UpgradeWizardForm', 'Please wait while your Bibles are upgraded.')) @@ -459,7 +460,7 @@ class BibleUpgradeForm(OpenLPWizard): continue self.progressLabel.setText(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', - 'Upgrading Bible %s of %s: "%s"\nImporting ...')) % + 'Upgrading Bible %s of %s: "%s"\nUpgrading ...')) % (number + 1, self.maxBibles, name)) if os.path.exists(os.path.join(self.path, filename)): name = unicode(self.versionNameEdit[biblenumber].text()) @@ -489,7 +490,7 @@ class BibleUpgradeForm(OpenLPWizard): handler = BSExtract(proxy_server) books = handler.get_books_from_http(meta_data[u'download name']) if not books: - log.exception(u'Importing books from %s - download '\ + log.exception(u'Upgrading books from %s - download '\ u'name: "%s" failed' % ( meta_data[u'download source'], meta_data[u'download name'])) @@ -518,7 +519,7 @@ class BibleUpgradeForm(OpenLPWizard): self.newbibles[number].create_meta(u'language_id', language_id) else: - language_id = self.newbibles[number].get_language() + language_id = self.newbibles[number].get_language(name) if not language_id: log.exception(u'Upgrading from "%s" '\ 'failed' % filename) @@ -539,12 +540,12 @@ class BibleUpgradeForm(OpenLPWizard): self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\n' - 'Importing %s ...')) % + 'Upgrading %s ...')) % (number+1, self.maxBibles, name, book)) book_ref_id = self.newbibles[number].\ get_book_ref_id_by_name(book, len(books), language_id) if not book_ref_id: - log.exception(u'Importing books from %s - download '\ + log.exception(u'Upgrading books from %s - download '\ u'name: "%s" aborted by user' % ( meta_data[u'download source'], meta_data[u'download name'])) @@ -560,9 +561,9 @@ class BibleUpgradeForm(OpenLPWizard): language_id = self.newbibles[number].get_object(BibleMeta, u'language_id') if not language_id: - language_id = self.newbibles[number].get_language() + language_id = self.newbibles[number].get_language(name) if not language_id: - log.exception(u'Importing books from "%s" '\ + log.exception(u'Upgrading books from "%s" '\ 'failed' % name) delete_database(self.path, clean_filename(self.newbibles[number].get_name())) @@ -582,13 +583,13 @@ class BibleUpgradeForm(OpenLPWizard): self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\n' - 'Importing %s ...')) % + 'Upgrading %s ...')) % (number+1, self.maxBibles, name, book[u'name'])) book_ref_id = self.newbibles[number].\ get_book_ref_id_by_name(book[u'name'], len(books), language_id) if not book_ref_id: - log.exception(u'Importing books from %s " '\ + log.exception(u'Upgrading books from %s " '\ 'failed - aborted by user' % name) delete_database(self.path, clean_filename(self.newbibles[number].get_name())) diff --git a/openlp/plugins/bibles/forms/booknamedialog.py b/openlp/plugins/bibles/forms/booknamedialog.py index 20e96b922..632007013 100644 --- a/openlp/plugins/bibles/forms/booknamedialog.py +++ b/openlp/plugins/bibles/forms/booknamedialog.py @@ -100,12 +100,12 @@ class Ui_BookNameDialog(object): def retranslateUi(self, bookNameDialog): bookNameDialog.setWindowTitle( - translate('BiblesPlugin.BookNameDialog', 'Choose Book')) + translate('BiblesPlugin.BookNameDialog', 'Select Book')) self.headlineLabel.setText( - translate('BiblesPlugin.BookNameDialog', 'Choose Book:')) + translate('BiblesPlugin.BookNameDialog', 'Select Book:')) self.infoLabel.setText(translate('BiblesPlugin.BookNameDialog', 'The following books cannot be clearly attributed. \n' - 'Please choose which book it is.')) + 'Please select which book it is.')) self.requestLabel.setText(translate('BiblesPlugin.BookNameDialog', 'Book:')) self.infoLabelTestaments.setText(translate( diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index 425e20e41..fdb383a8c 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -116,7 +116,7 @@ class BookNameForm(QDialog, Ui_BookNameDialog): if self.requestComboBox.currentText() == u'': critical_error_message_box( message=translate('BiblesPlugin.BookNameForm', - 'You need to choose a book.')) + 'You need to select a book.')) self.requestComboBox.setFocus() return False else: diff --git a/openlp/plugins/bibles/forms/languagedialog.py b/openlp/plugins/bibles/forms/languagedialog.py index 7f3580279..0edcb74d8 100644 --- a/openlp/plugins/bibles/forms/languagedialog.py +++ b/openlp/plugins/bibles/forms/languagedialog.py @@ -85,10 +85,10 @@ class Ui_LanguageDialog(object): def retranslateUi(self, languageDialog): languageDialog.setWindowTitle( - translate('BiblesPlugin.LanguageDialog', 'Choose Language')) + translate('BiblesPlugin.LanguageDialog', 'Select Language')) self.headlineLabel.setText( - translate('BiblesPlugin.LanguageDialog', 'Choose Language:')) + translate('BiblesPlugin.LanguageDialog', 'Select Language:')) self.infoLabel.setText(translate('BiblesPlugin.LanguageDialog', - 'Please choose the Bible\'s language')) + 'Please select the Bible\'s language')) self.requestLabel.setText(translate('BiblesPlugin.languageDialog', 'Language:')) diff --git a/openlp/plugins/bibles/forms/languageform.py b/openlp/plugins/bibles/forms/languageform.py index 6235c6385..0e2c3f003 100644 --- a/openlp/plugins/bibles/forms/languageform.py +++ b/openlp/plugins/bibles/forms/languageform.py @@ -52,8 +52,13 @@ class LanguageForm(QDialog, Ui_LanguageDialog): QDialog.__init__(self, parent) self.setupUi(self) - def exec_(self): + def exec_(self, bible_name): self.requestComboBox.addItem(u'') + if bible_name: + self.infoLabel.setText(unicode(translate( + 'BiblesPlugin.LanguageDialog', + 'Please select the language for Bible:\n"%s"')) % + bible_name) items = BiblesResourcesDB.get_languages() for item in items: self.requestComboBox.addItem(item[u'name']) @@ -63,7 +68,7 @@ class LanguageForm(QDialog, Ui_LanguageDialog): if self.requestComboBox.currentText() == u'': critical_error_message_box( message=translate('BiblesPlugin.LanguageForm', - 'You need to choose a language.')) + 'You need to select a language.')) self.requestComboBox.setFocus() return False else: diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 8902593ca..7278da42f 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -396,7 +396,7 @@ class BibleDB(QtCore.QObject, Manager): .all() verse_list.extend(verses) else: - log.debug(u'OpenLP failed to find book %s', book) + log.debug(u'OpenLP failed to find book with id "%s"', book_id) if show_error: critical_error_message_box( translate('BiblesPlugin', 'No Book Found'), @@ -466,10 +466,10 @@ class BibleDB(QtCore.QObject, Manager): else: return count - def get_language(self): + def get_language(self, bible_name=None): """ If no language is given it calls a dialog window where the user could - choose the bible language. + select the bible language. Return the language id of a bible. ``book`` @@ -479,7 +479,7 @@ class BibleDB(QtCore.QObject, Manager): from openlp.plugins.bibles.forms import LanguageForm language = None language_form = LanguageForm(self.wizard) - if language_form.exec_(): + if language_form.exec_(bible_name): language = unicode(language_form.requestComboBox.currentText()) if not language: return False @@ -488,9 +488,10 @@ class BibleDB(QtCore.QObject, Manager): self.create_meta(u'language_id', language_id) return language_id - def find_old_database(self): + def is_old_database(self): """ - Returns true if it is an old bible database. + Returns ``True`` if it is a bible database, which has been created + prior to 1.9.6. """ try: columns = self.session.query(Book).all() diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 6b854eb44..7086c02c5 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -154,7 +154,7 @@ class BibleManager(object): delete_file(os.path.join(self.path, filename)) continue # Find old database versions - if bible.find_old_database(): + if bible.is_old_database(): self.old_bible_databases.append(filename) continue log.debug(u'Bible Name: "%s"', name) From 0f98c4fd8fe74481a2b2694262d73811769408e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Wed, 25 May 2011 22:20:17 +0200 Subject: [PATCH 052/124] change behaviour if "Cancel" button is pushed. --- .../plugins/bibles/forms/bibleupgradeform.py | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 3ddf66f10..b210b7c95 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -110,12 +110,7 @@ class BibleUpgradeForm(OpenLPWizard): Stop the wizard on cancel button, close button or ESC key. """ log.debug(u'Wizard cancelled by user') - if self.currentPage() == self.progressPage: - Receiver.send_message(u'openlp_stop_wizard') - for bible in self.newbibles.itervalues(): - delete_database(self.path, clean_filename( - bible.get_name())) - self.done(QtGui.QDialog.Rejected) + self.stop_import_flag = True def onCurrentIdChanged(self, pageId): """ @@ -133,7 +128,7 @@ class BibleUpgradeForm(OpenLPWizard): Some cleanup while finishing """ for number, filename in enumerate(self.files): - if self.success[number]: + if number in self.success and self.success[number] == True: delete_file(os.path.join(self.path, filename)) def customInit(self): @@ -440,6 +435,7 @@ class BibleUpgradeForm(OpenLPWizard): number = 0 for biblenumber, filename in enumerate(self.files): if self.stop_import_flag: + bible_failed = True break bible_failed = False self.success[biblenumber] = False @@ -536,6 +532,7 @@ class BibleUpgradeForm(OpenLPWizard): self.progressBar.setMaximum(len(books)) for book in books: if self.stop_import_flag: + bible_failed = True break self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', @@ -579,6 +576,7 @@ class BibleUpgradeForm(OpenLPWizard): self.progressBar.setMaximum(len(books)) for book in books: if self.stop_import_flag: + bible_failed = True break self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', @@ -624,15 +622,17 @@ class BibleUpgradeForm(OpenLPWizard): 'Upgrading Bible %s of %s: "%s"\nFailed')) % (number+1, self.maxBibles, name), self.progressBar.maximum()-self.progressBar.value()) + delete_database(self.path, + clean_filename(self.newbibles[number].get_name())) number += 1 self.mediaItem.reloadBibles() successful_import = 0 failed_import = 0 - for number, success in self.success.iteritems(): - if success == True: + for number, filename in enumerate(self.files): + #for number, success in self.success.iteritems(): + if number in self.success and self.success[number] == True: successful_import += 1 - elif success == False and self.checkBox[number].checkState() == \ - QtCore.Qt.Checked: + elif self.checkBox[number].checkState() == QtCore.Qt.Checked: failed_import += 1 if failed_import > 0: failed_import_text = unicode(translate( From 0a5155b822891e3e7cecceb434b68e4c2c91e1a4 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Wed, 25 May 2011 20:11:56 -0400 Subject: [PATCH 053/124] Final changes to enabling looping of slides now it works --- openlp/core/ui/slidecontroller.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 4a0a3bf39..90c7abf85 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -937,12 +937,12 @@ class SlideController(QtGui.QWidget): self.updatePreview() else: row = self.previewListWidget.currentRow() + 1 + enable_loop = QtCore.QSettings().value(self.parent.generalSettingsSection + u'/enable slide loop', QtCore.QVariant(True)).toBool() if row == self.previewListWidget.rowCount(): - if QtCore.QSettings().value(self.parent.generalSettingsSection - + u'generalSettingsSection/enable slide loop', QtCore.QVariant(True).toBool): + if enable_loop: row = 0 else: - return + pass self.__checkUpdateSelectedSlide(row) self.slideSelected() @@ -959,11 +959,11 @@ class SlideController(QtGui.QWidget): else: row = self.previewListWidget.currentRow() - 1 if row == -1: - if QtCore.QSettings().value(self.parent.generalSettingsSection - + u'generalSettingsSection/enable slide loop', QtCore.QVariant(True).toBool): + enable_loop = QtCore.QSettings().value(self.parent.generalSettingsSection + u'/enable slide loop', QtCore.QVariant(True)).toBool() + if enable_loop: row = self.previewListWidget.rowCount() - 1 else: - return + row = 0 self.__checkUpdateSelectedSlide(row) self.slideSelected() From 4f857f89216733c15bb74a0a127f145fe04975e7 Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Wed, 25 May 2011 23:34:42 -0400 Subject: [PATCH 054/124] modified: openlp/plugins/custom/forms/editcustomform.py openlp/plugins/custom/lib/mediaitem.py openlp/plugins/songs/forms/editsongform.py openlp/plugins/songs/lib/mediaitem.py --- openlp/plugins/custom/forms/editcustomform.py | 2 +- openlp/plugins/custom/lib/mediaitem.py | 2 +- openlp/plugins/songs/forms/editsongform.py | 6 ++---- openlp/plugins/songs/lib/mediaitem.py | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 64147e874..e8b43d3ab 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -116,7 +116,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): log.debug(u'accept') if self.saveCustom(): Receiver.send_message(u'custom_set_autoselect_item', - self.customSlide.title) + self.customSlide.id) Receiver.send_message(u'custom_load_list') QtGui.QDialog.accept(self) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 64ddf2374..e3741ae84 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -147,7 +147,7 @@ class CustomMediaItem(MediaManagerItem): QtCore.Qt.UserRole, QtCore.QVariant(custom_slide.id)) self.listView.addItem(custom_name) # Auto-select the item if name has been set - if custom_slide.title == self.autoSelectItem: + if custom_slide.id == self.autoSelectItem: self.listView.setCurrentItem(custom_name) def onNewClick(self): diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 8411aa488..f66bc15ad 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -696,9 +696,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.clearCaches() if self._validate_song(): self.saveSong() - Receiver.send_message(u'songs_set_autoselect_item', - unicode(self.titleEdit.text())) + Receiver.send_message(u'songs_set_autoselect_item',self.song.id) Receiver.send_message(u'songs_load_list') + self.song = None QtGui.QDialog.accept(self) def saveSong(self, preview=False): @@ -756,8 +756,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.song.topics.append(self.manager.get_object(Topic, topicId)) clean_song(self.manager, self.song) self.manager.save_object(self.song) - if not preview: - self.song = None def _processLyrics(self): """ diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 7ea1658fc..4b88d81c3 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -242,7 +242,7 @@ class SongMediaItem(MediaManagerItem): song_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(song.id)) self.listView.addItem(song_name) # Auto-select the item if name has been set - if song.title == self.autoSelectItem : + if song.id == self.autoSelectItem : self.listView.setCurrentItem(song_name) def displayResultsAuthor(self, searchresults): From 38000b5e5615bf8475cbee8978c7b56b71567dcf Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 26 May 2011 08:23:22 +0200 Subject: [PATCH 055/124] Give the media items the ability to do something when they are "focused". Make the search edits on the Songs, Bibles and Custom media items focus when the item is selected. --- openlp/core/lib/mediamanageritem.py | 7 +++++++ openlp/core/ui/mainwindow.py | 8 ++++++++ openlp/plugins/bibles/lib/mediaitem.py | 7 +++++++ openlp/plugins/custom/lib/mediaitem.py | 3 +++ openlp/plugins/songs/lib/mediaitem.py | 3 +++ 5 files changed, 28 insertions(+) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 00ec3a88a..01d9eb961 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -431,6 +431,13 @@ class MediaManagerItem(QtGui.QWidget): raise NotImplementedError(u'MediaManagerItem.onDeleteClick needs to ' u'be defined by the plugin') + def onFocus(self): + """ + Run when a tab in the media manager gains focus. This gives the media + item a chance to focus any elements it wants to. + """ + pass + def generateSlideData(self, serviceItem, item=None, xmlVersion=False): raise NotImplementedError(u'MediaManagerItem.generateSlideData needs ' u'to be defined by the plugin') diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index b54f7b206..249867f4a 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -537,6 +537,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'maindisplay_status_text'), self.showStatusMessage) + # Media Manager + QtCore.QObject.connect(self.mediaToolBox, + QtCore.SIGNAL(u'currentChanged(int)'), self.onMediaToolBoxChanged) Receiver.send_message(u'cursor_busy') # Simple message boxes QtCore.QObject.connect(Receiver.get_receiver(), @@ -602,6 +605,11 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): LanguageManager.auto_language = value LanguageManager.set_language(self.languageGroup.checkedAction()) + def onMediaToolBoxChanged(self, index): + widget = self.mediaToolBox.widget(index) + if widget: + widget.onFocus() + def versionNotice(self, version): """ Notifies the user that a newer version of OpenLP is available. diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index e2aa86d8c..99437d7f2 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -273,6 +273,12 @@ class BibleMediaItem(MediaManagerItem): QtCore.SIGNAL(u'currentChanged(int)'), self.onSearchTabBarCurrentChanged) + def onFocus(self): + if self.quickTab.isVisible(): + self.quickSearchEdit.setFocus() + else: + self.advancedBookComboBox.setFocus() + def configUpdated(self): log.debug(u'configUpdated') if QtCore.QSettings().value(self.settingsSection + u'/second bibles', @@ -463,6 +469,7 @@ class BibleMediaItem(MediaManagerItem): else: self.quickTab.setVisible(False) self.advancedTab.setVisible(True) + self.advancedBookComboBox.setFocus() def onLockButtonToggled(self, checked): if checked: diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 64ddf2374..499961152 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -199,6 +199,9 @@ class CustomMediaItem(MediaManagerItem): for row in row_list: self.listView.takeItem(row) + def onFocus(self): + self.searchTextEdit.setFocus() + def generateSlideData(self, service_item, item=None, xmlVersion=False): raw_slides = [] raw_footer = [] diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 7ea1658fc..acce12d54 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -125,6 +125,9 @@ class SongMediaItem(MediaManagerItem): QtCore.SIGNAL(u'searchTypeChanged(int)'), self.onSearchTextButtonClick) + def onFocus(self): + self.searchTextEdit.setFocus() + def configUpdated(self): self.searchAsYouType = QtCore.QSettings().value( self.settingsSection + u'/search as type', From aae9724f349bdd6ab21b1888f25e2007c493ffc5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 26 May 2011 08:45:22 +0200 Subject: [PATCH 057/124] allow html tags to be translated Fixes: https://launchpad.net/bugs/787552 --- openlp/core/lib/__init__.py | 52 ---------------------- openlp/core/lib/displaytags.py | 74 +++++++++++++++++++++++++++++--- openlp/core/ui/displaytagform.py | 16 ++++--- 3 files changed, 78 insertions(+), 64 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index e65271e03..d040244f7 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -36,58 +36,6 @@ from PyQt4 import QtCore, QtGui log = logging.getLogger(__name__) -base_html_expands = [] - -# Hex Color tags from http://www.w3schools.com/html/html_colornames.asp -base_html_expands.append({u'desc': u'Red', u'start tag': u'{r}', - u'start html': u'', - u'end tag': u'{/r}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'Black', u'start tag': u'{b}', - u'start html': u'', - u'end tag': u'{/b}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'Blue', u'start tag': u'{bl}', - u'start html': u'', - u'end tag': u'{/bl}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'Yellow', u'start tag': u'{y}', - u'start html': u'', - u'end tag': u'{/y}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'Green', u'start tag': u'{g}', - u'start html': u'', - u'end tag': u'{/g}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'Pink', u'start tag': u'{pk}', - u'start html': u'', - u'end tag': u'{/pk}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'Orange', u'start tag': u'{o}', - u'start html': u'', - u'end tag': u'{/o}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'Purple', u'start tag': u'{pp}', - u'start html': u'', - u'end tag': u'{/pp}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'White', u'start tag': u'{w}', - u'start html': u'', - u'end tag': u'{/w}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'Superscript', u'start tag': u'{su}', - u'start html': u'', u'end tag': u'{/su}', u'end html': u'', - u'protected': True}) -base_html_expands.append({u'desc': u'Subscript', u'start tag': u'{sb}', - u'start html': u'', u'end tag': u'{/sb}', u'end html': u'', - u'protected': True}) -base_html_expands.append({u'desc': u'Paragraph', u'start tag': u'{p}', - u'start html': u'

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

', - u'protected': True}) -base_html_expands.append({u'desc': u'Bold', u'start tag': u'{st}', - u'start html': u'', u'end tag': u'{/st}', u'end html': u'', - u'protected': True}) -base_html_expands.append({u'desc': u'Italics', u'start tag': u'{it}', - u'start html': u'', u'end tag': u'{/it}', u'end html': u'', - u'protected': True}) -base_html_expands.append({u'desc': u'Underline', u'start tag': u'{u}', - u'start html': u'', - u'end tag': u'{/u}', u'end html': u'', u'protected': True}) -base_html_expands.append({u'desc': u'Break', u'start tag': u'{br}', - u'start html': u'
', u'end tag': u'', u'end html': u'', - u'protected': True}) - def translate(context, text, comment=None, encoding=QtCore.QCoreApplication.CodecForTr, n=-1, translate=QtCore.QCoreApplication.translate): diff --git a/openlp/core/lib/displaytags.py b/openlp/core/lib/displaytags.py index 38112f661..3404455f7 100644 --- a/openlp/core/lib/displaytags.py +++ b/openlp/core/lib/displaytags.py @@ -28,7 +28,7 @@ Provide Html Tag management and Display Tag access class """ -from openlp.core.lib import base_html_expands +from openlp.core.lib import translate class DisplayTags(object): """ @@ -50,15 +50,77 @@ class DisplayTags(object): Resets the html_expands list. """ DisplayTags.html_expands = [] - for html in base_html_expands: - DisplayTags.html_expands.append(html) + base_tags = [] + # Append the base tags. + # Hex Color tags from http://www.w3schools.com/html/html_colornames.asp + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Red'), + u'start tag': u'{r}', + u'start html': u'', + u'end tag': u'{/r}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Black'), + u'start tag': u'{b}', + u'start html': u'', + u'end tag': u'{/b}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Blue'), + u'start tag': u'{bl}', + u'start html': u'', + u'end tag': u'{/bl}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Yellow'), + u'start tag': u'{y}', + u'start html': u'', + u'end tag': u'{/y}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Green'), + u'start tag': u'{g}', + u'start html': u'', + u'end tag': u'{/g}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Pink'), + u'start tag': u'{pk}', + u'start html': u'', + u'end tag': u'{/pk}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Orange'), + u'start tag': u'{o}', + u'start html': u'', + u'end tag': u'{/o}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Purple'), + u'start tag': u'{pp}', + u'start html': u'', + u'end tag': u'{/pp}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'White'), + u'start tag': u'{w}', + u'start html': u'', + u'end tag': u'{/w}', u'end html': u'', u'protected': True}) + base_tags.append({ + u'desc': translate('OpenLP.DisplayTags', 'Superscript'), + u'start tag': u'{su}', u'start html': u'', + u'end tag': u'{/su}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Subscript'), + u'start tag': u'{sb}', u'start html': u'', + u'end tag': u'{/sb}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Paragraph'), + u'start tag': u'{p}', u'start html': u'

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

', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Bold'), + u'start tag': u'{st}', u'start html': u'', + u'end tag': u'{/st}', u'end html': u'', + u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Italics'), + u'start tag': u'{it}', u'start html': u'', u'end tag': u'{/it}', + u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Underline'), + u'start tag': u'{u}', + u'start html': u'', + u'end tag': u'{/u}', u'end html': u'', u'protected': True}) + base_tags.append({u'desc': translate('OpenLP.DisplayTags', 'Break'), + u'start tag': u'{br}', u'start html': u'
', u'end tag': u'', + u'end html': u'', u'protected': True}) + DisplayTags.add_html_tags(base_tags) @staticmethod - def add_html_tag(tag): + def add_html_tags(tags): """ - Add a new tag to the list + Add a list of tags to the list """ - DisplayTags.html_expands.append(tag) + DisplayTags.html_expands.extend(tags) @staticmethod def remove_html_tag(tag_id): diff --git a/openlp/core/ui/displaytagform.py b/openlp/core/ui/displaytagform.py index 213f6e2e5..fc872c86e 100644 --- a/openlp/core/ui/displaytagform.py +++ b/openlp/core/ui/displaytagform.py @@ -87,8 +87,7 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): if user_expands_string: user_tags = cPickle.loads(user_expands_string) # If we have some user ones added them as well - for t in user_tags: - DisplayTags.add_html_tag(t) + DisplayTags.add_html_tags(user_tags) def onRowSelected(self): """ @@ -128,10 +127,15 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): 'Tag "n" already defined.')) return # Add new tag to list - tag = {u'desc': u'New Item', u'start tag': u'{n}', - u'start html': u'', u'end tag': u'{/n}', - u'end html': u'', u'protected': False} - DisplayTags.add_html_tag(tag) + tag = { + u'desc': translate('OpenLP.DisplayTagTab', 'New Tag'), + u'start tag': u'{n}', + u'start html': translate('OpenLP.DisplayTagTab', ''), + u'end tag': u'{/n}', + u'end html': translate('OpenLP.DisplayTagTab', ''), + u'protected': False + } + DisplayTags.add_html_tags([tag]) self._resetTable() # Highlight new row self.tagTableWidget.selectRow(self.tagTableWidget.rowCount() - 1) From 29305104617dee05043d96b7a16b344d7ba644a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 26 May 2011 09:00:40 +0200 Subject: [PATCH 058/124] change languageform like Raoul suggest --- openlp/plugins/bibles/forms/languagedialog.py | 94 +++++++++---------- openlp/plugins/bibles/forms/languageform.py | 15 +-- openlp/plugins/bibles/lib/db.py | 2 +- 3 files changed, 51 insertions(+), 60 deletions(-) diff --git a/openlp/plugins/bibles/forms/languagedialog.py b/openlp/plugins/bibles/forms/languagedialog.py index 0edcb74d8..5c1325a54 100644 --- a/openlp/plugins/bibles/forms/languagedialog.py +++ b/openlp/plugins/bibles/forms/languagedialog.py @@ -27,68 +27,58 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import create_accept_reject_button_box class Ui_LanguageDialog(object): def setupUi(self, languageDialog): - languageDialog.setObjectName(u'LanugageDialog') - languageDialog.resize(400, 175) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, - QtGui.QSizePolicy.MinimumExpanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(languageDialog.sizePolicy() - .hasHeightForWidth()) - languageDialog.setSizePolicy(sizePolicy) - self.widget = QtGui.QWidget(languageDialog) - self.widget.setGeometry(QtCore.QRect(10, 15, 381, 151)) - self.widget.setObjectName(u'widget') - self.verticalLayout = QtGui.QVBoxLayout(self.widget) - self.verticalLayout.setObjectName(u'verticalLayout') - self.headlineLabel = QtGui.QLabel(self.widget) - font = QtGui.QFont() - font.setFamily(u'Arial') - font.setPointSize(11) - font.setWeight(75) - font.setBold(True) - self.headlineLabel.setFont(font) - self.headlineLabel.setObjectName(u'HeadlineLabel') - self.verticalLayout.addWidget(self.headlineLabel) - self.infoLabel = QtGui.QLabel(self.widget) - self.infoLabel.setObjectName(u'InfoLabel') - self.verticalLayout.addWidget(self.infoLabel) - self.formLayout = QtGui.QFormLayout() - self.formLayout.setObjectName(u'formLayout') - self.requestLabel = QtGui.QLabel(self.widget) - self.requestLabel.setObjectName(u'RequestLabel') - self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.requestLabel) - self.requestComboBox = QtGui.QComboBox(self.widget) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, + languageDialog.setObjectName(u'languageDialog') + languageDialog.resize(400, 165) + self.languageLayout = QtGui.QVBoxLayout(languageDialog) + self.languageLayout.setSpacing(8) + self.languageLayout.setMargin(8) + self.languageLayout.setObjectName(u'languageLayout') + self.bibleLabel = QtGui.QLabel(languageDialog) + self.bibleLabel.setObjectName(u'bibleLabel') + self.languageLayout.addWidget(self.bibleLabel) + self.infoLabel = QtGui.QLabel(languageDialog) + self.infoLabel.setWordWrap(True) + self.infoLabel.setObjectName(u'infoLabel') + self.languageLayout.addWidget(self.infoLabel) + self.languageHBoxLayout = QtGui.QHBoxLayout() + self.languageHBoxLayout.setSpacing(8) + self.languageHBoxLayout.setObjectName(u'languageHBoxLayout') + self.languageLabel = QtGui.QLabel(languageDialog) + self.languageLabel.setObjectName(u'languageLabel') + self.languageHBoxLayout.addWidget(self.languageLabel) + self.languageComboBox = QtGui.QComboBox(languageDialog) + sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.MinimumExpanding, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.requestComboBox.sizePolicy() - .hasHeightForWidth()) - self.requestComboBox.setSizePolicy(sizePolicy) - self.requestComboBox.setObjectName(u'RequestComboBox') - self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.requestComboBox) - self.verticalLayout.addLayout(self.formLayout) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem) - self.formLayout.addWidget( - create_accept_reject_button_box(languageDialog)) + sizePolicy.setHeightForWidth( + self.languageComboBox.sizePolicy().hasHeightForWidth()) + self.languageComboBox.setSizePolicy(sizePolicy) + self.languageComboBox.setObjectName(u'languageComboBox') + self.languageHBoxLayout.addWidget(self.languageComboBox) + self.languageLayout.addLayout(self.languageHBoxLayout) + self.buttonBox = QtGui.QDialogButtonBox(languageDialog) + self.buttonBox.setOrientation(QtCore.Qt.Horizontal) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel| + QtGui.QDialogButtonBox.Ok) + self.buttonBox.setObjectName(u'buttonBox') + self.languageLayout.addWidget(self.buttonBox) + self.retranslateUi(languageDialog) - QtCore.QMetaObject.connectSlotsByName(languageDialog) + QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), + languageDialog.accept) + QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), + languageDialog.reject) def retranslateUi(self, languageDialog): languageDialog.setWindowTitle( translate('BiblesPlugin.LanguageDialog', 'Select Language')) - self.headlineLabel.setText( - translate('BiblesPlugin.LanguageDialog', 'Select Language:')) + self.bibleLabel.setText(translate('BiblesPlugin.LanguageDialog', '')) self.infoLabel.setText(translate('BiblesPlugin.LanguageDialog', - 'Please select the Bible\'s language')) - self.requestLabel.setText(translate('BiblesPlugin.languageDialog', + 'OpenLP is unable to determine the language of this translation ' + 'of the Bible. Please select the language from the list below.')) + self.languageLabel.setText(translate('BiblesPlugin.LanguageDialog', 'Language:')) diff --git a/openlp/plugins/bibles/forms/languageform.py b/openlp/plugins/bibles/forms/languageform.py index 0e2c3f003..e7cde104c 100644 --- a/openlp/plugins/bibles/forms/languageform.py +++ b/openlp/plugins/bibles/forms/languageform.py @@ -53,23 +53,24 @@ class LanguageForm(QDialog, Ui_LanguageDialog): self.setupUi(self) def exec_(self, bible_name): - self.requestComboBox.addItem(u'') + self.languageComboBox.addItem(u'') if bible_name: self.infoLabel.setText(unicode(translate( 'BiblesPlugin.LanguageDialog', - 'Please select the language for Bible:\n"%s"')) % - bible_name) + 'OpenLP is unable to determine the language of this translation' + ' of the Bible. Please select the language for "%s" from the ' + 'list below.')) % bible_name) items = BiblesResourcesDB.get_languages() for item in items: - self.requestComboBox.addItem(item[u'name']) + self.languageComboBox.addItem(item[u'name']) return QDialog.exec_(self) def accept(self): - if self.requestComboBox.currentText() == u'': + if self.languageComboBox.currentText() == u'': critical_error_message_box( message=translate('BiblesPlugin.LanguageForm', - 'You need to select a language.')) - self.requestComboBox.setFocus() + 'You need to choose a language.')) + self.languageComboBox.setFocus() return False else: return QDialog.accept(self) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 7278da42f..a3eb0e849 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -480,7 +480,7 @@ class BibleDB(QtCore.QObject, Manager): language = None language_form = LanguageForm(self.wizard) if language_form.exec_(bible_name): - language = unicode(language_form.requestComboBox.currentText()) + language = unicode(language_form.languageComboBox.currentText()) if not language: return False language = BiblesResourcesDB.get_language(language) From 6486d41b8cc86dd9a9c5fc76f9907cb782386a54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 26 May 2011 09:25:17 +0200 Subject: [PATCH 059/124] correct some words and code changed behaviour if the "cancel" button is pressed while upgrading --- openlp/plugins/bibles/bibleplugin.py | 2 +- .../plugins/bibles/forms/bibleupgradeform.py | 34 +++++++++---------- openlp/plugins/bibles/lib/http.py | 20 +++++------ 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 4d43ab76d..0ec8b8ed5 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -84,7 +84,7 @@ class BiblePlugin(Plugin): if QtGui.QMessageBox.information(self.formparent, translate('OpenLP', 'Information'), translate('OpenLP', 'Bible format has changed.\nYou have to upgrade your ' - 'existing bibles.\nShould OpenLP upgrade now?'), + 'existing Bibles.\nShould OpenLP upgrade now?'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)) == QtGui.QMessageBox.Yes: self.onToolsUpgradeItemTriggered() diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index b210b7c95..7b7c259ac 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -111,6 +111,8 @@ class BibleUpgradeForm(OpenLPWizard): """ log.debug(u'Wizard cancelled by user') self.stop_import_flag = True + if not self.currentPage() == self.progressPage: + self.done(QtGui.QDialog.Rejected) def onCurrentIdChanged(self, pageId): """ @@ -413,7 +415,7 @@ class BibleUpgradeForm(OpenLPWizard): OpenLPWizard.preWizard(self) self.progressLabel.setText(translate( 'BiblesPlugin.UpgradeWizardForm', - 'Starting upgrading bible(s)...')) + 'Starting upgrading Bible(s)...')) Receiver.send_message(u'openlp_process_events') def performWizard(self): @@ -450,7 +452,7 @@ class BibleUpgradeForm(OpenLPWizard): self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % - (number+1, self.maxBibles, name), + (number + 1, self.maxBibles, name), self.progressBar.maximum() - self.progressBar.value()) number += 1 continue @@ -503,8 +505,8 @@ class BibleUpgradeForm(OpenLPWizard): self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % - (number+1, self.maxBibles, name), - self.progressBar.maximum()-self.progressBar.value()) + (number + 1, self.maxBibles, name), + self.progressBar.maximum() - self.progressBar.value()) number += 1 continue bible = BiblesResourcesDB.get_webbible( @@ -517,16 +519,15 @@ class BibleUpgradeForm(OpenLPWizard): else: language_id = self.newbibles[number].get_language(name) if not language_id: - log.exception(u'Upgrading from "%s" '\ - 'failed' % filename) + log.exception(u'Upgrading from "%s" failed' % filename) delete_database(self.path, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % - (number+1, self.maxBibles, name), - self.progressBar.maximum()-self.progressBar.value()) + (number + 1, self.maxBibles, name), + self.progressBar.maximum() - self.progressBar.value()) number += 1 continue self.progressBar.setMaximum(len(books)) @@ -538,7 +539,7 @@ class BibleUpgradeForm(OpenLPWizard): 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\n' 'Upgrading %s ...')) % - (number+1, self.maxBibles, name, book)) + (number + 1, self.maxBibles, name, book)) book_ref_id = self.newbibles[number].\ get_book_ref_id_by_name(book, len(books), language_id) if not book_ref_id: @@ -560,16 +561,15 @@ class BibleUpgradeForm(OpenLPWizard): if not language_id: language_id = self.newbibles[number].get_language(name) if not language_id: - log.exception(u'Upgrading books from "%s" '\ - 'failed' % name) + log.exception(u'Upgrading books from "%s" failed' % name) delete_database(self.path, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % - (number+1, self.maxBibles, name), - self.progressBar.maximum()-self.progressBar.value()) + (number + 1, self.maxBibles, name), + self.progressBar.maximum() - self.progressBar.value()) number += 1 continue books = oldbible.get_books() @@ -582,7 +582,7 @@ class BibleUpgradeForm(OpenLPWizard): 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\n' 'Upgrading %s ...')) % - (number+1, self.maxBibles, name, book[u'name'])) + (number + 1, self.maxBibles, name, book[u'name'])) book_ref_id = self.newbibles[number].\ get_book_ref_id_by_name(book[u'name'], len(books), language_id) @@ -614,14 +614,14 @@ class BibleUpgradeForm(OpenLPWizard): 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\n' 'Done')) % - (number+1, self.maxBibles, name)) + (number + 1, self.maxBibles, name)) self.success[biblenumber] = True else: self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % - (number+1, self.maxBibles, name), - self.progressBar.maximum()-self.progressBar.value()) + (number + 1, self.maxBibles, name), + self.progressBar.maximum() - self.progressBar.value()) delete_database(self.path, clean_filename(self.newbibles[number].get_name())) number += 1 diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 1247aa1f0..5a05ade92 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -58,10 +58,10 @@ class BGExtract(object): def get_bible_chapter(self, version, bookname, chapter): """ - Access and decode bibles via the BibleGateway website. + Access and decode Bibles via the BibleGateway website. ``version`` - The version of the bible like 31 for New International version. + The version of the Bible like 31 for New International version. ``bookname`` Name of the Book. @@ -133,10 +133,10 @@ class BGExtract(object): def get_books_from_http(self, version): """ - Load a list of all books a bible contaions from BibleGateway website. + Load a list of all books a Bible contaions from BibleGateway website. ``version`` - The version of the bible like NIV for New International Version + The version of the Bible like NIV for New International Version """ log.debug(u'BGExtract.get_books_from_http("%s")', version) url_params = urllib.urlencode( @@ -157,7 +157,7 @@ class BGExtract(object): try: soup = BeautifulSoup(soup) except HTMLParseError: - log.exception(u'BeautifulSoup could not parse the bible page.') + log.exception(u'BeautifulSoup could not parse the Bible page.') if not soup: send_error_message(u'parse') return None @@ -224,11 +224,11 @@ class BSExtract(object): def get_books_from_http(self, version): """ - Load a list of all books a bible contains from Bibleserver mobile + Load a list of all books a Bible contains from Bibleserver mobile website. ``version`` - The version of the bible like NIV for New International Version + The version of the Bible like NIV for New International Version """ log.debug(u'BSExtract.get_books_from_http("%s")', version) chapter_url = u'http://m.bibleserver.com/overlay/selectBook?'\ @@ -261,7 +261,7 @@ class CWExtract(object): Access and decode bibles via the Crosswalk website ``version`` - The version of the bible like niv for New International Version + The version of the Bible like niv for New International Version ``bookname`` Text name of in english e.g. 'gen' for Genesis @@ -320,7 +320,7 @@ class CWExtract(object): def get_books_from_http(self, version): """ - Load a list of all books a bible contain from the Crosswalk website. + Load a list of all books a Bible contain from the Crosswalk website. ``version`` The version of the bible like NIV for New International Version @@ -383,7 +383,7 @@ class HTTPBible(BibleDB): self.wizard.progressBar.setMaximum(68) self.wizard.incrementProgressBar(unicode(translate( 'BiblesPlugin.HTTPBible', - 'Registering bible and loading books...'))) + 'Registering Bible and loading books...'))) self.create_meta(u'download source', self.download_source) self.create_meta(u'download name', self.download_name) if self.proxy_server: From 24d7b7b03829b22de1a22cab869c1fb4bc40c179 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 26 May 2011 09:34:29 +0200 Subject: [PATCH 060/124] small spelling change --- openlp/plugins/bibles/bibleplugin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 0ec8b8ed5..5a1ff8eec 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -117,7 +117,7 @@ class BiblePlugin(Plugin): self.toolsUpgradeItem = QtGui.QAction(tools_menu) self.toolsUpgradeItem.setObjectName(u'toolsUpgradeItem') self.toolsUpgradeItem.setText( - translate('BiblePlugin', '&Upgrade Bible databases')) + translate('BiblePlugin', '&Upgrade older Bibles')) self.toolsUpgradeItem.setStatusTip( translate('BiblePlugin', 'Upgrade the Bible databases to the ' 'latest format')) From 98614f629c1c4c96eed68271d76a30161502eaf4 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 26 May 2011 10:15:56 +0200 Subject: [PATCH 062/124] make themes in menu checkable --- openlp/core/ui/servicemanager.py | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 6834c8df8..82a49cc54 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -37,7 +37,8 @@ from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, \ ItemCapabilities, SettingsManager, translate from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ - context_menu_action, context_menu_separator, find_and_set_in_combo_box + context_menu_action, context_menu_separator, find_and_set_in_combo_box, \ + checkable_action from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ @@ -676,8 +677,19 @@ class ServiceManager(QtGui.QWidget): .is_capable(ItemCapabilities.AllowsVariableStartTime): self.timeAction.setVisible(True) self.themeMenu.menuAction().setVisible(False) - if serviceItem[u'service_item'].is_text(): + if serviceItem[u'service_item'].is_text() and \ + len(self.themeMenu.actions()) > 1: self.themeMenu.menuAction().setVisible(True) + if serviceItem[u'service_item'].theme is None: + themeAction = self.themeMenu.findChild(QtGui.QAction, u'Sunrise') + else: + themeAction = self.themeMenu.findChild(QtGui.QAction, u'Sunrise') + if themeAction is not None: + themeAction.setChecked(True) + print self.mainwindow.renderer.global_theme + for themeAction in self.themeMenu.actions(): + themeAction.setChecked( + themeAction.text() == serviceItem[u'service_item'].theme) action = self.menu.exec_(self.serviceManagerList.mapToGlobal(point)) def onServiceItemNoteForm(self): @@ -1276,10 +1288,16 @@ class ServiceManager(QtGui.QWidget): self.themeComboBox.clear() self.themeMenu.clear() self.themeComboBox.addItem(u'') + themeGroup = QtGui.QActionGroup(self.themeMenu) + themeGroup.setExclusive(True) + themeGroup.setObjectName(u'themeGroup') for theme in theme_list: self.themeComboBox.addItem(theme) - context_menu_action(self.themeMenu, None, theme, + themeAction = context_menu_action(self.themeMenu, None, theme, self.onThemeChangeAction) + themeAction.setObjectName(theme) + themeAction.setCheckable(True) + themeGroup.addAction(themeAction) find_and_set_in_combo_box(self.themeComboBox, self.service_theme) self.mainwindow.renderer.set_service_theme(self.service_theme) self.regenerateServiceItems() From 9221c8cb60c0a5ce21f01edde1a76fab8001f039 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Thu, 26 May 2011 06:37:36 -0400 Subject: [PATCH 063/124] Corrections to the code, enable_loop is now can_loop, and fits the 80 character line requirement as best i could get it too --- openlp/core/ui/slidecontroller.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 90c7abf85..8260ce222 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -937,12 +937,13 @@ class SlideController(QtGui.QWidget): self.updatePreview() else: row = self.previewListWidget.currentRow() + 1 - enable_loop = QtCore.QSettings().value(self.parent.generalSettingsSection + u'/enable slide loop', QtCore.QVariant(True)).toBool() + can_loop = QtCore.QSettings().value(self.parent.generalSettingsSection + + u'/enable slide loop', QtCore.QVariant(True)).toBool() if row == self.previewListWidget.rowCount(): - if enable_loop: + if can_loop: row = 0 else: - pass + row = self.previewListWidget.rowCount() - 1 self.__checkUpdateSelectedSlide(row) self.slideSelected() @@ -959,8 +960,9 @@ class SlideController(QtGui.QWidget): else: row = self.previewListWidget.currentRow() - 1 if row == -1: - enable_loop = QtCore.QSettings().value(self.parent.generalSettingsSection + u'/enable slide loop', QtCore.QVariant(True)).toBool() - if enable_loop: + can_loop = QtCore.QSettings().value(self.parent.generalSettingsSection + + u'/enable slide loop', QtCore.QVariant(True)).toBool() + if can_loop: row = self.previewListWidget.rowCount() - 1 else: row = 0 From 254bac86d46669407c13a7d327e135cac4fa59b0 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Thu, 26 May 2011 06:56:21 -0400 Subject: [PATCH 064/124] Corrections to the code, enable_loop is now can_loop, and fits the 80 character line requirement as best i could get it too and gets rid of the odd emtpy line in generaltab.py --- openlp/core/ui/generaltab.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 95e8dda4e..dad6ab339 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -387,4 +387,3 @@ class GeneralTab(SettingsTab): Called when the width, height, x position or y position has changed. """ self.display_changed = True - From 6b90adea6edfc5d6fcc827f31fe5c377064b10c6 Mon Sep 17 00:00:00 2001 From: Josh Miller Date: Thu, 26 May 2011 07:01:48 -0400 Subject: [PATCH 065/124] Corrections to the code, enable_loop is now can_loop, and fits the 80 character line requirement as best i could get it too and gets rid of the odd emtpy line in generaltab.py and changes can_loop directly to the setting required --- openlp/core/ui/slidecontroller.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 8260ce222..782684b45 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -937,10 +937,9 @@ class SlideController(QtGui.QWidget): self.updatePreview() else: row = self.previewListWidget.currentRow() + 1 - can_loop = QtCore.QSettings().value(self.parent.generalSettingsSection - + u'/enable slide loop', QtCore.QVariant(True)).toBool() if row == self.previewListWidget.rowCount(): - if can_loop: + if QtCore.QSettings().value(self.parent.generalSettingsSection + + u'/enable slide loop', QtCore.QVariant(True)).toBool(): row = 0 else: row = self.previewListWidget.rowCount() - 1 @@ -960,9 +959,8 @@ class SlideController(QtGui.QWidget): else: row = self.previewListWidget.currentRow() - 1 if row == -1: - can_loop = QtCore.QSettings().value(self.parent.generalSettingsSection - + u'/enable slide loop', QtCore.QVariant(True)).toBool() - if can_loop: + if QtCore.QSettings().value(self.parent.generalSettingsSection + + u'/enable slide loop', QtCore.QVariant(True)).toBool(): row = self.previewListWidget.rowCount() - 1 else: row = 0 From 40222b23c8f4991e95918f62ed11eaf7a1646fa5 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Thu, 26 May 2011 17:35:44 +0100 Subject: [PATCH 066/124] Remove index from search_lyrics for mysql - myisam --- openlp/plugins/songs/lib/db.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/db.py b/openlp/plugins/songs/lib/db.py index 404ad2c42..2c01f76fa 100644 --- a/openlp/plugins/songs/lib/db.py +++ b/openlp/plugins/songs/lib/db.py @@ -197,7 +197,7 @@ def init_schema(url): Column(u'song_number', types.Unicode(64)), Column(u'theme_name', types.Unicode(128)), Column(u'search_title', types.Unicode(255), index=True, nullable=False), - Column(u'search_lyrics', types.UnicodeText, index=True, nullable=False) + Column(u'search_lyrics', types.UnicodeText, nullable=False) ) # Definition of the "topics" table From acdbefd922a69f8704126cac2edf95825a8eb5e0 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Thu, 26 May 2011 18:11:22 +0100 Subject: [PATCH 067/124] Fixes --- openlp.pyw | 2 +- openlp/__init__.py | 2 +- openlp/core/__init__.py | 2 +- openlp/core/lib/__init__.py | 2 +- openlp/core/lib/db.py | 2 +- openlp/core/lib/displaytags.py | 2 +- openlp/core/lib/dockwidget.py | 2 +- openlp/core/lib/eventreceiver.py | 2 +- openlp/core/lib/htmlbuilder.py | 2 +- openlp/core/lib/imagemanager.py | 2 +- openlp/core/lib/listwidgetwithdnd.py | 2 +- openlp/core/lib/mediamanageritem.py | 2 +- openlp/core/lib/plugin.py | 2 +- openlp/core/lib/pluginmanager.py | 2 +- openlp/core/lib/renderer.py | 2 +- openlp/core/lib/searchedit.py | 2 +- openlp/core/lib/serviceitem.py | 2 +- openlp/core/lib/settingsmanager.py | 2 +- openlp/core/lib/settingstab.py | 2 +- openlp/core/lib/spelltextedit.py | 2 +- openlp/core/lib/theme.py | 2 +- openlp/core/lib/toolbar.py | 2 +- openlp/core/lib/ui.py | 2 +- openlp/core/theme/__init__.py | 2 +- openlp/core/theme/theme.py | 2 +- openlp/core/ui/__init__.py | 2 +- openlp/core/ui/aboutdialog.py | 6 +++--- openlp/core/ui/aboutform.py | 2 +- openlp/core/ui/advancedtab.py | 2 +- openlp/core/ui/displaytagdialog.py | 2 +- openlp/core/ui/displaytagform.py | 2 +- openlp/core/ui/exceptiondialog.py | 2 +- openlp/core/ui/exceptionform.py | 2 +- openlp/core/ui/filerenamedialog.py | 2 +- openlp/core/ui/filerenameform.py | 2 +- openlp/core/ui/firsttimeform.py | 2 +- openlp/core/ui/firsttimelanguagedialog.py | 2 +- openlp/core/ui/firsttimelanguageform.py | 2 +- openlp/core/ui/firsttimewizard.py | 2 +- openlp/core/ui/generaltab.py | 2 +- openlp/core/ui/maindisplay.py | 2 +- openlp/core/ui/mainwindow.py | 2 +- openlp/core/ui/mediadockmanager.py | 2 +- openlp/core/ui/plugindialog.py | 2 +- openlp/core/ui/pluginform.py | 2 +- openlp/core/ui/printservicedialog.py | 2 +- openlp/core/ui/printserviceform.py | 2 +- openlp/core/ui/screen.py | 2 +- openlp/core/ui/serviceitemeditdialog.py | 2 +- openlp/core/ui/serviceitemeditform.py | 2 +- openlp/core/ui/servicemanager.py | 2 +- openlp/core/ui/servicenoteform.py | 2 +- openlp/core/ui/settingsdialog.py | 2 +- openlp/core/ui/settingsform.py | 2 +- openlp/core/ui/shortcutlistdialog.py | 2 +- openlp/core/ui/shortcutlistform.py | 2 +- openlp/core/ui/slidecontroller.py | 2 +- openlp/core/ui/splashscreen.py | 2 +- openlp/core/ui/starttimedialog.py | 2 +- openlp/core/ui/starttimeform.py | 2 +- openlp/core/ui/themeform.py | 2 +- openlp/core/ui/thememanager.py | 2 +- openlp/core/ui/themestab.py | 2 +- openlp/core/ui/themewizard.py | 2 +- openlp/core/ui/wizard.py | 2 +- openlp/core/utils/__init__.py | 2 +- openlp/core/utils/actions.py | 2 +- openlp/core/utils/languagemanager.py | 2 +- openlp/plugins/__init__.py | 2 +- openlp/plugins/alerts/__init__.py | 2 +- openlp/plugins/alerts/alertsplugin.py | 2 +- openlp/plugins/alerts/forms/__init__.py | 2 +- openlp/plugins/alerts/forms/alertdialog.py | 2 +- openlp/plugins/alerts/forms/alertform.py | 2 +- openlp/plugins/alerts/lib/__init__.py | 2 +- openlp/plugins/alerts/lib/alertsmanager.py | 2 +- openlp/plugins/alerts/lib/alertstab.py | 2 +- openlp/plugins/alerts/lib/db.py | 2 +- openlp/plugins/bibles/__init__.py | 2 +- openlp/plugins/bibles/bibleplugin.py | 2 +- openlp/plugins/bibles/forms/__init__.py | 2 +- openlp/plugins/bibles/forms/bibleimportform.py | 2 +- openlp/plugins/bibles/lib/__init__.py | 2 +- openlp/plugins/bibles/lib/biblestab.py | 2 +- openlp/plugins/bibles/lib/csvbible.py | 2 +- openlp/plugins/bibles/lib/db.py | 2 +- openlp/plugins/bibles/lib/http.py | 2 +- openlp/plugins/bibles/lib/manager.py | 2 +- openlp/plugins/bibles/lib/mediaitem.py | 2 +- openlp/plugins/bibles/lib/openlp1.py | 2 +- openlp/plugins/bibles/lib/opensong.py | 2 +- openlp/plugins/bibles/lib/osis.py | 2 +- openlp/plugins/bibles/lib/versereferencelist.py | 2 +- openlp/plugins/custom/__init__.py | 2 +- openlp/plugins/custom/customplugin.py | 2 +- openlp/plugins/custom/forms/__init__.py | 2 +- openlp/plugins/custom/forms/editcustomdialog.py | 2 +- openlp/plugins/custom/forms/editcustomform.py | 2 +- openlp/plugins/custom/forms/editcustomslidedialog.py | 2 +- openlp/plugins/custom/forms/editcustomslideform.py | 2 +- openlp/plugins/custom/lib/__init__.py | 2 +- openlp/plugins/custom/lib/customtab.py | 2 +- openlp/plugins/custom/lib/customxmlhandler.py | 2 +- openlp/plugins/custom/lib/db.py | 2 +- openlp/plugins/custom/lib/mediaitem.py | 2 +- openlp/plugins/images/__init__.py | 2 +- openlp/plugins/images/imageplugin.py | 2 +- openlp/plugins/images/lib/__init__.py | 2 +- openlp/plugins/images/lib/mediaitem.py | 2 +- openlp/plugins/media/__init__.py | 2 +- openlp/plugins/media/lib/__init__.py | 2 +- openlp/plugins/media/lib/mediaitem.py | 2 +- openlp/plugins/media/lib/mediatab.py | 2 +- openlp/plugins/media/mediaplugin.py | 2 +- openlp/plugins/presentations/__init__.py | 2 +- openlp/plugins/presentations/lib/__init__.py | 2 +- openlp/plugins/presentations/lib/impresscontroller.py | 2 +- openlp/plugins/presentations/lib/mediaitem.py | 2 +- openlp/plugins/presentations/lib/messagelistener.py | 2 +- openlp/plugins/presentations/lib/powerpointcontroller.py | 2 +- openlp/plugins/presentations/lib/pptviewcontroller.py | 2 +- openlp/plugins/presentations/lib/pptviewlib/ppttest.py | 2 +- openlp/plugins/presentations/lib/presentationcontroller.py | 2 +- openlp/plugins/presentations/lib/presentationtab.py | 2 +- openlp/plugins/presentations/presentationplugin.py | 2 +- openlp/plugins/remotes/__init__.py | 2 +- openlp/plugins/remotes/lib/__init__.py | 2 +- openlp/plugins/remotes/lib/httpserver.py | 2 +- openlp/plugins/remotes/lib/remotetab.py | 2 +- openlp/plugins/remotes/remoteplugin.py | 2 +- openlp/plugins/songs/__init__.py | 2 +- openlp/plugins/songs/forms/__init__.py | 2 +- openlp/plugins/songs/forms/authorsdialog.py | 2 +- openlp/plugins/songs/forms/authorsform.py | 2 +- openlp/plugins/songs/forms/editsongdialog.py | 2 +- openlp/plugins/songs/forms/editsongform.py | 2 +- openlp/plugins/songs/forms/editversedialog.py | 2 +- openlp/plugins/songs/forms/editverseform.py | 2 +- openlp/plugins/songs/forms/songbookdialog.py | 2 +- openlp/plugins/songs/forms/songbookform.py | 2 +- openlp/plugins/songs/forms/songexportform.py | 2 +- openlp/plugins/songs/forms/songimportform.py | 2 +- openlp/plugins/songs/forms/songmaintenancedialog.py | 2 +- openlp/plugins/songs/forms/songmaintenanceform.py | 2 +- openlp/plugins/songs/forms/topicsdialog.py | 2 +- openlp/plugins/songs/forms/topicsform.py | 2 +- openlp/plugins/songs/lib/__init__.py | 2 +- openlp/plugins/songs/lib/cclifileimport.py | 2 +- openlp/plugins/songs/lib/db.py | 2 +- openlp/plugins/songs/lib/easislidesimport.py | 2 +- openlp/plugins/songs/lib/ewimport.py | 2 +- openlp/plugins/songs/lib/foilpresenterimport.py | 2 +- openlp/plugins/songs/lib/importer.py | 2 +- openlp/plugins/songs/lib/mediaitem.py | 2 +- openlp/plugins/songs/lib/olp1import.py | 2 +- openlp/plugins/songs/lib/olpimport.py | 2 +- openlp/plugins/songs/lib/oooimport.py | 2 +- openlp/plugins/songs/lib/openlyricsexport.py | 2 +- openlp/plugins/songs/lib/openlyricsimport.py | 2 +- openlp/plugins/songs/lib/opensongimport.py | 2 +- openlp/plugins/songs/lib/sofimport.py | 2 +- openlp/plugins/songs/lib/songbeamerimport.py | 2 +- openlp/plugins/songs/lib/songimport.py | 2 +- openlp/plugins/songs/lib/songshowplusimport.py | 2 +- openlp/plugins/songs/lib/songstab.py | 2 +- openlp/plugins/songs/lib/ui.py | 2 +- openlp/plugins/songs/lib/wowimport.py | 2 +- openlp/plugins/songs/lib/xml.py | 2 +- openlp/plugins/songs/songsplugin.py | 2 +- openlp/plugins/songusage/__init__.py | 2 +- openlp/plugins/songusage/forms/__init__.py | 2 +- openlp/plugins/songusage/forms/songusagedeletedialog.py | 2 +- openlp/plugins/songusage/forms/songusagedeleteform.py | 2 +- openlp/plugins/songusage/forms/songusagedetaildialog.py | 2 +- openlp/plugins/songusage/forms/songusagedetailform.py | 2 +- openlp/plugins/songusage/lib/__init__.py | 2 +- openlp/plugins/songusage/lib/db.py | 2 +- openlp/plugins/songusage/songusageplugin.py | 2 +- setup.py | 2 +- 179 files changed, 181 insertions(+), 181 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 93337e8e9..f796fa45f 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -8,7 +8,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/__init__.py b/openlp/__init__.py index a7080a5ca..d48d3f28a 100644 --- a/openlp/__init__.py +++ b/openlp/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/__init__.py b/openlp/core/__init__.py index 7cae05ab3..a6c804a99 100644 --- a/openlp/core/__init__.py +++ b/openlp/core/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 56300fc62..35cd14bd2 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index e6ab584d7..5b03e5fa4 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/displaytags.py b/openlp/core/lib/displaytags.py index 785ef1c70..c59f6e868 100644 --- a/openlp/core/lib/displaytags.py +++ b/openlp/core/lib/displaytags.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/dockwidget.py b/openlp/core/lib/dockwidget.py index c1b8fae3d..5c461bbf8 100644 --- a/openlp/core/lib/dockwidget.py +++ b/openlp/core/lib/dockwidget.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index fd2dff6c4..0de1a6e0b 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index fad2be519..cf7e73648 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/imagemanager.py b/openlp/core/lib/imagemanager.py index 3b18bd014..214fa4bda 100644 --- a/openlp/core/lib/imagemanager.py +++ b/openlp/core/lib/imagemanager.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/listwidgetwithdnd.py b/openlp/core/lib/listwidgetwithdnd.py index dc2128f25..5ebc7bfb7 100644 --- a/openlp/core/lib/listwidgetwithdnd.py +++ b/openlp/core/lib/listwidgetwithdnd.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 06e7a313c..9b76447ff 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index 62110fea7..0417446c1 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index ffb7774a8..6a77939e1 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index f97719128..079a9aa9c 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/searchedit.py b/openlp/core/lib/searchedit.py index 6fcb973f2..8c18ab09b 100644 --- a/openlp/core/lib/searchedit.py +++ b/openlp/core/lib/searchedit.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 8b89ce3ff..37723321c 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/settingsmanager.py b/openlp/core/lib/settingsmanager.py index 6d3d86a82..7eff1c00a 100644 --- a/openlp/core/lib/settingsmanager.py +++ b/openlp/core/lib/settingsmanager.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/settingstab.py b/openlp/core/lib/settingstab.py index aa5c7dfcf..c5fd86697 100644 --- a/openlp/core/lib/settingstab.py +++ b/openlp/core/lib/settingstab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py index 9e8b54aec..84cb30af6 100644 --- a/openlp/core/lib/spelltextedit.py +++ b/openlp/core/lib/spelltextedit.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/theme.py b/openlp/core/lib/theme.py index c3d860666..b9e588f15 100644 --- a/openlp/core/lib/theme.py +++ b/openlp/core/lib/theme.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py index 622220cec..9f9ab5197 100644 --- a/openlp/core/lib/toolbar.py +++ b/openlp/core/lib/toolbar.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 9e7512cfe..5055bb619 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/theme/__init__.py b/openlp/core/theme/__init__.py index e9a32167d..1b0999c6c 100644 --- a/openlp/core/theme/__init__.py +++ b/openlp/core/theme/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/theme/theme.py b/openlp/core/theme/theme.py index 175dd4212..9a0bee2c2 100644 --- a/openlp/core/theme/theme.py +++ b/openlp/core/theme/theme.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 661d45632..1555c134c 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/aboutdialog.py b/openlp/core/ui/aboutdialog.py index d4a51d203..7855d2c2a 100644 --- a/openlp/core/ui/aboutdialog.py +++ b/openlp/core/ui/aboutdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # @@ -116,7 +116,7 @@ class Ui_AboutDialog(object): u'Scott "sguerrieri" Guerrieri', u'Matthias "matthub" Hub', u'Meinert "m2j" Jordan', u'Armin "orangeshirt" K\xf6hler', u'Joshua "milleja46" Miller', - u'Stevan "smpettit" Pettit', u'Mattias "mahfiaz" P\xf5ldaru', + u'Stevan "StevanP" Pettit', u'Mattias "mahfiaz" P\xf5ldaru', u'Christian "crichter" Richter', u'Philip "Phill" Ridout', u'Jeffrey "whydoubt" Smith', u'Maikel Stuivenberg', u'Frode "frodus" Woldsund'] @@ -230,7 +230,7 @@ class Ui_AboutDialog(object): 'Portions copyright \xa9 2004-2011 %s')) % (u'Raoul Snyman', u'Tim Bentley, Jonathan Corwin, Michael Gorven, Gerald Britton, ' u'Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin K\xf6hler, ' - u'Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias ' + u'Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias ' u'P\xf5ldaru, Christian Richter, Philip Ridout, Jeffrey Smith, ' u'Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund') licence = translate('OpenLP.AboutForm', diff --git a/openlp/core/ui/aboutform.py b/openlp/core/ui/aboutform.py index f92efbdfe..f3e809ebc 100644 --- a/openlp/core/ui/aboutform.py +++ b/openlp/core/ui/aboutform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index 63aec4003..bad1ea822 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/displaytagdialog.py b/openlp/core/ui/displaytagdialog.py index 2758989c2..f501f03f6 100644 --- a/openlp/core/ui/displaytagdialog.py +++ b/openlp/core/ui/displaytagdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/displaytagform.py b/openlp/core/ui/displaytagform.py index 1ac67284f..78a78f8fa 100644 --- a/openlp/core/ui/displaytagform.py +++ b/openlp/core/ui/displaytagform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/exceptiondialog.py b/openlp/core/ui/exceptiondialog.py index 274478312..58669b96c 100644 --- a/openlp/core/ui/exceptiondialog.py +++ b/openlp/core/ui/exceptiondialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/exceptionform.py b/openlp/core/ui/exceptionform.py index 755168142..69f3c14af 100644 --- a/openlp/core/ui/exceptionform.py +++ b/openlp/core/ui/exceptionform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/filerenamedialog.py b/openlp/core/ui/filerenamedialog.py index acdcc1ab0..cca7bcd16 100644 --- a/openlp/core/ui/filerenamedialog.py +++ b/openlp/core/ui/filerenamedialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/filerenameform.py b/openlp/core/ui/filerenameform.py index 08c8de53c..d1516a18c 100644 --- a/openlp/core/ui/filerenameform.py +++ b/openlp/core/ui/filerenameform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/firsttimeform.py b/openlp/core/ui/firsttimeform.py index e6a34e9e8..3b006bf5e 100644 --- a/openlp/core/ui/firsttimeform.py +++ b/openlp/core/ui/firsttimeform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/firsttimelanguagedialog.py b/openlp/core/ui/firsttimelanguagedialog.py index bd8b3bdec..8a891780d 100644 --- a/openlp/core/ui/firsttimelanguagedialog.py +++ b/openlp/core/ui/firsttimelanguagedialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/firsttimelanguageform.py b/openlp/core/ui/firsttimelanguageform.py index 81c7f5b4b..3661ba51b 100644 --- a/openlp/core/ui/firsttimelanguageform.py +++ b/openlp/core/ui/firsttimelanguageform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/firsttimewizard.py b/openlp/core/ui/firsttimewizard.py index 533aba467..6852d533a 100644 --- a/openlp/core/ui/firsttimewizard.py +++ b/openlp/core/ui/firsttimewizard.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index e19eca41f..05a4be414 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index afe30f499..dc7c28ded 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index a4cc2ed06..82f1b9253 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/mediadockmanager.py b/openlp/core/ui/mediadockmanager.py index 1c762468a..f22ec0b92 100644 --- a/openlp/core/ui/mediadockmanager.py +++ b/openlp/core/ui/mediadockmanager.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/plugindialog.py b/openlp/core/ui/plugindialog.py index b00422a71..08683a2b6 100644 --- a/openlp/core/ui/plugindialog.py +++ b/openlp/core/ui/plugindialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/pluginform.py b/openlp/core/ui/pluginform.py index 754aef036..0f7f6dbeb 100644 --- a/openlp/core/ui/pluginform.py +++ b/openlp/core/ui/pluginform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/printservicedialog.py b/openlp/core/ui/printservicedialog.py index e2ed7ead1..4afd58b74 100644 --- a/openlp/core/ui/printservicedialog.py +++ b/openlp/core/ui/printservicedialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 7dc1a09c5..09ae8857f 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index 2f99c3a16..2b6e10644 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/serviceitemeditdialog.py b/openlp/core/ui/serviceitemeditdialog.py index 827f76367..febc01524 100644 --- a/openlp/core/ui/serviceitemeditdialog.py +++ b/openlp/core/ui/serviceitemeditdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/serviceitemeditform.py b/openlp/core/ui/serviceitemeditform.py index 1b229daf7..e05f4751e 100644 --- a/openlp/core/ui/serviceitemeditform.py +++ b/openlp/core/ui/serviceitemeditform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9a530d075..7851e5e41 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/servicenoteform.py b/openlp/core/ui/servicenoteform.py index 3c202c4b1..9a6cb4e22 100644 --- a/openlp/core/ui/servicenoteform.py +++ b/openlp/core/ui/servicenoteform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/settingsdialog.py b/openlp/core/ui/settingsdialog.py index 72e6b260f..6bdf4f749 100644 --- a/openlp/core/ui/settingsdialog.py +++ b/openlp/core/ui/settingsdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 98417077e..5ecb61c3f 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/shortcutlistdialog.py b/openlp/core/ui/shortcutlistdialog.py index 1e3de964e..b98df4cf4 100644 --- a/openlp/core/ui/shortcutlistdialog.py +++ b/openlp/core/ui/shortcutlistdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/shortcutlistform.py b/openlp/core/ui/shortcutlistform.py index 373494a91..d679d6cfa 100644 --- a/openlp/core/ui/shortcutlistform.py +++ b/openlp/core/ui/shortcutlistform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 6e915352b..feb67d72f 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/splashscreen.py b/openlp/core/ui/splashscreen.py index 43401bbbb..1d4c845d0 100644 --- a/openlp/core/ui/splashscreen.py +++ b/openlp/core/ui/splashscreen.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/starttimedialog.py b/openlp/core/ui/starttimedialog.py index 4a06cabd1..42d151dcc 100644 --- a/openlp/core/ui/starttimedialog.py +++ b/openlp/core/ui/starttimedialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/starttimeform.py b/openlp/core/ui/starttimeform.py index 931d1e40a..e33f88da0 100644 --- a/openlp/core/ui/starttimeform.py +++ b/openlp/core/ui/starttimeform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index da9295279..bae3e8692 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 924a1a49f..4dabcfdf7 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 46150c4ac..709b3ad80 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/themewizard.py b/openlp/core/ui/themewizard.py index 281c9a5da..2f75a01c2 100644 --- a/openlp/core/ui/themewizard.py +++ b/openlp/core/ui/themewizard.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/ui/wizard.py b/openlp/core/ui/wizard.py index c4dd18bf4..6275b64b6 100644 --- a/openlp/core/ui/wizard.py +++ b/openlp/core/ui/wizard.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index ef6e37d74..4ef445e36 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/utils/actions.py b/openlp/core/utils/actions.py index c999c4504..b34ed4c9b 100644 --- a/openlp/core/utils/actions.py +++ b/openlp/core/utils/actions.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index 3e2f3d1a7..0c0a4ed56 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/__init__.py b/openlp/plugins/__init__.py index 8bd9f40b8..fec8ebe71 100644 --- a/openlp/plugins/__init__.py +++ b/openlp/plugins/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/alerts/__init__.py b/openlp/plugins/alerts/__init__.py index 3072148b9..c8e82eaa2 100644 --- a/openlp/plugins/alerts/__init__.py +++ b/openlp/plugins/alerts/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 4afdf2981..9a61ff7d6 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/alerts/forms/__init__.py b/openlp/plugins/alerts/forms/__init__.py index 0dd20ca69..4c9b353d4 100644 --- a/openlp/plugins/alerts/forms/__init__.py +++ b/openlp/plugins/alerts/forms/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/alerts/forms/alertdialog.py b/openlp/plugins/alerts/forms/alertdialog.py index 53d38263f..8ee777ebe 100644 --- a/openlp/plugins/alerts/forms/alertdialog.py +++ b/openlp/plugins/alerts/forms/alertdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index 6c2932923..13cb4503a 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/alerts/lib/__init__.py b/openlp/plugins/alerts/lib/__init__.py index 83acee990..2ac257585 100644 --- a/openlp/plugins/alerts/lib/__init__.py +++ b/openlp/plugins/alerts/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index 6ff038c62..c55e76ef7 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 01a9c853f..31e59a35d 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/alerts/lib/db.py b/openlp/plugins/alerts/lib/db.py index 58f6cb092..b70dbffd2 100644 --- a/openlp/plugins/alerts/lib/db.py +++ b/openlp/plugins/alerts/lib/db.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/__init__.py b/openlp/plugins/bibles/__init__.py index 0dc4208c6..273148af2 100644 --- a/openlp/plugins/bibles/__init__.py +++ b/openlp/plugins/bibles/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 5ee031932..2deb86cc1 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/forms/__init__.py b/openlp/plugins/bibles/forms/__init__.py index d13e049d3..83b444394 100644 --- a/openlp/plugins/bibles/forms/__init__.py +++ b/openlp/plugins/bibles/forms/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index ffbf6dbb1..e05e29d57 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/__init__.py b/openlp/plugins/bibles/lib/__init__.py index b62a9f791..9fda8fbd6 100644 --- a/openlp/plugins/bibles/lib/__init__.py +++ b/openlp/plugins/bibles/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index dbfb3fd97..321148a22 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index ffe03908d..37764108a 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index e494f16ea..c896528ea 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 44b2d33a7..b66aa0373 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 1991f646d..e367e091e 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 6d434725e..b245f7241 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 27e99d03b..c3a1c9f68 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index 01c181c23..115b08e42 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 85a368853..958d70d90 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/bibles/lib/versereferencelist.py b/openlp/plugins/bibles/lib/versereferencelist.py index af9af0268..c51eb106e 100644 --- a/openlp/plugins/bibles/lib/versereferencelist.py +++ b/openlp/plugins/bibles/lib/versereferencelist.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/__init__.py b/openlp/plugins/custom/__init__.py index 1cf34bfe0..82729a11c 100644 --- a/openlp/plugins/custom/__init__.py +++ b/openlp/plugins/custom/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index b3e208b13..887f813fa 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/forms/__init__.py b/openlp/plugins/custom/forms/__init__.py index 67c02fa19..53953c428 100644 --- a/openlp/plugins/custom/forms/__init__.py +++ b/openlp/plugins/custom/forms/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py index 08855cc4a..418c7ea76 100644 --- a/openlp/plugins/custom/forms/editcustomdialog.py +++ b/openlp/plugins/custom/forms/editcustomdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 0561298fe..5a23e2066 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/forms/editcustomslidedialog.py b/openlp/plugins/custom/forms/editcustomslidedialog.py index 6eda83d1d..165e6d847 100644 --- a/openlp/plugins/custom/forms/editcustomslidedialog.py +++ b/openlp/plugins/custom/forms/editcustomslidedialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/forms/editcustomslideform.py b/openlp/plugins/custom/forms/editcustomslideform.py index 769b543dc..d8087dc2c 100644 --- a/openlp/plugins/custom/forms/editcustomslideform.py +++ b/openlp/plugins/custom/forms/editcustomslideform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/lib/__init__.py b/openlp/plugins/custom/lib/__init__.py index 4df4ede3d..678c0065c 100644 --- a/openlp/plugins/custom/lib/__init__.py +++ b/openlp/plugins/custom/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/lib/customtab.py b/openlp/plugins/custom/lib/customtab.py index a35ddbc38..fb83fab81 100644 --- a/openlp/plugins/custom/lib/customtab.py +++ b/openlp/plugins/custom/lib/customtab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/lib/customxmlhandler.py b/openlp/plugins/custom/lib/customxmlhandler.py index 836a14ec9..e1021fdad 100644 --- a/openlp/plugins/custom/lib/customxmlhandler.py +++ b/openlp/plugins/custom/lib/customxmlhandler.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/lib/db.py b/openlp/plugins/custom/lib/db.py index b276e78f2..83f298856 100644 --- a/openlp/plugins/custom/lib/db.py +++ b/openlp/plugins/custom/lib/db.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 380b137ea..91af98bea 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/images/__init__.py b/openlp/plugins/images/__init__.py index 17a8d80da..5d9f77ab9 100644 --- a/openlp/plugins/images/__init__.py +++ b/openlp/plugins/images/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index 63f488b13..3a05f7923 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/images/lib/__init__.py b/openlp/plugins/images/lib/__init__.py index 341ace05d..370dba7b0 100644 --- a/openlp/plugins/images/lib/__init__.py +++ b/openlp/plugins/images/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 9f8724c94..f760a984e 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/media/__init__.py b/openlp/plugins/media/__init__.py index 1d451f137..24dc4554a 100644 --- a/openlp/plugins/media/__init__.py +++ b/openlp/plugins/media/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/media/lib/__init__.py b/openlp/plugins/media/lib/__init__.py index b7fca8470..434eec67a 100644 --- a/openlp/plugins/media/lib/__init__.py +++ b/openlp/plugins/media/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 20765504a..9dc17f4d3 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/media/lib/mediatab.py b/openlp/plugins/media/lib/mediatab.py index 32b1da226..2e11cdd6b 100644 --- a/openlp/plugins/media/lib/mediatab.py +++ b/openlp/plugins/media/lib/mediatab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 3cd463c8b..e27f73634 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/__init__.py b/openlp/plugins/presentations/__init__.py index a433e7b23..573716b93 100644 --- a/openlp/plugins/presentations/__init__.py +++ b/openlp/plugins/presentations/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/lib/__init__.py b/openlp/plugins/presentations/lib/__init__.py index 0dbe58490..154709800 100644 --- a/openlp/plugins/presentations/lib/__init__.py +++ b/openlp/plugins/presentations/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 7ec01187e..0d0cc43a3 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index c0c5b2c8e..b757b5bfd 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 238e2cfc0..6b2c9cbd2 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index 1eb458ba9..fb2ce7bcc 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index 36191f8aa..7e2336b75 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/lib/pptviewlib/ppttest.py b/openlp/plugins/presentations/lib/pptviewlib/ppttest.py index 7ef7d4654..fe483655c 100644 --- a/openlp/plugins/presentations/lib/pptviewlib/ppttest.py +++ b/openlp/plugins/presentations/lib/pptviewlib/ppttest.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/lib/presentationcontroller.py b/openlp/plugins/presentations/lib/presentationcontroller.py index d5629be12..63bd44cc4 100644 --- a/openlp/plugins/presentations/lib/presentationcontroller.py +++ b/openlp/plugins/presentations/lib/presentationcontroller.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/lib/presentationtab.py b/openlp/plugins/presentations/lib/presentationtab.py index be553d3f2..5579a2a99 100644 --- a/openlp/plugins/presentations/lib/presentationtab.py +++ b/openlp/plugins/presentations/lib/presentationtab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 0253796a8..171039d15 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/remotes/__init__.py b/openlp/plugins/remotes/__init__.py index fee1b76ff..b4a914d45 100644 --- a/openlp/plugins/remotes/__init__.py +++ b/openlp/plugins/remotes/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/remotes/lib/__init__.py b/openlp/plugins/remotes/lib/__init__.py index cb29f3cfe..c364b4be3 100644 --- a/openlp/plugins/remotes/lib/__init__.py +++ b/openlp/plugins/remotes/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 545cb0144..0ff8bc32e 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/remotes/lib/remotetab.py b/openlp/plugins/remotes/lib/remotetab.py index 84097ee9c..5041b49e2 100644 --- a/openlp/plugins/remotes/lib/remotetab.py +++ b/openlp/plugins/remotes/lib/remotetab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index 3ce29889e..8eec7516d 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/__init__.py b/openlp/plugins/songs/__init__.py index 52b8ad06e..79e071eeb 100644 --- a/openlp/plugins/songs/__init__.py +++ b/openlp/plugins/songs/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/__init__.py b/openlp/plugins/songs/forms/__init__.py index e7817b8d1..a224bf00e 100644 --- a/openlp/plugins/songs/forms/__init__.py +++ b/openlp/plugins/songs/forms/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/authorsdialog.py b/openlp/plugins/songs/forms/authorsdialog.py index ec9d8bcf6..8b56b0e65 100644 --- a/openlp/plugins/songs/forms/authorsdialog.py +++ b/openlp/plugins/songs/forms/authorsdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/authorsform.py b/openlp/plugins/songs/forms/authorsform.py index 57577e55c..bcc1b7235 100644 --- a/openlp/plugins/songs/forms/authorsform.py +++ b/openlp/plugins/songs/forms/authorsform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index 88ad40daa..0d864bba8 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 480055a8e..ba4afdfe7 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py index 495a03be9..16579f6a9 100644 --- a/openlp/plugins/songs/forms/editversedialog.py +++ b/openlp/plugins/songs/forms/editversedialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index d13ff884d..f604f0c5b 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/songbookdialog.py b/openlp/plugins/songs/forms/songbookdialog.py index 5508c93c9..68709009b 100644 --- a/openlp/plugins/songs/forms/songbookdialog.py +++ b/openlp/plugins/songs/forms/songbookdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/songbookform.py b/openlp/plugins/songs/forms/songbookform.py index 343b5b6e3..e927e9bde 100644 --- a/openlp/plugins/songs/forms/songbookform.py +++ b/openlp/plugins/songs/forms/songbookform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index d2dd4fb67..58550c710 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index ec2c7774b..46d9f1c83 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/songmaintenancedialog.py b/openlp/plugins/songs/forms/songmaintenancedialog.py index 0ac0a8925..88fafefad 100644 --- a/openlp/plugins/songs/forms/songmaintenancedialog.py +++ b/openlp/plugins/songs/forms/songmaintenancedialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/songmaintenanceform.py b/openlp/plugins/songs/forms/songmaintenanceform.py index cc0bae8bc..22e47d7b4 100644 --- a/openlp/plugins/songs/forms/songmaintenanceform.py +++ b/openlp/plugins/songs/forms/songmaintenanceform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/topicsdialog.py b/openlp/plugins/songs/forms/topicsdialog.py index cff8ee4c5..3cf298cfc 100644 --- a/openlp/plugins/songs/forms/topicsdialog.py +++ b/openlp/plugins/songs/forms/topicsdialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/forms/topicsform.py b/openlp/plugins/songs/forms/topicsform.py index 35e543ee4..88149264a 100644 --- a/openlp/plugins/songs/forms/topicsform.py +++ b/openlp/plugins/songs/forms/topicsform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index a529464df..9e068e7f1 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/cclifileimport.py b/openlp/plugins/songs/lib/cclifileimport.py index 6f500dc28..11bb429a8 100644 --- a/openlp/plugins/songs/lib/cclifileimport.py +++ b/openlp/plugins/songs/lib/cclifileimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/db.py b/openlp/plugins/songs/lib/db.py index 4e3f5b503..5a9be63e3 100644 --- a/openlp/plugins/songs/lib/db.py +++ b/openlp/plugins/songs/lib/db.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/easislidesimport.py b/openlp/plugins/songs/lib/easislidesimport.py index eb7127f62..11a68c2d8 100644 --- a/openlp/plugins/songs/lib/easislidesimport.py +++ b/openlp/plugins/songs/lib/easislidesimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/ewimport.py b/openlp/plugins/songs/lib/ewimport.py index 64cabfc32..7d2658245 100644 --- a/openlp/plugins/songs/lib/ewimport.py +++ b/openlp/plugins/songs/lib/ewimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/foilpresenterimport.py b/openlp/plugins/songs/lib/foilpresenterimport.py index b8c9a6a2a..b78c91762 100644 --- a/openlp/plugins/songs/lib/foilpresenterimport.py +++ b/openlp/plugins/songs/lib/foilpresenterimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/importer.py b/openlp/plugins/songs/lib/importer.py index 2723ef626..cf2d3f536 100644 --- a/openlp/plugins/songs/lib/importer.py +++ b/openlp/plugins/songs/lib/importer.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 278d9bf5d..cc36f983a 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/olp1import.py b/openlp/plugins/songs/lib/olp1import.py index 2ae37cca4..022c05414 100644 --- a/openlp/plugins/songs/lib/olp1import.py +++ b/openlp/plugins/songs/lib/olp1import.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/olpimport.py b/openlp/plugins/songs/lib/olpimport.py index e58567f1c..b617734bd 100644 --- a/openlp/plugins/songs/lib/olpimport.py +++ b/openlp/plugins/songs/lib/olpimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py index 292c94401..34765274d 100644 --- a/openlp/plugins/songs/lib/oooimport.py +++ b/openlp/plugins/songs/lib/oooimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/openlyricsexport.py b/openlp/plugins/songs/lib/openlyricsexport.py index 4f589c474..d12674116 100644 --- a/openlp/plugins/songs/lib/openlyricsexport.py +++ b/openlp/plugins/songs/lib/openlyricsexport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/openlyricsimport.py b/openlp/plugins/songs/lib/openlyricsimport.py index 1d03149a5..abd419ec0 100644 --- a/openlp/plugins/songs/lib/openlyricsimport.py +++ b/openlp/plugins/songs/lib/openlyricsimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/opensongimport.py b/openlp/plugins/songs/lib/opensongimport.py index 03b5e9a67..162a0e651 100644 --- a/openlp/plugins/songs/lib/opensongimport.py +++ b/openlp/plugins/songs/lib/opensongimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py index ded1ceb65..013a8b0b5 100644 --- a/openlp/plugins/songs/lib/sofimport.py +++ b/openlp/plugins/songs/lib/sofimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/songbeamerimport.py b/openlp/plugins/songs/lib/songbeamerimport.py index 97b165c0c..258ed23b4 100644 --- a/openlp/plugins/songs/lib/songbeamerimport.py +++ b/openlp/plugins/songs/lib/songbeamerimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 3d3292f0b..ef142c8f8 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/songshowplusimport.py b/openlp/plugins/songs/lib/songshowplusimport.py index d7c4eb30c..b4a7e5061 100644 --- a/openlp/plugins/songs/lib/songshowplusimport.py +++ b/openlp/plugins/songs/lib/songshowplusimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/songstab.py b/openlp/plugins/songs/lib/songstab.py index 28954b33a..a65e21a28 100644 --- a/openlp/plugins/songs/lib/songstab.py +++ b/openlp/plugins/songs/lib/songstab.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/ui.py b/openlp/plugins/songs/lib/ui.py index af8aa1361..1db226b7a 100644 --- a/openlp/plugins/songs/lib/ui.py +++ b/openlp/plugins/songs/lib/ui.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/wowimport.py b/openlp/plugins/songs/lib/wowimport.py index fbbf60b95..73c851038 100644 --- a/openlp/plugins/songs/lib/wowimport.py +++ b/openlp/plugins/songs/lib/wowimport.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index b49fa2893..7bcf56aa1 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 98f15e32e..696431870 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songusage/__init__.py b/openlp/plugins/songusage/__init__.py index e1ab42f0c..ed9dd1fe6 100644 --- a/openlp/plugins/songusage/__init__.py +++ b/openlp/plugins/songusage/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songusage/forms/__init__.py b/openlp/plugins/songusage/forms/__init__.py index ea03b20c4..f382b0bb9 100644 --- a/openlp/plugins/songusage/forms/__init__.py +++ b/openlp/plugins/songusage/forms/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songusage/forms/songusagedeletedialog.py b/openlp/plugins/songusage/forms/songusagedeletedialog.py index ed527ebae..ec93cc780 100644 --- a/openlp/plugins/songusage/forms/songusagedeletedialog.py +++ b/openlp/plugins/songusage/forms/songusagedeletedialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songusage/forms/songusagedeleteform.py b/openlp/plugins/songusage/forms/songusagedeleteform.py index d9e24fa43..9eea0a6da 100644 --- a/openlp/plugins/songusage/forms/songusagedeleteform.py +++ b/openlp/plugins/songusage/forms/songusagedeleteform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songusage/forms/songusagedetaildialog.py b/openlp/plugins/songusage/forms/songusagedetaildialog.py index 4e8e1eb37..e06127ae8 100644 --- a/openlp/plugins/songusage/forms/songusagedetaildialog.py +++ b/openlp/plugins/songusage/forms/songusagedetaildialog.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index 3a889c1cc..3f90961b0 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songusage/lib/__init__.py b/openlp/plugins/songusage/lib/__init__.py index 34fc155dd..3c9c20ecd 100644 --- a/openlp/plugins/songusage/lib/__init__.py +++ b/openlp/plugins/songusage/lib/__init__.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songusage/lib/db.py b/openlp/plugins/songusage/lib/db.py index 0c59156fc..2c6c4fa6c 100644 --- a/openlp/plugins/songusage/lib/db.py +++ b/openlp/plugins/songusage/lib/db.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 77c31705f..7d05e0add 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -7,7 +7,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # diff --git a/setup.py b/setup.py index 618bbb487..98bf98054 100755 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Gerald Britton, Jonathan # # Corwin, Michael Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, # -# Armin Köhler, Joshua Millar, Stevan Pettit, Andreas Preikschat, Mattias # +# Armin Köhler, Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias # # Põldaru, Christian Richter, Philip Ridout, Jeffrey Smith, Maikel # # Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # # --------------------------------------------------------------------------- # From af961afa7883117031570bb8e18ce29282105811 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 26 May 2011 20:00:25 +0200 Subject: [PATCH 068/124] removed the 'default' button --- openlp/core/ui/displaytagdialog.py | 5 ----- openlp/core/ui/displaytagform.py | 9 --------- 2 files changed, 14 deletions(-) diff --git a/openlp/core/ui/displaytagdialog.py b/openlp/core/ui/displaytagdialog.py index f501f03f6..a7701d8f3 100644 --- a/openlp/core/ui/displaytagdialog.py +++ b/openlp/core/ui/displaytagdialog.py @@ -69,9 +69,6 @@ class Ui_DisplayTagDialog(object): spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) - self.defaultPushButton = QtGui.QPushButton(self.widget) - self.defaultPushButton.setObjectName(u'defaultPushButton') - self.horizontalLayout.addWidget(self.defaultPushButton) self.deletePushButton = QtGui.QPushButton(self.widget) self.deletePushButton.setObjectName(u'deletePushButton') self.horizontalLayout.addWidget(self.deletePushButton) @@ -141,8 +138,6 @@ class Ui_DisplayTagDialog(object): self.endTagLabel.setText( translate('OpenLP.DisplayTagDialog', 'End tag')) self.deletePushButton.setText(UiStrings().Delete) - self.defaultPushButton.setText( - translate('OpenLP.DisplayTagDialog', 'Default')) self.newPushButton.setText(UiStrings().New) self.tagTableWidget.horizontalHeaderItem(0).setText( translate('OpenLP.DisplayTagDialog', 'Description')) diff --git a/openlp/core/ui/displaytagform.py b/openlp/core/ui/displaytagform.py index d0f27120f..6aaddf2b8 100644 --- a/openlp/core/ui/displaytagform.py +++ b/openlp/core/ui/displaytagform.py @@ -51,8 +51,6 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): self._loadDisplayTags() QtCore.QObject.connect(self.tagTableWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onRowSelected) - QtCore.QObject.connect(self.defaultPushButton, - QtCore.SIGNAL(u'pressed()'), self.onDefaultPushed) QtCore.QObject.connect(self.newPushButton, QtCore.SIGNAL(u'pressed()'), self.onNewPushed) QtCore.QObject.connect(self.savePushButton, @@ -141,13 +139,6 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): self.tagTableWidget.selectRow(self.tagTableWidget.rowCount() - 1) self.onRowSelected() - def onDefaultPushed(self): - """ - Remove all Custom Tags and reset to base set only. - """ - DisplayTags.reset_html_tags() - self._resetTable() - def onDeletePushed(self): """ Delete selected custom tag. From 6aca4600b7b345f82de99bd210b14edbafa0c287 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 26 May 2011 20:52:05 +0200 Subject: [PATCH 070/124] fixed bug 788770 Fixes: https://launchpad.net/bugs/788770 --- openlp/core/lib/serviceitem.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 37723321c..cf682abc6 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -177,10 +177,11 @@ class ServiceItem(object): .format_slide(slide[u'raw_slide'], line_break, self) for page in formatted: page = page.replace(u'
', u'{br}') + html = expand_tags(cgi.escape(page.rstrip())) self._display_frames.append({ u'title': clean_tags(page), u'text': clean_tags(page.rstrip()), - u'html': expand_tags(cgi.escape(page.rstrip())), + u'html': html.replace(u'&nbsp;', u' '), u'verseTag': slide[u'verseTag'] }) elif self.service_item_type == ServiceItemType.Image or \ From c435127585284e27676963cdfb02ead7fb077efb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 26 May 2011 21:13:11 +0200 Subject: [PATCH 071/124] some fixes in relation with the extened LanguageForm close cursor from OldBibleDB --- openlp/plugins/bibles/forms/bibleimportform.py | 2 +- openlp/plugins/bibles/forms/bibleupgradeform.py | 1 + openlp/plugins/bibles/forms/languageform.py | 6 +----- openlp/plugins/bibles/lib/csvbible.py | 7 +++---- openlp/plugins/bibles/lib/db.py | 7 +++++++ openlp/plugins/bibles/lib/http.py | 4 ++-- openlp/plugins/bibles/lib/openlp1.py | 7 +++---- openlp/plugins/bibles/lib/opensong.py | 4 ++-- openlp/plugins/bibles/lib/osis.py | 7 +++---- 9 files changed, 23 insertions(+), 22 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleimportform.py b/openlp/plugins/bibles/forms/bibleimportform.py index 45ada29ba..731c4ff17 100644 --- a/openlp/plugins/bibles/forms/bibleimportform.py +++ b/openlp/plugins/bibles/forms/bibleimportform.py @@ -706,7 +706,7 @@ class BibleImportForm(OpenLPWizard): name=license_version, filename=unicode(self.field(u'openlp1_location').toString()) ) - if importer.do_import(): + if importer.do_import(license_version): self.manager.save_meta_data(license_version, license_version, license_copyright, license_permissions) self.manager.reload_bibles() diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 7b7c259ac..fef8c04df 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -324,6 +324,7 @@ class BibleUpgradeForm(OpenLPWizard): oldbible = OldBibleDB(self.mediaItem, path=self.path, file=filename) oldname = oldbible.get_name() + oldbible.close_cursor() if not version_name: critical_error_message_box(UiStrings().EmptyField, translate('BiblesPlugin.UpgradeWizardForm', diff --git a/openlp/plugins/bibles/forms/languageform.py b/openlp/plugins/bibles/forms/languageform.py index e7cde104c..477c7ee1e 100644 --- a/openlp/plugins/bibles/forms/languageform.py +++ b/openlp/plugins/bibles/forms/languageform.py @@ -55,11 +55,7 @@ class LanguageForm(QDialog, Ui_LanguageDialog): def exec_(self, bible_name): self.languageComboBox.addItem(u'') if bible_name: - self.infoLabel.setText(unicode(translate( - 'BiblesPlugin.LanguageDialog', - 'OpenLP is unable to determine the language of this translation' - ' of the Bible. Please select the language for "%s" from the ' - 'list below.')) % bible_name) + self.bibleLabel.setText(unicode(bible_name)) items = BiblesResourcesDB.get_languages() for item in items: self.languageComboBox.addItem(item[u'name']) diff --git a/openlp/plugins/bibles/lib/csvbible.py b/openlp/plugins/bibles/lib/csvbible.py index a4a498677..8b1ce0c8d 100644 --- a/openlp/plugins/bibles/lib/csvbible.py +++ b/openlp/plugins/bibles/lib/csvbible.py @@ -92,7 +92,7 @@ class CSVBible(BibleDB): self.booksfile = kwargs[u'booksfile'] self.versesfile = kwargs[u'versefile'] - def do_import(self): + def do_import(self, bible_name=None): """ Import the bible books and verses. """ @@ -100,10 +100,9 @@ class CSVBible(BibleDB): self.wizard.progressBar.setMinimum(0) self.wizard.progressBar.setMaximum(66) success = True - language_id = self.get_language() + language_id = self.get_language(bible_name) if not language_id: - log.exception(u'Importing books from "%s" '\ - 'failed' % self.filename) + log.exception(u'Importing books from "%s" failed' % self.filename) return False books_file = None book_list = {} diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index a3eb0e849..ab4cf3ba4 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -999,6 +999,13 @@ class OldBibleDB(QtCore.QObject, Manager): self.cursor = conn.cursor() return self.cursor + def close_cursor(self): + """ + Close the cursor + """ + if self.cursor: + self.cursor.close() + def run_sql(self, query, parameters=()): """ Run an SQL query on the database, returning the results. diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 5a05ade92..ab82799d1 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -375,7 +375,7 @@ class HTTPBible(BibleDB): if u'proxy_password' in kwargs: self.proxy_password = kwargs[u'proxy_password'] - def do_import(self): + def do_import(self, bible_name=None): """ Run the import. This method overrides the parent class method. Returns ``True`` on success, ``False`` on failure. @@ -414,7 +414,7 @@ class HTTPBible(BibleDB): language_id = bible[u'language_id'] self.create_meta(u'language_id', language_id) else: - language_id = self.get_language() + language_id = self.get_language(bible_name) if not language_id: log.exception(u'Importing books from %s " '\ 'failed' % self.filename) diff --git a/openlp/plugins/bibles/lib/openlp1.py b/openlp/plugins/bibles/lib/openlp1.py index 2c3eb7851..3564c5d37 100644 --- a/openlp/plugins/bibles/lib/openlp1.py +++ b/openlp/plugins/bibles/lib/openlp1.py @@ -46,7 +46,7 @@ class OpenLP1Bible(BibleDB): BibleDB.__init__(self, parent, **kwargs) self.filename = kwargs[u'filename'] - def do_import(self): + def do_import(self, bible_name=None): """ Imports an openlp.org v1 bible. """ @@ -58,10 +58,9 @@ class OpenLP1Bible(BibleDB): except: return False #Create the bible language - language_id = self.get_language() + language_id = self.get_language(bible_name) if not language_id: - log.exception(u'Importing books from "%s " '\ - 'failed' % self.filename) + log.exception(u'Importing books from "%s" failed' % self.filename) return False # Create all books. cursor.execute(u'SELECT id, testament_id, name, abbreviation FROM book') diff --git a/openlp/plugins/bibles/lib/opensong.py b/openlp/plugins/bibles/lib/opensong.py index f848cd69b..005139784 100644 --- a/openlp/plugins/bibles/lib/opensong.py +++ b/openlp/plugins/bibles/lib/opensong.py @@ -46,7 +46,7 @@ class OpenSongBible(BibleDB): BibleDB.__init__(self, parent, **kwargs) self.filename = kwargs['filename'] - def do_import(self): + def do_import(self, bible_name=None): """ Loads a Bible from file. """ @@ -62,7 +62,7 @@ class OpenSongBible(BibleDB): file = open(self.filename, u'r') opensong = objectify.parse(file) bible = opensong.getroot() - language_id = self.get_language() + language_id = self.get_language(bible_name) if not language_id: log.exception(u'Importing books from "%s" '\ 'failed' % self.filename) diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 682fed11a..effb62104 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -86,7 +86,7 @@ class OSISBible(BibleDB): if fbibles: fbibles.close() - def do_import(self): + def do_import(self, bible_name=None): """ Loads a Bible from file. """ @@ -109,10 +109,9 @@ class OSISBible(BibleDB): if detect_file: detect_file.close() # Set meta language_id - language_id = self.get_language() + language_id = self.get_language(bible_name) if not language_id: - log.exception(u'Importing books from "%s" '\ - 'failed' % self.filename) + log.exception(u'Importing books from "%s" failed' % self.filename) return False try: osis = codecs.open(self.filename, u'r', details['encoding']) From b5c392112b9dd4a4736a5fa8a18b928537708418 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 26 May 2011 22:15:38 +0200 Subject: [PATCH 072/124] test close database --- openlp/plugins/bibles/forms/bibleupgradeform.py | 1 - openlp/plugins/bibles/lib/db.py | 6 ++++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index fef8c04df..7b7c259ac 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -324,7 +324,6 @@ class BibleUpgradeForm(OpenLPWizard): oldbible = OldBibleDB(self.mediaItem, path=self.path, file=filename) oldname = oldbible.get_name() - oldbible.close_cursor() if not version_name: critical_error_message_box(UiStrings().EmptyField, translate('BiblesPlugin.UpgradeWizardForm', diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index ab4cf3ba4..c557d8047 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -499,6 +499,12 @@ class BibleDB(QtCore.QObject, Manager): return True return False + def close_database(self): + """ + Close database connection. + """ + self.session.close() + def dump_bible(self): """ Utility debugging method to dump the contents of a bible. From 39537f9ef711125d1b8ae6f5ed0d7c0d21612f0d Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 26 May 2011 22:17:52 +0200 Subject: [PATCH 073/124] fixed bug 788770 Fixes: https://launchpad.net/bugs/788770 --- openlp/plugins/bibles/lib/mediaitem.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index b245f7241..41059f942 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -775,6 +775,7 @@ class BibleMediaItem(MediaManagerItem): # We have to be 'Continuous'. else: bible_text = u'%s %s %s\n' % (bible_text, verse_text, text) + bible_text = bible_text.strip(u' ') if not old_item: start_item = bitem elif self.checkTitle(bitem, old_item): From f29830b98ea8d37ae76a67c88757879a16165c53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Thu, 26 May 2011 22:38:07 +0200 Subject: [PATCH 074/124] change BookNameDialog like Raoul want. --- .../plugins/bibles/forms/bibleupgradeform.py | 2 +- openlp/plugins/bibles/forms/booknamedialog.py | 154 +++++++++--------- openlp/plugins/bibles/forms/booknameform.py | 30 ++-- openlp/plugins/bibles/lib/db.py | 3 +- 4 files changed, 93 insertions(+), 96 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 7b7c259ac..875396de6 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -623,7 +623,7 @@ class BibleUpgradeForm(OpenLPWizard): (number + 1, self.maxBibles, name), self.progressBar.maximum() - self.progressBar.value()) delete_database(self.path, - clean_filename(self.newbibles[number].get_name())) + clean_filename(name)) number += 1 self.mediaItem.reloadBibles() successful_import = 0 diff --git a/openlp/plugins/bibles/forms/booknamedialog.py b/openlp/plugins/bibles/forms/booknamedialog.py index 632007013..d2901ce23 100644 --- a/openlp/plugins/bibles/forms/booknamedialog.py +++ b/openlp/plugins/bibles/forms/booknamedialog.py @@ -27,92 +27,88 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate -from openlp.core.lib.ui import create_accept_reject_button_box class Ui_BookNameDialog(object): def setupUi(self, bookNameDialog): - bookNameDialog.setObjectName(u'BookNameDialog') - bookNameDialog.resize(400, 275) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, - QtGui.QSizePolicy.MinimumExpanding) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(bookNameDialog.sizePolicy() - .hasHeightForWidth()) - bookNameDialog.setSizePolicy(sizePolicy) - self.widget = QtGui.QWidget(bookNameDialog) - self.widget.setGeometry(QtCore.QRect(10, 15, 381, 251)) - self.widget.setObjectName(u'widget') - self.verticalLayout = QtGui.QVBoxLayout(self.widget) - self.verticalLayout.setObjectName(u'verticalLayout') - self.headlineLabel = QtGui.QLabel(self.widget) - font = QtGui.QFont() - font.setFamily(u'Arial') - font.setPointSize(11) - font.setWeight(75) - font.setBold(True) - self.headlineLabel.setFont(font) - self.headlineLabel.setObjectName(u'HeadlineLabel') - self.verticalLayout.addWidget(self.headlineLabel) - self.infoLabel = QtGui.QLabel(self.widget) - self.infoLabel.setObjectName(u'InfoLabel') - self.verticalLayout.addWidget(self.infoLabel) - self.formLayout = QtGui.QFormLayout() - self.formLayout.setObjectName(u'formLayout') - self.requestLabel = QtGui.QLabel(self.widget) - self.requestLabel.setObjectName(u'RequestLabel') - self.formLayout.setWidget(0, QtGui.QFormLayout.LabelRole, - self.requestLabel) - self.requestComboBox = QtGui.QComboBox(self.widget) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.requestComboBox.sizePolicy() - .hasHeightForWidth()) - self.requestComboBox.setSizePolicy(sizePolicy) - self.requestComboBox.setObjectName(u'RequestComboBox') - self.formLayout.setWidget(0, QtGui.QFormLayout.FieldRole, - self.requestComboBox) - self.verticalLayout.addLayout(self.formLayout) - self.infoLabelTestaments = QtGui.QLabel(self.widget) - self.infoLabelTestaments.setObjectName(u'InfoLabelTestaments') - self.verticalLayout.addWidget(self.infoLabelTestaments) - self.checkBoxOldTestament = QtGui.QCheckBox(self.widget) - self.checkBoxOldTestament.setObjectName(u'OldTestament') - self.checkBoxOldTestament.setCheckState(QtCore.Qt.Checked) - self.verticalLayout.addWidget(self.checkBoxOldTestament) - self.checkBoxNewTestament = QtGui.QCheckBox(self.widget) - self.checkBoxNewTestament.setObjectName(u'OldTestament') - self.checkBoxNewTestament.setCheckState(QtCore.Qt.Checked) - self.verticalLayout.addWidget(self.checkBoxNewTestament) - self.checkBoxApocrypha = QtGui.QCheckBox(self.widget) - self.checkBoxApocrypha.setObjectName(u'OldTestament') - self.checkBoxApocrypha.setCheckState(QtCore.Qt.Checked) - self.verticalLayout.addWidget(self.checkBoxApocrypha) - self.verticalLayout.addWidget( - create_accept_reject_button_box(bookNameDialog)) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Expanding) - self.verticalLayout.addItem(spacerItem) + bookNameDialog.setObjectName(u'bookNameDialog') + bookNameDialog.resize(400, 271) + self.bookNameLayout = QtGui.QVBoxLayout(bookNameDialog) + self.bookNameLayout.setSpacing(8) + self.bookNameLayout.setMargin(8) + self.bookNameLayout.setObjectName(u'bookNameLayout') + self.infoLabel = QtGui.QLabel(bookNameDialog) + self.infoLabel.setWordWrap(True) + self.infoLabel.setObjectName(u'infoLabel') + self.bookNameLayout.addWidget(self.infoLabel) + self.correspondingLayout = QtGui.QGridLayout() + self.correspondingLayout.setSpacing(8) + self.correspondingLayout.setObjectName(u'correspondingLayout') + self.currentLabel = QtGui.QLabel(bookNameDialog) + self.currentLabel.setObjectName(u'currentLabel') + self.correspondingLayout.addWidget(self.currentLabel, 0, 0, 1, 1) + self.currentLineEdit = QtGui.QLineEdit(bookNameDialog) + self.currentLineEdit.setReadOnly(True) + self.currentLineEdit.setObjectName(u'currentLineEdit') + self.correspondingLayout.addWidget(self.currentLineEdit, 0, 1, 1, 1) + self.correspondingLabel = QtGui.QLabel(bookNameDialog) + self.correspondingLabel.setObjectName(u'correspondingLabel') + self.correspondingLayout.addWidget( + self.correspondingLabel, 1, 0, 1, 1) + self.correspondingComboBox = QtGui.QComboBox(bookNameDialog) + self.correspondingComboBox.setObjectName(u'correspondingComboBox') + self.correspondingLayout.addWidget( + self.correspondingComboBox, 1, 1, 1, 1) + self.bookNameLayout.addLayout(self.correspondingLayout) + self.optionsGroupBox = QtGui.QGroupBox(bookNameDialog) + self.optionsGroupBox.setObjectName(u'optionsGroupBox') + self.optionsLayout = QtGui.QVBoxLayout(self.optionsGroupBox) + self.optionsLayout.setSpacing(8) + self.optionsLayout.setMargin(8) + self.optionsLayout.setObjectName(u'optionsLayout') + self.oldTestamentCheckBox = QtGui.QCheckBox(self.optionsGroupBox) + self.oldTestamentCheckBox.setObjectName(u'oldTestamentCheckBox') + self.oldTestamentCheckBox.setCheckState(QtCore.Qt.Checked) + self.optionsLayout.addWidget(self.oldTestamentCheckBox) + self.newTestamentCheckBox = QtGui.QCheckBox(self.optionsGroupBox) + self.newTestamentCheckBox.setObjectName(u'newTestamentCheckBox') + self.newTestamentCheckBox.setCheckState(QtCore.Qt.Checked) + self.optionsLayout.addWidget(self.newTestamentCheckBox) + self.apocryphaCheckBox = QtGui.QCheckBox(self.optionsGroupBox) + self.apocryphaCheckBox.setObjectName(u'apocryphaCheckBox') + self.apocryphaCheckBox.setCheckState(QtCore.Qt.Checked) + self.optionsLayout.addWidget(self.apocryphaCheckBox) + self.bookNameLayout.addWidget(self.optionsGroupBox) + self.buttonBox = QtGui.QDialogButtonBox(bookNameDialog) + self.buttonBox.setOrientation(QtCore.Qt.Horizontal) + self.buttonBox.setStandardButtons( + QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) + self.buttonBox.setObjectName(u'buttonBox') + self.bookNameLayout.addWidget(self.buttonBox) + self.retranslateUi(bookNameDialog) - QtCore.QMetaObject.connectSlotsByName(self) + QtCore.QObject.connect( + self.buttonBox, QtCore.SIGNAL(u'accepted()'), + bookNameDialog.accept) + QtCore.QObject.connect( + self.buttonBox, QtCore.SIGNAL(u'rejected()'), + bookNameDialog.reject) + QtCore.QMetaObject.connectSlotsByName(bookNameDialog) def retranslateUi(self, bookNameDialog): - bookNameDialog.setWindowTitle( - translate('BiblesPlugin.BookNameDialog', 'Select Book')) - self.headlineLabel.setText( - translate('BiblesPlugin.BookNameDialog', 'Select Book:')) + bookNameDialog.setWindowTitle(translate('BiblesPlugin.BookNameDialog', + 'Select Book Name')) self.infoLabel.setText(translate('BiblesPlugin.BookNameDialog', - 'The following books cannot be clearly attributed. \n' - 'Please select which book it is.')) - self.requestLabel.setText(translate('BiblesPlugin.BookNameDialog', - 'Book:')) - self.infoLabelTestaments.setText(translate( - 'BiblesPlugin.BookNameDialog', 'Show books from:')) - self.checkBoxOldTestament.setText(translate( + 'The following book name cannot be matched up internally. Please ' + 'select the corresponding English name from the list.')) + self.currentLabel.setText(translate('BiblesPlugin.BookNameDialog', + 'Current name:')) + self.correspondingLabel.setText(translate( + 'BiblesPlugin.BookNameDialog', 'Corresponding name:')) + self.optionsGroupBox.setTitle(translate('BiblesPlugin.BookNameDialog', + 'Show Books From')) + self.oldTestamentCheckBox.setText(translate( 'BiblesPlugin.BookNameDialog', 'Old Testament')) - self.checkBoxNewTestament.setText(translate( + self.newTestamentCheckBox.setText(translate( 'BiblesPlugin.BookNameDialog', 'New Testament')) - self.checkBoxApocrypha.setText(translate('BiblesPlugin.BookNameDialog', + self.apocryphaCheckBox.setText(translate('BiblesPlugin.BookNameDialog', 'Apocrypha')) diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index fdb383a8c..df4943656 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -59,13 +59,13 @@ class BookNameForm(QDialog, Ui_BookNameDialog): """ Set up the signals used in the booknameform. """ - QtCore.QObject.connect(self.checkBoxOldTestament, + QtCore.QObject.connect(self.oldTestamentCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onCheckBoxIndexChanged) - QtCore.QObject.connect(self.checkBoxNewTestament, + QtCore.QObject.connect(self.newTestamentCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onCheckBoxIndexChanged) - QtCore.QObject.connect(self.checkBoxApocrypha, + QtCore.QObject.connect(self.apocryphaCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onCheckBoxIndexChanged) @@ -79,8 +79,8 @@ class BookNameForm(QDialog, Ui_BookNameDialog): ''' Reload the Combobox items ''' - self.requestComboBox.clear() - self.requestComboBox.addItem(u'') + self.correspondingComboBox.clear() + self.correspondingComboBox.addItem(u'') items = BiblesResourcesDB.get_books() for item in items: addBook = True @@ -88,36 +88,36 @@ class BookNameForm(QDialog, Ui_BookNameDialog): if book.book_reference_id == item[u'id']: addBook = False break - if self.checkBoxOldTestament.checkState() == QtCore.Qt.Unchecked \ + if self.oldTestamentCheckBox.checkState() == QtCore.Qt.Unchecked \ and item[u'testament_id'] == 1: addBook = False - elif self.checkBoxNewTestament.checkState() == QtCore.Qt.Unchecked \ + elif self.newTestamentCheckBox.checkState() == QtCore.Qt.Unchecked \ and item[u'testament_id'] == 2: addBook = False - elif self.checkBoxApocrypha.checkState() == QtCore.Qt.Unchecked \ + elif self.apocryphaCheckBox.checkState() == QtCore.Qt.Unchecked \ and item[u'testament_id'] == 3: addBook = False if addBook: - self.requestComboBox.addItem(item[u'name']) + self.correspondingComboBox.addItem(item[u'name']) def exec_(self, name, books, maxbooks): self.books = books log.debug(maxbooks) if maxbooks <= 27: - self.checkBoxOldTestament.setCheckState(QtCore.Qt.Unchecked) - self.checkBoxApocrypha.setCheckState(QtCore.Qt.Unchecked) + self.oldTestamentCheckBox.setCheckState(QtCore.Qt.Unchecked) + self.apocryphaCheckBox.setCheckState(QtCore.Qt.Unchecked) elif maxbooks <= 66: - self.checkBoxApocrypha.setCheckState(QtCore.Qt.Unchecked) + self.apocryphaCheckBox.setCheckState(QtCore.Qt.Unchecked) self.reloadComboBox() - self.requestLabel.setText(name) + self.currentLineEdit.setText(name) return QDialog.exec_(self) def accept(self): - if self.requestComboBox.currentText() == u'': + if self.correspondingComboBox.currentText() == u'': critical_error_message_box( message=translate('BiblesPlugin.BookNameForm', 'You need to select a book.')) - self.requestComboBox.setFocus() + self.correspondingComboBox.setFocus() return False else: return QDialog.accept(self) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index c557d8047..864c002f5 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -343,7 +343,8 @@ class BibleDB(QtCore.QObject, Manager): book_ref = None book_name = BookNameForm(self.wizard) if book_name.exec_(book, self.get_books(), maxbooks): - book_ref = unicode(book_name.requestComboBox.currentText()) + book_ref = unicode( + book_name.correspondingComboBox.currentText()) if not book_ref: return None else: From b890b52a8d5d88a35e33eb02de26e5e348888998 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 27 May 2011 08:29:14 +0200 Subject: [PATCH 075/124] finished the theme menu --- openlp/core/ui/servicemanager.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index ed0de1fa8..1cf76951c 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -677,19 +677,18 @@ class ServiceManager(QtGui.QWidget): .is_capable(ItemCapabilities.AllowsVariableStartTime): self.timeAction.setVisible(True) self.themeMenu.menuAction().setVisible(False) + # Set up the theme menu. if serviceItem[u'service_item'].is_text() and \ len(self.themeMenu.actions()) > 1: self.themeMenu.menuAction().setVisible(True) + # The service item does not have a theme, check the "Default". if serviceItem[u'service_item'].theme is None: - themeAction = self.themeMenu.findChild(QtGui.QAction, u'Sunrise') + themeAction = self.themeMenu.defaultAction() else: - themeAction = self.themeMenu.findChild(QtGui.QAction, u'Sunrise') + themeAction = self.themeMenu.findChild( + QtGui.QAction, serviceItem[u'service_item'].theme) if themeAction is not None: themeAction.setChecked(True) - print self.mainwindow.renderer.global_theme - for themeAction in self.themeMenu.actions(): - themeAction.setChecked( - themeAction.text() == serviceItem[u'service_item'].theme) action = self.menu.exec_(self.serviceManagerList.mapToGlobal(point)) def onServiceItemNoteForm(self): @@ -1295,6 +1294,14 @@ class ServiceManager(QtGui.QWidget): themeGroup = QtGui.QActionGroup(self.themeMenu) themeGroup.setExclusive(True) themeGroup.setObjectName(u'themeGroup') + # Create a "Default" theme, which allows the user to reset the item's + # theme to the service theme or global theme. + defaultTheme = context_menu_action(self.themeMenu, None, + UiStrings().Default, self.onThemeChangeAction) + defaultTheme.setCheckable(True) + self.themeMenu.setDefaultAction(defaultTheme) + themeGroup.addAction(defaultTheme) + context_menu_separator(self.themeMenu) for theme in theme_list: self.themeComboBox.addItem(theme) themeAction = context_menu_action(self.themeMenu, None, theme, @@ -1307,7 +1314,10 @@ class ServiceManager(QtGui.QWidget): self.regenerateServiceItems() def onThemeChangeAction(self): - theme = unicode(self.sender().text()) + theme = unicode(self.sender().objectName()) + # No object name means that the "Default" theme is supposed to be used. + if not theme: + theme = None item = self.findServiceItem()[0] self.serviceItems[item][u'service_item'].theme = theme self.regenerateServiceItems() From 8a38c0b76624427896cab097e254e534f78600b8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 27 May 2011 08:45:42 +0200 Subject: [PATCH 076/124] do not hide the menu --- openlp/core/ui/servicemanager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 1cf76951c..30bb66115 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -678,8 +678,7 @@ class ServiceManager(QtGui.QWidget): self.timeAction.setVisible(True) self.themeMenu.menuAction().setVisible(False) # Set up the theme menu. - if serviceItem[u'service_item'].is_text() and \ - len(self.themeMenu.actions()) > 1: + if serviceItem[u'service_item'].is_text(): self.themeMenu.menuAction().setVisible(True) # The service item does not have a theme, check the "Default". if serviceItem[u'service_item'].theme is None: From 18e3cb023264367520798455e53e69050bf40607 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 27 May 2011 09:02:02 +0200 Subject: [PATCH 077/124] removed not needed import --- openlp/core/ui/servicemanager.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 30bb66115..c32567075 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -37,8 +37,7 @@ from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, \ ItemCapabilities, SettingsManager, translate from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ - context_menu_action, context_menu_separator, find_and_set_in_combo_box, \ - checkable_action + context_menu_action, context_menu_separator, find_and_set_in_combo_box from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ From d3148f90f8c4a4ef4522faaca964fc8c9ff9f193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Fri, 27 May 2011 09:54:49 +0200 Subject: [PATCH 078/124] fix Traceback like Jonathan recommand --- openlp/core/lib/db.py | 3 ++- openlp/plugins/bibles/lib/db.py | 13 ------------- openlp/plugins/bibles/lib/manager.py | 1 + 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 5b03e5fa4..e51271624 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -34,6 +34,7 @@ from PyQt4 import QtCore from sqlalchemy import create_engine, MetaData from sqlalchemy.exceptions import InvalidRequestError from sqlalchemy.orm import scoped_session, sessionmaker +from sqlalchemy.pool import NullPool from openlp.core.utils import AppLocation, delete_file @@ -52,7 +53,7 @@ def init_db(url, auto_flush=True, auto_commit=False): ``auto_commit`` Sets the commit behaviour of the session """ - engine = create_engine(url) + engine = create_engine(url, poolclass=NullPool) metadata = MetaData(bind=engine) session = scoped_session(sessionmaker(autoflush=auto_flush, autocommit=auto_commit, bind=engine)) diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 0cf3b8a26..87da5fc52 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -500,12 +500,6 @@ class BibleDB(QtCore.QObject, Manager): return True return False - def close_database(self): - """ - Close database connection. - """ - self.session.close() - def dump_bible(self): """ Utility debugging method to dump the contents of a bible. @@ -1006,13 +1000,6 @@ class OldBibleDB(QtCore.QObject, Manager): self.cursor = conn.cursor() return self.cursor - def close_cursor(self): - """ - Close the cursor - """ - if self.cursor: - self.cursor.close() - def run_sql(self, query, parameters=()): """ Run an SQL query on the database, returning the results. diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 5fb235520..2699462c3 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -156,6 +156,7 @@ class BibleManager(object): # Find old database versions if bible.is_old_database(): self.old_bible_databases.append(filename) + bible.session.close() continue log.debug(u'Bible Name: "%s"', name) self.db_cache[name] = bible From e5231aba410d391f566dc6e3f065a34f8a7e4658 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Fri, 27 May 2011 11:23:46 +0200 Subject: [PATCH 079/124] change using old bible databases in bibleupgradeform --- .../plugins/bibles/forms/bibleupgradeform.py | 30 +++++++------------ openlp/plugins/bibles/lib/db.py | 4 +-- openlp/plugins/bibles/lib/manager.py | 2 +- 3 files changed, 14 insertions(+), 22 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 875396de6..1cc075324 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -131,7 +131,7 @@ class BibleUpgradeForm(OpenLPWizard): """ for number, filename in enumerate(self.files): if number in self.success and self.success[number] == True: - delete_file(os.path.join(self.path, filename)) + delete_file(os.path.join(self.path, filename[0])) def customInit(self): """ @@ -183,7 +183,7 @@ class BibleUpgradeForm(OpenLPWizard): self.formWidget = {} self.formLayoutAttention = {} for number, filename in enumerate(self.files): - bible = OldBibleDB(self.mediaItem, path=self.path, file=filename) + bible = OldBibleDB(self.mediaItem, path=self.path, file=filename[0]) self.checkBox[number] = QtGui.QCheckBox(self.scrollAreaContents) checkBoxName = u'checkBox[%d]' % number self.checkBox[number].setObjectName(checkBoxName) @@ -321,9 +321,6 @@ class BibleUpgradeForm(OpenLPWizard): if not self.checkBox[number].checkState() == QtCore.Qt.Checked: continue version_name = unicode(self.versionNameEdit[number].text()) - oldbible = OldBibleDB(self.mediaItem, path=self.path, - file=filename) - oldname = oldbible.get_name() if not version_name: critical_error_message_box(UiStrings().EmptyField, translate('BiblesPlugin.UpgradeWizardForm', @@ -341,13 +338,13 @@ class BibleUpgradeForm(OpenLPWizard): self.versionNameEdit[number].setFocus() return False elif os.path.exists(os.path.join(self.path, clean_filename( - version_name))) and version_name == oldname: - newfilename = u'old_database_%s' % filename + version_name))) and version_name == filename[1]: + newfilename = u'old_database_%s' % filename[0] if not os.path.exists(os.path.join(self.path, newfilename)): - os.rename(os.path.join(self.path, filename), + os.rename(os.path.join(self.path, filename[0]), os.path.join(self.path, newfilename)) - self.files[number] = newfilename + self.files[number] = [newfilename, filename[1]] continue else: critical_error_message_box( @@ -393,9 +390,7 @@ class BibleUpgradeForm(OpenLPWizard): self.maxBibles = len(self.files) for number, filename in enumerate(self.files): self.checkBox[number].setCheckState(QtCore.Qt.Checked) - oldbible = OldBibleDB(self.mediaItem, path=self.path, - file=filename) - oldname = oldbible.get_name() + oldname = filename[1] if self.manager.exists(oldname): self.verticalWidget[number].show() self.formWidget[number].show() @@ -444,11 +439,8 @@ class BibleUpgradeForm(OpenLPWizard): if not self.checkBox[biblenumber].checkState() == QtCore.Qt.Checked: continue self.progressBar.reset() - oldbible = OldBibleDB(self.mediaItem, path=self.path, - file=filename) - name = oldbible.get_name() - if name is None: - delete_file(os.path.join(self.path, filename)) + if filename[1] is None: + delete_file(os.path.join(self.path, filename[0])) self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nFailed')) % @@ -460,7 +452,7 @@ class BibleUpgradeForm(OpenLPWizard): 'BiblesPlugin.UpgradeWizardForm', 'Upgrading Bible %s of %s: "%s"\nUpgrading ...')) % (number + 1, self.maxBibles, name)) - if os.path.exists(os.path.join(self.path, filename)): + if os.path.exists(os.path.join(self.path, filename[0])): name = unicode(self.versionNameEdit[biblenumber].text()) self.newbibles[number] = BibleDB(self.mediaItem, path=self.path, name=name) @@ -519,7 +511,7 @@ class BibleUpgradeForm(OpenLPWizard): else: language_id = self.newbibles[number].get_language(name) if not language_id: - log.exception(u'Upgrading from "%s" failed' % filename) + log.exception(u'Upgrading from "%s" failed' % filename[0]) delete_database(self.path, clean_filename(self.newbibles[number].get_name())) del self.newbibles[number] diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 87da5fc52..776521aa6 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -996,8 +996,8 @@ class OldBibleDB(QtCore.QObject, Manager): """ if self.cursor is None: filepath = os.path.join(self.path, self.file) - conn = sqlite3.connect(filepath) - self.cursor = conn.cursor() + self.connection = sqlite3.connect(filepath) + self.cursor = self.connection.cursor() return self.cursor def run_sql(self, query, parameters=()): diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 2699462c3..40ddcaf25 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -155,7 +155,7 @@ class BibleManager(object): continue # Find old database versions if bible.is_old_database(): - self.old_bible_databases.append(filename) + self.old_bible_databases.append([filename, name]) bible.session.close() continue log.debug(u'Bible Name: "%s"', name) From 59d374517e587de38169215fc6a68e2d50847a64 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 27 May 2011 11:34:14 +0200 Subject: [PATCH 080/124] - improved 'auto select' - fixed a traceback - improved parentage - clean ups --- openlp/core/lib/mediamanageritem.py | 18 +++++--- openlp/core/ui/slidecontroller.py | 3 +- openlp/plugins/custom/customplugin.py | 3 -- openlp/plugins/custom/forms/editcustomform.py | 10 ++-- openlp/plugins/custom/lib/mediaitem.py | 46 +++++++++---------- openlp/plugins/songs/forms/editsongform.py | 2 +- openlp/plugins/songs/lib/mediaitem.py | 9 ++-- 7 files changed, 46 insertions(+), 45 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 9b76447ff..33a59be08 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -112,13 +112,10 @@ class MediaManagerItem(QtGui.QWidget): self.requiredIcons() self.setupUi() self.retranslateUi() - self.autoSelectItem = None + self.auto_select_id = -1 QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_service_load' % self.parent.name.lower()), self.serviceLoad) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'%s_set_autoselect_item' % self.parent.name.lower()), - self.setAutoSelectItem) def requiredIcons(self): """ @@ -479,9 +476,6 @@ class MediaManagerItem(QtGui.QWidget): if keepFocus: self.listView.setFocus() - def setAutoSelectItem(self, itemToSelect=None): - self.autoSelectItem = itemToSelect - def onLiveClick(self): """ Send an item live by building a service item then adding that service @@ -617,6 +611,16 @@ class MediaManagerItem(QtGui.QWidget): item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] return item_id + def save_auto_select_id(self): + """ + Sorts out, what item to select after loading a list. + """ + # The item to select has not been set. + if self.auto_select_id == -1: + item = self.listView.currentItem() + if item: + self.auto_select_id = item.data(QtCore.Qt.UserRole).toInt()[0] + def search(self, string): """ Performs a plugin specific search for items containing ``string`` diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index b1094bbe3..85598a767 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -1044,7 +1044,8 @@ class SlideController(QtGui.QWidget): """ From the preview display request the Item to be added to service """ - self.parent.serviceManagerContents.addServiceItem(self.serviceItem) + if self.serviceItem: + self.parent.serviceManagerContents.addServiceItem(self.serviceItem) def onGoLiveClick(self): """ diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 887f813fa..e790a2449 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -27,8 +27,6 @@ import logging -from forms import EditCustomForm - from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib.db import Manager from openlp.plugins.custom.lib import CustomMediaItem, CustomTab @@ -52,7 +50,6 @@ class CustomPlugin(Plugin): CustomMediaItem, CustomTab) self.weight = -5 self.manager = Manager(u'custom', init_schema) - self.edit_custom_form = EditCustomForm(self) self.icon_path = u':/plugins/plugin_custom.png' self.icon = build_icon(self.icon_path) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 0e4376634..00165e6ff 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -43,13 +43,13 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): Class documentation goes here. """ log.info(u'Custom Editor loaded') - def __init__(self, parent): + def __init__(self, parent, manager): """ Constructor """ QtGui.QDialog.__init__(self) self.parent = parent - self.manager = self.parent.manager + self.manager = manager self.setupUi(self) # Create other objects and forms. self.editSlideForm = EditCustomSlideForm(self) @@ -115,8 +115,6 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): def accept(self): log.debug(u'accept') if self.saveCustom(): - Receiver.send_message(u'custom_set_autoselect_item', - self.customSlide.id) Receiver.send_message(u'custom_load_list') QtGui.QDialog.accept(self) @@ -138,7 +136,9 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): self.customSlide.text = unicode(sxml.extract_xml(), u'utf-8') self.customSlide.credits = unicode(self.creditEdit.text()) self.customSlide.theme_name = unicode(self.themeComboBox.currentText()) - return self.manager.save_object(self.customSlide) + success = self.manager.save_object(self.customSlide) + self.parent.auto_select_id = self.customSlide.id + return success def onUpButtonClicked(self): selectedRow = self.slideListView.currentRow() diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 43f4afd63..d0a3de061 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -35,6 +35,7 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ check_item_selected, translate from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.ui import UiStrings +from openlp.plugins.custom.forms import EditCustomForm from openlp.plugins.custom.lib import CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide @@ -57,6 +58,7 @@ class CustomMediaItem(MediaManagerItem): def __init__(self, parent, plugin, icon): self.IconPath = u'custom/custom' MediaManagerItem.__init__(self, parent, self, icon) + self.edit_custom_form = EditCustomForm(self, self.parent.manager) self.singleServiceItem = False self.quickPreviewAllowed = True self.hasSearch = True @@ -136,6 +138,8 @@ class CustomMediaItem(MediaManagerItem): self.onRemoteEditClear() def loadList(self, custom_slides): + # Sort out what custom we want to select after loading the list. + self.save_auto_select_id() self.listView.clear() # Sort the customs by its title considering language specific # characters. lower() is needed for windows! @@ -146,33 +150,34 @@ class CustomMediaItem(MediaManagerItem): custom_name.setData( QtCore.Qt.UserRole, QtCore.QVariant(custom_slide.id)) self.listView.addItem(custom_name) - # Auto-select the item if name has been set - if custom_slide.id == self.autoSelectItem: + # Auto-select the custom. + if custom_slide.id == self.auto_select_id: self.listView.setCurrentItem(custom_name) + self.auto_select_id = -1 def onNewClick(self): - self.parent.edit_custom_form.loadCustom(0) - self.parent.edit_custom_form.exec_() + self.edit_custom_form.loadCustom(0) + self.edit_custom_form.exec_() self.initialise() def onRemoteEditClear(self): self.remoteTriggered = None self.remoteCustom = -1 - def onRemoteEdit(self, customid): + def onRemoteEdit(self, message): """ Called by ServiceManager or SlideController by event passing - the Song Id in the payload along with an indicator to say which + the custom Id in the payload along with an indicator to say which type of display is required. """ - fields = customid.split(u':') - valid = self.manager.get_object(CustomSlide, fields[1]) + remote_type, custom_id = message.split(u':') + custom_id = int(custom_id) + valid = self.manager.get_object(CustomSlide, custom_id) if valid: - self.remoteCustom = fields[1] - self.remoteTriggered = fields[0] - self.parent.edit_custom_form.loadCustom(fields[1], - (fields[0] == u'P')) - self.parent.edit_custom_form.exec_() + self.remoteCustom = custom_id + self.remoteTriggered = remote_type + self.edit_custom_form.loadCustom(custom_id, (remote_type == u'P')) + self.edit_custom_form.exec_() def onEditClick(self): """ @@ -181,8 +186,8 @@ class CustomMediaItem(MediaManagerItem): if check_item_selected(self.listView, UiStrings().SelectEdit): item = self.listView.currentItem() item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.parent.edit_custom_form.loadCustom(item_id, False) - self.parent.edit_custom_form.exec_() + self.edit_custom_form.loadCustom(item_id, False) + self.edit_custom_form.exec_() self.initialise() def onDeleteClick(self): @@ -203,7 +208,6 @@ class CustomMediaItem(MediaManagerItem): self.searchTextEdit.setFocus() def generateSlideData(self, service_item, item=None, xmlVersion=False): - raw_slides = [] raw_footer = [] slide = None theme = None @@ -221,8 +225,7 @@ class CustomMediaItem(MediaManagerItem): service_item.theme = theme customXML = CustomXMLParser(customSlide.text) verseList = customXML.get_verses() - for verse in verseList: - raw_slides.append(verse[1]) + raw_slides = [verse[1] for verse in verseList] service_item.title = title for slide in raw_slides: service_item.add_from_text(slide[:30], slide) @@ -260,7 +263,7 @@ class CustomMediaItem(MediaManagerItem): def onSearchTextEditChanged(self, text): """ If search as type enabled invoke the search on each key press. - If the Title is being searched do not start till 2 characters + If the Title is being searched do not start until 2 characters have been entered. """ search_length = 2 @@ -283,8 +286,5 @@ class CustomMediaItem(MediaManagerItem): func.lower(CustomSlide.text).like(u'%' + string.lower() + u'%')), order_by_ref=CustomSlide.title) - results = [] - for custom in search_results: - results.append([custom.id, custom.title]) - return results + return [[custom.id, custom.title] for custom in search_results] diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 393009f82..45f1a123a 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -696,7 +696,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.clearCaches() if self._validate_song(): self.saveSong() - Receiver.send_message(u'songs_set_autoselect_item',self.song.id) Receiver.send_message(u'songs_load_list') self.song = None QtGui.QDialog.accept(self) @@ -756,6 +755,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.song.topics.append(self.manager.get_object(Topic, topicId)) clean_song(self.manager, self.song) self.manager.save_object(self.song) + self.parent.auto_select_id = self.song.id def _processLyrics(self): """ diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 7fe4d45c4..3d9a9ef76 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -232,6 +232,7 @@ class SongMediaItem(MediaManagerItem): def displayResultsSong(self, searchresults): log.debug(u'display results Song') + self.save_auto_select_id() self.listView.clear() # Sort the songs by its title considering language specific characters. # lower() is needed for windows! @@ -245,8 +246,9 @@ class SongMediaItem(MediaManagerItem): song_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(song.id)) self.listView.addItem(song_name) # Auto-select the item if name has been set - if song.id == self.autoSelectItem : + if song.id == self.auto_select_id: self.listView.setCurrentItem(song_name) + self.auto_select_id = -1 def displayResultsAuthor(self, searchresults): log.debug(u'display results Author') @@ -487,7 +489,4 @@ class SongMediaItem(MediaManagerItem): Search for some songs """ search_results = self.searchEntire(string) - results = [] - for song in search_results: - results.append([song.id, song.title]) - return results + return [[song.id, song.title] for song in search_results] From 8eb261ee88a8e4f09506fd50e84b8e50927e32ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Fri, 27 May 2011 11:39:58 +0200 Subject: [PATCH 081/124] bug fixes setFocus to the Combobox in booknameform --- openlp/plugins/bibles/forms/bibleupgradeform.py | 8 +++++++- openlp/plugins/bibles/forms/booknameform.py | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 1cc075324..8ac99d99f 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -439,7 +439,10 @@ class BibleUpgradeForm(OpenLPWizard): if not self.checkBox[biblenumber].checkState() == QtCore.Qt.Checked: continue self.progressBar.reset() - if filename[1] is None: + oldbible = OldBibleDB(self.mediaItem, path=self.path, + file=filename[0]) + name = filename[1] + if name is None: delete_file(os.path.join(self.path, filename[0])) self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', @@ -596,6 +599,9 @@ class BibleUpgradeForm(OpenLPWizard): self.newbibles[number].delete_book(db_book) continue for verse in verses: + if self.stop_import_flag: + bible_failed = True + break self.newbibles[number].create_verse(db_book.id, int(verse[u'chapter']), int(verse[u'verse']), unicode(verse[u'text'])) diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index df4943656..e2d7004ec 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -110,6 +110,7 @@ class BookNameForm(QDialog, Ui_BookNameDialog): self.apocryphaCheckBox.setCheckState(QtCore.Qt.Unchecked) self.reloadComboBox() self.currentLineEdit.setText(name) + self.correspondingComboBox.setFocus() return QDialog.exec_(self) def accept(self): From c63382e41c993a18e6d0b4a3770e38a6b25c3923 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 27 May 2011 12:17:59 +0200 Subject: [PATCH 082/124] - hide the theme menu when theme level is not 'Song' - clean ups --- openlp/core/ui/servicemanager.py | 3 ++- openlp/core/ui/thememanager.py | 2 -- openlp/core/ui/themestab.py | 9 +++------ 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index c32567075..349b0a4a3 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -677,7 +677,8 @@ class ServiceManager(QtGui.QWidget): self.timeAction.setVisible(True) self.themeMenu.menuAction().setVisible(False) # Set up the theme menu. - if serviceItem[u'service_item'].is_text(): + if serviceItem[u'service_item'].is_text() and \ + self.mainwindow.renderer.theme_level == ThemeLevel.Song: self.themeMenu.menuAction().setVisible(True) # The service item does not have a theme, check the "Default". if serviceItem[u'service_item'].theme is None: diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 4dabcfdf7..72bdf4558 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -57,8 +57,6 @@ class ThemeManager(QtGui.QWidget): self.settingsSection = u'themes' self.themeForm = ThemeForm(self) self.fileRenameForm = FileRenameForm(self) - self.serviceComboBox = \ - self.mainwindow.serviceManagerContents.themeComboBox # start with the layout self.layout = QtGui.QVBoxLayout(self) self.layout.setSpacing(0) diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 709b3ad80..7e8188f42 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -145,10 +145,8 @@ class ThemesTab(SettingsTab): def save(self): settings = QtCore.QSettings() settings.beginGroup(self.settingsSection) - settings.setValue(u'theme level', - QtCore.QVariant(self.theme_level)) - settings.setValue(u'global theme', - QtCore.QVariant(self.global_theme)) + settings.setValue(u'theme level', QtCore.QVariant(self.theme_level)) + settings.setValue(u'global theme', QtCore.QVariant(self.global_theme)) settings.endGroup() self.mainwindow.renderer.set_global_theme( self.global_theme, self.theme_level) @@ -186,8 +184,7 @@ class ThemesTab(SettingsTab): self.settingsSection + u'/global theme', QtCore.QVariant(u'')).toString()) self.DefaultComboBox.clear() - for theme in theme_list: - self.DefaultComboBox.addItem(theme) + self.DefaultComboBox.addItems(theme_list) find_and_set_in_combo_box(self.DefaultComboBox, self.global_theme) self.mainwindow.renderer.set_global_theme( self.global_theme, self.theme_level) From f1b778fb240ab12582e435a98fbb68df32cdc028 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Fri, 27 May 2011 12:54:52 +0100 Subject: [PATCH 083/124] Change loop and timed slide settings labels --- openlp/core/ui/generaltab.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 2435b8dcc..2a9bd221e 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -223,9 +223,9 @@ class GeneralTab(SettingsTab): self.autoPreviewCheckBox.setText(translate('OpenLP.GeneralTab', 'Automatically preview next item in service')) self.enableLoopCheckBox.setText(translate('OpenLP.GeneralTab', - 'Enable slide loop')) + 'Enable slide wrap-around')) self.timeoutLabel.setText(translate('OpenLP.GeneralTab', - 'Slide loop delay:')) + 'Timed slide interval:')) self.timeoutSpinBox.setSuffix(translate('OpenLP.GeneralTab', ' sec')) self.ccliGroupBox.setTitle( translate('OpenLP.GeneralTab', 'CCLI Details')) From 42a8a4407e84b032b2e87673ca7d7f8e32e1bb73 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 27 May 2011 16:28:38 +0200 Subject: [PATCH 084/124] fixed bug 789143 Fixes: https://launchpad.net/bugs/789143 --- openlp/plugins/songs/lib/__init__.py | 46 ++-------------------------- 1 file changed, 2 insertions(+), 44 deletions(-) diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index 9e068e7f1..e3779f2c0 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -171,7 +171,8 @@ class VerseType(object): @staticmethod def from_loose_input(verse_name): """ - Return the VerseType for a given string, Other if not found + Return the VerseType for a given string, Other if not found. Use this + with caution! ``verse_name`` The string to return a VerseType for @@ -265,52 +266,9 @@ def clean_song(manager, song): whitespace = re.compile(r'\W+', re.UNICODE) song.search_title = (whitespace.sub(u' ', song.title).strip() + u'@' + whitespace.sub(u' ', song.alternate_title).strip()).strip().lower() - # Remove the old "language" attribute from lyrics tag (prior to 1.9.5). This - # is not very important, but this keeps the database clean. This can be - # removed when everybody has cleaned his songs. - song.lyrics = song.lyrics.replace(u'', u'') verses = SongXML().get_verses(song.lyrics) lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses]) song.search_lyrics = lyrics.lower() - # We need a new and clean SongXML instance. - sxml = SongXML() - # Rebuild the song's verses, to remove any wrong verse names (for example - # translated ones), which might have been added prior to 1.9.5. - # List for later comparison. - compare_order = [] - for verse in verses: - verse_type = VerseType.Tags[VerseType.from_loose_input( - verse[0][u'type'])] - sxml.add_verse_to_lyrics( - verse_type, - verse[0][u'label'], - verse[1], - verse[0][u'lang'] if verse[0].has_key(u'lang') else None - ) - compare_order.append((u'%s%s' % (verse_type, verse[0][u'label']) - ).upper()) - if verse[0][u'label'] == u'1': - compare_order.append(verse_type.upper()) - song.lyrics = unicode(sxml.extract_xml(), u'utf-8') - # Rebuild the verse order, to convert translated verse tags, which might - # have been added prior to 1.9.5. - if song.verse_order: - order = song.verse_order.strip().split() - else: - order = [] - new_order = [] - for verse_def in order: - verse_type = VerseType.Tags[VerseType.from_loose_input(verse_def[0])] - if len(verse_def) > 1: - new_order.append((u'%s%s' % (verse_type, verse_def[1:])).upper()) - else: - new_order.append(verse_type.upper()) - song.verse_order = u' '.join(new_order) - # Check if the verse order contains tags for verses which do not exist. - for order in new_order: - if order not in compare_order: - song.verse_order = u'' - break # The song does not have any author, add one. if not song.authors: name = SongStrings.AuthorUnknown From cd4942657daa642b152d4fe78b8eab0b07a8768f Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Fri, 27 May 2011 18:42:54 +0100 Subject: [PATCH 085/124] Change timed slide tooltip to remove reference to looping, and fix periods on others --- openlp/core/ui/slidecontroller.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index b1094bbe3..7c6976906 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -140,14 +140,14 @@ class SlideController(QtGui.QWidget): self.previousItem = self.toolbar.addToolbarButton( translate('OpenLP.SlideController', 'Previous Slide'), u':/slides/slide_previous.png', - translate('OpenLP.SlideController', 'Move to previous'), + translate('OpenLP.SlideController', 'Move to previous.'), self.onSlideSelectedPrevious, shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp], context=QtCore.Qt.WidgetWithChildrenShortcut) self.nextItem = self.toolbar.addToolbarButton( translate('OpenLP.SlideController', 'Next Slide'), u':/slides/slide_next.png', - translate('OpenLP.SlideController', 'Move to next'), + translate('OpenLP.SlideController', 'Move to next.'), self.onSlideSelectedNext, shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown], context=QtCore.Qt.WidgetWithChildrenShortcut) @@ -183,7 +183,7 @@ class SlideController(QtGui.QWidget): startLoop = self.toolbar.addToolbarButton( # Does not need translating - control string. u'Start Loop', u':/media/media_time.png', - translate('OpenLP.SlideController', 'Start continuous loop'), + translate('OpenLP.SlideController', 'Enable timed slides.'), self.onStartLoop) startLoop.setObjectName(u'startLoop') action_list = ActionList.get_instance() @@ -191,7 +191,7 @@ class SlideController(QtGui.QWidget): stopLoop = self.toolbar.addToolbarButton( # Does not need translating - control string. u'Stop Loop', u':/media/media_stop.png', - translate('OpenLP.SlideController', 'Stop continuous loop'), + translate('OpenLP.SlideController', 'Stop timed slides.'), self.onStopLoop) stopLoop.setObjectName(u'stopLoop') action_list.add_action(stopLoop, UiStrings().LiveToolbar) @@ -206,39 +206,39 @@ class SlideController(QtGui.QWidget): self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox) self.delaySpinBox.setSuffix(UiStrings().Seconds) self.delaySpinBox.setToolTip(translate('OpenLP.SlideController', - 'Delay between slides in seconds')) + 'Delay between slides in seconds.')) else: self.toolbar.addToolbarButton( # Does not need translating - control string. u'Go Live', u':/general/general_live.png', - translate('OpenLP.SlideController', 'Move to live'), + translate('OpenLP.SlideController', 'Move to live.'), self.onGoLive) self.toolbar.addToolbarButton( # Does not need translating - control string. u'Add to Service', u':/general/general_add.png', - translate('OpenLP.SlideController', 'Add to Service'), + translate('OpenLP.SlideController', 'Add to Service.'), self.onPreviewAddToService) self.toolbar.addToolbarSeparator(u'Close Separator') self.toolbar.addToolbarButton( # Does not need translating - control string. u'Edit Song', u':/general/general_edit.png', translate('OpenLP.SlideController', - 'Edit and reload song preview'), + 'Edit and reload song preview.'), self.onEditSong) self.controllerLayout.addWidget(self.toolbar) # Build a Media ToolBar self.mediabar = OpenLPToolbar(self) self.mediabar.addToolbarButton( u'Media Start', u':/slides/media_playback_start.png', - translate('OpenLP.SlideController', 'Start playing media'), + translate('OpenLP.SlideController', 'Start playing media.'), self.onMediaPlay) self.mediabar.addToolbarButton( u'Media Pause', u':/slides/media_playback_pause.png', - translate('OpenLP.SlideController', 'Start playing media'), + translate('OpenLP.SlideController', 'Start playing media.'), self.onMediaPause) self.mediabar.addToolbarButton( u'Media Stop', u':/slides/media_playback_stop.png', - translate('OpenLP.SlideController', 'Start playing media'), + translate('OpenLP.SlideController', 'Start playing media.'), self.onMediaStop) if self.isLive: # Build the Song Toolbar From 665fc82c9480a6f32026eb64885ba0363bab742d Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Fri, 27 May 2011 21:25:03 +0200 Subject: [PATCH 086/124] Fix for bug #789285: OpenLP does not work with SQLAlchemy 0.7. --- openlp/core/lib/db.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index 5b03e5fa4..351d79e3e 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -32,7 +32,7 @@ import os from PyQt4 import QtCore from sqlalchemy import create_engine, MetaData -from sqlalchemy.exceptions import InvalidRequestError +from sqlalchemy.exc import InvalidRequestError from sqlalchemy.orm import scoped_session, sessionmaker from openlp.core.utils import AppLocation, delete_file From 010373b798c76f5dd71bda030f804b22a7312e23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Fri, 27 May 2011 22:33:23 +0200 Subject: [PATCH 087/124] Fixed Traceback if BookNameDialog was canceled while upgrading non webbibles Replace LineEdit in BookNameDialog with Label --- openlp/plugins/bibles/forms/bibleupgradeform.py | 2 +- openlp/plugins/bibles/forms/booknamedialog.py | 8 ++++---- openlp/plugins/bibles/forms/booknameform.py | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 8ac99d99f..bd9a3172d 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -606,7 +606,7 @@ class BibleUpgradeForm(OpenLPWizard): int(verse[u'chapter']), int(verse[u'verse']), unicode(verse[u'text'])) Receiver.send_message(u'openlp_process_events') - self.newbibles[number].session.commit() + self.newbibles[number].session.commit() if not bible_failed: self.incrementProgressBar(unicode(translate( 'BiblesPlugin.UpgradeWizardForm', diff --git a/openlp/plugins/bibles/forms/booknamedialog.py b/openlp/plugins/bibles/forms/booknamedialog.py index d2901ce23..e9211b3d5 100644 --- a/openlp/plugins/bibles/forms/booknamedialog.py +++ b/openlp/plugins/bibles/forms/booknamedialog.py @@ -41,15 +41,15 @@ class Ui_BookNameDialog(object): self.infoLabel.setObjectName(u'infoLabel') self.bookNameLayout.addWidget(self.infoLabel) self.correspondingLayout = QtGui.QGridLayout() + self.correspondingLayout.setColumnStretch(1, 1) self.correspondingLayout.setSpacing(8) self.correspondingLayout.setObjectName(u'correspondingLayout') self.currentLabel = QtGui.QLabel(bookNameDialog) self.currentLabel.setObjectName(u'currentLabel') self.correspondingLayout.addWidget(self.currentLabel, 0, 0, 1, 1) - self.currentLineEdit = QtGui.QLineEdit(bookNameDialog) - self.currentLineEdit.setReadOnly(True) - self.currentLineEdit.setObjectName(u'currentLineEdit') - self.correspondingLayout.addWidget(self.currentLineEdit, 0, 1, 1, 1) + self.currentBookLabel = QtGui.QLabel(bookNameDialog) + self.currentBookLabel.setObjectName(u'currentBookLabel') + self.correspondingLayout.addWidget(self.currentBookLabel, 0, 1, 1, 1) self.correspondingLabel = QtGui.QLabel(bookNameDialog) self.correspondingLabel.setObjectName(u'correspondingLabel') self.correspondingLayout.addWidget( diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index e2d7004ec..8ad3ad977 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -109,7 +109,7 @@ class BookNameForm(QDialog, Ui_BookNameDialog): elif maxbooks <= 66: self.apocryphaCheckBox.setCheckState(QtCore.Qt.Unchecked) self.reloadComboBox() - self.currentLineEdit.setText(name) + self.currentBookLabel.setText(unicode(name)) self.correspondingComboBox.setFocus() return QDialog.exec_(self) From 5f9b23f8e737dbee841a511a196ecda2600d43d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Fri, 27 May 2011 22:53:46 +0200 Subject: [PATCH 088/124] remove unnecessary line --- openlp/plugins/bibles/forms/bibleupgradeform.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index bd9a3172d..a5b175aef 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -627,7 +627,6 @@ class BibleUpgradeForm(OpenLPWizard): successful_import = 0 failed_import = 0 for number, filename in enumerate(self.files): - #for number, success in self.success.iteritems(): if number in self.success and self.success[number] == True: successful_import += 1 elif self.checkBox[number].checkState() == QtCore.Qt.Checked: From e550665b23a0632e1210a391d88c5e3ef42e6189 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Fri, 27 May 2011 23:11:53 +0200 Subject: [PATCH 089/124] bug fix --- openlp/plugins/bibles/lib/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 50a64ca42..2a3858afc 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -221,7 +221,7 @@ class BibleManager(object): { u'name': book.name, u'book_reference_id': book.book_reference_id, - u'chapters': self.db_cache[bible].get_chapter_count(book.book_reference_id) + u'chapters': self.db_cache[bible].get_chapter_count(book) } for book in self.db_cache[bible].get_books() ] From 7ed1be6612956e7402a0cfe7988d8a574c9a3168 Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Sat, 28 May 2011 00:05:33 -0400 Subject: [PATCH 090/124] Fixed bug #788335 - Changed slidecontroller to correctly blank screen --- openlp/core/ui/slidecontroller.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 08e1c0366..98046ba2a 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -841,6 +841,11 @@ class SlideController(QtGui.QWidget): Receiver.send_message(u'%s_unblank' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive]) + else: + if hide_mode: + Receiver.send_message(u'maindisplay_hide', hide_mode) + else: + Receiver.send_message(u'maindisplay_show') def hidePlugin(self, hide): """ @@ -859,6 +864,11 @@ class SlideController(QtGui.QWidget): Receiver.send_message(u'%s_unblank' % self.serviceItem.name.lower(), [self.serviceItem, self.isLive]) + else: + if hide: + Receiver.send_message(u'maindisplay_hide', HideMode.Screen) + else: + Receiver.send_message(u'maindisplay_show') def onSlideSelected(self, start=False): """ From 4138d6fbd01951006a81a2cfee157eed45845998 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 28 May 2011 10:53:37 +0100 Subject: [PATCH 091/124] Change lots of parents --- openlp/core/lib/mediamanageritem.py | 21 ++++---- openlp/core/lib/plugin.py | 2 +- openlp/plugins/alerts/forms/alertform.py | 5 +- openlp/plugins/bibles/lib/mediaitem.py | 54 +++++++++---------- openlp/plugins/custom/forms/editcustomform.py | 8 +-- openlp/plugins/custom/lib/mediaitem.py | 24 ++++----- openlp/plugins/images/lib/mediaitem.py | 12 ++--- openlp/plugins/media/lib/mediaitem.py | 10 ++-- openlp/plugins/presentations/lib/mediaitem.py | 12 ++--- .../presentations/presentationplugin.py | 2 +- openlp/plugins/remotes/lib/httpserver.py | 18 +++---- openlp/plugins/songs/forms/editsongform.py | 3 +- openlp/plugins/songs/lib/mediaitem.py | 34 ++++++------ 13 files changed, 102 insertions(+), 103 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 9b76447ff..9b780fa75 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -93,8 +93,7 @@ class MediaManagerItem(QtGui.QWidget): QtGui.QWidget.__init__(self) self.parent = parent self.whitespace = re.compile(r'\W+', re.UNICODE) - #TODO: plugin should not be the parent in future - self.plugin = parent # plugin + self.plugin = plugin visible_title = self.plugin.getString(StringContent.VisibleName) self.title = unicode(visible_title[u'title']) self.settingsSection = self.plugin.name.lower() @@ -114,10 +113,10 @@ class MediaManagerItem(QtGui.QWidget): self.retranslateUi() self.autoSelectItem = None QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'%s_service_load' % self.parent.name.lower()), + QtCore.SIGNAL(u'%s_service_load' % self.plugin.name.lower()), self.serviceLoad) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'%s_set_autoselect_item' % self.parent.name.lower()), + QtCore.SIGNAL(u'%s_set_autoselect_item' % self.plugin.name.lower()), self.setAutoSelectItem) def requiredIcons(self): @@ -475,7 +474,7 @@ class MediaManagerItem(QtGui.QWidget): serviceItem = self.buildServiceItem() if serviceItem: serviceItem.from_plugin = True - self.parent.previewController.addServiceItem(serviceItem) + self.plugin.previewController.addServiceItem(serviceItem) if keepFocus: self.listView.setFocus() @@ -503,7 +502,7 @@ class MediaManagerItem(QtGui.QWidget): if serviceItem: if not item_id: serviceItem.from_plugin = True - self.parent.liveController.addServiceItem(serviceItem) + self.plugin.liveController.addServiceItem(serviceItem) def createItemFromId(self, item_id): item = QtGui.QListWidgetItem() @@ -533,7 +532,7 @@ class MediaManagerItem(QtGui.QWidget): serviceItem = self.buildServiceItem(item, True) if serviceItem: serviceItem.from_plugin = False - self.parent.serviceManager.addServiceItem(serviceItem, + self.plugin.serviceManager.addServiceItem(serviceItem, replace=replace) def onAddEditClick(self): @@ -546,14 +545,14 @@ class MediaManagerItem(QtGui.QWidget): 'You must select one or more items.')) else: log.debug(u'%s Add requested', self.plugin.name) - serviceItem = self.parent.serviceManager.getServiceItem() + serviceItem = self.plugin.serviceManager.getServiceItem() if not serviceItem: QtGui.QMessageBox.information(self, UiStrings().NISs, translate('OpenLP.MediaManagerItem', 'You must select an existing service item to add to.')) elif self.plugin.name.lower() == serviceItem.name.lower(): self.generateSlideData(serviceItem) - self.parent.serviceManager.addServiceItem(serviceItem, + self.plugin.serviceManager.addServiceItem(serviceItem, replace=True) else: # Turn off the remote edit update message indicator @@ -567,8 +566,8 @@ class MediaManagerItem(QtGui.QWidget): """ Common method for generating a service item """ - serviceItem = ServiceItem(self.parent) - serviceItem.add_icon(self.parent.icon_path) + serviceItem = ServiceItem(self.plugin) + serviceItem.add_icon(self.plugin.icon_path) if self.generateSlideData(serviceItem, item, xmlVersion): return serviceItem else: diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index 0417446c1..974c59de2 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -215,7 +215,7 @@ class Plugin(QtCore.QObject): you need, and return it for integration into openlp.org. """ if self.media_item_class: - return self.media_item_class(self, self, self.icon) + return self.media_item_class(self.mediadock, self, self.icon) return None def addImportMenuItem(self, importMenu): diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index 13cb4503a..92db42723 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -41,7 +41,8 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): Initialise the alert form """ self.manager = plugin.manager - self.parent = plugin + self.plugin = plugin + self.parent = plugin.formparent self.item_id = None QtGui.QDialog.__init__(self, plugin.formparent) self.setupUi(self) @@ -195,7 +196,7 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): self.parameterEdit.setFocus() return False text = text.replace(u'<>', unicode(self.parameterEdit.text())) - self.parent.alertsmanager.displayAlert(text) + self.plugin.alertsmanager.displayAlert(text) return True def onCurrentRowChanged(self, row): diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 41059f942..baf04995b 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -61,7 +61,7 @@ class BibleMediaItem(MediaManagerItem): self.unlockIcon = QtGui.QIcon(u':/bibles/bibles_search_unlock.png') MediaManagerItem.__init__(self, parent, plugin, icon) # Place to store the search results for both bibles. - self.settings = self.parent.settings_tab + self.settings = self.plugin.settings_tab self.quickPreviewAllowed = True self.hasSearch = True self.search_results = {} @@ -338,7 +338,7 @@ class BibleMediaItem(MediaManagerItem): def initialise(self): log.debug(u'bible manager initialise') - self.parent.manager.media = self + self.plugin.manager.media = self self.loadBibles() bible = QtCore.QSettings().value( self.settingsSection + u'/quick bible', QtCore.QVariant( @@ -365,7 +365,7 @@ class BibleMediaItem(MediaManagerItem): self.quickSecondComboBox.addItem(u'') self.advancedSecondComboBox.addItem(u'') # Get all bibles and sort the list. - bibles = self.parent.manager.get_bibles().keys() + bibles = self.plugin.manager.get_bibles().keys() bibles.sort(cmp=locale.strcoll) # Load the bibles into the combo boxes. for bible in bibles: @@ -386,7 +386,7 @@ class BibleMediaItem(MediaManagerItem): def reloadBibles(self): log.debug(u'Reloading Bibles') - self.parent.manager.reload_bibles() + self.plugin.manager.reload_bibles() self.loadBibles() def initialiseAdvancedBible(self, bible): @@ -400,7 +400,7 @@ class BibleMediaItem(MediaManagerItem): The bible to initialise (unicode). """ log.debug(u'initialiseAdvancedBible %s', bible) - book_data = self.parent.manager.get_books(bible) + book_data = self.plugin.manager.get_books(bible) self.advancedBookComboBox.clear() first = True for book in book_data: @@ -416,7 +416,7 @@ class BibleMediaItem(MediaManagerItem): def initialiseChapterVerse(self, bible, book, chapter_count): log.debug(u'initialiseChapterVerse %s, %s', bible, book) self.chapter_count = chapter_count - verse_count = self.parent.manager.get_verse_count(bible, book, 1) + verse_count = self.plugin.manager.get_verse_count(bible, book, 1) if verse_count == 0: self.advancedSearchButton.setEnabled(False) critical_error_message_box( @@ -445,7 +445,7 @@ class BibleMediaItem(MediaManagerItem): books = [] # We have to do a 'Reference Search'. if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference: - bibles = self.parent.manager.get_bibles() + bibles = self.plugin.manager.get_bibles() bible = unicode(self.quickVersionComboBox.currentText()) if bible: book_data = bibles[bible].get_books() @@ -455,8 +455,8 @@ class BibleMediaItem(MediaManagerItem): def onImportClick(self): if not hasattr(self, u'import_wizard'): - self.import_wizard = BibleImportForm(self, self.parent.manager, - self.parent) + self.import_wizard = BibleImportForm(self, self.plugin.manager, + self.plugin) # If the import was not cancelled then reload. if self.import_wizard.exec_(): self.reloadBibles() @@ -515,7 +515,7 @@ class BibleMediaItem(MediaManagerItem): bible = unicode(self.advancedVersionComboBox.currentText()) book = unicode(self.advancedBookComboBox.currentText()) verse_from = int(self.advancedFromVerse.currentText()) - verse_count = self.parent.manager.get_verse_count(bible, book, + verse_count = self.plugin.manager.get_verse_count(bible, book, chapter_to) self.adjustComboBox(verse_from, verse_count, self.advancedToVerse, True) @@ -527,7 +527,7 @@ class BibleMediaItem(MediaManagerItem): chapter_to = int(self.advancedToChapter.currentText()) verse_from = int(self.advancedFromVerse.currentText()) verse_to = int(self.advancedToVerse.currentText()) - verse_count = self.parent.manager.get_verse_count(bible, book, + verse_count = self.plugin.manager.get_verse_count(bible, book, chapter_to) if chapter_from == chapter_to and verse_from > verse_to: self.adjustComboBox(verse_from, verse_count, self.advancedToVerse) @@ -539,7 +539,7 @@ class BibleMediaItem(MediaManagerItem): book = unicode(self.advancedBookComboBox.currentText()) chapter_from = int(self.advancedFromChapter.currentText()) chapter_to = int(self.advancedToChapter.currentText()) - verse_count = self.parent.manager.get_verse_count(bible, book, + verse_count = self.plugin.manager.get_verse_count(bible, book, chapter_from) self.adjustComboBox(1, verse_count, self.advancedFromVerse) if chapter_from > chapter_to: @@ -599,9 +599,9 @@ class BibleMediaItem(MediaManagerItem): range_separator + chapter_to + verse_separator + verse_to versetext = u'%s %s' % (book, verse_range) Receiver.send_message(u'cursor_busy') - self.search_results = self.parent.manager.get_verses(bible, versetext) + self.search_results = self.plugin.manager.get_verses(bible, versetext) if second_bible: - self.second_search_results = self.parent.manager.get_verses( + self.second_search_results = self.plugin.manager.get_verses( second_bible, versetext) if not self.advancedLockButton.isChecked(): self.listView.clear() @@ -627,15 +627,15 @@ class BibleMediaItem(MediaManagerItem): text = unicode(self.quickSearchEdit.text()) if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference: # We are doing a 'Reference Search'. - self.search_results = self.parent.manager.get_verses(bible, text) + self.search_results = self.plugin.manager.get_verses(bible, text) if second_bible and self.search_results: - self.second_search_results = self.parent.manager.get_verses( + self.second_search_results = self.plugin.manager.get_verses( second_bible, text) else: # We are doing a 'Text Search'. Receiver.send_message(u'cursor_busy') - bibles = self.parent.manager.get_bibles() - self.search_results = self.parent.manager.verse_search(bible, + bibles = self.plugin.manager.get_bibles() + self.search_results = self.plugin.manager.verse_search(bible, second_bible, text) if second_bible and self.search_results: text = [] @@ -674,19 +674,19 @@ class BibleMediaItem(MediaManagerItem): further action is saved for/in each row. """ verse_separator = get_reference_match(u'sep_v_display') - version = self.parent.manager.get_meta_data(bible, u'Version').value - copyright = self.parent.manager.get_meta_data(bible, u'Copyright').value + version = self.plugin.manager.get_meta_data(bible, u'Version').value + copyright = self.plugin.manager.get_meta_data(bible, u'Copyright').value permissions = \ - self.parent.manager.get_meta_data(bible, u'Permissions').value + self.plugin.manager.get_meta_data(bible, u'Permissions').value second_version = u'' second_copyright = u'' second_permissions = u'' if second_bible: - second_version = self.parent.manager.get_meta_data( + second_version = self.plugin.manager.get_meta_data( second_bible, u'Version').value - second_copyright = self.parent.manager.get_meta_data( + second_copyright = self.plugin.manager.get_meta_data( second_bible, u'Copyright').value - second_permissions = self.parent.manager.get_meta_data( + second_permissions = self.plugin.manager.get_meta_data( second_bible, u'Permissions').value items = [] for count, verse in enumerate(search_results): @@ -879,7 +879,7 @@ class BibleMediaItem(MediaManagerItem): # 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_verse != self.plugin.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 chapter or the current verse is not the @@ -923,7 +923,7 @@ class BibleMediaItem(MediaManagerItem): Search for some Bible verses (by reference). """ bible = unicode(self.quickVersionComboBox.currentText()) - search_results = self.parent.manager.get_verses(bible, string, False) + search_results = self.plugin.manager.get_verses(bible, string, False) results = [] if search_results: versetext = u' '.join([verse.text for verse in search_results]) @@ -933,6 +933,6 @@ class BibleMediaItem(MediaManagerItem): def createItemFromId(self, item_id): item = QtGui.QListWidgetItem() bible = unicode(self.quickVersionComboBox.currentText()) - search_results = self.parent.manager.get_verses(bible, item_id, False) + search_results = self.plugin.manager.get_verses(bible, item_id, False) items = self.buildDisplayResults(bible, u'', search_results) return items diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 0e4376634..68d11404d 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -43,13 +43,13 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): Class documentation goes here. """ log.info(u'Custom Editor loaded') - def __init__(self, parent): + def __init__(self, plugin): """ Constructor """ - QtGui.QDialog.__init__(self) - self.parent = parent - self.manager = self.parent.manager + self.plugin = plugin + QtGui.QDialog.__init__(self, self.plugin.formparent) + self.manager = self.plugin.manager self.setupUi(self) # Create other objects and forms. self.editSlideForm = EditCustomSlideForm(self) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 43f4afd63..4a9dd8140 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -56,14 +56,14 @@ class CustomMediaItem(MediaManagerItem): def __init__(self, parent, plugin, icon): self.IconPath = u'custom/custom' - MediaManagerItem.__init__(self, parent, self, icon) + MediaManagerItem.__init__(self, parent, plugin, icon) self.singleServiceItem = False self.quickPreviewAllowed = True self.hasSearch = True # Holds information about whether the edit is remotly triggered and # which Custom is required. self.remoteCustom = -1 - self.manager = parent.manager + self.manager = plugin.manager def addEndHeaderBar(self): self.addToolbarSeparator() @@ -151,8 +151,8 @@ class CustomMediaItem(MediaManagerItem): self.listView.setCurrentItem(custom_name) def onNewClick(self): - self.parent.edit_custom_form.loadCustom(0) - self.parent.edit_custom_form.exec_() + self.plugin.edit_custom_form.loadCustom(0) + self.plugin.edit_custom_form.exec_() self.initialise() def onRemoteEditClear(self): @@ -170,9 +170,9 @@ class CustomMediaItem(MediaManagerItem): if valid: self.remoteCustom = fields[1] self.remoteTriggered = fields[0] - self.parent.edit_custom_form.loadCustom(fields[1], + self.plugin.edit_custom_form.loadCustom(fields[1], (fields[0] == u'P')) - self.parent.edit_custom_form.exec_() + self.plugin.edit_custom_form.exec_() def onEditClick(self): """ @@ -181,8 +181,8 @@ class CustomMediaItem(MediaManagerItem): if check_item_selected(self.listView, UiStrings().SelectEdit): item = self.listView.currentItem() item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.parent.edit_custom_form.loadCustom(item_id, False) - self.parent.edit_custom_form.exec_() + self.plugin.edit_custom_form.loadCustom(item_id, False) + self.plugin.edit_custom_form.exec_() self.initialise() def onDeleteClick(self): @@ -195,7 +195,7 @@ class CustomMediaItem(MediaManagerItem): id_list = [(item.data(QtCore.Qt.UserRole)).toInt()[0] for item in self.listView.selectedIndexes()] for id in id_list: - self.parent.manager.delete_object(CustomSlide, id) + self.plugin.manager.delete_object(CustomSlide, id) for row in row_list: self.listView.takeItem(row) @@ -212,7 +212,7 @@ class CustomMediaItem(MediaManagerItem): service_item.add_capability(ItemCapabilities.AllowsPreview) service_item.add_capability(ItemCapabilities.AllowsLoop) service_item.add_capability(ItemCapabilities.AllowsVirtualSplit) - customSlide = self.parent.manager.get_object(CustomSlide, item_id) + customSlide = self.plugin.manager.get_object(CustomSlide, item_id) title = customSlide.title credit = customSlide.credits service_item.edit_id = item_id @@ -245,13 +245,13 @@ class CustomMediaItem(MediaManagerItem): search_type = self.searchTextEdit.currentSearchType() if search_type == CustomSearch.Titles: log.debug(u'Titles Search') - search_results = self.parent.manager.get_all_objects(CustomSlide, + search_results = self.plugin.manager.get_all_objects(CustomSlide, CustomSlide.title.like(u'%' + self.whitespace.sub(u' ', search_keywords) + u'%'), order_by_ref=CustomSlide.title) self.loadList(search_results) elif search_type == CustomSearch.Themes: log.debug(u'Theme Search') - search_results = self.parent.manager.get_all_objects(CustomSlide, + search_results = self.plugin.manager.get_all_objects(CustomSlide, CustomSlide.theme_name.like(u'%' + self.whitespace.sub(u' ', search_keywords) + u'%'), order_by_ref=CustomSlide.title) self.loadList(search_results) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index f760a984e..921a52ede 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -47,7 +47,7 @@ class ImageMediaItem(MediaManagerItem): def __init__(self, parent, plugin, icon): self.IconPath = u'images/image' - MediaManagerItem.__init__(self, parent, self, icon) + MediaManagerItem.__init__(self, parent, plugin, icon) self.quickPreviewAllowed = True self.hasSearch = True QtCore.QObject.connect(Receiver.get_receiver(), @@ -112,14 +112,14 @@ class ImageMediaItem(MediaManagerItem): def loadList(self, list, initialLoad=False): if not initialLoad: - self.parent.formparent.displayProgressBar(len(list)) + self.plugin.formparent.displayProgressBar(len(list)) # Sort the themes by its filename considering language specific # characters. lower() is needed for windows! list.sort(cmp=locale.strcoll, key=lambda filename: os.path.split(unicode(filename))[1].lower()) for imageFile in list: if not initialLoad: - self.parent.formparent.incrementProgressBar() + self.plugin.formparent.incrementProgressBar() filename = os.path.split(unicode(imageFile))[1] thumb = os.path.join(self.servicePath, filename) if os.path.exists(thumb): @@ -134,7 +134,7 @@ class ImageMediaItem(MediaManagerItem): item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(imageFile)) self.listView.addItem(item_name) if not initialLoad: - self.parent.formparent.finishedProgressBar() + self.plugin.formparent.finishedProgressBar() def generateSlideData(self, service_item, item=None, xmlVersion=False): if item: @@ -188,7 +188,7 @@ class ImageMediaItem(MediaManagerItem): Called to reset the Live backgound with the image selected, """ self.resetAction.setVisible(False) - self.parent.liveController.display.resetImage() + self.plugin.liveController.display.resetImage() def liveThemeChanged(self): """ @@ -208,7 +208,7 @@ class ImageMediaItem(MediaManagerItem): filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) if os.path.exists(filename): (path, name) = os.path.split(filename) - self.parent.liveController.display.directImage(name, filename) + self.plugin.liveController.display.directImage(name, filename) self.resetAction.setVisible(True) else: critical_error_message_box(UiStrings().LiveBGError, diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 9dc17f4d3..96b97d25a 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -50,7 +50,7 @@ class MediaMediaItem(MediaManagerItem): self.background = False self.PreviewFunction = QtGui.QPixmap( u':/media/media_video.png').toImage() - MediaManagerItem.__init__(self, parent, self, icon) + MediaManagerItem.__init__(self, parent, plugin, icon) self.singleServiceItem = False self.hasSearch = True self.mediaObject = None @@ -65,8 +65,8 @@ class MediaMediaItem(MediaManagerItem): self.onNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media') self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem', 'Videos (%s);;Audio (%s);;%s (*)')) % ( - u' '.join(self.parent.video_extensions_list), - u' '.join(self.parent.audio_extensions_list), UiStrings().AllFiles) + u' '.join(self.plugin.video_extensions_list), + u' '.join(self.plugin.audio_extensions_list), UiStrings().AllFiles) self.replaceAction.setText(UiStrings().ReplaceBG) self.replaceAction.setToolTip(UiStrings().ReplaceLiveBG) self.resetAction.setText(UiStrings().ResetBG) @@ -95,7 +95,7 @@ class MediaMediaItem(MediaManagerItem): Called to reset the Live backgound with the media selected, """ self.resetAction.setVisible(False) - self.parent.liveController.display.resetVideo() + self.plugin.liveController.display.resetVideo() def videobackgroundReplaced(self): """ @@ -114,7 +114,7 @@ class MediaMediaItem(MediaManagerItem): filename = unicode(item.data(QtCore.Qt.UserRole).toString()) if os.path.exists(filename): (path, name) = os.path.split(filename) - self.parent.liveController.display.video(filename, 0, True) + self.plugin.liveController.display.video(filename, 0, True) self.resetAction.setVisible(True) else: critical_error_message_box(UiStrings().LiveBGError, diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index b757b5bfd..e138d4ef9 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -46,14 +46,14 @@ class PresentationMediaItem(MediaManagerItem): """ log.info(u'Presentations Media Item loaded') - def __init__(self, parent, icon, title, controllers): + def __init__(self, parent, plugin, icon, controllers): """ Constructor. Setup defaults """ self.controllers = controllers self.IconPath = u'presentations/presentation' self.Automatic = u'' - MediaManagerItem.__init__(self, parent, self, icon) + MediaManagerItem.__init__(self, parent, plugin, icon) self.message_listener = MessageListener(self) self.hasSearch = True QtCore.QObject.connect(Receiver.get_receiver(), @@ -82,7 +82,7 @@ class PresentationMediaItem(MediaManagerItem): for type in types: if fileType.find(type) == -1: fileType += u'*.%s ' % type - self.parent.serviceManager.supportedSuffixes(type) + self.plugin.serviceManager.supportedSuffixes(type) self.onNewFileMasks = unicode(translate('PresentationPlugin.MediaItem', 'Presentations (%s)')) % fileType @@ -161,14 +161,14 @@ class PresentationMediaItem(MediaManagerItem): titles = [os.path.split(file)[1] for file in currlist] Receiver.send_message(u'cursor_busy') if not initialLoad: - self.parent.formparent.displayProgressBar(len(files)) + self.plugin.formparent.displayProgressBar(len(files)) # Sort the themes by its filename considering language specific # characters. lower() is needed for windows! files.sort(cmp=locale.strcoll, key=lambda filename: os.path.split(unicode(filename))[1].lower()) for file in files: if not initialLoad: - self.parent.formparent.incrementProgressBar() + self.plugin.formparent.incrementProgressBar() if currlist.count(file) > 0: continue filename = os.path.split(unicode(file))[1] @@ -208,7 +208,7 @@ class PresentationMediaItem(MediaManagerItem): self.listView.addItem(item_name) Receiver.send_message(u'cursor_normal') if not initialLoad: - self.parent.formparent.finishedProgressBar() + self.plugin.formparent.finishedProgressBar() def onDeleteClick(self): """ diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 171039d15..313e6258f 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -99,7 +99,7 @@ class PresentationPlugin(Plugin): Create the Media Manager List """ return PresentationMediaItem( - self, self.icon, self.name, self.controllers) + self.mediadock, self, self.icon, self.controllers) def registerControllers(self, controller): """ diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 0ff8bc32e..9d29156f7 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -154,12 +154,12 @@ class HttpServer(object): e.g. http://localhost:4316/send/slidecontroller_live_next http://localhost:4316/send/alerts_text?q=your%20alert%20text """ - def __init__(self, parent): + def __init__(self, plugin): """ Initialise the httpserver, and start the server """ log.debug(u'Initialise httpserver') - self.parent = parent + self.plugin = plugin self.html_dir = os.path.join( AppLocation.get_directory(AppLocation.PluginsDir), u'remotes', u'html') @@ -176,10 +176,10 @@ class HttpServer(object): """ log.debug(u'Start TCP server') port = QtCore.QSettings().value( - self.parent.settingsSection + u'/port', + self.plugin.settingsSection + u'/port', QtCore.QVariant(4316)).toInt()[0] address = QtCore.QSettings().value( - self.parent.settingsSection + u'/ip address', + self.plugin.settingsSection + u'/ip address', QtCore.QVariant(u'0.0.0.0')).toString() self.server = QtNetwork.QTcpServer() self.server.listen(QtNetwork.QHostAddress(address), port) @@ -264,7 +264,7 @@ class HttpConnection(object): def _get_service_items(self): service_items = [] - service_manager = self.parent.parent.serviceManager + service_manager = self.parent.plugin.serviceManager if self.parent.current_item: cur_uuid = self.parent.current_item._uuid else: @@ -457,7 +457,7 @@ class HttpConnection(object): """ if action == u'search': searches = [] - for plugin in self.parent.parent.pluginManager.plugins: + for plugin in self.parent.plugin.pluginManager.plugins: if plugin.status == PluginStatus.Active and \ plugin.mediaItem and plugin.mediaItem.hasSearch: searches.append(plugin.name) @@ -473,7 +473,7 @@ class HttpConnection(object): The plugin name to search in. """ text = json.loads(self.url_params[u'data'][0])[u'request'][u'text'] - plugin = self.parent.parent.pluginManager.get_plugin_by_name(type) + plugin = self.parent.plugin.pluginManager.get_plugin_by_name(type) if plugin.status == PluginStatus.Active and \ plugin.mediaItem and plugin.mediaItem.hasSearch: results =plugin.mediaItem.search(text) @@ -488,7 +488,7 @@ class HttpConnection(object): Go live on an item of type ``type``. """ id = json.loads(self.url_params[u'data'][0])[u'request'][u'id'] - plugin = self.parent.parent.pluginManager.get_plugin_by_name(type) + plugin = self.parent.plugin.pluginManager.get_plugin_by_name(type) if plugin.status == PluginStatus.Active and plugin.mediaItem: plugin.mediaItem.goLive(id) @@ -497,7 +497,7 @@ class HttpConnection(object): Add item of type ``type`` to the end of the service """ id = json.loads(self.url_params[u'data'][0])[u'request'][u'id'] - plugin = self.parent.parent.pluginManager.get_plugin_by_name(type) + plugin = self.parent.plugin.pluginManager.get_plugin_by_name(type) if plugin.status == PluginStatus.Active and plugin.mediaItem: item_id = plugin.mediaItem.createItemFromId(id) plugin.mediaItem.addToService(item_id) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 393009f82..b6e0c04a8 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -52,7 +52,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): Constructor """ QtGui.QDialog.__init__(self, parent) - self.parent = parent self.song = None # can this be automated? self.width = 400 @@ -90,7 +89,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.onVerseListViewPressed) QtCore.QObject.connect(self.themeAddButton, QtCore.SIGNAL(u'clicked()'), - self.parent.parent.renderer.theme_manager.onAddTheme) + self.parent().plugin.renderer.theme_manager.onAddTheme) QtCore.QObject.connect(self.maintenanceButton, QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked) QtCore.QObject.connect(Receiver.get_receiver(), diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 7fe4d45c4..49ed759ff 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -62,12 +62,12 @@ class SongMediaItem(MediaManagerItem): def __init__(self, parent, plugin, icon): self.IconPath = u'songs/song' - MediaManagerItem.__init__(self, parent, self, icon) - self.edit_song_form = EditSongForm(self, self.parent.manager) - self.openLyrics = OpenLyrics(self.parent.manager) + MediaManagerItem.__init__(self, parent, plugin, icon) + self.edit_song_form = EditSongForm(self, self.plugin.manager) + self.openLyrics = OpenLyrics(self.plugin.manager) self.singleServiceItem = False self.song_maintenance_form = SongMaintenanceForm( - self.parent.manager, self) + self.plugin.manager, self) # Holds information about whether the edit is remotly triggered and # which Song is required. self.remoteSong = -1 @@ -178,31 +178,31 @@ class SongMediaItem(MediaManagerItem): self.displayResultsSong(search_results) elif search_type == SongSearch.Titles: log.debug(u'Titles Search') - search_results = self.parent.manager.get_all_objects(Song, + search_results = self.plugin.manager.get_all_objects(Song, Song.search_title.like(u'%' + self.whitespace.sub(u' ', search_keywords.lower()) + u'%')) self.displayResultsSong(search_results) elif search_type == SongSearch.Lyrics: log.debug(u'Lyrics Search') - search_results = self.parent.manager.get_all_objects(Song, + search_results = self.plugin.manager.get_all_objects(Song, Song.search_lyrics.like(u'%' + search_keywords.lower() + u'%')) self.displayResultsSong(search_results) elif search_type == SongSearch.Authors: log.debug(u'Authors Search') - search_results = self.parent.manager.get_all_objects(Author, + search_results = self.plugin.manager.get_all_objects(Author, Author.display_name.like(u'%' + search_keywords + u'%'), Author.display_name.asc()) self.displayResultsAuthor(search_results) elif search_type == SongSearch.Themes: log.debug(u'Theme Search') - search_results = self.parent.manager.get_all_objects(Song, + search_results = self.plugin.manager.get_all_objects(Song, Song.theme_name.like(u'%' + self.whitespace.sub(u' ', search_keywords) + u'%')) self.displayResultsSong(search_results) self.check_search_result() def searchEntire(self, search_keywords): - return self.parent.manager.get_all_objects(Song, + return self.plugin.manager.get_all_objects(Song, or_(Song.search_title.like(u'%' + self.whitespace.sub(u' ', search_keywords.lower()) + u'%'), Song.search_lyrics.like(u'%' + search_keywords.lower() + u'%'), @@ -225,7 +225,7 @@ class SongMediaItem(MediaManagerItem): if self.editItem and self.updateServiceOnEdit and \ not self.remoteTriggered: item = self.buildServiceItem(self.editItem) - self.parent.serviceManager.replaceServiceItem(item) + self.plugin.serviceManager.replaceServiceItem(item) self.onRemoteEditClear() self.onSearchTextButtonClick() log.debug(u'onSongListLoad - finished') @@ -284,12 +284,12 @@ class SongMediaItem(MediaManagerItem): def onImportClick(self): if not hasattr(self, u'import_wizard'): - self.import_wizard = SongImportForm(self, self.parent) + self.import_wizard = SongImportForm(self, self.plugin) if self.import_wizard.exec_() == QtGui.QDialog.Accepted: Receiver.send_message(u'songs_load_list') def onExportClick(self): - export_wizard = SongExportForm(self, self.parent) + export_wizard = SongExportForm(self, self.plugin) export_wizard.exec_() def onNewClick(self): @@ -314,7 +314,7 @@ class SongMediaItem(MediaManagerItem): log.debug(u'onRemoteEdit %s' % message) remote_type, song_id = message.split(u':') song_id = int(song_id) - valid = self.parent.manager.get_object(Song, song_id) + valid = self.plugin.manager.get_object(Song, song_id) if valid: self.remoteSong = song_id self.remoteTriggered = remote_type @@ -350,7 +350,7 @@ class SongMediaItem(MediaManagerItem): return for item in items: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.parent.manager.delete_object(Song, item_id) + self.plugin.manager.delete_object(Song, item_id) self.onSearchTextButtonClick() def generateSlideData(self, service_item, item=None, xmlVersion=False): @@ -362,7 +362,7 @@ class SongMediaItem(MediaManagerItem): service_item.add_capability(ItemCapabilities.OnLoadUpdate) service_item.add_capability(ItemCapabilities.AddIfNewItem) service_item.add_capability(ItemCapabilities.AllowsVirtualSplit) - song = self.parent.manager.get_object(Song, item_id) + song = self.plugin.manager.get_object(Song, item_id) service_item.theme = song.theme_name service_item.edit_id = item_id if song.lyrics.startswith(u' Date: Sat, 28 May 2011 11:15:10 +0100 Subject: [PATCH 092/124] merge fixes --- openlp/plugins/custom/forms/editcustomform.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 1aa283311..26a25e12a 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -43,12 +43,11 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): Class documentation goes here. """ log.info(u'Custom Editor loaded') - def __init__(self, plugin, manager): + def __init__(self, parent, manager): """ Constructor """ - self.plugin = plugin - QtGui.QDialog.__init__(self, self.plugin.formparent) + QtGui.QDialog.__init__(self, parent) self.manager = manager self.setupUi(self) # Create other objects and forms. @@ -137,7 +136,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): self.customSlide.credits = unicode(self.creditEdit.text()) self.customSlide.theme_name = unicode(self.themeComboBox.currentText()) success = self.manager.save_object(self.customSlide) - self.parent.auto_select_id = self.customSlide.id + self.parent().auto_select_id = self.customSlide.id return success def onUpButtonClicked(self): From 6a1ee02cdd94c80d91c00d3c972b1853cd44d4f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sat, 28 May 2011 14:48:10 +0200 Subject: [PATCH 093/124] add Backup page to the wizard remove blank item on Combobox in BookNameForm --- .../plugins/bibles/forms/bibleupgradeform.py | 116 ++++++++++++++++++ openlp/plugins/bibles/forms/booknameform.py | 1 - 2 files changed, 116 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index a5b175aef..64a9f9ffa 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -29,6 +29,7 @@ The bible import functions for OpenLP import logging import os.path import re +import shutil from PyQt4 import QtCore, QtGui @@ -133,6 +134,32 @@ class BibleUpgradeForm(OpenLPWizard): if number in self.success and self.success[number] == True: delete_file(os.path.join(self.path, filename[0])) + def onBackupBrowseButtonClicked(self): + """ + Show the file open dialog for the OSIS file. + """ + filename = QtGui.QFileDialog.getExistingDirectory(self, translate( + 'BiblesPlugin.UpgradeWizardForm', 'Select a Backup Directory'), + os.path.dirname(SettingsManager.get_last_dir( + self.plugin.settingsSection, 1))) + if filename: + self.backupDirectoryEdit.setText(filename) + SettingsManager.set_last_dir(self.plugin.settingsSection, + filename, 1) + + def backupOldBibles(self, backupdirectory): + """ + Backup old bible databases in a given folder. + """ + for filename in self.files: + try: + shutil.copy(os.path.join(self.path, filename[0]), + backupdirectory) + except: + return False + break + return True + def customInit(self): """ Perform any custom initialisation for bible upgrading. @@ -146,11 +173,52 @@ class BibleUpgradeForm(OpenLPWizard): """ QtCore.QObject.connect(self.finishButton, QtCore.SIGNAL(u'clicked()'), self.onFinishButton) + QtCore.QObject.connect(self.backupBrowseButton, + QtCore.SIGNAL(u'clicked()'), self.onBackupBrowseButtonClicked) def addCustomPages(self): """ Add the bible import specific wizard pages. """ + # Backup Page + self.backupPage = QtGui.QWizardPage() + self.backupPage.setObjectName(u'BackupPage') + self.backupLayout = QtGui.QVBoxLayout(self.backupPage) + self.backupLayout.setObjectName(u'BackupLayout') + self.backupInfoLabel = QtGui.QLabel(self.backupPage) + self.backupInfoLabel.setObjectName(u'backupInfoLabel') + self.backupInfoLabel.setWordWrap(True) + self.backupLayout.addWidget(self.backupInfoLabel) + self.formLayout = QtGui.QFormLayout() + self.formLayout.setMargin(0) + self.formLayout.setObjectName(u'FormLayout') + self.backupDirectoryLabel = QtGui.QLabel(self.backupPage) + self.backupDirectoryLabel.setObjectName(u'backupDirectoryLabel') + self.backupDirectoryLayout = QtGui.QHBoxLayout() + self.backupDirectoryLayout.setObjectName(u'BackupDirectoryLayout') + self.backupDirectoryEdit = QtGui.QLineEdit(self.backupPage) + self.backupDirectoryEdit.setObjectName(u'BackupFolderEdit') + self.backupDirectoryLayout.addWidget(self.backupDirectoryEdit) + self.backupBrowseButton = QtGui.QToolButton(self.backupPage) + self.backupBrowseButton.setIcon(self.openIcon) + self.backupBrowseButton.setObjectName(u'BackupBrowseButton') + self.backupDirectoryLayout.addWidget(self.backupBrowseButton) + self.formLayout.addRow(self.backupDirectoryLabel, + self.backupDirectoryLayout) + self.backupLayout.addLayout(self.formLayout) + self.backupAdditionalInfoLabel = QtGui.QLabel(self.backupPage) + self.backupAdditionalInfoLabel.setObjectName( + u'BackupAdditionalInfoLabel') + self.backupAdditionalInfoLabel.setWordWrap(True) + self.backupLayout.addWidget(self.backupAdditionalInfoLabel) + self.noBackupCheckBox = QtGui.QCheckBox(self.backupPage) + self.noBackupCheckBox.setObjectName('NoBackupCheckBox') + self.backupLayout.addWidget(self.noBackupCheckBox) + self.spacer = QtGui.QSpacerItem(10, 0, QtGui.QSizePolicy.Fixed, + QtGui.QSizePolicy.Minimum) + self.backupLayout.addItem(self.spacer) + self.addPage(self.backupPage) + # Select Page self.selectPage = QtGui.QWizardPage() self.selectPage.setObjectName(u'SelectPage') self.pageLayout = QtGui.QVBoxLayout(self.selectPage) @@ -290,6 +358,27 @@ class BibleUpgradeForm(OpenLPWizard): 'This wizard will help you to upgrade your existing Bibles from a ' 'prior version of OpenLP 2. Click the next button below to start ' 'the process by selecting the Bibles to upgrade.')) + self.backupPage.setTitle( + translate('BiblesPlugin.UpgradeWizardForm', + 'Select Backup Directory')) + self.backupPage.setSubTitle( + translate('BiblesPlugin.UpgradeWizardForm', + 'Please select a Directory for Backup your old Bibles')) + self.backupInfoLabel.setText(translate('BiblesPlugin.UpgradeWizardForm', + 'The Bible upgrade procedure will prevent you running older ' + 'versions of OpenLP. \nPlease select a backup location for your ' + 'existing Bibles.')) + self.backupDirectoryLabel.setText( + translate('BiblesPlugin.UpgradeWizardForm', 'Backup Directory:')) + self.backupAdditionalInfoLabel.setText( + translate('BiblesPlugin.UpgradeWizardForm', + 'These Bibles can copied back to your OpenLP data folder should ' + 'you need to revert to a previous version. Instructions on how ' + 'to restore the files can be found on our FAQ ' + 'at http://wiki.openlp.org/faq')) + self.noBackupCheckBox.setText( + translate('BiblesPlugin.UpgradeWizardForm', + 'There is no need to backup my Bibles')) self.selectPage.setTitle( translate('BiblesPlugin.UpgradeWizardForm', 'Select Bibles')) @@ -316,6 +405,33 @@ class BibleUpgradeForm(OpenLPWizard): """ if self.currentPage() == self.welcomePage: return True + elif self.currentPage() == self.backupPage: + if not self.noBackupCheckBox.checkState() == QtCore.Qt.Checked: + if not unicode(self.backupDirectoryEdit.text()): + critical_error_message_box(UiStrings().EmptyField, + translate('BiblesPlugin.UpgradeWizardForm', + 'You need to specify a Backup Directory for your ' + 'Bibles.')) + self.backupDirectoryEdit.setFocus() + return False + elif not os.path.exists(unicode( + self.backupDirectoryEdit.text())): + critical_error_message_box(UiStrings().Error, + translate('BiblesPlugin.UpgradeWizardForm', + 'The given path is not an existing directory.')) + self.backupDirectoryEdit.setFocus() + return False + else: + if not self.backupOldBibles(unicode( + self.backupDirectoryEdit.text())): + critical_error_message_box(UiStrings().Error, + translate('BiblesPlugin.UpgradeWizardForm', + 'The backup was not successfull.\nTo backup your ' + 'Bibles you need the permission to write in the given ' + 'directory. If you have a permissions to write and ' + 'this error still occurs, please report a bug.')) + return False + return True elif self.currentPage() == self.selectPage: for number, filename in enumerate(self.files): if not self.checkBox[number].checkState() == QtCore.Qt.Checked: diff --git a/openlp/plugins/bibles/forms/booknameform.py b/openlp/plugins/bibles/forms/booknameform.py index 8ad3ad977..28e4c9df1 100644 --- a/openlp/plugins/bibles/forms/booknameform.py +++ b/openlp/plugins/bibles/forms/booknameform.py @@ -80,7 +80,6 @@ class BookNameForm(QDialog, Ui_BookNameDialog): Reload the Combobox items ''' self.correspondingComboBox.clear() - self.correspondingComboBox.addItem(u'') items = BiblesResourcesDB.get_books() for item in items: addBook = True From 9b9f47a5beb4507537616c9d14ea0ff3267caf61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sat, 28 May 2011 15:33:15 +0200 Subject: [PATCH 094/124] small fix --- openlp/plugins/bibles/forms/bibleupgradeform.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 64a9f9ffa..00623fbce 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -157,7 +157,6 @@ class BibleUpgradeForm(OpenLPWizard): backupdirectory) except: return False - break return True def customInit(self): From 88f1f4065e714cbe9eb58689681ac54d3ca8f8d3 Mon Sep 17 00:00:00 2001 From: "Jeffrey S. Smith" Date: Sat, 28 May 2011 08:45:44 -0500 Subject: [PATCH 095/124] Make 'continuous loop' button into a selection ('loop' or 'play to end') --- openlp/core/ui/slidecontroller.py | 105 ++++++++++++++++++------------ 1 file changed, 65 insertions(+), 40 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 85598a767..28656ef25 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -66,7 +66,7 @@ class SlideController(QtGui.QWidget): float(self.screens.current[u'size'].height()) self.image_manager = self.parent.image_manager self.loopList = [ - u'Start Loop', + u'Play Slides Menu', u'Loop Separator', u'Image SpinBox' ] @@ -153,6 +153,7 @@ class SlideController(QtGui.QWidget): context=QtCore.Qt.WidgetWithChildrenShortcut) self.toolbar.addToolbarSeparator(u'Close Separator') if self.isLive: + # Hide Menu self.hideMenu = QtGui.QToolButton(self.toolbar) self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide')) self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) @@ -180,27 +181,34 @@ class SlideController(QtGui.QWidget): self.hideMenu.menu().addAction(self.themeScreen) self.hideMenu.menu().addAction(self.desktopScreen) self.toolbar.addToolbarSeparator(u'Loop Separator') - startLoop = self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Start Loop', u':/media/media_time.png', - translate('OpenLP.SlideController', 'Start continuous loop'), - self.onStartLoop) - startLoop.setObjectName(u'startLoop') - action_list = ActionList.get_instance() - action_list.add_action(startLoop, UiStrings().LiveToolbar) - stopLoop = self.toolbar.addToolbarButton( - # Does not need translating - control string. - u'Stop Loop', u':/media/media_stop.png', - translate('OpenLP.SlideController', 'Stop continuous loop'), - self.onStopLoop) - stopLoop.setObjectName(u'stopLoop') - action_list.add_action(stopLoop, UiStrings().LiveToolbar) - self.toogleLoop = shortcut_action(self, u'toogleLoop', - [QtGui.QKeySequence(u'L')], self.onToggleLoop, - category=UiStrings().LiveToolbar) - self.toogleLoop.setText(translate('OpenLP.SlideController', - 'Start/Stop continuous loop')) - self.addAction(self.toogleLoop) + # Play Slides Menu + self.playSlidesMenu = QtGui.QToolButton(self.toolbar) + self.playSlidesMenu.setText(translate('OpenLP.SlideController', + 'Play Slides')) + self.playSlidesMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) + self.toolbar.addToolbarWidget(u'Play Slides Menu', + self.playSlidesMenu) + self.playSlidesMenu.setMenu(QtGui.QMenu( + translate('OpenLP.SlideController', 'Play Slides'), + self.toolbar)) + self.playSlidesLoop = shortcut_action(self.playSlidesMenu, + u'playSlidesLoop', [], self.onPlaySlidesLoop, + u':/media/media_time.png', False, UiStrings().LiveToolbar) + self.playSlidesLoop.setText( + translate('OpenLP.SlideController', 'Play Slides in Loop')) + self.playSlidesOnce = shortcut_action(self.playSlidesMenu, + u'playSlidesOnce', [], self.onPlaySlidesOnce, + u':/media/media_time.png', False, UiStrings().LiveToolbar) + self.playSlidesOnce.setText( + translate('OpenLP.SlideController', 'Play Slides to End')) + if QtCore.QSettings().value(self.parent.generalSettingsSection + + u'/enable slide loop', QtCore.QVariant(True)).toBool(): + self.playSlidesMenu.setDefaultAction(self.playSlidesLoop) + else: + self.playSlidesMenu.setDefaultAction(self.playSlidesOnce) + self.playSlidesMenu.menu().addAction(self.playSlidesLoop) + self.playSlidesMenu.menu().addAction(self.playSlidesOnce) + # Loop Delay Spinbox self.delaySpinBox = QtGui.QSpinBox() self.delaySpinBox.setRange(1, 180) self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox) @@ -321,7 +329,6 @@ class SlideController(QtGui.QWidget): QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), self.receiveSpinDelay) self.toolbar.makeWidgetsInvisible(self.loopList) - self.toolbar.actions[u'Stop Loop'].setVisible(False) else: QtCore.QObject.connect(self.previewListWidget, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), @@ -496,10 +503,6 @@ class SlideController(QtGui.QWidget): self.mediabar.setVisible(False) self.toolbar.makeWidgetsInvisible([u'Song Menu']) self.toolbar.makeWidgetsInvisible(self.loopList) - self.toogleLoop.setEnabled(False) - self.toolbar.actions[u'Start Loop'].setEnabled(False) - self.toolbar.actions[u'Stop Loop'].setEnabled(False) - self.toolbar.actions[u'Stop Loop'].setVisible(False) if item.is_text(): if QtCore.QSettings().value( self.parent.songsSettingsSection + u'/display songbar', @@ -508,9 +511,6 @@ class SlideController(QtGui.QWidget): if item.is_capable(ItemCapabilities.AllowsLoop) and \ len(item.get_frames()) > 1: self.toolbar.makeWidgetsVisible(self.loopList) - self.toogleLoop.setEnabled(True) - self.toolbar.actions[u'Start Loop'].setEnabled(True) - self.toolbar.actions[u'Stop Loop'].setEnabled(True) if item.is_media(): self.toolbar.setVisible(False) self.mediabar.setVisible(True) @@ -933,7 +933,7 @@ class SlideController(QtGui.QWidget): rect.y(), rect.width(), rect.height()) self.slidePreview.setPixmap(winimg) - def onSlideSelectedNext(self): + def onSlideSelectedNext(self, wrap=None): """ Go to the next slide. """ @@ -946,8 +946,11 @@ class SlideController(QtGui.QWidget): else: row = self.previewListWidget.currentRow() + 1 if row == self.previewListWidget.rowCount(): - if QtCore.QSettings().value(self.parent.generalSettingsSection + - u'/enable slide loop', QtCore.QVariant(True)).toBool(): + if wrap is None: + wrap = QtCore.QSettings().value( + self.parent.generalSettingsSection + + u'/enable slide loop', QtCore.QVariant(True)).toBool() + if wrap: row = 0 else: row = self.previewListWidget.rowCount() - 1 @@ -996,11 +999,11 @@ class SlideController(QtGui.QWidget): self.previewListWidget.rowCount() - 1) self.slideSelected() - def onToggleLoop(self, toggled): + def onToggleLoop(self): """ Toggles the loop state. """ - if self.toolbar.actions[u'Start Loop'].isVisible(): + if self.playSlidesLoop.isChecked() or self.playSlidesOnce.isChecked(): self.onStartLoop() else: self.onStopLoop() @@ -1012,8 +1015,6 @@ class SlideController(QtGui.QWidget): if self.previewListWidget.rowCount() > 1: self.timer_id = self.startTimer( int(self.delaySpinBox.value()) * 1000) - self.toolbar.actions[u'Stop Loop'].setVisible(True) - self.toolbar.actions[u'Start Loop'].setVisible(False) def onStopLoop(self): """ @@ -1022,15 +1023,39 @@ class SlideController(QtGui.QWidget): if self.timer_id != 0: self.killTimer(self.timer_id) self.timer_id = 0 - self.toolbar.actions[u'Start Loop'].setVisible(True) - self.toolbar.actions[u'Stop Loop'].setVisible(False) + + def onPlaySlidesLoop(self, checked=None): + """ + Start or stop 'Play Slides in Loop' + """ + if checked is None: + checked = self.playSlidesLoop.isChecked() + else: + self.playSlidesLoop.setChecked(checked) + log.debug(u'onPlaySlidesLoop %s' % checked) + self.playSlidesMenu.setDefaultAction(self.playSlidesLoop) + self.playSlidesOnce.setChecked(False) + self.onToggleLoop() + + def onPlaySlidesOnce(self, checked=None): + """ + Start or stop 'Play Slides to End' + """ + if checked is None: + checked = self.playSlidesOnce.isChecked() + else: + self.playSlidesOnce.setChecked(checked) + log.debug(u'onPlaySlidesOnce %s' % checked) + self.playSlidesMenu.setDefaultAction(self.playSlidesOnce) + self.playSlidesLoop.setChecked(False) + self.onToggleLoop() def timerEvent(self, event): """ If the timer event is for this window select next slide """ if event.timerId() == self.timer_id: - self.onSlideSelectedNext() + self.onSlideSelectedNext(self.playSlidesLoop.isChecked()) def onEditSong(self): """ From 6507b431b0a7f12918bd704a09ff7414ca8befd9 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 28 May 2011 18:25:11 +0200 Subject: [PATCH 096/124] fix for older versions --- openlp/plugins/songs/lib/__init__.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index e3779f2c0..ac7724ade 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -269,6 +269,19 @@ def clean_song(manager, song): verses = SongXML().get_verses(song.lyrics) lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses]) song.search_lyrics = lyrics.lower() + compare_order = [] + for verse in verses: + compare_order.append( + (u'%s%s' % (verse[0][u'type'], verse[0][u'label'])).upper()) + if verse[0][u'label'] == u'1': + compare_order.append(verse[0][u'type'].upper()) + # Check if the verse order contains tags for verses which do not exist. + # (This is relevant for people upgrading from 1.9.4 and older). + for order in song.verse_order.split(): + # The verse order contains invalid tags, so reset the order. + if order not in compare_order: + song.verse_order = u'' + break # The song does not have any author, add one. if not song.authors: name = SongStrings.AuthorUnknown From 5bedf62ec45d7732d3b8502a82dea1c394758640 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 28 May 2011 18:30:16 +0200 Subject: [PATCH 097/124] added more code back --- openlp/plugins/songs/lib/__init__.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index ac7724ade..8aab8a34d 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -277,7 +277,11 @@ def clean_song(manager, song): compare_order.append(verse[0][u'type'].upper()) # Check if the verse order contains tags for verses which do not exist. # (This is relevant for people upgrading from 1.9.4 and older). - for order in song.verse_order.split(): + if song.verse_order: + order = song.verse_order.strip().split() + else: + order = [] + for order in order: # The verse order contains invalid tags, so reset the order. if order not in compare_order: song.verse_order = u'' From 64b9b4232167af374d810af37ebb90c065d45b9e Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 28 May 2011 19:01:41 +0200 Subject: [PATCH 098/124] better solution --- openlp/plugins/songs/lib/__init__.py | 74 +++++++++++++++++++--------- 1 file changed, 52 insertions(+), 22 deletions(-) diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index 8aab8a34d..53b3d7cb1 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -171,8 +171,7 @@ class VerseType(object): @staticmethod def from_loose_input(verse_name): """ - Return the VerseType for a given string, Other if not found. Use this - with caution! + Return the VerseType for a given string, Other if not found ``verse_name`` The string to return a VerseType for @@ -266,26 +265,57 @@ def clean_song(manager, song): whitespace = re.compile(r'\W+', re.UNICODE) song.search_title = (whitespace.sub(u' ', song.title).strip() + u'@' + whitespace.sub(u' ', song.alternate_title).strip()).strip().lower() - verses = SongXML().get_verses(song.lyrics) - lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses]) - song.search_lyrics = lyrics.lower() - compare_order = [] - for verse in verses: - compare_order.append( - (u'%s%s' % (verse[0][u'type'], verse[0][u'label'])).upper()) - if verse[0][u'label'] == u'1': - compare_order.append(verse[0][u'type'].upper()) - # Check if the verse order contains tags for verses which do not exist. - # (This is relevant for people upgrading from 1.9.4 and older). - if song.verse_order: - order = song.verse_order.strip().split() - else: - order = [] - for order in order: - # The verse order contains invalid tags, so reset the order. - if order not in compare_order: - song.verse_order = u'' - break + # Only do this, if we the song is a 1.9.4 song (or older). + if song.lyrics.find(u'') != -1: + # Remove the old "language" attribute from lyrics tag (prior to 1.9.5). + # This is not very important, but this keeps the database clean. This + # can be removed when everybody has cleaned his songs. + song.lyrics = song.lyrics.replace( + u'', u'') + verses = SongXML().get_verses(song.lyrics) + lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses]) + song.search_lyrics = lyrics.lower() + # We need a new and clean SongXML instance. + sxml = SongXML() + # Rebuild the song's verses, to remove any wrong verse names (for + # example translated ones), which might have been added prior to 1.9.5. + # List for later comparison. + compare_order = [] + for verse in verses: + verse_type = VerseType.Tags[VerseType.from_loose_input( + verse[0][u'type'])] + sxml.add_verse_to_lyrics( + verse_type, + verse[0][u'label'], + verse[1], + verse[0][u'lang'] if verse[0].has_key(u'lang') else None + ) + compare_order.append((u'%s%s' % (verse_type, verse[0][u'label']) + ).upper()) + if verse[0][u'label'] == u'1': + compare_order.append(verse_type.upper()) + song.lyrics = unicode(sxml.extract_xml(), u'utf-8') + # Rebuild the verse order, to convert translated verse tags, which might + # have been added prior to 1.9.5. + if song.verse_order: + order = song.verse_order.strip().split() + else: + order = [] + new_order = [] + for verse_def in order: + verse_type = VerseType.Tags[ + VerseType.from_loose_input(verse_def[0])] + if len(verse_def) > 1: + new_order.append( + (u'%s%s' % (verse_type, verse_def[1:])).upper()) + else: + new_order.append(verse_type.upper()) + song.verse_order = u' '.join(new_order) + # Check if the verse order contains tags for verses which do not exist. + for order in new_order: + if order not in compare_order: + song.verse_order = u'' + break # The song does not have any author, add one. if not song.authors: name = SongStrings.AuthorUnknown From 82a72fdc877831ee79e96bea02b3b2c778637c8a Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 28 May 2011 19:47:14 +0100 Subject: [PATCH 099/124] Don't set .parent's on Qt items, pass to init instead --- openlp/core/lib/dockwidget.py | 1 - openlp/core/lib/mediamanageritem.py | 3 +- openlp/core/lib/plugin.py | 3 +- openlp/core/lib/renderer.py | 4 +- openlp/core/ui/maindisplay.py | 3 +- openlp/core/ui/pluginform.py | 5 +-- openlp/core/ui/slidecontroller.py | 43 +++++++++---------- openlp/plugins/alerts/forms/alertform.py | 1 - openlp/plugins/alerts/lib/alertsmanager.py | 9 ++-- .../presentations/presentationplugin.py | 2 +- openlp/plugins/songs/forms/editsongform.py | 4 +- 11 files changed, 37 insertions(+), 41 deletions(-) diff --git a/openlp/core/lib/dockwidget.py b/openlp/core/lib/dockwidget.py index 5c461bbf8..182b98c48 100644 --- a/openlp/core/lib/dockwidget.py +++ b/openlp/core/lib/dockwidget.py @@ -47,7 +47,6 @@ class OpenLPDockWidget(QtGui.QDockWidget): """ log.debug(u'Initialise the %s widget' % name) QtGui.QDockWidget.__init__(self, parent) - self.parent = parent if name: self.setObjectName(name) if icon: diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 679aa12d6..602b3c55b 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -90,8 +90,7 @@ class MediaManagerItem(QtGui.QWidget): """ Constructor to create the media manager item. """ - QtGui.QWidget.__init__(self) - self.parent = parent + QtGui.QWidget.__init__(self, parent) self.whitespace = re.compile(r'\W+', re.UNICODE) self.plugin = plugin visible_title = self.plugin.getString(StringContent.VisibleName) diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index 974c59de2..65ed76dfe 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -215,7 +215,8 @@ class Plugin(QtCore.QObject): you need, and return it for integration into openlp.org. """ if self.media_item_class: - return self.media_item_class(self.mediadock, self, self.icon) + return self.media_item_class(self.mediadock.media_dock, self, + self.icon) return None def addImportMenuItem(self, importMenu): diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 079a9aa9c..4acf88202 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -77,7 +77,7 @@ class Renderer(object): self.theme_data = None self.bg_frame = None self.force_page = False - self.display = MainDisplay(self, self.image_manager, False) + self.display = MainDisplay(None, self.image_manager, False) self.display.setup() def update_display(self): @@ -86,7 +86,7 @@ class Renderer(object): """ log.debug(u'Update Display') self._calculate_default(self.screens.current[u'size']) - self.display = MainDisplay(self, self.image_manager, False) + self.display = MainDisplay(None, self.image_manager, False) self.display.setup() self.bg_frame = None self.theme_data = None diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index dc7c28ded..763b9bc8b 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -50,7 +50,8 @@ class MainDisplay(QtGui.QGraphicsView): """ def __init__(self, parent, image_manager, live): QtGui.QGraphicsView.__init__(self) - self.parent = parent + if parent: + self.setParent(parent) self.isLive = live self.image_manager = image_manager self.screens = ScreenList.get_instance() diff --git a/openlp/core/ui/pluginform.py b/openlp/core/ui/pluginform.py index 0f7f6dbeb..c93b08ccb 100644 --- a/openlp/core/ui/pluginform.py +++ b/openlp/core/ui/pluginform.py @@ -40,7 +40,6 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): """ def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) - self.parent = parent self.activePlugin = None self.programaticChange = False self.setupUi(self) @@ -65,7 +64,7 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): self._clearDetails() self.programaticChange = True pluginListWidth = 0 - for plugin in self.parent.pluginManager.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. @@ -117,7 +116,7 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): plugin_name_singular = \ self.pluginListWidget.currentItem().text().split(u' ')[0] self.activePlugin = None - for plugin in self.parent.pluginManager.plugins: + for plugin in self.parent().pluginManager.plugins: if plugin.nameStrings[u'singular'] == plugin_name_singular: self.activePlugin = plugin break diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 98046ba2a..5cd128f5e 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -46,7 +46,6 @@ class SlideList(QtGui.QTableWidget): """ def __init__(self, parent=None, name=None): QtGui.QTableWidget.__init__(self, parent.controller) - self.parent = parent class SlideController(QtGui.QWidget): @@ -60,11 +59,10 @@ class SlideController(QtGui.QWidget): """ QtGui.QWidget.__init__(self, parent) self.isLive = isLive - self.parent = parent self.screens = ScreenList.get_instance() self.ratio = float(self.screens.current[u'size'].width()) / \ float(self.screens.current[u'size'].height()) - self.image_manager = self.parent.image_manager + self.image_manager = self.parent().image_manager self.loopList = [ u'Start Loop', u'Loop Separator', @@ -461,7 +459,7 @@ class SlideController(QtGui.QWidget): self.previewListWidget.resizeRowsToContents() else: # Sort out image heights. - width = self.parent.controlSplitter.sizes()[self.split] + width = self.parent().controlSplitter.sizes()[self.split] for framenumber in range(len(self.serviceItem.get_frames())): self.previewListWidget.setRowHeight( framenumber, width / self.ratio) @@ -502,7 +500,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'/display 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 \ @@ -591,7 +589,7 @@ class SlideController(QtGui.QWidget): Receiver.send_message(u'%s_start' % serviceItem.name.lower(), [serviceItem, self.isLive, self.hideMode(), slideno]) self.slideList = {} - width = self.parent.controlSplitter.sizes()[self.split] + width = self.parent().controlSplitter.sizes()[self.split] self.previewListWidget.clear() self.previewListWidget.setRowCount(0) self.previewListWidget.setColumnWidth(0, width) @@ -625,8 +623,8 @@ class SlideController(QtGui.QWidget): label.setScaledContents(True) if self.serviceItem.is_command(): image = resize_image(frame[u'image'], - self.parent.renderer.width, - self.parent.renderer.height) + self.parent().renderer.width, + self.parent().renderer.height) else: # If current slide set background to image if framenumber == slideno: @@ -635,7 +633,7 @@ class SlideController(QtGui.QWidget): image = self.image_manager.get_image(frame[u'title']) label.setPixmap(QtGui.QPixmap.fromImage(image)) self.previewListWidget.setCellWidget(framenumber, 0, label) - slideHeight = width * self.parent.renderer.screen_ratio + slideHeight = width * self.parent().renderer.screen_ratio row += 1 text.append(unicode(row)) self.previewListWidget.setItem(framenumber, 0, item) @@ -736,7 +734,7 @@ class SlideController(QtGui.QWidget): """ log.debug(u'mainDisplaySetBackground live = %s' % self.isLive) display_type = QtCore.QSettings().value( - self.parent.generalSettingsSection + u'/screen blank', + self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'')).toString() if not self.display.primary: # Order done to handle initial conversion @@ -772,11 +770,11 @@ class SlideController(QtGui.QWidget): self.desktopScreen.setChecked(False) if checked: QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', + self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'blanked')) else: QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') + self.parent().generalSettingsSection + u'/screen blank') self.blankPlugin() self.updatePreview() @@ -793,11 +791,11 @@ class SlideController(QtGui.QWidget): self.desktopScreen.setChecked(False) if checked: QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', + self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'themed')) else: QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') + self.parent().generalSettingsSection + u'/screen blank') self.blankPlugin() self.updatePreview() @@ -814,11 +812,11 @@ class SlideController(QtGui.QWidget): self.desktopScreen.setChecked(checked) if checked: QtCore.QSettings().setValue( - self.parent.generalSettingsSection + u'/screen blank', + self.parent().generalSettingsSection + u'/screen blank', QtCore.QVariant(u'hidden')) else: QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') + self.parent().generalSettingsSection + u'/screen blank') self.hidePlugin(checked) self.updatePreview() @@ -956,8 +954,8 @@ class SlideController(QtGui.QWidget): else: row = self.previewListWidget.currentRow() + 1 if row == self.previewListWidget.rowCount(): - if QtCore.QSettings().value(self.parent.generalSettingsSection + - u'/enable slide loop', QtCore.QVariant(True)).toBool(): + if QtCore.QSettings().value(self.parent().generalSettingsSection + + u'/enable slide loop', QtCore.QVariant(True)).toBool(): row = 0 else: row = self.previewListWidget.rowCount() - 1 @@ -977,8 +975,8 @@ class SlideController(QtGui.QWidget): else: row = self.previewListWidget.currentRow() - 1 if row == -1: - if QtCore.QSettings().value(self.parent.generalSettingsSection + - u'/enable slide loop', QtCore.QVariant(True)).toBool(): + if QtCore.QSettings().value(self.parent().generalSettingsSection + + u'/enable slide loop', QtCore.QVariant(True)).toBool(): row = self.previewListWidget.rowCount() - 1 else: row = 0 @@ -1055,7 +1053,8 @@ class SlideController(QtGui.QWidget): From the preview display request the Item to be added to service """ if self.serviceItem: - self.parent.serviceManagerContents.addServiceItem(self.serviceItem) + self.parent().serviceManagerContents.addServiceItem( + self.serviceItem) def onGoLiveClick(self): """ @@ -1083,7 +1082,7 @@ class SlideController(QtGui.QWidget): Receiver.send_message('servicemanager_preview_live', u'%s:%s' % (self.serviceItem._uuid, row)) else: - self.parent.liveController.addServiceManagerItem( + self.parent().liveController.addServiceManagerItem( self.serviceItem, row) def onMediaStart(self, item): diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index 92db42723..1415c809c 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -42,7 +42,6 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): """ self.manager = plugin.manager self.plugin = plugin - self.parent = plugin.formparent self.item_id = None QtGui.QDialog.__init__(self, plugin.formparent) self.setupUi(self) diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index c55e76ef7..1d40d5dd3 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -40,8 +40,7 @@ class AlertsManager(QtCore.QObject): log.info(u'Alert Manager loaded') def __init__(self, parent): - QtCore.QObject.__init__(self) - self.parent = parent + QtCore.QObject.__init__(self, parent) self.screen = None self.timer_id = 0 self.alertList = [] @@ -85,8 +84,8 @@ class AlertsManager(QtCore.QObject): if len(self.alertList) == 0: return text = self.alertList.pop(0) - alertTab = self.parent.settings_tab - self.parent.liveController.display.alert(text) + alertTab = self.parent().settings_tab + self.parent().liveController.display.alert(text) # Check to see if we have a timer running. if self.timer_id == 0: self.timer_id = self.startTimer(int(alertTab.timeout) * 1000) @@ -101,7 +100,7 @@ class AlertsManager(QtCore.QObject): """ log.debug(u'timer event') if event.timerId() == self.timer_id: - self.parent.liveController.display.alert(u'') + self.parent().liveController.display.alert(u'') self.killTimer(self.timer_id) self.timer_id = 0 self.generateAlert() diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 313e6258f..29acb73f4 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -99,7 +99,7 @@ class PresentationPlugin(Plugin): Create the Media Manager List """ return PresentationMediaItem( - self.mediadock, self, self.icon, self.controllers) + self.mediadock.media_dock, self, self.icon, self.controllers) def registerControllers(self, controller): """ diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index c942e2daa..a958f180f 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -648,7 +648,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): text = unicode(self.songBookComboBox.currentText()) if item == 0 and text: temp_song_book = text - self.parent.song_maintenance_form.exec_() + self.parent().song_maintenance_form.exec_() self.loadAuthors() self.loadBooks() self.loadTopics() @@ -754,7 +754,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.song.topics.append(self.manager.get_object(Topic, topicId)) clean_song(self.manager, self.song) self.manager.save_object(self.song) - self.parent.auto_select_id = self.song.id + self.parent().auto_select_id = self.song.id def _processLyrics(self): """ From 147c41e16f6e07698e3f363cf68111692573f1c3 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 28 May 2011 20:38:19 +0100 Subject: [PATCH 100/124] Fix a couple of parents so the form opens in the right place --- openlp/plugins/custom/forms/editcustomform.py | 5 +++-- openlp/plugins/custom/lib/mediaitem.py | 3 ++- openlp/plugins/songs/forms/editsongform.py | 9 +++++---- openlp/plugins/songs/lib/mediaitem.py | 3 ++- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 26a25e12a..054d6dbeb 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -43,12 +43,13 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): Class documentation goes here. """ log.info(u'Custom Editor loaded') - def __init__(self, parent, manager): + def __init__(self, mediaitem, parent, manager): """ Constructor """ QtGui.QDialog.__init__(self, parent) self.manager = manager + self.mediaitem = mediaitem self.setupUi(self) # Create other objects and forms. self.editSlideForm = EditCustomSlideForm(self) @@ -136,7 +137,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): self.customSlide.credits = unicode(self.creditEdit.text()) self.customSlide.theme_name = unicode(self.themeComboBox.currentText()) success = self.manager.save_object(self.customSlide) - self.parent().auto_select_id = self.customSlide.id + self.mediaitem().auto_select_id = self.customSlide.id return success def onUpButtonClicked(self): diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 2ae3ff85f..0398d8fa2 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -58,7 +58,8 @@ class CustomMediaItem(MediaManagerItem): def __init__(self, parent, plugin, icon): self.IconPath = u'custom/custom' MediaManagerItem.__init__(self, parent, plugin, icon) - self.edit_custom_form = EditCustomForm(self, self.plugin.manager) + self.edit_custom_form = EditCustomForm(self, self.plugin.formparent, + self.plugin.manager) self.singleServiceItem = False self.quickPreviewAllowed = True self.hasSearch = True diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index a958f180f..c8c351509 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -47,11 +47,12 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): """ log.info(u'%s EditSongForm loaded', __name__) - def __init__(self, parent, manager): + def __init__(self, mediaitem, parent, manager): """ Constructor """ QtGui.QDialog.__init__(self, parent) + self.mediaitem = mediaitem self.song = None # can this be automated? self.width = 400 @@ -89,7 +90,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.onVerseListViewPressed) QtCore.QObject.connect(self.themeAddButton, QtCore.SIGNAL(u'clicked()'), - self.parent().plugin.renderer.theme_manager.onAddTheme) + self.mediaitem.plugin.renderer.theme_manager.onAddTheme) QtCore.QObject.connect(self.maintenanceButton, QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked) QtCore.QObject.connect(Receiver.get_receiver(), @@ -648,7 +649,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): text = unicode(self.songBookComboBox.currentText()) if item == 0 and text: temp_song_book = text - self.parent().song_maintenance_form.exec_() + self.mediaitem.song_maintenance_form.exec_() self.loadAuthors() self.loadBooks() self.loadTopics() @@ -754,7 +755,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.song.topics.append(self.manager.get_object(Topic, topicId)) clean_song(self.manager, self.song) self.manager.save_object(self.song) - self.parent().auto_select_id = self.song.id + self.mediaitem.auto_select_id = self.song.id def _processLyrics(self): """ diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 9ced6179b..02108a846 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -63,7 +63,8 @@ class SongMediaItem(MediaManagerItem): def __init__(self, parent, plugin, icon): self.IconPath = u'songs/song' MediaManagerItem.__init__(self, parent, plugin, icon) - self.edit_song_form = EditSongForm(self, self.plugin.manager) + self.edit_song_form = EditSongForm(self, self.plugin.formparent, + self.plugin.manager) self.openLyrics = OpenLyrics(self.plugin.manager) self.singleServiceItem = False self.song_maintenance_form = SongMaintenanceForm( From ddf11d468157fd1084e8b2910a825b44de24f313 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 28 May 2011 21:12:32 +0100 Subject: [PATCH 101/124] Live dangerously, and pass parent None to MainDisplay --- openlp/core/ui/maindisplay.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 763b9bc8b..715bb3b5b 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -49,9 +49,7 @@ class MainDisplay(QtGui.QGraphicsView): This is the display screen. """ def __init__(self, parent, image_manager, live): - QtGui.QGraphicsView.__init__(self) - if parent: - self.setParent(parent) + QtGui.QGraphicsView.__init__(self, parent) self.isLive = live self.image_manager = image_manager self.screens = ScreenList.get_instance() From 382e2f11c84829940b1956b1dd4e1d8a28a1e08f Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 28 May 2011 22:26:55 +0200 Subject: [PATCH 102/124] Added a simple file to point users to the online manual. This is necessary for the Debian and Ubuntu builds. --- documentation/manual.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 documentation/manual.txt diff --git a/documentation/manual.txt b/documentation/manual.txt new file mode 100644 index 000000000..55a3f7d98 --- /dev/null +++ b/documentation/manual.txt @@ -0,0 +1,7 @@ +OpenLP Manual +============= + +If you're reading this file, you're probably looking for the OpenLP manual. The +manual is hosted online at http://manual.openlp.org/. If you want to help with +the manual, contact the OpenLP team via IRC in the #openlp.org channel on the +Freenode network. From 81fca6bedb8e284bec07317afebd8fc71ed7b481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sat, 28 May 2011 23:01:27 +0200 Subject: [PATCH 103/124] change layout of backup page change some strings --- .../plugins/bibles/forms/bibleupgradeform.py | 54 +++++++++++-------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/openlp/plugins/bibles/forms/bibleupgradeform.py b/openlp/plugins/bibles/forms/bibleupgradeform.py index 00623fbce..0fdcdfd11 100644 --- a/openlp/plugins/bibles/forms/bibleupgradeform.py +++ b/openlp/plugins/bibles/forms/bibleupgradeform.py @@ -147,6 +147,13 @@ class BibleUpgradeForm(OpenLPWizard): SettingsManager.set_last_dir(self.plugin.settingsSection, filename, 1) + def onNoBackupCheckBoxToggled(self, checked): + """ + Enable or disable the backup directory widgets. + """ + self.backupDirectoryEdit.setEnabled(not checked) + self.backupBrowseButton.setEnabled(not checked) + def backupOldBibles(self, backupdirectory): """ Backup old bible databases in a given folder. @@ -173,7 +180,9 @@ class BibleUpgradeForm(OpenLPWizard): QtCore.QObject.connect(self.finishButton, QtCore.SIGNAL(u'clicked()'), self.onFinishButton) QtCore.QObject.connect(self.backupBrowseButton, - QtCore.SIGNAL(u'clicked()'), self.onBackupBrowseButtonClicked) + QtCore.SIGNAL(u'clicked()'), self.onBackupBrowseButtonClicked) + QtCore.QObject.connect(self.noBackupCheckBox, + QtCore.SIGNAL(u'toggled(bool)'), self.onNoBackupCheckBoxToggled) def addCustomPages(self): """ @@ -185,9 +194,14 @@ class BibleUpgradeForm(OpenLPWizard): self.backupLayout = QtGui.QVBoxLayout(self.backupPage) self.backupLayout.setObjectName(u'BackupLayout') self.backupInfoLabel = QtGui.QLabel(self.backupPage) - self.backupInfoLabel.setObjectName(u'backupInfoLabel') + self.backupInfoLabel.setOpenExternalLinks(True) + self.backupInfoLabel.setTextFormat(QtCore.Qt.RichText) self.backupInfoLabel.setWordWrap(True) + self.backupInfoLabel.setObjectName(u'backupInfoLabel') self.backupLayout.addWidget(self.backupInfoLabel) + self.selectLabel = QtGui.QLabel(self.backupPage) + self.selectLabel.setObjectName(u'selectLabel') + self.backupLayout.addWidget(self.selectLabel) self.formLayout = QtGui.QFormLayout() self.formLayout.setMargin(0) self.formLayout.setObjectName(u'FormLayout') @@ -205,11 +219,6 @@ class BibleUpgradeForm(OpenLPWizard): self.formLayout.addRow(self.backupDirectoryLabel, self.backupDirectoryLayout) self.backupLayout.addLayout(self.formLayout) - self.backupAdditionalInfoLabel = QtGui.QLabel(self.backupPage) - self.backupAdditionalInfoLabel.setObjectName( - u'BackupAdditionalInfoLabel') - self.backupAdditionalInfoLabel.setWordWrap(True) - self.backupLayout.addWidget(self.backupAdditionalInfoLabel) self.noBackupCheckBox = QtGui.QCheckBox(self.backupPage) self.noBackupCheckBox.setObjectName('NoBackupCheckBox') self.backupLayout.addWidget(self.noBackupCheckBox) @@ -356,25 +365,24 @@ class BibleUpgradeForm(OpenLPWizard): translate('BiblesPlugin.UpgradeWizardForm', 'This wizard will help you to upgrade your existing Bibles from a ' 'prior version of OpenLP 2. Click the next button below to start ' - 'the process by selecting the Bibles to upgrade.')) + 'the upgrade process.')) self.backupPage.setTitle( translate('BiblesPlugin.UpgradeWizardForm', 'Select Backup Directory')) self.backupPage.setSubTitle( translate('BiblesPlugin.UpgradeWizardForm', - 'Please select a Directory for Backup your old Bibles')) + 'Please select a backup directory for your Bibles')) self.backupInfoLabel.setText(translate('BiblesPlugin.UpgradeWizardForm', - 'The Bible upgrade procedure will prevent you running older ' - 'versions of OpenLP. \nPlease select a backup location for your ' - 'existing Bibles.')) + 'Previous releases of OpenLP 2.0 are unable to use upgraded Bibles.' + ' This will create a backup of your current Bibles so that you can ' + 'simply copy the files back to your OpenLP data directory if you ' + 'need to revert to a previous release of OpenLP. Instructions on ' + 'how to restore the files can be found in our Frequently Asked Questions.')) + self.selectLabel.setText(translate('BiblesPlugin.UpgradeWizardForm', + 'Please select a backup location for your Bibles.')) self.backupDirectoryLabel.setText( translate('BiblesPlugin.UpgradeWizardForm', 'Backup Directory:')) - self.backupAdditionalInfoLabel.setText( - translate('BiblesPlugin.UpgradeWizardForm', - 'These Bibles can copied back to your OpenLP data folder should ' - 'you need to revert to a previous version. Instructions on how ' - 'to restore the files can be found on our FAQ ' - 'at http://wiki.openlp.org/faq')) self.noBackupCheckBox.setText( translate('BiblesPlugin.UpgradeWizardForm', 'There is no need to backup my Bibles')) @@ -749,21 +757,21 @@ class BibleUpgradeForm(OpenLPWizard): if failed_import > 0: failed_import_text = unicode(translate( 'BiblesPlugin.UpgradeWizardForm', - ' - %s upgrade fail')) % failed_import + ', %s failed')) % failed_import else: failed_import_text = u'' if successful_import > 0: if include_webbible: self.progressLabel.setText(unicode( - translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade %s ' - 'Bible(s) successful%s.\nPlease note, that verses from ' + translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading ' + 'Bible(s): %s successful%s\nPlease note, that verses from ' 'Web Bibles will be downloaded\non demand and so an ' 'Internet connection is required.')) % (successful_import, failed_import_text)) else: self.progressLabel.setText(unicode( - translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade %s ' - 'Bible(s) successful.%s')) % (successful_import, + translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading ' + 'Bible(s): %s successful%s')) % (successful_import, failed_import_text)) else: self.progressLabel.setText( From 975dd3cb00854537feb7f20d67c3958e90ccdc4e Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 28 May 2011 22:23:07 +0100 Subject: [PATCH 104/124] mediaitem() -> mediaitem --- openlp/plugins/custom/forms/editcustomform.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index 054d6dbeb..5c9c035b7 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -137,7 +137,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): self.customSlide.credits = unicode(self.creditEdit.text()) self.customSlide.theme_name = unicode(self.themeComboBox.currentText()) success = self.manager.save_object(self.customSlide) - self.mediaitem().auto_select_id = self.customSlide.id + self.mediaitem.auto_select_id = self.customSlide.id return success def onUpButtonClicked(self): From b56f93aad5e21ba4c0e3fcc60714d002fdc8c6aa Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 29 May 2011 08:23:12 +0200 Subject: [PATCH 105/124] camelCase fixes and shortcut fixes --- openlp/core/ui/mainwindow.py | 2 +- openlp/plugins/songusage/songusageplugin.py | 76 ++++++++++----------- 2 files changed, 38 insertions(+), 40 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 82f1b9253..3ebb34b8c 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -179,7 +179,7 @@ class Ui_MainWindow(object): u'printServiceItem', [QtGui.QKeySequence(u'Ctrl+P')], self.serviceManagerContents.printServiceOrder, category=UiStrings().File) - self.fileExitItem = shortcut_action(mainWindow, u'FileExitItem', + self.fileExitItem = shortcut_action(mainWindow, u'fileExitItem', [QtGui.QKeySequence(u'Alt+F4')], mainWindow.close, u':/system/system_exit.png', category=UiStrings().File) action_list.add_category(UiStrings().Import, CategoryOrder.standardMenu) diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index 7d05e0add..9a4f6910f 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -62,44 +62,44 @@ class SongUsagePlugin(Plugin): """ log.info(u'add tools menu') self.toolsMenu = tools_menu - self.SongUsageMenu = QtGui.QMenu(tools_menu) - self.SongUsageMenu.setObjectName(u'SongUsageMenu') - self.SongUsageMenu.setTitle(translate( + self.songUsageMenu = QtGui.QMenu(tools_menu) + self.songUsageMenu.setObjectName(u'songUsageMenu') + self.songUsageMenu.setTitle(translate( 'SongUsagePlugin', '&Song Usage Tracking')) # SongUsage Delete - self.SongUsageDelete = base_action(tools_menu, u'SongUsageDelete') - self.SongUsageDelete.setText(translate('SongUsagePlugin', + self.songUsageDelete = base_action(tools_menu, u'songUsageDelete') + self.songUsageDelete.setText(translate('SongUsagePlugin', '&Delete Tracking Data')) - self.SongUsageDelete.setStatusTip(translate('SongUsagePlugin', + self.songUsageDelete.setStatusTip(translate('SongUsagePlugin', 'Delete song usage data up to a specified date.')) # SongUsage Report - self.SongUsageReport = base_action(tools_menu, u'SongUsageReport') - self.SongUsageReport.setText( + self.songUsageReport = base_action(tools_menu, u'songUsageReport') + self.songUsageReport.setText( translate('SongUsagePlugin', '&Extract Tracking Data')) - self.SongUsageReport.setStatusTip( + self.songUsageReport.setStatusTip( translate('SongUsagePlugin', 'Generate a report on song usage.')) # SongUsage activation - self.SongUsageStatus = shortcut_action(tools_menu, u'SongUsageStatus', + self.songUsageStatus = shortcut_action(tools_menu, u'songUsageStatus', [QtCore.Qt.Key_F4], self.toggleSongUsageState, checked=False) - self.SongUsageStatus.setText(translate( + self.songUsageStatus.setText(translate( 'SongUsagePlugin', 'Toggle Tracking')) - self.SongUsageStatus.setStatusTip(translate('SongUsagePlugin', + self.songUsageStatus.setStatusTip(translate('SongUsagePlugin', 'Toggle the tracking of song usage.')) #Add Menus together - self.toolsMenu.addAction(self.SongUsageMenu.menuAction()) - self.SongUsageMenu.addAction(self.SongUsageStatus) - self.SongUsageMenu.addSeparator() - self.SongUsageMenu.addAction(self.SongUsageDelete) - self.SongUsageMenu.addAction(self.SongUsageReport) + self.toolsMenu.addAction(self.songUsageMenu.menuAction()) + self.songUsageMenu.addAction(self.songUsageStatus) + self.songUsageMenu.addSeparator() + self.songUsageMenu.addAction(self.songUsageDelete) + self.songUsageMenu.addAction(self.songUsageReport) # Signals and slots - QtCore.QObject.connect(self.SongUsageStatus, + QtCore.QObject.connect(self.songUsageStatus, QtCore.SIGNAL(u'visibilityChanged(bool)'), - self.SongUsageStatus.setChecked) - QtCore.QObject.connect(self.SongUsageDelete, + self.songUsageStatus.setChecked) + QtCore.QObject.connect(self.songUsageDelete, QtCore.SIGNAL(u'triggered()'), self.onSongUsageDelete) - QtCore.QObject.connect(self.SongUsageReport, + QtCore.QObject.connect(self.songUsageReport, QtCore.SIGNAL(u'triggered()'), self.onSongUsageReport) - self.SongUsageMenu.menuAction().setVisible(False) + self.songUsageMenu.menuAction().setVisible(False) def initialise(self): log.info(u'SongUsage Initialising') @@ -110,20 +110,20 @@ class SongUsagePlugin(Plugin): self.SongUsageActive = QtCore.QSettings().value( self.settingsSection + u'/active', QtCore.QVariant(False)).toBool() - self.SongUsageStatus.setChecked(self.SongUsageActive) + self.songUsageStatus.setChecked(self.SongUsageActive) action_list = ActionList.get_instance() - action_list.add_action(self.SongUsageDelete, + action_list.add_action(self.songUsageDelete, translate('SongUsagePlugin', 'Song Usage')) - action_list.add_action(self.SongUsageReport, + action_list.add_action(self.songUsageReport, translate('SongUsagePlugin', 'Song Usage')) - action_list.add_action(self.SongUsageStatus, + action_list.add_action(self.songUsageStatus, translate('SongUsagePlugin', 'Song Usage')) if self.manager is None: self.manager = Manager(u'songusage', init_schema) - self.SongUsagedeleteform = SongUsageDeleteForm(self.manager, + self.songUsageDeleteForm = SongUsageDeleteForm(self.manager, self.formparent) - self.SongUsagedetailform = SongUsageDetailForm(self, self.formparent) - self.SongUsageMenu.menuAction().setVisible(True) + self.songUsageDetailForm = SongUsageDetailForm(self, self.formparent) + self.songUsageMenu.menuAction().setVisible(True) def finalise(self): """ @@ -132,13 +132,13 @@ class SongUsagePlugin(Plugin): log.info(u'Plugin Finalise') self.manager.finalise() Plugin.finalise(self) - self.SongUsageMenu.menuAction().setVisible(False) + self.songUsageMenu.menuAction().setVisible(False) action_list = ActionList.get_instance() - action_list.remove_action(self.SongUsageDelete, + action_list.remove_action(self.songUsageDelete, translate('SongUsagePlugin', 'Song Usage')) - action_list.remove_action(self.SongUsageReport, + action_list.remove_action(self.songUsageReport, translate('SongUsagePlugin', 'Song Usage')) - action_list.remove_action(self.SongUsageStatus, + action_list.remove_action(self.songUsageStatus, translate('SongUsagePlugin', 'Song Usage')) #stop any events being processed self.SongUsageActive = False @@ -160,17 +160,15 @@ class SongUsagePlugin(Plugin): song_usage_item.title = audit[0] song_usage_item.copyright = audit[2] song_usage_item.ccl_number = audit[3] - song_usage_item.authors = u'' - for author in audit[1]: - song_usage_item.authors += author + u' ' + song_usage_item.authors = u' '.join(audit[1]) self.manager.save_object(song_usage_item) def onSongUsageDelete(self): - self.SongUsagedeleteform.exec_() + self.songUsageDeleteForm.exec_() def onSongUsageReport(self): - self.SongUsagedetailform.initialise() - self.SongUsagedetailform.exec_() + self.songUsageDetailForm.initialise() + self.songUsageDetailForm.exec_() def about(self): about_text = translate('SongUsagePlugin', 'SongUsage Plugin' From 22ad88d3ee36c284e67d0d9dd35729bd4a9606e4 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 29 May 2011 08:26:14 +0200 Subject: [PATCH 107/124] fix for bug #789618 Fixes: https://launchpad.net/bugs/789618 --- openlp/core/ui/printserviceform.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index 09ae8857f..b1147731b 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -56,7 +56,9 @@ http://doc.trolltech.com/4.7/richtext-html-subset.html#css-properties font-size:large; } -.itemText {} +.itemText { + margin-top:10px; +} .itemFooter { font-size:8px; @@ -85,7 +87,7 @@ http://doc.trolltech.com/4.7/richtext-html-subset.html#css-properties .imageList {} .customNotes { - margin-top: 10px; + margin-top:10px; } .customNotesTitle { @@ -212,11 +214,11 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): verse_def = None for slide in item.get_frames(): if not verse_def or verse_def != slide[u'verseTag']: - p = self._addElement(u'div', parent=div, + text_div = self._addElement(u'div', parent=div, classId=u'itemText') else: - self._addElement(u'br', parent=p) - self._addElement(u'p', slide[u'html'], p) + self._addElement(u'br', parent=text_div) + self._addElement(u'span', slide[u'html'], text_div) verse_def = slide[u'verseTag'] # Break the page before the div element. if index != 0 and self.pageBreakAfterText.isChecked(): From a8ea8d668a5067af5f2b975f0ba5545811e3e028 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Sun, 29 May 2011 21:32:37 +0200 Subject: [PATCH 108/124] correct indent --- openlp/plugins/bibles/lib/manager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 2cbd2f919..2a3858afc 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -219,9 +219,9 @@ class BibleManager(object): log.debug(u'BibleManager.get_books("%s")', bible) return [ { - u'name': book.name, - u'book_reference_id': book.book_reference_id, - u'chapters': self.db_cache[bible].get_chapter_count(book) + u'name': book.name, + u'book_reference_id': book.book_reference_id, + u'chapters': self.db_cache[bible].get_chapter_count(book) } for book in self.db_cache[bible].get_books() ] From 9cd536e137585ca2c90339effb3c3b3379ad71f1 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sun, 29 May 2011 21:46:13 +0100 Subject: [PATCH 109/124] Fix the parent that whydoubt sneaked in --- openlp/core/ui/slidecontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 6de04a64d..a59f00f21 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -199,7 +199,7 @@ class SlideController(QtGui.QWidget): u':/media/media_time.png', False, UiStrings().LiveToolbar) self.playSlidesOnce.setText( translate('OpenLP.SlideController', 'Play Slides to End')) - if QtCore.QSettings().value(self.parent.generalSettingsSection + + if QtCore.QSettings().value(self.parent().generalSettingsSection + u'/enable slide loop', QtCore.QVariant(True)).toBool(): self.playSlidesMenu.setDefaultAction(self.playSlidesLoop) else: From 0a2d97021cf97e04336fd271d33b0f2002ef70fc Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 30 May 2011 07:03:46 +0200 Subject: [PATCH 110/124] added spaces --- openlp/core/ui/printserviceform.py | 36 +++++++++++++++--------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/openlp/core/ui/printserviceform.py b/openlp/core/ui/printserviceform.py index b1147731b..ccd1eb18c 100644 --- a/openlp/core/ui/printserviceform.py +++ b/openlp/core/ui/printserviceform.py @@ -42,44 +42,44 @@ http://doc.trolltech.com/4.7/richtext-html-subset.html#css-properties */ .serviceTitle { - font-weight:600; - font-size:x-large; - color:black; + font-weight: 600; + font-size: x-large; + color: black; } .item { - color:black; + color: black; } .itemTitle { - font-weight:600; - font-size:large; + font-weight: 600; + font-size: large; } .itemText { - margin-top:10px; + margin-top: 10px; } .itemFooter { - font-size:8px; + font-size: 8px; } .itemNotes {} .itemNotesTitle { - font-weight:bold; - font-size:12px; + font-weight: bold; + font-size: 12px; } .itemNotesText { - font-size:11px; + font-size: 11px; } .media {} .mediaTitle { - font-weight:bold; - font-size:11px; + font-weight: bold; + font-size: 11px; } .mediaText {} @@ -87,20 +87,20 @@ http://doc.trolltech.com/4.7/richtext-html-subset.html#css-properties .imageList {} .customNotes { - margin-top:10px; + margin-top: 10px; } .customNotesTitle { - font-weight:bold; - font-size:11px; + font-weight: bold; + font-size: 11px; } .customNotesText { - font-size:11px; + font-size: 11px; } .newPage { - page-break-before:always; + page-break-before: always; } """ From 30ec309ff8550cab242331aabcaf2f27cfbd7ff6 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 30 May 2011 08:45:58 +0200 Subject: [PATCH 111/124] Fixed up various index errors on InnoDB tables. --- openlp/plugins/songs/lib/db.py | 27 +++------------------------ 1 file changed, 3 insertions(+), 24 deletions(-) diff --git a/openlp/plugins/songs/lib/db.py b/openlp/plugins/songs/lib/db.py index ced98537e..9a332e994 100644 --- a/openlp/plugins/songs/lib/db.py +++ b/openlp/plugins/songs/lib/db.py @@ -165,7 +165,7 @@ def init_schema(url): Column(u'id', types.Integer, primary_key=True), Column(u'first_name', types.Unicode(128)), Column(u'last_name', types.Unicode(128)), - Column(u'display_name', types.Unicode(255), nullable=False) + Column(u'display_name', types.Unicode(255), index=True, nullable=False) ) # Definition of the "media_files" table @@ -186,7 +186,7 @@ def init_schema(url): songs_table = Table(u'songs', metadata, Column(u'id', types.Integer, primary_key=True), Column(u'song_book_id', types.Integer, - ForeignKey(u'song_books.id'), default=0), + ForeignKey(u'song_books.id'), default=None), Column(u'title', types.Unicode(255), nullable=False), Column(u'alternate_title', types.Unicode(255)), Column(u'lyrics', types.UnicodeText, nullable=False), @@ -203,7 +203,7 @@ def init_schema(url): # Definition of the "topics" table topics_table = Table(u'topics', metadata, Column(u'id', types.Integer, primary_key=True), - Column(u'name', types.Unicode(128), nullable=False) + Column(u'name', types.Unicode(128), index=True, nullable=False) ) # Definition of the "authors_songs" table @@ -230,27 +230,6 @@ def init_schema(url): ForeignKey(u'topics.id'), primary_key=True) ) - # Define table indexes - Index(u'authors_id', authors_table.c.id) - Index(u'authors_display_name_id', authors_table.c.display_name, - authors_table.c.id) - Index(u'media_files_id', media_files_table.c.id) - Index(u'song_books_id', song_books_table.c.id) - Index(u'songs_id', songs_table.c.id) - Index(u'topics_id', topics_table.c.id) - Index(u'authors_songs_author', authors_songs_table.c.author_id, - authors_songs_table.c.song_id) - Index(u'authors_songs_song', authors_songs_table.c.song_id, - authors_songs_table.c.author_id) - Index(u'media_files_songs_file', media_files_songs_table.c.media_file_id, - media_files_songs_table.c.song_id) - Index(u'media_files_songs_song', media_files_songs_table.c.song_id, - media_files_songs_table.c.media_file_id) - Index(u'topics_song_topic', songs_topics_table.c.topic_id, - songs_topics_table.c.song_id) - Index(u'topics_song_song', songs_topics_table.c.song_id, - songs_topics_table.c.topic_id) - mapper(Author, authors_table) mapper(Book, song_books_table) mapper(MediaFile, media_files_table) From 99ae60aba318fc9b50bcaa1552ccac61cae593a4 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Mon, 30 May 2011 13:17:23 +0200 Subject: [PATCH 112/124] Fixed up loading a song from a service. --- openlp/plugins/songs/lib/mediaitem.py | 1 + openlp/plugins/songs/lib/xml.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 3d9a9ef76..65e2289cd 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -27,6 +27,7 @@ import logging import locale +import re from PyQt4 import QtCore, QtGui from sqlalchemy.sql import or_ diff --git a/openlp/plugins/songs/lib/xml.py b/openlp/plugins/songs/lib/xml.py index 7bcf56aa1..f5ec28103 100644 --- a/openlp/plugins/songs/lib/xml.py +++ b/openlp/plugins/songs/lib/xml.py @@ -514,7 +514,7 @@ class OpenLyrics(object): ``song`` The song object. """ - song.song_book_id = 0 + song.song_book_id = None song.song_number = u'' if hasattr(properties, u'songbooks'): for songbook in properties.songbooks.songbook: From ed3a608b8da9c5f3093f55b7cdc7054871e42dce Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 30 May 2011 17:07:49 +0200 Subject: [PATCH 114/124] fixed tag deletion (bug #789929 Fixes: https://launchpad.net/bugs/789929 --- openlp/core/ui/displaytagform.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/openlp/core/ui/displaytagform.py b/openlp/core/ui/displaytagform.py index 6aaddf2b8..4b25f851a 100644 --- a/openlp/core/ui/displaytagform.py +++ b/openlp/core/ui/displaytagform.py @@ -147,6 +147,7 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): DisplayTags.remove_html_tag(self.selected) self.selected = -1 self._resetTable() + self._saveTable() def onSavedPushed(self): """ @@ -171,14 +172,19 @@ class DisplayTagForm(QtGui.QDialog, Ui_DisplayTagDialog): html[u'end tag'] = u'{/%s}' % tag self.selected = -1 self._resetTable() - temp = [] + self._saveTable() + + def _saveTable(self): + """ + Saves all display tags except protected ones. + """ + tags = [] for tag in DisplayTags.get_html_tags(): if not tag[u'protected']: - temp.append(tag) - if temp: - ctemp = cPickle.dumps(temp) + tags.append(tag) + if tags: QtCore.QSettings().setValue(u'displayTags/html_tags', - QtCore.QVariant(ctemp)) + QtCore.QVariant(cPickle.dumps(tags))) else: QtCore.QSettings().setValue(u'displayTags/html_tags', QtCore.QVariant(u'')) From 27b8ec3deba4fc948d29c3c9daec37cf442c59d1 Mon Sep 17 00:00:00 2001 From: Gerald Britton Date: Mon, 30 May 2011 15:19:16 -0400 Subject: [PATCH 115/124] Add exception logging to import.py --- openlp/plugins/songs/lib/importer.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/openlp/plugins/songs/lib/importer.py b/openlp/plugins/songs/lib/importer.py index cf2d3f536..fffc0f4f8 100644 --- a/openlp/plugins/songs/lib/importer.py +++ b/openlp/plugins/songs/lib/importer.py @@ -38,20 +38,25 @@ from songbeamerimport import SongBeamerImport from songshowplusimport import SongShowPlusImport from foilpresenterimport import FoilPresenterImport # Imports that might fail +import logging +log = logging.getLogger(__name__) try: from olp1import import OpenLP1SongImport HAS_OPENLP1 = True except ImportError: + log.exception('Error importing %s', 'OpenLP1SongImport') HAS_OPENLP1 = False try: from sofimport import SofImport HAS_SOF = True except ImportError: + log.exception('Error importing %s', 'SofImport') HAS_SOF = False try: from oooimport import OooImport HAS_OOO = True except ImportError: + log.exception('Error importing %s', 'OooImport') HAS_OOO = False class SongFormat(object): From ab3896ce6fd431de6ac946ae5b4a416ec4e44e9b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Armin=20K=C3=B6hler?= Date: Mon, 30 May 2011 21:41:02 +0200 Subject: [PATCH 116/124] removed unnecessary code --- openlp/plugins/bibles/lib/mediaitem.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 2ade16e6d..d6911b936 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -534,8 +534,6 @@ class BibleMediaItem(MediaManagerItem): unicode(self.advancedVersionComboBox.currentText())) def onAdvancedSecondComboBox(self): - QtCore.QSettings().setValue(self.settingsSection + u'/advanced bible', - QtCore.QVariant(self.advancedVersionComboBox.currentText())) self.initialiseAdvancedBible( unicode(self.advancedVersionComboBox.currentText())) From 934a70b9555339539757bc97c78f10fc8d5ec3d3 Mon Sep 17 00:00:00 2001 From: Gerald Britton Date: Mon, 30 May 2011 16:14:36 -0400 Subject: [PATCH 117/124] Relocate import logging statement --- openlp/plugins/songs/lib/importer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/songs/lib/importer.py b/openlp/plugins/songs/lib/importer.py index fffc0f4f8..ab92033c4 100644 --- a/openlp/plugins/songs/lib/importer.py +++ b/openlp/plugins/songs/lib/importer.py @@ -27,6 +27,7 @@ """ The :mod:`importer` modules provides the general song import functionality. """ +import logging from opensongimport import OpenSongImport from easislidesimport import EasiSlidesImport from olpimport import OpenLPSongImport @@ -38,7 +39,6 @@ from songbeamerimport import SongBeamerImport from songshowplusimport import SongShowPlusImport from foilpresenterimport import FoilPresenterImport # Imports that might fail -import logging log = logging.getLogger(__name__) try: from olp1import import OpenLP1SongImport From ee151cde2a7bd04b574c6892432b33e2873b71bc Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 31 May 2011 12:59:05 +0200 Subject: [PATCH 118/124] Fixed bug #790382 by using the Mako template engine to pass Python variables into the template. --- openlp/plugins/remotes/html/index.html | 60 ++++++++++++------------ openlp/plugins/remotes/html/stage.html | 4 +- openlp/plugins/remotes/lib/httpserver.py | 38 +++++++++++++-- 3 files changed, 65 insertions(+), 37 deletions(-) diff --git a/openlp/plugins/remotes/html/index.html b/openlp/plugins/remotes/html/index.html index 6390b9446..b370d589e 100644 --- a/openlp/plugins/remotes/html/index.html +++ b/openlp/plugins/remotes/html/index.html @@ -27,7 +27,7 @@ --> - OpenLP 2.0 Remote + ${app_title} @@ -37,81 +37,81 @@
- Back -

Service Manager

- Refresh + ${back} +

${service_manager}

+ ${refresh}
- Back -

Slide Controller

- Refresh + ${back} +

${slide_controller}

+ ${refresh}
- Back -

Alerts

+ ${back} +

${alerts}

- +
- Show Alert + ${show_alert}
- + \ No newline at end of file diff --git a/openlp/plugins/remotes/html/stage.html b/openlp/plugins/remotes/html/stage.html index b67f0ccd6..c002ea68b 100644 --- a/openlp/plugins/remotes/html/stage.html +++ b/openlp/plugins/remotes/html/stage.html @@ -6,8 +6,8 @@ # --------------------------------------------------------------------------- # # Copyright (c) 2008-2011 Raoul Snyman # # Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Khler, # -# Andreas Preikschat, Mattias Pldaru, Christian Richter, Philip Ridout, # +# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # +# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # # Jeffrey Smith, Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode # # Woldsund # # --------------------------------------------------------------------------- # diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 9d29156f7..d9cae42d0 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -115,7 +115,6 @@ import logging import os import urlparse import re -from pprint import pformat try: import json @@ -123,10 +122,11 @@ except ImportError: import simplejson as json from PyQt4 import QtCore, QtNetwork +from mako.template import Template from openlp.core.lib import Receiver, PluginStatus from openlp.core.ui import HideMode -from openlp.core.utils import AppLocation +from openlp.core.utils import AppLocation, translate log = logging.getLogger(__name__) @@ -261,6 +261,7 @@ class HttpConnection(object): self.ready_read) QtCore.QObject.connect(self.socket, QtCore.SIGNAL(u'disconnected()'), self.disconnected) + self.translate() def _get_service_items(self): service_items = [] @@ -280,6 +281,27 @@ class HttpConnection(object): }) return service_items + def translate(self): + """ + Translate various strings in the mobile app. + """ + self.template_vars = { + 'app_title': translate('RemotePlugin.Mobile', 'OpenLP 2.0 Remote'), + 'stage_title': translate('RemotePlugin.Mobile', 'OpenLP 2.0 Stage View'), + 'service_manager': translate('RemotePlugin.Mobile', 'Service Manager'), + 'slide_controller': translate('RemotePlugin.Mobile', 'Slide Controller'), + 'alerts': translate('RemotePlugin.Mobile', 'Alerts'), + 'search': translate('RemotePlugin.Mobile', 'Search'), + 'back': translate('RemotePlugin.Mobile', 'Back'), + 'refresh': translate('RemotePlugin.Mobile', 'Refresh'), + 'blank': translate('RemotePlugin.Mobile', 'Blank'), + 'show': translate('RemotePlugin.Mobile', 'Show'), + 'prev': translate('RemotePlugin.Mobile', 'Prev'), + 'next': translate('RemotePlugin.Mobile', 'Next'), + 'text': translate('RemotePlugin.Mobile', 'Text'), + 'show_alert': translate('RemotePlugin.Mobile', 'Show Alert') + } + def ready_read(self): """ Data has been sent from the client. Respond to it @@ -327,8 +349,11 @@ class HttpConnection(object): if not path.startswith(self.parent.html_dir): return HttpResponse(code=u'404 Not Found') ext = os.path.splitext(filename)[1] + html = None if ext == u'.html': mimetype = u'text/html' + variables = self.template_vars + html = Template(filename=path, input_encoding=u'utf-8', output_encoding=u'utf-8').render(**variables) elif ext == u'.css': mimetype = u'text/css' elif ext == u'.js': @@ -343,9 +368,12 @@ class HttpConnection(object): mimetype = u'text/plain' file_handle = None try: - file_handle = open(path, u'rb') - log.debug(u'Opened %s' % path) - content = file_handle.read() + if html: + content = html + else: + file_handle = open(path, u'rb') + log.debug(u'Opened %s' % path) + content = file_handle.read() except IOError: log.exception(u'Failed to open %s' % path) return HttpResponse(code=u'404 Not Found') From 9f7a96c31514b9dc31c6d766c95b611e3d321c6a Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Tue, 31 May 2011 13:25:35 +0200 Subject: [PATCH 119/124] Fixed up some missing translations. --- openlp/plugins/remotes/html/stage.html | 3 ++- openlp/plugins/remotes/html/stage.js | 12 ++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/openlp/plugins/remotes/html/stage.html b/openlp/plugins/remotes/html/stage.html index c002ea68b..c5d0872d0 100644 --- a/openlp/plugins/remotes/html/stage.html +++ b/openlp/plugins/remotes/html/stage.html @@ -27,12 +27,13 @@ --> - OpenLP 2.0 Stage View + ${stage_title} +