From a5fa986bdd20844ad2ea395eb8eadd17e8f0ddc6 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sun, 20 May 2012 21:11:27 +0200 Subject: [PATCH] continued work --- openlp/core/lib/renderer.py | 62 +++++++++++++++++++++++----------- openlp/core/lib/serviceitem.py | 22 ++++++++---- openlp/core/ui/themeform.py | 1 - openlp/core/ui/thememanager.py | 4 +-- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 624b30120..16efcf9ea 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -77,8 +77,10 @@ class Renderer(object): self.force_page = False self.display = MainDisplay(None, self.imageManager, False, self) self.display.setup() - self.theme_dimensions = {} + self._theme_dimensions = {} self._calculate_default() + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'theme_update_global'), self.set_global_theme) def update_display(self): """ @@ -92,23 +94,29 @@ class Renderer(object): self.bg_frame = None self._calculate_default() - def set_theme(self, theme_name): + def update_theme(self): + self._theme_dimensions = {} + + def _set_theme(self, theme_name): """ + Helper method to save theme names and theme data. """ - if theme_name not in self.theme_dimensions: + if theme_name not in self._theme_dimensions: theme_data = self.themeManager.getThemeData(theme_name) main_rect = self.get_main_rectangle(theme_data) footer_rect = self.get_footer_rectangle(theme_data) - self.theme_dimensions[theme_name] = [theme_data, main_rect, footer_rect] + self._theme_dimensions[theme_name] = \ + [theme_data, main_rect, footer_rect] else: - theme_data, main_rect, footer_rect = self.theme_dimensions[theme_name] + theme_data, main_rect, footer_rect = \ + self._theme_dimensions[theme_name] # if No file do not update cache if theme_data.background_filename: self.imageManager.add_image(theme_data.theme_name, theme_data.background_filename, u'theme', QtGui.QColor(theme_data.background_border_color)) - def post_render(self, override_theme_data): + def post_render(self, override_theme_data=None): """ """ # Just assume we use the global theme. @@ -120,35 +128,44 @@ class Renderer(object): theme_to_use = self.service_theme elif self.theme_level == ThemeLevel.Song and self.item_theme: theme_to_use = self.item_theme - theme_data, main_rect, footer_rect = self.theme_dimensions[theme_to_use] - if override_theme_data: + if override_theme_data is None: + theme_data, main_rect, footer_rect = \ + self._theme_dimensions[theme_to_use] + else: + # Ignore everything and use own theme data. theme_data = override_theme_data + main_rect = self.get_main_rectangle(override_theme_data) + footer_rect = self.get_footer_rectangle(override_theme_data) self._set_text_rectangle(theme_data, main_rect, footer_rect) return theme_data, self._rect, self._rect_footer def set_theme_level(self, theme_level): """ + Sets the theme level. + + ``theme_level`` + The theme level to be used. """ self.theme_level = theme_level def set_global_theme(self, global_theme_name): """ - Set the global-level theme and the theme level. + Set the global-level theme name. - ``global_theme`` - The global-level theme to be set. + ``global_theme_name`` + The global-level theme's name. """ - self.set_theme(global_theme_name) + self._set_theme(global_theme_name) self.global_theme = global_theme_name def set_service_theme(self, service_theme_name): """ Set the service-level theme. - ``service_theme`` - The service-level theme to be set. + ``service_theme_name`` + The service level theme's name. """ - self.set_theme(service_theme_name) + self._set_theme(service_theme_name) self.service_theme = service_theme_name def set_override_theme(self, override_theme_name): @@ -160,7 +177,7 @@ class Renderer(object): The name of the song-level theme. None means the service item wants to use the given value. """ - self.set_theme(override_theme_name) + self._set_theme(override_theme_name) self.item_theme = override_theme_name def generate_preview(self, theme_data, force_page=False): @@ -178,8 +195,6 @@ class Renderer(object): self.force_page = force_page # build a service item to generate preview serviceItem = ServiceItem() - serviceItem.theme = theme_data.theme_name - #self.set_override_theme(theme_data) if self.force_page: # make big page for theme edit dialog to get line count serviceItem.add_from_text(u'', VERSE_FOR_LINE_COUNT) @@ -188,7 +203,16 @@ class Renderer(object): serviceItem.add_from_text(u'', VERSE) serviceItem.renderer = self serviceItem.raw_footer = FOOTER - serviceItem.render(theme_data) + # if No file do not update cache + if theme_data.background_filename: + self.imageManager.add_image(theme_data.theme_name, + theme_data.background_filename, u'theme', + QtGui.QColor(theme_data.background_border_color)) + theme_data, main, footer = self.post_render(theme_data) + serviceItem.themedata = theme_data + serviceItem.main = main + serviceItem.footer = footer + serviceItem.render(True) if not self.force_page: self.display.buildHtml(serviceItem) raw_html = serviceItem.get_rendered_frame(0) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 734144172..a9f2b4e47 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -28,7 +28,7 @@ The :mod:`serviceitem` provides the service item functionality including the type and capability of an item. """ - +import time import cgi import datetime import logging @@ -39,6 +39,9 @@ from openlp.core.lib import build_icon, clean_tags, expand_tags, translate log = logging.getLogger(__name__) +COUNT = 0 +TIME_ = datetime.timedelta() + class ServiceItemType(object): """ Defines the type of service item @@ -158,20 +161,19 @@ class ServiceItem(object): self.icon = icon self.iconic_representation = build_icon(icon) - def render(self, use_override=False): + def render(self, provides_own_theme_data=False): """ The render method is what generates the frames for the screen and obtains the display information from the renderer. At this point all slides are built for the given display size. """ - import time - import datetime start = time.time() log.debug(u'Render called') self._display_frames = [] self.bg_image_bytes = None - self.renderer.set_override_theme(self.theme) - self.themedata, self.main, self.footer = self.renderer.post_render(use_override) + if not provides_own_theme_data: + self.renderer.set_override_theme(self.theme) + self.themedata, self.main, self.footer = self.renderer.post_render() if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') for slide in self._raw_frames: @@ -197,7 +199,13 @@ class ServiceItem(object): if self.raw_footer is None: self.raw_footer = [] self.foot_text = u'
'.join(filter(None, self.raw_footer)) - print unicode(datetime.timedelta(seconds=(time.time() - start))) + global COUNT + COUNT += 1 + global TIME_ + TIME_ += datetime.timedelta(seconds=(time.time() - start)) + print u'%s (average %s)' % ( + unicode(datetime.timedelta(seconds=(time.time() - start))), + unicode(TIME_ / COUNT)) def add_from_image(self, path, title, background=None): """ diff --git a/openlp/core/ui/themeform.py b/openlp/core/ui/themeform.py index 5d8e4ed5a..f8c061851 100644 --- a/openlp/core/ui/themeform.py +++ b/openlp/core/ui/themeform.py @@ -250,7 +250,6 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard): Generate layout preview and display the form. """ self.updateTheme() - screen_size = self.screens.current[u'size'] width = self.thememanager.mainwindow.renderer.width height = self.thememanager.mainwindow.renderer.height pixmap = QtGui.QPixmap(width, height) diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 665c435b9..6d8778ef3 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -247,8 +247,7 @@ class ThemeManager(QtGui.QWidget): QtCore.QSettings().setValue( self.settingsSection + u'/global theme', QtCore.QVariant(self.global_theme)) - Receiver.send_message(u'theme_update_global', - self.global_theme) + Receiver.send_message(u'theme_update_global', self.global_theme) self._pushThemes() def onAddTheme(self): @@ -667,6 +666,7 @@ class ThemeManager(QtGui.QWidget): u'theme', QtGui.QColor(theme.background_border_color)) self.mainwindow.imageManager.process_updates() self.loadThemes() + #self.mainwindow.renderer.update_theme() def _writeTheme(self, theme, image_from, image_to): """