forked from openlp/openlp
head924
This commit is contained in:
commit
6352f8c0ed
|
@ -60,18 +60,6 @@
|
|||
.. autoclass:: openlp.core.lib.settingstab.SettingsTab
|
||||
:members:
|
||||
|
||||
:mod:`SongXMLBuilder`
|
||||
---------------------
|
||||
|
||||
.. autoclass:: openlp.core.lib.songxmlhandler.SongXMLBuilder
|
||||
:members:
|
||||
|
||||
:mod:`SongXMLParser`
|
||||
--------------------
|
||||
|
||||
.. autoclass:: openlp.core.lib.songxmlhandler.SongXMLParser
|
||||
:members:
|
||||
|
||||
:mod:`ThemeXML`
|
||||
---------------
|
||||
|
||||
|
@ -83,10 +71,3 @@
|
|||
|
||||
.. autoclass:: openlp.core.lib.toolbar.OpenLPToolbar
|
||||
:members:
|
||||
|
||||
:mod:`XmlRootClass`
|
||||
-------------------
|
||||
|
||||
.. autoclass:: openlp.core.lib.xmlrootclass.XmlRootClass
|
||||
:members:
|
||||
|
||||
|
|
|
@ -202,28 +202,17 @@ def check_item_selected(list_widget, message):
|
|||
return False
|
||||
return True
|
||||
|
||||
|
||||
class ThemeLevel(object):
|
||||
"""
|
||||
Provides an enumeration for the level a theme applies to
|
||||
"""
|
||||
Global = 1
|
||||
Service = 2
|
||||
Song = 3
|
||||
|
||||
from eventreceiver import Receiver
|
||||
from settingsmanager import SettingsManager
|
||||
from plugin import PluginStatus, Plugin
|
||||
from pluginmanager import PluginManager
|
||||
from settingstab import SettingsTab
|
||||
from xmlrootclass import XmlRootClass
|
||||
from serviceitem import ServiceItem
|
||||
from serviceitem import ServiceItemType
|
||||
from serviceitem import ItemCapabilities
|
||||
from toolbar import OpenLPToolbar
|
||||
from dockwidget import OpenLPDockWidget
|
||||
from songxmlhandler import SongXMLBuilder, SongXMLParser
|
||||
from themexmlhandler import ThemeXML
|
||||
from theme import ThemeLevel, ThemeXML
|
||||
from renderer import Renderer
|
||||
from rendermanager import RenderManager
|
||||
from mediamanageritem import MediaManagerItem
|
||||
|
|
|
@ -189,7 +189,7 @@ class Manager(object):
|
|||
Any parameters to order the returned objects by. Defaults to None.
|
||||
"""
|
||||
query = self.session.query(object_class)
|
||||
if order_by_ref:
|
||||
if order_by_ref is not None:
|
||||
return query.order_by(order_by_ref).all()
|
||||
return query.all()
|
||||
|
||||
|
@ -208,7 +208,7 @@ class Manager(object):
|
|||
Any parameters to order the returned objects by. Defaults to None.
|
||||
"""
|
||||
query = self.session.query(object_class).filter(filter_clause)
|
||||
if order_by_ref:
|
||||
if order_by_ref is not None:
|
||||
return query.order_by(order_by_ref).all()
|
||||
return query.all()
|
||||
|
||||
|
|
|
@ -443,7 +443,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
service_item = self.buildServiceItem()
|
||||
if service_item:
|
||||
service_item.from_plugin = True
|
||||
self.parent.preview_controller.addServiceItem(service_item)
|
||||
self.parent.previewController.addServiceItem(service_item)
|
||||
|
||||
def onLiveClick(self):
|
||||
"""
|
||||
|
@ -460,7 +460,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
service_item = self.buildServiceItem()
|
||||
if service_item:
|
||||
service_item.from_plugin = True
|
||||
self.parent.live_controller.addServiceItem(service_item)
|
||||
self.parent.liveController.addServiceItem(service_item)
|
||||
|
||||
def onAddClick(self):
|
||||
"""
|
||||
|
@ -479,7 +479,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
service_item = self.buildServiceItem()
|
||||
if service_item:
|
||||
service_item.from_plugin = False
|
||||
self.parent.service_manager.addServiceItem(service_item,
|
||||
self.parent.serviceManager.addServiceItem(service_item,
|
||||
replace=self.remoteTriggered)
|
||||
else:
|
||||
items = self.ListView.selectedIndexes()
|
||||
|
@ -487,7 +487,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
service_item = self.buildServiceItem(item)
|
||||
if service_item:
|
||||
service_item.from_plugin = False
|
||||
self.parent.service_manager.addServiceItem(service_item)
|
||||
self.parent.serviceManager.addServiceItem(service_item)
|
||||
|
||||
def onAddEditClick(self):
|
||||
"""
|
||||
|
@ -500,7 +500,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
'You must select one or more items'))
|
||||
else:
|
||||
log.debug(self.PluginNameShort + u' Add requested')
|
||||
service_item = self.parent.service_manager.getServiceItem()
|
||||
service_item = self.parent.serviceManager.getServiceItem()
|
||||
if not service_item:
|
||||
QtGui.QMessageBox.information(self,
|
||||
translate('MediaManagerItem', 'No Service Item Selected'),
|
||||
|
@ -508,7 +508,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
'You must select an existing service item to add to.'))
|
||||
elif self.title.lower() == service_item.name.lower():
|
||||
self.generateSlideData(service_item)
|
||||
self.parent.service_manager.addServiceItem(service_item,
|
||||
self.parent.serviceManager.addServiceItem(service_item,
|
||||
replace=True)
|
||||
else:
|
||||
#Turn off the remote edit update message indicator
|
||||
|
|
|
@ -67,23 +67,23 @@ class Plugin(QtCore.QObject):
|
|||
|
||||
**Hook Functions**
|
||||
|
||||
``check_pre_conditions()``
|
||||
``checkPreConditions()``
|
||||
Provides the Plugin with a handle to check if it can be loaded.
|
||||
|
||||
``get_media_manager_item()``
|
||||
``getMediaManagerItem()``
|
||||
Returns an instance of MediaManagerItem to be used in the Media Manager.
|
||||
|
||||
``add_import_menu_item(import_menu)``
|
||||
``addImportMenuItem(import_menu)``
|
||||
Add an item to the Import menu.
|
||||
|
||||
``add_export_menu_item(export_menu)``
|
||||
``addExportMenuItem(export_menu)``
|
||||
Add an item to the Export menu.
|
||||
|
||||
``get_settings_tab()``
|
||||
``getSettingsTab()``
|
||||
Returns an instance of SettingsTabItem to be used in the Settings
|
||||
dialog.
|
||||
|
||||
``add_to_menu(menubar)``
|
||||
``addToMenu(menubar)``
|
||||
A method to add a menu item to anywhere in the menu, given the menu bar.
|
||||
|
||||
``handle_event(event)``
|
||||
|
@ -124,18 +124,19 @@ class Plugin(QtCore.QObject):
|
|||
self.status = PluginStatus.Inactive
|
||||
# Set up logging
|
||||
self.log = logging.getLogger(self.name)
|
||||
self.preview_controller = plugin_helpers[u'preview']
|
||||
self.live_controller = plugin_helpers[u'live']
|
||||
self.render_manager = plugin_helpers[u'render']
|
||||
self.service_manager = plugin_helpers[u'service']
|
||||
self.settings_form = plugin_helpers[u'settings form']
|
||||
self.previewController = plugin_helpers[u'preview']
|
||||
self.liveController = plugin_helpers[u'live']
|
||||
self.renderManager = plugin_helpers[u'render']
|
||||
self.serviceManager = plugin_helpers[u'service']
|
||||
self.settingsForm = plugin_helpers[u'settings form']
|
||||
self.mediadock = plugin_helpers[u'toolbox']
|
||||
self.maindisplay = plugin_helpers[u'maindisplay']
|
||||
self.displayManager = plugin_helpers[u'displaymanager']
|
||||
self.pluginManager = plugin_helpers[u'pluginmanager']
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'%s_add_service_item' % self.name),
|
||||
self.process_add_service_event)
|
||||
self.processAddServiceEvent)
|
||||
|
||||
def check_pre_conditions(self):
|
||||
def checkPreConditions(self):
|
||||
"""
|
||||
Provides the Plugin with a handle to check if it can be loaded.
|
||||
Failing Preconditions does not stop a settings Tab being created
|
||||
|
@ -144,7 +145,7 @@ class Plugin(QtCore.QObject):
|
|||
"""
|
||||
return True
|
||||
|
||||
def set_status(self):
|
||||
def setStatus(self):
|
||||
"""
|
||||
Sets the status of the plugin
|
||||
"""
|
||||
|
@ -152,7 +153,7 @@ class Plugin(QtCore.QObject):
|
|||
self.settingsSection + u'/status',
|
||||
QtCore.QVariant(PluginStatus.Inactive)).toInt()[0]
|
||||
|
||||
def toggle_status(self, new_status):
|
||||
def toggleStatus(self, new_status):
|
||||
"""
|
||||
Changes the status of the plugin and remembers it
|
||||
"""
|
||||
|
@ -160,7 +161,7 @@ class Plugin(QtCore.QObject):
|
|||
QtCore.QSettings().setValue(
|
||||
self.settingsSection + u'/status', QtCore.QVariant(self.status))
|
||||
|
||||
def is_active(self):
|
||||
def isActive(self):
|
||||
"""
|
||||
Indicates if the plugin is active
|
||||
|
||||
|
@ -168,47 +169,47 @@ class Plugin(QtCore.QObject):
|
|||
"""
|
||||
return self.status == PluginStatus.Active
|
||||
|
||||
def get_media_manager_item(self):
|
||||
def getMediaManagerItem(self):
|
||||
"""
|
||||
Construct a MediaManagerItem object with all the buttons and things
|
||||
you need, and return it for integration into openlp.org.
|
||||
"""
|
||||
pass
|
||||
|
||||
def add_import_menu_item(self, import_menu):
|
||||
def addImportMenuItem(self, importMenu):
|
||||
"""
|
||||
Create a menu item and add it to the "Import" menu.
|
||||
|
||||
``import_menu``
|
||||
``importMenu``
|
||||
The Import menu.
|
||||
"""
|
||||
pass
|
||||
|
||||
def add_export_menu_item(self, export_menu):
|
||||
def addExportMenuItem(self, exportMenu):
|
||||
"""
|
||||
Create a menu item and add it to the "Export" menu.
|
||||
|
||||
``export_menu``
|
||||
``exportMenu``
|
||||
The Export menu
|
||||
"""
|
||||
pass
|
||||
|
||||
def add_tools_menu_item(self, tools_menu):
|
||||
def addToolsMenuItem(self, toolsMenu):
|
||||
"""
|
||||
Create a menu item and add it to the "Tools" menu.
|
||||
|
||||
``tools_menu``
|
||||
``toolsMenu``
|
||||
The Tools menu
|
||||
"""
|
||||
pass
|
||||
|
||||
def get_settings_tab(self):
|
||||
def getSettingsTab(self):
|
||||
"""
|
||||
Create a tab for the settings window.
|
||||
"""
|
||||
pass
|
||||
|
||||
def add_to_menu(self, menubar):
|
||||
def addToMenu(self, menubar):
|
||||
"""
|
||||
Add menu items to the menu, given the menubar.
|
||||
|
||||
|
@ -217,16 +218,16 @@ class Plugin(QtCore.QObject):
|
|||
"""
|
||||
pass
|
||||
|
||||
def process_add_service_event(self, replace=False):
|
||||
def processAddServiceEvent(self, replace=False):
|
||||
"""
|
||||
Generic Drag and drop handler triggered from service_manager.
|
||||
"""
|
||||
log.debug(u'process_add_service_event event called for plugin %s' %
|
||||
log.debug(u'processAddServiceEvent event called for plugin %s' %
|
||||
self.name)
|
||||
if replace:
|
||||
self.media_item.onAddEditClick()
|
||||
self.mediaItem.onAddEditClick()
|
||||
else:
|
||||
self.media_item.onAddClick()
|
||||
self.mediaItem.onAddClick()
|
||||
|
||||
def about(self):
|
||||
"""
|
||||
|
@ -240,36 +241,36 @@ class Plugin(QtCore.QObject):
|
|||
"""
|
||||
Called by the plugin Manager to initialise anything it needs.
|
||||
"""
|
||||
if self.media_item:
|
||||
self.media_item.initialise()
|
||||
self.insert_toolbox_item()
|
||||
if self.mediaItem:
|
||||
self.mediaItem.initialise()
|
||||
self.insertToolboxItem()
|
||||
|
||||
def finalise(self):
|
||||
"""
|
||||
Called by the plugin Manager to cleanup things.
|
||||
"""
|
||||
self.remove_toolbox_item()
|
||||
self.removeToolboxItem()
|
||||
|
||||
def remove_toolbox_item(self):
|
||||
def removeToolboxItem(self):
|
||||
"""
|
||||
Called by the plugin to remove toolbar
|
||||
"""
|
||||
if self.media_item:
|
||||
if self.mediaItem:
|
||||
self.mediadock.remove_dock(self.name)
|
||||
if self.settings_tab:
|
||||
self.settings_form.removeTab(self.name)
|
||||
self.settingsForm.removeTab(self.name)
|
||||
|
||||
def insert_toolbox_item(self):
|
||||
def insertToolboxItem(self):
|
||||
"""
|
||||
Called by plugin to replace toolbar
|
||||
"""
|
||||
if self.media_item:
|
||||
self.mediadock.insert_dock(self.media_item, self.icon, self.weight)
|
||||
if self.mediaItem:
|
||||
self.mediadock.insert_dock(self.mediaItem, self.icon, self.weight)
|
||||
if self.settings_tab:
|
||||
self.settings_form.insertTab(self.settings_tab, self.weight)
|
||||
self.settingsForm.insertTab(self.settings_tab, self.weight)
|
||||
|
||||
def can_delete_theme(self, theme):
|
||||
def canDeleteTheme(self, theme):
|
||||
"""
|
||||
Called to ask the plugin if a theme can be deleted
|
||||
"""
|
||||
return True
|
||||
return True
|
|
@ -109,9 +109,9 @@ class PluginManager(object):
|
|||
log.exception(u'loaded plugin %s has no helpers', unicode(p))
|
||||
plugins_list = sorted(plugin_objects, self.order_by_weight)
|
||||
for plugin in plugins_list:
|
||||
if plugin.check_pre_conditions():
|
||||
if plugin.checkPreConditions():
|
||||
log.debug(u'Plugin %s active', unicode(plugin.name))
|
||||
plugin.set_status()
|
||||
plugin.setStatus()
|
||||
else:
|
||||
plugin.status = PluginStatus.Disabled
|
||||
self.plugins.append(plugin)
|
||||
|
@ -138,7 +138,7 @@ class PluginManager(object):
|
|||
"""
|
||||
for plugin in self.plugins:
|
||||
if plugin.status is not PluginStatus.Disabled:
|
||||
plugin.media_item = plugin.get_media_manager_item()
|
||||
plugin.mediaItem = plugin.getMediaManagerItem()
|
||||
|
||||
def hook_settings_tabs(self, settingsform=None):
|
||||
"""
|
||||
|
@ -151,7 +151,7 @@ class PluginManager(object):
|
|||
"""
|
||||
for plugin in self.plugins:
|
||||
if plugin.status is not PluginStatus.Disabled:
|
||||
plugin.settings_tab = plugin.get_settings_tab()
|
||||
plugin.settings_tab = plugin.getSettingsTab()
|
||||
if plugin.settings_tab:
|
||||
log.debug(u'Inserting settings tab item from %s' %
|
||||
plugin.name)
|
||||
|
@ -169,7 +169,7 @@ class PluginManager(object):
|
|||
"""
|
||||
for plugin in self.plugins:
|
||||
if plugin.status is not PluginStatus.Disabled:
|
||||
plugin.add_import_menu_item(import_menu)
|
||||
plugin.addImportMenuItem(import_menu)
|
||||
|
||||
def hook_export_menu(self, export_menu):
|
||||
"""
|
||||
|
@ -181,7 +181,7 @@ class PluginManager(object):
|
|||
"""
|
||||
for plugin in self.plugins:
|
||||
if plugin.status is not PluginStatus.Disabled:
|
||||
plugin.add_export_menu_item(export_menu)
|
||||
plugin.addExportMenuItem(export_menu)
|
||||
|
||||
def hook_tools_menu(self, tools_menu):
|
||||
"""
|
||||
|
@ -193,7 +193,7 @@ class PluginManager(object):
|
|||
"""
|
||||
for plugin in self.plugins:
|
||||
if plugin.status is not PluginStatus.Disabled:
|
||||
plugin.add_tools_menu_item(tools_menu)
|
||||
plugin.addToolsMenuItem(tools_menu)
|
||||
|
||||
def initialise_plugins(self):
|
||||
"""
|
||||
|
@ -202,12 +202,12 @@ class PluginManager(object):
|
|||
"""
|
||||
for plugin in self.plugins:
|
||||
log.info(u'initialising plugins %s in a %s state'
|
||||
% (plugin.name, plugin.is_active()))
|
||||
if plugin.is_active():
|
||||
% (plugin.name, plugin.isActive()))
|
||||
if plugin.isActive():
|
||||
plugin.initialise()
|
||||
log.info(u'Initialisation Complete for %s ' % plugin.name)
|
||||
if not plugin.is_active():
|
||||
plugin.remove_toolbox_item()
|
||||
if not plugin.isActive():
|
||||
plugin.removeToolboxItem()
|
||||
|
||||
def finalise_plugins(self):
|
||||
"""
|
||||
|
@ -216,7 +216,6 @@ class PluginManager(object):
|
|||
"""
|
||||
log.info(u'finalising plugins')
|
||||
for plugin in self.plugins:
|
||||
if plugin.is_active():
|
||||
if plugin.isActive():
|
||||
plugin.finalise()
|
||||
log.info(u'Finalisation Complete for %s ' % plugin.name)
|
||||
|
||||
log.info(u'Finalisation Complete for %s ' % plugin.name)
|
|
@ -29,6 +29,7 @@ format it for the output display.
|
|||
import logging
|
||||
|
||||
from PyQt4 import QtGui, QtCore
|
||||
|
||||
from openlp.core.lib import resize_image
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
|
|
@ -27,8 +27,7 @@ import logging
|
|||
|
||||
from PyQt4 import QtCore
|
||||
|
||||
from renderer import Renderer
|
||||
from openlp.core.lib import ThemeLevel
|
||||
from openlp.core.lib import Renderer, ThemeLevel
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -35,7 +35,6 @@ import uuid
|
|||
from PyQt4 import QtGui
|
||||
|
||||
from openlp.core.lib import build_icon, resize_image
|
||||
from openlp.core.utils import AppLocation
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
@ -74,7 +73,7 @@ class ServiceItem(object):
|
|||
The plugin that this service item belongs to.
|
||||
"""
|
||||
if plugin:
|
||||
self.render_manager = plugin.render_manager
|
||||
self.render_manager = plugin.renderManager
|
||||
self.name = plugin.name
|
||||
self.title = u''
|
||||
self.shortname = u''
|
||||
|
@ -93,7 +92,6 @@ class ServiceItem(object):
|
|||
self.is_valid = True
|
||||
self.cache = {}
|
||||
self.icon = None
|
||||
self.serviceItemPath = AppLocation.get_section_data_path(u'serviceItems')
|
||||
|
||||
def add_capability(self, capability):
|
||||
"""
|
||||
|
@ -155,12 +153,9 @@ class ServiceItem(object):
|
|||
del self.cache[len(self._display_frames)]
|
||||
log.log(15, u'Formatting took %4s' % (time.time() - before))
|
||||
elif self.service_item_type == ServiceItemType.Image:
|
||||
for count, slide in enumerate(self._raw_frames):
|
||||
for slide in self._raw_frames:
|
||||
slide[u'image'] = resize_image(slide[u'image'],
|
||||
self.render_manager.width, self.render_manager.height)
|
||||
path = os.path.join(self.serviceItemPath, self._uuid + unicode(count) + u'.png')
|
||||
slide[u'image'].save(path)
|
||||
slide[u'display'] = path
|
||||
elif self.service_item_type == ServiceItemType.Command:
|
||||
pass
|
||||
else:
|
||||
|
@ -376,8 +371,7 @@ class ServiceItem(object):
|
|||
if self.service_item_type == ServiceItemType.Text:
|
||||
return self.render_individual(row)
|
||||
else:
|
||||
return {u'main':self._raw_frames[row][u'image'],
|
||||
u'trans':None, u'display':self._raw_frames[row][u'display']}
|
||||
return {u'main':self._raw_frames[row][u'image'], u'trans':None}
|
||||
|
||||
def get_frame_title(self, row=0):
|
||||
"""
|
||||
|
|
|
@ -57,15 +57,33 @@ class SettingsManager(object):
|
|||
self.mainwindow_left + self.mainwindow_right) - 100 ) / 2
|
||||
self.slidecontroller_image = self.slidecontroller - 50
|
||||
|
||||
self.showPreviewPanel = QtCore.QSettings().value(
|
||||
u'user interface/preview panel', QtCore.QVariant(True)).toBool()
|
||||
|
||||
def togglePreviewPanel(self, isVisible):
|
||||
def get_preview_visibility(self):
|
||||
"""
|
||||
Toggle the preview panel visibility.
|
||||
Return the preview panel's visibility.
|
||||
"""
|
||||
return QtCore.QSettings().value(u'user interface/preview panel',
|
||||
QtCore.QVariant(True)).toBool()
|
||||
|
||||
def set_preview_visibility(self, visible):
|
||||
"""
|
||||
Set the preview panel's visibility.
|
||||
"""
|
||||
QtCore.QSettings().setValue(u'user interface/preview panel',
|
||||
QtCore.QVariant(isVisible))
|
||||
QtCore.QVariant(visible))
|
||||
|
||||
def get_live_visibility(self):
|
||||
"""
|
||||
Return the live panel's visibility.
|
||||
"""
|
||||
return QtCore.QSettings().value(u'user interface/live panel',
|
||||
QtCore.QVariant(True)).toBool()
|
||||
|
||||
def set_live_visibility(self, visible):
|
||||
"""
|
||||
Set the live panel's visibility.
|
||||
"""
|
||||
QtCore.QSettings().setValue(u'user interface/live panel',
|
||||
QtCore.QVariant(visible))
|
||||
|
||||
@staticmethod
|
||||
def get_last_dir(section, num=None):
|
||||
|
|
|
@ -79,6 +79,14 @@ BLANK_THEME_XML = \
|
|||
</theme>
|
||||
'''
|
||||
|
||||
class ThemeLevel(object):
|
||||
"""
|
||||
Provides an enumeration for the level a theme applies to
|
||||
"""
|
||||
Global = 1
|
||||
Service = 2
|
||||
Song = 3
|
||||
|
||||
class ThemeXML(object):
|
||||
"""
|
||||
A class to encapsulate the Theme XML.
|
||||
|
@ -313,7 +321,6 @@ class ThemeXML(object):
|
|||
element.appendChild(value)
|
||||
background.appendChild(element)
|
||||
|
||||
|
||||
def child_element(self, element, tag, value):
|
||||
"""
|
||||
Generic child element creator.
|
||||
|
@ -351,14 +358,8 @@ class ThemeXML(object):
|
|||
``xml``
|
||||
The XML string to parse.
|
||||
"""
|
||||
self.base_parse_xml()
|
||||
self.parse_xml(xml)
|
||||
|
||||
def base_parse_xml(self):
|
||||
"""
|
||||
Pull in the blank theme XML as a starting point.
|
||||
"""
|
||||
self.parse_xml(BLANK_THEME_XML)
|
||||
self.parse_xml(xml)
|
||||
|
||||
def parse_xml(self, xml):
|
||||
"""
|
||||
|
@ -414,4 +415,3 @@ class ThemeXML(object):
|
|||
if key[0:1] != u'_':
|
||||
theme_strings.append(u'%30s: %s' % (key, getattr(self, key)))
|
||||
return u'\n'.join(theme_strings)
|
||||
|
|
@ -42,7 +42,7 @@ class OpenLPToolbar(QtGui.QToolBar):
|
|||
"""
|
||||
Initialise the toolbar.
|
||||
"""
|
||||
QtGui.QToolBar.__init__(self, None)
|
||||
QtGui.QToolBar.__init__(self, parent)
|
||||
# useful to be able to reuse button icons...
|
||||
self.icons = {}
|
||||
self.setIconSize(QtCore.QSize(20, 20))
|
||||
|
|
|
@ -1,104 +0,0 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
||||
|
||||
###############################################################################
|
||||
# OpenLP - Open Source Lyrics Projection #
|
||||
# --------------------------------------------------------------------------- #
|
||||
# Copyright (c) 2008-2010 Raoul Snyman #
|
||||
# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
|
||||
# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin #
|
||||
# Thompson, Jon Tibble, Carsten Tinggaard #
|
||||
# --------------------------------------------------------------------------- #
|
||||
# This program is free software; you can redistribute it and/or modify it #
|
||||
# under the terms of the GNU General Public License as published by the Free #
|
||||
# Software Foundation; version 2 of the License. #
|
||||
# #
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
||||
# more details. #
|
||||
# #
|
||||
# You should have received a copy of the GNU General Public License along #
|
||||
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||
###############################################################################
|
||||
|
||||
import os
|
||||
import sys
|
||||
|
||||
from xml.etree.ElementTree import ElementTree, XML
|
||||
|
||||
sys.path.append(os.path.abspath(os.path.join(u'.', u'..', u'..')))
|
||||
|
||||
class XmlRootClass(object):
|
||||
"""
|
||||
Root class for themes, songs etc
|
||||
|
||||
This class provides interface for parsing xml files into object attributes.
|
||||
|
||||
If you overload this class and provide a function called `post_tag_hook`,
|
||||
it will be called thusly for each `tag, value` pair::
|
||||
|
||||
(element.tag, val) = self.post_tag_hook(element.tag, val)
|
||||
"""
|
||||
def _set_from_xml(self, xml, root_tag):
|
||||
"""
|
||||
Set song properties from given xml content.
|
||||
|
||||
``xml``
|
||||
Formatted xml tags and values.
|
||||
``root_tag``
|
||||
The root tag of the xml.
|
||||
"""
|
||||
root = ElementTree(element=XML(xml))
|
||||
xml_iter = root.getiterator()
|
||||
for element in xml_iter:
|
||||
if element.tag != root_tag:
|
||||
text = element.text
|
||||
if text is None:
|
||||
val = text
|
||||
elif isinstance(text, basestring):
|
||||
# Strings need special handling to sort the colours out
|
||||
if text[0] == u'$':
|
||||
# This might be a hex number, let's try to convert it.
|
||||
try:
|
||||
val = int(text[1:], 16)
|
||||
except ValueError:
|
||||
pass
|
||||
else:
|
||||
# Let's just see if it's a integer.
|
||||
try:
|
||||
val = int(text)
|
||||
except ValueError:
|
||||
# Ok, it seems to be a string.
|
||||
val = text
|
||||
if hasattr(self, u'post_tag_hook'):
|
||||
(element.tag, val) = \
|
||||
self.post_tag_hook(element.tag, val)
|
||||
setattr(self, element.tag, val)
|
||||
|
||||
def __str__(self):
|
||||
"""
|
||||
Return string with all public attributes
|
||||
|
||||
The string is formatted with one attribute per line
|
||||
If the string is split on newline then the length of the
|
||||
list is equal to the number of attributes
|
||||
"""
|
||||
attributes = []
|
||||
for attrib in dir(self):
|
||||
if not attrib.startswith(u'_'):
|
||||
attributes.append(
|
||||
u'%30s : %s' % (attrib, getattr(self, attrib)))
|
||||
return u'\n'.join(attributes)
|
||||
|
||||
def _get_as_string(self):
|
||||
"""
|
||||
Return one string with all public attributes
|
||||
"""
|
||||
result = u''
|
||||
for attrib in dir(self):
|
||||
if not attrib.startswith(u'_'):
|
||||
result += u'_%s_' % getattr(self, attrib)
|
||||
return result
|
||||
|
|
@ -222,4 +222,3 @@ class Theme(object):
|
|||
if key[0:1] != u'_':
|
||||
theme_strings.append(u'%30s : %s' % (key, getattr(self, key)))
|
||||
return u'\n'.join(theme_strings)
|
||||
|
||||
|
|
|
@ -596,15 +596,15 @@ class Ui_AmendThemeDialog(object):
|
|||
self.TransitionGroupBox.setObjectName(u'TransitionGroupBox')
|
||||
self.gridLayout_5 = QtGui.QGridLayout(self.TransitionGroupBox)
|
||||
self.gridLayout_5.setObjectName(u'gridLayout_5')
|
||||
self.SlideTransitionCheckedBoxLabel = QtGui.QLabel(
|
||||
self.SlideTransitionCheckBoxLabel = QtGui.QLabel(
|
||||
self.TransitionGroupBox)
|
||||
self.SlideTransitionCheckedBoxLabel.setObjectName(
|
||||
u'SlideTransitionCheckedBoxLabel')
|
||||
self.SlideTransitionCheckBoxLabel.setObjectName(
|
||||
u'SlideTransitionCheckBoxLabel')
|
||||
self.gridLayout_5.addWidget(
|
||||
self.SlideTransitionCheckedBoxLabel, 0, 0, 1, 1)
|
||||
self.SlideTransitionCheckedBox = QtGui.QCheckBox(self.AlignmentGroupBox)
|
||||
self.SlideTransitionCheckedBox.setTristate(False)
|
||||
self.gridLayout_5.addWidget(self.SlideTransitionCheckedBox, 0, 1, 1, 1)
|
||||
self.SlideTransitionCheckBoxLabel, 0, 0, 1, 1)
|
||||
self.SlideTransitionCheckBox = QtGui.QCheckBox(self.AlignmentGroupBox)
|
||||
self.SlideTransitionCheckBox.setTristate(False)
|
||||
self.gridLayout_5.addWidget(self.SlideTransitionCheckBox, 0, 1, 1, 1)
|
||||
self.OptionsRightLayout.addWidget(self.TransitionGroupBox)
|
||||
spacerItem6 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum,
|
||||
QtGui.QSizePolicy.Expanding)
|
||||
|
@ -864,7 +864,7 @@ class Ui_AmendThemeDialog(object):
|
|||
translate('AmendThemeForm', 'Bottom'))
|
||||
self.TransitionGroupBox.setTitle(
|
||||
translate('AmendThemeForm', 'Slide Transition'))
|
||||
self.SlideTransitionCheckedBoxLabel.setText(
|
||||
self.SlideTransitionCheckBoxLabel.setText(
|
||||
translate('AmendThemeForm', 'Transition active:'))
|
||||
self.ThemeTabWidget.setTabText(
|
||||
self.ThemeTabWidget.indexOf(self.OtherOptionsTab),
|
||||
|
|
|
@ -133,9 +133,9 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
|
|||
QtCore.QObject.connect(self.OutlineSpinBox,
|
||||
QtCore.SIGNAL(u'editingFinished()'),
|
||||
self.onOutlineSpinBoxChanged)
|
||||
QtCore.QObject.connect(self.SlideTransitionCheckedBox,
|
||||
QtCore.QObject.connect(self.SlideTransitionCheckBox,
|
||||
QtCore.SIGNAL(u'stateChanged(int)'),
|
||||
self.onSlideTransitionCheckedBoxChanged)
|
||||
self.onSlideTransitionCheckBoxChanged)
|
||||
|
||||
def accept(self):
|
||||
new_theme = ThemeXML()
|
||||
|
@ -500,7 +500,7 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
|
|||
self.stateChanging(self.theme)
|
||||
self.previewTheme()
|
||||
|
||||
def onSlideTransitionCheckedBoxChanged(self, value):
|
||||
def onSlideTransitionCheckBoxChanged(self, value):
|
||||
if value == 2: # checked
|
||||
self.theme.display_slideTransition = True
|
||||
else:
|
||||
|
@ -624,9 +624,9 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
|
|||
self.ShadowColorPushButton.setEnabled(False)
|
||||
self.ShadowSpinBox.setValue(int(self.theme.display_shadow_size))
|
||||
if self.theme.display_slideTransition:
|
||||
self.SlideTransitionCheckedBox.setCheckState(QtCore.Qt.Checked)
|
||||
self.SlideTransitionCheckBox.setCheckState(QtCore.Qt.Checked)
|
||||
else:
|
||||
self.SlideTransitionCheckedBox.setCheckState(QtCore.Qt.Unchecked)
|
||||
self.SlideTransitionCheckBox.setCheckState(QtCore.Qt.Unchecked)
|
||||
self.HorizontalComboBox.setCurrentIndex(
|
||||
self.theme.display_horizontalAlign)
|
||||
self.VerticalComboBox.setCurrentIndex(self.theme.display_verticalAlign)
|
||||
|
|
|
@ -25,37 +25,37 @@
|
|||
|
||||
import logging
|
||||
import os
|
||||
import time
|
||||
|
||||
from PyQt4 import QtCore, QtGui, QtWebKit
|
||||
from PyQt4.phonon import Phonon
|
||||
|
||||
from openlp.core.lib import Receiver, resize_image
|
||||
from openlp.core.ui import HideMode
|
||||
from openlp.core.utils import AppLocation
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
HTMLIMAGE = """<html>
|
||||
<body>
|
||||
<img src=\"file://%s\" alt\"Hello\">
|
||||
</body></html>
|
||||
"""
|
||||
|
||||
#http://www.steveheffernan.com/html5-video-player/demo-video-player.html
|
||||
HTMLVIDEO = u"""<html>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
<head>
|
||||
<style>
|
||||
*{
|
||||
margin: 0;
|
||||
padding:0
|
||||
}
|
||||
</style>
|
||||
<script type="text/javascript" charset="utf-8">
|
||||
var video;
|
||||
var bodyLoaded = function(){
|
||||
video = document.getElementById("video");
|
||||
video.volume = 0;
|
||||
}
|
||||
</script>
|
||||
<body id=\"body\" onload=\"bodyLoaded();>\"
|
||||
<video id=\"video\" src=\"%s\"
|
||||
autoplay loop width=%s height=%s autobuffer=\"autobuffer\" preload >
|
||||
your browser does not support the video tag
|
||||
</video>
|
||||
</body></html>
|
||||
</script>
|
||||
</head>
|
||||
<body id="body" onload="bodyLoaded();">
|
||||
<video id="video" src="%s" autoplay="autoplay" loop="loop"
|
||||
width="%s" height="%s" autobuffer="autobuffer" preload="preload" />
|
||||
</body></html>
|
||||
"""
|
||||
|
||||
class DisplayManager(QtGui.QWidget):
|
||||
|
@ -104,11 +104,17 @@ class DisplayManager(QtGui.QWidget):
|
|||
"""
|
||||
self.mainDisplay.addAlert(alertMessage, location)
|
||||
|
||||
def displayImage(self, path):
|
||||
def displayImageWithText(self, frame):
|
||||
"""
|
||||
Handles the addition of a background Image to the displays
|
||||
"""
|
||||
self.mainDisplay.displayImage(path)
|
||||
self.mainDisplay.addImageWithText(frame)
|
||||
|
||||
def displayImage(self, frame):
|
||||
"""
|
||||
Handles the addition of a background Image to the displays
|
||||
"""
|
||||
self.mainDisplay.displayImage(frame)
|
||||
|
||||
def displayVideo(self, path):
|
||||
"""
|
||||
|
@ -204,7 +210,6 @@ class MainDisplay(DisplayWidget):
|
|||
self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint)
|
||||
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.parent = parent
|
||||
# WA_TranslucentBackground is not available in QT4.4
|
||||
try:
|
||||
self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
|
||||
|
@ -212,6 +217,7 @@ class MainDisplay(DisplayWidget):
|
|||
pass
|
||||
self.screens = screens
|
||||
self.setupScene()
|
||||
self.setupVideo()
|
||||
self.setupImage()
|
||||
self.setupText()
|
||||
self.setupAlert()
|
||||
|
@ -248,7 +254,7 @@ class MainDisplay(DisplayWidget):
|
|||
(self.screen[u'size'].width() - splash_image.width()) / 2,
|
||||
(self.screen[u'size'].height() - splash_image.height()) / 2,
|
||||
splash_image)
|
||||
#self.display_image.setPixmap(QtGui.QPixmap.fromImage(self.InitialFrame))
|
||||
self.displayImage(self.InitialFrame)
|
||||
self.repaint()
|
||||
#Build a Black screen
|
||||
painter = QtGui.QPainter()
|
||||
|
@ -262,7 +268,7 @@ class MainDisplay(DisplayWidget):
|
|||
self.transparent = QtGui.QPixmap(
|
||||
self.screen[u'size'].width(), self.screen[u'size'].height())
|
||||
self.transparent.fill(QtCore.Qt.transparent)
|
||||
# self.display_text.setPixmap(self.transparent)
|
||||
# self.displayText.setPixmap(self.transparent)
|
||||
#self.frameView(self.transparent)
|
||||
# To display or not to display?
|
||||
if not self.screen[u'primary']:
|
||||
|
@ -277,25 +283,30 @@ class MainDisplay(DisplayWidget):
|
|||
self.scene.setSceneRect(0,0,self.size().width(), self.size().height())
|
||||
self.setScene(self.scene)
|
||||
|
||||
def setupImage(self):
|
||||
def setupVideo(self):
|
||||
self.webView = QtWebKit.QWebView()
|
||||
self.page = self.webView.page()
|
||||
self.imageDisplay = self.page.mainFrame()
|
||||
self.imageDisplay.setScrollBarPolicy(QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.imageDisplay.setScrollBarPolicy(QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.videoDisplay = self.page.mainFrame()
|
||||
self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Vertical, QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.videoDisplay.setScrollBarPolicy(QtCore.Qt.Horizontal, QtCore.Qt.ScrollBarAlwaysOff)
|
||||
self.proxy = QtGui.QGraphicsProxyWidget()
|
||||
self.proxy.setWidget(self.webView)
|
||||
self.proxy.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.FramelessWindowHint)
|
||||
self.proxy.setZValue(2)
|
||||
self.proxy.setZValue(1)
|
||||
self.scene.addItem(self.proxy)
|
||||
|
||||
def setupImage(self):
|
||||
self.imageDisplay = QtGui.QGraphicsPixmapItem()
|
||||
self.imageDisplay.setZValue(2)
|
||||
self.scene.addItem(self.imageDisplay)
|
||||
|
||||
def setupText(self):
|
||||
#self.display_text = QtGui.QGraphicsTextItem()
|
||||
self.display_text = QtGui.QGraphicsPixmapItem()
|
||||
#self.display_text.setPos(0,0)
|
||||
#self.display_text.setTextWidth(self.size().width())
|
||||
self.display_text.setZValue(4)
|
||||
self.scene.addItem(self.display_text)
|
||||
#self.displayText = QtGui.QGraphicsTextItem()
|
||||
self.displayText = QtGui.QGraphicsPixmapItem()
|
||||
#self.displayText.setPos(0,0)
|
||||
#self.displayText.setTextWidth(self.size().width())
|
||||
self.displayText.setZValue(4)
|
||||
self.scene.addItem(self.displayText)
|
||||
|
||||
def setupAlert(self):
|
||||
self.alertText = QtGui.QGraphicsTextItem()
|
||||
|
@ -304,9 +315,9 @@ class MainDisplay(DisplayWidget):
|
|||
self.scene.addItem(self.alertText)
|
||||
|
||||
def setupBlank(self):
|
||||
self.display_blank = QtGui.QGraphicsPixmapItem()
|
||||
self.display_blank.setZValue(10)
|
||||
self.scene.addItem(self.display_blank)
|
||||
self.displayBlank = QtGui.QGraphicsPixmapItem()
|
||||
self.displayBlank.setZValue(10)
|
||||
self.scene.addItem(self.displayBlank)
|
||||
|
||||
def resetDisplay(self):
|
||||
log.debug(u'resetDisplay')
|
||||
|
@ -328,19 +339,19 @@ class MainDisplay(DisplayWidget):
|
|||
Store the images so they can be replaced when required
|
||||
"""
|
||||
log.debug(u'hideDisplay mode = %d', mode)
|
||||
#self.display_text.setPixmap(self.transparent)
|
||||
#self.displayText.setPixmap(self.transparent)
|
||||
if mode == HideMode.Screen:
|
||||
#self.display_image.setPixmap(self.transparent)
|
||||
self.setVisible(False)
|
||||
elif mode == HideMode.Blank:
|
||||
self.display_blank.setPixmap(
|
||||
self.displayBlank.setPixmap(
|
||||
QtGui.QPixmap.fromImage(self.blankFrame))
|
||||
else:
|
||||
if self.parent.renderManager.renderer.bg_frame:
|
||||
self.display_blank.setPixmap(QtGui.QPixmap.fromImage(
|
||||
self.displayBlank.setPixmap(QtGui.QPixmap.fromImage(
|
||||
self.parent.renderManager.renderer.bg_frame))
|
||||
else:
|
||||
self.display_blank.setPixmap(
|
||||
self.displayBlank.setPixmap(
|
||||
QtGui.QPixmap.fromImage(self.blankFrame))
|
||||
|
||||
def showDisplay(self, message=u''):
|
||||
|
@ -350,7 +361,7 @@ class MainDisplay(DisplayWidget):
|
|||
Make the stored images None to release memory.
|
||||
"""
|
||||
log.debug(u'showDisplay')
|
||||
self.display_blank.setPixmap(self.transparent)
|
||||
self.displayBlank.setPixmap(self.transparent)
|
||||
#Trigger actions when display is active again
|
||||
Receiver.send_message(u'maindisplay_active')
|
||||
|
||||
|
@ -358,7 +369,8 @@ class MainDisplay(DisplayWidget):
|
|||
log.debug(u'addImageWithText')
|
||||
frame = resize_image(
|
||||
frame, self.screen[u'size'].width(), self.screen[u'size'].height())
|
||||
self.display_image.setPixmap(QtGui.QPixmap.fromImage(frame))
|
||||
self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame))
|
||||
self.videoDisplay.setHtml(u'<html></html>')
|
||||
|
||||
def addAlert(self, message, location):
|
||||
"""
|
||||
|
@ -378,14 +390,18 @@ class MainDisplay(DisplayWidget):
|
|||
self.alertText.setPos(0,self.size().height() - 76)
|
||||
self.alertText.setHtml(message)
|
||||
|
||||
def displayImage(self, path):
|
||||
def displayImage(self, frame):
|
||||
"""
|
||||
Places the Image passed on the display screen
|
||||
``path``
|
||||
The path to the image to be displayed
|
||||
``frame``
|
||||
The image to be displayed
|
||||
"""
|
||||
log.debug(u'adddisplayImage')
|
||||
self.imageDisplay.setHtml(HTMLIMAGE % path)
|
||||
if isinstance(frame, QtGui.QImage):
|
||||
self.imageDisplay.setPixmap(QtGui.QPixmap.fromImage(frame))
|
||||
else:
|
||||
self.imageDisplay.setPixmap(frame)
|
||||
self.videoDisplay.setHtml(u'<html></html>')
|
||||
|
||||
def displayVideo(self, path):
|
||||
"""
|
||||
|
@ -394,7 +410,8 @@ class MainDisplay(DisplayWidget):
|
|||
The path to the image to be displayed
|
||||
"""
|
||||
log.debug(u'adddisplayVideo')
|
||||
self.imageDisplay.setHtml(HTMLVIDEO %
|
||||
self.displayImage(self.transparent)
|
||||
self.videoDisplay.setHtml(HTMLVIDEO %
|
||||
(path, self.screen[u'size'].width(), self.screen[u'size'].height()))
|
||||
|
||||
def frameView(self, frame, transition=False):
|
||||
|
@ -409,42 +426,29 @@ class MainDisplay(DisplayWidget):
|
|||
log.debug(u'frameView')
|
||||
if transition:
|
||||
if self.frame is not None:
|
||||
self.display_text.setPixmap(
|
||||
self.displayText.setPixmap(
|
||||
QtGui.QPixmap.fromImage(self.frame))
|
||||
self.update()
|
||||
self.repaint()
|
||||
Receiver.send_message(u'openlp_process_events')
|
||||
time.sleep(0.1)
|
||||
self.frame = None
|
||||
if frame[u'trans'] is not None:
|
||||
self.display_text.setPixmap(
|
||||
self.displayText.setPixmap(
|
||||
QtGui.QPixmap.fromImage(frame[u'trans']))
|
||||
self.repaint()
|
||||
Receiver.send_message(u'openlp_process_events')
|
||||
time.sleep(0.1)
|
||||
self.frame = frame[u'trans']
|
||||
self.display_text.setPixmap(
|
||||
self.displayText.setPixmap(
|
||||
QtGui.QPixmap.fromImage(frame[u'main']))
|
||||
self.display_frame = frame[u'main']
|
||||
self.repaint()
|
||||
else:
|
||||
if isinstance(frame, QtGui.QPixmap):
|
||||
self.display_text.setPixmap(frame)
|
||||
self.displayText.setPixmap(frame)
|
||||
else:
|
||||
self.display_text.setPixmap(QtGui.QPixmap.fromImage(frame))
|
||||
self.display_frame = frame
|
||||
self.displayText.setPixmap(QtGui.QPixmap.fromImage(frame))
|
||||
if not self.isVisible() and self.screens.display:
|
||||
self.setVisible(True)
|
||||
|
||||
def closeEvent(self, event):
|
||||
"""
|
||||
Shutting down cleans up background files
|
||||
"""
|
||||
serviceItemPath = AppLocation.get_section_data_path(u'serviceItems')
|
||||
for file in os.listdir(serviceItemPath):
|
||||
file_path = os.path.join(serviceItemPath, file)
|
||||
try:
|
||||
if os.path.isfile(file_path):
|
||||
os.remove(file_path)
|
||||
except OSError:
|
||||
log.exception(u'Failed to clean up servicePath')
|
||||
|
||||
|
||||
class VideoDisplay(Phonon.VideoWidget):
|
||||
"""
|
||||
This is the form that is used to display videos on the projector.
|
||||
|
@ -611,7 +615,7 @@ class VideoDisplay(Phonon.VideoWidget):
|
|||
|
||||
def mediaShow(self, message=''):
|
||||
"""
|
||||
Show the video disaply if it was already hidden
|
||||
Show the video display if it was already hidden
|
||||
"""
|
||||
if self.hidden:
|
||||
self.hidden = False
|
||||
|
@ -620,7 +624,7 @@ class VideoDisplay(Phonon.VideoWidget):
|
|||
|
||||
class AudioPlayer(QtCore.QObject):
|
||||
"""
|
||||
This Class will play audio only allowing components to work witn a
|
||||
This Class will play audio only allowing components to work with a
|
||||
soundtrack which does not take over the user interface.
|
||||
"""
|
||||
log.info(u'AudioPlayer Loaded')
|
||||
|
@ -636,8 +640,7 @@ class AudioPlayer(QtCore.QObject):
|
|||
The list of screens.
|
||||
"""
|
||||
log.debug(u'AudioPlayer Initialisation started')
|
||||
QtCore.QObject.__init__(self)
|
||||
self.parent = parent
|
||||
QtCore.QObject.__init__(self, parent)
|
||||
self.message = None
|
||||
self.mediaObject = Phonon.MediaObject()
|
||||
self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory)
|
||||
|
|
|
@ -147,16 +147,20 @@ class Ui_MainWindow(object):
|
|||
self.FileImportMenu.setObjectName(u'FileImportMenu')
|
||||
self.FileExportMenu = QtGui.QMenu(self.FileMenu)
|
||||
self.FileExportMenu.setObjectName(u'FileExportMenu')
|
||||
self.OptionsMenu = QtGui.QMenu(self.MenuBar)
|
||||
self.OptionsMenu.setObjectName(u'OptionsMenu')
|
||||
self.OptionsViewMenu = QtGui.QMenu(self.OptionsMenu)
|
||||
self.OptionsViewMenu.setObjectName(u'OptionsViewMenu')
|
||||
self.ViewModeMenu = QtGui.QMenu(self.OptionsViewMenu)
|
||||
# View Menu
|
||||
self.ViewMenu = QtGui.QMenu(self.MenuBar)
|
||||
self.ViewMenu.setObjectName(u'ViewMenu')
|
||||
self.ViewModeMenu = QtGui.QMenu(self.ViewMenu)
|
||||
self.ViewModeMenu.setObjectName(u'ViewModeMenu')
|
||||
self.OptionsLanguageMenu = QtGui.QMenu(self.OptionsMenu)
|
||||
self.OptionsLanguageMenu.setObjectName(u'OptionsLanguageMenu')
|
||||
# Tools Menu
|
||||
self.ToolsMenu = QtGui.QMenu(self.MenuBar)
|
||||
self.ToolsMenu.setObjectName(u'ToolsMenu')
|
||||
# Settings Menu
|
||||
self.SettingsMenu = QtGui.QMenu(self.MenuBar)
|
||||
self.SettingsMenu.setObjectName(u'SettingsMenu')
|
||||
self.SettingsLanguageMenu = QtGui.QMenu(self.SettingsMenu)
|
||||
self.SettingsLanguageMenu.setObjectName(u'SettingsLanguageMenu')
|
||||
# Help Menu
|
||||
self.HelpMenu = QtGui.QMenu(self.MenuBar)
|
||||
self.HelpMenu.setObjectName(u'HelpMenu')
|
||||
MainWindow.setMenuBar(self.MenuBar)
|
||||
|
@ -168,8 +172,8 @@ class Ui_MainWindow(object):
|
|||
self.StatusBar.addPermanentWidget(self.DefaultThemeLabel)
|
||||
# Create the MediaManager
|
||||
self.MediaManagerDock = OpenLPDockWidget(MainWindow)
|
||||
MediaManagerIcon = build_icon(u':/system/system_mediamanager.png')
|
||||
self.MediaManagerDock.setWindowIcon(MediaManagerIcon)
|
||||
self.MediaManagerDock.setWindowIcon(
|
||||
build_icon(u':/system/system_mediamanager.png'))
|
||||
self.MediaManagerDock.setStyleSheet(media_manager_style)
|
||||
self.MediaManagerDock.setMinimumWidth(
|
||||
self.settingsmanager.mainwindow_left)
|
||||
|
@ -188,8 +192,8 @@ class Ui_MainWindow(object):
|
|||
QtCore.Qt.DockWidgetArea(1), self.MediaManagerDock)
|
||||
# Create the service manager
|
||||
self.ServiceManagerDock = OpenLPDockWidget(MainWindow)
|
||||
ServiceManagerIcon = build_icon(u':/system/system_servicemanager.png')
|
||||
self.ServiceManagerDock.setWindowIcon(ServiceManagerIcon)
|
||||
self.ServiceManagerDock.setWindowIcon(
|
||||
build_icon(u':/system/system_servicemanager.png'))
|
||||
self.ServiceManagerDock.setObjectName(u'ServiceManagerDock')
|
||||
self.ServiceManagerDock.setMinimumWidth(
|
||||
self.settingsmanager.mainwindow_right)
|
||||
|
@ -199,8 +203,8 @@ class Ui_MainWindow(object):
|
|||
QtCore.Qt.DockWidgetArea(2), self.ServiceManagerDock)
|
||||
# Create the theme manager
|
||||
self.ThemeManagerDock = OpenLPDockWidget(MainWindow)
|
||||
ThemeManagerIcon = build_icon(u':/system/system_thememanager.png')
|
||||
self.ThemeManagerDock.setWindowIcon(ThemeManagerIcon)
|
||||
self.ThemeManagerDock.setWindowIcon(
|
||||
build_icon(u':/system/system_thememanager.png'))
|
||||
self.ThemeManagerDock.setObjectName(u'ThemeManagerDock')
|
||||
self.ThemeManagerDock.setMinimumWidth(
|
||||
self.settingsmanager.mainwindow_right)
|
||||
|
@ -227,8 +231,7 @@ class Ui_MainWindow(object):
|
|||
self.FileSaveAsItem = QtGui.QAction(MainWindow)
|
||||
self.FileSaveAsItem.setObjectName(u'FileSaveAsItem')
|
||||
self.FileExitItem = QtGui.QAction(MainWindow)
|
||||
ExitIcon = build_icon(u':/system/system_exit.png')
|
||||
self.FileExitItem.setIcon(ExitIcon)
|
||||
self.FileExitItem.setIcon(build_icon(u':/system/system_exit.png'))
|
||||
self.FileExitItem.setObjectName(u'FileExitItem')
|
||||
self.ImportThemeItem = QtGui.QAction(MainWindow)
|
||||
self.ImportThemeItem.setObjectName(u'ImportThemeItem')
|
||||
|
@ -238,39 +241,41 @@ class Ui_MainWindow(object):
|
|||
self.ExportThemeItem.setObjectName(u'ExportThemeItem')
|
||||
self.ExportLanguageItem = QtGui.QAction(MainWindow)
|
||||
self.ExportLanguageItem.setObjectName(u'ExportLanguageItem')
|
||||
self.actionLook_Feel = QtGui.QAction(MainWindow)
|
||||
self.actionLook_Feel.setObjectName(u'actionLook_Feel')
|
||||
self.OptionsSettingsItem = QtGui.QAction(MainWindow)
|
||||
SettingsIcon = build_icon(u':/system/system_settings.png')
|
||||
self.OptionsSettingsItem.setIcon(SettingsIcon)
|
||||
self.OptionsSettingsItem.setObjectName(u'OptionsSettingsItem')
|
||||
self.SettingsConfigureItem = QtGui.QAction(MainWindow)
|
||||
self.SettingsConfigureItem.setIcon(
|
||||
build_icon(u':/system/system_settings.png'))
|
||||
self.SettingsConfigureItem.setObjectName(u'SettingsConfigureItem')
|
||||
self.ViewMediaManagerItem = QtGui.QAction(MainWindow)
|
||||
self.ViewMediaManagerItem.setCheckable(True)
|
||||
self.ViewMediaManagerItem.setChecked(self.MediaManagerDock.isVisible())
|
||||
self.ViewMediaManagerItem.setIcon(MediaManagerIcon)
|
||||
self.ViewMediaManagerItem.setIcon(
|
||||
build_icon(u':/system/system_mediamanager.png'))
|
||||
self.ViewMediaManagerItem.setObjectName(u'ViewMediaManagerItem')
|
||||
self.ViewThemeManagerItem = QtGui.QAction(MainWindow)
|
||||
self.ViewThemeManagerItem.setCheckable(True)
|
||||
self.ViewThemeManagerItem.setChecked(self.ThemeManagerDock.isVisible())
|
||||
self.ViewThemeManagerItem.setIcon(ThemeManagerIcon)
|
||||
self.ViewThemeManagerItem.setIcon(
|
||||
build_icon(u':/system/system_thememanager.png'))
|
||||
self.ViewThemeManagerItem.setObjectName(u'ViewThemeManagerItem')
|
||||
self.ViewServiceManagerItem = QtGui.QAction(MainWindow)
|
||||
self.ViewServiceManagerItem.setCheckable(True)
|
||||
self.ViewServiceManagerItem.setChecked(
|
||||
self.ServiceManagerDock.isVisible())
|
||||
self.ViewServiceManagerItem.setIcon(ServiceManagerIcon)
|
||||
self.ViewServiceManagerItem.setIcon(
|
||||
build_icon(u':/system/system_servicemanager.png'))
|
||||
self.ViewServiceManagerItem.setObjectName(u'ViewServiceManagerItem')
|
||||
self.PluginItem = QtGui.QAction(MainWindow)
|
||||
#self.PluginItem.setIcon(AlertIcon)
|
||||
self.PluginItem.setObjectName(u'PluginItem')
|
||||
self.SettingsPluginListItem = QtGui.QAction(MainWindow)
|
||||
self.SettingsPluginListItem.setIcon(
|
||||
build_icon(u':/system/settings_plugin_list.png'))
|
||||
self.SettingsPluginListItem.setObjectName(u'SettingsPluginListItem')
|
||||
self.HelpDocumentationItem = QtGui.QAction(MainWindow)
|
||||
ContentsIcon = build_icon(u':/system/system_help_contents.png')
|
||||
self.HelpDocumentationItem.setIcon(ContentsIcon)
|
||||
self.HelpDocumentationItem.setIcon(
|
||||
build_icon(u':/system/system_help_contents.png'))
|
||||
self.HelpDocumentationItem.setObjectName(u'HelpDocumentationItem')
|
||||
self.HelpDocumentationItem.setEnabled(False)
|
||||
self.HelpAboutItem = QtGui.QAction(MainWindow)
|
||||
AboutIcon = build_icon(u':/system/system_about.png')
|
||||
self.HelpAboutItem.setIcon(AboutIcon)
|
||||
self.HelpAboutItem.setIcon(
|
||||
build_icon(u':/system/system_about.png'))
|
||||
self.HelpAboutItem.setObjectName(u'HelpAboutItem')
|
||||
self.HelpOnlineHelpItem = QtGui.QAction(MainWindow)
|
||||
self.HelpOnlineHelpItem.setObjectName(u'HelpOnlineHelpItem')
|
||||
|
@ -294,18 +299,36 @@ class Ui_MainWindow(object):
|
|||
add_actions(self.LanguageGroup, [languageItem])
|
||||
self.LanguageGroup.setDisabled(LanguageManager.AutoLanguage)
|
||||
self.ToolsAddToolItem = QtGui.QAction(MainWindow)
|
||||
AddToolIcon = build_icon(u':/tools/tools_add.png')
|
||||
self.ToolsAddToolItem.setIcon(AddToolIcon)
|
||||
self.ToolsAddToolItem.setIcon(build_icon(u':/tools/tools_add.png'))
|
||||
self.ToolsAddToolItem.setObjectName(u'ToolsAddToolItem')
|
||||
self.action_Preview_Panel = QtGui.QAction(MainWindow)
|
||||
self.action_Preview_Panel.setCheckable(True)
|
||||
self.action_Preview_Panel.setChecked(
|
||||
self.settingsmanager.showPreviewPanel)
|
||||
self.action_Preview_Panel.setObjectName(u'action_Preview_Panel')
|
||||
self.ViewPreviewPanel = QtGui.QAction(MainWindow)
|
||||
self.ViewPreviewPanel.setCheckable(True)
|
||||
self.ViewPreviewPanel.setChecked(
|
||||
self.settingsmanager.get_preview_visibility())
|
||||
self.ViewPreviewPanel.setObjectName(u'ViewPreviewPanel')
|
||||
self.PreviewController.Panel.setVisible(
|
||||
self.settingsmanager.showPreviewPanel)
|
||||
self.settingsmanager.get_preview_visibility())
|
||||
self.ViewLivePanel = QtGui.QAction(MainWindow)
|
||||
self.ViewLivePanel.setCheckable(True)
|
||||
self.ViewLivePanel.setChecked(
|
||||
self.settingsmanager.get_live_visibility())
|
||||
self.ViewLivePanel.setObjectName(u'ViewLivePanel')
|
||||
self.LiveController.Panel.setVisible(
|
||||
self.settingsmanager.get_live_visibility())
|
||||
self.ModeDefaultItem = QtGui.QAction(MainWindow)
|
||||
self.ModeDefaultItem.setCheckable(True)
|
||||
self.ModeDefaultItem.setObjectName(u'ModeDefaultItem')
|
||||
self.ModeSetupItem = QtGui.QAction(MainWindow)
|
||||
self.ModeSetupItem.setCheckable(True)
|
||||
self.ModeSetupItem.setObjectName(u'ModeLiveItem')
|
||||
self.ModeLiveItem = QtGui.QAction(MainWindow)
|
||||
self.ModeLiveItem.setCheckable(True)
|
||||
self.ModeLiveItem.setObjectName(u'ModeLiveItem')
|
||||
self.ModeGroup = QtGui.QActionGroup(MainWindow)
|
||||
self.ModeGroup.addAction(self.ModeDefaultItem)
|
||||
self.ModeGroup.addAction(self.ModeSetupItem)
|
||||
self.ModeGroup.addAction(self.ModeLiveItem)
|
||||
self.ModeDefaultItem.setChecked(True)
|
||||
add_actions(self.FileImportMenu,
|
||||
(self.ImportThemeItem, self.ImportLanguageItem))
|
||||
add_actions(self.FileExportMenu,
|
||||
|
@ -314,23 +337,27 @@ class Ui_MainWindow(object):
|
|||
self.FileSaveItem, self.FileSaveAsItem, None,
|
||||
self.FileImportMenu.menuAction(), self.FileExportMenu.menuAction(),
|
||||
self.FileExitItem)
|
||||
add_actions(self.ViewModeMenu, [self.ModeLiveItem])
|
||||
add_actions(self.OptionsViewMenu, (self.ViewModeMenu.menuAction(),
|
||||
add_actions(self.ViewModeMenu, (self.ModeDefaultItem,
|
||||
self.ModeSetupItem, self.ModeLiveItem))
|
||||
add_actions(self.ViewMenu, (self.ViewModeMenu.menuAction(),
|
||||
None, self.ViewMediaManagerItem, self.ViewServiceManagerItem,
|
||||
self.ViewThemeManagerItem, None, self.action_Preview_Panel))
|
||||
self.ViewThemeManagerItem, None, self.ViewPreviewPanel,
|
||||
self.ViewLivePanel))
|
||||
#i18n add Language Actions
|
||||
add_actions(self.OptionsLanguageMenu, (self.AutoLanguageItem, None))
|
||||
add_actions(self.OptionsLanguageMenu, self.LanguageGroup.actions())
|
||||
add_actions(self.OptionsMenu, (self.OptionsLanguageMenu.menuAction(),
|
||||
self.OptionsViewMenu.menuAction(), None, self.OptionsSettingsItem))
|
||||
add_actions(self.SettingsLanguageMenu, (self.AutoLanguageItem, None))
|
||||
add_actions(self.SettingsLanguageMenu, self.LanguageGroup.actions())
|
||||
add_actions(self.SettingsMenu, (self.SettingsPluginListItem,
|
||||
self.SettingsLanguageMenu.menuAction(), None,
|
||||
self.SettingsConfigureItem))
|
||||
add_actions(self.ToolsMenu,
|
||||
(self.PluginItem, None, self.ToolsAddToolItem))
|
||||
(self.ToolsAddToolItem, None))
|
||||
add_actions(self.HelpMenu,
|
||||
(self.HelpDocumentationItem, self.HelpOnlineHelpItem, None,
|
||||
self.HelpWebSiteItem, self.HelpAboutItem))
|
||||
add_actions(self.MenuBar,
|
||||
(self.FileMenu.menuAction(), self.OptionsMenu.menuAction(),
|
||||
self.ToolsMenu.menuAction(), self.HelpMenu.menuAction()))
|
||||
(self.FileMenu.menuAction(), self.ViewMenu.menuAction(),
|
||||
self.ToolsMenu.menuAction(), self.SettingsMenu.menuAction(),
|
||||
self.HelpMenu.menuAction()))
|
||||
# Initialise the translation
|
||||
self.retranslateUi(MainWindow)
|
||||
self.MediaToolBox.setCurrentIndex(0)
|
||||
|
@ -360,12 +387,12 @@ class Ui_MainWindow(object):
|
|||
self.FileMenu.setTitle(translate('MainWindow', '&File'))
|
||||
self.FileImportMenu.setTitle(translate('MainWindow', '&Import'))
|
||||
self.FileExportMenu.setTitle(translate('MainWindow', '&Export'))
|
||||
self.OptionsMenu.setTitle(translate('MainWindow', '&Options'))
|
||||
self.OptionsViewMenu.setTitle(translate('MainWindow', '&View'))
|
||||
self.ViewMenu.setTitle(translate('MainWindow', '&View'))
|
||||
self.ViewModeMenu.setTitle(translate('MainWindow', 'M&ode'))
|
||||
self.OptionsLanguageMenu.setTitle(translate('MainWindow',
|
||||
'&Language'))
|
||||
self.ToolsMenu.setTitle(translate('MainWindow', '&Tools'))
|
||||
self.SettingsMenu.setTitle(translate('MainWindow', '&Settings'))
|
||||
self.SettingsLanguageMenu.setTitle(translate('MainWindow',
|
||||
'&Language'))
|
||||
self.HelpMenu.setTitle(translate('MainWindow', '&Help'))
|
||||
self.MediaManagerDock.setWindowTitle(
|
||||
translate('MainWindow', 'Media Manager'))
|
||||
|
@ -376,24 +403,24 @@ class Ui_MainWindow(object):
|
|||
self.FileNewItem.setText(translate('MainWindow', '&New'))
|
||||
self.FileNewItem.setToolTip(translate('MainWindow', 'New Service'))
|
||||
self.FileNewItem.setStatusTip(
|
||||
translate('MainWindow', 'Create a new Service'))
|
||||
translate('MainWindow', 'Create a new service.'))
|
||||
self.FileNewItem.setShortcut(translate('MainWindow', 'Ctrl+N'))
|
||||
self.FileOpenItem.setText(translate('MainWindow', '&Open'))
|
||||
self.FileOpenItem.setToolTip(translate('MainWindow', 'Open Service'))
|
||||
self.FileOpenItem.setStatusTip(
|
||||
translate('MainWindow', 'Open an existing service'))
|
||||
translate('MainWindow', 'Open an existing service.'))
|
||||
self.FileOpenItem.setShortcut(translate('MainWindow', 'Ctrl+O'))
|
||||
self.FileSaveItem.setText(translate('MainWindow', '&Save'))
|
||||
self.FileSaveItem.setToolTip(translate('MainWindow', 'Save Service'))
|
||||
self.FileSaveItem.setStatusTip(
|
||||
translate('MainWindow', 'Save the current service to disk'))
|
||||
translate('MainWindow', 'Save the current service to disk.'))
|
||||
self.FileSaveItem.setShortcut(translate('MainWindow', 'Ctrl+S'))
|
||||
self.FileSaveAsItem.setText(translate('MainWindow', 'Save &As...'))
|
||||
self.FileSaveAsItem.setToolTip(
|
||||
translate('MainWindow', 'Save Service As'))
|
||||
self.FileSaveAsItem.setStatusTip(translate('MainWindow',
|
||||
'Save the current service under a new name'))
|
||||
self.FileSaveAsItem.setShortcut(translate('MainWindow', 'F12'))
|
||||
'Save the current service under a new name.'))
|
||||
self.FileSaveAsItem.setShortcut(translate('MainWindow', 'Ctrl+Shift+S'))
|
||||
self.FileExitItem.setText(translate('MainWindow', 'E&xit'))
|
||||
self.FileExitItem.setStatusTip(translate('MainWindow', 'Quit OpenLP'))
|
||||
self.FileExitItem.setShortcut(translate('MainWindow', 'Alt+F4'))
|
||||
|
@ -401,40 +428,48 @@ class Ui_MainWindow(object):
|
|||
self.ImportLanguageItem.setText(translate('MainWindow', '&Language'))
|
||||
self.ExportThemeItem.setText(translate('MainWindow', '&Theme'))
|
||||
self.ExportLanguageItem.setText(translate('MainWindow', '&Language'))
|
||||
self.actionLook_Feel.setText(translate('MainWindow', 'Look && &Feel'))
|
||||
self.OptionsSettingsItem.setText(translate('MainWindow', '&Settings'))
|
||||
self.SettingsConfigureItem.setText(translate('MainWindow',
|
||||
'&Configure OpenLP...'))
|
||||
self.ViewMediaManagerItem.setText(
|
||||
translate('MainWindow', '&Media Manager'))
|
||||
self.ViewMediaManagerItem.setToolTip(
|
||||
translate('MainWindow', 'Toggle Media Manager'))
|
||||
self.ViewMediaManagerItem.setStatusTip(translate('MainWindow',
|
||||
'Toggle the visibility of the Media Manager'))
|
||||
'Toggle the visibility of the media manager.'))
|
||||
self.ViewMediaManagerItem.setShortcut(translate('MainWindow', 'F8'))
|
||||
self.ViewThemeManagerItem.setText(
|
||||
translate('MainWindow', '&Theme Manager'))
|
||||
self.ViewThemeManagerItem.setToolTip(
|
||||
translate('MainWindow', 'Toggle Theme Manager'))
|
||||
self.ViewThemeManagerItem.setStatusTip(translate('MainWindow',
|
||||
'Toggle the visibility of the Theme Manager'))
|
||||
'Toggle the visibility of the theme manager.'))
|
||||
self.ViewThemeManagerItem.setShortcut(translate('MainWindow', 'F10'))
|
||||
self.ViewServiceManagerItem.setText(
|
||||
translate('MainWindow', '&Service Manager'))
|
||||
self.ViewServiceManagerItem.setToolTip(
|
||||
translate('MainWindow', 'Toggle Service Manager'))
|
||||
self.ViewServiceManagerItem.setStatusTip(translate('MainWindow',
|
||||
'Toggle the visibility of the Service Manager'))
|
||||
'Toggle the visibility of the service manager.'))
|
||||
self.ViewServiceManagerItem.setShortcut(translate('MainWindow', 'F9'))
|
||||
self.action_Preview_Panel.setText(
|
||||
self.ViewPreviewPanel.setText(
|
||||
translate('MainWindow', '&Preview Panel'))
|
||||
self.action_Preview_Panel.setToolTip(
|
||||
self.ViewPreviewPanel.setToolTip(
|
||||
translate('MainWindow', 'Toggle Preview Panel'))
|
||||
self.action_Preview_Panel.setStatusTip(translate('MainWindow',
|
||||
'Toggle the visibility of the Preview Panel'))
|
||||
self.action_Preview_Panel.setShortcut(translate('MainWindow', 'F11'))
|
||||
self.PluginItem.setText(translate('MainWindow', '&Plugin List'))
|
||||
self.PluginItem.setStatusTip(
|
||||
self.ViewPreviewPanel.setStatusTip(translate('MainWindow',
|
||||
'Toggle the visibility of the preview panel.'))
|
||||
self.ViewPreviewPanel.setShortcut(translate('MainWindow', 'F11'))
|
||||
self.ViewLivePanel.setText(
|
||||
translate('MainWindow', '&Live Panel'))
|
||||
self.ViewLivePanel.setToolTip(
|
||||
translate('MainWindow', 'Toggle Live Panel'))
|
||||
self.ViewLivePanel.setStatusTip(translate('MainWindow',
|
||||
'Toggle the visibility of the live panel.'))
|
||||
self.ViewLivePanel.setShortcut(translate('MainWindow', 'F12'))
|
||||
self.SettingsPluginListItem.setText(translate('MainWindow',
|
||||
'&Plugin List'))
|
||||
self.SettingsPluginListItem.setStatusTip(
|
||||
translate('MainWindow', 'List the Plugins'))
|
||||
self.PluginItem.setShortcut(translate('MainWindow', 'Alt+F7'))
|
||||
self.SettingsPluginListItem.setShortcut(translate('MainWindow', 'Alt+F7'))
|
||||
self.HelpDocumentationItem.setText(
|
||||
translate('MainWindow', '&User Guide'))
|
||||
self.HelpAboutItem.setText(translate('MainWindow', '&About'))
|
||||
|
@ -444,10 +479,9 @@ class Ui_MainWindow(object):
|
|||
self.HelpOnlineHelpItem.setText(
|
||||
translate('MainWindow', '&Online Help'))
|
||||
self.HelpWebSiteItem.setText(translate('MainWindow', '&Web Site'))
|
||||
#i18n
|
||||
self.AutoLanguageItem.setText(translate('MainWindow', '&Auto Detect'))
|
||||
self.AutoLanguageItem.setStatusTip(
|
||||
translate('MainWindow', 'Choose System language, if available'))
|
||||
translate('MainWindow', 'Use the system language, if available.'))
|
||||
for item in self.LanguageGroup.actions():
|
||||
item.setText(item.objectName())
|
||||
item.setStatusTip(unicode(translate('MainWindow',
|
||||
|
@ -455,10 +489,19 @@ class Ui_MainWindow(object):
|
|||
self.ToolsAddToolItem.setText(translate('MainWindow', 'Add &Tool...'))
|
||||
self.ToolsAddToolItem.setStatusTip(
|
||||
translate('MainWindow',
|
||||
'Add an application to the list of tools'))
|
||||
self.action_Preview_Panel.setText(
|
||||
translate('MainWindow', '&Preview Pane'))
|
||||
'Add an application to the list of tools.'))
|
||||
self.ModeDefaultItem.setText(translate('MainWindow', '&Default'))
|
||||
self.ModeDefaultItem.setStatusTip(
|
||||
translate('MainWindow',
|
||||
'Set the view mode back to the default.'))
|
||||
self.ModeSetupItem.setText(translate('MainWindow', '&Setup'))
|
||||
self.ModeSetupItem.setStatusTip(
|
||||
translate('MainWindow',
|
||||
'Set the view mode to Setup.'))
|
||||
self.ModeLiveItem.setText(translate('MainWindow', '&Live'))
|
||||
self.ModeLiveItem.setStatusTip(
|
||||
translate('MainWindow',
|
||||
'Set the view mode to Live.'))
|
||||
|
||||
|
||||
class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
|
@ -514,9 +557,12 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
QtCore.QObject.connect(self.ViewThemeManagerItem,
|
||||
QtCore.SIGNAL(u'triggered(bool)'),
|
||||
self.toggleThemeManager)
|
||||
QtCore.QObject.connect(self.action_Preview_Panel,
|
||||
QtCore.QObject.connect(self.ViewPreviewPanel,
|
||||
QtCore.SIGNAL(u'toggled(bool)'),
|
||||
self.togglePreviewPanel)
|
||||
self.setPreviewPanelVisibility)
|
||||
QtCore.QObject.connect(self.ViewLivePanel,
|
||||
QtCore.SIGNAL(u'toggled(bool)'),
|
||||
self.setLivePanelVisibility)
|
||||
QtCore.QObject.connect(self.MediaManagerDock,
|
||||
QtCore.SIGNAL(u'visibilityChanged(bool)'),
|
||||
self.ViewMediaManagerItem.setChecked)
|
||||
|
@ -526,27 +572,14 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
QtCore.QObject.connect(self.ThemeManagerDock,
|
||||
QtCore.SIGNAL(u'visibilityChanged(bool)'),
|
||||
self.ViewThemeManagerItem.setChecked)
|
||||
QtCore.QObject.connect(self.PreviewController.Panel,
|
||||
QtCore.SIGNAL(u'visibilityChanged(bool)'),
|
||||
self.action_Preview_Panel.setChecked)
|
||||
QtCore.QObject.connect(self.HelpWebSiteItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onHelpWebSiteClicked)
|
||||
QtCore.QObject.connect(self.HelpAboutItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onHelpAboutItemClicked)
|
||||
QtCore.QObject.connect(self.PluginItem,
|
||||
QtCore.QObject.connect(self.SettingsPluginListItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onPluginItemClicked)
|
||||
QtCore.QObject.connect(self.OptionsSettingsItem,
|
||||
QtCore.QObject.connect(self.SettingsConfigureItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onOptionsSettingsItemClicked)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'theme_update_global'), self.defaultThemeChanged)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'openlp_version_check'), self.versionCheck)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'maindisplay_blank_check'), self.blankCheck)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'maindisplay_status_text'), self.showStatusMessage)
|
||||
QtCore.QObject.connect(self.FileNewItem,
|
||||
QtCore.SIGNAL(u'triggered()'),
|
||||
self.ServiceManagerContents.onNewService)
|
||||
|
@ -564,6 +597,25 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
QtCore.SIGNAL(u'toggled(bool)'),
|
||||
self.setAutoLanguage)
|
||||
self.LanguageGroup.triggered.connect(LanguageManager.set_language)
|
||||
QtCore.QObject.connect(self.ModeDefaultItem,
|
||||
QtCore.SIGNAL(u'triggered()'),
|
||||
self.onModeDefaultItemClicked)
|
||||
QtCore.QObject.connect(self.ModeSetupItem,
|
||||
QtCore.SIGNAL(u'triggered()'),
|
||||
self.onModeSetupItemClicked)
|
||||
QtCore.QObject.connect(self.ModeLiveItem,
|
||||
QtCore.SIGNAL(u'triggered()'),
|
||||
self.onModeLiveItemClicked)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'theme_update_global'), self.defaultThemeChanged)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'openlp_version_check'), self.versionCheck)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'maindisplay_blank_check'), self.blankCheck)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'config_screen_changed'), self.screenChanged)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'maindisplay_status_text'), self.showStatusMessage)
|
||||
#warning cyclic dependency
|
||||
#RenderManager needs to call ThemeManager and
|
||||
#ThemeManager needs to call RenderManager
|
||||
|
@ -580,7 +632,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
self.plugin_helpers[u'service'] = self.ServiceManagerContents
|
||||
self.plugin_helpers[u'settings form'] = self.settingsForm
|
||||
self.plugin_helpers[u'toolbox'] = self.mediaDockManager
|
||||
self.plugin_helpers[u'maindisplay'] = self.displayManager.mainDisplay
|
||||
self.plugin_helpers[u'displaymanager'] = self.displayManager
|
||||
self.plugin_helpers[u'pluginmanager'] = self.plugin_manager
|
||||
self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers)
|
||||
# hook methods have to happen after find_plugins. Find plugins needs
|
||||
# the controllers hence the hooks have moved from setupUI() to here
|
||||
|
@ -606,7 +659,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
log.info(u'Load data from Settings')
|
||||
self.settingsForm.postSetUp()
|
||||
|
||||
#i18n
|
||||
def setAutoLanguage(self, value):
|
||||
self.LanguageGroup.setDisabled(value)
|
||||
LanguageManager.AutoLanguage = value
|
||||
|
@ -694,6 +746,36 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
"""
|
||||
self.settingsForm.exec_()
|
||||
|
||||
def onModeDefaultItemClicked(self):
|
||||
"""
|
||||
Put OpenLP into "Default" view mode.
|
||||
"""
|
||||
self.MediaManagerDock.setVisible(True)
|
||||
self.ServiceManagerDock.setVisible(True)
|
||||
self.ThemeManagerDock.setVisible(True)
|
||||
self.setPreviewPanelVisibility(True)
|
||||
self.setLivePanelVisibility(True)
|
||||
|
||||
def onModeSetupItemClicked(self):
|
||||
"""
|
||||
Put OpenLP into "Setup" view mode.
|
||||
"""
|
||||
self.MediaManagerDock.setVisible(True)
|
||||
self.ServiceManagerDock.setVisible(True)
|
||||
self.ThemeManagerDock.setVisible(False)
|
||||
self.setPreviewPanelVisibility(True)
|
||||
self.setLivePanelVisibility(False)
|
||||
|
||||
def onModeLiveItemClicked(self):
|
||||
"""
|
||||
Put OpenLP into "Live" view mode.
|
||||
"""
|
||||
self.MediaManagerDock.setVisible(False)
|
||||
self.ServiceManagerDock.setVisible(True)
|
||||
self.ThemeManagerDock.setVisible(False)
|
||||
self.setPreviewPanelVisibility(False)
|
||||
self.setLivePanelVisibility(True)
|
||||
|
||||
def screenChanged(self):
|
||||
"""
|
||||
The screen has changed to so tell the displays to update_display
|
||||
|
@ -786,10 +868,33 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
if self.ThemeManagerDock.isVisible() != visible:
|
||||
self.ThemeManagerDock.setVisible(visible)
|
||||
|
||||
def togglePreviewPanel(self):
|
||||
previewBool = self.PreviewController.Panel.isVisible()
|
||||
self.PreviewController.Panel.setVisible(not previewBool)
|
||||
self.settingsmanager.togglePreviewPanel(not previewBool)
|
||||
def setPreviewPanelVisibility(self, visible):
|
||||
"""
|
||||
Sets the visibility of the preview panel including saving the setting
|
||||
and updating the menu.
|
||||
|
||||
``visible``
|
||||
A bool giving the state to set the panel to
|
||||
True - Visible
|
||||
False - Hidden
|
||||
"""
|
||||
self.PreviewController.Panel.setVisible(visible)
|
||||
self.settingsmanager.set_preview_visibility(visible)
|
||||
self.ViewPreviewPanel.setChecked(visible)
|
||||
|
||||
def setLivePanelVisibility(self, visible):
|
||||
"""
|
||||
Sets the visibility of the live panel including saving the setting and
|
||||
updating the menu.
|
||||
|
||||
``visible``
|
||||
A bool giving the state to set the panel to
|
||||
True - Visible
|
||||
False - Hidden
|
||||
"""
|
||||
self.LiveController.Panel.setVisible(visible)
|
||||
self.settingsmanager.set_live_visibility(visible)
|
||||
self.ViewLivePanel.setChecked(visible)
|
||||
|
||||
def loadSettings(self):
|
||||
log.debug(u'Loading QSettings')
|
||||
|
|
|
@ -115,10 +115,10 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
|
|||
if self.programaticChange:
|
||||
return
|
||||
if status == 0:
|
||||
self.activePlugin.toggle_status(PluginStatus.Active)
|
||||
self.activePlugin.toggleStatus(PluginStatus.Active)
|
||||
self.activePlugin.initialise()
|
||||
else:
|
||||
self.activePlugin.toggle_status(PluginStatus.Inactive)
|
||||
self.activePlugin.toggleStatus(PluginStatus.Inactive)
|
||||
self.activePlugin.finalise()
|
||||
status_text = 'Inactive'
|
||||
if self.activePlugin.status == PluginStatus.Active:
|
||||
|
@ -128,4 +128,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))
|
||||
u'%s (%s)' % (self.activePlugin.name, status_text))
|
|
@ -785,7 +785,7 @@ class SlideController(QtGui.QWidget):
|
|||
if self.serviceItem.is_text():
|
||||
self.mainDisplay.frameView(frame, True)
|
||||
else:
|
||||
self.displayManager.displayImage(frame[u'display'])
|
||||
self.displayManager.displayImage(frame[u'main'])
|
||||
self.selectedRow = row
|
||||
Receiver.send_message(u'slidecontroller_%s_changed' % self.typePrefix,
|
||||
row)
|
||||
|
|
|
@ -212,7 +212,7 @@ class ThemeManager(QtGui.QWidget):
|
|||
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
|
||||
else:
|
||||
for plugin in self.parent.plugin_manager.plugins:
|
||||
if not plugin.can_delete_theme(theme):
|
||||
if not plugin.canDeleteTheme(theme):
|
||||
QtGui.QMessageBox.critical(self,
|
||||
translate('ThemeManager', 'Error'),
|
||||
unicode(translate('ThemeManager',
|
||||
|
@ -682,4 +682,3 @@ class ThemeManager(QtGui.QWidget):
|
|||
#theme.theme_mode
|
||||
theme.theme_name = theme.theme_name.strip()
|
||||
#theme.theme_version
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ from openlp.plugins.alerts.forms import AlertForm
|
|||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class alertsPlugin(Plugin):
|
||||
class AlertsPlugin(Plugin):
|
||||
log.info(u'Alerts Plugin loaded')
|
||||
|
||||
def __init__(self, plugin_helpers):
|
||||
|
@ -47,14 +47,14 @@ class alertsPlugin(Plugin):
|
|||
self.alertForm = AlertForm(self.manager, self)
|
||||
self.status = PluginStatus.Active
|
||||
|
||||
def get_settings_tab(self):
|
||||
def getSettingsTab(self):
|
||||
"""
|
||||
Return the settings tab for the Alerts plugin
|
||||
"""
|
||||
self.alertsTab = AlertsTab(self)
|
||||
return self.alertsTab
|
||||
|
||||
def add_tools_menu_item(self, tools_menu):
|
||||
def addToolsMenuItem(self, tools_menu):
|
||||
"""
|
||||
Give the alerts plugin the opportunity to add items to the
|
||||
**Tools** menu.
|
||||
|
@ -73,7 +73,7 @@ class alertsPlugin(Plugin):
|
|||
self.toolsAlertItem.setStatusTip(
|
||||
translate('AlertsPlugin', 'Show an alert message'))
|
||||
self.toolsAlertItem.setShortcut(u'F7')
|
||||
self.service_manager.parent.ToolsMenu.addAction(self.toolsAlertItem)
|
||||
self.serviceManager.parent.ToolsMenu.addAction(self.toolsAlertItem)
|
||||
QtCore.QObject.connect(self.toolsAlertItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onAlertsTrigger)
|
||||
self.toolsAlertItem.setVisible(False)
|
||||
|
@ -88,7 +88,7 @@ class alertsPlugin(Plugin):
|
|||
Plugin.finalise(self)
|
||||
self.toolsAlertItem.setVisible(False)
|
||||
|
||||
def togglealertsState(self):
|
||||
def toggleAlertsState(self):
|
||||
self.alertsActive = not self.alertsActive
|
||||
QtCore.QSettings().setValue(
|
||||
self.settingsSection + u'/active',
|
||||
|
@ -103,3 +103,4 @@ class alertsPlugin(Plugin):
|
|||
'<b>Alerts Plugin</b><br>This plugin '
|
||||
'controls the displaying of alerts on the presentations screen')
|
||||
return about_text
|
||||
|
||||
|
|
|
@ -88,13 +88,14 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog):
|
|||
self.AlertTextEdit.setText(u'')
|
||||
self.SaveButton.setEnabled(False)
|
||||
self.DeleteButton.setEnabled(False)
|
||||
self.EditButton.setEnabled(False)
|
||||
|
||||
def onNewClick(self):
|
||||
if len(self.AlertTextEdit.text()) == 0:
|
||||
QtGui.QMessageBox.information(self,
|
||||
translate('AlertsPlugin.AlertForm', 'Item selected to Add'),
|
||||
translate('AlertsPlugin.AlertForm', 'Missing data'))
|
||||
translate('AlertsPlugin.AlertForm', 'New Alert'),
|
||||
translate('AlertsPlugin.AlertForm', 'You haven\'t specified '
|
||||
'any text for your alert. Please type in some text before '
|
||||
'clicking New.'))
|
||||
else:
|
||||
alert = AlertItem()
|
||||
alert.text = unicode(self.AlertTextEdit.text())
|
||||
|
|
|
@ -95,7 +95,7 @@ class AlertsManager(QtCore.QObject):
|
|||
alertTab = self.parent.alertsTab
|
||||
text = HTMLCODE % (alertTab.font_color, alertTab.bg_color,
|
||||
alertTab.font_face, alertTab.font_size, text)
|
||||
self.parent.preview_controller.parent.displayManager.addAlert(text,
|
||||
self.parent.previewController.parent.displayManager.addAlert(text,
|
||||
alertTab.location)
|
||||
# check to see if we have a timer running
|
||||
if self.timer_id == 0:
|
||||
|
@ -112,8 +112,9 @@ class AlertsManager(QtCore.QObject):
|
|||
log.debug(u'timer event')
|
||||
alertTab = self.parent.alertsTab
|
||||
if event.timerId() == self.timer_id:
|
||||
self.parent.preview_controller.parent.displayManager.addAlert(u'',
|
||||
self.parent.previewController.parent.displayManager.addAlert(u'',
|
||||
alertTab.location)
|
||||
self.killTimer(self.timer_id)
|
||||
self.timer_id = 0
|
||||
self.generateAlert()
|
||||
|
||||
|
|
|
@ -57,14 +57,14 @@ class BiblePlugin(Plugin):
|
|||
self.ImportBibleItem.setVisible(False)
|
||||
self.ExportBibleItem.setVisible(False)
|
||||
|
||||
def get_settings_tab(self):
|
||||
def getSettingsTab(self):
|
||||
return BiblesTab(self.name)
|
||||
|
||||
def get_media_manager_item(self):
|
||||
def getMediaManagerItem(self):
|
||||
# Create the BibleManagerItem object
|
||||
return BibleMediaItem(self, self.icon, self.name)
|
||||
|
||||
def add_import_menu_item(self, import_menu):
|
||||
def addImportMenuItem(self, import_menu):
|
||||
self.ImportBibleItem = QtGui.QAction(import_menu)
|
||||
self.ImportBibleItem.setObjectName(u'ImportBibleItem')
|
||||
import_menu.addAction(self.ImportBibleItem)
|
||||
|
@ -75,7 +75,7 @@ class BiblePlugin(Plugin):
|
|||
QtCore.SIGNAL(u'triggered()'), self.onBibleImportClick)
|
||||
self.ImportBibleItem.setVisible(False)
|
||||
|
||||
def add_export_menu_item(self, export_menu):
|
||||
def addExportMenuItem(self, export_menu):
|
||||
self.ExportBibleItem = QtGui.QAction(export_menu)
|
||||
self.ExportBibleItem.setObjectName(u'ExportBibleItem')
|
||||
export_menu.addAction(self.ExportBibleItem)
|
||||
|
@ -94,7 +94,7 @@ class BiblePlugin(Plugin):
|
|||
'displayed on the screen during the service.')
|
||||
return about_text
|
||||
|
||||
def can_delete_theme(self, theme):
|
||||
def canDeleteTheme(self, theme):
|
||||
if self.settings_tab.bible_theme == theme:
|
||||
return False
|
||||
return True
|
||||
return True
|
|
@ -53,10 +53,10 @@ class CustomPlugin(Plugin):
|
|||
self.icon = build_icon(u':/plugins/plugin_custom.png')
|
||||
self.status = PluginStatus.Active
|
||||
|
||||
def get_settings_tab(self):
|
||||
def getSettingsTab(self):
|
||||
return CustomTab(self.name)
|
||||
|
||||
def get_media_manager_item(self):
|
||||
def getMediaManagerItem(self):
|
||||
# Create the CustomManagerItem object
|
||||
return CustomMediaItem(self, self.icon, self.name)
|
||||
|
||||
|
@ -68,8 +68,8 @@ class CustomPlugin(Plugin):
|
|||
'songs plugin.<br>')
|
||||
return about_text
|
||||
|
||||
def can_delete_theme(self, theme):
|
||||
def canDeleteTheme(self, theme):
|
||||
if not self.custommanager.get_all_objects_filtered(CustomSlide,
|
||||
CustomSlide.theme_name == theme):
|
||||
return True
|
||||
return False
|
||||
return False
|
|
@ -28,7 +28,8 @@ import logging
|
|||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from editcustomdialog import Ui_customEditDialog
|
||||
from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate
|
||||
from openlp.core.lib import Receiver, translate
|
||||
from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser
|
||||
from openlp.plugins.custom.lib.db import CustomSlide
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
@ -119,8 +120,8 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog):
|
|||
self.customSlide = self.custommanager.get_object(CustomSlide, id)
|
||||
self.TitleEdit.setText(self.customSlide.title)
|
||||
self.CreditEdit.setText(self.customSlide.credits)
|
||||
songXML = SongXMLParser(self.customSlide.text)
|
||||
verseList = songXML.get_verses()
|
||||
customXML = CustomXMLParser(self.customSlide.text)
|
||||
verseList = customXML.get_verses()
|
||||
for verse in verseList:
|
||||
self.VerseListView.addItem(verse[1])
|
||||
theme = self.customSlide.theme_name
|
||||
|
@ -152,7 +153,7 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog):
|
|||
translate('CustomPlugin.EditCustomForm', 'Error'), message,
|
||||
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
|
||||
return False
|
||||
sxml = SongXMLBuilder()
|
||||
sxml = CustomXMLBuilder()
|
||||
sxml.new_document()
|
||||
sxml.add_lyrics_to_song()
|
||||
count = 1
|
||||
|
|
|
@ -23,5 +23,6 @@
|
|||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||
###############################################################################
|
||||
|
||||
from customxmlhandler import CustomXMLBuilder, CustomXMLParser
|
||||
from mediaitem import CustomMediaItem
|
||||
from customtab import CustomTab
|
||||
|
|
|
@ -23,7 +23,8 @@
|
|||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||
###############################################################################
|
||||
"""
|
||||
The :mod:`songxmlhandler` module provides the XML functionality for songs
|
||||
The :mod:`customxmlhandler` module provides the XML functionality for custom
|
||||
slides
|
||||
|
||||
The basic XML is of the format::
|
||||
|
||||
|
@ -45,26 +46,26 @@ from xml.parsers.expat import ExpatError
|
|||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class SongXMLBuilder(object):
|
||||
class CustomXMLBuilder(object):
|
||||
"""
|
||||
This class builds the XML used to describe songs.
|
||||
"""
|
||||
log.info(u'SongXMLBuilder Loaded')
|
||||
log.info(u'CustomXMLBuilder Loaded')
|
||||
|
||||
def __init__(self):
|
||||
"""
|
||||
Set up the song builder.
|
||||
"""
|
||||
# Create the minidom document
|
||||
self.song_xml = Document()
|
||||
self.custom_xml = Document()
|
||||
|
||||
def new_document(self):
|
||||
"""
|
||||
Create a new song XML document.
|
||||
"""
|
||||
# Create the <song> base element
|
||||
self.song = self.song_xml.createElement(u'song')
|
||||
self.song_xml.appendChild(self.song)
|
||||
self.song = self.custom_xml.createElement(u'song')
|
||||
self.custom_xml.appendChild(self.song)
|
||||
self.song.setAttribute(u'version', u'1.0')
|
||||
|
||||
def add_lyrics_to_song(self):
|
||||
|
@ -73,7 +74,7 @@ class SongXMLBuilder(object):
|
|||
song.
|
||||
"""
|
||||
# Create the main <lyrics> element
|
||||
self.lyrics = self.song_xml.createElement(u'lyrics')
|
||||
self.lyrics = self.custom_xml.createElement(u'lyrics')
|
||||
self.lyrics.setAttribute(u'language', u'en')
|
||||
self.song.appendChild(self.lyrics)
|
||||
|
||||
|
@ -92,32 +93,32 @@ class SongXMLBuilder(object):
|
|||
The actual text of the verse to be stored.
|
||||
"""
|
||||
#log.debug(u'add_verse_to_lyrics %s, %s\n%s' % (type, number, content))
|
||||
verse = self.song_xml.createElement(u'verse')
|
||||
verse = self.custom_xml.createElement(u'verse')
|
||||
verse.setAttribute(u'type', type)
|
||||
verse.setAttribute(u'label', number)
|
||||
self.lyrics.appendChild(verse)
|
||||
# add data as a CDATA section to protect the XML from special chars
|
||||
cds = self.song_xml.createCDATASection(content)
|
||||
cds = self.custom_xml.createCDATASection(content)
|
||||
verse.appendChild(cds)
|
||||
|
||||
def dump_xml(self):
|
||||
"""
|
||||
Debugging aid to dump XML so that we can see what we have.
|
||||
"""
|
||||
return self.song_xml.toprettyxml(indent=u' ')
|
||||
return self.custom_xml.toprettyxml(indent=u' ')
|
||||
|
||||
def extract_xml(self):
|
||||
"""
|
||||
Extract our newly created XML song.
|
||||
"""
|
||||
return self.song_xml.toxml(u'utf-8')
|
||||
return self.custom_xml.toxml(u'utf-8')
|
||||
|
||||
|
||||
class SongXMLParser(object):
|
||||
class CustomXMLParser(object):
|
||||
"""
|
||||
A class to read in and parse a song's XML.
|
||||
"""
|
||||
log.info(u'SongXMLParser Loaded')
|
||||
log.info(u'CustomXMLParser Loaded')
|
||||
|
||||
def __init__(self, xml):
|
||||
"""
|
||||
|
@ -126,9 +127,9 @@ class SongXMLParser(object):
|
|||
``xml``
|
||||
The XML of the song to be parsed.
|
||||
"""
|
||||
self.song_xml = None
|
||||
self.custom_xml = None
|
||||
try:
|
||||
self.song_xml = ElementTree(
|
||||
self.custom_xml = ElementTree(
|
||||
element=XML(unicode(xml).encode('unicode-escape')))
|
||||
except ExpatError:
|
||||
log.exception(u'Invalid xml %s', xml)
|
||||
|
@ -138,7 +139,7 @@ class SongXMLParser(object):
|
|||
Iterates through the verses in the XML and returns a list of verses
|
||||
and their attributes.
|
||||
"""
|
||||
xml_iter = self.song_xml.getiterator()
|
||||
xml_iter = self.custom_xml.getiterator()
|
||||
verse_list = []
|
||||
for element in xml_iter:
|
||||
if element.tag == u'verse':
|
||||
|
@ -152,4 +153,4 @@ class SongXMLParser(object):
|
|||
"""
|
||||
Debugging aid to dump XML so that we can see what we have.
|
||||
"""
|
||||
return dump(self.song_xml)
|
||||
return dump(self.custom_xml)
|
|
@ -27,8 +27,9 @@ import logging
|
|||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD, \
|
||||
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, \
|
||||
Receiver, ItemCapabilities, translate, check_item_selected
|
||||
from openlp.plugins.custom.lib import CustomXMLParser
|
||||
from openlp.plugins.custom.lib.db import CustomSlide
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
@ -170,8 +171,8 @@ class CustomMediaItem(MediaManagerItem):
|
|||
theme = customSlide.theme_name
|
||||
if theme:
|
||||
service_item.theme = theme
|
||||
songXML = SongXMLParser(customSlide.text)
|
||||
verseList = songXML.get_verses()
|
||||
customXML = CustomXMLParser(customSlide.text)
|
||||
verseList = customXML.get_verses()
|
||||
for verse in verseList:
|
||||
raw_slides.append(verse[1])
|
||||
service_item.title = title
|
||||
|
|
|
@ -39,10 +39,10 @@ class ImagePlugin(Plugin):
|
|||
self.icon = build_icon(u':/plugins/plugin_images.png')
|
||||
self.status = PluginStatus.Active
|
||||
|
||||
def get_settings_tab(self):
|
||||
def getSettingsTab(self):
|
||||
return ImageTab(self.name)
|
||||
|
||||
def get_media_manager_item(self):
|
||||
def getMediaManagerItem(self):
|
||||
# Create the MediaManagerItem object
|
||||
return ImageMediaItem(self, self.icon, self.name)
|
||||
|
||||
|
@ -55,4 +55,4 @@ class ImagePlugin(Plugin):
|
|||
'an image is selected any songs which are rendered will use the '
|
||||
'selected image from the background instead of the one provied by '
|
||||
'the theme.<br>')
|
||||
return about_text
|
||||
return about_text
|
|
@ -173,11 +173,12 @@ class ImageMediaItem(MediaManagerItem):
|
|||
if check_item_selected(self.ListView,
|
||||
translate('ImagePlugin.MediaItem',
|
||||
'You must select an item to process.')):
|
||||
item = self.buildServiceItem()
|
||||
item.render()
|
||||
self.parent.live_controller.displayManager. \
|
||||
displayImage(item.get_rendered_frame(0)[u'display'])
|
||||
|
||||
items = self.ListView.selectedIndexes()
|
||||
for item in items:
|
||||
bitem = self.ListView.item(item.row())
|
||||
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
||||
frame = QtGui.QImage(unicode(filename))
|
||||
self.parent.displayManager.displayImageWithText(frame)
|
||||
|
||||
def onPreviewClick(self):
|
||||
MediaManagerItem.onPreviewClick(self)
|
||||
|
|
|
@ -101,22 +101,13 @@ class MediaMediaItem(MediaManagerItem):
|
|||
self.PageLayout.addWidget(self.ImageWidget)
|
||||
|
||||
def onReplaceClick(self):
|
||||
# if self.background:
|
||||
# self.background = False
|
||||
# Receiver.send_message(u'videodisplay_stop')
|
||||
# else:
|
||||
# self.background = True
|
||||
|
||||
if check_item_selected(self.ListView,
|
||||
translate('ImagePlugin.MediaItem',
|
||||
'You must select an item to process.')):
|
||||
item = self.ListView.currentItem()
|
||||
filename = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
self.parent.live_controller.displayManager.displayVideo(filename)
|
||||
# items = self.ListView.selectedIndexes()
|
||||
# for item in items:
|
||||
# bitem = self.ListView.item(item.row())
|
||||
# filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
|
||||
# Receiver.send_message(u'videodisplay_background', filename)
|
||||
self.parent.displayManager.displayVideo(filename)
|
||||
|
||||
def generateSlideData(self, service_item, item=None):
|
||||
if item is None:
|
||||
|
|
|
@ -47,27 +47,27 @@ class MediaPlugin(Plugin):
|
|||
for mimetype in Phonon.BackendCapabilities.availableMimeTypes():
|
||||
mimetype = unicode(mimetype)
|
||||
type = mimetype.split(u'audio/x-')
|
||||
self.audio_list, mimetype = self._add_to_list(self.audio_list,
|
||||
self.audio_list, mimetype = self._addToList(self.audio_list,
|
||||
type, mimetype)
|
||||
type = mimetype.split(u'audio/')
|
||||
self.audio_list, mimetype = self._add_to_list(self.audio_list,
|
||||
self.audio_list, mimetype = self._addToList(self.audio_list,
|
||||
type, mimetype)
|
||||
type = mimetype.split(u'video/x-')
|
||||
self.video_list, mimetype = self._add_to_list(self.video_list,
|
||||
self.video_list, mimetype = self._addToList(self.video_list,
|
||||
type, mimetype)
|
||||
type = mimetype.split(u'video/')
|
||||
self.video_list, mimetype = self._add_to_list(self.video_list,
|
||||
self.video_list, mimetype = self._addToList(self.video_list,
|
||||
type, mimetype)
|
||||
|
||||
def _add_to_list(self, list, value, type):
|
||||
def _addToList(self, list, value, type):
|
||||
if len(value) == 2:
|
||||
if list.find(value[1]) == -1:
|
||||
list += u'*.%s ' % value[1]
|
||||
self.service_manager.supportedSuffixes(value[1])
|
||||
self.serviceManager.supportedSuffixes(value[1])
|
||||
type = u''
|
||||
return list, type
|
||||
|
||||
def get_media_manager_item(self):
|
||||
def getMediaManagerItem(self):
|
||||
# Create the MediaManagerItem object
|
||||
return MediaMediaItem(self, self.icon, self.name)
|
||||
|
||||
|
|
|
@ -222,7 +222,7 @@ class ImpressDocument(PresentationDocument):
|
|||
return
|
||||
self.presentation = self.document.getPresentation()
|
||||
self.presentation.Display = \
|
||||
self.controller.plugin.render_manager.screens.current_display + 1
|
||||
self.controller.plugin.renderManager.screens.current_display + 1
|
||||
self.control = None
|
||||
self.create_thumbnails()
|
||||
|
||||
|
|
|
@ -77,7 +77,7 @@ class PresentationMediaItem(MediaManagerItem):
|
|||
for type in types:
|
||||
if fileType.find(type) == -1:
|
||||
fileType += u'*%s ' % type
|
||||
self.parent.service_manager.supportedSuffixes(type)
|
||||
self.parent.serviceManager.supportedSuffixes(type)
|
||||
self.OnNewFileMasks = translate('PresentationPlugin.MediaItem',
|
||||
'Presentations (%s)' % fileType)
|
||||
|
||||
|
|
|
@ -233,7 +233,7 @@ class PowerpointDocument(PresentationDocument):
|
|||
dpi = 96
|
||||
self.presentation.SlideShowSettings.Run()
|
||||
self.presentation.SlideShowWindow.View.GotoSlide(1)
|
||||
rendermanager = self.controller.plugin.render_manager
|
||||
rendermanager = self.controller.plugin.renderManager
|
||||
rect = rendermanager.screens.current[u'size']
|
||||
self.presentation.SlideShowWindow.Top = rect.y() * 72 / dpi
|
||||
self.presentation.SlideShowWindow.Height = rect.height() * 72 / dpi
|
||||
|
@ -298,4 +298,4 @@ class PowerpointDocument(PresentationDocument):
|
|||
shape = shapes(idx + 1)
|
||||
if shape.HasTextFrame:
|
||||
text += shape.TextFrame.TextRange.Text + '\n'
|
||||
return text
|
||||
return text
|
|
@ -79,8 +79,9 @@ class PptviewController(PresentationController):
|
|||
if self.process:
|
||||
return
|
||||
log.debug(u'start PPTView')
|
||||
self.process = cdll.LoadLibrary(
|
||||
r'openlp\plugins\presentations\lib\pptviewlib\pptviewlib.dll')
|
||||
dllpath = os.path.join(self.plugin.pluginManager.basepath,
|
||||
u'presentations', u'lib', u'pptviewlib', u'pptviewlib.dll')
|
||||
self.process = cdll.LoadLibrary(dllpath)
|
||||
#self.process.SetDebug(1)
|
||||
|
||||
def kill(self):
|
||||
|
@ -118,7 +119,7 @@ class PptviewDocument(PresentationDocument):
|
|||
log.debug(u'LoadPresentation')
|
||||
#if self.pptid >= 0:
|
||||
# self.close_presentation()
|
||||
rendermanager = self.controller.plugin.render_manager
|
||||
rendermanager = self.controller.plugin.renderManager
|
||||
rect = rendermanager.screens.current[u'size']
|
||||
rect = RECT(rect.x(), rect.y(), rect.right(), rect.bottom())
|
||||
filepath = str(self.filepath.replace(u'/', u'\\'))
|
||||
|
|
|
@ -43,7 +43,7 @@ class PresentationPlugin(Plugin):
|
|||
self.icon = build_icon(u':/plugins/plugin_presentations.png')
|
||||
self.status = PluginStatus.Active
|
||||
|
||||
def get_settings_tab(self):
|
||||
def getSettingsTab(self):
|
||||
"""
|
||||
Create the settings Tab
|
||||
"""
|
||||
|
@ -52,7 +52,7 @@ class PresentationPlugin(Plugin):
|
|||
def initialise(self):
|
||||
log.info(u'Presentations Initialising')
|
||||
Plugin.initialise(self)
|
||||
self.insert_toolbox_item()
|
||||
self.insertToolboxItem()
|
||||
for controller in self.controllers:
|
||||
if self.controllers[controller].enabled:
|
||||
self.controllers[controller].start_process()
|
||||
|
@ -66,7 +66,7 @@ class PresentationPlugin(Plugin):
|
|||
controller.kill()
|
||||
Plugin.finalise(self)
|
||||
|
||||
def get_media_manager_item(self):
|
||||
def getMediaManagerItem(self):
|
||||
"""
|
||||
Create the Media Manager List
|
||||
"""
|
||||
|
@ -76,12 +76,12 @@ class PresentationPlugin(Plugin):
|
|||
def registerControllers(self, controller):
|
||||
self.controllers[controller.name] = controller
|
||||
|
||||
def check_pre_conditions(self):
|
||||
def checkPreConditions(self):
|
||||
"""
|
||||
Check to see if we have any presentation software available
|
||||
If Not do not install the plugin.
|
||||
"""
|
||||
log.debug(u'check_pre_conditions')
|
||||
log.debug(u'checkPreConditions')
|
||||
controller_dir = os.path.join(
|
||||
AppLocation.get_directory(AppLocation.PluginsDir),
|
||||
u'presentations', u'lib')
|
||||
|
@ -113,4 +113,4 @@ class PresentationPlugin(Plugin):
|
|||
'the ability to show presentations using a number of different '
|
||||
'programs. The choice of available presentation programs is '
|
||||
'available to the user in a drop down box.')
|
||||
return about_text
|
||||
return about_text
|
|
@ -48,7 +48,7 @@ class RemotesPlugin(Plugin):
|
|||
"""
|
||||
log.debug(u'initialise')
|
||||
Plugin.initialise(self)
|
||||
self.insert_toolbox_item()
|
||||
self.insertToolboxItem()
|
||||
self.server = HttpServer(self)
|
||||
|
||||
def finalise(self):
|
||||
|
@ -60,7 +60,7 @@ class RemotesPlugin(Plugin):
|
|||
if self.server:
|
||||
self.server.close()
|
||||
|
||||
def get_settings_tab(self):
|
||||
def getSettingsTab(self):
|
||||
"""
|
||||
Create the settings Tab
|
||||
"""
|
||||
|
@ -75,4 +75,4 @@ class RemotesPlugin(Plugin):
|
|||
'provides the ability to send messages to a running version of '
|
||||
'openlp on a different computer via a web browser or other app<br>'
|
||||
'The Primary use for this would be to send alerts from a creche')
|
||||
return about_text
|
||||
return about_text
|
|
@ -28,9 +28,9 @@ import re
|
|||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate
|
||||
from openlp.core.lib import Receiver, translate
|
||||
from openlp.plugins.songs.forms import EditVerseForm
|
||||
from openlp.plugins.songs.lib import VerseType
|
||||
from openlp.plugins.songs.lib import SongXMLBuilder, SongXMLParser, VerseType
|
||||
from openlp.plugins.songs.lib.db import Book, Song, Author, Topic
|
||||
from editsongdialog import Ui_EditSongDialog
|
||||
|
||||
|
@ -88,7 +88,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||
QtCore.SIGNAL(u'activated(int)'), self.onThemeComboChanged)
|
||||
QtCore.QObject.connect(self.ThemeAddButton,
|
||||
QtCore.SIGNAL(u'clicked()'),
|
||||
self.parent.parent.render_manager.theme_manager.onAddTheme)
|
||||
self.parent.parent.renderManager.theme_manager.onAddTheme)
|
||||
QtCore.QObject.connect(self.MaintenanceButton,
|
||||
QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
|
@ -639,8 +639,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||
log.debug(u'processLyrics')
|
||||
try:
|
||||
sxml = SongXMLBuilder()
|
||||
sxml.new_document()
|
||||
sxml.add_lyrics_to_song()
|
||||
text = u''
|
||||
multiple = []
|
||||
for i in range (0, self.VerseListWidget.rowCount()):
|
||||
|
@ -666,4 +664,3 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||
log.debug(u'processTitle')
|
||||
self.song.search_title = \
|
||||
re.sub(r'[\'"`,;:(){}?]+', u'', unicode(self.song.search_title))
|
||||
|
||||
|
|
|
@ -137,6 +137,7 @@ class VerseType(object):
|
|||
unicode(VerseType.to_string(VerseType.Other)).lower():
|
||||
return VerseType.Other
|
||||
|
||||
from xml import LyricsXML, SongXMLBuilder, SongXMLParser
|
||||
from songstab import SongsTab
|
||||
from mediaitem import SongMediaItem
|
||||
from songimport import SongImport
|
||||
|
@ -145,4 +146,3 @@ try:
|
|||
from oooimport import OooImport
|
||||
except ImportError:
|
||||
pass
|
||||
|
||||
|
|
|
@ -27,11 +27,12 @@ import logging
|
|||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import MediaManagerItem, SongXMLParser, \
|
||||
BaseListWithDnD, Receiver, ItemCapabilities, translate, check_item_selected
|
||||
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, Receiver, \
|
||||
ItemCapabilities, translate, check_item_selected
|
||||
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \
|
||||
ImportWizardForm
|
||||
from openlp.plugins.songs.lib.db import Song
|
||||
from openlp.plugins.songs.lib import SongXMLParser
|
||||
from openlp.plugins.songs.lib.db import Author, Song
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
|
|
@ -25,8 +25,8 @@
|
|||
|
||||
import re
|
||||
|
||||
from openlp.core.lib import SongXMLBuilder, translate
|
||||
from openlp.plugins.songs.lib import VerseType
|
||||
from openlp.core.lib import translate
|
||||
from openlp.plugins.songs.lib import SongXMLBuilder, VerseType
|
||||
from openlp.plugins.songs.lib.db import Song, Author, Topic, Book
|
||||
|
||||
class SongImport(object):
|
||||
|
@ -276,8 +276,6 @@ class SongImport(object):
|
|||
song.song_number = self.song_number
|
||||
song.search_lyrics = u''
|
||||
sxml = SongXMLBuilder()
|
||||
sxml.new_document()
|
||||
sxml.add_lyrics_to_song()
|
||||
for (versetag, versetext) in self.verses:
|
||||
if versetag[0] == u'C':
|
||||
versetype = VerseType.to_string(VerseType.Chorus)
|
||||
|
|
|
@ -24,18 +24,18 @@
|
|||
###############################################################################
|
||||
|
||||
import logging
|
||||
import sys
|
||||
import os
|
||||
#import sys
|
||||
#import os
|
||||
|
||||
from types import ListType
|
||||
from xml.etree.ElementTree import ElementTree, XML
|
||||
|
||||
sys.path.append(os.path.abspath(u'./../../../..'))
|
||||
|
||||
from openlp.core.lib import XmlRootClass
|
||||
# Do we need these two lines?
|
||||
#sys.path.append(os.path.abspath(u'./../../../..'))
|
||||
#sys.path.append(os.path.abspath(os.path.join(u'.', u'..', u'..')))
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class SongException(Exception):
|
||||
pass
|
||||
|
||||
|
@ -74,23 +74,78 @@ _BLANK_OPENSONG_XML = \
|
|||
</song>
|
||||
'''
|
||||
|
||||
class _OpenSong(XmlRootClass):
|
||||
"""Class for import of OpenSong"""
|
||||
|
||||
class _OpenSong(object):
|
||||
"""
|
||||
Class for import of OpenSong
|
||||
"""
|
||||
def __init__(self, xmlContent = None):
|
||||
"""Initialize from given xml content"""
|
||||
super(_OpenSong, self).__init__()
|
||||
self.from_buffer(xmlContent)
|
||||
|
||||
def _reset(self):
|
||||
"""Reset all song attributes"""
|
||||
self._setFromXml(_BLANK_OPENSONG_XML, 'song')
|
||||
|
||||
def from_buffer(self, xmlContent):
|
||||
"""Initialize from buffer(string) with xml content"""
|
||||
self._reset()
|
||||
"""
|
||||
Initialize from given xml content
|
||||
"""
|
||||
self._set_from_xml(_BLANK_OPENSONG_XML, 'song')
|
||||
if xmlContent:
|
||||
self._setFromXml(xmlContent, 'song')
|
||||
self._set_from_xml(xmlContent, 'song')
|
||||
|
||||
def _set_from_xml(self, xml, root_tag):
|
||||
"""
|
||||
Set song properties from given xml content.
|
||||
|
||||
``xml``
|
||||
Formatted xml tags and values.
|
||||
``root_tag``
|
||||
The root tag of the xml.
|
||||
"""
|
||||
root = ElementTree(element=XML(xml))
|
||||
xml_iter = root.getiterator()
|
||||
for element in xml_iter:
|
||||
if element.tag != root_tag:
|
||||
text = element.text
|
||||
if text is None:
|
||||
val = text
|
||||
elif isinstance(text, basestring):
|
||||
# Strings need special handling to sort the colours out
|
||||
if text[0] == u'$':
|
||||
# This might be a hex number, let's try to convert it.
|
||||
try:
|
||||
val = int(text[1:], 16)
|
||||
except ValueError:
|
||||
pass
|
||||
else:
|
||||
# Let's just see if it's a integer.
|
||||
try:
|
||||
val = int(text)
|
||||
except ValueError:
|
||||
# Ok, it seems to be a string.
|
||||
val = text
|
||||
if hasattr(self, u'post_tag_hook'):
|
||||
(element.tag, val) = \
|
||||
self.post_tag_hook(element.tag, val)
|
||||
setattr(self, element.tag, val)
|
||||
|
||||
def __str__(self):
|
||||
"""
|
||||
Return string with all public attributes
|
||||
|
||||
The string is formatted with one attribute per line
|
||||
If the string is split on newline then the length of the
|
||||
list is equal to the number of attributes
|
||||
"""
|
||||
attributes = []
|
||||
for attrib in dir(self):
|
||||
if not attrib.startswith(u'_'):
|
||||
attributes.append(
|
||||
u'%30s : %s' % (attrib, getattr(self, attrib)))
|
||||
return u'\n'.join(attributes)
|
||||
|
||||
def _get_as_string(self):
|
||||
"""
|
||||
Return one string with all public attributes
|
||||
"""
|
||||
result = u''
|
||||
for attrib in dir(self):
|
||||
if not attrib.startswith(u'_'):
|
||||
result += u'_%s_' % getattr(self, attrib)
|
||||
return result
|
||||
|
||||
def get_author_list(self):
|
||||
"""Convert author field to an authorlist
|
||||
|
@ -252,14 +307,6 @@ class Song(object):
|
|||
self.set_lyrics(u'')
|
||||
return
|
||||
|
||||
def set_songid(self, songid):
|
||||
"""Set the songid for the database"""
|
||||
self.songid = songid
|
||||
|
||||
def get_songid(self):
|
||||
"""Return the songid for the database"""
|
||||
return self.songid
|
||||
|
||||
def from_opensong_buffer(self, xmlcontent):
|
||||
"""Initialize from buffer(string) of xml lines in opensong format"""
|
||||
self._reset()
|
||||
|
@ -323,10 +370,6 @@ class Song(object):
|
|||
"""Return title value"""
|
||||
return self.title
|
||||
|
||||
def get_search_title(self):
|
||||
"""Return search_title"""
|
||||
return self.search_title
|
||||
|
||||
def from_ccli_text_buffer(self, textList):
|
||||
"""
|
||||
Create song from a list of texts (strings) - CCLI text format expected
|
||||
|
|
|
@ -22,24 +22,125 @@
|
|||
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||
###############################################################################
|
||||
"""
|
||||
The :mod:`xml` module provides the XML functionality for songs
|
||||
|
||||
The basic XML is of the format::
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<song version="1.0">
|
||||
<lyrics language="en">
|
||||
<verse type="chorus" label="1">
|
||||
<![CDATA[ ... ]]>
|
||||
</verse>
|
||||
</lyrics>
|
||||
</song>
|
||||
"""
|
||||
|
||||
import logging
|
||||
|
||||
from lxml import etree, objectify
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class SongXMLBuilder(object):
|
||||
"""
|
||||
This class builds the XML used to describe songs.
|
||||
"""
|
||||
log.info(u'SongXMLBuilder Loaded')
|
||||
|
||||
def __init__(self, song_language=None):
|
||||
"""
|
||||
Set up the song builder.
|
||||
|
||||
``song_language``
|
||||
The language used in this song
|
||||
"""
|
||||
lang = u'en'
|
||||
if song_language:
|
||||
lang = song_language
|
||||
self.song_xml = objectify.fromstring(u'<song version="1.0" />')
|
||||
self.lyrics = etree.SubElement(self.song_xml, u'lyrics', language=lang)
|
||||
|
||||
def add_verse_to_lyrics(self, type, number, content):
|
||||
"""
|
||||
Add a verse to the ``<lyrics>`` tag.
|
||||
|
||||
``type``
|
||||
A string denoting the type of verse. Possible values are "Chorus",
|
||||
"Verse", "Bridge", and "Custom".
|
||||
|
||||
``number``
|
||||
An integer denoting the number of the item, for example: verse 1.
|
||||
|
||||
``content``
|
||||
The actual text of the verse to be stored.
|
||||
"""
|
||||
#log.debug(u'add_verse_to_lyrics %s, %s\n%s' % (type, number, content))
|
||||
verse = etree.Element(u'verse', type=type, label=number)
|
||||
verse.text = etree.CDATA(content)
|
||||
self.lyrics.append(verse)
|
||||
|
||||
def dump_xml(self):
|
||||
"""
|
||||
Debugging aid to dump XML so that we can see what we have.
|
||||
"""
|
||||
return etree.tostring(self.song_xml, encoding=u'UTF-8',
|
||||
xml_declaration=True, pretty_print=True)
|
||||
|
||||
def extract_xml(self):
|
||||
"""
|
||||
Extract our newly created XML song.
|
||||
"""
|
||||
return etree.tostring(self.song_xml, encoding=u'UTF-8',
|
||||
xml_declaration=True)
|
||||
|
||||
|
||||
class SongXMLParser(object):
|
||||
"""
|
||||
A class to read in and parse a song's XML.
|
||||
"""
|
||||
log.info(u'SongXMLParser Loaded')
|
||||
|
||||
def __init__(self, xml):
|
||||
"""
|
||||
Set up our song XML parser.
|
||||
|
||||
``xml``
|
||||
The XML of the song to be parsed.
|
||||
"""
|
||||
self.song_xml = None
|
||||
if xml[:5] == u'<?xml':
|
||||
xml = xml[38:]
|
||||
try:
|
||||
self.song_xml = objectify.fromstring(xml)
|
||||
except etree.XMLSyntaxError:
|
||||
log.exception(u'Invalid xml %s', xml)
|
||||
|
||||
def get_verses(self):
|
||||
"""
|
||||
Iterates through the verses in the XML and returns a list of verses
|
||||
and their attributes.
|
||||
"""
|
||||
xml_iter = self.song_xml.getiterator()
|
||||
verse_list = []
|
||||
for element in xml_iter:
|
||||
if element.tag == u'verse':
|
||||
if element.text is None:
|
||||
element.text = u''
|
||||
verse_list.append([element.attrib, unicode(element.text)])
|
||||
return verse_list
|
||||
|
||||
def dump_xml(self):
|
||||
"""
|
||||
Debugging aid to dump XML so that we can see what we have.
|
||||
"""
|
||||
return etree.dump(self.song_xml)
|
||||
|
||||
from lxml import objectify
|
||||
from lxml.etree import XMLSyntaxError
|
||||
|
||||
class LyricsXML(object):
|
||||
"""
|
||||
This class represents the XML in the ``lyrics`` field of a song.
|
||||
|
||||
The basic XML looks like this::
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<song version="1.0">
|
||||
<lyrics language="en">
|
||||
<verse type="chorus" label="1">
|
||||
<![CDATA[ ... ]]>
|
||||
</verse>
|
||||
</lyrics>
|
||||
</song>
|
||||
"""
|
||||
def __init__(self, song=None):
|
||||
if song:
|
||||
|
@ -74,7 +175,7 @@ class LyricsXML(object):
|
|||
})
|
||||
self.lyrics.append(language)
|
||||
return True
|
||||
except XMLSyntaxError:
|
||||
except etree.XMLSyntaxError:
|
||||
return False
|
||||
|
||||
def extract(self, text):
|
||||
|
@ -136,4 +237,3 @@ class LyricsXML(object):
|
|||
song_output = u'<?xml version="1.0" encoding="UTF-8"?>' + \
|
||||
u'<song version="1.0">%s</song>' % lyrics_output
|
||||
return song_output
|
||||
|
||||
|
|
|
@ -61,23 +61,23 @@ class SongsPlugin(Plugin):
|
|||
self.icon = build_icon(u':/plugins/plugin_songs.png')
|
||||
self.status = PluginStatus.Active
|
||||
|
||||
def get_settings_tab(self):
|
||||
def getSettingsTab(self):
|
||||
return SongsTab(self.name)
|
||||
|
||||
def initialise(self):
|
||||
log.info(u'Songs Initialising')
|
||||
Plugin.initialise(self)
|
||||
self.media_item.displayResultsSong(
|
||||
self.mediaItem.displayResultsSong(
|
||||
self.manager.get_all_objects(Song, Song.title))
|
||||
|
||||
def get_media_manager_item(self):
|
||||
def getMediaManagerItem(self):
|
||||
"""
|
||||
Create the MediaManagerItem object, which is displaed in the
|
||||
Media Manager.
|
||||
"""
|
||||
return SongMediaItem(self, self.icon, self.name)
|
||||
|
||||
def add_import_menu_item(self, import_menu):
|
||||
def addImportMenuItem(self, import_menu):
|
||||
"""
|
||||
Give the Songs plugin the opportunity to add items to the
|
||||
**Import** menu.
|
||||
|
@ -137,7 +137,7 @@ class SongsPlugin(Plugin):
|
|||
QtCore.QObject.connect(self.ImportOooItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onImportOooItemClick)
|
||||
|
||||
def add_export_menu_item(self, export_menu):
|
||||
def addExportMenuItem(self, export_menu):
|
||||
"""
|
||||
Give the Songs plugin the opportunity to add items to the
|
||||
**Export** menu.
|
||||
|
@ -191,8 +191,8 @@ class SongsPlugin(Plugin):
|
|||
'This plugin allows songs to be managed and displayed.')
|
||||
return about_text
|
||||
|
||||
def can_delete_theme(self, theme):
|
||||
def canDeleteTheme(self, theme):
|
||||
if not self.manager.get_all_objects_filtered(Song,
|
||||
Song.theme_name == theme):
|
||||
return True
|
||||
return False
|
||||
return False
|
|
@ -46,7 +46,7 @@ class SongUsagePlugin(Plugin):
|
|||
self.songusagemanager = None
|
||||
self.songusageActive = False
|
||||
|
||||
def add_tools_menu_item(self, tools_menu):
|
||||
def addToolsMenuItem(self, tools_menu):
|
||||
"""
|
||||
Give the SongUsage plugin the opportunity to add items to the
|
||||
**Tools** menu.
|
||||
|
@ -162,4 +162,4 @@ class SongUsagePlugin(Plugin):
|
|||
'<b>SongUsage Plugin</b><br>This plugin '
|
||||
'records the use of songs and when they have been used during '
|
||||
'a live service')
|
||||
return about_text
|
||||
return about_text
|
|
@ -98,6 +98,7 @@
|
|||
<file>system_servicemanager.png</file>
|
||||
<file>system_thememanager.png</file>
|
||||
<file>system_exit.png</file>
|
||||
<file>settings_plugin_list.png</file>
|
||||
<file>system_settings.png</file>
|
||||
</qresource>
|
||||
<qresource prefix="media">
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 800 B |
Loading…
Reference in New Issue