From 079d72f93fb86564a0c11c860095f04f431d124b Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Wed, 30 Jun 2010 23:05:51 +0100 Subject: [PATCH 01/33] Database refactoring --- openlp/core/lib/db.py | 19 ++- openlp/plugins/bibles/lib/db.py | 7 +- openlp/plugins/custom/customplugin.py | 3 +- openlp/plugins/songs/forms/songimportform.py | 2 +- openlp/plugins/songs/lib/__init__.py | 47 +++++++- openlp/plugins/songs/lib/manager.py | 116 ------------------- openlp/plugins/songs/lib/mediaitem.py | 15 ++- openlp/plugins/songs/lib/songimport.py | 12 +- openlp/plugins/songs/songsplugin.py | 11 +- 9 files changed, 84 insertions(+), 148 deletions(-) delete mode 100644 openlp/plugins/songs/lib/manager.py diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index b000fe918..a60521218 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -166,17 +166,17 @@ class Manager(object): else: return self.session.query(object_class).get(key) - def get_object_filtered(self, object_class, filter_string): + def get_object_filtered(self, object_class, filter_clause): """ Returns an object matching specified criteria ``object_class`` The type of object to return - ``filter_string`` + ``filter_clause`` The criteria to select the object by """ - return self.session.query(object_class).filter(filter_string).first() + return self.session.query(object_class).filter(filter_clause).first() def get_all_objects(self, object_class, order_by_ref=None): """ @@ -192,17 +192,24 @@ class Manager(object): return self.session.query(object_class).order_by(order_by_ref).all() return self.session.query(object_class).all() - def get_all_objects_filtered(self, object_class, filter_string): + def get_all_objects_filtered(self, object_class, filter_clause, + order_by_ref=None): """ Returns a selection of objects from the database ``object_class`` The type of objects to return - ``filter_string`` + ``filter_clause`` The filter governing selection of objects to return + + ``order_by_ref`` + Any parameters to order the returned objects by. Defaults to None. """ - return self.session.query(object_class).filter(filter_string).all() + if order_by_ref: + return self.session.query(object_class).filter(filter_clause) \ + .order_by(order_by_ref).all() + return self.session.query(object_class).filter(filter_clause).all() def delete_object(self, object_class, key): """ diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index c799d71dd..a453d5bcc 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -299,11 +299,10 @@ class BibleDB(QtCore.QObject, Manager): The name of the book to return """ log.debug(u'BibleDb.get_book("%s")', book) - db_book = self.session.query(Book).filter( - Book.name.like(book + u'%')).first() + db_book = self.get_object_filtered(Book, Book.name.like(book + u'%')) if db_book is None: - db_book = self.session.query(Book).filter( - Book.abbreviation.like(book + u'%')).first() + db_book = self.get_object_filtered(Book, + Book.abbreviation.like(book + u'%')) return db_book def get_verses(self, reference_list): diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 76d597f28..e65205351 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -78,8 +78,7 @@ class CustomPlugin(Plugin): return about_text def can_delete_theme(self, theme): - filter_string = u'theme_name=\'%s\'' % theme if not self.custommanager.get_all_objects_filtered(CustomSlide, - filter_string): + CustomSlide.theme_name == theme): return True return False diff --git a/openlp/plugins/songs/forms/songimportform.py b/openlp/plugins/songs/forms/songimportform.py index 8a830d720..09db3dcb8 100644 --- a/openlp/plugins/songs/forms/songimportform.py +++ b/openlp/plugins/songs/forms/songimportform.py @@ -30,7 +30,7 @@ from PyQt4 import QtCore, QtGui from songimportwizard import Ui_SongImportWizard from openlp.core.lib import Receiver, SettingsManager, translate #from openlp.core.utils import AppLocation -from openlp.plugins.songs.lib.manager import SongFormat +from openlp.plugins.songs.lib import SongFormat log = logging.getLogger(__name__) diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index dddb23b4e..8c07c31c7 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -25,6 +25,52 @@ from openlp.core.lib import translate +#from openlp.plugins.songs.lib import OpenLyricsSong, OpenSongSong, CCLISong, \ +# CSVSong + +class SongFormat(object): + """ + This is a special enumeration class that holds the various types of songs, + plus a few helper functions to facilitate generic handling of song types + for importing. + """ + Unknown = -1 + OpenLyrics = 0 + OpenSong = 1 + CCLI = 2 + CSV = 3 + + @staticmethod + def get_class(id): + """ + Return the appropriate imeplementation class. + + ``id`` + The song format. + """ +# if id == SongFormat.OpenLyrics: +# return OpenLyricsSong +# elif id == SongFormat.OpenSong: +# return OpenSongSong +# elif id == SongFormat.CCLI: +# return CCLISong +# elif id == SongFormat.CSV: +# return CSVSong +# else: + return None + + @staticmethod + def list(): + """ + Return a list of the supported song formats. + """ + return [ + SongFormat.OpenLyrics, + SongFormat.OpenSong, + SongFormat.CCLI, + SongFormat.CSV + ] + class VerseType(object): """ VerseType provides an enumeration for the tags that may be associated @@ -91,7 +137,6 @@ class VerseType(object): unicode(VerseType.to_string(VerseType.Other)).lower(): return VerseType.Other -from manager import SongManager from songstab import SongsTab from mediaitem import SongMediaItem from songimport import SongImport diff --git a/openlp/plugins/songs/lib/manager.py b/openlp/plugins/songs/lib/manager.py deleted file mode 100644 index 10ec5aa34..000000000 --- a/openlp/plugins/songs/lib/manager.py +++ /dev/null @@ -1,116 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # -# Thompson, Jon Tibble, Carsten Tinggaard # -# --------------------------------------------------------------------------- # -# 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 openlp.core.lib.db import Manager -from openlp.plugins.songs.lib.db import init_schema, Song, Author -#from openlp.plugins.songs.lib import OpenLyricsSong, OpenSongSong, CCLISong, \ -# CSVSong - -log = logging.getLogger(__name__) - -class SongFormat(object): - """ - This is a special enumeration class that holds the various types of songs, - plus a few helper functions to facilitate generic handling of song types - for importing. - """ - Unknown = -1 - OpenLyrics = 0 - OpenSong = 1 - CCLI = 2 - CSV = 3 - - @staticmethod - def get_class(id): - """ - Return the appropriate imeplementation class. - - ``id`` - The song format. - """ -# if id == SongFormat.OpenLyrics: -# return OpenLyricsSong -# elif id == SongFormat.OpenSong: -# return OpenSongSong -# elif id == SongFormat.CCLI: -# return CCLISong -# elif id == SongFormat.CSV: -# return CSVSong -# else: - return None - - @staticmethod - def list(): - """ - Return a list of the supported song formats. - """ - return [ - SongFormat.OpenLyrics, - SongFormat.OpenSong, - SongFormat.CCLI, - SongFormat.CSV - ] - - -class SongManager(Manager): - """ - The Song Manager provides a central location for all database code. This - class takes care of connecting to the database and running all the queries. - """ - log.info(u'Song manager loaded') - - def __init__(self): - """ - Creates the connection to the database, and creates the tables if they - don't exist. - """ - log.debug(u'Song Initialising') - Manager.__init__(self, u'songs', init_schema) - log.debug(u'Song Initialised') - - def search_song_title(self, keywords): - """ - Searches the song title for keywords. - """ - return self.session.query(Song).filter( - Song.search_title.like(u'%' + keywords + u'%')).order_by( - Song.search_title.asc()).all() - - def search_song_lyrics(self, keywords): - """ - Searches the song lyrics for keywords. - """ - return self.session.query(Song).filter( - Song.search_lyrics.like(u'%' + keywords + u'%')).order_by( - Song.search_lyrics.asc()).all() - - def get_song_from_author(self, keywords): - """ - Searches the song authors for keywords. - """ - return self.session.query(Author).filter(Author.display_name.like( - u'%' + keywords + u'%')).order_by(Author.display_name.asc()).all() diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 94002b6f4..7ed30e5e0 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -165,18 +165,21 @@ class SongMediaItem(MediaManagerItem): search_type = self.SearchTypeComboBox.currentIndex() if search_type == 0: log.debug(u'Titles Search') - search_results = self.parent.manager.search_song_title( - search_keywords) + search_results = self.parent.manager.get_all_objects_filtered(Song, + Song.search_title.like(u'%' + keywords + u'%'), + Song.search_title.asc()) self.displayResultsSong(search_results) elif search_type == 1: log.debug(u'Lyrics Search') - search_results = self.parent.manager.search_song_lyrics( - search_keywords) + search_results = self.parent.manager.get_all_objects_filtered(Song, + Song.search_lyrics.like(u'%' + keywords + u'%'), + Song.search_lyrics.asc()) self.displayResultsSong(search_results) elif search_type == 2: log.debug(u'Authors Search') - search_results = self.parent.manager.get_song_from_author( - search_keywords) + search_results = self.parent.manager.get_all_objects_filtered( + Author, Author.display_name.like(u'%' + search_keywords + u'%'), + Author.display_name.asc()) self.displayResultsAuthor(search_results) #Called to redisplay the song list screen edith from a search #or from the exit of the Song edit dialog. If remote editing is active diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 08855f01a..115f52e58 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -302,8 +302,8 @@ class SongImport(object): song.theme_name = self.theme_name song.ccli_number = self.ccli_number for authortext in self.authors: - filter_string = u'display_name=%s' % authortext - author = self.manager.get_object_filtered(Author, filter_string) + author = self.manager.get_object_filtered(Author, + Author.display_name == authortext) if author is None: author = Author() author.display_name = authortext @@ -312,8 +312,8 @@ class SongImport(object): self.manager.save_object(author) song.authors.append(author) if self.song_book_name: - filter_string = u'name=%s' % self.song_book_name - song_book = self.manager.get_object_filtered(Book, filter_string) + song_book = self.manager.get_object_filtered(Book, + Book.name == self.song_book_name) if song_book is None: song_book = Book() song_book.name = self.song_book_name @@ -321,8 +321,8 @@ class SongImport(object): self.manager.save_object(song_book) song.song_book_id = song_book.id for topictext in self.topics: - filter_string = u'name=%s' % topictext - topic = self.manager.get_object_filtered(Topic, filter_string) + topic = self.manager.get_object_filtered(Topic, + Topic.name == topictext) if topic is None: topic = Topic() topic.name = topictext diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 82a780fa9..3567ff3a1 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -29,7 +29,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, build_icon, PluginStatus, Receiver, \ translate -from openlp.plugins.songs.lib import SongManager, SongMediaItem, SongsTab +from openlp.core.lib.db import Manager +from openlp.plugins.songs.lib import SongMediaItem, SongsTab from openlp.plugins.songs.lib.db import Song try: @@ -56,7 +57,7 @@ class SongsPlugin(Plugin): """ Plugin.__init__(self, u'Songs', u'1.9.2', plugin_helpers) self.weight = -10 - self.manager = SongManager() + self.manager = Manager(u'songs', init_schema) self.icon = build_icon(u':/plugins/plugin_songs.png') self.status = PluginStatus.Active @@ -65,8 +66,6 @@ class SongsPlugin(Plugin): def initialise(self): log.info(u'Songs Initialising') - #if self.songmanager is None: - # self.songmanager = SongManager() Plugin.initialise(self) self.insert_toolbox_item() self.media_item.displayResultsSong( @@ -199,7 +198,7 @@ class SongsPlugin(Plugin): return about_text def can_delete_theme(self, theme): - filter_string = u'theme_name=\'%s\'' % theme - if not self.manager.get_all_objects_filtered(Song, filter_string): + if not self.manager.get_all_objects_filtered(Song, + Song.theme_name == theme): return True return False From c61121bb51ac620a59025be85e1a910981d4368d Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Thu, 1 Jul 2010 11:31:37 +0100 Subject: [PATCH 02/33] DB cleanups --- openlp/core/lib/db.py | 11 ++++++----- openlp/plugins/songs/songsplugin.py | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/db.py b/openlp/core/lib/db.py index a60521218..f20f3ab38 100644 --- a/openlp/core/lib/db.py +++ b/openlp/core/lib/db.py @@ -188,9 +188,10 @@ class Manager(object): ``order_by_ref`` Any parameters to order the returned objects by. Defaults to None. """ + query = self.session.query(object_class) if order_by_ref: - return self.session.query(object_class).order_by(order_by_ref).all() - return self.session.query(object_class).all() + return query.order_by(order_by_ref).all() + return query.all() def get_all_objects_filtered(self, object_class, filter_clause, order_by_ref=None): @@ -206,10 +207,10 @@ class Manager(object): ``order_by_ref`` Any parameters to order the returned objects by. Defaults to None. """ + query = self.session.query(object_class).filter(filter_clause) if order_by_ref: - return self.session.query(object_class).filter(filter_clause) \ - .order_by(order_by_ref).all() - return self.session.query(object_class).filter(filter_clause).all() + return query.order_by(order_by_ref).all() + return query.all() def delete_object(self, object_class, key): """ diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 3567ff3a1..e2740748b 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -31,7 +31,7 @@ from openlp.core.lib import Plugin, build_icon, PluginStatus, Receiver, \ translate from openlp.core.lib.db import Manager from openlp.plugins.songs.lib import SongMediaItem, SongsTab -from openlp.plugins.songs.lib.db import Song +from openlp.plugins.songs.lib.db import init_schema, Song try: from openlp.plugins.songs.lib import SofImport, OooImport From 254ac02561c936ccb087c9aab1996d6d47a096de Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Thu, 1 Jul 2010 13:56:02 +0100 Subject: [PATCH 03/33] Alerts: Import and long lines --- openlp/plugins/alerts/lib/alertsmanager.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index 10565a3d1..aac3eccb9 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -25,7 +25,7 @@ import logging -from PyQt4 import QtCore, QtGui +from PyQt4 import QtCore from openlp.core.lib import Receiver, translate @@ -95,7 +95,8 @@ class AlertsManager(QtCore.QObject): alertTab = self.parent.alertsTab text = HTMLCODE % (alertTab.font_color, alertTab.bg_color, alertTab.font_face, alertTab.font_size, text) - self.parent.preview_controller.parent.displayManager.addAlert(text, alertTab.location) + self.parent.preview_controller.parent.displayManager.addAlert(text, + alertTab.location) # check to see if we have a timer running if self.timer_id == 0: self.timer_id = self.startTimer(int(alertTab.timeout) * 1000) @@ -111,7 +112,8 @@ class AlertsManager(QtCore.QObject): log.debug(u'timer event') alertTab = self.parent.alertsTab if event.timerId() == self.timer_id: - self.parent.preview_controller.parent.displayManager.addAlert(u'', alertTab.location) + self.parent.preview_controller.parent.displayManager.addAlert(u'', + alertTab.location) self.killTimer(self.timer_id) self.timer_id = 0 self.generateAlert() From d939a39895b47e29349db948ea40ff2962abe6ab Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Thu, 1 Jul 2010 16:46:51 +0100 Subject: [PATCH 04/33] Cleanup signals (Bug #599146) --- openlp/core/ui/amendthemedialog.py | 70 ++++---------- openlp/core/ui/amendthemeform.py | 85 ++++++++--------- openlp/core/ui/displaytab.py | 1 - openlp/core/ui/generaltab.py | 147 ++++++++++------------------- 4 files changed, 114 insertions(+), 189 deletions(-) diff --git a/openlp/core/ui/amendthemedialog.py b/openlp/core/ui/amendthemedialog.py index a75f5e686..2bb202964 100644 --- a/openlp/core/ui/amendthemedialog.py +++ b/openlp/core/ui/amendthemedialog.py @@ -178,13 +178,11 @@ class Ui_AmendThemeDialog(object): self.MainFontLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.FontMainSize) self.FontMainSizeSpinBox = QtGui.QSpinBox(self.FontMainGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, + defaultSizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( + defaultSizePolicy.setHeightForWidth( self.FontMainSizeSpinBox.sizePolicy().hasHeightForWidth()) - self.FontMainSizeSpinBox.setSizePolicy(sizePolicy) + self.FontMainSizeSpinBox.setSizePolicy(defaultSizePolicy) self.FontMainSizeSpinBox.setMinimumSize(QtCore.QSize(70, 0)) self.FontMainSizeSpinBox.setProperty(u'value', QtCore.QVariant(16)) self.FontMainSizeSpinBox.setMaximum(999) @@ -230,8 +228,7 @@ class Ui_AmendThemeDialog(object): self.FontMainLineSpacingSpinBox) self.FontMainLinesPageLabel = QtGui.QLabel(self.FontMainGroupBox) self.FontMainLinesPageLabel.setObjectName(u'FontMainLinesPageLabel') - self.MainFontLayout.setWidget(6, QtGui.QFormLayout.LabelRole, - self.FontMainLinesPageLabel) + self.MainFontLayout.addRow(self.FontMainLinesPageLabel) spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.MainLeftLayout.addItem(spacerItem1) @@ -275,13 +272,9 @@ class Ui_AmendThemeDialog(object): self.MainLocationLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.FontMainHeightLabel) self.FontMainXSpinBox = QtGui.QSpinBox(self.MainLocationGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( + defaultSizePolicy.setHeightForWidth( self.FontMainXSpinBox.sizePolicy().hasHeightForWidth()) - self.FontMainXSpinBox.setSizePolicy(sizePolicy) + self.FontMainXSpinBox.setSizePolicy(defaultSizePolicy) self.FontMainXSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.FontMainXSpinBox.setProperty(u'value', QtCore.QVariant(0)) self.FontMainXSpinBox.setMaximum(9999) @@ -289,39 +282,27 @@ class Ui_AmendThemeDialog(object): self.MainLocationLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.FontMainXSpinBox) self.FontMainYSpinBox = QtGui.QSpinBox(self.MainLocationGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( + defaultSizePolicy.setHeightForWidth( self.FontMainYSpinBox.sizePolicy().hasHeightForWidth()) - self.FontMainYSpinBox.setSizePolicy(sizePolicy) + self.FontMainYSpinBox.setSizePolicy(defaultSizePolicy) self.FontMainYSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.FontMainYSpinBox.setMaximum(9999) self.FontMainYSpinBox.setObjectName(u'FontMainYSpinBox') self.MainLocationLayout.setWidget(2, QtGui.QFormLayout.FieldRole, self.FontMainYSpinBox) self.FontMainWidthSpinBox = QtGui.QSpinBox(self.MainLocationGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( + defaultSizePolicy.setHeightForWidth( self.FontMainWidthSpinBox.sizePolicy().hasHeightForWidth()) - self.FontMainWidthSpinBox.setSizePolicy(sizePolicy) + self.FontMainWidthSpinBox.setSizePolicy(defaultSizePolicy) self.FontMainWidthSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.FontMainWidthSpinBox.setMaximum(9999) self.FontMainWidthSpinBox.setObjectName(u'FontMainWidthSpinBox') self.MainLocationLayout.setWidget(3, QtGui.QFormLayout.FieldRole, self.FontMainWidthSpinBox) self.FontMainHeightSpinBox = QtGui.QSpinBox(self.MainLocationGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( + defaultSizePolicy.setHeightForWidth( self.FontMainHeightSpinBox.sizePolicy().hasHeightForWidth()) - self.FontMainHeightSpinBox.setSizePolicy(sizePolicy) + self.FontMainHeightSpinBox.setSizePolicy(defaultSizePolicy) self.FontMainHeightSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.FontMainHeightSpinBox.setMaximum(9999) self.FontMainHeightSpinBox.setObjectName(u'FontMainHeightSpinBox') @@ -378,13 +359,9 @@ class Ui_AmendThemeDialog(object): self.FooterFontLayout.setWidget(2, QtGui.QFormLayout.LabelRole, self.FontFooterSizeLabel) self.FontFooterSizeSpinBox = QtGui.QSpinBox(self.FooterFontGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( + defaultSizePolicy.setHeightForWidth( self.FontFooterSizeSpinBox.sizePolicy().hasHeightForWidth()) - self.FontFooterSizeSpinBox.setSizePolicy(sizePolicy) + self.FontFooterSizeSpinBox.setSizePolicy(defaultSizePolicy) self.FontFooterSizeSpinBox.setMinimumSize(QtCore.QSize(70, 0)) self.FontFooterSizeSpinBox.setProperty(u'value', QtCore.QVariant(10)) self.FontFooterSizeSpinBox.setMaximum(999) @@ -453,13 +430,9 @@ class Ui_AmendThemeDialog(object): self.LocationFooterLayout.setWidget(4, QtGui.QFormLayout.LabelRole, self.FontFooterHeightLabel) self.FontFooterXSpinBox = QtGui.QSpinBox(self.LocationFooterGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( + defaultSizePolicy.setHeightForWidth( self.FontFooterXSpinBox.sizePolicy().hasHeightForWidth()) - self.FontFooterXSpinBox.setSizePolicy(sizePolicy) + self.FontFooterXSpinBox.setSizePolicy(defaultSizePolicy) self.FontFooterXSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.FontFooterXSpinBox.setProperty(u'value', QtCore.QVariant(0)) self.FontFooterXSpinBox.setMaximum(9999) @@ -467,13 +440,9 @@ class Ui_AmendThemeDialog(object): self.LocationFooterLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.FontFooterXSpinBox) self.FontFooterYSpinBox = QtGui.QSpinBox(self.LocationFooterGroupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, - QtGui.QSizePolicy.Fixed) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth( - self.FontFooterYSpinBox.sizePolicy().hasHeightForWidth()) - self.FontFooterYSpinBox.setSizePolicy(sizePolicy) + defaultSizePolicy.setHeightForWidth( + self.FontFooterXSpinBox.sizePolicy().hasHeightForWidth()) + self.FontFooterYSpinBox.setSizePolicy(defaultSizePolicy) self.FontFooterYSpinBox.setMinimumSize(QtCore.QSize(78, 0)) self.FontFooterYSpinBox.setProperty(u'value', QtCore.QVariant(0)) self.FontFooterYSpinBox.setMaximum(9999) @@ -901,4 +870,3 @@ class Ui_AmendThemeDialog(object): self.ThemeTabWidget.indexOf(self.OtherOptionsTab), translate('AmendThemeForm', '&Other Options')) self.PreviewGroupBox.setTitle(translate('AmendThemeForm', 'Preview')) - diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py index c85eff4b8..6333d7146 100644 --- a/openlp/core/ui/amendthemeform.py +++ b/openlp/core/ui/amendthemeform.py @@ -43,8 +43,8 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.path = None self.theme = ThemeXML() self.setupUi(self) - #define signals - #Buttons + # Define signals + # Buttons QtCore.QObject.connect(self.Color1PushButton, QtCore.SIGNAL(u'pressed()'), self.onColor1PushButtonClicked) QtCore.QObject.connect(self.Color2PushButton, @@ -60,7 +60,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): QtCore.SIGNAL(u'pressed()'), self.onShadowColorPushButtonClicked) QtCore.QObject.connect(self.ImageToolButton, QtCore.SIGNAL(u'pressed()'), self.onImageToolButtonClicked) - #Combo boxes + # Combo boxes QtCore.QObject.connect(self.BackgroundComboBox, QtCore.SIGNAL(u'activated(int)'), self.onBackgroundComboBoxSelected) QtCore.QObject.connect(self.BackgroundTypeComboBox, @@ -82,57 +82,58 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): QtCore.SIGNAL(u'activated(int)'), self.onHorizontalComboBoxSelected) QtCore.QObject.connect(self.VerticalComboBox, QtCore.SIGNAL(u'activated(int)'), self.onVerticalComboBoxSelected) - #Spin boxes + # Spin boxes QtCore.QObject.connect(self.FontMainSizeSpinBox, - QtCore.SIGNAL(u'editingFinished()'), + QtCore.SIGNAL(u'valueChanged(int)'), self.onFontMainSizeSpinBoxChanged) QtCore.QObject.connect(self.FontFooterSizeSpinBox, - QtCore.SIGNAL(u'editingFinished()'), + QtCore.SIGNAL(u'valueChanged(int)'), self.onFontFooterSizeSpinBoxChanged) + QtCore.QObject.connect(self.FontMainXSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), self.onFontMainXSpinBoxChanged) + QtCore.QObject.connect(self.FontMainYSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), self.onFontMainYSpinBoxChanged) + QtCore.QObject.connect(self.FontMainWidthSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onFontMainWidthSpinBoxChanged) + QtCore.QObject.connect(self.FontMainHeightSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onFontMainHeightSpinBoxChanged) + QtCore.QObject.connect(self.FontMainLineAdjustmentSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onFontMainLineAdjustmentSpinBoxChanged) + QtCore.QObject.connect(self.FontMainLineSpacingSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onFontMainLineSpacingSpinBoxChanged) + QtCore.QObject.connect(self.FontFooterXSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onFontFooterXSpinBoxChanged) + QtCore.QObject.connect(self.FontFooterYSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onFontFooterYSpinBoxChanged) + QtCore.QObject.connect(self.FontFooterWidthSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onFontFooterWidthSpinBoxChanged) + QtCore.QObject.connect(self.FontFooterHeightSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onFontFooterHeightSpinBoxChanged) + QtCore.QObject.connect(self.ShadowSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onShadowSpinBoxChanged) + QtCore.QObject.connect(self.ShadowCheckBox, + QtCore.SIGNAL(u'valueChanged(int)'), self.onShadowCheckBoxChanged) + QtCore.QObject.connect(self.OutlineSpinBox, + QtCore.SIGNAL(u'valueChanged(int)'), + self.onOutlineSpinBoxChanged) + # Checkboxes QtCore.QObject.connect(self.FontMainDefaultCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onFontMainDefaultCheckBoxChanged) - QtCore.QObject.connect(self.FontMainXSpinBox, - QtCore.SIGNAL(u'editingFinished()'), self.onFontMainXSpinBoxChanged) - QtCore.QObject.connect(self.FontMainYSpinBox, - QtCore.SIGNAL(u'editingFinished()'), self.onFontMainYSpinBoxChanged) - QtCore.QObject.connect(self.FontMainWidthSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontMainWidthSpinBoxChanged) - QtCore.QObject.connect(self.FontMainHeightSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontMainHeightSpinBoxChanged) - QtCore.QObject.connect(self.FontMainLineAdjustmentSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontMainLineAdjustmentSpinBoxChanged) - QtCore.QObject.connect(self.FontMainLineSpacingSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontMainLineSpacingSpinBoxChanged) QtCore.QObject.connect(self.FontFooterDefaultCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onFontFooterDefaultCheckBoxChanged) - QtCore.QObject.connect(self.FontFooterXSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontFooterXSpinBoxChanged) - QtCore.QObject.connect(self.FontFooterYSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontFooterYSpinBoxChanged) - QtCore.QObject.connect(self.FontFooterWidthSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontFooterWidthSpinBoxChanged) - QtCore.QObject.connect(self.FontFooterHeightSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onFontFooterHeightSpinBoxChanged) QtCore.QObject.connect(self.OutlineCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onOutlineCheckBoxChanged) - QtCore.QObject.connect(self.ShadowSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onShadowSpinBoxChanged) - QtCore.QObject.connect(self.ShadowCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), self.onShadowCheckBoxChanged) - QtCore.QObject.connect(self.OutlineSpinBox, - QtCore.SIGNAL(u'editingFinished()'), - self.onOutlineSpinBoxChanged) QtCore.QObject.connect(self.SlideTransitionCheckedBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onSlideTransitionCheckedBoxChanged) diff --git a/openlp/core/ui/displaytab.py b/openlp/core/ui/displaytab.py index 8a028bbc8..0fb16a9f7 100644 --- a/openlp/core/ui/displaytab.py +++ b/openlp/core/ui/displaytab.py @@ -242,4 +242,3 @@ class DisplayTab(SettingsTab): if self.amend_display_start != self.amend_display: self.amend_display_start = self.amend_display Receiver.send_message(u'config_screen_changed') - diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 4c42bf90c..340753707 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -32,13 +32,16 @@ class GeneralTab(SettingsTab): GeneralTab is the general settings tab in the settings dialog. """ def __init__(self, screens): + """ + Initialise the general settings tab + """ self.screens = screens + self.MonitorNumber = 0 SettingsTab.__init__(self, u'General') def preLoad(self): """ - Set up the display screen and set correct screen - values. + Set up the display screen and set correct screen values. If not set before default to last screen. """ settings = QtCore.QSettings() @@ -47,12 +50,14 @@ class GeneralTab(SettingsTab): QtCore.QVariant(self.screens.display_count - 1)).toInt()[0] self.screens.set_current_display(self.MonitorNumber) self.screens.monitor_number = self.MonitorNumber - self.DisplayOnMonitor = settings.value( + self.screens.display = settings.value( u'display on monitor', QtCore.QVariant(True)).toBool() - self.screens.display = self.DisplayOnMonitor settings.endGroup() def setupUi(self): + """ + Create the user interface for the general settings tab + """ self.setObjectName(u'GeneralTab') self.tabTitleVisible = translate('GeneralTab', 'General') self.GeneralLayout = QtGui.QHBoxLayout(self) @@ -152,31 +157,11 @@ class GeneralTab(SettingsTab): QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.GeneralRightLayout.addItem(self.GeneralRightSpacer) self.GeneralLayout.addWidget(self.GeneralRightWidget) - QtCore.QObject.connect(self.MonitorComboBox, - QtCore.SIGNAL(u'activated(int)'), self.onMonitorComboBoxChanged) - QtCore.QObject.connect(self.DisplayOnMonitorCheck, - QtCore.SIGNAL(u'stateChanged(int)'), - self.onDisplayOnMonitorCheckChanged) - QtCore.QObject.connect(self.WarningCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), self.onWarningCheckBoxChanged) - QtCore.QObject.connect(self.AutoOpenCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), self.onAutoOpenCheckBoxChanged) - QtCore.QObject.connect(self.ShowSplashCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), - self.onShowSplashCheckBoxChanged) - QtCore.QObject.connect(self.SaveCheckServiceCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), - self.onSaveCheckServiceCheckBox) - QtCore.QObject.connect(self.AutoPreviewCheckBox, - QtCore.SIGNAL(u'stateChanged(int)'), self.onAutoPreviewCheckBox) - QtCore.QObject.connect(self.NumberEdit, - QtCore.SIGNAL(u'editingFinished()'), self.onNumberEditLostFocus) - QtCore.QObject.connect(self.UsernameEdit, - QtCore.SIGNAL(u'editingFinished()'), self.onUsernameEditLostFocus) - QtCore.QObject.connect(self.PasswordEdit, - QtCore.SIGNAL(u'editingFinished()'), self.onPasswordEditLostFocus) def retranslateUi(self): + """ + Translate the general settings tab to the currently selected language + """ self.MonitorGroupBox.setTitle(translate('GeneralTab', 'Monitors')) self.MonitorLabel.setText( translate('GeneralTab', 'Select monitor for output display:')) @@ -204,37 +189,10 @@ class GeneralTab(SettingsTab): self.PasswordLabel.setText( translate('GeneralTab', 'SongSelect Password:')) - def onMonitorComboBoxChanged(self): - self.MonitorNumber = self.MonitorComboBox.currentIndex() - - def onDisplayOnMonitorCheckChanged(self, value): - self.DisplayOnMonitor = (value == QtCore.Qt.Checked) - - def onAutoOpenCheckBoxChanged(self, value): - self.AutoOpen = (value == QtCore.Qt.Checked) - - def onShowSplashCheckBoxChanged(self, value): - self.ShowSplash = (value == QtCore.Qt.Checked) - - def onWarningCheckBoxChanged(self, value): - self.Warning = (value == QtCore.Qt.Checked) - - def onSaveCheckServiceCheckBox(self, value): - self.PromptSaveService = (value == QtCore.Qt.Checked) - - def onAutoPreviewCheckBox(self, value): - self.AutoPreview = (value == QtCore.Qt.Checked) - - def onNumberEditLostFocus(self): - self.CCLINumber = self.NumberEdit.displayText() - - def onUsernameEditLostFocus(self): - self.Username = self.UsernameEdit.displayText() - - def onPasswordEditLostFocus(self): - self.Password = self.PasswordEdit.displayText() - def load(self): + """ + Load the settings to populate the form + """ settings = QtCore.QSettings() settings.beginGroup(self.settingsSection) for screen in self.screens.screen_list: @@ -244,55 +202,54 @@ class GeneralTab(SettingsTab): screen_name = u'%s (%s)' % (screen_name, translate('GeneralTab', 'primary')) self.MonitorComboBox.addItem(screen_name) - # Get the configs - self.Warning = settings.value( - u'blank warning', QtCore.QVariant(False)).toBool() - self.AutoOpen = settings.value( - u'auto open', QtCore.QVariant(False)).toBool() - self.ShowSplash = settings.value( - u'show splash', QtCore.QVariant(True)).toBool() - self.PromptSaveService = settings.value( - u'save prompt', QtCore.QVariant(False)).toBool() - self.AutoPreview = settings.value( - u'auto preview', QtCore.QVariant(False)).toBool() - self.CCLINumber = unicode(settings.value( - u'ccli number', QtCore.QVariant(u'')).toString()) - self.Username = unicode(settings.value( - u'songselect username', QtCore.QVariant(u'')).toString()) - self.Password = unicode(settings.value( - u'songselect password', QtCore.QVariant(u'')).toString()) - settings.endGroup() - self.SaveCheckServiceCheckBox.setChecked(self.PromptSaveService) - # Set a few things up + 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.MonitorComboBox.setCurrentIndex(self.MonitorNumber) - self.DisplayOnMonitorCheck.setChecked(self.DisplayOnMonitor) - self.WarningCheckBox.setChecked(self.Warning) - self.AutoOpenCheckBox.setChecked(self.AutoOpen) - self.ShowSplashCheckBox.setChecked(self.ShowSplash) - self.AutoPreviewCheckBox.setChecked(self.AutoPreview) - self.NumberEdit.setText(self.CCLINumber) - self.UsernameEdit.setText(self.Username) - self.PasswordEdit.setText(self.Password) + 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.AutoPreviewCheckBox.setChecked(settings.value(u'auto preview', + QtCore.QVariant(False)).toBool()) + settings.endGroup() def save(self): + """ + Save the settings from the form + """ + self.MonitorNumber = self.MonitorComboBox.currentIndex() settings = QtCore.QSettings() settings.beginGroup(self.settingsSection) settings.setValue(u'monitor', QtCore.QVariant(self.MonitorNumber)) settings.setValue(u'display on monitor', - QtCore.QVariant(self.DisplayOnMonitor)) - settings.setValue(u'blank warning', QtCore.QVariant(self.Warning)) - settings.setValue(u'auto open', QtCore.QVariant(self.AutoOpen)) - settings.setValue(u'show splash', QtCore.QVariant(self.ShowSplash)) + 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'save prompt', - QtCore.QVariant(self.PromptSaveService)) - settings.setValue(u'auto preview', QtCore.QVariant(self.AutoPreview)) - settings.setValue(u'ccli number', QtCore.QVariant(self.CCLINumber)) + QtCore.QVariant(self.SaveCheckServiceCheckBox.isChecked())) + settings.setValue(u'auto preview', + QtCore.QVariant(self.AutoPreviewCheckBox.isChecked())) + settings.setValue(u'ccli number', + QtCore.QVariant(self.NumberEdit.displayText())) settings.setValue(u'songselect username', - QtCore.QVariant(self.Username)) + QtCore.QVariant(self.UsernameEdit.displayText())) settings.setValue(u'songselect password', - QtCore.QVariant(self.Password)) + QtCore.QVariant(self.PasswordEdit.displayText())) settings.endGroup() - self.screens.display = self.DisplayOnMonitor + self.screens.display = self.DisplayOnMonitorCheck.isChecked() #Monitor Number has changed. if self.screens.monitor_number != self.MonitorNumber: self.screens.monitor_number = self.MonitorNumber From f67457c3785bd3e809b23bcc1dcb576cd94b016a Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Thu, 1 Jul 2010 20:34:48 +0100 Subject: [PATCH 05/33] Revert bug fix --- openlp/core/ui/amendthemeform.py | 85 ++++++++++++++++---------------- 1 file changed, 42 insertions(+), 43 deletions(-) diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py index 6333d7146..c85eff4b8 100644 --- a/openlp/core/ui/amendthemeform.py +++ b/openlp/core/ui/amendthemeform.py @@ -43,8 +43,8 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.path = None self.theme = ThemeXML() self.setupUi(self) - # Define signals - # Buttons + #define signals + #Buttons QtCore.QObject.connect(self.Color1PushButton, QtCore.SIGNAL(u'pressed()'), self.onColor1PushButtonClicked) QtCore.QObject.connect(self.Color2PushButton, @@ -60,7 +60,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): QtCore.SIGNAL(u'pressed()'), self.onShadowColorPushButtonClicked) QtCore.QObject.connect(self.ImageToolButton, QtCore.SIGNAL(u'pressed()'), self.onImageToolButtonClicked) - # Combo boxes + #Combo boxes QtCore.QObject.connect(self.BackgroundComboBox, QtCore.SIGNAL(u'activated(int)'), self.onBackgroundComboBoxSelected) QtCore.QObject.connect(self.BackgroundTypeComboBox, @@ -82,58 +82,57 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): QtCore.SIGNAL(u'activated(int)'), self.onHorizontalComboBoxSelected) QtCore.QObject.connect(self.VerticalComboBox, QtCore.SIGNAL(u'activated(int)'), self.onVerticalComboBoxSelected) - # Spin boxes + #Spin boxes QtCore.QObject.connect(self.FontMainSizeSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), + QtCore.SIGNAL(u'editingFinished()'), self.onFontMainSizeSpinBoxChanged) QtCore.QObject.connect(self.FontFooterSizeSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), + QtCore.SIGNAL(u'editingFinished()'), self.onFontFooterSizeSpinBoxChanged) - QtCore.QObject.connect(self.FontMainXSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), self.onFontMainXSpinBoxChanged) - QtCore.QObject.connect(self.FontMainYSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), self.onFontMainYSpinBoxChanged) - QtCore.QObject.connect(self.FontMainWidthSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onFontMainWidthSpinBoxChanged) - QtCore.QObject.connect(self.FontMainHeightSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onFontMainHeightSpinBoxChanged) - QtCore.QObject.connect(self.FontMainLineAdjustmentSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onFontMainLineAdjustmentSpinBoxChanged) - QtCore.QObject.connect(self.FontMainLineSpacingSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onFontMainLineSpacingSpinBoxChanged) - QtCore.QObject.connect(self.FontFooterXSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onFontFooterXSpinBoxChanged) - QtCore.QObject.connect(self.FontFooterYSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onFontFooterYSpinBoxChanged) - QtCore.QObject.connect(self.FontFooterWidthSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onFontFooterWidthSpinBoxChanged) - QtCore.QObject.connect(self.FontFooterHeightSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onFontFooterHeightSpinBoxChanged) - QtCore.QObject.connect(self.ShadowSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onShadowSpinBoxChanged) - QtCore.QObject.connect(self.ShadowCheckBox, - QtCore.SIGNAL(u'valueChanged(int)'), self.onShadowCheckBoxChanged) - QtCore.QObject.connect(self.OutlineSpinBox, - QtCore.SIGNAL(u'valueChanged(int)'), - self.onOutlineSpinBoxChanged) - # Checkboxes QtCore.QObject.connect(self.FontMainDefaultCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onFontMainDefaultCheckBoxChanged) + QtCore.QObject.connect(self.FontMainXSpinBox, + QtCore.SIGNAL(u'editingFinished()'), self.onFontMainXSpinBoxChanged) + QtCore.QObject.connect(self.FontMainYSpinBox, + QtCore.SIGNAL(u'editingFinished()'), self.onFontMainYSpinBoxChanged) + QtCore.QObject.connect(self.FontMainWidthSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onFontMainWidthSpinBoxChanged) + QtCore.QObject.connect(self.FontMainHeightSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onFontMainHeightSpinBoxChanged) + QtCore.QObject.connect(self.FontMainLineAdjustmentSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onFontMainLineAdjustmentSpinBoxChanged) + QtCore.QObject.connect(self.FontMainLineSpacingSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onFontMainLineSpacingSpinBoxChanged) QtCore.QObject.connect(self.FontFooterDefaultCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onFontFooterDefaultCheckBoxChanged) + QtCore.QObject.connect(self.FontFooterXSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onFontFooterXSpinBoxChanged) + QtCore.QObject.connect(self.FontFooterYSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onFontFooterYSpinBoxChanged) + QtCore.QObject.connect(self.FontFooterWidthSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onFontFooterWidthSpinBoxChanged) + QtCore.QObject.connect(self.FontFooterHeightSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onFontFooterHeightSpinBoxChanged) QtCore.QObject.connect(self.OutlineCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onOutlineCheckBoxChanged) + QtCore.QObject.connect(self.ShadowSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onShadowSpinBoxChanged) + QtCore.QObject.connect(self.ShadowCheckBox, + QtCore.SIGNAL(u'stateChanged(int)'), self.onShadowCheckBoxChanged) + QtCore.QObject.connect(self.OutlineSpinBox, + QtCore.SIGNAL(u'editingFinished()'), + self.onOutlineSpinBoxChanged) QtCore.QObject.connect(self.SlideTransitionCheckedBox, QtCore.SIGNAL(u'stateChanged(int)'), self.onSlideTransitionCheckedBoxChanged) From c892f9b38f0445127a62832952a702ce4b11461d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 2 Jul 2010 05:36:13 +0100 Subject: [PATCH 06/33] Fix up transitions so they work --- openlp/core/ui/maindisplay.py | 36 ++++++++++++++++++----------------- 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index ae6d400fe..7bbab097d 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -25,6 +25,7 @@ import logging import os +import time from PyQt4 import QtCore, QtGui, QtWebKit from PyQt4.phonon import Phonon @@ -262,7 +263,7 @@ class MainDisplay(DisplayWidget): self.transparent = QtGui.QPixmap( self.screen[u'size'].width(), self.screen[u'size'].height()) self.transparent.fill(QtCore.Qt.transparent) -# self.display_text.setPixmap(self.transparent) +# self.displayText.setPixmap(self.transparent) #self.frameView(self.transparent) # To display or not to display? if not self.screen[u'primary']: @@ -290,12 +291,12 @@ class MainDisplay(DisplayWidget): self.scene.addItem(self.proxy) def setupText(self): - #self.display_text = QtGui.QGraphicsTextItem() - self.display_text = QtGui.QGraphicsPixmapItem() - #self.display_text.setPos(0,0) - #self.display_text.setTextWidth(self.size().width()) - self.display_text.setZValue(4) - self.scene.addItem(self.display_text) + #self.displayText = QtGui.QGraphicsTextItem() + self.displayText = QtGui.QGraphicsPixmapItem() + #self.displayText.setPos(0,0) + #self.displayText.setTextWidth(self.size().width()) + self.displayText.setZValue(4) + self.scene.addItem(self.displayText) def setupAlert(self): self.alertText = QtGui.QGraphicsTextItem() @@ -328,7 +329,7 @@ class MainDisplay(DisplayWidget): Store the images so they can be replaced when required """ log.debug(u'hideDisplay mode = %d', mode) - #self.display_text.setPixmap(self.transparent) + #self.displayText.setPixmap(self.transparent) if mode == HideMode.Screen: #self.display_image.setPixmap(self.transparent) self.setVisible(False) @@ -409,25 +410,26 @@ class MainDisplay(DisplayWidget): log.debug(u'frameView') if transition: if self.frame is not None: - self.display_text.setPixmap( + self.displayText.setPixmap( QtGui.QPixmap.fromImage(self.frame)) - self.update() + self.repaint() + Receiver.send_message(u'openlp_process_events') + time.sleep(0.1) self.frame = None if frame[u'trans'] is not None: - self.display_text.setPixmap( + self.displayText.setPixmap( QtGui.QPixmap.fromImage(frame[u'trans'])) self.repaint() + Receiver.send_message(u'openlp_process_events') + time.sleep(0.1) self.frame = frame[u'trans'] - self.display_text.setPixmap( + self.displayText.setPixmap( QtGui.QPixmap.fromImage(frame[u'main'])) - self.display_frame = frame[u'main'] - self.repaint() else: if isinstance(frame, QtGui.QPixmap): - self.display_text.setPixmap(frame) + self.displayText.setPixmap(frame) else: - self.display_text.setPixmap(QtGui.QPixmap.fromImage(frame)) - self.display_frame = frame + self.displayText.setPixmap(QtGui.QPixmap.fromImage(frame)) if not self.isVisible() and self.screens.display: self.setVisible(True) From e3e6c82eace59e1dcb5cc231f31099d52aeb6290 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 2 Jul 2010 06:16:30 +0100 Subject: [PATCH 07/33] Fix up display levels and renames --- openlp/core/lib/serviceitem.py | 10 +--- openlp/core/ui/maindisplay.py | 75 +++++++++++++------------- openlp/core/ui/slidecontroller.py | 2 +- openlp/plugins/images/lib/mediaitem.py | 11 ++-- 4 files changed, 48 insertions(+), 50 deletions(-) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index c107a1872..dfcad984a 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -35,7 +35,6 @@ import uuid from PyQt4 import QtGui from openlp.core.lib import build_icon, resize_image -from openlp.core.utils import AppLocation log = logging.getLogger(__name__) @@ -93,7 +92,6 @@ class ServiceItem(object): self.is_valid = True self.cache = {} self.icon = None - self.serviceItemPath = AppLocation.get_section_data_path(u'serviceItems') def add_capability(self, capability): """ @@ -155,12 +153,9 @@ class ServiceItem(object): del self.cache[len(self._display_frames)] log.log(15, u'Formatting took %4s' % (time.time() - before)) elif self.service_item_type == ServiceItemType.Image: - for count, slide in enumerate(self._raw_frames): + for slide in self._raw_frames: slide[u'image'] = resize_image(slide[u'image'], self.render_manager.width, self.render_manager.height) - path = os.path.join(self.serviceItemPath, self._uuid + unicode(count) + u'.png') - slide[u'image'].save(path) - slide[u'display'] = path elif self.service_item_type == ServiceItemType.Command: pass else: @@ -376,8 +371,7 @@ class ServiceItem(object): if self.service_item_type == ServiceItemType.Text: return self.render_individual(row) else: - return {u'main':self._raw_frames[row][u'image'], - u'trans':None, u'display':self._raw_frames[row][u'display']} + return {u'main':self._raw_frames[row][u'image'], u'trans':None} def get_frame_title(self, row=0): """ diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 7bbab097d..d6819cb1c 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -32,7 +32,6 @@ from PyQt4.phonon import Phonon from openlp.core.lib import Receiver, resize_image from openlp.core.ui import HideMode -from openlp.core.utils import AppLocation log = logging.getLogger(__name__) @@ -105,11 +104,17 @@ class DisplayManager(QtGui.QWidget): """ self.mainDisplay.addAlert(alertMessage, location) - def displayImage(self, path): + def displayImageWithText(self, frame): """ Handles the addition of a background Image to the displays """ - self.mainDisplay.displayImage(path) + self.mainDisplay.addImageWithText(frame) + + def displayImage(self, frame): + """ + Handles the addition of a background Image to the displays + """ + self.mainDisplay.displayImage(frame) def displayVideo(self, path): """ @@ -213,6 +218,7 @@ class MainDisplay(DisplayWidget): pass self.screens = screens self.setupScene() + self.setupVideo() self.setupImage() self.setupText() self.setupAlert() @@ -249,7 +255,7 @@ class MainDisplay(DisplayWidget): (self.screen[u'size'].width() - splash_image.width()) / 2, (self.screen[u'size'].height() - splash_image.height()) / 2, splash_image) - #self.display_image.setPixmap(QtGui.QPixmap.fromImage(self.InitialFrame)) + self.displayImage(self.InitialFrame) self.repaint() #Build a Black screen painter = QtGui.QPainter() @@ -278,18 +284,23 @@ class MainDisplay(DisplayWidget): self.scene.setSceneRect(0,0,self.size().width(), self.size().height()) self.setScene(self.scene) - def setupImage(self): + def setupVideo(self): self.webView = QtWebKit.QWebView() self.page = self.webView.page() - self.imageDisplay = self.page.mainFrame() - self.imageDisplay.setScrollBarPolicy(QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff) - self.imageDisplay.setScrollBarPolicy(QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff) + self.videoDisplay = self.page.mainFrame() + self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff) + self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff) self.proxy = QtGui.QGraphicsProxyWidget() self.proxy.setWidget(self.webView) self.proxy.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint) - self.proxy.setZValue(2) + self.proxy.setZValue(1) self.scene.addItem(self.proxy) + def setupImage(self): + self.imageDisplay = QtGui.QGraphicsPixmapItem() + self.imageDisplay.setZValue(2) + self.scene.addItem(self.imageDisplay) + def setupText(self): #self.displayText = QtGui.QGraphicsTextItem() self.displayText = QtGui.QGraphicsPixmapItem() @@ -305,9 +316,9 @@ class MainDisplay(DisplayWidget): self.scene.addItem(self.alertText) def setupBlank(self): - self.display_blank = QtGui.QGraphicsPixmapItem() - self.display_blank.setZValue(10) - self.scene.addItem(self.display_blank) + self.displayBlank = QtGui.QGraphicsPixmapItem() + self.displayBlank.setZValue(10) + self.scene.addItem(self.displayBlank) def resetDisplay(self): log.debug(u'resetDisplay') @@ -334,14 +345,14 @@ class MainDisplay(DisplayWidget): #self.display_image.setPixmap(self.transparent) self.setVisible(False) elif mode == HideMode.Blank: - self.display_blank.setPixmap( + self.displayBlank.setPixmap( QtGui.QPixmap.fromImage(self.blankFrame)) else: if self.parent.renderManager.renderer.bg_frame: - self.display_blank.setPixmap(QtGui.QPixmap.fromImage( + self.displayBlank.setPixmap(QtGui.QPixmap.fromImage( self.parent.renderManager.renderer.bg_frame)) else: - self.display_blank.setPixmap( + self.displayBlank.setPixmap( QtGui.QPixmap.fromImage(self.blankFrame)) def showDisplay(self, message=u''): @@ -351,7 +362,7 @@ class MainDisplay(DisplayWidget): Make the stored images None to release memory. """ log.debug(u'showDisplay') - self.display_blank.setPixmap(self.transparent) + self.displayBlank.setPixmap(self.transparent) #Trigger actions when display is active again Receiver.send_message(u'maindisplay_active') @@ -359,7 +370,8 @@ class MainDisplay(DisplayWidget): log.debug(u'addImageWithText') frame = resize_image( frame, self.screen[u'size'].width(), self.screen[u'size'].height()) - self.display_image.setPixmap(QtGui.QPixmap.fromImage(frame)) + self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) + self.videoDisplay.setHtml(u'') def addAlert(self, message, location): """ @@ -379,14 +391,18 @@ class MainDisplay(DisplayWidget): self.alertText.setPos(0,self.size().height() - 76) self.alertText.setHtml(message) - def displayImage(self, path): + def displayImage(self, frame): """ Places the Image passed on the display screen - ``path`` - The path to the image to be displayed + ``frame`` + The image to be displayed """ log.debug(u'adddisplayImage') - self.imageDisplay.setHtml(HTMLIMAGE % path) + if isinstance(frame, QtGui.QImage): + self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame)) + else: + self.imageDisplay.setPixmap(frame) + self.videoDisplay.setHtml(u'') def displayVideo(self, path): """ @@ -395,8 +411,9 @@ class MainDisplay(DisplayWidget): The path to the image to be displayed """ log.debug(u'adddisplayVideo') - self.imageDisplay.setHtml(HTMLVIDEO % + self.videoDisplay.setHtml(HTMLVIDEO % (path, self.screen[u'size'].width(), self.screen[u'size'].height())) + self.displayImage(self.transparent) def frameView(self, frame, transition=False): """ @@ -433,20 +450,6 @@ class MainDisplay(DisplayWidget): if not self.isVisible() and self.screens.display: self.setVisible(True) - def closeEvent(self, event): - """ - Shutting down cleans up background files - """ - serviceItemPath = AppLocation.get_section_data_path(u'serviceItems') - for file in os.listdir(serviceItemPath): - file_path = os.path.join(serviceItemPath, file) - try: - if os.path.isfile(file_path): - os.remove(file_path) - except OSError: - log.exception(u'Failed to clean up servicePath') - - class VideoDisplay(Phonon.VideoWidget): """ This is the form that is used to display videos on the projector. diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 5a34d09f8..8f9242764 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -785,7 +785,7 @@ class SlideController(QtGui.QWidget): if self.serviceItem.is_text(): self.mainDisplay.frameView(frame, True) else: - self.displayManager.displayImage(frame[u'display']) + self.displayManager.displayImage(frame[u'main']) self.selectedRow = row Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, row) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index ee7a22106..c83de7836 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -173,11 +173,12 @@ class ImageMediaItem(MediaManagerItem): if check_item_selected(self.ListView, translate('ImagePlugin.MediaItem', 'You must select an item to process.')): - item = self.buildServiceItem() - item.render() - self.parent.live_controller.displayManager. \ - displayImage(item.get_rendered_frame(0)[u'display']) - + items = self.ListView.selectedIndexes() + for item in items: + bitem = self.ListView.item(item.row()) + filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) + frame = QtGui.QImage(unicode(filename)) + self.parent.live_controller.displayManager.displayImageWithText(frame) def onPreviewClick(self): MediaManagerItem.onPreviewClick(self) From 9e1474e851bee30888410a5c91768b4410d28c3e Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Fri, 2 Jul 2010 11:29:36 +0100 Subject: [PATCH 08/33] Fix songs and wildcard import --- openlp/plugins/presentations/lib/pptviewcontroller.py | 2 +- openlp/plugins/songs/lib/mediaitem.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index 10ab41fd0..e8f0d9390 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -27,7 +27,7 @@ import os import logging if os.name == u'nt': - from ctypes import * + from ctypes import cdll from ctypes.wintypes import RECT from presentationcontroller import PresentationController, PresentationDocument diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 7ed30e5e0..c3aef65fd 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -371,7 +371,8 @@ class SongMediaItem(MediaManagerItem): author_list = author_list + unicode(author.display_name) author_audit.append(unicode(author.display_name)) if song.ccli_number is None or len(song.ccli_number) == 0: - ccli = self.parent.settings_form.GeneralTab.CCLINumber + ccli = QtCore.QSettings().value(u'general/ccli number', + QtCore.QVariant(u'')).toString() else: ccli = unicode(song.ccli_number) raw_footer.append(song.title) From 45375e74422522c82d546dd130f22a21760bfda6 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Fri, 2 Jul 2010 13:13:46 +0100 Subject: [PATCH 09/33] Cleanup plugins (Bug #600996) --- openlp/core/lib/plugin.py | 9 ++++++--- openlp/plugins/alerts/alertsplugin.py | 2 +- openlp/plugins/bibles/bibleplugin.py | 2 -- openlp/plugins/custom/customplugin.py | 9 --------- openlp/plugins/images/imageplugin.py | 9 --------- openlp/plugins/media/mediaplugin.py | 9 --------- openlp/plugins/presentations/presentationplugin.py | 2 +- openlp/plugins/remotes/remoteplugin.py | 2 +- openlp/plugins/songs/lib/mediaitem.py | 4 ++-- openlp/plugins/songs/songsplugin.py | 6 ------ 10 files changed, 11 insertions(+), 43 deletions(-) diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index a5d712dfb..1450ef1fe 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -242,19 +242,22 @@ class Plugin(QtCore.QObject): """ if self.media_item: self.media_item.initialise() + self.insert_toolbox_item() def finalise(self): """ Called by the plugin Manager to cleanup things. """ - pass + self.remove_toolbox_item() def remove_toolbox_item(self): """ Called by the plugin to remove toolbar """ - self.mediadock.remove_dock(self.name) - self.settings_form.removeTab(self.name) + if self.media_item: + self.mediadock.remove_dock(self.name) + if self.settings_tab: + self.settings_form.removeTab(self.name) def insert_toolbox_item(self): """ diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 46d4e8cb7..57388c538 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -85,8 +85,8 @@ class alertsPlugin(Plugin): def finalise(self): log.info(u'Plugin Finalise') + Plugin.finalise(self) self.toolsAlertItem.setVisible(False) - #stop any events being processed def togglealertsState(self): self.alertsActive = not self.alertsActive diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index b891b14ad..9f4f034ab 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -48,14 +48,12 @@ class BiblePlugin(Plugin): if self.manager is None: self.manager = BibleManager(self) Plugin.initialise(self) - self.insert_toolbox_item() self.ImportBibleItem.setVisible(True) self.ExportBibleItem.setVisible(True) def finalise(self): log.info(u'Plugin Finalise') Plugin.finalise(self) - self.remove_toolbox_item() self.ImportBibleItem.setVisible(False) self.ExportBibleItem.setVisible(False) diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index e65205351..60a0b312c 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -60,15 +60,6 @@ class CustomPlugin(Plugin): # Create the CustomManagerItem object return CustomMediaItem(self, self.icon, self.name) - def initialise(self): - log.info(u'Plugin Initialising') - Plugin.initialise(self) - self.insert_toolbox_item() - - def finalise(self): - log.info(u'Plugin Finalise') - self.remove_toolbox_item() - def about(self): about_text = translate('CustomPlugin', 'Custom Plugin
This plugin ' diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index 9ebaa128f..be3863bda 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -39,15 +39,6 @@ class ImagePlugin(Plugin): self.icon = build_icon(u':/plugins/plugin_images.png') self.status = PluginStatus.Active - def initialise(self): - log.info(u'Plugin Initialising') - Plugin.initialise(self) - self.insert_toolbox_item() - - def finalise(self): - log.info(u'Plugin Finalise') - self.remove_toolbox_item() - def get_settings_tab(self): return ImageTab(self.name) diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 33261f1e2..24138a0f5 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -67,15 +67,6 @@ class MediaPlugin(Plugin): type = u'' return list, type - def initialise(self): - log.info(u'Plugin Initialising') - Plugin.initialise(self) - self.insert_toolbox_item() - - def finalise(self): - log.info(u'Plugin Finalise') - self.remove_toolbox_item() - def get_media_manager_item(self): # Create the MediaManagerItem object return MediaMediaItem(self, self.icon, self.name) diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index d92483b88..22c7c554e 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -64,7 +64,7 @@ class PresentationPlugin(Plugin): controller = self.controllers[key] if controller.enabled: controller.kill() - self.remove_toolbox_item() + Plugin.finalise(self) def get_media_manager_item(self): """ diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index fad7ecbe8..808714fb3 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -56,7 +56,7 @@ class RemotesPlugin(Plugin): Tidy up and close down the http server """ log.debug(u'finalise') - self.remove_toolbox_item() + Plugin.finalise(self) if self.server: self.server.close() diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index c3aef65fd..4557f53fa 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -166,13 +166,13 @@ class SongMediaItem(MediaManagerItem): if search_type == 0: log.debug(u'Titles Search') search_results = self.parent.manager.get_all_objects_filtered(Song, - Song.search_title.like(u'%' + keywords + u'%'), + Song.search_title.like(u'%' + search_keywords + u'%'), Song.search_title.asc()) self.displayResultsSong(search_results) elif search_type == 1: log.debug(u'Lyrics Search') search_results = self.parent.manager.get_all_objects_filtered(Song, - Song.search_lyrics.like(u'%' + keywords + u'%'), + Song.search_lyrics.like(u'%' + search_keywords + u'%'), Song.search_lyrics.asc()) self.displayResultsSong(search_results) elif search_type == 2: diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index e2740748b..d9f9bb95f 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -67,15 +67,9 @@ class SongsPlugin(Plugin): def initialise(self): log.info(u'Songs Initialising') Plugin.initialise(self) - self.insert_toolbox_item() self.media_item.displayResultsSong( self.manager.get_all_objects(Song, Song.title)) - def finalise(self): - log.info(u'Plugin Finalise') - Plugin.finalise(self) - self.remove_toolbox_item() - def get_media_manager_item(self): """ Create the MediaManagerItem object, which is displaed in the From 3447c7fed617e32d36a2b72c4b9a4eac6122c45d Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Fri, 2 Jul 2010 15:57:48 +0100 Subject: [PATCH 10/33] XML: Start refactoring --- documentation/source/core/lib.rst | 6 -- openlp/core/lib/__init__.py | 1 - openlp/core/lib/xmlrootclass.py | 104 ---------------------------- openlp/plugins/songs/lib/songxml.py | 79 +++++++++++++++++++-- 4 files changed, 72 insertions(+), 118 deletions(-) delete mode 100644 openlp/core/lib/xmlrootclass.py diff --git a/documentation/source/core/lib.rst b/documentation/source/core/lib.rst index 12c7b702c..dd90b24a9 100644 --- a/documentation/source/core/lib.rst +++ b/documentation/source/core/lib.rst @@ -84,9 +84,3 @@ .. autoclass:: openlp.core.lib.toolbar.OpenLPToolbar :members: -:mod:`XmlRootClass` -------------------- - -.. autoclass:: openlp.core.lib.xmlrootclass.XmlRootClass - :members: - diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index d6f805c98..5a4725c80 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -216,7 +216,6 @@ from settingsmanager import SettingsManager from plugin import PluginStatus, Plugin from pluginmanager import PluginManager from settingstab import SettingsTab -from xmlrootclass import XmlRootClass from serviceitem import ServiceItem from serviceitem import ServiceItemType from serviceitem import ItemCapabilities diff --git a/openlp/core/lib/xmlrootclass.py b/openlp/core/lib/xmlrootclass.py deleted file mode 100644 index 1ea1d41a2..000000000 --- a/openlp/core/lib/xmlrootclass.py +++ /dev/null @@ -1,104 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # -# Thompson, Jon Tibble, Carsten Tinggaard # -# --------------------------------------------------------------------------- # -# 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 os -import sys - -from xml.etree.ElementTree import ElementTree, XML - -sys.path.append(os.path.abspath(os.path.join(u'.', u'..', u'..'))) - -class XmlRootClass(object): - """ - Root class for themes, songs etc - - This class provides interface for parsing xml files into object attributes. - - If you overload this class and provide a function called `post_tag_hook`, - it will be called thusly for each `tag, value` pair:: - - (element.tag, val) = self.post_tag_hook(element.tag, val) - """ - def _set_from_xml(self, xml, root_tag): - """ - Set song properties from given xml content. - - ``xml`` - Formatted xml tags and values. - ``root_tag`` - The root tag of the xml. - """ - root = ElementTree(element=XML(xml)) - xml_iter = root.getiterator() - for element in xml_iter: - if element.tag != root_tag: - text = element.text - if text is None: - val = text - elif isinstance(text, basestring): - # Strings need special handling to sort the colours out - if text[0] == u'$': - # This might be a hex number, let's try to convert it. - try: - val = int(text[1:], 16) - except ValueError: - pass - else: - # Let's just see if it's a integer. - try: - val = int(text) - except ValueError: - # Ok, it seems to be a string. - val = text - if hasattr(self, u'post_tag_hook'): - (element.tag, val) = \ - self.post_tag_hook(element.tag, val) - setattr(self, element.tag, val) - - def __str__(self): - """ - Return string with all public attributes - - The string is formatted with one attribute per line - If the string is split on newline then the length of the - list is equal to the number of attributes - """ - attributes = [] - for attrib in dir(self): - if not attrib.startswith(u'_'): - attributes.append( - u'%30s : %s' % (attrib, getattr(self, attrib))) - return u'\n'.join(attributes) - - def _get_as_string(self): - """ - Return one string with all public attributes - """ - result = u'' - for attrib in dir(self): - if not attrib.startswith(u'_'): - result += u'_%s_' % getattr(self, attrib) - return result - diff --git a/openlp/plugins/songs/lib/songxml.py b/openlp/plugins/songs/lib/songxml.py index 2f13e5f60..c4683533d 100644 --- a/openlp/plugins/songs/lib/songxml.py +++ b/openlp/plugins/songs/lib/songxml.py @@ -28,10 +28,12 @@ import sys import os from types import ListType +from xml.etree.ElementTree import ElementTree, XML -sys.path.append(os.path.abspath(u'./../../../..')) +# Do we need these two lines? +#sys.path.append(os.path.abspath(u'./../../../..')) +#sys.path.append(os.path.abspath(os.path.join(u'.', u'..', u'..'))) -from openlp.core.lib import XmlRootClass log = logging.getLogger(__name__) @@ -74,14 +76,77 @@ _BLANK_OPENSONG_XML = \ ''' -class _OpenSong(XmlRootClass): - """Class for import of OpenSong""" - +class _OpenSong(object): + """ + Class for import of OpenSong + """ def __init__(self, xmlContent = None): - """Initialize from given xml content""" - super(_OpenSong, self).__init__() + """ + Initialize from given xml content + """ self.from_buffer(xmlContent) + def _set_from_xml(self, xml, root_tag): + """ + Set song properties from given xml content. + + ``xml`` + Formatted xml tags and values. + ``root_tag`` + The root tag of the xml. + """ + root = ElementTree(element=XML(xml)) + xml_iter = root.getiterator() + for element in xml_iter: + if element.tag != root_tag: + text = element.text + if text is None: + val = text + elif isinstance(text, basestring): + # Strings need special handling to sort the colours out + if text[0] == u'$': + # This might be a hex number, let's try to convert it. + try: + val = int(text[1:], 16) + except ValueError: + pass + else: + # Let's just see if it's a integer. + try: + val = int(text) + except ValueError: + # Ok, it seems to be a string. + val = text + if hasattr(self, u'post_tag_hook'): + (element.tag, val) = \ + self.post_tag_hook(element.tag, val) + setattr(self, element.tag, val) + + def __str__(self): + """ + Return string with all public attributes + + The string is formatted with one attribute per line + If the string is split on newline then the length of the + list is equal to the number of attributes + """ + attributes = [] + for attrib in dir(self): + if not attrib.startswith(u'_'): + attributes.append( + u'%30s : %s' % (attrib, getattr(self, attrib))) + return u'\n'.join(attributes) + + def _get_as_string(self): + """ + Return one string with all public attributes + """ + result = u'' + for attrib in dir(self): + if not attrib.startswith(u'_'): + result += u'_%s_' % getattr(self, attrib) + return result + def _reset(self): """Reset all song attributes""" self._setFromXml(_BLANK_OPENSONG_XML, 'song') From ecbef6a00b2e2e767dc7de915985c3bcab09be86 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 2 Jul 2010 17:54:08 +0100 Subject: [PATCH 11/33] Fix up display layers --- openlp/core/ui/maindisplay.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index d6819cb1c..aaef47612 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -411,9 +411,9 @@ class MainDisplay(DisplayWidget): The path to the image to be displayed """ log.debug(u'adddisplayVideo') + self.displayImage(self.transparent) self.videoDisplay.setHtml(HTMLVIDEO % (path, self.screen[u'size'].width(), self.screen[u'size'].height())) - self.displayImage(self.transparent) def frameView(self, frame, transition=False): """ From c93cad3a20da8a9e80f096e7720005202d46afcb Mon Sep 17 00:00:00 2001 From: andreas Date: Fri, 2 Jul 2010 19:00:23 +0200 Subject: [PATCH 12/33] fixed a small bug --- openlp/plugins/custom/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index f2ac04c1b..8f4cf6a7f 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -141,7 +141,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.custommanager.delete_custom(id) + self.parent.custommanager.delete_object(CustomSlide, id) for row in row_list: self.ListView.takeItem(row) From 0656b34df9a0191f46cdb9466be5a9e93319a822 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 2 Jul 2010 19:21:45 +0100 Subject: [PATCH 13/33] Cleanups --- openlp/core/lib/mediamanageritem.py | 12 +++---- openlp/core/lib/plugin.py | 42 +++++++++++----------- openlp/core/lib/pluginmanager.py | 2 +- openlp/core/lib/serviceitem.py | 2 +- openlp/core/ui/mainwindow.py | 2 +- openlp/plugins/alerts/alertsplugin.py | 2 +- openlp/plugins/images/lib/mediaitem.py | 2 +- openlp/plugins/media/lib/mediaitem.py | 13 ++----- openlp/plugins/media/mediaplugin.py | 2 +- openlp/plugins/songs/forms/editsongform.py | 2 +- openlp/plugins/songs/songsplugin.py | 2 +- 11 files changed, 37 insertions(+), 46 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 322ce8cd0..8ebfe88ae 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -443,7 +443,7 @@ class MediaManagerItem(QtGui.QWidget): service_item = self.buildServiceItem() if service_item: service_item.from_plugin = True - self.parent.preview_controller.addServiceItem(service_item) + self.parent.previewController.addServiceItem(service_item) def onLiveClick(self): """ @@ -460,7 +460,7 @@ class MediaManagerItem(QtGui.QWidget): service_item = self.buildServiceItem() if service_item: service_item.from_plugin = True - self.parent.live_controller.addServiceItem(service_item) + self.parent.liveController.addServiceItem(service_item) def onAddClick(self): """ @@ -479,7 +479,7 @@ class MediaManagerItem(QtGui.QWidget): service_item = self.buildServiceItem() if service_item: service_item.from_plugin = False - self.parent.service_manager.addServiceItem(service_item, + self.parent.serviceManager.addServiceItem(service_item, replace=self.remoteTriggered) else: items = self.ListView.selectedIndexes() @@ -487,7 +487,7 @@ class MediaManagerItem(QtGui.QWidget): service_item = self.buildServiceItem(item) if service_item: service_item.from_plugin = False - self.parent.service_manager.addServiceItem(service_item) + self.parent.serviceManager.addServiceItem(service_item) def onAddEditClick(self): """ @@ -500,7 +500,7 @@ class MediaManagerItem(QtGui.QWidget): 'You must select one or more items')) else: log.debug(self.PluginNameShort + u' Add requested') - service_item = self.parent.service_manager.getServiceItem() + service_item = self.parent.serviceManager.getServiceItem() if not service_item: QtGui.QMessageBox.information(self, translate('MediaManagerItem', 'No Service Item Selected'), @@ -508,7 +508,7 @@ class MediaManagerItem(QtGui.QWidget): 'You must select an existing service item to add to.')) elif self.title.lower() == service_item.name.lower(): self.generateSlideData(service_item) - self.parent.service_manager.addServiceItem(service_item, + self.parent.serviceManager.addServiceItem(service_item, replace=True) else: #Turn off the remote edit update message indicator diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index 1450ef1fe..f1378f4f1 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -124,13 +124,13 @@ class Plugin(QtCore.QObject): self.status = PluginStatus.Inactive # Set up logging self.log = logging.getLogger(self.name) - self.preview_controller = plugin_helpers[u'preview'] - self.live_controller = plugin_helpers[u'live'] - self.render_manager = plugin_helpers[u'render'] - self.service_manager = plugin_helpers[u'service'] - self.settings_form = plugin_helpers[u'settings form'] + self.previewController = plugin_helpers[u'preview'] + self.liveController = plugin_helpers[u'live'] + self.renderManager = plugin_helpers[u'render'] + self.serviceManager = plugin_helpers[u'service'] + self.settingsForm = plugin_helpers[u'settings form'] self.mediadock = plugin_helpers[u'toolbox'] - self.maindisplay = plugin_helpers[u'maindisplay'] + self.displayManager = plugin_helpers[u'displaymanager'] QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_add_service_item' % self.name), self.process_add_service_event) @@ -175,29 +175,29 @@ class Plugin(QtCore.QObject): """ pass - def add_import_menu_item(self, import_menu): + def add_import_menu_item(self, importMenu): """ Create a menu item and add it to the "Import" menu. - ``import_menu`` + ``importMenu`` The Import menu. """ pass - def add_export_menu_item(self, export_menu): + def add_export_menu_item(self, exportMenu): """ Create a menu item and add it to the "Export" menu. - ``export_menu`` + ``exportMenu`` The Export menu """ pass - def add_tools_menu_item(self, tools_menu): + def add_tools_menu_item(self, toolsMenu): """ Create a menu item and add it to the "Tools" menu. - ``tools_menu`` + ``toolsMenu`` The Tools menu """ pass @@ -224,9 +224,9 @@ class Plugin(QtCore.QObject): log.debug(u'process_add_service_event event called for plugin %s' % self.name) if replace: - self.media_item.onAddEditClick() + self.mediaItem.onAddEditClick() else: - self.media_item.onAddClick() + self.mediaItem.onAddClick() def about(self): """ @@ -240,8 +240,8 @@ class Plugin(QtCore.QObject): """ Called by the plugin Manager to initialise anything it needs. """ - if self.media_item: - self.media_item.initialise() + if self.mediaItem: + self.mediaItem.initialise() self.insert_toolbox_item() def finalise(self): @@ -254,19 +254,19 @@ class Plugin(QtCore.QObject): """ Called by the plugin to remove toolbar """ - if self.media_item: + if self.mediaItem: self.mediadock.remove_dock(self.name) if self.settings_tab: - self.settings_form.removeTab(self.name) + self.settingsForm.removeTab(self.name) def insert_toolbox_item(self): """ Called by plugin to replace toolbar """ - if self.media_item: - self.mediadock.insert_dock(self.media_item, self.icon, self.weight) + if self.mediaItem: + self.mediadock.insert_dock(self.mediaItem, self.icon, self.weight) if self.settings_tab: - self.settings_form.insertTab(self.settings_tab, self.weight) + self.settingsForm.insertTab(self.settings_tab, self.weight) def can_delete_theme(self, theme): """ diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index d9ae40845..c9c578603 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -138,7 +138,7 @@ class PluginManager(object): """ for plugin in self.plugins: if plugin.status is not PluginStatus.Disabled: - plugin.media_item = plugin.get_media_manager_item() + plugin.mediaItem = plugin.get_media_manager_item() def hook_settings_tabs(self, settingsform=None): """ diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index dfcad984a..a8988aa84 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -73,7 +73,7 @@ class ServiceItem(object): The plugin that this service item belongs to. """ if plugin: - self.render_manager = plugin.render_manager + self.render_manager = plugin.renderManager self.name = plugin.name self.title = u'' self.shortname = u'' diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index f4d573d20..c816d298d 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -580,7 +580,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.plugin_helpers[u'service'] = self.ServiceManagerContents self.plugin_helpers[u'settings form'] = self.settingsForm self.plugin_helpers[u'toolbox'] = self.mediaDockManager - self.plugin_helpers[u'maindisplay'] = self.displayManager.mainDisplay + self.plugin_helpers[u'displaymanager'] = self.displayManager self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers) # hook methods have to happen after find_plugins. Find plugins needs # the controllers hence the hooks have moved from setupUI() to here diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 57388c538..c6c3593f4 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -73,7 +73,7 @@ class alertsPlugin(Plugin): self.toolsAlertItem.setStatusTip( translate('AlertsPlugin', 'Show an alert message')) self.toolsAlertItem.setShortcut(u'F7') - self.service_manager.parent.ToolsMenu.addAction(self.toolsAlertItem) + self.serviceManager.parent.ToolsMenu.addAction(self.toolsAlertItem) QtCore.QObject.connect(self.toolsAlertItem, QtCore.SIGNAL(u'triggered()'), self.onAlertsTrigger) self.toolsAlertItem.setVisible(False) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index c83de7836..a7f8ae73c 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -178,7 +178,7 @@ class ImageMediaItem(MediaManagerItem): bitem = self.ListView.item(item.row()) filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) frame = QtGui.QImage(unicode(filename)) - self.parent.live_controller.displayManager.displayImageWithText(frame) + self.parent.displayManager.displayImageWithText(frame) def onPreviewClick(self): MediaManagerItem.onPreviewClick(self) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index 10c398912..a5fca6c12 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -101,22 +101,13 @@ class MediaMediaItem(MediaManagerItem): self.PageLayout.addWidget(self.ImageWidget) def onReplaceClick(self): -# if self.background: -# self.background = False -# Receiver.send_message(u'videodisplay_stop') -# else: -# self.background = True + if check_item_selected(self.ListView, translate('ImagePlugin.MediaItem', 'You must select an item to process.')): item = self.ListView.currentItem() filename = unicode(item.data(QtCore.Qt.UserRole).toString()) - self.parent.live_controller.displayManager.displayVideo(filename) -# items = self.ListView.selectedIndexes() -# for item in items: -# bitem = self.ListView.item(item.row()) -# filename = unicode(bitem.data(QtCore.Qt.UserRole).toString()) -# Receiver.send_message(u'videodisplay_background', filename) + self.parent.displayManager.displayVideo(filename) def generateSlideData(self, service_item, item=None): if item is None: diff --git a/openlp/plugins/media/mediaplugin.py b/openlp/plugins/media/mediaplugin.py index 24138a0f5..70f88ab50 100644 --- a/openlp/plugins/media/mediaplugin.py +++ b/openlp/plugins/media/mediaplugin.py @@ -63,7 +63,7 @@ class MediaPlugin(Plugin): if len(value) == 2: if list.find(value[1]) == -1: list += u'*.%s ' % value[1] - self.service_manager.supportedSuffixes(value[1]) + self.serviceManager.supportedSuffixes(value[1]) type = u'' return list, type diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 8c04bed0a..8c39a2fe8 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -88,7 +88,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): QtCore.SIGNAL(u'activated(int)'), self.onThemeComboChanged) QtCore.QObject.connect(self.ThemeAddButton, QtCore.SIGNAL(u'clicked()'), - self.parent.parent.render_manager.theme_manager.onAddTheme) + self.parent.parent.renderManager.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/songsplugin.py b/openlp/plugins/songs/songsplugin.py index d9f9bb95f..994c9884e 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -67,7 +67,7 @@ class SongsPlugin(Plugin): def initialise(self): log.info(u'Songs Initialising') Plugin.initialise(self) - self.media_item.displayResultsSong( + self.mediaItem.displayResultsSong( self.manager.get_all_objects(Song, Song.title)) def get_media_manager_item(self): From db961c76dbbccff52815fba51f8a3c1ddeebb661 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Fri, 2 Jul 2010 23:18:54 +0100 Subject: [PATCH 14/33] Clean up after TRB143's attempts to outclean Meths Fix pptview plugin when running as exe --- openlp/core/lib/plugin.py | 1 + openlp/core/ui/mainwindow.py | 1 + openlp/plugins/presentations/lib/mediaitem.py | 2 +- openlp/plugins/presentations/lib/pptviewcontroller.py | 7 ++++--- 4 files changed, 7 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index f1378f4f1..c8397f39a 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -131,6 +131,7 @@ class Plugin(QtCore.QObject): self.settingsForm = plugin_helpers[u'settings form'] self.mediadock = plugin_helpers[u'toolbox'] self.displayManager = plugin_helpers[u'displaymanager'] + self.pluginManager = plugin_helpers[u'pluginmanager'] QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_add_service_item' % self.name), self.process_add_service_event) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index c816d298d..3f392655d 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -581,6 +581,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.plugin_helpers[u'settings form'] = self.settingsForm self.plugin_helpers[u'toolbox'] = self.mediaDockManager self.plugin_helpers[u'displaymanager'] = self.displayManager + self.plugin_helpers[u'pluginmanager'] = self.plugin_manager self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers) # hook methods have to happen after find_plugins. Find plugins needs # the controllers hence the hooks have moved from setupUI() to here diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index ee50dd556..6f6d6fdb1 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -77,7 +77,7 @@ class PresentationMediaItem(MediaManagerItem): for type in types: if fileType.find(type) == -1: fileType += u'*%s ' % type - self.parent.service_manager.supportedSuffixes(type) + self.parent.serviceManager.supportedSuffixes(type) self.OnNewFileMasks = translate('PresentationPlugin.MediaItem', 'Presentations (%s)' % fileType) diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index e8f0d9390..2c108333c 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -79,8 +79,9 @@ class PptviewController(PresentationController): if self.process: return log.debug(u'start PPTView') - self.process = cdll.LoadLibrary( - r'openlp\plugins\presentations\lib\pptviewlib\pptviewlib.dll') + dllpath = os.path.join(self.plugin.pluginManager.basepath, + u'presentations', u'lib', u'pptviewlib', u'pptviewlib.dll') + self.process = cdll.LoadLibrary(dllpath) #self.process.SetDebug(1) def kill(self): @@ -118,7 +119,7 @@ class PptviewDocument(PresentationDocument): log.debug(u'LoadPresentation') #if self.pptid >= 0: # self.close_presentation() - rendermanager = self.controller.plugin.render_manager + rendermanager = self.controller.plugin.renderManager rect = rendermanager.screens.current[u'size'] rect = RECT(rect.x(), rect.y(), rect.right(), rect.bottom()) filepath = str(self.filepath.replace(u'/', u'\\')) From 0c184d5e601ccf3e83207d61cf36c21305ae7837 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Sat, 3 Jul 2010 02:07:36 +0100 Subject: [PATCH 15/33] Remove some unused methods --- openlp/plugins/songs/lib/songxml.py | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/openlp/plugins/songs/lib/songxml.py b/openlp/plugins/songs/lib/songxml.py index e26a06e90..08234f093 100644 --- a/openlp/plugins/songs/lib/songxml.py +++ b/openlp/plugins/songs/lib/songxml.py @@ -317,14 +317,6 @@ class Song(object): self.set_lyrics(u'') return - def set_songid(self, songid): - """Set the songid for the database""" - self.songid = songid - - def get_songid(self): - """Return the songid for the database""" - return self.songid - def from_opensong_buffer(self, xmlcontent): """Initialize from buffer(string) of xml lines in opensong format""" self._reset() @@ -388,10 +380,6 @@ class Song(object): """Return title value""" return self.title - def get_search_title(self): - """Return search_title""" - return self.search_title - def from_ccli_text_buffer(self, textList): """ Create song from a list of texts (strings) - CCLI text format expected From 497d1c9dc99c9b56e46a92f6134fdafbeb3ebe59 Mon Sep 17 00:00:00 2001 From: Jon Tibble Date: Sat, 3 Jul 2010 02:33:40 +0100 Subject: [PATCH 16/33] XML: Put it where it should be --- documentation/source/core/lib.rst | 13 -- openlp/core/lib/__init__.py | 1 - openlp/plugins/custom/forms/editcustomform.py | 9 +- openlp/plugins/custom/lib/__init__.py | 1 + openlp/plugins/custom/lib/customxmlhandler.py | 156 ++++++++++++++++++ openlp/plugins/custom/lib/mediaitem.py | 7 +- openlp/plugins/songs/forms/editsongform.py | 4 +- openlp/plugins/songs/lib/__init__.py | 1 + openlp/plugins/songs/lib/mediaitem.py | 5 +- openlp/plugins/songs/lib/songimport.py | 4 +- .../songs}/lib/songxmlhandler.py | 0 11 files changed, 174 insertions(+), 27 deletions(-) create mode 100644 openlp/plugins/custom/lib/customxmlhandler.py rename openlp/{core => plugins/songs}/lib/songxmlhandler.py (100%) diff --git a/documentation/source/core/lib.rst b/documentation/source/core/lib.rst index dd90b24a9..43ca90b3b 100644 --- a/documentation/source/core/lib.rst +++ b/documentation/source/core/lib.rst @@ -60,18 +60,6 @@ .. autoclass:: openlp.core.lib.settingstab.SettingsTab :members: -:mod:`SongXMLBuilder` ---------------------- - -.. autoclass:: openlp.core.lib.songxmlhandler.SongXMLBuilder - :members: - -:mod:`SongXMLParser` --------------------- - -.. autoclass:: openlp.core.lib.songxmlhandler.SongXMLParser - :members: - :mod:`ThemeXML` --------------- @@ -83,4 +71,3 @@ .. autoclass:: openlp.core.lib.toolbar.OpenLPToolbar :members: - diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 5a4725c80..11ba7e2dc 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -221,7 +221,6 @@ from serviceitem import ServiceItemType from serviceitem import ItemCapabilities from toolbar import OpenLPToolbar from dockwidget import OpenLPDockWidget -from songxmlhandler import SongXMLBuilder, SongXMLParser from themexmlhandler import ThemeXML from renderer import Renderer from rendermanager import RenderManager diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index a266c44c5..24810eb0b 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -28,7 +28,8 @@ import logging from PyQt4 import QtCore, QtGui from editcustomdialog import Ui_customEditDialog -from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate +from openlp.core.lib import Receiver, translate +from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide log = logging.getLogger(__name__) @@ -119,8 +120,8 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): self.customSlide = self.custommanager.get_object(CustomSlide, id) self.TitleEdit.setText(self.customSlide.title) self.CreditEdit.setText(self.customSlide.credits) - songXML = SongXMLParser(self.customSlide.text) - verseList = songXML.get_verses() + customXML = CustomXMLParser(self.customSlide.text) + verseList = customXML.get_verses() for verse in verseList: self.VerseListView.addItem(verse[1]) theme = self.customSlide.theme_name @@ -152,7 +153,7 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): translate('CustomPlugin.EditCustomForm', 'Error'), message, QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) return False - sxml = SongXMLBuilder() + sxml = CustomXMLBuilder() sxml.new_document() sxml.add_lyrics_to_song() count = 1 diff --git a/openlp/plugins/custom/lib/__init__.py b/openlp/plugins/custom/lib/__init__.py index 0d9de3173..1eea5e32d 100644 --- a/openlp/plugins/custom/lib/__init__.py +++ b/openlp/plugins/custom/lib/__init__.py @@ -23,5 +23,6 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +from customxmlhandler import CustomXMLBuilder, CustomXMLParser from mediaitem import CustomMediaItem from customtab import CustomTab diff --git a/openlp/plugins/custom/lib/customxmlhandler.py b/openlp/plugins/custom/lib/customxmlhandler.py new file mode 100644 index 000000000..ebb8b1685 --- /dev/null +++ b/openlp/plugins/custom/lib/customxmlhandler.py @@ -0,0 +1,156 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2010 Raoul Snyman # +# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # +# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # +# Thompson, Jon Tibble, Carsten Tinggaard # +# --------------------------------------------------------------------------- # +# 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 :mod:`customxmlhandler` module provides the XML functionality for custom +slides + +The basic XML is of the format:: + + + + + + + + + +""" + +import logging + +from xml.dom.minidom import Document +from xml.etree.ElementTree import ElementTree, XML, dump +from xml.parsers.expat import ExpatError + +log = logging.getLogger(__name__) + +class CustomXMLBuilder(object): + """ + This class builds the XML used to describe songs. + """ + log.info(u'CustomXMLBuilder Loaded') + + def __init__(self): + """ + Set up the song builder. + """ + # Create the minidom document + self.song_xml = Document() + + def new_document(self): + """ + Create a new song XML document. + """ + # Create the base element + self.song = self.song_xml.createElement(u'song') + self.song_xml.appendChild(self.song) + self.song.setAttribute(u'version', u'1.0') + + def add_lyrics_to_song(self): + """ + Set up and add a ```` tag which contains the lyrics of the + song. + """ + # Create the main element + self.lyrics = self.song_xml.createElement(u'lyrics') + self.lyrics.setAttribute(u'language', u'en') + self.song.appendChild(self.lyrics) + + def add_verse_to_lyrics(self, type, number, content): + """ + Add a verse to the ```` tag. + + ``type`` + A string denoting the type of verse. Possible values are "Chorus", + "Verse", "Bridge", and "Custom". + + ``number`` + An integer denoting the number of the item, for example: verse 1. + + ``content`` + The actual text of the verse to be stored. + """ + #log.debug(u'add_verse_to_lyrics %s, %s\n%s' % (type, number, content)) + verse = self.song_xml.createElement(u'verse') + verse.setAttribute(u'type', type) + verse.setAttribute(u'label', number) + self.lyrics.appendChild(verse) + # add data as a CDATA section to protect the XML from special chars + cds = self.song_xml.createCDATASection(content) + verse.appendChild(cds) + + def dump_xml(self): + """ + Debugging aid to dump XML so that we can see what we have. + """ + return self.song_xml.toprettyxml(indent=u' ') + + def extract_xml(self): + """ + Extract our newly created XML song. + """ + return self.song_xml.toxml(u'utf-8') + + +class CustomXMLParser(object): + """ + A class to read in and parse a song's XML. + """ + log.info(u'CustomXMLParser Loaded') + + def __init__(self, xml): + """ + Set up our song XML parser. + + ``xml`` + The XML of the song to be parsed. + """ + self.song_xml = None + try: + self.song_xml = ElementTree( + element=XML(unicode(xml).encode('unicode-escape'))) + except ExpatError: + log.exception(u'Invalid xml %s', xml) + + def get_verses(self): + """ + Iterates through the verses in the XML and returns a list of verses + and their attributes. + """ + xml_iter = self.song_xml.getiterator() + verse_list = [] + for element in xml_iter: + if element.tag == u'verse': + if element.text is None: + element.text = u'' + verse_list.append([element.attrib, + unicode(element.text).decode('unicode-escape')]) + return verse_list + + def dump_xml(self): + """ + Debugging aid to dump XML so that we can see what we have. + """ + return dump(self.song_xml) diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 8f4cf6a7f..9cc5627ed 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -27,8 +27,9 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD, \ +from openlp.core.lib import MediaManagerItem, BaseListWithDnD, \ Receiver, ItemCapabilities, translate, check_item_selected +from openlp.plugins.custom.lib import CustomXMLParser from openlp.plugins.custom.lib.db import CustomSlide log = logging.getLogger(__name__) @@ -170,8 +171,8 @@ class CustomMediaItem(MediaManagerItem): theme = customSlide.theme_name if theme: service_item.theme = theme - songXML = SongXMLParser(customSlide.text) - verseList = songXML.get_verses() + customXML = CustomXMLParser(customSlide.text) + verseList = customXML.get_verses() for verse in verseList: raw_slides.append(verse[1]) service_item.title = title diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 8c39a2fe8..18c613abf 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -28,9 +28,9 @@ import re from PyQt4 import QtCore, QtGui -from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate +from openlp.core.lib import Receiver, translate from openlp.plugins.songs.forms import EditVerseForm -from openlp.plugins.songs.lib import VerseType +from openlp.plugins.songs.lib import SongXMLBuilder, SongXMLParser, VerseType from openlp.plugins.songs.lib.db import Book, Song, Author, Topic from editsongdialog import Ui_EditSongDialog diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index 8c07c31c7..85206f5be 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -137,6 +137,7 @@ class VerseType(object): unicode(VerseType.to_string(VerseType.Other)).lower(): return VerseType.Other +from songxmlhandler import SongXMLBuilder, SongXMLParser from songstab import SongsTab from mediaitem import SongMediaItem from songimport import SongImport diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 4557f53fa..496840412 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -27,10 +27,11 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import MediaManagerItem, SongXMLParser, \ - BaseListWithDnD, Receiver, ItemCapabilities, translate, check_item_selected +from openlp.core.lib import MediaManagerItem, BaseListWithDnD, Receiver, \ + ItemCapabilities, translate, check_item_selected from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \ ImportWizardForm +from openlp.plugins.songs.lib import SongXMLParser from openlp.plugins.songs.lib.db import Song log = logging.getLogger(__name__) diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py index 115f52e58..5b083c7c5 100644 --- a/openlp/plugins/songs/lib/songimport.py +++ b/openlp/plugins/songs/lib/songimport.py @@ -25,8 +25,8 @@ import re -from openlp.core.lib import SongXMLBuilder, translate -from openlp.plugins.songs.lib import VerseType +from openlp.core.lib import translate +from openlp.plugins.songs.lib import SongXMLBuilder, VerseType from openlp.plugins.songs.lib.db import Song, Author, Topic, Book class SongImport(object): diff --git a/openlp/core/lib/songxmlhandler.py b/openlp/plugins/songs/lib/songxmlhandler.py similarity index 100% rename from openlp/core/lib/songxmlhandler.py rename to openlp/plugins/songs/lib/songxmlhandler.py From fda7412f75dfa20062cf213747b2320f7ba6499e Mon Sep 17 00:00:00 2001 From: Phill Ridout Date: Sat, 3 Jul 2010 04:06:02 +0100 Subject: [PATCH 17/33] added css to remove white space arround background video adjusted spacing, added escapes to double quotes and moved the > on the body tag to its proper place! --- openlp/core/ui/maindisplay.py | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index aaef47612..36df43988 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -43,19 +43,27 @@ HTMLIMAGE = """ #http://www.steveheffernan.com/html5-video-player/demo-video-player.html HTMLVIDEO = u""" - - \" - - + + + + """ class DisplayManager(QtGui.QWidget): From 5f15b2fd7ddf4f635f6fa993a16fbc7b213e199f Mon Sep 17 00:00:00 2001 From: Phill Ridout Date: Sat, 3 Jul 2010 06:41:24 +0100 Subject: [PATCH 18/33] added missing --- openlp/core/ui/maindisplay.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 36df43988..c397b570c 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -57,6 +57,7 @@ HTMLVIDEO = u""" video.volume = 0; } +