diff --git a/openlp/core/lib/screen.py b/openlp/core/lib/screen.py index 9b241c3fe..e0a356990 100644 --- a/openlp/core/lib/screen.py +++ b/openlp/core/lib/screen.py @@ -71,7 +71,7 @@ class ScreenList(object): screen_list.screen_list = [] screen_list.display_count = 0 screen_list.screen_count_changed() - screen_list._load_screen_settings() + screen_list.load_screen_settings() QtCore.QObject.connect(desktop, QtCore.SIGNAL(u'resized(int)'), screen_list.screen_resolution_changed) QtCore.QObject.connect(desktop, QtCore.SIGNAL(u'screenCountChanged(int)'), screen_list.screen_count_changed) return screen_list @@ -239,7 +239,7 @@ class ScreenList(object): y >= size.y() and y <= (size.y() + size.height()): return screen[u'number'] - def _load_screen_settings(self): + def load_screen_settings(self): """ Loads the screen size and the monitor number from the settings. """ diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 18e9f54d8..00670d490 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -37,7 +37,9 @@ import logging import os import uuid -from openlp.core.lib import build_icon, clean_tags, expand_tags, translate, ImageSource +from PyQt4 import QtCore, QtGui + +from openlp.core.lib import build_icon, clean_tags, expand_tags, translate, ImageSource, Settings log = logging.getLogger(__name__) @@ -405,13 +407,15 @@ class ServiceItem(object): for slide in serviceitem[u'serviceitem'][u'data']: self._raw_frames.append(slide) elif self.service_item_type == ServiceItemType.Image: + settingsSection = serviceitem[u'serviceitem'][u'header'][u'name'] + background = QtGui.QColor(Settings().value(settingsSection + u'/background color', u'#000000')) if path: for text_image in serviceitem[u'serviceitem'][u'data']: filename = os.path.join(path, text_image) - self.add_from_image(filename, text_image) + self.add_from_image(filename, text_image, background) else: for text_image in serviceitem[u'serviceitem'][u'data']: - self.add_from_image(text_image[u'path'], text_image[u'title']) + self.add_from_image(text_image[u'path'], text_image[u'title'], background) elif self.service_item_type == ServiceItemType.Command: for text_image in serviceitem[u'serviceitem'][u'data']: if path: diff --git a/openlp/core/theme/__init__.py b/openlp/core/theme/__init__.py index f9961eedd..4d1997b82 100644 --- a/openlp/core/theme/__init__.py +++ b/openlp/core/theme/__init__.py @@ -26,5 +26,9 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`~openlp.core.theme` module contains all the themeing functions used by +OpenLP when displaying a song or a scripture. +""" from openlp.core.theme.theme import Theme diff --git a/openlp/core/ui/media/vendor/__init__.py b/openlp/core/ui/media/vendor/__init__.py index 7dc74a8e4..317fb9f81 100644 --- a/openlp/core/ui/media/vendor/__init__.py +++ b/openlp/core/ui/media/vendor/__init__.py @@ -26,3 +26,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`~openlp.core.ui.media.vendor` module contains any scripts or libraries +from 3rd party vendors which are required to make certain media modules work. +""" diff --git a/openlp/plugins/alerts/forms/__init__.py b/openlp/plugins/alerts/forms/__init__.py index 121e24f97..e97fdfed3 100644 --- a/openlp/plugins/alerts/forms/__init__.py +++ b/openlp/plugins/alerts/forms/__init__.py @@ -26,5 +26,31 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +Forms in OpenLP are made up of two classes. One class holds all the graphical +elements, like buttons and lists, and the other class holds all the functional +code, like slots and loading and saving. + +The first class, commonly known as the **Dialog** class, is typically named +``Ui_Dialog``. It is a slightly modified version of the class that the +``pyuic4`` command produces from Qt4's .ui file. Typical modifications will be +converting most strings from "" to u'' and using OpenLP's ``translate()`` +function for translating strings. + +The second class, commonly known as the **Form** class, is typically named +``Form``. This class is the one which is instantiated and used. It uses +dual inheritance to inherit from (usually) QtGui.QDialog and the Ui class +mentioned above, like so:: + + class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog): + + def __init__(self, parent=None): + QtGui.QDialog.__init__(self, parent) + self.setupUi(self) + +This allows OpenLP to use ``self.object`` for all the GUI elements while keeping +them separate from the functionality, so that it is easier to recreate the GUI +from the .ui files later if necessary. +""" from alertform import AlertForm diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index a3691c7dc..ab0f7c1d9 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -26,6 +26,10 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`~openlp.plugins.alerts.lib.alertsmanager` module contains the part of +the plugin which manages storing and displaying of alerts. +""" import logging diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 24c5e742f..116c6454a 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -26,6 +26,10 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`~openlp.plugins.custom.customplugin` module contains the Plugin class +for the Custom Slides plugin. +""" import logging diff --git a/openlp/plugins/custom/lib/customtab.py b/openlp/plugins/custom/lib/customtab.py index 31c5cc737..5b0b7f11f 100644 --- a/openlp/plugins/custom/lib/customtab.py +++ b/openlp/plugins/custom/lib/customtab.py @@ -26,6 +26,10 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`~openlp.plugins.custom.lib.customtab` module contains the settings tab +for the Custom Slides plugin, which is inserted into the configuration dialog. +""" from PyQt4 import QtCore, QtGui @@ -66,6 +70,9 @@ class CustomTab(SettingsTab): 'Import missing custom slides from service files')) def onDisplayFooterCheckBoxChanged(self, check_state): + """ + Toggle the setting for displaying the footer. + """ self.displayFooter = False # we have a set value convert to True/False if check_state == QtCore.Qt.Checked: diff --git a/openlp/plugins/custom/lib/customxmlhandler.py b/openlp/plugins/custom/lib/customxmlhandler.py index 4d5627899..a8d2e4ce6 100644 --- a/openlp/plugins/custom/lib/customxmlhandler.py +++ b/openlp/plugins/custom/lib/customxmlhandler.py @@ -50,6 +50,7 @@ from lxml import etree, objectify log = logging.getLogger(__name__) +#TODO: These classes need to be refactored into a single class. class CustomXMLBuilder(object): """ This class builds the XML used to describe songs. @@ -84,11 +85,11 @@ class CustomXMLBuilder(object): self.lyrics.setAttribute(u'language', u'en') self.song.appendChild(self.lyrics) - def add_verse_to_lyrics(self, type, number, content): + def add_verse_to_lyrics(self, verse_type, number, content): """ Add a verse to the ```` tag. - ``type`` + ``verse_type`` A string denoting the type of verse. Possible values are "Chorus", "Verse", "Bridge", and "Custom". @@ -99,7 +100,7 @@ class CustomXMLBuilder(object): The actual text of the verse to be stored. """ verse = self.custom_xml.createElement(u'verse') - verse.setAttribute(u'type', type) + verse.setAttribute(u'type', verse_type) verse.setAttribute(u'label', number) self.lyrics.appendChild(verse) # add data as a CDATA section to protect the XML from special chars diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 14f164de9..515faa18f 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -88,7 +88,7 @@ class PresentationPlugin(Plugin): if self.controllers[controller].enabled(): try: self.controllers[controller].start_process() - except: + except Exception: log.warn(u'Failed to start controller process') self.controllers[controller].available = False self.mediaItem.buildFileMaskString() diff --git a/openlp/plugins/songs/forms/__init__.py b/openlp/plugins/songs/forms/__init__.py index 58dd0408e..a2e80dc54 100644 --- a/openlp/plugins/songs/forms/__init__.py +++ b/openlp/plugins/songs/forms/__init__.py @@ -26,7 +26,6 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - """ Forms in OpenLP are made up of two classes. One class holds all the graphical elements, like buttons and lists, and the other class holds all the functional diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 889db7eb0..83adffb92 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -26,6 +26,10 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`~openlp.plugins.songs.forms.editsongform` module contains the form +used to edit songs. +""" import logging import re @@ -43,7 +47,7 @@ from openlp.plugins.songs.forms import EditVerseForm, MediaFilesForm from openlp.plugins.songs.lib import SongXML, VerseType, clean_song from openlp.plugins.songs.lib.db import Book, Song, Author, Topic, MediaFile from openlp.plugins.songs.lib.ui import SongStrings -from editsongdialog import Ui_EditSongDialog +from openlp.plugins.songs.forms.editsongdialog import Ui_EditSongDialog log = logging.getLogger(__name__) @@ -57,7 +61,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): """ Constructor """ - QtGui.QDialog.__init__(self, parent) + super(EditSongForm, self).__init__(parent) self.mediaitem = mediaitem self.song = None # can this be automated? @@ -114,12 +118,18 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.whitespace = re.compile(r'\W+', re.UNICODE) def initialise(self): + """ + Set up the form for when it is displayed. + """ self.verseEditButton.setEnabled(False) self.verseDeleteButton.setEnabled(False) self.authorRemoveButton.setEnabled(False) self.topicRemoveButton.setEnabled(False) def loadAuthors(self): + """ + Load the authors from the database into the combobox. + """ authors = self.manager.get_all_objects(Author, order_by_ref=Author.display_name) self.authorsComboBox.clear() @@ -133,14 +143,23 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): set_case_insensitive_completer(self.authors, self.authorsComboBox) def loadTopics(self): + """ + Load the topics into the combobox. + """ self.topics = [] self.__loadObjects(Topic, self.topicsComboBox, self.topics) def loadBooks(self): + """ + Load the song books into the combobox + """ self.books = [] self.__loadObjects(Book, self.songBookComboBox, self.books) def __loadObjects(self, cls, combo, cache): + """ + Generically load a set of objects into a cache and a combobox. + """ objects = self.manager.get_all_objects(cls, order_by_ref=cls.name) combo.clear() combo.addItem(u'') @@ -152,6 +171,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): set_case_insensitive_completer(cache, combo) def loadThemes(self, theme_list): + """ + Load the themes into a combobox. + """ self.themeComboBox.clear() self.themeComboBox.addItem(u'') self.themes = theme_list @@ -159,6 +181,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): set_case_insensitive_completer(self.themes, self.themeComboBox) def loadMediaFiles(self): + """ + Load the media files into a combobox. + """ self.audioAddFromMediaButton.setVisible(False) for plugin in self.parent().pluginManager.plugins: if plugin.name == u'media' and plugin.status == PluginStatus.Active: @@ -167,6 +192,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): break def newSong(self): + """ + Blank the edit form out in preparation for a new song. + """ log.debug(u'New Song') self.song = None self.initialise() @@ -314,6 +342,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.verseListWidget.repaint() def onAuthorAddButtonClicked(self): + """ + Add the author to the list of authors associated with this song when the button is clicked. + """ item = int(self.authorsComboBox.currentIndex()) text = self.authorsComboBox.currentText().strip(u' \r\n\t') # This if statement is for OS X, which doesn't seem to work well with @@ -362,10 +393,16 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.authorsListView.addItem(author_item) def onAuthorsListViewClicked(self): + """ + Run a set of actions when an author in the list is selected (mainly enable the delete button). + """ if self.authorsListView.count() > 1: self.authorRemoveButton.setEnabled(True) def onAuthorRemoveButtonClicked(self): + """ + Remove the author from the list when the delete button is clicked. + """ self.authorRemoveButton.setEnabled(False) item = self.authorsListView.currentItem() row = self.authorsListView.row(item) diff --git a/openlp/plugins/songs/lib/wowimport.py b/openlp/plugins/songs/lib/wowimport.py index b9f854468..aa327c0a0 100644 --- a/openlp/plugins/songs/lib/wowimport.py +++ b/openlp/plugins/songs/lib/wowimport.py @@ -107,13 +107,13 @@ class WowImport(SongImport): """ if isinstance(self.importSource, list): self.importWizard.progressBar.setMaximum(len(self.importSource)) - for file in self.importSource: + for source in self.importSource: if self.stopImportFlag: return self.setDefaults() - song_data = open(file, 'rb') + song_data = open(source, 'rb') if song_data.read(19) != u'WoW File\nSong Words': - self.logError(file, unicode(translate('SongsPlugin.WordsofWorshipSongImport', + self.logError(source, unicode(translate('SongsPlugin.WordsofWorshipSongImport', ('Invalid Words of Worship song file. Missing "Wow File\\nSong Words" header.')))) continue # Seek to byte which stores number of blocks in the song @@ -121,7 +121,7 @@ class WowImport(SongImport): no_of_blocks = ord(song_data.read(1)) song_data.seek(66) if song_data.read(16) != u'CSongDoc::CBlock': - self.logError(file, unicode(translate('SongsPlugin.WordsofWorshipSongImport', + self.logError(source, unicode(translate('SongsPlugin.WordsofWorshipSongImport', ('Invalid Words of Worship song file. Missing "CSongDoc::CBlock" string.')))) continue # Seek to the beginning of the first block @@ -150,9 +150,9 @@ class WowImport(SongImport): copyright_length = ord(song_data.read(1)) if copyright_length: self.addCopyright(unicode(song_data.read(copyright_length), u'cp1252')) - file_name = os.path.split(file)[1] + file_name = os.path.split(source)[1] # Get the song title self.title = file_name.rpartition(u'.')[0] song_data.close() if not self.finish(): - self.logError(file) + self.logError(source) diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index aef2d0585..df157ade3 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -26,6 +26,10 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`~openlp.plugins.songs.songsplugin` module contains the Plugin class +for the Songs plugin. +""" import logging import os