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