diff --git a/openlp.pyw b/openlp.pyw index a15e35bbc..80e0db6af 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -32,14 +32,14 @@ from logging import FileHandler from optparse import OptionParser from PyQt4 import QtCore, QtGui +log = logging.getLogger() + import openlp from openlp.core.lib import Receiver, str_to_bool from openlp.core.resources import qInitResources from openlp.core.ui import MainWindow, SplashScreen, ScreenList from openlp.core.utils import get_config_directory, ConfigHelper -log = logging.getLogger() - application_stylesheet = u""" QMainWindow::separator { @@ -66,7 +66,6 @@ class OpenLP(QtGui.QApplication): The core application class. This class inherits from Qt's QApplication class in order to provide the core of the application. """ - global log log.info(u'OpenLP Application Loaded') def notify(self, obj, evt): @@ -165,7 +164,7 @@ def main(): filename = os.path.join(log_path, u'openlp.log') logfile = FileHandler(filename, u'w') logfile.setFormatter(logging.Formatter( - u'%(asctime)s %(name)-15s %(levelname)-8s %(message)s')) + u'%(asctime)s %(name)-20s %(levelname)-8s %(message)s')) log.addHandler(logfile) logging.addLevelName(15, u'Timer') # Parse command line options and deal with them. diff --git a/openlp/core/lib/dockwidget.py b/openlp/core/lib/dockwidget.py index 6d205cb29..ce8302b43 100644 --- a/openlp/core/lib/dockwidget.py +++ b/openlp/core/lib/dockwidget.py @@ -27,6 +27,8 @@ import logging from PyQt4 import QtGui +log = logging.getLogger(__name__) + class OpenLPDockWidget(QtGui.QDockWidget): """ Custom DockWidget class to handle events @@ -40,10 +42,9 @@ class OpenLPDockWidget(QtGui.QDockWidget): if name: self.setObjectName(name) self.setFloating(False) - self.log = logging.getLogger(u'OpenLPDockWidget') - self.log.debug(u'Init done') + log.debug(u'Init done') def closeEvent(self, event): self.parent.settingsmanager.setUIItemVisibility( self.objectName(), False) - event.accept() \ No newline at end of file + event.accept() diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index 9bd7cd652..be7dff67a 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -27,6 +27,8 @@ import logging from PyQt4 import QtCore +log = logging.getLogger(__name__) + class EventReceiver(QtCore.QObject): """ Class to allow events to be passed from different parts of the @@ -108,9 +110,6 @@ class EventReceiver(QtCore.QObject): Informs all components of the presentation types supported. """ - global log - log = logging.getLogger(u'EventReceiver') - def __init__(self): """ Initialise the event receiver, calling the parent constructor. diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 5f490eed1..ff87f0b0d 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -32,6 +32,8 @@ from openlp.core.lib.toolbar import * from openlp.core.lib import contextMenuAction, contextMenuSeparator from serviceitem import ServiceItem +log = logging.getLogger(__name__) + class MediaManagerItem(QtGui.QWidget): """ MediaManagerItem is a helper widget for plugins. @@ -92,9 +94,6 @@ class MediaManagerItem(QtGui.QWidget): method is not defined, a default will be used (treat the filename as an image). """ - - global log - log = logging.getLogger(u'MediaManagerItem') log.info(u'Media Item loaded') def __init__(self, parent=None, icon=None, title=None): diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index ca291d578..e98c789d0 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -28,6 +28,8 @@ from PyQt4 import QtCore from openlp.core.lib import PluginConfig, Receiver +log = logging.getLogger(__name__) + class PluginStatus(object): """ Defines the status of the plugin @@ -88,8 +90,6 @@ class Plugin(QtCore.QObject): Used in the plugin manager, when a person clicks on the 'About' button. """ - global log - log = logging.getLogger(u'Plugin') log.info(u'loaded') def __init__(self, name, version=None, plugin_helpers=None): @@ -254,3 +254,9 @@ class Plugin(QtCore.QObject): self.mediadock.insert_dock(self.media_item, self.icon, self.weight) if self.settings_tab: self.settings.insertTab(self.settings_tab, self.weight) + + def can_delete_theme(self, theme): + """ + Called to ask the plugin if a theme can be deleted + """ + return True diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index b06f23953..2ea5751ec 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -29,13 +29,13 @@ import logging from openlp.core.lib import Plugin, PluginStatus +log = logging.getLogger(__name__) + class PluginManager(object): """ This is the Plugin manager, which loads all the plugins, and executes all the hooks, as and when necessary. """ - global log - log = logging.getLogger(u'PluginMgr') log.info(u'Plugin manager loaded') def __init__(self, dir): diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index cc976dae5..ea6e849d8 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -28,13 +28,13 @@ import logging from PyQt4 import QtGui, QtCore from openlp.core.lib import resize_image +log = logging.getLogger(__name__) + class Renderer(object): """ Genarates a pixmap image of a array of text. The Text is formatted to make sure it fits on the screen and if not extra frames are generated. """ - global log - log = logging.getLogger(u'Renderer') log.info(u'Renderer Loaded') def __init__(self): diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index 1e8363228..edab3d309 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -30,6 +30,8 @@ from PyQt4 import QtCore from renderer import Renderer from openlp.core.lib import ThemeLevel +log = logging.getLogger(__name__) + class RenderManager(object): """ Class to pull all Renderer interactions into one place. The plugins will @@ -45,8 +47,6 @@ class RenderManager(object): ``screen_number`` Defaults to *0*. The index of the output/display screen. """ - global log - log = logging.getLogger(u'RenderManager') log.info(u'RenderManager Loaded') def __init__(self, theme_manager, screens, screen_number=0): diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index e62b24d8e..00d043870 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -32,6 +32,8 @@ from PyQt4 import QtGui from openlp.core.lib import build_icon, Receiver, resize_image +log = logging.getLogger(__name__) + class ServiceItemType(object): """ Defines the type of service item @@ -46,8 +48,6 @@ class ServiceItem(object): the service manager, the slide controller, and the projection screen compositor. """ - global log - log = logging.getLogger(u'ServiceItem') log.info(u'Service Item created') def __init__(self, plugin=None): @@ -73,6 +73,7 @@ class ServiceItem(object): self._display_frames = [] self._uuid = unicode(uuid.uuid1()) self.autoPreviewAllowed = False + self.notes = u'' def addIcon(self, icon): """ @@ -202,6 +203,7 @@ class ServiceItem(object): u'footer':self.raw_footer, u'type':self.service_item_type, u'audit':self.audit, + u'notes':self.notes, u'preview':self.autoPreviewAllowed } service_data = [] @@ -237,6 +239,7 @@ class ServiceItem(object): self.raw_footer = header[u'footer'] self.audit = header[u'audit'] self.autoPreviewAllowed = header[u'preview'] + self.notes = header[u'notes'] if self.service_item_type == ServiceItemType.Text: for slide in serviceitem[u'serviceitem'][u'data']: self._raw_frames.append(slide) diff --git a/openlp/core/lib/songxmlhandler.py b/openlp/core/lib/songxmlhandler.py index 596866934..7a532970d 100644 --- a/openlp/core/lib/songxmlhandler.py +++ b/openlp/core/lib/songxmlhandler.py @@ -27,6 +27,8 @@ import logging from xml.dom.minidom import Document from xml.etree.ElementTree import ElementTree, XML, dump +log = logging.getLogger(__name__) + class SongXMLBuilder(object): """ This class builds the XML used to describe songs. @@ -42,8 +44,6 @@ class SongXMLBuilder(object): """ - global log - log = logging.getLogger(u'SongXMLBuilder') log.info(u'SongXMLBuilder Loaded') def __init__(self): @@ -123,8 +123,6 @@ class SongXMLParser(object): """ - global log - log = logging.getLogger(u'SongXMLParser') log.info(u'SongXMLParser Loaded') def __init__(self, xml): @@ -158,4 +156,4 @@ class SongXMLParser(object): """ Debugging aid to dump XML so that we can see what we have. """ - return dump(self.song_xml) \ No newline at end of file + return dump(self.song_xml) diff --git a/openlp/core/lib/toolbar.py b/openlp/core/lib/toolbar.py index d4985fd70..3753fedc0 100644 --- a/openlp/core/lib/toolbar.py +++ b/openlp/core/lib/toolbar.py @@ -29,6 +29,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import build_icon +log = logging.getLogger(__name__) + class OpenLPToolbar(QtGui.QToolBar): """ Lots of toolbars around the place, so it makes sense to have a common way @@ -43,8 +45,7 @@ class OpenLPToolbar(QtGui.QToolBar): self.icons = {} self.setIconSize(QtCore.QSize(20, 20)) self.actions = {} - self.log = logging.getLogger(u'OpenLPToolbar') - self.log.debug(u'Init done') + log.debug(u'Init done') def addToolbarButton(self, title, icon, tooltip=None, slot=None, checkable=False): @@ -119,7 +120,7 @@ class OpenLPToolbar(QtGui.QToolBar): if self.icons[title]: return self.icons[title] else: - self.log.error(u'getIconFromTitle - no icon for %s' % title) + log.error(u'getIconFromTitle - no icon for %s' % title) return QtGui.QIcon() def makeWidgetsInvisible(self, widgets): @@ -152,4 +153,4 @@ class OpenLPToolbar(QtGui.QToolBar): push_button.setCheckable(True) push_button.setFlat(True) self.addWidget(push_button) - return push_button \ No newline at end of file + return push_button diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 6e37afc7f..c2f571c3b 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -23,6 +23,7 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +from serviceitemform import ServiceItemNoteForm from screen import ScreenList from maindisplay import MainDisplay from amendthemeform import AmendThemeForm @@ -40,4 +41,4 @@ from mainwindow import MainWindow __all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainWindow', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeManager', - 'AmendThemeForm', 'MediaDockManager'] + 'AmendThemeForm', 'MediaDockManager', 'ServiceItemNoteForm'] diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index bdb396498..7082bad8d 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -31,13 +31,13 @@ from PyQt4.phonon import Phonon from openlp.core.lib import Receiver, resize_image +log = logging.getLogger(__name__) + class DisplayWidget(QtGui.QWidget): """ Customised version of QTableWidget which can respond to keyboard events. """ - global log - log = logging.getLogger(u'MainDisplay') log.info(u'MainDisplay loaded') def __init__(self, parent=None, name=None): @@ -78,8 +78,6 @@ class MainDisplay(DisplayWidget): """ This is the form that is used to display things on the projector. """ - global log - log = logging.getLogger(u'MainDisplay') log.info(u'MainDisplay Loaded') def __init__(self, parent, screens): @@ -188,6 +186,7 @@ class MainDisplay(DisplayWidget): Receiver.send_message(u'screen_changed') def resetDisplay(self): + Receiver.send_message(u'stop_display_loop') if self.primary: self.setVisible(False) else: diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 96a089df1..7e822fb8a 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -36,6 +36,8 @@ from openlp.core.lib import RenderManager, PluginConfig, build_icon, \ OpenLPDockWidget, SettingsManager, PluginManager, Receiver, str_to_bool from openlp.core.utils import check_latest_version +log = logging.getLogger(__name__) + media_manager_style = """ QToolBox::tab { background: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, @@ -420,8 +422,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ The main window. """ - global log - log = logging.getLogger(u'MainWindow') log.info(u'MainWindow loaded') def __init__(self, screens, applicationVersion): diff --git a/openlp/core/ui/mediadockmanager.py b/openlp/core/ui/mediadockmanager.py index 4d76075df..0873133b2 100644 --- a/openlp/core/ui/mediadockmanager.py +++ b/openlp/core/ui/mediadockmanager.py @@ -25,7 +25,7 @@ import logging -log = logging.getLogger(u'MediaDockManager') +log = logging.getLogger(__name__) class MediaDockManager(object): @@ -58,4 +58,4 @@ class MediaDockManager(object): if self.media_dock.widget(dock_index): if self.media_dock.widget(dock_index).ConfigSection == name: self.media_dock.widget(dock_index).hide() - self.media_dock.removeItem(dock_index) \ No newline at end of file + self.media_dock.removeItem(dock_index) diff --git a/openlp/core/ui/pluginform.py b/openlp/core/ui/pluginform.py index fa48c0723..9af8b7ca3 100644 --- a/openlp/core/ui/pluginform.py +++ b/openlp/core/ui/pluginform.py @@ -30,9 +30,9 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib.plugin import PluginStatus from plugindialog import Ui_PluginViewDialog +log = logging.getLogger(__name__) + class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): - global log - log = logging.getLogger(u'PluginForm') def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) @@ -126,4 +126,4 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog): elif self.activePlugin.status == PluginStatus.Disabled: status_text = 'Disabled' self.PluginListWidget.currentItem().setText( - u'%s (%s)' % (self.activePlugin.name, status_text)) \ No newline at end of file + u'%s (%s)' % (self.activePlugin.name, status_text)) diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index 2321c3020..9fad9ca9b 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -24,12 +24,12 @@ ############################################################################### import logging +log = logging.getLogger(__name__) + class ScreenList(object): """ Wrapper to handle the parameters of the display screen """ - global log - log = logging.getLogger(u'Screen') log.info(u'Screen loaded') def __init__(self): diff --git a/openlp/core/ui/serviceitemdialog.py b/openlp/core/ui/serviceitemdialog.py new file mode 100644 index 000000000..1fe86a913 --- /dev/null +++ b/openlp/core/ui/serviceitemdialog.py @@ -0,0 +1,49 @@ +# -*- 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, 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 # +############################################################################### + +from PyQt4 import QtCore, QtGui + +class Ui_ServiceNoteEdit(object): + def setupUi(self, ServiceNoteEdit): + ServiceNoteEdit.setObjectName(u'ServiceNoteEdit') + ServiceNoteEdit.resize(400, 243) + self.widget = QtGui.QWidget(ServiceNoteEdit) + self.widget.setGeometry(QtCore.QRect(20, 10, 361, 223)) + self.widget.setObjectName(u'widget') + self.verticalLayout = QtGui.QVBoxLayout(self.widget) + self.verticalLayout.setObjectName(u'verticalLayout') + self.textEdit = QtGui.QTextEdit(self.widget) + self.textEdit.setObjectName(u'textEdit') + self.verticalLayout.addWidget(self.textEdit) + self.buttonBox = QtGui.QDialogButtonBox(self.widget) + self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Save) + self.buttonBox.setObjectName(u'buttonBox') + self.verticalLayout.addWidget(self.buttonBox) + + self.retranslateUi(ServiceNoteEdit) + QtCore.QMetaObject.connectSlotsByName(ServiceNoteEdit) + + def retranslateUi(self, ServiceNoteEdit): + ServiceNoteEdit.setWindowTitle(self.trUtf8('Service Item Notes')) diff --git a/openlp/core/ui/serviceitemform.py b/openlp/core/ui/serviceitemform.py new file mode 100644 index 000000000..43011ead8 --- /dev/null +++ b/openlp/core/ui/serviceitemform.py @@ -0,0 +1,44 @@ +# -*- 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, 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 # +############################################################################### + +from PyQt4 import QtCore, QtGui +from serviceitemdialog import Ui_ServiceNoteEdit + +class ServiceItemNoteForm(QtGui.QDialog, Ui_ServiceNoteEdit): + """ + This is the form that is used to edit the verses of the song. + """ + def __init__(self, parent=None): + """ + Constructor + """ + QtGui.QDialog.__init__(self, parent) + self.setupUi(self) + QtCore.QObject.connect(self.buttonBox, + QtCore.SIGNAL(u'accepted()'), + self.accept) + QtCore.QObject.connect(self.buttonBox, + QtCore.SIGNAL(u'rejected()'), + self.reject) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index b39ac2dcf..ad0da357b 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -28,33 +28,21 @@ import logging import cPickle import zipfile +log = logging.getLogger(__name__) + from PyQt4 import QtCore, QtGui + from openlp.core.lib import PluginConfig, OpenLPToolbar, ServiceItem, \ contextMenuAction, contextMenuSeparator, contextMenu, Receiver, \ - contextMenu, str_to_bool + contextMenu, str_to_bool, build_icon +from openlp.core.ui import ServiceItemNoteForm class ServiceManagerList(QtGui.QTreeWidget): def __init__(self, parent=None, name=None): QtGui.QTreeWidget.__init__(self,parent) self.parent = parent - -# def mousePressEvent(self, event): -# if event.button() == QtCore.Qt.RightButton: -# item = self.itemAt(event.pos()) -# parentitem = item.parent() -# if parentitem is None: -# pos = item.data(0, QtCore.Qt.UserRole).toInt()[0] -# else: -# pos = parentitem.data(0, QtCore.Qt.UserRole).toInt()[0] -# serviceItem = self.parent.serviceItems[pos - 1] -# if serviceItem[u'data'].edit_enabled: -# self.parent.editAction.setVisible(True) -# else: -# self.parent.editAction.setVisible(False) -# event.accept() -# else: -# event.ignore() + self.setExpandsOnDoubleClick(False) def keyPressEvent(self, event): if type(event) == QtGui.QKeyEvent: @@ -91,6 +79,7 @@ class ServiceManagerList(QtGui.QTreeWidget): just tell it what plugin to call """ if event.buttons() != QtCore.Qt.LeftButton: + event.ignore() return drag = QtGui.QDrag(self) mimeData = QtCore.QMimeData() @@ -105,9 +94,6 @@ class ServiceManager(QtGui.QWidget): the resources used into one OSZ file for use on any OpenLP v2 installation. Also handles the UI tasks of moving things up and down etc. """ - global log - log = logging.getLogger(u'ServiceManager') - def __init__(self, parent): """ Sets up the service manager, toolbars, list view, et al. @@ -121,6 +107,7 @@ class ServiceManager(QtGui.QWidget): #Indicates if remoteTriggering is active. If it is the next addServiceItem call #will replace the currently selected one. self.remoteEditTriggered = False + self.serviceItemNoteForm = ServiceItemNoteForm() #start with the layout self.Layout = QtGui.QVBoxLayout(self) self.Layout.setSpacing(0) @@ -161,37 +148,13 @@ class ServiceManager(QtGui.QWidget): self.ServiceManagerList.setAlternatingRowColors(True) self.ServiceManagerList.setHeaderHidden(True) self.ServiceManagerList.setExpandsOnDoubleClick(False) + self.ServiceManagerList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.ServiceManagerList.customContextMenuRequested.connect(self.contextMenu) self.ServiceManagerList.setObjectName(u'ServiceManagerList') # enable drop self.ServiceManagerList.__class__.dragEnterEvent = self.dragEnterEvent self.ServiceManagerList.__class__.dragMoveEvent = self.dragEnterEvent self.ServiceManagerList.__class__.dropEvent = self.dropEvent - # Add a context menu to the service manager list - self.ServiceManagerList.setContextMenuPolicy( - QtCore.Qt.ActionsContextMenu) - self.editAction = contextMenuAction( - self.ServiceManagerList, ':/services/service_edit.png', - self.trUtf8('&Edit Item'), self.remoteEdit) - self.ServiceManagerList.addAction(self.editAction) - self.ServiceManagerList.addAction(contextMenuSeparator( - self.ServiceManagerList)) - self.ServiceManagerList.addAction(contextMenuAction( - self.ServiceManagerList, ':/system/system_preview.png', - self.trUtf8('&Preview Verse'), self.makePreview)) - self.ServiceManagerList.addAction(contextMenuAction( - self.ServiceManagerList, ':/system/system_live.png', - self.trUtf8('&Show Live'), self.makeLive)) - self.ServiceManagerList.addAction(contextMenuSeparator( - self.ServiceManagerList)) - self.ServiceManagerList.addAction(contextMenuAction( - self.ServiceManagerList, ':/services/service_delete', - self.trUtf8('&Remove from Service'), self.onDeleteFromService)) - self.ServiceManagerList.addAction(contextMenuSeparator( - self.ServiceManagerList)) - self.ThemeMenu = contextMenu( - self.ServiceManagerList, '', - self.trUtf8('&Change Item Theme')) - self.ServiceManagerList.addAction(self.ThemeMenu.menuAction()) self.Layout.addWidget(self.ServiceManagerList) # Add the bottom toolbar self.OrderToolbar = OpenLPToolbar(self) @@ -216,7 +179,7 @@ class ServiceManager(QtGui.QWidget): QtCore.QObject.connect(self.ThemeComboBox, QtCore.SIGNAL(u'activated(int)'), self.onThemeComboBoxSelected) QtCore.QObject.connect(self.ServiceManagerList, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.makeLive) + QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.makeLive) QtCore.QObject.connect(self.ServiceManagerList, QtCore.SIGNAL(u'itemCollapsed(QTreeWidgetItem*)'), self.collapsed) QtCore.QObject.connect(self.ServiceManagerList, @@ -234,10 +197,60 @@ class ServiceManager(QtGui.QWidget): self.servicePath = self.config.get_data_path() self.service_theme = unicode( self.config.get_config(u'service theme', u'')) + #build the context menu + self.menu = QtGui.QMenu() + self.editAction = self.menu.addAction(self.trUtf8('&Edit Item')) + self.editAction.setIcon(build_icon(':/services/service_edit.png')) + self.notesAction = self.menu.addAction(self.trUtf8('&Notes')) + self.notesAction.setIcon(build_icon(':/services/service_notes.png')) + self.sep1 = self.menu.addAction(u'') + self.sep1.setSeparator(True) + self.previewAction = self.menu.addAction(self.trUtf8('&Preview Verse')) + self.previewAction.setIcon(build_icon(':/system/system_preview.png')) + self.liveAction = self.menu.addAction(self.trUtf8('&Live Verse')) + self.liveAction.setIcon(build_icon(':/system/system_live.png')) + self.sep2 = self.menu.addAction(u'') + self.sep2.setSeparator(True) + self.themeMenu = QtGui.QMenu(self.trUtf8('&Change Item Theme')) + self.menu.addMenu(self.themeMenu) + + def contextMenu(self, point): + item = self.ServiceManagerList.itemAt(point) + if item.parent() is None: + pos = item.data(0, QtCore.Qt.UserRole).toInt()[0] + else: + pos = item.parent().data(0, QtCore.Qt.UserRole).toInt()[0] + serviceItem = self.serviceItems[pos - 1] + self.editAction.setVisible(False) + self.notesAction.setVisible(False) + if serviceItem[u'service_item'].edit_enabled: + self.editAction.setVisible(True) + if item.parent() is None: + self.notesAction.setVisible(True) + self.themeMenu.menuAction().setVisible(False) + if serviceItem[u'service_item'].is_text(): + self.themeMenu.menuAction().setVisible(True) + action = self.menu.exec_(self.ServiceManagerList.mapToGlobal(point)) + if action == self.editAction: + self.remoteEdit() + if action == self.notesAction: + self.onServiceItemNoteForm() + if action == self.previewAction: + self.makePreview() + if action == self.liveAction: + self.makeLive() def onPresentationTypes(self, presentation_types): self.presentation_types = presentation_types + def onServiceItemNoteForm(self): + item, count = self.findServiceItem() + self.serviceItemNoteForm.textEdit.setPlainText( + self.serviceItems[item][u'service_item'].notes) + if self.serviceItemNoteForm.exec_(): + self.serviceItems[item][u'service_item'].notes = \ + self.serviceItemNoteForm.textEdit.toPlainText() + def nextItem(self): """ Called by the SlideController to select the @@ -577,9 +590,14 @@ class ServiceManager(QtGui.QWidget): self.parent.RenderManager.themedata = None if len(self.serviceItems) > 0: tempServiceItems = self.serviceItems - self.onNewService() + self.ServiceManagerList.clear() + self.serviceItems = [] + self.isNew = True for item in tempServiceItems: self.addServiceItem(item[u'service_item'], True) + #Set to False as items may have changed rendering + #does not impact the saved song so True may aslo be valid + self.parent.serviceChanged(False, self.serviceName) def addServiceItem(self, item, rebuild=False): """ @@ -722,7 +740,7 @@ class ServiceManager(QtGui.QWidget): A list of current themes to be displayed """ self.ThemeComboBox.clear() - self.ThemeMenu.clear() + self.themeMenu.clear() self.ThemeComboBox.addItem(u'') for theme in theme_list: self.ThemeComboBox.addItem(theme) @@ -730,7 +748,7 @@ class ServiceManager(QtGui.QWidget): self.ServiceManagerList, None, theme , self.onThemeChangeAction) - self.ThemeMenu.addAction(action) + self.themeMenu.addAction(action) id = self.ThemeComboBox.findText(self.service_theme, QtCore.Qt.MatchExactly) # Not Found diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index c8989625d..4a3902347 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -31,7 +31,7 @@ from openlp.core.ui import GeneralTab, ThemesTab from openlp.core.lib import Receiver from settingsdialog import Ui_SettingsDialog -log = logging.getLogger(u'SettingsForm') +log = logging.getLogger(__name__) class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 515fb2d3c..ff8507f5d 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -33,6 +33,8 @@ from PyQt4.phonon import Phonon from openlp.core.lib import OpenLPToolbar, Receiver, str_to_bool, \ PluginConfig, resize_image +log = logging.getLogger(__name__) + class SlideList(QtGui.QTableWidget): """ Customised version of QTableWidget which can respond to keyboard @@ -74,9 +76,6 @@ class SlideController(QtGui.QWidget): SlideController is the slide controller widget. This widget is what the user uses to control the displaying of verses/slides/etc on the screen. """ - global log - log = logging.getLogger(u'SlideController') - def __init__(self, parent, settingsmanager, isLive=False): """ Set up the Slide Controller. @@ -183,7 +182,7 @@ class SlideController(QtGui.QWidget): self.trUtf8('Move to live'), self.onGoLive) self.Toolbar.addToolbarSeparator(u'Close Separator') self.Toolbar.addToolbarButton( - u'Edit Song', u':/songs/song_edit.png', + u'Edit Song', u':/services/service_edit.png', self.trUtf8('Edit and re-preview Song'), self.onEditSong) if isLive: self.Toolbar.addToolbarSeparator(u'Loop Separator') @@ -194,6 +193,8 @@ class SlideController(QtGui.QWidget): u'Stop Loop', u':/media/media_stop.png', self.trUtf8('Stop continuous loop'), self.onStopLoop) self.DelaySpinBox = QtGui.QSpinBox() + self.DelaySpinBox.setMinimum(1) + self.DelaySpinBox.setMaximum(180) self.Toolbar.addToolbarWidget( u'Image SpinBox', self.DelaySpinBox) self.DelaySpinBox.setSuffix(self.trUtf8('s')) @@ -280,6 +281,8 @@ class SlideController(QtGui.QWidget): else: self.Toolbar.makeWidgetsInvisible(self.song_edit_list) self.Mediabar.setVisible(False) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'stop_display_loop'), self.onStopLoop) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'%s_first' % prefix), self.onSlideSelectedFirst) QtCore.QObject.connect(Receiver.get_receiver(), diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 577021418..b6396c7db 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -38,13 +38,12 @@ from openlp.core.lib import PluginConfig, OpenLPToolbar, contextMenuAction, \ contextMenuSeparator from openlp.core.utils import ConfigHelper +log = logging.getLogger(__name__) + class ThemeManager(QtGui.QWidget): """ Manages the orders of Theme. """ - global log - log = logging.getLogger(u'ThemeManager') - def __init__(self, parent): QtGui.QWidget.__init__(self, parent) self.parent = parent @@ -181,6 +180,19 @@ class ThemeManager(QtGui.QWidget): self.trUtf8('You are unable to delete the default theme!'), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) else: + for plugin in self.parent.plugin_manager.plugins: + if not plugin.can_delete_theme(theme): + QtGui.QMessageBox.critical( + self, self.trUtf8('Error'), + self.trUtf8('theme %s is use in %s plugin' % (theme, plugin.name)), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + return + if unicode(self.parent.ServiceManagerContents.ThemeComboBox.currentText()) == theme: + QtGui.QMessageBox.critical( + self, self.trUtf8('Error'), + self.trUtf8('theme %s is use Service Manager' % theme), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok)) + return self.themelist.remove(theme) th = theme + u'.png' row = self.ThemeListWidget.row(item) diff --git a/openlp/migration/display.py b/openlp/migration/display.py index 9a3f6e44e..bffef5b17 100644 --- a/openlp/migration/display.py +++ b/openlp/migration/display.py @@ -25,9 +25,9 @@ import logging +log = logging.getLogger(__name__) + class Display(): - global log - log = logging.getLogger(u'Display Logger') log.info(u'Display Class loaded') @staticmethod @@ -39,4 +39,4 @@ class Display(): def sub_output(string): if not string is None: log.debug(u' '+string); - print (u' '+string) \ No newline at end of file + print (u' '+string) diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 5bf268394..3e065f6af 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -31,9 +31,9 @@ from openlp.core.lib import Plugin, build_icon, PluginStatus from openlp.plugins.alerts.lib import AlertsManager, DBManager from openlp.plugins.alerts.forms import AlertsTab, AlertForm, AlertEditForm +log = logging.getLogger(__name__) + class alertsPlugin(Plugin): - global log - log = logging.getLogger(u'AlertsPlugin') log.info(u'Alerts Plugin loaded') def __init__(self, plugin_helpers): diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index deda11240..6838fefa0 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -29,12 +29,12 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Receiver +log = logging.getLogger(__name__) + class AlertsManager(QtCore.QObject): """ - BiblesTab is the Bibles settings tab in the settings dialog. + AlertsTab is the Alerts settings tab in the settings dialog. """ - global log - log = logging.getLogger(u'AlertManager') log.info(u'Alert Manager loaded') def __init__(self, parent): diff --git a/openlp/plugins/alerts/lib/manager.py b/openlp/plugins/alerts/lib/manager.py index 3480b3103..a3ed1ee7e 100644 --- a/openlp/plugins/alerts/lib/manager.py +++ b/openlp/plugins/alerts/lib/manager.py @@ -27,14 +27,13 @@ import logging from openlp.plugins.alerts.lib.models import init_models, metadata, AlertItem +log = logging.getLogger(__name__) + class DBManager(): """ 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. """ - - global log - log = logging.getLogger(u'AlertsDBManager') log.info(u'Alerts DB loaded') def __init__(self, config): diff --git a/openlp/plugins/bibles/bibleplugin.py b/openlp/plugins/bibles/bibleplugin.py index 9d85a90a0..bd65b6622 100644 --- a/openlp/plugins/bibles/bibleplugin.py +++ b/openlp/plugins/bibles/bibleplugin.py @@ -30,9 +30,9 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, build_icon, PluginStatus from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem +log = logging.getLogger(__name__) + class BiblePlugin(Plugin): - global log - log = logging.getLogger(u'BiblePlugin') log.info(u'Bible Plugin loaded') def __init__(self, plugin_helpers): @@ -92,3 +92,9 @@ class BiblePlugin(Plugin): 'plugin allows bible verses from different sources to be ' 'displayed on the screen during the service.') return about_text + + + def can_delete_theme(self, theme): + if self.settings_tab.bible_theme == theme: + return False + return True diff --git a/openlp/plugins/bibles/forms/importwizardform.py b/openlp/plugins/bibles/forms/importwizardform.py index 2f5e84867..dfca754a8 100644 --- a/openlp/plugins/bibles/forms/importwizardform.py +++ b/openlp/plugins/bibles/forms/importwizardform.py @@ -34,6 +34,8 @@ from bibleimportwizard import Ui_BibleImportWizard from openlp.core.lib import Receiver from openlp.plugins.bibles.lib.manager import BibleFormat +log = logging.getLogger(__name__) + class DownloadLocation(object): Unknown = -1 Crosswalk = 0 @@ -54,9 +56,6 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard): This is the Bible Import Wizard, which allows easy importing of Bibles into OpenLP from other formats like OSIS, CSV and OpenSong. """ - - global log - log = logging.getLogger(u'BibleImportForm') log.info(u'BibleImportForm loaded') def __init__(self, parent, config, manager, bibleplugin): @@ -371,4 +370,4 @@ class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard): self.ImportProgressBar.setValue(self.ImportProgressBar.maximum()) self.finishButton.setVisible(True) self.cancelButton.setVisible(False) - Receiver.send_message(u'process_events') \ No newline at end of file + Receiver.send_message(u'process_events') diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index ef8e6a090..398040fd8 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -29,12 +29,12 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import str_to_bool, Receiver, SettingsTab +log = logging.getLogger(__name__) + class BiblesTab(SettingsTab): """ BiblesTab is the Bibles settings tab in the settings dialog. """ - global log - log = logging.getLogger(u'BibleTab') log.info(u'Bible Tab loaded') def __init__(self, title, section=None): diff --git a/openlp/plugins/bibles/lib/manager.py b/openlp/plugins/bibles/lib/manager.py index 965d0433f..d24982532 100644 --- a/openlp/plugins/bibles/lib/manager.py +++ b/openlp/plugins/bibles/lib/manager.py @@ -33,6 +33,8 @@ from csvbible import CSVBible from db import BibleDB from http import HTTPBible +log = logging.getLogger(__name__) + class BibleMode(object): """ This is basically an enumeration class which specifies the mode of a Bible. @@ -85,8 +87,6 @@ class BibleManager(object): """ The Bible manager which holds and manages all the Bibles. """ - global log - log = logging.getLogger(u'BibleManager') log.info(u'Bible manager loaded') def __init__(self, parent, config): diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index c0a3bde35..30403e69d 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -32,6 +32,8 @@ from openlp.core.lib import MediaManagerItem, Receiver, str_to_bool, \ BaseListWithDnD from openlp.plugins.bibles.forms import ImportWizardForm +log = logging.getLogger(__name__) + class BibleListView(BaseListWithDnD): """ Drag and drop capable list for Bibles. @@ -47,8 +49,6 @@ class BibleMediaItem(MediaManagerItem): """ This is the custom media manager item for Bibles. """ - global log - log = logging.getLogger(u'BibleMediaItem') log.info(u'Bible Media Item loaded') def __init__(self, parent, icon, title): diff --git a/openlp/plugins/bibles/lib/osis.py b/openlp/plugins/bibles/lib/osis.py index 41f11e8a0..658ac8a0b 100644 --- a/openlp/plugins/bibles/lib/osis.py +++ b/openlp/plugins/bibles/lib/osis.py @@ -35,12 +35,12 @@ from PyQt4 import QtCore from openlp.core.lib import Receiver from db import BibleDB +log = logging.getLogger(__name__) + class OSISBible(BibleDB): """ OSIS Bible format importer class. """ - global log - log = logging.getLogger(u'BibleOSISImpl') log.info(u'BibleOSISImpl loaded') def __init__(self, parent, **kwargs): diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index fb30bed9f..ac5384390 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -29,6 +29,7 @@ from forms import EditCustomForm from openlp.core.lib import Plugin, build_icon, PluginStatus from openlp.plugins.custom.lib import CustomManager, CustomMediaItem, CustomTab +log = logging.getLogger(__name__) class CustomPlugin(Plugin): """ @@ -39,9 +40,6 @@ class CustomPlugin(Plugin): the songs plugin has become restrictive. Examples could be Welcome slides, Bible Reading information, Orders of service. """ - - global log - log = logging.getLogger(u'CustomPlugin') log.info(u'Custom Plugin loaded') def __init__(self, plugin_helpers): @@ -74,3 +72,8 @@ class CustomPlugin(Plugin): 'songs are. This plugin provides greater freedom over the ' 'songs plugin.
') return about_text + + def can_delete_theme(self, theme): + if len(self.custommanager.get_customs_for_theme(theme)) == 0: + return True + return False diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index e701c0938..577142f23 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -30,12 +30,12 @@ from editcustomdialog import Ui_customEditDialog from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver from openlp.plugins.custom.lib.models import CustomSlide +log = logging.getLogger(__name__) + class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): """ Class documentation goes here. """ - global log - log = logging.getLogger(u'EditCustomForm') log.info(u'Custom Editor loaded') def __init__(self, custommanager, parent = None): """ diff --git a/openlp/plugins/custom/lib/manager.py b/openlp/plugins/custom/lib/manager.py index d1d3e0349..1368b89ee 100644 --- a/openlp/plugins/custom/lib/manager.py +++ b/openlp/plugins/custom/lib/manager.py @@ -27,14 +27,13 @@ import logging from openlp.plugins.custom.lib.models import init_models, metadata, CustomSlide +log = logging.getLogger(__name__) + class CustomManager(): """ 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. """ - - global log - log = logging.getLogger(u'CustomManager') log.info(u'Custom manager loaded') def __init__(self, config): @@ -106,3 +105,6 @@ class CustomManager(): return False else: return True + + def get_customs_for_theme(self, theme): + return self.session.query(CustomSlide).filter(CustomSlide.theme_name == theme).all() diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index c4b9ef16a..2a3090cf2 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -30,6 +30,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD,\ Receiver, str_to_bool +log = logging.getLogger(__name__) + class CustomListView(BaseListWithDnD): def __init__(self, parent=None): self.PluginName = u'Custom' @@ -39,8 +41,6 @@ class CustomMediaItem(MediaManagerItem): """ This is the custom media manager item for Custom Slides. """ - global log - log = logging.getLogger(u'CustomMediaItem') log.info(u'Custom Media Item loaded') def __init__(self, parent, icon, title): diff --git a/openlp/plugins/images/imageplugin.py b/openlp/plugins/images/imageplugin.py index e6895c767..40e9c1e1d 100644 --- a/openlp/plugins/images/imageplugin.py +++ b/openlp/plugins/images/imageplugin.py @@ -28,9 +28,9 @@ import logging from openlp.core.lib import Plugin, build_icon, PluginStatus from openlp.plugins.images.lib import ImageMediaItem, ImageTab +log = logging.getLogger(__name__) + class ImagePlugin(Plugin): - global log - log = logging.getLogger(u'ImagePlugin') log.info(u'Image Plugin loaded') def __init__(self, plugin_helpers): diff --git a/openlp/plugins/images/lib/imagetab.py b/openlp/plugins/images/lib/imagetab.py index 2dbea8181..b70006bdb 100644 --- a/openlp/plugins/images/lib/imagetab.py +++ b/openlp/plugins/images/lib/imagetab.py @@ -49,6 +49,7 @@ class ImageTab(SettingsTab): self.TimeoutLabel.setObjectName(u'TimeoutLabel') self.TimeoutLayout.addWidget(self.TimeoutLabel) self.TimeoutSpinBox = QtGui.QSpinBox(self.ImageSettingsGroupBox) + self.TimeoutSpinBox.setMinimum(1) self.TimeoutSpinBox.setMaximum(180) self.TimeoutSpinBox.setObjectName(u'TimeoutSpinBox') self.TimeoutLayout.addWidget(self.TimeoutSpinBox) @@ -78,4 +79,4 @@ class ImageTab(SettingsTab): Receiver.send_message(u'update_spin_delay', self.loop_delay) def postSetUp(self): - Receiver.send_message(u'update_spin_delay', self.loop_delay) \ No newline at end of file + Receiver.send_message(u'update_spin_delay', self.loop_delay) diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index e418ee44e..830459843 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -29,6 +29,8 @@ import os from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon +log = logging.getLogger(__name__) + # We have to explicitly create separate classes for each plugin # in order for DnD to the Service manager to work correctly. class ImageListView(BaseListWithDnD): @@ -40,8 +42,6 @@ class ImageMediaItem(MediaManagerItem): """ This is the custom media manager item for images. """ - global log - log = logging.getLogger(u'ImageMediaItem') log.info(u'Image Media Item loaded') def __init__(self, parent, icon, title): diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 75108d850..f7dafbf27 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -46,15 +46,15 @@ from PyQt4 import QtCore from presentationcontroller import PresentationController, PresentationDocument +log = logging.getLogger(__name__) + class ImpressController(PresentationController): """ Class to control interactions with Impress presentations. It creates the runtime environment, loads and closes the presentation as well as triggering the correct activities based on the users input """ - global log - log = logging.getLogger(u'ImpressController') - log.info(u'loaded') + log.info(u'ImpressController loaded') def __init__(self, plugin): """ diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index 51f234f3d..9aebb4ab5 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -31,6 +31,8 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import MediaManagerItem, BaseListWithDnD from openlp.plugins.presentations.lib import MessageListener +log = logging.getLogger(__name__) + # We have to explicitly create separate classes for each plugin # in order for DnD to the Service manager to work correctly. class PresentationListView(BaseListWithDnD): @@ -43,8 +45,6 @@ class PresentationMediaItem(MediaManagerItem): This is the Presentation media manager item for Presentation Items. It can present files using Openoffice """ - global log - log = logging.getLogger(u'PresentationsMediaItem') log.info(u'Presentations Media Item loaded') def __init__(self, parent, icon, title, controllers): diff --git a/openlp/plugins/presentations/lib/messagelistener.py b/openlp/plugins/presentations/lib/messagelistener.py index 9065bf796..4854cbb73 100644 --- a/openlp/plugins/presentations/lib/messagelistener.py +++ b/openlp/plugins/presentations/lib/messagelistener.py @@ -30,13 +30,13 @@ from PyQt4 import QtCore from openlp.core.lib import Receiver +log = logging.getLogger(__name__) + class Controller(object): """ This is the Presentation listener who acts on events from the slide controller and passes the messages on the the correct presentation handlers """ - global log - log = logging.getLogger(u'Controller') log.info(u'Controller loaded') def __init__(self, live): @@ -152,8 +152,6 @@ class MessageListener(object): This is the Presentation listener who acts on events from the slide controller and passes the messages on the the correct presentation handlers """ - global log - log = logging.getLogger(u'MessageListener') log.info(u'Message Listener loaded') def __init__(self, controllers): diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index 64c435ebf..0408e2dc1 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -33,6 +33,8 @@ if os.name == u'nt': from presentationcontroller import PresentationController, PresentationDocument +log = logging.getLogger(__name__) + # PPT API documentation: # http://msdn.microsoft.com/en-us/library/aa269321(office.10).aspx @@ -42,9 +44,7 @@ class PowerpointController(PresentationController): It creates the runtime Environment , Loads the and Closes the Presentation As well as triggering the correct activities based on the users input """ - global log - log = logging.getLogger(u'PowerpointController') - log.info(u'loaded') + log.info(u'PowerpointController loaded') def __init__(self, plugin): """ diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index ddfbbd204..671fefe70 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -32,15 +32,15 @@ if os.name == u'nt': from presentationcontroller import PresentationController, PresentationDocument +log = logging.getLogger(__name__) + class PptviewController(PresentationController): """ Class to control interactions with PowerPOint Viewer Presentations It creates the runtime Environment , Loads the and Closes the Presentation As well as triggering the correct activities based on the users input """ - global log - log = logging.getLogger(u'PptviewController') - log.info(u'loaded') + log.info(u'PPTViewController loaded') def __init__(self, plugin): """ diff --git a/openlp/plugins/presentations/lib/presentationcontroller.py b/openlp/plugins/presentations/lib/presentationcontroller.py index 0818c6b4e..b862de514 100644 --- a/openlp/plugins/presentations/lib/presentationcontroller.py +++ b/openlp/plugins/presentations/lib/presentationcontroller.py @@ -31,6 +31,8 @@ from PyQt4 import QtCore from openlp.core.lib import Receiver +log = logging.getLogger(__name__) + class PresentationController(object): """ Base class for presentation controllers to inherit from @@ -72,8 +74,6 @@ class PresentationController(object): Deletes presentation specific files, e.g. thumbnails """ - global log - log = logging.getLogger(u'PresentationController') log.info(u'PresentationController loaded') def __init__(self, plugin=None, name=u'PresentationController'): diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 7103a3a2c..061eb737f 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -29,9 +29,9 @@ import logging from openlp.core.lib import Plugin, build_icon, Receiver, PluginStatus from openlp.plugins.presentations.lib import * -class PresentationPlugin(Plugin): +log = logging.getLogger(__name__) - global log +class PresentationPlugin(Plugin): log = logging.getLogger(u'PresentationPlugin') def __init__(self, plugin_helpers): diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index bd8d8974b..acfa6f97d 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -30,10 +30,9 @@ from PyQt4 import QtNetwork, QtCore from openlp.core.lib import Plugin, Receiver from openlp.plugins.remotes.lib import RemoteTab -class RemotesPlugin(Plugin): +log = logging.getLogger(__name__) - global log - log = logging.getLogger(u'RemotesPlugin') +class RemotesPlugin(Plugin): log.info(u'Remote Plugin loaded') def __init__(self, plugin_helpers): diff --git a/openlp/plugins/songs/lib/manager.py b/openlp/plugins/songs/lib/manager.py index ceb596942..0e662dcbc 100644 --- a/openlp/plugins/songs/lib/manager.py +++ b/openlp/plugins/songs/lib/manager.py @@ -28,14 +28,13 @@ import logging from openlp.plugins.songs.lib.models import init_models, metadata, Song, \ Author, Topic, Book +log = logging.getLogger(__name__) + class SongManager(): """ 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. """ - - global log - log = logging.getLogger(u'SongManager') log.info(u'Song manager loaded') def __init__(self, config): @@ -238,3 +237,6 @@ class SongManager(): self.session.rollback() log.exception(u'Could not delete book from song database') return False + + def get_songs_for_theme(self, theme): + return self.session.query(Song).filter(Song.theme_name == theme).all() diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 63fd69d48..cd440e54f 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -31,6 +31,8 @@ from openlp.core.lib import MediaManagerItem, SongXMLParser, \ BaseListWithDnD, Receiver, str_to_bool from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm +log = logging.getLogger(__name__) + class SongListView(BaseListWithDnD): def __init__(self, parent=None): self.PluginName = u'Songs' @@ -40,8 +42,6 @@ class SongMediaItem(MediaManagerItem): """ This is the custom media manager item for Songs. """ - global log - log = logging.getLogger(u'SongMediaItem') log.info(u'Song Media Item loaded') def __init__(self, parent, icon, title): diff --git a/openlp/plugins/songs/songsplugin.py b/openlp/plugins/songs/songsplugin.py index 088b9a1cf..9ebaa99b2 100644 --- a/openlp/plugins/songs/songsplugin.py +++ b/openlp/plugins/songs/songsplugin.py @@ -32,6 +32,8 @@ from openlp.plugins.songs.lib import SongManager, SongMediaItem, SongsTab from openlp.plugins.songs.forms import OpenLPImportForm, OpenSongExportForm, \ OpenSongImportForm, OpenLPExportForm +log = logging.getLogger(__name__) + class SongsPlugin(Plugin): """ This is the number 1 plugin, if importance were placed on any @@ -40,9 +42,6 @@ class SongsPlugin(Plugin): specified. Authors, topics and song books can be assigned to songs as well. """ - - global log - log = logging.getLogger(u'SongsPlugin') log.info(u'Song Plugin loaded') def __init__(self, plugin_helpers): @@ -180,3 +179,8 @@ class SongsPlugin(Plugin): about_text = self.trUtf8('Song Plugin
This plugin allows ' 'Songs to be managed and displayed.
') return about_text + + def can_delete_theme(self, theme): + if len(self.songmanager.get_songs_for_theme(theme)) == 0: + return True + return False diff --git a/openlp/plugins/songusage/forms/songusagedetailform.py b/openlp/plugins/songusage/forms/songusagedetailform.py index df749d8c0..be548ac35 100644 --- a/openlp/plugins/songusage/forms/songusagedetailform.py +++ b/openlp/plugins/songusage/forms/songusagedetailform.py @@ -29,9 +29,9 @@ import logging from songusagedetaildialog import Ui_SongUsageDetailDialog +log = logging.getLogger(__name__) + class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): - global log - log = logging.getLogger(u'SongUsageDetailForm') log.info(u'SongUsage Detail Form loaded') """ Class documentation goes here. diff --git a/openlp/plugins/songusage/lib/manager.py b/openlp/plugins/songusage/lib/manager.py index 6cae4c372..d9f7feb6f 100644 --- a/openlp/plugins/songusage/lib/manager.py +++ b/openlp/plugins/songusage/lib/manager.py @@ -27,14 +27,13 @@ import logging from openlp.plugins.songusage.lib.models import init_models, metadata, SongUsageItem +log = logging.getLogger(__name__) + class SongUsageManager(): """ 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. """ - - global log - log = logging.getLogger(u'SongUsageManager') log.info(u'SongUsage manager loaded') def __init__(self, config): diff --git a/openlp/plugins/songusage/songusageplugin.py b/openlp/plugins/songusage/songusageplugin.py index d0ebe68ef..d30bd4bea 100644 --- a/openlp/plugins/songusage/songusageplugin.py +++ b/openlp/plugins/songusage/songusageplugin.py @@ -33,9 +33,9 @@ from openlp.plugins.songusage.lib import SongUsageManager from openlp.plugins.songusage.forms import SongUsageDetailForm, SongUsageDeleteForm from openlp.plugins.songusage.lib.models import SongUsageItem +log = logging.getLogger(__name__) + class SongUsagePlugin(Plugin): - global log - log = logging.getLogger(u'SongUsagePlugin') log.info(u'SongUsage Plugin loaded') def __init__(self, plugin_helpers): diff --git a/resources/forms/serviceitemdialog.ui b/resources/forms/serviceitemdialog.ui new file mode 100644 index 000000000..6615b08aa --- /dev/null +++ b/resources/forms/serviceitemdialog.ui @@ -0,0 +1,41 @@ + + + ServiceNoteEdit + + + + 0 + 0 + 400 + 243 + + + + Service Item Notes + + + + + 20 + 10 + 361 + 223 + + + + + + + + + + QDialogButtonBox::Cancel|QDialogButtonBox::Save + + + + + + + + + diff --git a/version.txt b/version.txt index fccf41cd0..8fdd0d461 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -1.9.0-721 +1.9.0-723