From c93b073da81dee7c6a315814e14084ab38c552b7 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 27 Mar 2011 09:19:00 +0100 Subject: [PATCH 01/14] Renderer Cleanups - started --- openlp/core/lib/__init__.py | 1 - openlp/core/lib/renderer.py | 121 --------------------- openlp/core/lib/rendermanager.py | 175 ++++++++++++++++++++++++------- openlp/core/lib/serviceitem.py | 2 +- 4 files changed, 137 insertions(+), 162 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index ddb1ae9b1..6f43a7bf2 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -338,6 +338,5 @@ from htmlbuilder import build_html, build_lyrics_format_css, \ build_lyrics_outline_css from toolbar import OpenLPToolbar from dockwidget import OpenLPDockWidget -from renderer import Renderer from rendermanager import RenderManager from mediamanageritem import MediaManagerItem diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 0eeae6abd..a866072e7 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -23,125 +23,4 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### -""" -The :mod:`renderer` module enables OpenLP to take the input from plugins and -format it for the output display. -""" -import logging -from PyQt4 import QtWebKit - -from openlp.core.lib import expand_tags, build_lyrics_format_css, \ - build_lyrics_outline_css, Receiver - -log = logging.getLogger(__name__) - -class Renderer(object): - """ - Genarates a pixmap image of a array of text. The Text is formatted to - make sure it fits on the screen and if not extra frames are generated. - """ - log.info(u'Renderer Loaded') - - def __init__(self): - """ - Initialise the renderer. - """ - self._rect = None - self.theme_name = None - self._theme = None - - def set_theme(self, theme): - """ - Set the theme to be used. - - ``theme`` - The theme to be used. - """ - log.debug(u'set theme') - self._theme = theme - self.theme_name = theme.theme_name - - def set_text_rectangle(self, rect_main, rect_footer): - """ - Sets the rectangle within which text should be rendered. - - ``rect_main`` - The main text block. - - ``rect_footer`` - The footer text block. - """ - log.debug(u'set_text_rectangle %s , %s' % (rect_main, rect_footer)) - self._rect = rect_main - self._rect_footer = rect_footer - self.page_width = self._rect.width() - self.page_height = self._rect.height() - if self._theme.font_main_shadow: - self.page_width -= int(self._theme.font_main_shadow_size) - self.page_height -= int(self._theme.font_main_shadow_size) - self.web = QtWebKit.QWebView() - self.web.setVisible(False) - self.web.resize(self.page_width, self.page_height) - self.web_frame = self.web.page().mainFrame() - # Adjust width and height to account for shadow. outline done in css - self.page_shell = u'' \ - u'
' % \ - (build_lyrics_format_css(self._theme, self.page_width, - self.page_height), build_lyrics_outline_css(self._theme)) - - def format_slide(self, words, line_break, force_page=False): - """ - Figure out how much text can appear on a slide, using the current - theme settings. - - ``words`` - The words to be fitted on the slide. - - ``line_break`` - Add line endings after each line of text used for bibles. - - ``force_page`` - Flag to tell message lines in page. - - """ - log.debug(u'format_slide - Start') - line_end = u'' - if line_break: - line_end = u'
' - words = words.replace(u'\r\n', u'\n') - verses_text = words.split(u'\n') - text = [] - for verse in verses_text: - lines = verse.split(u'\n') - for line in lines: - text.append(line) - formatted = [] - html_text = u'' - styled_text = u'' - line_count = 0 - for line in text: - if line_count != -1: - line_count += 1 - styled_line = expand_tags(line) + line_end - styled_text += styled_line - html = self.page_shell + styled_text + u'
' - self.web.setHtml(html) - # Text too long so go to next page - if self.web_frame.contentsSize().height() > self.page_height: - if force_page and line_count > 0: - Receiver.send_message(u'theme_line_count', line_count) - line_count = -1 - if html_text.endswith(u'
'): - html_text = html_text[:len(html_text)-4] - formatted.append(html_text) - html_text = u'' - styled_text = styled_line - html_text += line + line_end - if html_text.endswith(u'
'): - html_text = html_text[:len(html_text)-4] - formatted.append(html_text) - log.debug(u'format_slide - End') - return formatted diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index 39c2c3b27..a88bd6e39 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -26,9 +26,10 @@ import logging -from PyQt4 import QtCore +from PyQt4 import QtCore, QtWebKit -from openlp.core.lib import Renderer, ServiceItem, ImageManager +from openlp.core.lib import ServiceItem, ImageManager, expand_tags, \ + build_lyrics_format_css, build_lyrics_outline_css, Receiver from openlp.core.lib.theme import ThemeLevel from openlp.core.ui import MainDisplay @@ -70,25 +71,25 @@ class RenderManager(object): self.display = MainDisplay(self, screens, False) self.display.imageManager = self.image_manager self.theme_manager = theme_manager - self.renderer = Renderer() - self.calculate_default(self.screens.current[u'size']) self.theme = u'' self.service_theme = u'' self.theme_level = u'' self.override_background = None self.theme_data = None self.force_page = False + self.r_theme_name = None + self._r_theme = None def update_display(self): """ Updates the render manager's information about the current screen. """ log.debug(u'Update Display') - self.calculate_default(self.screens.current[u'size']) + self._calculate_default(self.screens.current[u'size']) self.display = MainDisplay(self, self.screens, False) self.display.imageManager = self.image_manager self.display.setup() - self.renderer.bg_frame = None + self.bg_frame = None self.theme_data = None self.image_manager.update_display(self.width, self.height) @@ -155,7 +156,7 @@ class RenderManager(object): self.theme = self.service_theme else: self.theme = self.global_theme - if self.theme != self.renderer.theme_name or self.theme_data is None \ + if self.theme != self.r_theme_name or self.theme_data is None \ or overrideLevels: log.debug(u'theme is now %s', self.theme) # Force the theme to be the one passed in. @@ -163,37 +164,12 @@ class RenderManager(object): self.theme_data = theme else: self.theme_data = self.theme_manager.getThemeData(self.theme) - self.calculate_default(self.screens.current[u'size']) - self.renderer.set_theme(self.theme_data) - self.build_text_rectangle(self.theme_data) + self._calculate_default(self.screens.current[u'size']) + self._set_theme(self.theme_data) + self._build_text_rectangle(self.theme_data) self.image_manager.add_image(self.theme_data.theme_name, self.theme_data.background_filename) - return self.renderer._rect, self.renderer._rect_footer - - def build_text_rectangle(self, theme): - """ - Builds a text block using the settings in ``theme`` - and the size of the display screen.height. - - ``theme`` - The theme to build a text block for. - """ - log.debug(u'build_text_rectangle') - main_rect = None - footer_rect = None - if not theme.font_main_override: - main_rect = QtCore.QRect(10, 0, self.width - 20, self.footer_start) - else: - main_rect = QtCore.QRect(theme.font_main_x, theme.font_main_y, - theme.font_main_width - 1, theme.font_main_height - 1) - if not theme.font_footer_override: - footer_rect = QtCore.QRect(10, self.footer_start, self.width - 20, - self.height - self.footer_start) - else: - footer_rect = QtCore.QRect(theme.font_footer_x, - theme.font_footer_y, theme.font_footer_width - 1, - theme.font_footer_height - 1) - self.renderer.set_text_rectangle(main_rect, footer_rect) + return self._rect, self._rect_footer def generate_preview(self, theme_data, force_page=False): """ @@ -227,7 +203,7 @@ class RenderManager(object): raw_html = serviceItem.get_rendered_frame(0) preview = self.display.text(raw_html) # Reset the real screen size for subsequent render requests - self.calculate_default(self.screens.current[u'size']) + self._calculate_default(self.screens.current[u'size']) return preview def format_slide(self, words, line_break): @@ -241,9 +217,9 @@ class RenderManager(object): Add line endings after each line of text used for bibles. """ log.debug(u'format slide') - return self.renderer.format_slide(words, line_break, self.force_page) + return self._format_slide(words, line_break, self.force_page) - def calculate_default(self, screen): + def _calculate_default(self, screen): """ Calculate the default dimentions of the screen. @@ -258,3 +234,124 @@ class RenderManager(object): self.width, self.height, self.screen_ratio) # 90% is start of footer self.footer_start = int(self.height * 0.90) + + def _build_text_rectangle(self, theme): + """ + Builds a text block using the settings in ``theme`` + and the size of the display screen.height. + + ``theme`` + The theme to build a text block for. + """ + log.debug(u'_build_text_rectangle') + main_rect = None + footer_rect = None + if not theme.font_main_override: + main_rect = QtCore.QRect(10, 0, self.width - 20, self.footer_start) + else: + main_rect = QtCore.QRect(theme.font_main_x, theme.font_main_y, + theme.font_main_width - 1, theme.font_main_height - 1) + if not theme.font_footer_override: + footer_rect = QtCore.QRect(10, self.footer_start, self.width - 20, + self.height - self.footer_start) + else: + footer_rect = QtCore.QRect(theme.font_footer_x, + theme.font_footer_y, theme.font_footer_width - 1, + theme.font_footer_height - 1) + self._set_text_rectangle(main_rect, footer_rect) + + def _set_theme(self, theme): + """ + Set the theme to be used. + + ``theme`` + The theme to be used. + """ + log.debug(u'set theme') + self._r_theme = theme + self.r_theme_name = theme.theme_name + + def _set_text_rectangle(self, rect_main, rect_footer): + """ + Sets the rectangle within which text should be rendered. + + ``rect_main`` + The main text block. + + ``rect_footer`` + The footer text block. + """ + log.debug(u'set_text_rectangle %s , %s' % (rect_main, rect_footer)) + self._rect = rect_main + self._rect_footer = rect_footer + self.page_width = self._rect.width() + self.page_height = self._rect.height() + if self._r_theme.font_main_shadow: + self.page_width -= int(self._r_theme.font_main_shadow_size) + self.page_height -= int(self._r_theme.font_main_shadow_size) + self.web = QtWebKit.QWebView() + self.web.setVisible(False) + self.web.resize(self.page_width, self.page_height) + self.web_frame = self.web.page().mainFrame() + # Adjust width and height to account for shadow. outline done in css + self.page_shell = u'' \ + u'
' % \ + (build_lyrics_format_css(self._r_theme, self.page_width, + self.page_height), build_lyrics_outline_css(self._r_theme)) + + def _format_slide(self, words, line_break, force_page=False): + """ + Figure out how much text can appear on a slide, using the current + theme settings. + + ``words`` + The words to be fitted on the slide. + + ``line_break`` + Add line endings after each line of text used for bibles. + + ``force_page`` + Flag to tell message lines in page. + + """ + log.debug(u'format_slide - Start') + line_end = u'' + if line_break: + line_end = u'
' + words = words.replace(u'\r\n', u'\n') + verses_text = words.split(u'\n') + text = [] + for verse in verses_text: + lines = verse.split(u'\n') + for line in lines: + text.append(line) + formatted = [] + html_text = u'' + styled_text = u'' + line_count = 0 + for line in text: + if line_count != -1: + line_count += 1 + styled_line = expand_tags(line) + line_end + styled_text += styled_line + html = self.page_shell + styled_text + u'
' + self.web.setHtml(html) + # Text too long so go to next page + if self.web_frame.contentsSize().height() > self.page_height: + if force_page and line_count > 0: + Receiver.send_message(u'theme_line_count', line_count) + line_count = -1 + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + html_text = u'' + styled_text = styled_line + html_text += line + line_end + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + log.debug(u'format_slide - End') + return formatted + diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 63b9dce00..249236f98 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -165,7 +165,7 @@ class ServiceItem(object): theme = self.theme if self.theme else None self.main, self.footer = \ self.render_manager.set_override_theme(theme, useOverride) - self.themedata = self.render_manager.renderer._theme + self.themedata = self.render_manager._r_theme if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') for slide in self._raw_frames: From 239b62a488d2cdda553cecb1e75ce1b0eab1c1a4 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 28 Mar 2011 18:04:31 +0100 Subject: [PATCH 02/14] Render Ester 8:9 on more than 1 page --- openlp/core/lib/rendermanager.py | 109 ++++++++++++++----------- openlp/core/lib/serviceitem.py | 14 ++-- openlp/plugins/bibles/lib/mediaitem.py | 1 + openlp/plugins/custom/lib/mediaitem.py | 1 + openlp/plugins/songs/lib/mediaitem.py | 1 + 5 files changed, 74 insertions(+), 52 deletions(-) diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index d866fd115..c3acc8c34 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -29,7 +29,8 @@ import logging from PyQt4 import QtCore, QtWebKit from openlp.core.lib import ServiceItem, ImageManager, expand_tags, \ - build_lyrics_format_css, build_lyrics_outline_css, Receiver + build_lyrics_format_css, build_lyrics_outline_css, Receiver, \ + ItemCapabilities from openlp.core.lib.theme import ThemeLevel from openlp.core.ui import MainDisplay @@ -77,8 +78,6 @@ class RenderManager(object): self.override_background = None self.theme_data = None self.force_page = False - self.r_theme_name = None - self._r_theme = None def update_display(self): """ @@ -157,19 +156,16 @@ class RenderManager(object): self.theme = self.service_theme else: self.theme = self.global_theme - if self.theme != self.r_theme_name or self.theme_data is None \ - or overrideLevels: - log.debug(u'theme is now %s', self.theme) - # Force the theme to be the one passed in. - if overrideLevels: - self.theme_data = theme - else: - self.theme_data = self.theme_manager.getThemeData(self.theme) - self._calculate_default(self.screens.current[u'size']) - self._set_theme(self.theme_data) - self._build_text_rectangle(self.theme_data) - self.image_manager.add_image(self.theme_data.theme_name, - self.theme_data.background_filename) + log.debug(u'theme is now %s', self.theme) + # Force the theme to be the one passed in. + if overrideLevels: + self.theme_data = theme + else: + self.theme_data = self.theme_manager.getThemeData(self.theme) + self._calculate_default(self.screens.current[u'size']) + self._build_text_rectangle(self.theme_data) + self.image_manager.add_image(self.theme_data.theme_name, + self.theme_data.background_filename) return self._rect, self._rect_footer def generate_preview(self, theme_data, force_page=False): @@ -207,18 +203,29 @@ class RenderManager(object): self._calculate_default(self.screens.current[u'size']) return preview - def format_slide(self, words, line_break): + def format_slide(self, slide, line_break, item): """ Calculate how much text can fit on a slide. - ``words`` + ``slide`` The words to go on the slides. ``line_break`` Add line endings after each line of text used for bibles. """ log.debug(u'format slide') - return self._format_slide(words, line_break, self.force_page) + # clean up line endings + slide = slide.replace(u'\r\n', u'\n') + lines = self._lines(slide) + pages = self._paginate_slide(lines, line_break, self.force_page) + if len(pages) > 1: + if item.is_capable(ItemCapabilities.AllowsVirtualSplit): + lines = self._words(slide) + pages = self._paginate_slide(lines, line_break, self.force_page) + elif item.is_capable(ItemCapabilities.AllowsWordSplit): + lines = self._words(slide) + pages = self._paginate_slide(lines, False, self.force_page) + return pages def _calculate_default(self, screen): """ @@ -261,17 +268,6 @@ class RenderManager(object): theme.font_footer_height - 1) self._set_text_rectangle(main_rect, footer_rect) - def _set_theme(self, theme): - """ - Set the theme to be used. - - ``theme`` - The theme to be used. - """ - log.debug(u'set theme') - self._r_theme = theme - self.r_theme_name = theme.theme_name - def _set_text_rectangle(self, rect_main, rect_footer): """ Sets the rectangle within which text should be rendered. @@ -287,9 +283,9 @@ class RenderManager(object): self._rect_footer = rect_footer self.page_width = self._rect.width() self.page_height = self._rect.height() - if self._r_theme.font_main_shadow: - self.page_width -= int(self._r_theme.font_main_shadow_size) - self.page_height -= int(self._r_theme.font_main_shadow_size) + if self.theme_data.font_main_shadow: + self.page_width -= int(self.theme_data.font_main_shadow_size) + self.page_height -= int(self.theme_data.font_main_shadow_size) self.web = QtWebKit.QWebView() self.web.setVisible(False) self.web.resize(self.page_width, self.page_height) @@ -299,16 +295,16 @@ class RenderManager(object): u'*{margin: 0; padding: 0; border: 0;} '\ u'#main {position:absolute; top:0px; %s %s}' \ u'
' % \ - (build_lyrics_format_css(self._r_theme, self.page_width, - self.page_height), build_lyrics_outline_css(self._r_theme)) + (build_lyrics_format_css(self.theme_data, self.page_width, + self.page_height), build_lyrics_outline_css(self.theme_data)) - def _format_slide(self, words, line_break, force_page=False): + def _paginate_slide(self, lines, line_break, force_page=False): """ Figure out how much text can appear on a slide, using the current theme settings. - ``words`` - The words to be fitted on the slide. + ``lines`` + The words to be fitted on the slide split into lines. ``line_break`` Add line endings after each line of text used for bibles. @@ -321,18 +317,11 @@ class RenderManager(object): line_end = u'' if line_break: line_end = u'
' - words = words.replace(u'\r\n', u'\n') - verses_text = words.split(u'\n') - text = [] - for verse in verses_text: - lines = verse.split(u'\n') - for line in lines: - text.append(line) formatted = [] html_text = u'' styled_text = u'' line_count = 0 - for line in text: + for line in lines: if line_count != -1: line_count += 1 styled_line = expand_tags(line) + line_end @@ -356,3 +345,31 @@ class RenderManager(object): log.debug(u'format_slide - End') return formatted + def _lines(self, words): + """ + Split the slide up by physical line + """ + # this parse we do not want to use this so remove it + words = words.replace(u'[---]', u'') + verses_text = words.split(u'\n') + text = [] + for verse in verses_text: + lines = verse.split(u'\n') + for line in lines: + text.append(line) + return text + + def _words(self, words): + """ + Split the slide up by word so can wrap better + """ + # this parse we are wordy + words = words.replace(u'\n', u' ') + verses_text = words.split(u' ') + text = [] + for verse in verses_text: + lines = verse.split(u' ') + for line in lines: + text.append(line + u' ') + return text + diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 7496bc6b0..f996c3f97 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -63,6 +63,8 @@ class ItemCapabilities(object): ProvidesOwnDisplay = 10 AllowsDetailedTitleDisplay = 11 AllowsVariableStartTime = 12 + AllowsVirtualSplit = 13 + AllowsWordSplit = 14 class ServiceItem(object): @@ -81,7 +83,7 @@ class ServiceItem(object): The plugin that this service item belongs to. """ if plugin: - self.render_manager = plugin.renderManager + self.renderer = plugin.renderManager self.name = plugin.name self.title = u'' self.shortname = u'' @@ -166,13 +168,13 @@ class ServiceItem(object): line_break = False theme = self.theme if self.theme else None self.main, self.footer = \ - self.render_manager.set_override_theme(theme, useOverride) - self.themedata = self.render_manager._r_theme + self.renderer.set_override_theme(theme, useOverride) + self.themedata = self.renderer.theme_data if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') for slide in self._raw_frames: - formatted = self.render_manager \ - .format_slide(slide[u'raw_slide'], line_break) + formatted = self.renderer \ + .format_slide(slide[u'raw_slide'], line_break, self) for page in formatted: self._display_frames.append( {u'title': clean_tags(page), @@ -205,7 +207,7 @@ class ServiceItem(object): """ self.service_item_type = ServiceItemType.Image self._raw_frames.append({u'title': title, u'path': path}) - self.render_manager.image_manager.add_image(title, path) + self.renderer.image_manager.add_image(title, path) self._new_item() def add_from_text(self, title, raw_slide, verse_tag=None): diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index a9694fd0c..405507523 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -685,6 +685,7 @@ class BibleMediaItem(MediaManagerItem): service_item.add_capability(ItemCapabilities.NoLineBreaks) service_item.add_capability(ItemCapabilities.AllowsPreview) service_item.add_capability(ItemCapabilities.AllowsLoop) + service_item.add_capability(ItemCapabilities.AllowsWordSplit) # Service Item: Title service_item.title = u', '.join(raw_title) # Service Item: Theme diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index 69265ed75..0bb9c3aa8 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -139,6 +139,7 @@ class CustomMediaItem(MediaManagerItem): service_item.add_capability(ItemCapabilities.AllowsEdit) service_item.add_capability(ItemCapabilities.AllowsPreview) service_item.add_capability(ItemCapabilities.AllowsLoop) + service_item.add_capability(ItemCapabilities.AllowsVirtualSplit) customSlide = self.parent.manager.get_object(CustomSlide, item_id) title = customSlide.title credit = customSlide.credits diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index 723b6c5d5..72509fab1 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -337,6 +337,7 @@ class SongMediaItem(MediaManagerItem): service_item.add_capability(ItemCapabilities.AllowsLoop) service_item.add_capability(ItemCapabilities.OnLoadUpdate) service_item.add_capability(ItemCapabilities.AddIfNewItem) + service_item.add_capability(ItemCapabilities.AllowsVirtualSplit) song = self.parent.manager.get_object(Song, item_id) service_item.theme = song.theme_name service_item.edit_id = item_id From 9aa6bba3a265b88b6a6addc7843cdcc9b18764af Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 28 Mar 2011 19:01:58 +0100 Subject: [PATCH 03/14] Virtual Splits now work --- openlp/core/lib/rendermanager.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py index c3acc8c34..43210259a 100644 --- a/openlp/core/lib/rendermanager.py +++ b/openlp/core/lib/rendermanager.py @@ -220,8 +220,15 @@ class RenderManager(object): pages = self._paginate_slide(lines, line_break, self.force_page) if len(pages) > 1: if item.is_capable(ItemCapabilities.AllowsVirtualSplit): - lines = self._words(slide) - pages = self._paginate_slide(lines, line_break, self.force_page) + # do not forget the line breaks ! + slides = slide.split(u'\n[###]\n') + pages = [] + for slide in slides: + lines = self._lines(slide) + new_pages = self._paginate_slide(lines, line_break, + self.force_page) + for page in new_pages: + pages.append(page) elif item.is_capable(ItemCapabilities.AllowsWordSplit): lines = self._words(slide) pages = self._paginate_slide(lines, False, self.force_page) From c8a7594685c4babfe5e02b27645d46ccda89ac56 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 28 Mar 2011 19:12:46 +0100 Subject: [PATCH 04/14] Bye Bye RenderManager --- openlp/core/lib/__init__.py | 2 +- openlp/core/lib/renderer.py | 356 ++++++++++++++++++++++++++++ openlp/core/lib/rendermanager.py | 382 ------------------------------ openlp/core/ui/mainwindow.py | 12 +- openlp/core/ui/servicemanager.py | 6 +- openlp/core/ui/slidecontroller.py | 2 +- openlp/core/ui/themestab.py | 2 +- 7 files changed, 368 insertions(+), 394 deletions(-) delete mode 100644 openlp/core/lib/rendermanager.py diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 6f43a7bf2..dc25fae0f 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -338,5 +338,5 @@ from htmlbuilder import build_html, build_lyrics_format_css, \ build_lyrics_outline_css from toolbar import OpenLPToolbar from dockwidget import OpenLPDockWidget -from rendermanager import RenderManager +from renderer import Renderer from mediamanageritem import MediaManagerItem diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index a866072e7..9256eb096 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -24,3 +24,359 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +import logging + +from PyQt4 import QtCore, QtWebKit + +from openlp.core.lib import ServiceItem, ImageManager, expand_tags, \ + build_lyrics_format_css, build_lyrics_outline_css, Receiver, \ + ItemCapabilities +from openlp.core.lib.theme import ThemeLevel +from openlp.core.ui import MainDisplay + +log = logging.getLogger(__name__) + +VERSE = u'The Lord said to {r}Noah{/r}: \n' \ + 'There\'s gonna be a {su}floody{/su}, {sb}floody{/sb}\n' \ + 'The Lord said to {g}Noah{/g}:\n' \ + 'There\'s gonna be a {st}floody{/st}, {it}floody{/it}\n' \ + 'Get those children out of the muddy, muddy \n' \ + '{r}C{/r}{b}h{/b}{bl}i{/bl}{y}l{/y}{g}d{/g}{pk}' \ + 'r{/pk}{o}e{/o}{pp}n{/pp} of the Lord\n' +FOOTER = [u'Arky Arky (Unknown)', u'Public Domain', u'CCLI 123456'] + +class Renderer(object): + """ + Class to pull all Renderer interactions into one place. The plugins will + call helper methods to do the rendering but this class will provide + display defense code. + + ``theme_manager`` + The ThemeManager instance, used to get the current theme details. + + ``screens`` + Contains information about the Screens. + + ``screen_number`` + Defaults to *0*. The index of the output/display screen. + """ + log.info(u'RenderManager Loaded') + + def __init__(self, theme_manager, screens): + """ + Initialise the render manager. + """ + log.debug(u'Initilisation started') + self.screens = screens + self.image_manager = ImageManager() + self.display = MainDisplay(self, screens, False) + self.display.imageManager = self.image_manager + self.theme_manager = theme_manager + self.theme = u'' + self.service_theme = u'' + self.theme_level = u'' + self.override_background = None + self.theme_data = None + self.force_page = False + + def update_display(self): + """ + Updates the render manager's information about the current screen. + """ + log.debug(u'Update Display') + self._calculate_default(self.screens.current[u'size']) + self.display = MainDisplay(self, self.screens, False) + self.display.imageManager = self.image_manager + self.display.setup() + self.bg_frame = None + self.theme_data = None + self.image_manager.update_display(self.width, self.height) + + def set_global_theme(self, global_theme, theme_level=ThemeLevel.Global): + """ + Set the global-level theme and the theme level. + + ``global_theme`` + The global-level theme to be set. + + ``theme_level`` + Defaults to *``ThemeLevel.Global``*. The theme level, can be + ``ThemeLevel.Global``, ``ThemeLevel.Service`` or + ``ThemeLevel.Song``. + """ + self.global_theme = global_theme + self.theme_level = theme_level + self.global_theme_data = \ + self.theme_manager.getThemeData(self.global_theme) + self.theme_data = None + + def set_service_theme(self, service_theme): + """ + Set the service-level theme. + + ``service_theme`` + The service-level theme to be set. + """ + self.service_theme = service_theme + self.theme_data = None + + def set_override_theme(self, theme, overrideLevels=False): + """ + Set the appropriate theme depending on the theme level. + Called by the service item when building a display frame + + ``theme`` + The name of the song-level theme. None means the service + item wants to use the given value. + + ``overrideLevels`` + Used to force the theme data passed in to be used. + + """ + log.debug(u'set override theme to %s', theme) + theme_level = self.theme_level + if overrideLevels: + theme_level = ThemeLevel.Song + if theme_level == ThemeLevel.Global: + self.theme = self.global_theme + elif theme_level == ThemeLevel.Service: + if self.service_theme == u'': + self.theme = self.global_theme + else: + self.theme = self.service_theme + else: + # Images have a theme of -1 + if theme and theme != -1: + self.theme = theme + elif theme_level == ThemeLevel.Song or \ + theme_level == ThemeLevel.Service: + if self.service_theme == u'': + self.theme = self.global_theme + else: + self.theme = self.service_theme + else: + self.theme = self.global_theme + log.debug(u'theme is now %s', self.theme) + # Force the theme to be the one passed in. + if overrideLevels: + self.theme_data = theme + else: + self.theme_data = self.theme_manager.getThemeData(self.theme) + self._calculate_default(self.screens.current[u'size']) + self._build_text_rectangle(self.theme_data) + self.image_manager.add_image(self.theme_data.theme_name, + self.theme_data.background_filename) + return self._rect, self._rect_footer + + def generate_preview(self, theme_data, force_page=False): + """ + Generate a preview of a theme. + + ``theme_data`` + The theme to generated a preview for. + + ``force_page`` + Flag to tell message lines per page need to be generated. + """ + log.debug(u'generate preview') + # save value for use in format_slide + self.force_page = force_page + # set the default image size for previews + self.calculate_default(self.screens.preview[u'size']) + # build a service item to generate preview + serviceItem = ServiceItem() + serviceItem.theme = theme_data + if self.force_page: + # make big page for theme edit dialog to get line count + serviceItem.add_from_text(u'', VERSE + VERSE + VERSE, FOOTER) + else: + self.image_manager.del_image(theme_data.theme_name) + serviceItem.add_from_text(u'', VERSE, FOOTER) + serviceItem.render_manager = self + serviceItem.raw_footer = FOOTER + serviceItem.render(True) + if not self.force_page: + self.display.buildHtml(serviceItem) + raw_html = serviceItem.get_rendered_frame(0) + preview = self.display.text(raw_html) + # Reset the real screen size for subsequent render requests + self._calculate_default(self.screens.current[u'size']) + return preview + + def format_slide(self, slide, line_break, item): + """ + Calculate how much text can fit on a slide. + + ``slide`` + The words to go on the slides. + + ``line_break`` + Add line endings after each line of text used for bibles. + """ + log.debug(u'format slide') + # clean up line endings + slide = slide.replace(u'\r\n', u'\n') + lines = self._lines(slide) + pages = self._paginate_slide(lines, line_break, self.force_page) + if len(pages) > 1: + if item.is_capable(ItemCapabilities.AllowsVirtualSplit): + # do not forget the line breaks ! + slides = slide.split(u'\n[###]\n') + pages = [] + for slide in slides: + lines = self._lines(slide) + new_pages = self._paginate_slide(lines, line_break, + self.force_page) + for page in new_pages: + pages.append(page) + elif item.is_capable(ItemCapabilities.AllowsWordSplit): + lines = self._words(slide) + pages = self._paginate_slide(lines, False, self.force_page) + return pages + + def _calculate_default(self, screen): + """ + Calculate the default dimentions of the screen. + + ``screen`` + The QSize of the screen. + """ + log.debug(u'calculate default %s', screen) + self.width = screen.width() + self.height = screen.height() + self.screen_ratio = float(self.height) / float(self.width) + log.debug(u'calculate default %d, %d, %f', + self.width, self.height, self.screen_ratio) + # 90% is start of footer + self.footer_start = int(self.height * 0.90) + + def _build_text_rectangle(self, theme): + """ + Builds a text block using the settings in ``theme`` + and the size of the display screen.height. + + ``theme`` + The theme to build a text block for. + """ + log.debug(u'_build_text_rectangle') + main_rect = None + footer_rect = None + if not theme.font_main_override: + main_rect = QtCore.QRect(10, 0, self.width - 20, self.footer_start) + else: + main_rect = QtCore.QRect(theme.font_main_x, theme.font_main_y, + theme.font_main_width - 1, theme.font_main_height - 1) + if not theme.font_footer_override: + footer_rect = QtCore.QRect(10, self.footer_start, self.width - 20, + self.height - self.footer_start) + else: + footer_rect = QtCore.QRect(theme.font_footer_x, + theme.font_footer_y, theme.font_footer_width - 1, + theme.font_footer_height - 1) + self._set_text_rectangle(main_rect, footer_rect) + + def _set_text_rectangle(self, rect_main, rect_footer): + """ + Sets the rectangle within which text should be rendered. + + ``rect_main`` + The main text block. + + ``rect_footer`` + The footer text block. + """ + log.debug(u'set_text_rectangle %s , %s' % (rect_main, rect_footer)) + self._rect = rect_main + self._rect_footer = rect_footer + self.page_width = self._rect.width() + self.page_height = self._rect.height() + if self.theme_data.font_main_shadow: + self.page_width -= int(self.theme_data.font_main_shadow_size) + self.page_height -= int(self.theme_data.font_main_shadow_size) + self.web = QtWebKit.QWebView() + self.web.setVisible(False) + self.web.resize(self.page_width, self.page_height) + self.web_frame = self.web.page().mainFrame() + # Adjust width and height to account for shadow. outline done in css + self.page_shell = u'' \ + u'
' % \ + (build_lyrics_format_css(self.theme_data, self.page_width, + self.page_height), build_lyrics_outline_css(self.theme_data)) + + def _paginate_slide(self, lines, line_break, force_page=False): + """ + Figure out how much text can appear on a slide, using the current + theme settings. + + ``lines`` + The words to be fitted on the slide split into lines. + + ``line_break`` + Add line endings after each line of text used for bibles. + + ``force_page`` + Flag to tell message lines in page. + + """ + log.debug(u'format_slide - Start') + line_end = u'' + if line_break: + line_end = u'
' + formatted = [] + html_text = u'' + styled_text = u'' + line_count = 0 + for line in lines: + if line_count != -1: + line_count += 1 + styled_line = expand_tags(line) + line_end + styled_text += styled_line + html = self.page_shell + styled_text + u'
' + self.web.setHtml(html) + # Text too long so go to next page + if self.web_frame.contentsSize().height() > self.page_height: + if force_page and line_count > 0: + Receiver.send_message(u'theme_line_count', line_count) + line_count = -1 + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + html_text = u'' + styled_text = styled_line + html_text += line + line_end + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + log.debug(u'format_slide - End') + return formatted + + def _lines(self, words): + """ + Split the slide up by physical line + """ + # this parse we do not want to use this so remove it + words = words.replace(u'[---]', u'') + verses_text = words.split(u'\n') + text = [] + for verse in verses_text: + lines = verse.split(u'\n') + for line in lines: + text.append(line) + return text + + def _words(self, words): + """ + Split the slide up by word so can wrap better + """ + # this parse we are wordy + words = words.replace(u'\n', u' ') + verses_text = words.split(u' ') + text = [] + for verse in verses_text: + lines = verse.split(u' ') + for line in lines: + text.append(line + u' ') + return text + diff --git a/openlp/core/lib/rendermanager.py b/openlp/core/lib/rendermanager.py deleted file mode 100644 index 43210259a..000000000 --- a/openlp/core/lib/rendermanager.py +++ /dev/null @@ -1,382 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2011 Raoul Snyman # -# Portions copyright (c) 2008-2011 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Matthias Hub, Meinert Jordan, Armin Köhler, # -# Andreas Preikschat, Mattias Põldaru, Christian Richter, Philip Ridout, # -# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Frode Woldsund # -# --------------------------------------------------------------------------- # -# 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 logging - -from PyQt4 import QtCore, QtWebKit - -from openlp.core.lib import ServiceItem, ImageManager, expand_tags, \ - build_lyrics_format_css, build_lyrics_outline_css, Receiver, \ - ItemCapabilities -from openlp.core.lib.theme import ThemeLevel -from openlp.core.ui import MainDisplay - -log = logging.getLogger(__name__) - -VERSE = u'The Lord said to {r}Noah{/r}: \n' \ - 'There\'s gonna be a {su}floody{/su}, {sb}floody{/sb}\n' \ - 'The Lord said to {g}Noah{/g}:\n' \ - 'There\'s gonna be a {st}floody{/st}, {it}floody{/it}\n' \ - 'Get those children out of the muddy, muddy \n' \ - '{r}C{/r}{b}h{/b}{bl}i{/bl}{y}l{/y}{g}d{/g}{pk}' \ - 'r{/pk}{o}e{/o}{pp}n{/pp} of the Lord\n' -FOOTER = [u'Arky Arky (Unknown)', u'Public Domain', u'CCLI 123456'] - -class RenderManager(object): - """ - Class to pull all Renderer interactions into one place. The plugins will - call helper methods to do the rendering but this class will provide - display defense code. - - ``theme_manager`` - The ThemeManager instance, used to get the current theme details. - - ``screens`` - Contains information about the Screens. - - ``screen_number`` - Defaults to *0*. The index of the output/display screen. - """ - log.info(u'RenderManager Loaded') - - def __init__(self, theme_manager, screens): - """ - Initialise the render manager. - """ - log.debug(u'Initilisation started') - self.screens = screens - self.image_manager = ImageManager() - self.display = MainDisplay(self, screens, False) - self.display.imageManager = self.image_manager - self.theme_manager = theme_manager - self.theme = u'' - self.service_theme = u'' - self.theme_level = u'' - self.override_background = None - self.theme_data = None - self.force_page = False - - def update_display(self): - """ - Updates the render manager's information about the current screen. - """ - log.debug(u'Update Display') - self._calculate_default(self.screens.current[u'size']) - self.display = MainDisplay(self, self.screens, False) - self.display.imageManager = self.image_manager - self.display.setup() - self.bg_frame = None - self.theme_data = None - self.image_manager.update_display(self.width, self.height) - - def set_global_theme(self, global_theme, theme_level=ThemeLevel.Global): - """ - Set the global-level theme and the theme level. - - ``global_theme`` - The global-level theme to be set. - - ``theme_level`` - Defaults to *``ThemeLevel.Global``*. The theme level, can be - ``ThemeLevel.Global``, ``ThemeLevel.Service`` or - ``ThemeLevel.Song``. - """ - self.global_theme = global_theme - self.theme_level = theme_level - self.global_theme_data = \ - self.theme_manager.getThemeData(self.global_theme) - self.theme_data = None - - def set_service_theme(self, service_theme): - """ - Set the service-level theme. - - ``service_theme`` - The service-level theme to be set. - """ - self.service_theme = service_theme - self.theme_data = None - - def set_override_theme(self, theme, overrideLevels=False): - """ - Set the appropriate theme depending on the theme level. - Called by the service item when building a display frame - - ``theme`` - The name of the song-level theme. None means the service - item wants to use the given value. - - ``overrideLevels`` - Used to force the theme data passed in to be used. - - """ - log.debug(u'set override theme to %s', theme) - theme_level = self.theme_level - if overrideLevels: - theme_level = ThemeLevel.Song - if theme_level == ThemeLevel.Global: - self.theme = self.global_theme - elif theme_level == ThemeLevel.Service: - if self.service_theme == u'': - self.theme = self.global_theme - else: - self.theme = self.service_theme - else: - # Images have a theme of -1 - if theme and theme != -1: - self.theme = theme - elif theme_level == ThemeLevel.Song or \ - theme_level == ThemeLevel.Service: - if self.service_theme == u'': - self.theme = self.global_theme - else: - self.theme = self.service_theme - else: - self.theme = self.global_theme - log.debug(u'theme is now %s', self.theme) - # Force the theme to be the one passed in. - if overrideLevels: - self.theme_data = theme - else: - self.theme_data = self.theme_manager.getThemeData(self.theme) - self._calculate_default(self.screens.current[u'size']) - self._build_text_rectangle(self.theme_data) - self.image_manager.add_image(self.theme_data.theme_name, - self.theme_data.background_filename) - return self._rect, self._rect_footer - - def generate_preview(self, theme_data, force_page=False): - """ - Generate a preview of a theme. - - ``theme_data`` - The theme to generated a preview for. - - ``force_page`` - Flag to tell message lines per page need to be generated. - """ - log.debug(u'generate preview') - # save value for use in format_slide - self.force_page = force_page - # set the default image size for previews - self.calculate_default(self.screens.preview[u'size']) - # build a service item to generate preview - serviceItem = ServiceItem() - serviceItem.theme = theme_data - if self.force_page: - # make big page for theme edit dialog to get line count - serviceItem.add_from_text(u'', VERSE + VERSE + VERSE, FOOTER) - else: - self.image_manager.del_image(theme_data.theme_name) - serviceItem.add_from_text(u'', VERSE, FOOTER) - serviceItem.render_manager = self - serviceItem.raw_footer = FOOTER - serviceItem.render(True) - if not self.force_page: - self.display.buildHtml(serviceItem) - raw_html = serviceItem.get_rendered_frame(0) - preview = self.display.text(raw_html) - # Reset the real screen size for subsequent render requests - self._calculate_default(self.screens.current[u'size']) - return preview - - def format_slide(self, slide, line_break, item): - """ - Calculate how much text can fit on a slide. - - ``slide`` - The words to go on the slides. - - ``line_break`` - Add line endings after each line of text used for bibles. - """ - log.debug(u'format slide') - # clean up line endings - slide = slide.replace(u'\r\n', u'\n') - lines = self._lines(slide) - pages = self._paginate_slide(lines, line_break, self.force_page) - if len(pages) > 1: - if item.is_capable(ItemCapabilities.AllowsVirtualSplit): - # do not forget the line breaks ! - slides = slide.split(u'\n[###]\n') - pages = [] - for slide in slides: - lines = self._lines(slide) - new_pages = self._paginate_slide(lines, line_break, - self.force_page) - for page in new_pages: - pages.append(page) - elif item.is_capable(ItemCapabilities.AllowsWordSplit): - lines = self._words(slide) - pages = self._paginate_slide(lines, False, self.force_page) - return pages - - def _calculate_default(self, screen): - """ - Calculate the default dimentions of the screen. - - ``screen`` - The QSize of the screen. - """ - log.debug(u'calculate default %s', screen) - self.width = screen.width() - self.height = screen.height() - self.screen_ratio = float(self.height) / float(self.width) - log.debug(u'calculate default %d, %d, %f', - self.width, self.height, self.screen_ratio) - # 90% is start of footer - self.footer_start = int(self.height * 0.90) - - def _build_text_rectangle(self, theme): - """ - Builds a text block using the settings in ``theme`` - and the size of the display screen.height. - - ``theme`` - The theme to build a text block for. - """ - log.debug(u'_build_text_rectangle') - main_rect = None - footer_rect = None - if not theme.font_main_override: - main_rect = QtCore.QRect(10, 0, self.width - 20, self.footer_start) - else: - main_rect = QtCore.QRect(theme.font_main_x, theme.font_main_y, - theme.font_main_width - 1, theme.font_main_height - 1) - if not theme.font_footer_override: - footer_rect = QtCore.QRect(10, self.footer_start, self.width - 20, - self.height - self.footer_start) - else: - footer_rect = QtCore.QRect(theme.font_footer_x, - theme.font_footer_y, theme.font_footer_width - 1, - theme.font_footer_height - 1) - self._set_text_rectangle(main_rect, footer_rect) - - def _set_text_rectangle(self, rect_main, rect_footer): - """ - Sets the rectangle within which text should be rendered. - - ``rect_main`` - The main text block. - - ``rect_footer`` - The footer text block. - """ - log.debug(u'set_text_rectangle %s , %s' % (rect_main, rect_footer)) - self._rect = rect_main - self._rect_footer = rect_footer - self.page_width = self._rect.width() - self.page_height = self._rect.height() - if self.theme_data.font_main_shadow: - self.page_width -= int(self.theme_data.font_main_shadow_size) - self.page_height -= int(self.theme_data.font_main_shadow_size) - self.web = QtWebKit.QWebView() - self.web.setVisible(False) - self.web.resize(self.page_width, self.page_height) - self.web_frame = self.web.page().mainFrame() - # Adjust width and height to account for shadow. outline done in css - self.page_shell = u'' \ - u'
' % \ - (build_lyrics_format_css(self.theme_data, self.page_width, - self.page_height), build_lyrics_outline_css(self.theme_data)) - - def _paginate_slide(self, lines, line_break, force_page=False): - """ - Figure out how much text can appear on a slide, using the current - theme settings. - - ``lines`` - The words to be fitted on the slide split into lines. - - ``line_break`` - Add line endings after each line of text used for bibles. - - ``force_page`` - Flag to tell message lines in page. - - """ - log.debug(u'format_slide - Start') - line_end = u'' - if line_break: - line_end = u'
' - formatted = [] - html_text = u'' - styled_text = u'' - line_count = 0 - for line in lines: - if line_count != -1: - line_count += 1 - styled_line = expand_tags(line) + line_end - styled_text += styled_line - html = self.page_shell + styled_text + u'
' - self.web.setHtml(html) - # Text too long so go to next page - if self.web_frame.contentsSize().height() > self.page_height: - if force_page and line_count > 0: - Receiver.send_message(u'theme_line_count', line_count) - line_count = -1 - if html_text.endswith(u'
'): - html_text = html_text[:len(html_text)-4] - formatted.append(html_text) - html_text = u'' - styled_text = styled_line - html_text += line + line_end - if html_text.endswith(u'
'): - html_text = html_text[:len(html_text)-4] - formatted.append(html_text) - log.debug(u'format_slide - End') - return formatted - - def _lines(self, words): - """ - Split the slide up by physical line - """ - # this parse we do not want to use this so remove it - words = words.replace(u'[---]', u'') - verses_text = words.split(u'\n') - text = [] - for verse in verses_text: - lines = verse.split(u'\n') - for line in lines: - text.append(line) - return text - - def _words(self, words): - """ - Split the slide up by word so can wrap better - """ - # this parse we are wordy - words = words.replace(u'\n', u' ') - verses_text = words.split(u' ') - text = [] - for verse in verses_text: - lines = verse.split(u' ') - for line in lines: - text.append(line + u' ') - return text - diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 594c6cc91..e94273122 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -30,7 +30,7 @@ from tempfile import gettempdir from PyQt4 import QtCore, QtGui -from openlp.core.lib import RenderManager, build_icon, OpenLPDockWidget, \ +from openlp.core.lib import Renderer, build_icon, OpenLPDockWidget, \ SettingsManager, PluginManager, Receiver, translate from openlp.core.lib.ui import UiStrings, base_action, checkable_action, \ icon_action @@ -587,9 +587,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'openlp_information_message'), self.onInformationMessage) # warning cyclic dependency - # RenderManager needs to call ThemeManager and - # ThemeManager needs to call RenderManager - self.renderManager = RenderManager( + # renderer needs to call ThemeManager and + # ThemeManager needs to call renderer + self.renderer = Renderer( self.themeManagerContents, self.screens) # Define the media Dock Manager self.mediaDockManager = MediaDockManager(self.MediaToolBox) @@ -597,7 +597,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # make the controllers available to the plugins self.pluginHelpers[u'preview'] = self.previewController self.pluginHelpers[u'live'] = self.liveController - self.pluginHelpers[u'render'] = self.renderManager + self.pluginHelpers[u'render'] = self.renderer self.pluginHelpers[u'service'] = self.ServiceManagerContents self.pluginHelpers[u'settings form'] = self.settingsForm self.pluginHelpers[u'toolbox'] = self.mediaDockManager @@ -818,7 +818,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): their locations """ log.debug(u'screenChanged') - self.renderManager.update_display() + self.renderer.update_display() self.setFocus() self.activateWindow() diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 168ad8a8c..61dc4e3da 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -970,7 +970,7 @@ class ServiceManager(QtGui.QWidget): sure the theme combo box is in the correct state. """ log.debug(u'themeChange') - if self.mainwindow.renderManager.theme_level == ThemeLevel.Global: + if self.mainwindow.renderer.theme_level == ThemeLevel.Global: self.toolbar.actions[u'ThemeLabel'].setVisible(False) self.toolbar.actions[u'ThemeWidget'].setVisible(False) else: @@ -985,7 +985,7 @@ class ServiceManager(QtGui.QWidget): Receiver.send_message(u'cursor_busy') log.debug(u'regenerateServiceItems') # force reset of renderer as theme data has changed - self.mainwindow.renderManager.themedata = None + self.mainwindow.renderer.themedata = None if self.serviceItems: tempServiceItems = self.serviceItems self.serviceManagerList.clear() @@ -1250,7 +1250,7 @@ class ServiceManager(QtGui.QWidget): index = 0 self.service_theme = u'' self.themeComboBox.setCurrentIndex(index) - self.mainwindow.renderManager.set_service_theme(self.service_theme) + self.mainwindow.renderer.set_service_theme(self.service_theme) self.regenerateServiceItems() def onThemeChangeAction(self): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 232653326..ee617287a 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -407,7 +407,7 @@ class SlideController(QtGui.QWidget): """ # rebuild display as screen size changed self.display = MainDisplay(self, self.screens, self.isLive) - self.display.imageManager = self.parent.renderManager.image_manager + self.display.imageManager = self.parent.renderer.image_manager self.display.alertTab = self.alertTab self.display.setup() if self.isLive: diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 1b76d2198..1e6ddb4a8 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -191,7 +191,7 @@ class ThemesTab(SettingsTab): id = 0 # Not Found self.global_theme = u'' self.DefaultComboBox.setCurrentIndex(id) - self.parent.renderManager.set_global_theme( + self.parent.renderer.set_global_theme( self.global_theme, self.theme_level) if self.global_theme is not u'': self.__previewGlobalTheme() From 2ba0d410fc33f8d739b06645fb1ed5d23b1e99e6 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Mon, 28 Mar 2011 19:56:39 +0100 Subject: [PATCH 05/14] More Cleanups --- openlp/core/lib/plugin.py | 2 +- openlp/core/lib/renderer.py | 2 +- openlp/core/lib/serviceitem.py | 4 ++-- openlp/core/ui/mainwindow.py | 4 ++-- openlp/core/ui/servicemanager.py | 4 ++-- openlp/core/ui/slidecontroller.py | 12 ++++++------ openlp/core/ui/thememanager.py | 6 +++--- openlp/core/ui/themestab.py | 6 +++--- .../plugins/presentations/lib/impresscontroller.py | 4 ++-- .../presentations/lib/powerpointcontroller.py | 6 +++--- .../plugins/presentations/lib/pptviewcontroller.py | 6 +++--- openlp/plugins/songs/forms/editsongform.py | 4 ++-- 12 files changed, 30 insertions(+), 30 deletions(-) diff --git a/openlp/core/lib/plugin.py b/openlp/core/lib/plugin.py index eda8ecfa1..375331719 100644 --- a/openlp/core/lib/plugin.py +++ b/openlp/core/lib/plugin.py @@ -160,7 +160,7 @@ class Plugin(QtCore.QObject): self.log = logging.getLogger(self.name) self.previewController = pluginHelpers[u'preview'] self.liveController = pluginHelpers[u'live'] - self.renderManager = pluginHelpers[u'render'] + self.renderer = pluginHelpers[u'renderer'] self.serviceManager = pluginHelpers[u'service'] self.settingsForm = pluginHelpers[u'settings form'] self.mediadock = pluginHelpers[u'toolbox'] diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 9256eb096..c1a866668 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -60,7 +60,7 @@ class Renderer(object): ``screen_number`` Defaults to *0*. The index of the output/display screen. """ - log.info(u'RenderManager Loaded') + log.info(u'Renderer Loaded') def __init__(self, theme_manager, screens): """ diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index f996c3f97..c3e6b17aa 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -83,7 +83,7 @@ class ServiceItem(object): The plugin that this service item belongs to. """ if plugin: - self.renderer = plugin.renderManager + self.renderer = plugin.renderer self.name = plugin.name self.title = u'' self.shortname = u'' @@ -455,4 +455,4 @@ class ServiceItem(object): elif not start and end: return end else: - return u'%s : %s' % (start, end) + return u'%s : %s' % (start, end) \ No newline at end of file diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index e94273122..e305e06cf 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -588,7 +588,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.onInformationMessage) # warning cyclic dependency # renderer needs to call ThemeManager and - # ThemeManager needs to call renderer + # ThemeManager needs to call Renderer self.renderer = Renderer( self.themeManagerContents, self.screens) # Define the media Dock Manager @@ -597,7 +597,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # make the controllers available to the plugins self.pluginHelpers[u'preview'] = self.previewController self.pluginHelpers[u'live'] = self.liveController - self.pluginHelpers[u'render'] = self.renderer + self.pluginHelpers[u'renderer'] = self.renderer self.pluginHelpers[u'service'] = self.ServiceManagerContents self.pluginHelpers[u'settings form'] = self.settingsForm self.pluginHelpers[u'toolbox'] = self.mediaDockManager diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 61dc4e3da..eaa80afac 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -564,7 +564,7 @@ class ServiceManager(QtGui.QWidget): for item in items: serviceItem = ServiceItem() serviceItem.from_service = True - serviceItem.render_manager = self.mainwindow.renderManager + serviceItem.renderer = self.mainwindow.renderer serviceItem.set_from_service(item, self.servicePath) self.validateItem(serviceItem) self.addServiceItem(serviceItem) @@ -958,7 +958,7 @@ class ServiceManager(QtGui.QWidget): """ log.debug(u'onThemeComboBoxSelected') self.service_theme = unicode(self.themeComboBox.currentText()) - self.mainwindow.renderManager.set_service_theme(self.service_theme) + self.mainwindow.renderer.set_service_theme(self.service_theme) QtCore.QSettings().setValue( self.mainwindow.serviceSettingsSection + u'/service theme', QtCore.QVariant(self.service_theme)) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index ee617287a..da14f3b0a 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -618,19 +618,19 @@ class SlideController(QtGui.QWidget): label.setScaledContents(True) if self.serviceItem.is_command(): image = resize_image(frame[u'image'], - self.parent.renderManager.width, - self.parent.renderManager.height) + self.parent.renderer.width, + self.parent.renderer.height) else: # If current slide set background to image if framenumber == slideno: self.serviceItem.bg_image_bytes = \ - self.parent.renderManager.image_manager. \ + self.parent.renderer.image_manager. \ get_image_bytes(frame[u'title']) - image = self.parent.renderManager.image_manager. \ + image = self.parent.renderer.image_manager. \ get_image(frame[u'title']) label.setPixmap(QtGui.QPixmap.fromImage(image)) self.previewListWidget.setCellWidget(framenumber, 0, label) - slideHeight = width * self.parent.renderManager.screen_ratio + slideHeight = width * self.parent.renderer.screen_ratio row += 1 text.append(unicode(row)) self.previewListWidget.setItem(framenumber, 0, item) @@ -1111,4 +1111,4 @@ class SlideController(QtGui.QWidget): blank.setChecked(False) self.hideMenu.setDefaultAction(blank) QtCore.QSettings().remove( - self.parent.generalSettingsSection + u'/screen blank') + self.parent.generalSettingsSection + u'/screen blank') \ No newline at end of file diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index d033daeb3..1356a30b2 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -656,7 +656,7 @@ class ThemeManager(QtGui.QWidget): def generateImage(self, themeData, forcePage=False): """ - Call the RenderManager to build a Sample Image + Call the renderer to build a Sample Image ``themeData`` The theme to generated a preview for. @@ -665,7 +665,7 @@ class ThemeManager(QtGui.QWidget): Flag to tell message lines per page need to be generated. """ log.debug(u'generateImage \n%s ', themeData) - return self.mainwindow.renderManager.generate_preview( + return self.mainwindow.renderer.generate_preview( themeData, forcePage) def getPreviewImage(self, theme): @@ -802,4 +802,4 @@ class ThemeManager(QtGui.QWidget): vAlignCorrection = VerticalType.Bottom newtheme.display_horizontal_align = theme.HorizontalAlign newtheme.display_vertical_align = vAlignCorrection - return newtheme.extract_xml() + return newtheme.extract_xml() \ No newline at end of file diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 1e6ddb4a8..27018af07 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -147,7 +147,7 @@ class ThemesTab(SettingsTab): settings.setValue(u'global theme', QtCore.QVariant(self.global_theme)) settings.endGroup() - self.parent.renderManager.set_global_theme( + self.parent.renderer.set_global_theme( self.global_theme, self.theme_level) Receiver.send_message(u'theme_update_global', self.global_theme) @@ -165,7 +165,7 @@ class ThemesTab(SettingsTab): def onDefaultComboBoxChanged(self, value): self.global_theme = unicode(self.DefaultComboBox.currentText()) - self.parent.renderManager.set_global_theme( + self.parent.renderer.set_global_theme( self.global_theme, self.theme_level) self.__previewGlobalTheme() @@ -206,4 +206,4 @@ class ThemesTab(SettingsTab): if not preview.isNull(): preview = preview.scaled(300, 255, QtCore.Qt.KeepAspectRatio, QtCore.Qt.SmoothTransformation) - self.DefaultListView.setPixmap(preview) + self.DefaultListView.setPixmap(preview) \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 8166a2258..c84f0ff1e 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -244,7 +244,7 @@ class ImpressDocument(PresentationDocument): return False self.presentation = self.document.getPresentation() self.presentation.Display = \ - self.controller.plugin.renderManager.screens.current_display + 1 + self.controller.plugin.renderer.screens.current_display + 1 self.control = None self.create_thumbnails() return True @@ -463,4 +463,4 @@ class ImpressDocument(PresentationDocument): shape = page.getByIndex(idx) if shape.supportsService("com.sun.star.drawing.Text"): text += shape.getString() + '\n' - return text + return text \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index 793b0b75d..3045eed13 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -253,8 +253,8 @@ class PowerpointDocument(PresentationDocument): dpi = 96 self.presentation.SlideShowSettings.Run() self.presentation.SlideShowWindow.View.GotoSlide(1) - rendermanager = self.controller.plugin.renderManager - rect = rendermanager.screens.current[u'size'] + renderer = self.controller.plugin.renderer + rect = renderer.screens.current[u'size'] self.presentation.SlideShowWindow.Top = rect.y() * 72 / dpi self.presentation.SlideShowWindow.Height = rect.height() * 72 / dpi self.presentation.SlideShowWindow.Left = rect.x() * 72 / dpi @@ -326,4 +326,4 @@ def _get_text_from_shapes(shapes): shape = shapes(idx + 1) if shape.HasTextFrame: text += shape.TextFrame.TextRange.Text + '\n' - return text + return text \ No newline at end of file diff --git a/openlp/plugins/presentations/lib/pptviewcontroller.py b/openlp/plugins/presentations/lib/pptviewcontroller.py index 94fd05f31..354c33361 100644 --- a/openlp/plugins/presentations/lib/pptviewcontroller.py +++ b/openlp/plugins/presentations/lib/pptviewcontroller.py @@ -121,8 +121,8 @@ class PptviewDocument(PresentationDocument): The file name of the presentations to run. """ log.debug(u'LoadPresentation') - rendermanager = self.controller.plugin.renderManager - rect = rendermanager.screens.current[u'size'] + renderer = self.controller.plugin.renderer + rect = renderer.screens.current[u'size'] rect = RECT(rect.x(), rect.y(), rect.right(), rect.bottom()) filepath = str(self.filepath.replace(u'/', u'\\')) if not os.path.isdir(self.get_temp_folder()): @@ -244,4 +244,4 @@ class PptviewDocument(PresentationDocument): """ Triggers the previous slide on the running presentation """ - self.controller.process.PrevStep(self.pptid) + self.controller.process.PrevStep(self.pptid) \ No newline at end of file diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index 7f7b7fd90..9bb58bd82 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -89,7 +89,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.onVerseListViewPressed) QtCore.QObject.connect(self.themeAddButton, QtCore.SIGNAL(u'clicked()'), - self.parent.parent.renderManager.theme_manager.onAddTheme) + self.parent.parent.renderer.theme_manager.onAddTheme) QtCore.QObject.connect(self.maintenanceButton, QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked) QtCore.QObject.connect(Receiver.get_receiver(), @@ -788,4 +788,4 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.song.verse_order) except: log.exception(u'Problem processing song Lyrics \n%s', - sxml.dump_xml()) + sxml.dump_xml()) \ No newline at end of file From 8790f17afa78303bfad56690ffc3066cc32aab48 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 29 Mar 2011 17:25:48 +0100 Subject: [PATCH 06/14] Fix theme editing --- openlp/core/lib/renderer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index c1a866668..d612c9a58 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -182,7 +182,7 @@ class Renderer(object): # save value for use in format_slide self.force_page = force_page # set the default image size for previews - self.calculate_default(self.screens.preview[u'size']) + self._calculate_default(self.screens.preview[u'size']) # build a service item to generate preview serviceItem = ServiceItem() serviceItem.theme = theme_data @@ -192,7 +192,7 @@ class Renderer(object): else: self.image_manager.del_image(theme_data.theme_name) serviceItem.add_from_text(u'', VERSE, FOOTER) - serviceItem.render_manager = self + serviceItem.renderer = self serviceItem.raw_footer = FOOTER serviceItem.render(True) if not self.force_page: From 857756e20f78682e17e56f14cec91605e2e8c6b0 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 29 Mar 2011 21:06:18 +0100 Subject: [PATCH 07/14] Change ### to ==== --- openlp/core/lib/renderer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index d612c9a58..d0bfe6f53 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -221,7 +221,7 @@ class Renderer(object): if len(pages) > 1: if item.is_capable(ItemCapabilities.AllowsVirtualSplit): # do not forget the line breaks ! - slides = slide.split(u'\n[###]\n') + slides = slide.split(u'\n[===]\n') pages = [] for slide in slides: lines = self._lines(slide) From ea6f90fc749933e4db245af029879b892067194e Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Tue, 29 Mar 2011 21:38:10 +0100 Subject: [PATCH 08/14] Change === and --- around --- openlp/core/lib/renderer.py | 2 +- openlp/plugins/custom/forms/editcustomform.py | 2 +- openlp/plugins/custom/forms/editcustomslideform.py | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index d0bfe6f53..16dbfae79 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -221,7 +221,7 @@ class Renderer(object): if len(pages) > 1: if item.is_capable(ItemCapabilities.AllowsVirtualSplit): # do not forget the line breaks ! - slides = slide.split(u'\n[===]\n') + slides = slide.split(u'\n[---]\n') pages = [] for slide in slides: lines = self._lines(slide) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index f81bd4c7d..1bbc30a49 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -173,7 +173,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog): item = self.slideListView.item(row) slide_list += item.text() if row != self.slideListView.count() - 1: - slide_list += u'\n[---]\n' + slide_list += u'\n[===]\n' self.editSlideForm.setText(slide_list) if self.editSlideForm.exec_(): self.updateSlideList(self.editSlideForm.getText(), True) diff --git a/openlp/plugins/custom/forms/editcustomslideform.py b/openlp/plugins/custom/forms/editcustomslideform.py index 7d4e32968..bf775a1f2 100644 --- a/openlp/plugins/custom/forms/editcustomslideform.py +++ b/openlp/plugins/custom/forms/editcustomslideform.py @@ -63,7 +63,7 @@ class EditCustomSlideForm(QtGui.QDialog, Ui_CustomSlideEditDialog): """ Returns a list with all slides. """ - return self.slideTextEdit.toPlainText().split(u'\n[---]\n') + return self.slideTextEdit.toPlainText().split(u'\n[===]\n') def onSplitButtonPressed(self): """ @@ -71,5 +71,5 @@ class EditCustomSlideForm(QtGui.QDialog, Ui_CustomSlideEditDialog): """ if self.slideTextEdit.textCursor().columnNumber() != 0: self.slideTextEdit.insertPlainText(u'\n') - self.slideTextEdit.insertPlainText(u'[---]\n') + self.slideTextEdit.insertPlainText(u'[===]\n') self.slideTextEdit.setFocus() From 3155bde0b245727af065e7bf2e5ab4b7af715401 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 1 Apr 2011 05:48:09 +0100 Subject: [PATCH 09/14] inprogress --- openlp/core/lib/renderer.py | 58 ++++++++++++++++++++++---- openlp/core/lib/serviceitem.py | 6 +-- openlp/plugins/bibles/lib/mediaitem.py | 8 ++-- 3 files changed, 58 insertions(+), 14 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 16dbfae79..c8e8af41d 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -120,7 +120,7 @@ class Renderer(object): self.service_theme = service_theme self.theme_data = None - def set_override_theme(self, theme, overrideLevels=False): + def set_override_theme(self, theme, override_levels=False): """ Set the appropriate theme depending on the theme level. Called by the service item when building a display frame @@ -129,13 +129,13 @@ class Renderer(object): The name of the song-level theme. None means the service item wants to use the given value. - ``overrideLevels`` + ``override_levels`` Used to force the theme data passed in to be used. """ log.debug(u'set override theme to %s', theme) theme_level = self.theme_level - if overrideLevels: + if override_levels: theme_level = ThemeLevel.Song if theme_level == ThemeLevel.Global: self.theme = self.global_theme @@ -158,7 +158,7 @@ class Renderer(object): self.theme = self.global_theme log.debug(u'theme is now %s', self.theme) # Force the theme to be the one passed in. - if overrideLevels: + if override_levels: self.theme_data = theme else: self.theme_data = self.theme_manager.getThemeData(self.theme) @@ -216,9 +216,13 @@ class Renderer(object): log.debug(u'format slide') # clean up line endings slide = slide.replace(u'\r\n', u'\n') + print "###############" + print [slide] lines = self._lines(slide) pages = self._paginate_slide(lines, line_break, self.force_page) + print len(pages) if len(pages) > 1: + # Songs and Custom if item.is_capable(ItemCapabilities.AllowsVirtualSplit): # do not forget the line breaks ! slides = slide.split(u'\n[---]\n') @@ -229,9 +233,11 @@ class Renderer(object): self.force_page) for page in new_pages: pages.append(page) +# # Bibles elif item.is_capable(ItemCapabilities.AllowsWordSplit): lines = self._words(slide) - pages = self._paginate_slide(lines, False, self.force_page) + pages = self._paginate_slide(lines, False) + print pages return pages def _calculate_default(self, screen): @@ -352,12 +358,50 @@ class Renderer(object): log.debug(u'format_slide - End') return formatted + def _paginate_slide_words(self, lines, line_break): + """ + Figure out how much text can appear on a slide, using the current + theme settings. + + ``lines`` + The words to be fitted on the slide split into lines. + """ + log.debug(u'format_slide - Start') + line_end = u'' + if line_break: + line_end = u'
' + formatted = [] + html_text = u'' + styled_text = u'' + for line in lines: + styled_line = expand_tags(line) + if line.startswith(u'{su}'): + styled_line = line_end + styled_line + styled_text += styled_line + html = self.page_shell + styled_text + u'
' + self.web.setHtml(html) + # Text too long so go to next page + if self.web_frame.contentsSize().height() > self.page_height: + #split + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + html_text = u'' + styled_text = styled_line + html_text += line# + line_end + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + log.debug(u'format_slide - End') + return formatted + + def _lines(self, words): """ Split the slide up by physical line """ # this parse we do not want to use this so remove it - words = words.replace(u'[---]', u'') + words = words.replace(u'\n[---]\n', u'') verses_text = words.split(u'\n') text = [] for verse in verses_text: @@ -371,6 +415,7 @@ class Renderer(object): Split the slide up by word so can wrap better """ # this parse we are wordy + words = words.replace(u'[---]', u'').lstrip() words = words.replace(u'\n', u' ') verses_text = words.split(u' ') text = [] @@ -379,4 +424,3 @@ class Renderer(object): for line in lines: text.append(line + u' ') return text - diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index c3e6b17aa..dab4b671a 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -153,7 +153,7 @@ class ServiceItem(object): self.icon = icon self.iconic_representation = build_icon(icon) - def render(self, useOverride=False): + def render(self, use_override=False): """ The render method is what generates the frames for the screen and obtains the display information from the renderemanager. @@ -168,7 +168,7 @@ class ServiceItem(object): line_break = False theme = self.theme if self.theme else None self.main, self.footer = \ - self.renderer.set_override_theme(theme, useOverride) + self.renderer.set_override_theme(theme, use_override) self.themedata = self.renderer.theme_data if self.service_item_type == ServiceItemType.Text: log.debug(u'Formatting slides') @@ -455,4 +455,4 @@ class ServiceItem(object): elif not start and end: return end else: - return u'%s : %s' % (start, end) \ No newline at end of file + return u'%s : %s' % (start, end) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 405507523..afbf9764b 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -799,9 +799,9 @@ class BibleMediaItem(MediaManagerItem): else: verse_text = unicode(verse) if self.settings.display_style == DisplayStyle.Round: - return u'{su}(%s){/su}' % verse_text + return u'\n[---]\n{su}(%s){/su}' % verse_text if self.settings.display_style == DisplayStyle.Curly: - return u'{su}{%s}{/su}' % verse_text + return u'\n[---]\n{su}{%s}{/su}' % verse_text if self.settings.display_style == DisplayStyle.Square: - return u'{su}[%s]{/su}' % verse_text - return u'{su}%s{/su}' % verse_text + return u'\n[---]\n{su}[%s]{/su}' % verse_text + return u'\n[---]\n{su}%s{/su}' % verse_text From 63bfac4b7eb7822b1af8fca9c44fc8c591207a91 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sun, 3 Apr 2011 07:19:03 +0100 Subject: [PATCH 10/14] Changes continue --- openlp/core/lib/renderer.py | 118 ++++++++++++++++--------- openlp/plugins/bibles/lib/mediaitem.py | 8 +- 2 files changed, 80 insertions(+), 46 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index c8e8af41d..0ae9149fa 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -45,6 +45,8 @@ VERSE = u'The Lord said to {r}Noah{/r}: \n' \ 'r{/pk}{o}e{/o}{pp}n{/pp} of the Lord\n' FOOTER = [u'Arky Arky (Unknown)', u'Public Domain', u'CCLI 123456'] +HTML_END = u'' + class Renderer(object): """ Class to pull all Renderer interactions into one place. The plugins will @@ -72,7 +74,6 @@ class Renderer(object): self.display = MainDisplay(self, screens, False) self.display.imageManager = self.image_manager self.theme_manager = theme_manager - self.theme = u'' self.service_theme = u'' self.theme_level = u'' self.override_background = None @@ -120,7 +121,7 @@ class Renderer(object): self.service_theme = service_theme self.theme_data = None - def set_override_theme(self, theme, override_levels=False): + def set_override_theme(self, override_theme, override_levels=False): """ Set the appropriate theme depending on the theme level. Called by the service item when building a display frame @@ -133,35 +134,35 @@ class Renderer(object): Used to force the theme data passed in to be used. """ - log.debug(u'set override theme to %s', theme) + log.debug(u'set override theme to %s', override_theme) theme_level = self.theme_level if override_levels: theme_level = ThemeLevel.Song if theme_level == ThemeLevel.Global: - self.theme = self.global_theme + theme = self.global_theme elif theme_level == ThemeLevel.Service: if self.service_theme == u'': - self.theme = self.global_theme + theme = self.global_theme else: - self.theme = self.service_theme + theme = self.service_theme else: # Images have a theme of -1 - if theme and theme != -1: - self.theme = theme + if override_theme and override_theme != -1: + theme = override_theme elif theme_level == ThemeLevel.Song or \ theme_level == ThemeLevel.Service: if self.service_theme == u'': - self.theme = self.global_theme + theme = self.global_theme else: - self.theme = self.service_theme + theme = self.service_theme else: - self.theme = self.global_theme - log.debug(u'theme is now %s', self.theme) + theme = self.global_theme + log.debug(u'theme is now %s', theme) # Force the theme to be the one passed in. if override_levels: - self.theme_data = theme + self.theme_data = override_theme else: - self.theme_data = self.theme_manager.getThemeData(self.theme) + self.theme_data = self.theme_manager.getThemeData(theme) self._calculate_default(self.screens.current[u'size']) self._build_text_rectangle(self.theme_data) self.image_manager.add_image(self.theme_data.theme_name, @@ -203,11 +204,11 @@ class Renderer(object): self._calculate_default(self.screens.current[u'size']) return preview - def format_slide(self, slide, line_break, item): + def format_slide(self, text, line_break, item): """ Calculate how much text can fit on a slide. - ``slide`` + ``text`` The words to go on the slides. ``line_break`` @@ -215,17 +216,13 @@ class Renderer(object): """ log.debug(u'format slide') # clean up line endings - slide = slide.replace(u'\r\n', u'\n') - print "###############" - print [slide] - lines = self._lines(slide) + lines = self._lines(text) pages = self._paginate_slide(lines, line_break, self.force_page) - print len(pages) if len(pages) > 1: # Songs and Custom if item.is_capable(ItemCapabilities.AllowsVirtualSplit): # do not forget the line breaks ! - slides = slide.split(u'\n[---]\n') + slides = text.split(u'\n[---]\n') pages = [] for slide in slides: lines = self._lines(slide) @@ -235,9 +232,7 @@ class Renderer(object): pages.append(page) # # Bibles elif item.is_capable(ItemCapabilities.AllowsWordSplit): - lines = self._words(slide) - pages = self._paginate_slide(lines, False) - print pages + pages = self._paginate_slide_words(text, line_break) return pages def _calculate_default(self, screen): @@ -339,7 +334,7 @@ class Renderer(object): line_count += 1 styled_line = expand_tags(line) + line_end styled_text += styled_line - html = self.page_shell + styled_text + u'' + html = self.page_shell + styled_text + HTML_END self.web.setHtml(html) # Text too long so go to next page if self.web_frame.contentsSize().height() > self.page_height: @@ -358,14 +353,20 @@ class Renderer(object): log.debug(u'format_slide - End') return formatted - def _paginate_slide_words(self, lines, line_break): + def _paginate_slide_words(self, text, line_break): """ Figure out how much text can appear on a slide, using the current - theme settings. + theme settings. This version is to handle text which needs to be split + into words to get it to fit. - ``lines`` + ``text`` The words to be fitted on the slide split into lines. + + ``line_break`` + Add line endings after each line of text used for bibles. + """ + print [text] log.debug(u'format_slide - Start') line_end = u'' if line_break: @@ -373,35 +374,69 @@ class Renderer(object): formatted = [] html_text = u'' styled_text = u'' + line_count = 0 + force_current = False + lines = self._lines(text, u'[---]') + # Loop through the lines for line in lines: + line_count += 1 styled_line = expand_tags(line) - if line.startswith(u'{su}'): - styled_line = line_end + styled_line + styled_line = line_end + styled_line styled_text += styled_line - html = self.page_shell + styled_text + u'' + html = self.page_shell + styled_text + HTML_END self.web.setHtml(html) # Text too long so go to next page + print self.web_frame.contentsSize().height() , self.page_height, [line] if self.web_frame.contentsSize().height() > self.page_height: - #split - if html_text.endswith(u'
'): - html_text = html_text[:len(html_text)-4] - formatted.append(html_text) + # we have more than 1 verse on the slide + print "A", line_count + if line_count > 1: + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + force_current = True + print "##### > 1" + print [html_text] html_text = u'' - styled_text = styled_line - html_text += line# + line_end + # only one block on page so lets make it words. + if line_count == 1 or force_current: + print "##### = 1" + print [line] + force_current = False + styled_text = u'' + words = self._words(line) + styled_text = u'' + for word in words: + styled_line = expand_tags(word) + styled_text += styled_line + html = self.page_shell + styled_text + HTML_END + self.web.setHtml(html) + # Text too long so go to next page + print "B", self.web_frame.contentsSize().height() , self.page_height + if self.web_frame.contentsSize().height() > self.page_height: + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + print "c", [html_text] + formatted.append(html_text) + html_text = u'' + + styled_text = styled_line + html_text += word + line_count = 0 + styled_text = styled_line + html_text += line + line_end if html_text.endswith(u'
'): html_text = html_text[:len(html_text)-4] formatted.append(html_text) log.debug(u'format_slide - End') return formatted - - def _lines(self, words): + def _lines(self, words, split=u'\n[---]\n'): """ Split the slide up by physical line """ # this parse we do not want to use this so remove it - words = words.replace(u'\n[---]\n', u'') + words = words.replace(split, u'') verses_text = words.split(u'\n') text = [] for verse in verses_text: @@ -415,7 +450,6 @@ class Renderer(object): Split the slide up by word so can wrap better """ # this parse we are wordy - words = words.replace(u'[---]', u'').lstrip() words = words.replace(u'\n', u' ') verses_text = words.split(u' ') text = [] diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index afbf9764b..8440cb783 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -799,9 +799,9 @@ class BibleMediaItem(MediaManagerItem): else: verse_text = unicode(verse) if self.settings.display_style == DisplayStyle.Round: - return u'\n[---]\n{su}(%s){/su}' % verse_text + return u'[---]{su}(%s){/su}' % verse_text if self.settings.display_style == DisplayStyle.Curly: - return u'\n[---]\n{su}{%s}{/su}' % verse_text + return u'[---]{su}{%s}{/su}' % verse_text if self.settings.display_style == DisplayStyle.Square: - return u'\n[---]\n{su}[%s]{/su}' % verse_text - return u'\n[---]\n{su}%s{/su}' % verse_text + return u'[---]{su}[%s]{/su}' % verse_text + return u'[---]{su}%s{/su}' % verse_text From 34348c84656bc910bc4ac749a755a3888d35097c Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 8 Apr 2011 16:35:33 +0100 Subject: [PATCH 11/14] More changes --- openlp/core/lib/renderer.py | 144 ++++++++++++++++++++++++------------ 1 file changed, 96 insertions(+), 48 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 0ae9149fa..7a9e89f7b 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -214,9 +214,10 @@ class Renderer(object): ``line_break`` Add line endings after each line of text used for bibles. """ + print [text] log.debug(u'format slide') # clean up line endings - lines = self._lines(text) + lines = self._lines_split(text) pages = self._paginate_slide(lines, line_break, self.force_page) if len(pages) > 1: # Songs and Custom @@ -377,66 +378,99 @@ class Renderer(object): line_count = 0 force_current = False lines = self._lines(text, u'[---]') + previous_line = u'' # Loop through the lines for line in lines: - line_count += 1 - styled_line = expand_tags(line) - styled_line = line_end + styled_line - styled_text += styled_line - html = self.page_shell + styled_text + HTML_END - self.web.setHtml(html) - # Text too long so go to next page - print self.web_frame.contentsSize().height() , self.page_height, [line] - if self.web_frame.contentsSize().height() > self.page_height: - # we have more than 1 verse on the slide - print "A", line_count - if line_count > 1: - if html_text.endswith(u'
'): - html_text = html_text[:len(html_text)-4] - formatted.append(html_text) - force_current = True - print "##### > 1" - print [html_text] - html_text = u'' + line_added = False + while not line_added: + line_added = True + line_count += 1 + styled_line = expand_tags(line) + styled_line = line_end + styled_line + previous_line = line + previous_styled = styled_line + styled_text += styled_line + html = self.page_shell + styled_text + HTML_END + self.web.setHtml(html) + # Text too long so go to next page + print self.web_frame.contentsSize().height() , self.page_height, [line] + if self.web_frame.contentsSize().height() > self.page_height: + # we have more than 1 verse on the slide + print "A", line_count + print "AA", [previous_line] + print "AAA", [styled_text] + if line_count > 1: + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + line_added = False + line = previous_line + line_count = 0 + html_text = u'' + print "c", [html_text] + if line_count == 1: + words = self._words_split(line) + for word in words: + styled_word = expand_tags(word) + styled_line = styled_word + #previous_line = line + #previous_styled = styled_line + styled_text += styled_word + html = self.page_shell + styled_text + HTML_END + self.web.setHtml(html) + # Text too long so go to next page + print self.web_frame.contentsSize().height() , self.page_height, [line] + if self.web_frame.contentsSize().height() > self.page_height: + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + html_text = u'' + html_text += word + pass + print "##### > 1" + print [html_text] # only one block on page so lets make it words. - if line_count == 1 or force_current: - print "##### = 1" - print [line] - force_current = False - styled_text = u'' - words = self._words(line) - styled_text = u'' - for word in words: - styled_line = expand_tags(word) - styled_text += styled_line - html = self.page_shell + styled_text + HTML_END - self.web.setHtml(html) - # Text too long so go to next page - print "B", self.web_frame.contentsSize().height() , self.page_height - if self.web_frame.contentsSize().height() > self.page_height: - if html_text.endswith(u'
'): - html_text = html_text[:len(html_text)-4] - print "c", [html_text] - formatted.append(html_text) - html_text = u'' - - styled_text = styled_line - html_text += word - line_count = 0 +# if line_count == 1 or force_current: +# print "##### = 1" +# print [line] +# print [styled_text] +# print [previous_line] +# force_current = False +# #styled_text = u'' +# words = self._words(previous_line) +# styled_text = u'' +# for word in words: +# styled_line = expand_tags(word) +# styled_text += styled_line +# html = self.page_shell + styled_text + HTML_END +# self.web.setHtml(html) +# # Text too long so go to next page +# print "B", self.web_frame.contentsSize().height() , self.page_height +# if self.web_frame.contentsSize().height() > self.page_height: +# if html_text.endswith(u'
'): +# html_text = html_text[:len(html_text)-4] +# print "c", [html_text] +# formatted.append(html_text) +# html_text = u'' +# +# styled_text = styled_line +# html_text += word + #line_count = 0 styled_text = styled_line html_text += line + line_end + previous_line = line if html_text.endswith(u'
'): html_text = html_text[:len(html_text)-4] formatted.append(html_text) log.debug(u'format_slide - End') return formatted - def _lines(self, words, split=u'\n[---]\n'): + def _lines(self, words, split=u'n[---]n'): """ Split the slide up by physical line """ # this parse we do not want to use this so remove it - words = words.replace(split, u'') + #words = words.replace(split, u'') verses_text = words.split(u'\n') text = [] for verse in verses_text: @@ -445,11 +479,11 @@ class Renderer(object): text.append(line) return text - def _words(self, words): + def _words_split(self, words): """ Split the slide up by word so can wrap better """ - # this parse we are wordy + # this parse we are to be wordy words = words.replace(u'\n', u' ') verses_text = words.split(u' ') text = [] @@ -458,3 +492,17 @@ class Renderer(object): for line in lines: text.append(line + u' ') return text + + def _lines_split(self, text): + """ + Split the slide up by physical line + """ + # this parse we do not want to use this so remove it + lines = text.split(u'\n') + real_lines = [] + for line in lines: + line = line.replace(u' [---]', u'[---]') + sub_lines = line.split(u'\n') + for sub_line in sub_lines: + real_lines.append(sub_line) + return real_lines From 9ce234598aa8ab777b51873c0af88a4abda94374 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 8 Apr 2011 20:40:18 +0100 Subject: [PATCH 12/14] Humm --- openlp/core/lib/renderer.py | 39 ++++++------------------------------- 1 file changed, 6 insertions(+), 33 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 7a9e89f7b..34a555229 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -405,14 +405,16 @@ class Renderer(object): formatted.append(html_text) line_added = False line = previous_line - line_count = 0 + line_count = 1 html_text = u'' print "c", [html_text] if line_count == 1: + line_count = 0 words = self._words_split(line) + styled_text = u'' for word in words: styled_word = expand_tags(word) - styled_line = styled_word + #styled_line = styled_word #previous_line = line #previous_styled = styled_line styled_text += styled_word @@ -420,42 +422,13 @@ class Renderer(object): self.web.setHtml(html) # Text too long so go to next page print self.web_frame.contentsSize().height() , self.page_height, [line] - if self.web_frame.contentsSize().height() > self.page_height: + if self.web_frame.contentsSize().height() >= self.page_height: if html_text.endswith(u'
'): html_text = html_text[:len(html_text)-4] formatted.append(html_text) html_text = u'' + styled_text = u'' html_text += word - pass - print "##### > 1" - print [html_text] - # only one block on page so lets make it words. -# if line_count == 1 or force_current: -# print "##### = 1" -# print [line] -# print [styled_text] -# print [previous_line] -# force_current = False -# #styled_text = u'' -# words = self._words(previous_line) -# styled_text = u'' -# for word in words: -# styled_line = expand_tags(word) -# styled_text += styled_line -# html = self.page_shell + styled_text + HTML_END -# self.web.setHtml(html) -# # Text too long so go to next page -# print "B", self.web_frame.contentsSize().height() , self.page_height -# if self.web_frame.contentsSize().height() > self.page_height: -# if html_text.endswith(u'
'): -# html_text = html_text[:len(html_text)-4] -# print "c", [html_text] -# formatted.append(html_text) -# html_text = u'' -# -# styled_text = styled_line -# html_text += word - #line_count = 0 styled_text = styled_line html_text += line + line_end previous_line = line From 501235a6956bca0491582fb6280f7c0b26dcf57d Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 9 Apr 2011 09:11:46 +0100 Subject: [PATCH 13/14] Looking better --- openlp/core/lib/renderer.py | 96 ++++++++++++++++++------------------- 1 file changed, 46 insertions(+), 50 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 34a555229..703e477cd 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -381,57 +381,53 @@ class Renderer(object): previous_line = u'' # Loop through the lines for line in lines: - line_added = False - while not line_added: - line_added = True - line_count += 1 - styled_line = expand_tags(line) - styled_line = line_end + styled_line - previous_line = line - previous_styled = styled_line - styled_text += styled_line - html = self.page_shell + styled_text + HTML_END - self.web.setHtml(html) - # Text too long so go to next page - print self.web_frame.contentsSize().height() , self.page_height, [line] - if self.web_frame.contentsSize().height() > self.page_height: - # we have more than 1 verse on the slide - print "A", line_count - print "AA", [previous_line] - print "AAA", [styled_text] - if line_count > 1: - if html_text.endswith(u'
'): - html_text = html_text[:len(html_text)-4] - formatted.append(html_text) - line_added = False - line = previous_line - line_count = 1 - html_text = u'' - print "c", [html_text] - if line_count == 1: - line_count = 0 - words = self._words_split(line) - styled_text = u'' - for word in words: - styled_word = expand_tags(word) - #styled_line = styled_word - #previous_line = line - #previous_styled = styled_line - styled_text += styled_word - html = self.page_shell + styled_text + HTML_END - self.web.setHtml(html) - # Text too long so go to next page - print self.web_frame.contentsSize().height() , self.page_height, [line] - if self.web_frame.contentsSize().height() >= self.page_height: - if html_text.endswith(u'
'): - html_text = html_text[:len(html_text)-4] - formatted.append(html_text) - html_text = u'' - styled_text = u'' - html_text += word - styled_text = styled_line - html_text += line + line_end + line_count += 1 + styled_line = expand_tags(line) + styled_line = line_end + styled_line previous_line = line + previous_styled = styled_line + styled_text += styled_line + html = self.page_shell + styled_text + HTML_END + self.web.setHtml(html) + # Text too long so go to next page + print self.web_frame.contentsSize().height() , self.page_height, [line] + if self.web_frame.contentsSize().height() > self.page_height: + # we have more than 1 verse on the slide + print "A", line_count + print "AA", [previous_line] + print "AAA", [styled_text] + if line_count > 1: + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + line = previous_line + line_count = 1 + html_text = u'' + print "c", [html_text] + if line_count == 1: + line_count = 0 + words = self._words_split(line) + styled_text = u'' + styled_line = u'' + for word in words: + styled_word = expand_tags(word) + styled_text += styled_word + html = self.page_shell + styled_text + HTML_END + self.web.setHtml(html) + # Text too long so go to next page + print self.web_frame.contentsSize().height() , self.page_height, [line] + if self.web_frame.contentsSize().height() > self.page_height: + if html_text.endswith(u'
'): + html_text = html_text[:len(html_text)-4] + formatted.append(html_text) + html_text = u'' + styled_text = u'' + html_text += word + a=1 + else: + styled_text = styled_line + html_text += line + line_end + previous_line = line if html_text.endswith(u'
'): html_text = html_text[:len(html_text)-4] formatted.append(html_text) From 24ec1abb56b47529bf125b65599f9df08ff71808 Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Sat, 16 Apr 2011 12:36:20 +0100 Subject: [PATCH 14/14] more changes --- openlp/core/lib/renderer.py | 4 ++-- openlp/plugins/bibles/lib/mediaitem.py | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 703e477cd..ac8e26191 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -399,7 +399,7 @@ class Renderer(object): if line_count > 1: if html_text.endswith(u'
'): html_text = html_text[:len(html_text)-4] - formatted.append(html_text) + formatted.append(html_text + line_end) line = previous_line line_count = 1 html_text = u'' @@ -419,7 +419,7 @@ class Renderer(object): if self.web_frame.contentsSize().height() > self.page_height: if html_text.endswith(u'
'): html_text = html_text[:len(html_text)-4] - formatted.append(html_text) + formatted.append(html_text + line_break) html_text = u'' styled_text = u'' html_text += word diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 8440cb783..405507523 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -799,9 +799,9 @@ class BibleMediaItem(MediaManagerItem): else: verse_text = unicode(verse) if self.settings.display_style == DisplayStyle.Round: - return u'[---]{su}(%s){/su}' % verse_text + return u'{su}(%s){/su}' % verse_text if self.settings.display_style == DisplayStyle.Curly: - return u'[---]{su}{%s}{/su}' % verse_text + return u'{su}{%s}{/su}' % verse_text if self.settings.display_style == DisplayStyle.Square: - return u'[---]{su}[%s]{/su}' % verse_text - return u'[---]{su}%s{/su}' % verse_text + return u'{su}[%s]{/su}' % verse_text + return u'{su}%s{/su}' % verse_text