From a6de33f17736ee2b73c89d42527b0cbbfe7aa7dd Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 22 Jan 2013 21:09:43 +0000 Subject: [PATCH] Registry takes shape and takes over --- openlp/core/lib/htmlbuilder.py | 5 ++-- openlp/core/lib/imagemanager.py | 3 +- openlp/core/lib/pluginmanager.py | 11 ++----- openlp/core/lib/registry.py | 22 +++++++------- openlp/core/lib/renderer.py | 29 ++++++++++++++---- openlp/core/lib/serviceitem.py | 20 ++++++++++--- openlp/core/ui/maindisplay.py | 49 ++++++++++++++++++++++--------- openlp/core/ui/mainwindow.py | 2 +- openlp/core/ui/servicemanager.py | 28 +++++++++++------- openlp/core/ui/slidecontroller.py | 24 +++++++++------ openlp/core/ui/thememanager.py | 49 ++++++++++++++++++++++++------- 11 files changed, 163 insertions(+), 79 deletions(-) diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py index 9b3c97164..3f2b4dfad 100644 --- a/openlp/core/lib/htmlbuilder.py +++ b/openlp/core/lib/htmlbuilder.py @@ -32,7 +32,6 @@ import logging from PyQt4 import QtWebKit from openlp.core.lib.theme import BackgroundType, BackgroundGradientType, VerticalType, HorizontalType -from openlp.core.lib import PluginManager log = logging.getLogger(__name__) @@ -249,8 +248,8 @@ def build_html(item, screen, islive, background, image=None, css_additions = u'' js_additions = u'' html_additions = u'' - if PluginManager.get_instance().plugins: - for plugin in PluginManager.get_instance().plugins: + if plugins: + for plugin in plugins: css_additions += plugin.getDisplayCss() js_additions += plugin.getDisplayJavaScript() html_additions += plugin.getDisplayHtml() diff --git a/openlp/core/lib/imagemanager.py b/openlp/core/lib/imagemanager.py index 941818295..62a06335c 100644 --- a/openlp/core/lib/imagemanager.py +++ b/openlp/core/lib/imagemanager.py @@ -39,7 +39,7 @@ import Queue from PyQt4 import QtCore -from openlp.core.lib import resize_image, image_to_byte, Receiver +from openlp.core.lib import resize_image, image_to_byte, Receiver, Registry from openlp.core.ui import ScreenList log = logging.getLogger(__name__) @@ -183,6 +183,7 @@ class ImageManager(QtCore.QObject): def __init__(self): QtCore.QObject.__init__(self) + Registry().register(u'image_manager', self) currentScreen = ScreenList().current self.width = currentScreen[u'size'].width() self.height = currentScreen[u'size'].height() diff --git a/openlp/core/lib/pluginmanager.py b/openlp/core/lib/pluginmanager.py index 7fbe7ba9e..021cdf256 100644 --- a/openlp/core/lib/pluginmanager.py +++ b/openlp/core/lib/pluginmanager.py @@ -33,7 +33,7 @@ import os import sys import logging -from openlp.core.lib import Plugin, PluginStatus +from openlp.core.lib import Plugin, PluginStatus, Registry log = logging.getLogger(__name__) @@ -43,13 +43,6 @@ class PluginManager(object): and executes all the hooks, as and when necessary. """ log.info(u'Plugin manager loaded') - __instance__ = None - @staticmethod - def get_instance(): - """ - Obtain a single instance of class. - """ - return PluginManager.__instance__ def __init__(self, plugin_dir): """ @@ -60,7 +53,7 @@ class PluginManager(object): The directory to search for plugins. """ log.info(u'Plugin manager Initialising') - PluginManager.__instance__ = self + Registry().register(u'plugin_manager', self) if not plugin_dir in sys.path: log.debug(u'Inserting %s into sys.path', plugin_dir) sys.path.insert(0, plugin_dir) diff --git a/openlp/core/lib/registry.py b/openlp/core/lib/registry.py index 67c317587..8ea0fc056 100644 --- a/openlp/core/lib/registry.py +++ b/openlp/core/lib/registry.py @@ -27,18 +27,16 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -Provide plugin management +Provide Registry Services """ -import os -import sys import logging log = logging.getLogger(__name__) class Registry(object): """ - This is the Plugin manager, which loads all the plugins, - and executes all the hooks, as and when necessary. + This is the Component Registry. It is a singleton object and is used to provide a + look up service for common objects. """ log.info(u'Registry loaded') __instance__ = None @@ -52,16 +50,15 @@ class Registry(object): @classmethod def create(self): """ - The constructor for the plugin manager. Passes the controllers on to - the plugins for them to interact with via their ServiceItems. - - ``plugin_dir`` - The directory to search for plugins. + The constructor for the component registry providing a single registry of objects. """ log.info(u'Registry Initialising') self.service_list = {} def get(self, key): + """ + Extracts the registry value from the list based on the key passed in + """ if key in self.service_list: return self.service_list[key] else: @@ -69,10 +66,11 @@ class Registry(object): return None def register(self, key, reference): - print "register" + """ + Registers a component against a key. + """ if key in self.service_list: log.error(u'Duplicate service exception %s' % key) raise Exception(u'Duplicate service exception %s' % key) else: self.service_list[key] = reference - print self.service_list diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 6f572e726..57bacb4bf 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -56,7 +56,7 @@ class Renderer(object): """ log.info(u'Renderer Loaded') - def __init__(self, image_manager, theme_manager): + def __init__(self): """ Initialise the renderer. @@ -68,8 +68,6 @@ class Renderer(object): The theme_manager instance, used to get the current theme details. """ log.debug(u'Initialisation started') - self.theme_manager = theme_manager - self.image_manager = image_manager self.screens = ScreenList() Registry().register(u'renderer', self) self.theme_level = ThemeLevel.Global @@ -77,7 +75,7 @@ class Renderer(object): self.service_theme_name = u'' self.item_theme_name = u'' self.force_page = False - self.display = MainDisplay(None, self.image_manager, False, self) + self.display = MainDisplay(None, False, self) self.display.setup() self._theme_dimensions = {} self._calculate_default() @@ -94,7 +92,7 @@ class Renderer(object): self._calculate_default() if self.display: self.display.close() - self.display = MainDisplay(None, self.image_manager, False, self) + self.display = MainDisplay(None, False, self) self.display.setup() self._theme_dimensions = {} @@ -236,7 +234,6 @@ class Renderer(object): serviceItem.add_from_text(VERSE_FOR_LINE_COUNT) else: serviceItem.add_from_text(VERSE) - serviceItem.renderer = self serviceItem.raw_footer = FOOTER # if No file do not update cache if theme_data.background_filename: @@ -644,3 +641,23 @@ class Renderer(object): # this parse we are to be wordy line = line.replace(u'\n', u' ') return line.split(u' ') + + def _get_image_manager(self): + """ + Adds the image manager to the class dynamically + """ + if not hasattr(self, u'_image_manager'): + self._image_manager = Registry().get(u'image_manager') + return self._image_manager + + image_manager = property(_get_image_manager) + + def _get_theme_manager(self): + """ + Adds the theme manager to the class dynamically + """ + if not hasattr(self, u'_theme_manager'): + self._theme_manager = Registry().get(u'theme_manager') + return self._theme_manager + + theme_manager = property(_get_theme_manager) \ No newline at end of file diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 8a257fbfa..a1e9ed2a3 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -148,7 +148,6 @@ class ServiceItem(object): The plugin that this service item belongs to. """ if plugin: - self.renderer = plugin.renderer self.name = plugin.name self.title = u'' self.shortname = u'' @@ -293,7 +292,7 @@ class ServiceItem(object): self.image_border = background self.service_item_type = ServiceItemType.Image self._raw_frames.append({u'title': title, u'path': path}) - self.renderer.image_manager.addImage(path, ImageSource.ImagePlugin, self.image_border) + self.image_manager.addImage(path, ImageSource.ImagePlugin, self.image_border) self._new_item() def add_from_text(self, raw_slide, verse_tag=None): @@ -646,8 +645,21 @@ class ServiceItem(object): self.is_valid = False def _get_renderer(self): - if not self._renderer: + """ + Adds the Renderer to the class dynamically + """ + if not hasattr(self, u'_renderer'): self._renderer = Registry().get(u'renderer') return self._renderer - renderer = property(_get_renderer) \ No newline at end of file + renderer = property(_get_renderer) + + def _get_image_manager(self): + """ + Adds the image manager to the class dynamically + """ + if not hasattr(self, u'_image_manager'): + self._image_manager = Registry().get(u'image_manager') + return self._image_manager + + image_manager = property(_get_image_manager) \ No newline at end of file diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 084c1d36b..8dd9dcddc 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -38,8 +38,8 @@ import sys from PyQt4 import QtCore, QtGui, QtWebKit, QtOpenGL from PyQt4.phonon import Phonon -from openlp.core.lib import Receiver, build_html, ServiceItem, image_to_byte, translate, PluginManager, expand_tags,\ - Settings, ImageSource +from openlp.core.lib import Receiver, build_html, ServiceItem, image_to_byte, translate, expand_tags,\ + Settings, ImageSource, Registry from openlp.core.lib.theme import BackgroundType from openlp.core.ui import HideMode, ScreenList, AlertLocation @@ -114,9 +114,8 @@ class MainDisplay(Display): """ This is the display screen as a specialized class from the Display class """ - def __init__(self, parent, imageManager, live, controller): + def __init__(self, parent, live, controller): Display.__init__(self, parent, live, controller) - self.imageManager = imageManager self.screens = ScreenList() self.rebuildCSS = False self.hideMode = None @@ -181,8 +180,8 @@ class MainDisplay(Display): Call the plugins to rebuild the Live display CSS as the screen has not been rebuild on exit of config. """ - if self.rebuildCSS and PluginManager.get_instance().plugins: - for plugin in PluginManager.get_instance().plugins: + if self.rebuildCSS and self.plugin_manager.plugins: + for plugin in self.plugin_manager.plugins: plugin.refreshCss(self.frame) self.rebuildCSS = False @@ -221,8 +220,8 @@ class MainDisplay(Display): splash_image) serviceItem = ServiceItem() serviceItem.bg_image_bytes = image_to_byte(self.initialFrame) - self.webView.setHtml(build_html(serviceItem, self.screen, - self.isLive, None)) + self.webView.setHtml(build_html(serviceItem, self.screen, self.isLive, None, + plugins=self.plugin_manager.plugins)) self.__hideMouse() log.debug(u'Finished MainDisplay setup') @@ -288,7 +287,7 @@ class MainDisplay(Display): """ API for replacement backgrounds so Images are added directly to cache. """ - self.imageManager.addImage(path, ImageSource.ImagePlugin, background) + self.image_manager.addImage(path, ImageSource.ImagePlugin, background) if not hasattr(self, u'serviceItem'): return False self.override[u'image'] = path @@ -310,7 +309,7 @@ class MainDisplay(Display): re-added to the image manager. """ log.debug(u'image to display') - image = self.imageManager.getImageBytes(path, ImageSource.ImagePlugin) + image = self.image_manager.getImageBytes(path, ImageSource.ImagePlugin) self.controller.mediaController.media_reset(self.controller) self.displayImage(image) @@ -391,17 +390,18 @@ class MainDisplay(Display): self.override = {} else: # replace the background - background = self.imageManager.getImageBytes(self.override[u'image'], ImageSource.ImagePlugin) + background = self.image_manager.getImageBytes(self.override[u'image'], ImageSource.ImagePlugin) self.setTransparency(self.serviceItem.themedata.background_type == BackgroundType.to_string(BackgroundType.Transparent)) if self.serviceItem.themedata.background_filename: - self.serviceItem.bg_image_bytes = self.imageManager.getImageBytes( + self.serviceItem.bg_image_bytes = self.image_manager.getImageBytes( self.serviceItem.themedata.background_filename,ImageSource.Theme) if image_path: - image_bytes = self.imageManager.getImageBytes(image_path, ImageSource.ImagePlugin) + image_bytes = self.image_manager.getImageBytes(image_path, ImageSource.ImagePlugin) else: image_bytes = None - html = build_html(self.serviceItem, self.screen, self.isLive, background, image_bytes) + html = build_html(self.serviceItem, self.screen, self.isLive, background, image_bytes, + plugins=self.plugin_manager.plugins) log.debug(u'buildHtml - pre setHtml') self.webView.setHtml(html) log.debug(u'buildHtml - post setHtml') @@ -476,6 +476,26 @@ class MainDisplay(Display): self.setCursor(QtCore.Qt.ArrowCursor) self.frame.evaluateJavaScript('document.body.style.cursor = "auto"') + def _get_plugin_manager(self): + """ + Adds the Renderer to the class dynamically + """ + if not hasattr(self, u'_plugin_manager'): + self._plugin_manager = Registry().get(u'plugin_manager') + return self._plugin_manager + + plugin_manager = property(_get_plugin_manager) + + def _get_image_manager(self): + """ + Adds the image manager to the class dynamically + """ + if not hasattr(self, u'_image_manager'): + self._image_manager = Registry().get(u'image_manager') + return self._image_manager + + image_manager = property(_get_image_manager) + class AudioPlayer(QtCore.QObject): """ @@ -599,3 +619,4 @@ class AudioPlayer(QtCore.QObject): #@todo is this used? def connectSlot(self, signal, slot): QtCore.QObject.connect(self.mediaObject, signal, slot) + diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 6ba7a4d6d..99c38d486 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -542,7 +542,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # warning cyclic dependency # renderer needs to call ThemeManager and # ThemeManager needs to call Renderer - self.renderer = Renderer(self.imageManager, self.themeManagerContents) + self.renderer = Renderer() # Define the media Dock Manager self.mediaDockManager = MediaDockManager(self.mediaToolBox) log.info(u'Load Plugins') diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 8a9b01d04..5414c18d8 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -40,7 +40,7 @@ log = logging.getLogger(__name__) from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, ItemCapabilities, SettingsManager, \ - translate, str_to_bool, check_directory_exists, Settings, PluginStatus + translate, str_to_bool, check_directory_exists, Settings, PluginStatus, Registry from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.ui import UiStrings, critical_error_message_box, create_widget_action, find_and_set_in_combo_box from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm @@ -313,8 +313,7 @@ class ServiceManager(QtGui.QWidget): Setter for service file. """ self._fileName = unicode(fileName) - self.mainwindow.setServiceModified(self.isModified(), - self.shortFileName()) + self.mainwindow.setServiceModified(self.isModified(), self.shortFileName()) Settings().setValue(u'servicemanager/last file', fileName) self._saveLite = self._fileName.endswith(u'.oszl') @@ -384,8 +383,8 @@ class ServiceManager(QtGui.QWidget): if not loadFile: fileName = QtGui.QFileDialog.getOpenFileName(self.mainwindow, translate('OpenLP.ServiceManager', 'Open File'), - SettingsManager.get_last_dir(self.mainwindow.serviceManagerSettingsSection), - translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz *.oszl)')) + SettingsManager.get_last_dir(self.mainwindow.serviceManagerSettingsSection), + translate('OpenLP.ServiceManager', 'OpenLP Service Files (*.osz *.oszl)')) if not fileName: return False else: @@ -703,7 +702,6 @@ class ServiceManager(QtGui.QWidget): for item in items: self.mainwindow.incrementProgressBar() serviceItem = ServiceItem() - serviceItem.renderer = self.mainwindow.renderer if self._saveLite: serviceItem.set_from_service(item) else: @@ -812,7 +810,7 @@ class ServiceManager(QtGui.QWidget): break self.themeMenu.menuAction().setVisible(False) # Set up the theme menu. - if serviceItem[u'service_item'].is_text() and self.mainwindow.renderer.theme_level == ThemeLevel.Song: + if serviceItem[u'service_item'].is_text() and self.renderer.theme_level == ThemeLevel.Song: self.themeMenu.menuAction().setVisible(True) # The service item does not have a theme, check the "Default". if serviceItem[u'service_item'].theme is None: @@ -1197,7 +1195,7 @@ class ServiceManager(QtGui.QWidget): """ log.debug(u'onThemeComboBoxSelected') self.service_theme = self.themeComboBox.currentText() - self.mainwindow.renderer.set_service_theme(self.service_theme) + self.renderer.set_service_theme(self.service_theme) Settings().setValue(self.mainwindow.serviceManagerSettingsSection + u'/service theme', self.service_theme) self.regenerateServiceItems(True) @@ -1207,7 +1205,7 @@ class ServiceManager(QtGui.QWidget): sure the theme combo box is in the correct state. """ log.debug(u'themeChange') - visible = self.mainwindow.renderer.theme_level == ThemeLevel.Global + visible = self.renderer.theme_level == ThemeLevel.Global self.themeLabel.setVisible(visible) self.themeComboBox.setVisible(visible) @@ -1520,7 +1518,7 @@ class ServiceManager(QtGui.QWidget): themeGroup.addAction(create_widget_action(self.themeMenu, theme, text=theme, checked=False, triggers=self.onThemeChangeAction)) find_and_set_in_combo_box(self.themeComboBox, self.service_theme) - self.mainwindow.renderer.set_service_theme(self.service_theme) + self.renderer.set_service_theme(self.service_theme) self.regenerateServiceItems() def onThemeChangeAction(self): @@ -1545,3 +1543,13 @@ class ServiceManager(QtGui.QWidget): """ settingDialog = PrintServiceForm(self.mainwindow, self) settingDialog.exec_() + + def _get_renderer(self): + """ + Adds the Renderer to the class dynamically + """ + if not hasattr(self, u'_renderer'): + self._renderer = Registry().get(u'renderer') + return self._renderer + + renderer = property(_get_renderer) \ No newline at end of file diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 7e6879bdf..7562c590f 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -34,14 +34,10 @@ from collections import deque from PyQt4 import QtCore, QtGui -from openlp.core.lib import OpenLPToolbar, Receiver, ItemCapabilities, \ - translate, build_icon, build_html, PluginManager, ServiceItem, \ - ImageSource, SlideLimits, ServiceItemAction, Settings -from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList +from openlp.core.lib import OpenLPToolbar, Receiver, ItemCapabilities, translate, build_icon, build_html, \ + ServiceItem, ImageSource, SlideLimits, ServiceItemAction, Settings, Registry +from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList, DisplayControllerType from openlp.core.lib.ui import UiStrings, create_action -from openlp.core.lib import SlideLimits, ServiceItemAction -from openlp.core.ui import HideMode, MainDisplay, Display, ScreenList, \ - DisplayControllerType from openlp.core.utils.actions import ActionList, CategoryOrder log = logging.getLogger(__name__) @@ -510,7 +506,7 @@ class SlideController(DisplayController): # rebuild display as screen size changed if self.display: self.display.close() - self.display = MainDisplay(self, self.imageManager, self.isLive, self) + self.display = MainDisplay(self, self.isLive, self) self.display.setup() if self.isLive: self.__addActionsToWidget(self.display) @@ -525,7 +521,7 @@ class SlideController(DisplayController): self.previewDisplay.setup() serviceItem = ServiceItem() self.previewDisplay.webView.setHtml(build_html(serviceItem, self.previewDisplay.screen, None, self.isLive, - plugins=PluginManager.get_instance().plugins)) + plugins=self.plugin_manager.plugins)) self.mediaController.setup_display(self.previewDisplay,True) if self.serviceItem: self.refreshServiceItem() @@ -1283,3 +1279,13 @@ class SlideController(DisplayController): def onTrackTriggered(self): action = self.sender() self.display.audioPlayer.goTo(action.data()) + + def _get_plugin_manager(self): + """ + Adds the plugin manager to the class dynamically + """ + if not hasattr(self, u'_plugin_manager'): + self._plugin_manager = Registry().get(u'plugin_manager') + return self._plugin_manager + + plugin_manager = property(_get_plugin_manager) \ No newline at end of file diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 8a3bbc28c..319e22494 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -37,7 +37,7 @@ from xml.etree.ElementTree import ElementTree, XML from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, get_text_file_string, build_icon, Receiver, SettingsManager, translate, \ - check_item_selected, check_directory_exists, create_thumb, validate_thumb, ImageSource, Settings + check_item_selected, check_directory_exists, create_thumb, validate_thumb, ImageSource, Settings, Registry from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, BackgroundGradientType from openlp.core.lib.ui import UiStrings, critical_error_message_box, create_widget_action from openlp.core.theme import Theme @@ -52,6 +52,7 @@ class ThemeManager(QtGui.QWidget): """ def __init__(self, mainwindow, parent=None): QtGui.QWidget.__init__(self, parent) + Registry().register(u'theme_manager', self) self.mainwindow = mainwindow self.settingsSection = u'themes' self.themeForm = ThemeForm(self) @@ -261,11 +262,10 @@ class ThemeManager(QtGui.QWidget): old_theme_data = self.getThemeData(old_theme_name) self.cloneThemeData(old_theme_data, new_theme_name) self.deleteTheme(old_theme_name) - for plugin in self.mainwindow.pluginManager.plugins: + for plugin in self.plugin_manager.plugins: if plugin.usesTheme(old_theme_name): plugin.renameTheme(old_theme_name, new_theme_name) - self.mainwindow.renderer.update_theme( - new_theme_name, old_theme_name) + self.renderer.update_theme(new_theme_name, old_theme_name) self.loadThemes() def onCopyTheme(self): @@ -312,7 +312,7 @@ class ThemeManager(QtGui.QWidget): self.themeForm.theme = theme self.themeForm.exec_(True) self.oldBackgroundImage = None - self.mainwindow.renderer.update_theme(theme.theme_name) + self.renderer.update_theme(theme.theme_name) self.loadThemes() def onDeleteTheme(self): @@ -327,7 +327,7 @@ class ThemeManager(QtGui.QWidget): row = self.themeListWidget.row(item) self.themeListWidget.takeItem(row) self.deleteTheme(theme) - self.mainwindow.renderer.update_theme(theme, only_delete=True) + self.renderer.update_theme(theme, only_delete=True) # As we do not reload the themes, push out the change. Reload the # list as the internal lists and events need to be triggered. self._pushThemes() @@ -631,9 +631,9 @@ class ThemeManager(QtGui.QWidget): """ self._writeTheme(theme, image_from, image_to) if theme.background_type == BackgroundType.to_string(BackgroundType.Image): - self.mainwindow.imageManager.updateImageBorder(theme.background_filename, + self.image_manager.updateImageBorder(theme.background_filename, ImageSource.Theme, QtGui.QColor(theme.background_border_color)) - self.mainwindow.imageManager.processUpdates() + self.image_manager.processUpdates() def _writeTheme(self, theme, image_from, image_to): """ @@ -698,7 +698,7 @@ class ThemeManager(QtGui.QWidget): Flag to tell message lines per page need to be generated. """ log.debug(u'generateImage \n%s ', theme_data) - return self.mainwindow.renderer.generate_preview(theme_data, forcePage) + return self.renderer.generate_preview(theme_data, forcePage) def getPreviewImage(self, theme): """ @@ -748,7 +748,7 @@ class ThemeManager(QtGui.QWidget): return False # check for use in the system else where. if testPlugin: - for plugin in self.mainwindow.pluginManager.plugins: + for plugin in self.plugin_manager.plugins: if plugin.usesTheme(theme): critical_error_message_box(translate('OpenLP.ThemeManager', 'Validation Error'), translate('OpenLP.ThemeManager', 'Theme %s is used in the %s plugin.') % @@ -806,3 +806,32 @@ class ThemeManager(QtGui.QWidget): new_theme.display_vertical_align = vAlignCorrection return new_theme.extract_xml() + def _get_renderer(self): + """ + Adds the Renderer to the class dynamically + """ + if not hasattr(self, u'_renderer'): + self._renderer = Registry().get(u'renderer') + return self._renderer + + renderer = property(_get_renderer) + + def _get_image_manager(self): + """ + Adds the image manager to the class dynamically + """ + if not hasattr(self, u'_image_manager'): + self._image_manager = Registry().get(u'image_manager') + return self._image_manager + + image_manager = property(_get_image_manager) + + def _get_plugin_manager(self): + """ + Adds the Renderer to the class dynamically + """ + if not hasattr(self, u'_plugin_manager'): + self._plugin_manager = Registry().get(u'plugin_manager') + return self._plugin_manager + + plugin_manager = property(_get_plugin_manager) \ No newline at end of file