diff --git a/openlp/__init__.py b/openlp/__init__.py index 1a348a0df..98d19aecc 100644 --- a/openlp/__init__.py +++ b/openlp/__init__.py @@ -22,3 +22,6 @@ # 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` module contains all the project produced OpenLP functionality +""" diff --git a/openlp/core/__init__.py b/openlp/core/__init__.py index 1a348a0df..5b2bbe056 100644 --- a/openlp/core/__init__.py +++ b/openlp/core/__init__.py @@ -22,3 +22,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:`core` module provides all core application functions + +All the core functions of the OpenLP application including the GUI, settings, +logging and a plugin framework are contained within the openlp.core module. +""" diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index e09b6f1b4..ffc61cdcc 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -95,24 +95,24 @@ def build_icon(icon): The icon to build. This can be a QIcon, a resource string in the form ``:/resource/file.png``, or a file location like ``/path/to/file.png``. """ - ButtonIcon = None + button_icon = None if isinstance(icon, QtGui.QIcon): - ButtonIcon = icon + button_icon = icon elif isinstance(icon, basestring): - ButtonIcon = QtGui.QIcon() + button_icon = QtGui.QIcon() if icon.startswith(u':/'): - ButtonIcon.addPixmap( - QtGui.QPixmap(icon), QtGui.QIcon.Normal, QtGui.QIcon.Off) + button_icon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal, + QtGui.QIcon.Off) else: - ButtonIcon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), + button_icon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), QtGui.QIcon.Normal, QtGui.QIcon.Off) elif isinstance(icon, QtGui.QImage): - ButtonIcon = QtGui.QIcon() - ButtonIcon.addPixmap( - QtGui.QPixmap.fromImage(icon), QtGui.QIcon.Normal, QtGui.QIcon.Off) - return ButtonIcon + button_icon = QtGui.QIcon() + button_icon.addPixmap(QtGui.QPixmap.fromImage(icon), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + return button_icon -def contextMenuAction(base, icon, text, slot): +def context_menu_action(base, icon, text, slot): """ Utility method to help build context menus for plugins """ @@ -122,7 +122,7 @@ def contextMenuAction(base, icon, text, slot): QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) return action -def contextMenu(base, icon, text): +def context_menu(base, icon, text): """ Utility method to help build context menus for plugins """ @@ -130,7 +130,7 @@ def contextMenu(base, icon, text): action.setIcon(build_icon(icon)) return action -def contextMenuSeparator(base): +def context_menu_separator(base): """ Add a separator to a context menu """ @@ -152,12 +152,12 @@ def resize_image(image, width, height): realw = preview.width() realh = preview.height() # and move it to the centre of the preview space - newImage = QtGui.QImage(width, height, + new_image = QtGui.QImage(width, height, QtGui.QImage.Format_ARGB32_Premultiplied) - newImage.fill(QtCore.Qt.black) - painter = QtGui.QPainter(newImage) + new_image.fill(QtCore.Qt.black) + painter = QtGui.QPainter(new_image) painter.drawImage((width - realw) / 2, (height - realh) / 2, preview) - return newImage + return new_image class ThemeLevel(object): diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 9a6b30a91..88b9afb11 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -28,7 +28,7 @@ import os from PyQt4 import QtCore, QtGui -from openlp.core.lib import contextMenuAction, contextMenuSeparator, \ +from openlp.core.lib import context_menu_action, context_menu_separator, \ SettingsManager, OpenLPToolbar, ServiceItem, build_icon log = logging.getLogger(__name__) @@ -271,34 +271,34 @@ class MediaManagerItem(QtGui.QWidget): self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) if self.hasEditIcon: self.ListView.addAction( - contextMenuAction( + context_menu_action( self.ListView, u':/general/general_edit.png', u'%s %s' % (self.trUtf8('&Edit'), self.PluginNameVisible), self.onEditClick)) - self.ListView.addAction(contextMenuSeparator(self.ListView)) + self.ListView.addAction(context_menu_separator(self.ListView)) if self.hasDeleteIcon: self.ListView.addAction( - contextMenuAction( + context_menu_action( self.ListView, u':/general/general_delete.png', u'%s %s' % (self.trUtf8('&Delete'), self.PluginNameVisible), self.onDeleteClick)) - self.ListView.addAction(contextMenuSeparator(self.ListView)) + self.ListView.addAction(context_menu_separator(self.ListView)) self.ListView.addAction( - contextMenuAction( + context_menu_action( self.ListView, u':/general/general_preview.png', u'%s %s' % (self.trUtf8('&Preview'), self.PluginNameVisible), self.onPreviewClick)) self.ListView.addAction( - contextMenuAction( + context_menu_action( self.ListView, u':/general/general_live.png', self.trUtf8('&Show Live'), self.onLiveClick)) self.ListView.addAction( - contextMenuAction( + context_menu_action( self.ListView, u':/general/general_add.png', self.trUtf8('&Add to Service'), self.onAddClick)) if self.addToServiceItem: self.ListView.addAction( - contextMenuAction( + context_menu_action( self.ListView, u':/general/general_add.png', self.trUtf8('&Add to selected Service Item'), self.onAddEditClick)) @@ -309,8 +309,7 @@ class MediaManagerItem(QtGui.QWidget): def initialise(self): """ Implement this method in your descendent media manager item to - do any UI or other initialisation. This method is called - automatically. + do any UI or other initialisation. This method is called automatically. """ pass @@ -351,8 +350,7 @@ class MediaManagerItem(QtGui.QWidget): def validate(self, file, thumb): """ - Validates to see if the file still exists or - thumbnail is up to date + Validates to see if the file still exists or thumbnail is up to date """ if os.path.exists(file): filedate = os.stat(file).st_mtime @@ -467,9 +465,9 @@ class MediaManagerItem(QtGui.QWidget): """ service_item = ServiceItem(self.parent) if self.ServiceItemIconName: - service_item.addIcon(self.ServiceItemIconName) + service_item.add_icon(self.ServiceItemIconName) else: - service_item.addIcon( + service_item.add_icon( u':/media/media_' + self.PluginNameShort.lower() + u'.png') if self.generateSlideData(service_item, item): return service_item diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index 95bf3971c..d9ae40845 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -22,7 +22,9 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - +""" +Provide plugin management +""" import os import sys import logging diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 9fe7ac060..3d3cec2c9 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -22,6 +22,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:`serviceitem` provides the service item functionality including the +type and capability of an item. +""" import logging import os @@ -43,6 +47,9 @@ class ServiceItemType(object): Command = 3 class ItemCapabilities(object): + """ + Provides an enumeration of a serviceitem's capabilities + """ AllowsPreview = 1 AllowsEdit = 2 AllowsMaintain = 3 @@ -66,9 +73,10 @@ class ServiceItem(object): The plugin that this service item belongs to. """ if plugin: - self.RenderManager = plugin.render_manager + self.render_manager = plugin.render_manager self.name = plugin.name self.title = u'' + self.shortname = u'' self.audit = u'' self.items = [] self.iconic_representation = None @@ -83,14 +91,27 @@ class ServiceItem(object): self.capabilities = [] self.is_valid = True self.cache = [] + self.icon = None def add_capability(self, capability): + """ + Add an ItemCapability to a ServiceItem + + ``capability`` + The capability to add + """ self.capabilities.append(capability) def is_capable(self, capability): + """ + Tell the caller if a ServiceItem has a capability + + ``capability`` + The capability to test for + """ return capability in self.capabilities - def addIcon(self, icon): + def add_icon(self, icon): """ Add an icon to the service item. This is used when displaying the service item in the service manager. @@ -112,12 +133,12 @@ class ServiceItem(object): if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') if self.theme is None: - self.RenderManager.set_override_theme(None) + self.render_manager.set_override_theme(None) else: - self.RenderManager.set_override_theme(self.theme) + self.render_manager.set_override_theme(self.theme) for slide in self._raw_frames: before = time.time() - formated = self.RenderManager.format_slide(slide[u'raw_slide']) + formated = self.render_manager.format_slide(slide[u'raw_slide']) for format in formated: lines = u'' title = u'' @@ -132,9 +153,8 @@ class ServiceItem(object): log.log(15, u'Formatting took %4s' % (time.time() - before)) elif self.service_item_type == ServiceItemType.Image: for slide in self._raw_frames: - slide[u'image'] = \ - resize_image(slide[u'image'], self.RenderManager.width, - self.RenderManager.height) + slide[u'image'] = resize_image(slide[u'image'], + self.render_manager.width, self.render_manager.height) elif self.service_item_type == ServiceItemType.Command: pass else: @@ -148,19 +168,19 @@ class ServiceItem(object): """ log.debug(u'render individual') if self.theme is None: - self.RenderManager.set_override_theme(None) + self.render_manager.set_override_theme(None) else: - self.RenderManager.set_override_theme(self.theme) + self.render_manager.set_override_theme(self.theme) format = self._display_frames[row][u'text'].split(u'\n') #if screen blank then do not display footer if self.cache[row] is not None: frame = self.cache[row] else: if format[0]: - frame = self.RenderManager.generate_slide(format, - self.raw_footer) + frame = self.render_manager.generate_slide(format, + self.raw_footer) else: - frame = self.RenderManager.generate_slide(format, u'') + frame = self.render_manager.generate_slide(format, u'') self.cache[row] = frame return frame @@ -181,7 +201,7 @@ class ServiceItem(object): self._raw_frames.append( {u'title': title, u'image': image, u'path': path}) - def add_from_text(self, title, raw_slide, verseTag=None): + def add_from_text(self, title, raw_slide, verse_tag=None): """ Add a text slide to the service item. @@ -194,7 +214,7 @@ class ServiceItem(object): self.service_item_type = ServiceItemType.Text title = title.split(u'\n')[0] self._raw_frames.append( - {u'title': title, u'raw_slide': raw_slide, u'verseTag':verseTag}) + {u'title': title, u'raw_slide': raw_slide, u'verseTag':verse_tag}) def add_from_command(self, path, file_name, image): """ @@ -261,7 +281,7 @@ class ServiceItem(object): self.service_item_type = header[u'type'] self.shortname = header[u'plugin'] self.theme = header[u'theme'] - self.addIcon(header[u'icon']) + self.add_icon(header[u'icon']) self.raw_footer = header[u'footer'] self.audit = header[u'audit'] self.notes = header[u'notes'] @@ -304,22 +324,40 @@ class ServiceItem(object): return self._uuid != other._uuid def is_media(self): + """ + Confirms if the ServiceItem is media + """ return ItemCapabilities.RequiresMedia in self.capabilities def is_command(self): + """ + Confirms if the ServiceItem is a command + """ return self.service_item_type == ServiceItemType.Command def is_image(self): + """ + Confirms if the ServiceItem is an image + """ return self.service_item_type == ServiceItemType.Image def uses_file(self): + """ + Confirms if the ServiceItem uses a file + """ return self.service_item_type == ServiceItemType.Image or \ self.service_item_type == ServiceItemType.Command def is_text(self): + """ + Confirms if the ServiceItem is text + """ return self.service_item_type == ServiceItemType.Text def get_frames(self): + """ + Returns the frames for the ServiceItem + """ if self.service_item_type == ServiceItemType.Text: return self._display_frames else: diff --git a/openlp/core/lib/songxmlhandler.py b/openlp/core/lib/songxmlhandler.py index acb75609b..76b01e376 100644 --- a/openlp/core/lib/songxmlhandler.py +++ b/openlp/core/lib/songxmlhandler.py @@ -22,6 +22,20 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`songxmlhandler` module provides the XML functionality for songs + +The basic XML is of the format:: + + + + + + + + + +""" import logging @@ -34,17 +48,6 @@ log = logging.getLogger(__name__) class SongXMLBuilder(object): """ This class builds the XML used to describe songs. - - The basic XML looks like this:: - - - - - - - - - """ log.info(u'SongXMLBuilder Loaded') @@ -113,17 +116,6 @@ class SongXMLBuilder(object): class SongXMLParser(object): """ A class to read in and parse a song's XML. - - The basic XML looks like this:: - - - - - - - - - """ log.info(u'SongXMLParser Loaded') diff --git a/openlp/core/lib/xmlrootclass.py b/openlp/core/lib/xmlrootclass.py index b2b37aaf1..1ea1d41a2 100644 --- a/openlp/core/lib/xmlrootclass.py +++ b/openlp/core/lib/xmlrootclass.py @@ -41,7 +41,7 @@ class XmlRootClass(object): (element.tag, val) = self.post_tag_hook(element.tag, val) """ - def _setFromXml(self, xml, root_tag): + def _set_from_xml(self, xml, root_tag): """ Set song properties from given xml content. diff --git a/openlp/core/theme/theme.py b/openlp/core/theme/theme.py index 3232abc4e..75a2ddd85 100644 --- a/openlp/core/theme/theme.py +++ b/openlp/core/theme/theme.py @@ -22,6 +22,12 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +OpenLP version 1 theme handling + +Provides reference data, a default v1 XML theme and class wrapper for +processing version 1 themes in OpenLP version 2. +""" from xml.etree.ElementTree import ElementTree, XML from PyQt4 import QtGui @@ -54,51 +60,106 @@ BLANK_STYLE_XML = \ ''' class Theme(object): + """ + Provide a class wrapper storing data from an XML theme + + ``name`` + Theme name + + ``BackgroundMode`` + The behaviour of the background. Valid modes are: + - 0 - Transparent + - 1 - Opaque + + ``BackgroundType`` + The content of the background. Valid types are: + - 0 - solid color + - 1 - gradient color + - 2 - image + + ``BackgroundParameter1`` + Extra information about the background. The contents of this attribute + depend on the BackgroundType: + - image: image filename + - gradient: start color + - solid: color + + ``BackgroundParameter2`` + Extra information about the background. The contents of this attribute + depend on the BackgroundType: + - image: border color + - gradient: end color + - solid: N/A + + ``BackgroundParameter3`` + Extra information about the background. The contents of this attribute + depend on the BackgroundType: + - image: N/A + - gradient: The direction of the gradient. Valid entries are: + - 0 -> vertical + - 1 -> horizontal + - solid: N/A + + ``FontName`` + Name of the font to use for the main font. + + ``FontColor`` + The color for the main font + + ``FontProportion`` + The size of the main font + + ``FontUnits`` + The units for FontProportion, either or + + ``Shadow`` + The shadow type to apply to the main font. + - 0 - no shadow + - non-zero - use shadow + + ``ShadowColor`` + Color for the shadow + + ``Outline`` + The outline to apply to the main font + - 0 - no outline + - non-zero - use outline + + ``OutlineColor`` + Color for the outline (or None if Outline is 0) + + ``HorizontalAlign`` + The horizontal alignment to apply to text. Valid alignments are: + - 0 - left align + - 1 - right align + - 2 - centre align + + ``VerticalAlign`` + The vertical alignment to apply to the text. Valid alignments are: + - 0 - top align + - 1 - bottom align + - 2 - centre align + + ``WrapStyle`` + The wrap style to apply to the text. Valid styles are: + - 0 - normal + - 1 - lyrics + """ def __init__(self, xml): - """ stores the info about a theme - attributes: - name : theme name + """ + Initialise a theme with data from xml - BackgroundMode : 1 - Transparent - 1 - Opaque - - BackgroundType : 0 - solid color - 1 - gradient color - 2 - image - - BackgroundParameter1 : for image - filename - for gradient - start color - for solid - color - BackgroundParameter2 : for image - border colour - for gradient - end color - for solid - N/A - BackgroundParameter3 : for image - N/A - for gradient - 0 -> vertical, 1 -> horizontal - - FontName : name of font to use - FontColor : color for main font - FontProportion : size of font - FontUnits : whether size of font is in or - - Shadow : 0 - no shadow, non-zero use shadow - ShadowColor : color for drop shadow - Outline : 0 - no outline, non-zero use outline - OutlineColor : color for outline (or None for no outline) - - HorizontalAlign : 0 - left align - 1 - right align - 2 - centre align - VerticalAlign : 0 - top align - 1 - bottom align - 2 - centre align - WrapStyle : 0 - normal - 1 - lyrics + ``xml`` + The data to initialise the theme with """ # init to defaults - self._set_from_XML(BLANK_STYLE_XML) - self._set_from_XML(xml) + self._set_from_xml(BLANK_STYLE_XML) + self._set_from_xml(xml) def _get_as_string(self): + """ + Return single line string representation of a theme + """ theme_strings = [] keys = dir(self) keys.sort() @@ -108,10 +169,16 @@ class Theme(object): return u''.join(theme_strings) def _set_from_XML(self, xml): + """ + Set theme class attributes with data from XML + + ``xml`` + The data to apply to the theme + """ root = ElementTree(element=XML(xml)) - iter = root.getiterator() - for element in iter: - delphiColorChange = False + xml_iter = root.getiterator() + for element in xml_iter: + delphi_color_change = False if element.tag != u'Theme': element_text = element.text val = 0 @@ -127,7 +194,7 @@ class Theme(object): pass elif DELPHI_COLORS.has_key(element_text): val = DELPHI_COLORS[element_text] - delphiColorChange = True + delphi_color_change = True else: try: val = int(element_text) @@ -137,7 +204,7 @@ class Theme(object): (element.tag.find(u'BackgroundParameter') == 0 and type(val) == type(0))): # convert to a wx.Colour - if not delphiColorChange: + if not delphi_color_change: val = QtGui.QColor( val&0xFF, (val>>8)&0xFF, (val>>16)&0xFF) else: @@ -146,8 +213,12 @@ class Theme(object): setattr(self, element.tag, val) def __str__(self): + """ + Provide Python string representation for the class (multiline output) + """ theme_strings = [] for key in dir(self): if key[0:1] != u'_': theme_strings.append(u'%30s : %s' % (key, getattr(self, key))) return u'\n'.join(theme_strings) + diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 76b84503e..e104a2ec6 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -22,6 +22,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:`ui` module provides the core user interface for OpenLP +""" class HideMode(object): """ diff --git a/openlp/core/ui/amendthemeform.py b/openlp/core/ui/amendthemeform.py index a2db71ff3..0891f128a 100644 --- a/openlp/core/ui/amendthemeform.py +++ b/openlp/core/ui/amendthemeform.py @@ -239,12 +239,13 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.previewTheme() def onFontMainColorPushButtonClicked(self): - self.theme.font_main_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.font_main_color), self).name() - - self.FontMainColorPushButton.setStyleSheet( - u'background-color: %s' % unicode(self.theme.font_main_color)) - self.previewTheme() + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.theme.font_main_color), self) + if new_color.isValid(): + self.theme.font_main_color = new_color.name() + self.FontMainColorPushButton.setStyleSheet( + u'background-color: %s' % unicode(self.theme.font_main_color)) + self.previewTheme() def onFontMainSizeSpinBoxChanged(self): if self.theme.font_main_proportion != self.FontMainSizeSpinBox.value(): @@ -332,11 +333,13 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.previewTheme() def onFontFooterColorPushButtonClicked(self): - self.theme.font_footer_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.font_footer_color), self).name() - self.FontFooterColorPushButton.setStyleSheet( - 'background-color: %s' % unicode(self.theme.font_footer_color)) - self.previewTheme() + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.theme.font_footer_color), self) + if new_color.isValid(): + self.theme.font_footer_color = new_color.name() + self.FontFooterColorPushButton.setStyleSheet( + u'background-color: %s' % unicode(self.theme.font_footer_color)) + self.previewTheme() def onFontFooterSizeSpinBoxChanged(self): if self.theme.font_footer_proportion != \ @@ -431,24 +434,29 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): def onColor1PushButtonClicked(self): if self.theme.background_type == u'solid': - self.theme.background_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.background_color), self).name() - self.Color1PushButton.setStyleSheet( - u'background-color: %s' % unicode(self.theme.background_color)) + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.theme.background_color), self) + if new_color.isValid(): + self.theme.background_color = new_color.name() + self.Color1PushButton.setStyleSheet(u'background-color: %s' % + unicode(self.theme.background_color)) else: - self.theme.background_startColor = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.background_startColor), self).name() - self.Color1PushButton.setStyleSheet( - u'background-color: %s' % \ + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.theme.background_startColor), self) + if new_color.isValid(): + self.theme.background_startColor = new_color.name() + self.Color1PushButton.setStyleSheet(u'background-color: %s' % unicode(self.theme.background_startColor)) self.previewTheme() def onColor2PushButtonClicked(self): - self.theme.background_endColor = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.background_endColor), self).name() - self.Color2PushButton.setStyleSheet( - u'background-color: %s' % unicode(self.theme.background_endColor)) - self.previewTheme() + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.theme.background_endColor), self) + if new_color.isValid(): + self.theme.background_endColor = new_color.name() + self.Color2PushButton.setStyleSheet(u'background-color: %s' % + unicode(self.theme.background_endColor)) + self.previewTheme() # #Other Tab @@ -472,11 +480,13 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.previewTheme() def onOutlineColorPushButtonClicked(self): - self.theme.display_outline_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.display_outline_color), self).name() - self.OutlineColorPushButton.setStyleSheet( - u'background-color: %s' % unicode(self.theme.display_outline_color)) - self.previewTheme() + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.theme.display_outline_color), self) + if new_color.isValid(): + self.theme.display_outline_color = new_color.name() + self.OutlineColorPushButton.setStyleSheet(u'background-color: %s' % + unicode(self.theme.display_outline_color)) + self.previewTheme() def onShadowCheckBoxChanged(self, value): if value == 2: # checked @@ -495,11 +505,13 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog): self.previewTheme() def onShadowColorPushButtonClicked(self): - self.theme.display_shadow_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.theme.display_shadow_color), self).name() - self.ShadowColorPushButton.setStyleSheet( - u'background-color: %s' % unicode(self.theme.display_shadow_color)) - self.previewTheme() + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.theme.display_shadow_color), self) + if new_color.isValid(): + self.theme.display_shadow_color = new_color.name() + self.ShadowColorPushButton.setStyleSheet(u'background-color: %s' % + unicode(self.theme.display_shadow_color)) + self.previewTheme() def onHorizontalComboBoxSelected(self, currentIndex): self.theme.display_horizontalAlign = currentIndex diff --git a/openlp/core/ui/displaytab.py b/openlp/core/ui/displaytab.py index 6fe9f16e2..3ddbb8b08 100644 --- a/openlp/core/ui/displaytab.py +++ b/openlp/core/ui/displaytab.py @@ -29,16 +29,19 @@ from openlp.core.lib import SettingsTab, Receiver, translate class DisplayTab(SettingsTab): """ - Class documentation goes here. + Provide the UI for managing display related settings """ def __init__(self, screens): """ - Constructor + Initialise the display tab from a SettingsTab """ self.screens = screens SettingsTab.__init__(self, u'Display') def setupUi(self): + """ + Set up the UI widgets to show the settings + """ self.tabTitleVisible = translate(u'DisplayTab', u'Displays') self.layoutWidget = QtGui.QWidget(self) self.layoutWidget.setGeometry(QtCore.QRect(0, 40, 241, 79)) @@ -158,6 +161,9 @@ class DisplayTab(SettingsTab): QtCore.SIGNAL(u'stateChanged(int)'), self.onOverrideCheckBoxChanged) def retranslateUi(self): + """ + Provide i18n support for this UI + """ self.setWindowTitle(translate(u'DisplayTab', u'Amend Display Settings')) self.CurrentGroupBox.setTitle( translate(u'DisplayTab', u'Default Settings')) @@ -179,6 +185,9 @@ class DisplayTab(SettingsTab): translate(u'DisplayTab', u'Override Output Display')) def load(self): + """ + Load current display settings + """ settings = QtCore.QSettings() settings.beginGroup(self.settingsSection) self.Xpos.setText(unicode(self.screens.current[u'size'].x())) @@ -209,6 +218,9 @@ class DisplayTab(SettingsTab): self.amend_display = True def save(self): + """ + Save chosen settings + """ settings = QtCore.QSettings() settings.beginGroup(self.settingsSection) settings.setValue('x position', QtCore.QVariant(self.XposEdit.text())) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 5e8db4934..a3c444097 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -133,7 +133,6 @@ class MainDisplay(DisplayWidget): self.display_alert = QtGui.QLabel(self) self.display_alert.setScaledContents(True) self.primary = True - self.displayBlank = False self.blankFrame = None self.frame = None QtCore.QObject.connect(Receiver.get_receiver(), @@ -280,15 +279,15 @@ class MainDisplay(DisplayWidget): self.display_alert.setPixmap(frame) self.moveToTop() - def frameView(self, frame, transition=False): + def frameView(self, frame, transition=False, display=True): """ Called from a slide controller to display a frame if the alert is in progress the alert is added on top ``frame`` Image frame to be rendered """ - log.debug(u'frameView %d' % (self.displayBlank)) - if not self.displayBlank: + log.debug(u'frameView %d' % (display)) + if display: if transition: if self.frame is not None: self.display_text.setPixmap( @@ -314,8 +313,7 @@ class MainDisplay(DisplayWidget): self.setVisible(True) self.showFullScreen() else: - self.waitingFrame = frame - self.waitingFrameTrans = transition + self.storeText = QtGui.QPixmap.fromImage(frame[u'main']) class VideoDisplay(Phonon.VideoWidget): """ diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index c65fa2ec0..3caef90c5 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -356,7 +356,7 @@ class Ui_MainWindow(object): """ MainWindow.mainTitle = translate(u'MainWindow', u'OpenLP 2.0') MainWindow.language = translate(u'MainWindow', u'English') - MainWindow.defaultThemeText = translate(u'MainWindow', + MainWindow.defaultThemeText = translate(u'MainWindow', u'Default Theme: ') MainWindow.setWindowTitle(MainWindow.mainTitle) self.FileMenu.setTitle(translate(u'MainWindow', u'&File')) @@ -456,7 +456,7 @@ class Ui_MainWindow(object): u'Set the interface language to %1').arg(item.objectName())) self.ToolsAddToolItem.setText(translate(u'MainWindow', u'Add &Tool...')) self.ToolsAddToolItem.setStatusTip( - translate(u'MainWindow', + translate(u'MainWindow', u'Add an application to the list of tools')) self.action_Preview_Panel.setText( translate(u'MainWindow', u'&Preview Pane')) @@ -652,15 +652,13 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ settings = QtCore.QSettings() settings.beginGroup(self.generalSettingsSection) - if settings.value(u'screen blank', QtCore.QVariant(False)).toBool() \ - and settings.value(u'blank warning', QtCore.QVariant(False)).toBool(): - self.LiveController.onBlankDisplay(True) - QtGui.QMessageBox.question(self, - translate(u'MainWindow', u'OpenLP Main Display Blanked'), - translate(u'MainWindow', - u'The Main Display has been blanked out'), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok), - QtGui.QMessageBox.Ok) + if settings.value(u'screen blank', QtCore.QVariant(False)).toBool(): + self.LiveController.mainDisplaySetBackground() + if settings.value(u'blank warning', QtCore.QVariant(False)).toBool(): + QtGui.QMessageBox.question(self, + translate(u'MainWindow', u'OpenLP Main Display Blanked'), + translate(u'MainWindow', + u'The Main Display has been blanked out')) settings.endGroup() def versionThread(self): diff --git a/openlp/core/ui/mediadockmanager.py b/openlp/core/ui/mediadockmanager.py index 782383cd4..7d81b5f23 100644 --- a/openlp/core/ui/mediadockmanager.py +++ b/openlp/core/ui/mediadockmanager.py @@ -28,11 +28,25 @@ import logging log = logging.getLogger(__name__) class MediaDockManager(object): - + """ + Provide a repository for MediaManagerItems + """ def __init__(self, media_dock): + """ + Initialise the media dock + """ self.media_dock = media_dock def add_dock(self, media_item, icon, weight): + """ + Add a MediaManagerItem to the dock + + ``media_item`` + The item to add to the dock + + ``icon`` + An icon for this dock item + """ log.info(u'Adding %s dock' % media_item.title) self.media_dock.addItem(media_item, icon, media_item.title) @@ -53,6 +67,12 @@ class MediaDockManager(object): self.media_dock.addItem(media_item, icon, media_item.title) def remove_dock(self, name): + """ + Removes a MediaManagerItem from the dock + + ``name`` + The item to remove + """ log.debug(u'remove %s dock' % name) for dock_index in range(0, self.media_dock.count()): if self.media_dock.widget(dock_index): diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index 69dd915d2..f620e7d00 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -22,7 +22,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:`screen` module provides management functionality for a machines' +displays +""" import logging import copy @@ -46,12 +49,18 @@ class ScreenList(object): self.monitor_number = 0 def add_screen(self, screen): + """ + Add a screen to the list of known screens + """ if screen[u'primary']: self.current = screen self.screen_list.append(screen) self.display_count += 1 def screen_exists(self, number): + """ + Confirms a screen is known + """ for screen in self.screen_list: if screen[u'number'] == number: return True diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index baf26fde8..59a52717b 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -32,13 +32,15 @@ log = logging.getLogger(__name__) from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, ServiceItem, contextMenuAction, \ +from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \ Receiver, build_icon, ItemCapabilities, SettingsManager, translate from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm from openlp.core.utils import AppLocation class ServiceManagerList(QtGui.QTreeWidget): - + """ + Set up key bindings and mouse behaviour for the service list + """ def __init__(self, parent=None, name=None): QtGui.QTreeWidget.__init__(self, parent) self.parent = parent @@ -952,7 +954,7 @@ class ServiceManager(QtGui.QWidget): self.ThemeComboBox.addItem(u'') for theme in theme_list: self.ThemeComboBox.addItem(theme) - action = contextMenuAction( + action = context_menu_action( self.ServiceManagerList, None, theme , self.onThemeChangeAction) diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index f923c9d7d..dfd1d5a7d 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -22,7 +22,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:`settingsform` provides a user interface for the OpenLP settings +""" import logging from PyQt4 import QtGui @@ -33,8 +35,13 @@ from settingsdialog import Ui_SettingsDialog log = logging.getLogger(__name__) class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): - + """ + Provide the form to manipulate the settings for OpenLP + """ def __init__(self, screens, mainWindow, parent=None): + """ + Initialise the settings form + """ QtGui.QDialog.__init__(self, parent) self.setupUi(self) # General tab @@ -48,16 +55,25 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): self.addTab(u'Display', self.DisplayTab) def addTab(self, name, tab): + """ + Add a tab to the form + """ log.info(u'Adding %s tab' % tab.tabTitle) self.SettingsTabWidget.addTab(tab, tab.tabTitleVisible) def insertTab(self, tab, location): + """ + Add a tab to the form at a specific location + """ log.debug(u'Inserting %s tab' % tab.tabTitle) #13 : There are 3 tables currently and locations starts at -10 self.SettingsTabWidget.insertTab( location + 13, tab, tab.tabTitleVisible) def removeTab(self, name): + """ + Remove a tab from the form + """ log.debug(u'remove %s tab' % name) for tab_index in range(0, self.SettingsTabWidget.count()): if self.SettingsTabWidget.widget(tab_index): @@ -65,10 +81,16 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): self.SettingsTabWidget.removeTab(tab_index) def accept(self): + """ + Process the form saving the settings + """ for tab_index in range(0, self.SettingsTabWidget.count()): self.SettingsTabWidget.widget(tab_index).save() return QtGui.QDialog.accept(self) def postSetUp(self): + """ + Run any post-setup code for the tabs on the form + """ for tab_index in range(0, self.SettingsTabWidget.count()): self.SettingsTabWidget.widget(tab_index).postSetUp() diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index fc77166e5..6e8ba8b22 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -120,6 +120,7 @@ class SlideController(QtGui.QWidget): self.serviceItem = None self.Panel = QtGui.QWidget(parent.ControlSplitter) self.slideList = {} + self.canDisplay = True # Layout for holding panel self.PanelLayout = QtGui.QVBoxLayout(self.Panel) self.PanelLayout.setSpacing(0) @@ -651,6 +652,12 @@ class SlideController(QtGui.QWidget): self.PreviewListWidget.selectRow(index) self.onSlideSelected() + def mainDisplaySetBackground(self): + """ + Allow the main display to blank the main display at startup time + """ + self.blankButton.setChecked(True) + def onSlideBlank(self): """ Handle the slidecontroller blank event @@ -670,6 +677,7 @@ class SlideController(QtGui.QWidget): log.debug(u'onBlankDisplay %d' % checked) self.hideButton.setChecked(False) self.themeButton.setChecked(False) + self.canDisplay = not checked QtCore.QSettings().setValue( self.parent.generalSettingsSection + u'/screen blank', QtCore.QVariant(checked)) @@ -687,6 +695,7 @@ class SlideController(QtGui.QWidget): log.debug(u'onThemeDisplay %d' % checked) self.blankButton.setChecked(False) self.hideButton.setChecked(False) + self.canDisplay = False if checked: Receiver.send_message(u'maindisplay_hide', HideMode.Theme) self.blankPlugin(True) @@ -701,6 +710,7 @@ class SlideController(QtGui.QWidget): log.debug(u'onHideDisplay %d' % checked) self.blankButton.setChecked(False) self.themeButton.setChecked(False) + self.canDisplay = False if checked: Receiver.send_message(u'maindisplay_hide', HideMode.Screen) self.hidePlugin(True) @@ -710,7 +720,7 @@ class SlideController(QtGui.QWidget): def blankPlugin(self, blank): """ - Blank the display screen. + Blank the display screen within a plugin if required. """ if self.serviceItem is not None: if blank: @@ -770,7 +780,7 @@ class SlideController(QtGui.QWidget): log.log( 15, u'Slide Rendering took %4s' % (time.time() - before)) if self.isLive: - self.mainDisplay.frameView(frame, True) + self.mainDisplay.frameView(frame, True, self.canDisplay) self.selectedRow = row Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix, row) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 41c2a9360..485f2cf30 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -33,9 +33,9 @@ from PyQt4 import QtCore, QtGui from openlp.core.ui import AmendThemeForm from openlp.core.theme import Theme -from openlp.core.lib import OpenLPToolbar, contextMenuAction, \ +from openlp.core.lib import OpenLPToolbar, context_menu_action, \ ThemeXML, str_to_bool, get_text_file_string, build_icon, Receiver, \ - contextMenuSeparator, SettingsManager, translate + context_menu_separator, SettingsManager, translate from openlp.core.utils import AppLocation log = logging.getLogger(__name__) @@ -81,27 +81,28 @@ class ThemeManager(QtGui.QWidget): self.Layout.addWidget(self.ThemeListWidget) self.ThemeListWidget.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.ThemeListWidget.addAction( - contextMenuAction(self.ThemeListWidget, u':/themes/theme_edit.png', + context_menu_action(self.ThemeListWidget, + u':/themes/theme_edit.png', translate(u'ThemeManager', u'Edit a theme'), self.onEditTheme)) self.ThemeListWidget.addAction( - contextMenuSeparator(self.ThemeListWidget)) + context_menu_separator(self.ThemeListWidget)) self.ThemeListWidget.addAction( - contextMenuAction(self.ThemeListWidget, + context_menu_action(self.ThemeListWidget, u':/general/general_delete.png', translate(u'ThemeManager', u'Delete theme'), self.onDeleteTheme)) self.ThemeListWidget.addAction( - contextMenuAction(self.ThemeListWidget, + context_menu_action(self.ThemeListWidget, u':/general/general_export.png', translate(u'ThemeManager', u'Make Global'), self.changeGlobalFromScreen)) self.ThemeListWidget.addAction( - contextMenuAction(self.ThemeListWidget, + context_menu_action(self.ThemeListWidget, u':/general/general_export.png', translate(u'ThemeManager', u'Export theme'), self.onExportTheme)) self.ThemeListWidget.addAction( - contextMenuSeparator(self.ThemeListWidget)) + context_menu_separator(self.ThemeListWidget)) #Signals QtCore.QObject.connect(self.ThemeListWidget, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), @@ -121,6 +122,10 @@ class ThemeManager(QtGui.QWidget): QtCore.QVariant(u'')).toString()) def changeGlobalFromTab(self, themeName): + """ + Change the global theme when it is changed through the Themes settings + tab + """ log.debug(u'changeGlobalFromTab %s', themeName) for count in range (0, self.ThemeListWidget.count()): #reset the old name @@ -136,6 +141,10 @@ class ThemeManager(QtGui.QWidget): self.ThemeListWidget.item(count).setText(name) def changeGlobalFromScreen(self, index = -1): + """ + Change the global theme when a theme is double clicked upon in the + Theme Manager list + """ log.debug(u'changeGlobalFromScreen %s', index) selected_row = self.ThemeListWidget.currentRow() for count in range (0, self.ThemeListWidget.count()): @@ -159,12 +168,20 @@ class ThemeManager(QtGui.QWidget): self.pushThemes() def onAddTheme(self): + """ + Loads a new theme with the default settings and then launches the theme + editing form for the user to make their customisations. + """ theme = self.createThemeFromXml(self.baseTheme(), self.path) self.amendThemeForm.loadTheme(theme) self.saveThemeName = u'' self.amendThemeForm.exec_() def onEditTheme(self): + """ + Loads the settings for the theme that is to be edited and launches the + theme editing form so the user can make their changes. + """ item = self.ThemeListWidget.currentItem() if item: theme = self.getThemeData( @@ -175,6 +192,9 @@ class ThemeManager(QtGui.QWidget): self.amendThemeForm.exec_() def onDeleteTheme(self): + """ + Delete a theme + """ self.global_theme = unicode(QtCore.QSettings().value( self.settingsSection + u'/global theme', QtCore.QVariant(u'')).toString()) @@ -262,6 +282,11 @@ class ThemeManager(QtGui.QWidget): zip.close() def onImportTheme(self): + """ + Opens a file dialog to select the theme file(s) to import before + attempting to extract OpenLP themes from those files. This process + will load both OpenLP version 1 and version 2 themes. + """ files = QtGui.QFileDialog.getOpenFileNames( self, translate(u'ThemeManager', u'Select Theme Import File'), SettingsManager.get_last_dir(self.settingsSection), u'Theme (*.*)') @@ -311,12 +336,24 @@ class ThemeManager(QtGui.QWidget): self.pushThemes() def pushThemes(self): + """ + Notify listeners that the theme list has been updated + """ Receiver.send_message(u'theme_update_list', self.getThemes()) def getThemes(self): + """ + Return the list of loaded themes + """ return self.themelist def getThemeData(self, themename): + """ + Returns a theme object from an XML file + + ``themename`` + Name of the theme to load from file + """ log.debug(u'getthemedata for theme %s', themename) xml_file = os.path.join(self.path, unicode(themename), unicode(themename) + u'.xml') @@ -326,6 +363,12 @@ class ThemeManager(QtGui.QWidget): return self.createThemeFromXml(xml, self.path) def checkThemesExists(self, dir): + """ + Check a theme directory exists and if not create it + + ``dir`` + Theme directory to make sure exists + """ log.debug(u'check themes') if not os.path.exists(dir): os.mkdir(dir) @@ -388,7 +431,10 @@ class ThemeManager(QtGui.QWidget): def checkVersion1(self, xmlfile): """ - Am I a version 1 theme + Check if a theme is from OpenLP version 1 + + ``xmlfile`` + Theme XML to check the version of """ log.debug(u'checkVersion1 ') theme = xmlfile @@ -400,9 +446,13 @@ class ThemeManager(QtGui.QWidget): def migrateVersion122(self, xml_data): """ - Called by convert the xml data from version 1 format - to the current format. - New fields are defaulted but the new theme is useable + Convert the xml data from version 1 format to the current format. + + New fields are loaded with defaults to provide a complete, working + theme containing all compatible customisations from the old theme. + + ``xml_data`` + Version 1 theme to convert """ theme = Theme(xml_data) newtheme = ThemeXML() @@ -510,11 +560,20 @@ class ThemeManager(QtGui.QWidget): return frame def getPreviewImage(self, theme): + """ + Return an image representing the look of the theme + + ``theme`` + The theme to return the image for + """ log.debug(u'getPreviewImage %s ', theme) image = os.path.join(self.path, theme + u'.png') return image def baseTheme(self): + """ + Provide a base theme with sensible defaults + """ log.debug(u'base theme created') newtheme = ThemeXML() newtheme.new_document(unicode(translate(u'ThemeManager', u'New Theme'))) @@ -528,6 +587,12 @@ class ThemeManager(QtGui.QWidget): return newtheme.extract_xml() def createThemeFromXml(self, theme_xml, path): + """ + Return a theme object using information parsed from XML + + ``theme_xml`` + The XML data to load into the theme + """ theme = ThemeXML() theme.parse(theme_xml) self.cleanTheme(theme) @@ -535,6 +600,11 @@ class ThemeManager(QtGui.QWidget): return theme def cleanTheme(self, theme): + """ + Clean a theme loaded from an XML file by removing stray whitespace and + making sure parameters are the correct type for the theme object + attributes + """ theme.background_color = theme.background_color.strip() theme.background_direction = theme.background_direction.strip() theme.background_endColor = theme.background_endColor.strip() diff --git a/openlp/core/utils/__init__.py b/openlp/core/utils/__init__.py index 8cbf7657a..512e15f06 100644 --- a/openlp/core/utils/__init__.py +++ b/openlp/core/utils/__init__.py @@ -22,13 +22,16 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`utils` module provides the utility libraries for OpenLP +""" import os import sys import logging import urllib2 -from datetime import datetime +from datetime import datetime from PyQt4 import QtCore import openlp diff --git a/openlp/plugins/__init__.py b/openlp/plugins/__init__.py index 1a348a0df..213c15d47 100644 --- a/openlp/plugins/__init__.py +++ b/openlp/plugins/__init__.py @@ -22,3 +22,6 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +""" +The :mod:`plugins` module provides all the project produced plugins +""" diff --git a/openlp/plugins/alerts/__init__.py b/openlp/plugins/alerts/__init__.py index 1a348a0df..cb376ec38 100644 --- a/openlp/plugins/alerts/__init__.py +++ b/openlp/plugins/alerts/__init__.py @@ -22,3 +22,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:`alerts` module provides the Alerts plugin for producing impromptu +on-screen announcements during a service +""" diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index b00ba0f05..179aa1d8e 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -32,11 +32,11 @@ from alertdialog import Ui_AlertDialog class AlertForm(QtGui.QDialog, Ui_AlertDialog): """ - Class documentation goes here. + Provide UI for the alert system """ def __init__(self, manager, parent): """ - Constructor + Initialise the alert form """ self.manager = manager self.parent = parent @@ -103,6 +103,9 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): self.loadList() def onSaveClick(self): + """ + Save an alert + """ if self.item_id: alert = self.manager.get_object(AlertItem, self.item_id) alert.text = unicode(self.AlertTextEdit.text()) @@ -113,7 +116,9 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): self.onNewClick() def onTextChanged(self): - #Data has changed by editing it so potential storage required + """ + Enable save button when data has been changed by editing the form + """ self.SaveButton.setEnabled(True) def onDoubleClick(self): diff --git a/openlp/plugins/alerts/lib/alertstab.py b/openlp/plugins/alerts/lib/alertstab.py index 9e6e98489..15f27df6d 100644 --- a/openlp/plugins/alerts/lib/alertstab.py +++ b/openlp/plugins/alerts/lib/alertstab.py @@ -214,11 +214,13 @@ class AlertsTab(SettingsTab): translate(u'AlertsPlugin.AlertsTab', u'Bottom')) def onBackgroundColorButtonClicked(self): - self.bg_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.bg_color), self).name() - self.BackgroundColorButton.setStyleSheet( - u'background-color: %s' % self.bg_color) - self.updateDisplay() + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.bg_color), self) + if new_color.isValid(): + self.bg_color = new_color.name() + self.BackgroundColorButton.setStyleSheet( + u'background-color: %s' % self.bg_color) + self.updateDisplay() def onFontComboBoxClicked(self): self.updateDisplay() @@ -227,11 +229,13 @@ class AlertsTab(SettingsTab): self.location = location def onFontColorButtonClicked(self): - self.font_color = QtGui.QColorDialog.getColor( - QtGui.QColor(self.font_color), self).name() - self.FontColorButton.setStyleSheet( - u'background-color: %s' % self.font_color) - self.updateDisplay() + new_color = QtGui.QColorDialog.getColor( + QtGui.QColor(self.font_color), self) + if new_color.isValid(): + self.font_color = new_color.name() + self.FontColorButton.setStyleSheet( + u'background-color: %s' % self.font_color) + self.updateDisplay() def onTimeoutSpinBoxChanged(self): self.timeout = self.TimeoutSpinBox.value() diff --git a/openlp/plugins/bibles/__init__.py b/openlp/plugins/bibles/__init__.py index 1a348a0df..ca5ff7508 100644 --- a/openlp/plugins/bibles/__init__.py +++ b/openlp/plugins/bibles/__init__.py @@ -22,3 +22,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:`bibles' modules provides the Bible plugin to enable OpenLP to display +scripture +""" diff --git a/openlp/plugins/bibles/lib/db.py b/openlp/plugins/bibles/lib/db.py index 47d9ffdd2..97983e72c 100644 --- a/openlp/plugins/bibles/lib/db.py +++ b/openlp/plugins/bibles/lib/db.py @@ -59,6 +59,7 @@ class BibleDB(QtCore.QObject): """ log.info(u'BibleDB loaded') QtCore.QObject.__init__(self) + self.bible_plugin = parent if u'path' not in kwargs: raise KeyError(u'Missing keyword argument "path".') if u'name' not in kwargs and u'file' not in kwargs: diff --git a/openlp/plugins/bibles/lib/http.py b/openlp/plugins/bibles/lib/http.py index 223d428af..d3d6ca5f6 100644 --- a/openlp/plugins/bibles/lib/http.py +++ b/openlp/plugins/bibles/lib/http.py @@ -288,8 +288,7 @@ class CWExtract(BibleCommon): ``chapter`` Chapter number """ - log.debug(u'get_bible_chapter %s,%s,%s', - version, bookname, chapter) + log.debug(u'get_bible_chapter %s,%s,%s', version, bookname, chapter) urlbookname = bookname.replace(u' ', u'-') chapter_url = u'http://www.biblestudytools.com/%s/%s/%s.html' % \ (version, urlbookname.lower(), chapter) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 96584a455..2ac701506 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -29,7 +29,7 @@ import os from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \ - contextMenuAction, ItemCapabilities, SettingsManager, translate + context_menu_action, ItemCapabilities, SettingsManager, translate from openlp.core.utils import AppLocation log = logging.getLogger(__name__) @@ -54,6 +54,7 @@ class ImageMediaItem(MediaManagerItem): # be instanced by the base MediaManagerItem self.ListViewWithDnD_class = ImageListView MediaManagerItem.__init__(self, parent, icon, title) + self.addToServiceItem = True def initPluginNameVisible(self): self.PluginNameVisible = translate(u'ImagePlugin.MediaItem', u'Image') @@ -73,7 +74,6 @@ class ImageMediaItem(MediaManagerItem): self.hasFileIcon = True self.hasNewIcon = False self.hasEditIcon = False - self.addToServiceItem = True def initialise(self): log.debug(u'initialise') @@ -93,7 +93,7 @@ class ImageMediaItem(MediaManagerItem): MediaManagerItem.addListViewToToolBar(self) self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.ListView.addAction( - contextMenuAction( + context_menu_action( self.ListView, u':/slides/slide_blank.png', translate(u'ImagePlugin.MediaItem', u'Replace Live Background'), self.onReplaceClick)) diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py index dc3cc837e..7d48defd7 100644 --- a/openlp/plugins/media/lib/mediaitem.py +++ b/openlp/plugins/media/lib/mediaitem.py @@ -29,7 +29,7 @@ import os from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \ - ItemCapabilities, SettingsManager, contextMenuAction, Receiver, translate + ItemCapabilities, SettingsManager, context_menu_action, Receiver, translate log = logging.getLogger(__name__) @@ -77,7 +77,7 @@ class MediaMediaItem(MediaManagerItem): MediaManagerItem.addListViewToToolBar(self) self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) self.ListView.addAction( - contextMenuAction(self.ListView, u':/slides/slide_blank.png', + context_menu_action(self.ListView, u':/slides/slide_blank.png', translate(u'MediaPlugin.MediaItem', u'Replace Live Background'), self.onReplaceClick)) diff --git a/openlp/plugins/songs/forms/__init__.py b/openlp/plugins/songs/forms/__init__.py index 6c6d4161d..e12ba048c 100644 --- a/openlp/plugins/songs/forms/__init__.py +++ b/openlp/plugins/songs/forms/__init__.py @@ -23,58 +23,6 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -from openlp.core.lib import translate - -class VerseType(object): - Verse = 0 - Chorus = 1 - Bridge = 2 - PreChorus = 3 - Intro = 4 - Ending = 5 - Other = 6 - - @staticmethod - def to_string(verse_type): - if verse_type == VerseType.Verse: - return translate(u'VerseType', u'Verse') - elif verse_type == VerseType.Chorus: - return translate(u'VerseType', u'Chorus') - elif verse_type == VerseType.Bridge: - return translate(u'VerseType', u'Bridge') - elif verse_type == VerseType.PreChorus: - return translate(u'VerseType', u'Pre-Chorus') - elif verse_type == VerseType.Intro: - return translate(u'VerseType', u'Intro') - elif verse_type == VerseType.Ending: - return translate(u'VerseType', u'Ending') - elif verse_type == VerseType.Other: - return translate(u'VerseType', u'Other') - - @staticmethod - def from_string(verse_type): - verse_type = verse_type.lower() - if verse_type == unicode(VerseType.to_string(VerseType.Verse)).lower(): - return VerseType.Verse - elif verse_type == \ - unicode(VerseType.to_string(VerseType.Chorus)).lower(): - return VerseType.Chorus - elif verse_type == \ - unicode(VerseType.to_string(VerseType.Bridge)).lower(): - return VerseType.Bridge - elif verse_type == \ - unicode(VerseType.to_string(VerseType.PreChorus)).lower(): - return VerseType.PreChorus - elif verse_type == \ - unicode(VerseType.to_string(VerseType.Intro)).lower(): - return VerseType.Intro - elif verse_type == \ - unicode(VerseType.to_string(VerseType.Ending)).lower(): - return VerseType.Ending - elif verse_type == \ - unicode(VerseType.to_string(VerseType.Other)).lower(): - return VerseType.Other - from authorsform import AuthorsForm from topicsform import TopicsForm from songbookform import SongBookForm diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py index d70d5c5b4..086f4c416 100644 --- a/openlp/plugins/songs/forms/editversedialog.py +++ b/openlp/plugins/songs/forms/editversedialog.py @@ -26,7 +26,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import translate -from openlp.plugins.songs.forms import VerseType +from openlp.plugins.songs.lib import VerseType class Ui_EditVerseDialog(object): def setupUi(self, EditVerseDialog): diff --git a/openlp/plugins/songs/forms/editverseform.py b/openlp/plugins/songs/forms/editverseform.py index 56bb5de91..77e069e25 100644 --- a/openlp/plugins/songs/forms/editverseform.py +++ b/openlp/plugins/songs/forms/editverseform.py @@ -28,7 +28,7 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.plugins.songs.forms import VerseType +from openlp.plugins.songs.lib import VerseType from editversedialog import Ui_EditVerseDialog diff --git a/openlp/plugins/songs/forms/songmaintenancedialog.py b/openlp/plugins/songs/forms/songmaintenancedialog.py index 81403bbe0..68ae105ca 100644 --- a/openlp/plugins/songs/forms/songmaintenancedialog.py +++ b/openlp/plugins/songs/forms/songmaintenancedialog.py @@ -31,7 +31,7 @@ class Ui_SongMaintenanceDialog(object): def setupUi(self, SongMaintenanceDialog): SongMaintenanceDialog.setObjectName(u'SongMaintenanceDialog') SongMaintenanceDialog.setWindowModality(QtCore.Qt.ApplicationModal) - SongMaintenanceDialog.resize(486, 361) + SongMaintenanceDialog.resize(582, 361) self.DialogLayout = QtGui.QVBoxLayout(SongMaintenanceDialog) self.DialogLayout.setSpacing(8) self.DialogLayout.setMargin(8) @@ -50,10 +50,10 @@ class Ui_SongMaintenanceDialog(object): sizePolicy.setHeightForWidth( self.TypeListWidget.sizePolicy().hasHeightForWidth()) self.TypeListWidget.setSizePolicy(sizePolicy) - self.TypeListWidget.setViewMode(QtGui.QListView.IconMode) - self.TypeListWidget.setIconSize(QtCore.QSize(112, 100)) + self.TypeListWidget.setViewMode(QtGui.QListView.ListMode) + self.TypeListWidget.setIconSize(QtCore.QSize(32, 32)) self.TypeListWidget.setMovement(QtGui.QListView.Static) - self.TypeListWidget.setMaximumWidth(118) + self.TypeListWidget.setMaximumWidth(172) self.TypeListWidget.setSpacing(0) self.TypeListWidget.setSortingEnabled(False) self.TypeListWidget.setUniformItemSizes(True) diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index bbb9260c6..6c637ea9e 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -23,10 +23,77 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +from openlp.core.lib import translate + +class VerseType(object): + """ + VerseType provides an enumeration for the tags that may be associated + with verses in songs. + """ + Verse = 0 + Chorus = 1 + Bridge = 2 + PreChorus = 3 + Intro = 4 + Ending = 5 + Other = 6 + + @staticmethod + def to_string(verse_type): + """ + Return a string for a given VerseType + + ``verse_type`` + The type to return a string for + """ + if verse_type == VerseType.Verse: + return translate(u'VerseType', u'Verse') + elif verse_type == VerseType.Chorus: + return translate(u'VerseType', u'Chorus') + elif verse_type == VerseType.Bridge: + return translate(u'VerseType', u'Bridge') + elif verse_type == VerseType.PreChorus: + return translate(u'VerseType', u'Pre-Chorus') + elif verse_type == VerseType.Intro: + return translate(u'VerseType', u'Intro') + elif verse_type == VerseType.Ending: + return translate(u'VerseType', u'Ending') + elif verse_type == VerseType.Other: + return translate(u'VerseType', u'Other') + + @staticmethod + def from_string(verse_type): + """ + Return the VerseType for a given string + + ``verse_type`` + The string to return a VerseType for + """ + verse_type = verse_type.lower() + if verse_type == unicode(VerseType.to_string(VerseType.Verse)).lower(): + return VerseType.Verse + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Chorus)).lower(): + return VerseType.Chorus + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Bridge)).lower(): + return VerseType.Bridge + elif verse_type == \ + unicode(VerseType.to_string(VerseType.PreChorus)).lower(): + return VerseType.PreChorus + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Intro)).lower(): + return VerseType.Intro + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Ending)).lower(): + return VerseType.Ending + elif verse_type == \ + unicode(VerseType.to_string(VerseType.Other)).lower(): + return VerseType.Other + from manager import SongManager from songstab import SongsTab from mediaitem import SongMediaItem from sofimport import SofImport from oooimport import OooImport from songimport import SongImport - diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index f0a4afc88..7cff2857d 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -334,7 +334,7 @@ class SongMediaItem(MediaManagerItem): for verse in verseList: verseTag = u'%s:%s' % ( verse[0][u'type'], verse[0][u'label']) - service_item.add_from_text(\ + service_item.add_from_text( verse[1][:30], unicode(verse[1]), verseTag) else: #Loop through the verse list and expand the song accordingly. @@ -346,8 +346,8 @@ class SongMediaItem(MediaManagerItem): verse[0][u'type'][0] == order[0]: verseTag = u'%s:%s' % \ (verse[0][u'type'], verse[0][u'label']) - service_item.add_from_text\ - (verse[1][:30], verse[1], verseTag) + service_item.add_from_text( + verse[1][:30], verse[1], verseTag) else: verses = song.lyrics.split(u'\n\n') for slide in verses: