- improved rendering speed by checking if the text fits as a whole (to save time figuring out that it fits as a whole)

- use binary chop to find the number of lines which will fit on a slide (if it does not fit as a whole)
- do not use instance variables as arguments
- renamed image_manager to imageManager and theme_manager to themeManager as the classes are derived of Qt

Some changes to html (html5):
- added doctype
- removed obsolete language attribute

bzr-revno: 1694
This commit is contained in:
Andreas Preikschat 2011-07-24 19:52:53 +02:00
commit 187bb647c0
7 changed files with 201 additions and 178 deletions

View File

@ -34,6 +34,7 @@ from openlp.core.lib.theme import BackgroundType, BackgroundGradientType, \
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
# FIXME: Add html5 doctype. However, do not break theme gradients.
HTMLSRC = u""" HTMLSRC = u"""
<html> <html>
<head> <head>
@ -56,44 +57,44 @@ body {
height: %spx; height: %spx;
} }
#black { #black {
z-index:8; z-index: 8;
background-color: black; background-color: black;
display: none; display: none;
} }
#bgimage { #bgimage {
z-index:1; z-index: 1;
} }
#image { #image {
z-index:2; z-index: 2;
} }
#video1 { #video1 {
z-index:3; z-index: 3;
} }
#video2 { #video2 {
z-index:3; z-index: 3;
} }
#alert { #alert {
position: absolute; position: absolute;
left: 0px; left: 0px;
top: 0px; top: 0px;
z-index:10; z-index: 10;
%s %s
} }
#footer { #footer {
position: absolute; position: absolute;
z-index:6; z-index: 6;
%s %s
} }
/* lyric css */ /* lyric css */
%s %s
sup { sup {
font-size:0.6em; font-size: 0.6em;
vertical-align:top; vertical-align: top;
position:relative; position: relative;
top:-0.3em; top: -0.3em;
} }
</style> </style>
<script language="javascript"> <script>
var timer = null; var timer = null;
var video_timer = null; var video_timer = null;
var current_video = '1'; var current_video = '1';
@ -317,10 +318,10 @@ sup {
%s %s
<div id="footer" class="footer"></div> <div id="footer" class="footer"></div>
<div id="black" class="size"></div> <div id="black" class="size"></div>
<div id="alert" style="visibility:hidden;"></div> <div id="alert" style="visibility:hidden"></div>
</body> </body>
</html> </html>
""" """
def build_html(item, screen, alert, islive, background, image=None): def build_html(item, screen, alert, islive, background, image=None):
""" """
@ -446,15 +447,15 @@ def build_lyrics_css(item, webkitvers):
The version of qtwebkit we're using The version of qtwebkit we're using
""" """
style = """ style = u"""
.lyricstable { .lyricstable {
z-index:5; z-index: 5;
position: absolute; position: absolute;
display: table; display: table;
%s %s
} }
.lyricscell { .lyricscell {
display:table-cell; display: table-cell;
word-wrap: break-word; word-wrap: break-word;
%s %s
} }
@ -558,8 +559,8 @@ def build_lyrics_format_css(theme, width, height):
left_margin = 0 left_margin = 0
lyrics = u'white-space:pre-wrap; word-wrap: break-word; ' \ lyrics = u'white-space:pre-wrap; word-wrap: break-word; ' \
'text-align: %s; vertical-align: %s; font-family: %s; ' \ 'text-align: %s; vertical-align: %s; font-family: %s; ' \
'font-size: %spt; color: %s; line-height: %d%%; margin:0;' \ 'font-size: %spt; color: %s; line-height: %d%%; margin: 0;' \
'padding:0; padding-left:%spx; width: %spx; height: %spx; ' % \ 'padding: 0; padding-left: %spx; width: %spx; height: %spx; ' % \
(align, valign, theme.font_main_name, theme.font_main_size, (align, valign, theme.font_main_name, theme.font_main_size,
theme.font_main_color, 100 + int(theme.font_main_line_adjustment), theme.font_main_color, 100 + int(theme.font_main_line_adjustment),
left_margin, width, height) left_margin, width, height)
@ -608,7 +609,7 @@ def build_footer_css(item, height):
``item`` ``item``
Service Item to be processed. Service Item to be processed.
""" """
style = """ style = u"""
left: %spx; left: %spx;
bottom: %spx; bottom: %spx;
width: %spx; width: %spx;
@ -616,7 +617,7 @@ def build_footer_css(item, height):
font-size: %spt; font-size: %spt;
color: %s; color: %s;
text-align: left; text-align: left;
white-space:nowrap; white-space: nowrap;
""" """
theme = item.themedata theme = item.themedata
if not theme or not item.footer: if not theme or not item.footer:
@ -634,7 +635,7 @@ def build_alert_css(alertTab, width):
``alertTab`` ``alertTab``
Details from the Alert tab for fonts etc Details from the Alert tab for fonts etc
""" """
style = """ style = u"""
width: %spx; width: %spx;
vertical-align: %s; vertical-align: %s;
font-family: %s; font-family: %s;

View File

@ -56,20 +56,20 @@ class Renderer(object):
""" """
log.info(u'Renderer Loaded') log.info(u'Renderer Loaded')
def __init__(self, image_manager, theme_manager): def __init__(self, imageManager, themeManager):
""" """
Initialise the render manager. Initialise the render manager.
``image_manager`` ``imageManager``
A ImageManager instance which takes care of e. g. caching and resizing A ImageManager instance which takes care of e. g. caching and resizing
images. images.
``theme_manager`` ``themeManager``
The ThemeManager instance, used to get the current theme details. The ThemeManager instance, used to get the current theme details.
""" """
log.debug(u'Initialisation started') log.debug(u'Initialisation started')
self.theme_manager = theme_manager self.themeManager = themeManager
self.image_manager = image_manager self.imageManager = imageManager
self.screens = ScreenList.get_instance() self.screens = ScreenList.get_instance()
self.service_theme = u'' self.service_theme = u''
self.theme_level = u'' self.theme_level = u''
@ -77,7 +77,7 @@ class Renderer(object):
self.theme_data = None self.theme_data = None
self.bg_frame = None self.bg_frame = None
self.force_page = False self.force_page = False
self.display = MainDisplay(None, self.image_manager, False) self.display = MainDisplay(None, self.imageManager, False)
self.display.setup() self.display.setup()
def update_display(self): def update_display(self):
@ -88,7 +88,7 @@ class Renderer(object):
self._calculate_default(self.screens.current[u'size']) self._calculate_default(self.screens.current[u'size'])
if self.display: if self.display:
self.display.close() self.display.close()
self.display = MainDisplay(None, self.image_manager, False) self.display = MainDisplay(None, self.imageManager, False)
self.display.setup() self.display.setup()
self.bg_frame = None self.bg_frame = None
self.theme_data = None self.theme_data = None
@ -101,14 +101,14 @@ class Renderer(object):
The global-level theme to be set. The global-level theme to be set.
``theme_level`` ``theme_level``
Defaults to *``ThemeLevel.Global``*. The theme level, can be Defaults to ``ThemeLevel.Global``. The theme level, can be
``ThemeLevel.Global``, ``ThemeLevel.Service`` or ``ThemeLevel.Global``, ``ThemeLevel.Service`` or
``ThemeLevel.Song``. ``ThemeLevel.Song``.
""" """
self.global_theme = global_theme self.global_theme = global_theme
self.theme_level = theme_level self.theme_level = theme_level
self.global_theme_data = \ self.global_theme_data = \
self.theme_manager.getThemeData(self.global_theme) self.themeManager.getThemeData(self.global_theme)
self.theme_data = None self.theme_data = None
def set_service_theme(self, service_theme): def set_service_theme(self, service_theme):
@ -162,12 +162,12 @@ class Renderer(object):
if override_levels: if override_levels:
self.theme_data = override_theme self.theme_data = override_theme
else: else:
self.theme_data = self.theme_manager.getThemeData(theme) self.theme_data = self.themeManager.getThemeData(theme)
self._calculate_default(self.screens.current[u'size']) self._calculate_default(self.screens.current[u'size'])
self._build_text_rectangle(self.theme_data) self._build_text_rectangle(self.theme_data)
# if No file do not update cache # if No file do not update cache
if self.theme_data.background_filename: if self.theme_data.background_filename:
self.image_manager.add_image(self.theme_data.theme_name, self.imageManager.add_image(self.theme_data.theme_name,
self.theme_data.background_filename) self.theme_data.background_filename)
return self._rect, self._rect_footer return self._rect, self._rect_footer
@ -193,7 +193,7 @@ class Renderer(object):
# make big page for theme edit dialog to get line count # make big page for theme edit dialog to get line count
serviceItem.add_from_text(u'', VERSE + VERSE + VERSE) serviceItem.add_from_text(u'', VERSE + VERSE + VERSE)
else: else:
self.image_manager.del_image(theme_data.theme_name) self.imageManager.del_image(theme_data.theme_name)
serviceItem.add_from_text(u'', VERSE) serviceItem.add_from_text(u'', VERSE)
serviceItem.renderer = self serviceItem.renderer = self
serviceItem.raw_footer = FOOTER serviceItem.raw_footer = FOOTER
@ -205,43 +205,52 @@ class Renderer(object):
# Reset the real screen size for subsequent render requests # 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 return preview
self.force_page = False
def format_slide(self, text, line_break, item): def format_slide(self, text, item):
""" """
Calculate how much text can fit on a slide. Calculate how much text can fit on a slide.
``text`` ``text``
The words to go on the slides. The words to go on the slides.
``line_break`` ``item``
Add line endings after each line of text used for bibles. The :class:`~openlp.core.lib.serviceitem.ServiceItem` item object.
""" """
log.debug(u'format slide') log.debug(u'format slide')
# clean up line endings # Add line endings after each line of text used for bibles.
lines = self._lines_split(text) line_end = u'<br>'
pages = self._paginate_slide(lines, line_break, self.force_page) if item.is_capable(ItemCapabilities.NoLineBreaks):
if len(pages) > 1: line_end = u' '
# Songs and Custom # Bibles
if item.is_capable(ItemCapabilities.AllowsVirtualSplit): if item.is_capable(ItemCapabilities.AllowsWordSplit):
# Do not forget the line breaks ! pages = self._paginate_slide_words(text, line_end)
slides = text.split(u'[---]') else:
pages = [] # Clean up line endings.
for slide in slides: lines = self._lines_split(text)
lines = slide.strip(u'\n').split(u'\n') pages = self._paginate_slide(lines, line_end)
new_pages = self._paginate_slide(lines, line_break, if len(pages) > 1:
self.force_page) # Songs and Custom
pages.extend(new_pages) if item.is_capable(ItemCapabilities.AllowsVirtualSplit):
# Bibles # Do not forget the line breaks!
elif item.is_capable(ItemCapabilities.AllowsWordSplit): slides = text.split(u'[---]')
pages = self._paginate_slide_words(text, line_break) pages = []
return pages for slide in slides:
lines = slide.strip(u'\n').split(u'\n')
pages.extend(self._paginate_slide(lines, line_end))
new_pages = []
for page in pages:
while page.endswith(u'<br>'):
page = page[:-4]
new_pages.append(page)
return new_pages
def _calculate_default(self, screen): def _calculate_default(self, screen):
""" """
Calculate the default dimentions of the screen. Calculate the default dimentions of the screen.
``screen`` ``screen``
The QSize of the screen. The screen to calculate the default of.
""" """
log.debug(u'_calculate default %s', screen) log.debug(u'_calculate default %s', screen)
self.width = screen.width() self.width = screen.width()
@ -301,61 +310,44 @@ class Renderer(object):
self.web.resize(self.page_width, self.page_height) self.web.resize(self.page_width, self.page_height)
self.web_frame = self.web.page().mainFrame() self.web_frame = self.web.page().mainFrame()
# Adjust width and height to account for shadow. outline done in css # Adjust width and height to account for shadow. outline done in css
self.page_shell = u'<html><head><style>' \ self.page_shell = u'<!DOCTYPE html><html><head><style>' \
u'*{margin: 0; padding: 0; border: 0;} '\ u'*{margin:0; padding:0; border:0;} '\
u'#main {position:absolute; top:0px; %s %s}</style></head><body>' \ u'#main {position:absolute; top:0px; %s %s}</style></head><body>' \
u'<div id="main">' % \ u'<div id="main">' % \
(build_lyrics_format_css(self.theme_data, self.page_width, (build_lyrics_format_css(self.theme_data, self.page_width,
self.page_height), build_lyrics_outline_css(self.theme_data)) self.page_height), build_lyrics_outline_css(self.theme_data))
def _paginate_slide(self, lines, line_break, force_page=False): def _paginate_slide(self, lines, line_end):
""" """
Figure out how much text can appear on a slide, using the current Figure out how much text can appear on a slide, using the current
theme settings. theme settings.
``lines`` ``lines``
The words to be fitted on the slide split into lines. The text 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.
``line_end``
The text added after each line. Either ``u' '`` or ``u'<br>``.
""" """
log.debug(u'_paginate_slide - Start') log.debug(u'_paginate_slide - Start')
line_end = u''
if line_break:
line_end = u'<br>'
formatted = [] formatted = []
html_text = u'' previous_html = u''
styled_text = u'' previous_raw = u''
line_count = 0 separator = u'<br>'
for line in lines: html_lines = map(expand_tags, lines)
if line_count != -1: html = self.page_shell + separator.join(html_lines) + HTML_END
line_count += 1 self.web.setHtml(html)
styled_line = expand_tags(line) + line_end # Text too long so go to next page.
styled_text += styled_line if self.web_frame.contentsSize().height() > self.page_height:
html = self.page_shell + styled_text + HTML_END html_text, previous_raw = self._binary_chop(formatted,
self.web.setHtml(html) previous_html, previous_raw, html_lines, lines, separator, u'')
# Text too long so go to next page. else:
if self.web_frame.contentsSize().height() > self.page_height: previous_raw = separator.join(lines)
if force_page and line_count > 0: if previous_raw:
Receiver.send_message(u'theme_line_count', line_count - 1) formatted.append(previous_raw)
line_count = -1
while html_text.endswith(u'<br>'):
html_text = html_text[:-4]
formatted.append(html_text)
html_text = u''
styled_text = styled_line
html_text += line + line_end
while html_text.endswith(u'<br>'):
html_text = html_text[:-4]
formatted.append(html_text)
log.debug(u'_paginate_slide - End') log.debug(u'_paginate_slide - End')
return formatted return formatted
def _paginate_slide_words(self, text, line_break): def _paginate_slide_words(self, text, line_end):
""" """
Figure out how much text can appear on a slide, using the current Figure out how much text can appear on a slide, using the current
theme settings. This version is to handle text which needs to be split theme settings. This version is to handle text which needs to be split
@ -364,22 +356,19 @@ class Renderer(object):
``text`` ``text``
The words to be fitted on the slide split into lines. The words to be fitted on the slide split into lines.
``line_break`` ``line_end``
Add line endings after each line of text used for bibles. The text added after each line. Either ``u' '`` or ``u'<br>``.
This is needed for bibles.
""" """
log.debug(u'_paginate_slide_words - Start') log.debug(u'_paginate_slide_words - Start')
line_end = u' '
if line_break:
line_end = u'<br>'
formatted = [] formatted = []
previous_html = u'' previous_html = u''
previous_raw = u'' previous_raw = u''
lines = text.split(u'\n') lines = text.split(u'\n')
for line in lines: for line in lines:
line = line.strip() line = line.strip()
styled_line = expand_tags(line) html_line = expand_tags(line)
html = self.page_shell + previous_html + styled_line + HTML_END html = self.page_shell + previous_html + html_line + HTML_END
self.web.setHtml(html) self.web.setHtml(html)
# Text too long so go to next page. # Text too long so go to next page.
if self.web_frame.contentsSize().height() > self.page_height: if self.web_frame.contentsSize().height() > self.page_height:
@ -390,88 +379,123 @@ class Renderer(object):
self.web.setHtml(html) self.web.setHtml(html)
if self.web_frame.contentsSize().height() <= \ if self.web_frame.contentsSize().height() <= \
self.page_height: self.page_height:
while previous_raw.endswith(u'<br>'):
previous_raw = previous_raw[:-4]
formatted.append(previous_raw) formatted.append(previous_raw)
previous_html = u'' previous_html = u''
previous_raw = u'' previous_raw = u''
html = self.page_shell + styled_line + HTML_END html = self.page_shell + html_line + HTML_END
self.web.setHtml(html) self.web.setHtml(html)
# Now check if the current verse will fit, if it does # Now check if the current verse will fit, if it does
# not we have to start to process the verse word by # not we have to start to process the verse word by
# word. # word.
if self.web_frame.contentsSize().height() <= \ if self.web_frame.contentsSize().height() <= \
self.page_height: self.page_height:
previous_html = styled_line + line_end previous_html = html_line + line_end
previous_raw = line + line_end previous_raw = line + line_end
continue continue
# Figure out how many words of the line will fit on screen by # Figure out how many words of the line will fit on screen as
# using the algorithm known as "binary chop". # the line will not fit as a whole.
raw_words = self._words_split(line) raw_words = self._words_split(line)
html_words = [expand_tags(word) for word in raw_words] html_words = map(expand_tags, raw_words)
smallest_index = 0 previous_html, previous_raw = self._binary_chop(
highest_index = len(html_words) - 1 formatted, previous_html, previous_raw, html_words,
index = int(highest_index / 2) raw_words, u' ', line_end)
while True:
html = self.page_shell + previous_html + \
u''.join(html_words[:index + 1]).strip() + HTML_END
self.web.setHtml(html)
if self.web_frame.contentsSize().height() > \
self.page_height:
# We know that it does not fit, so change/calculate the
# new index and highest_index accordingly.
highest_index = index
index = int(index - (index - smallest_index) / 2)
else:
smallest_index = index
index = int(index + (highest_index - index) / 2)
# We found the number of words which will fit.
if smallest_index == index or highest_index == index:
index = smallest_index
formatted.append(previous_raw.rstrip(u'<br>') +
u''.join(raw_words[:index + 1]))
previous_html = u''
previous_raw = u''
else:
continue
# Check if the rest of the line fits on the slide. If it
# does we do not have to do the much more intensive "word by
# word" checking.
html = self.page_shell + \
u''.join(html_words[index + 1:]).strip() + HTML_END
self.web.setHtml(html)
if self.web_frame.contentsSize().height() <= \
self.page_height:
previous_html = \
u''.join(html_words[index + 1:]).strip() + line_end
previous_raw = \
u''.join(raw_words[index + 1:]).strip() + line_end
break
else:
# The other words do not fit, thus reset the indexes,
# create a new list and continue with "word by word".
raw_words = raw_words[index + 1:]
html_words = html_words[index + 1:]
smallest_index = 0
highest_index = len(html_words) - 1
index = int(highest_index / 2)
else: else:
previous_html += styled_line + line_end previous_html += html_line + line_end
previous_raw += line + line_end previous_raw += line + line_end
while previous_raw.endswith(u'<br>'):
previous_raw = previous_raw[:-4]
formatted.append(previous_raw) formatted.append(previous_raw)
log.debug(u'_paginate_slide_words - End') log.debug(u'_paginate_slide_words - End')
return formatted return formatted
def _binary_chop(self, formatted, previous_html, previous_raw, html_list,
raw_list, separator, line_end):
"""
This implements the binary chop algorithm for faster rendering. This
algorithm works line based (line by line) and word based (word by word).
It is assumed that this method is **only** called, when the lines/words
to be rendered do **not** fit as a whole.
``formatted``
The list to append any slides.
``previous_html``
The html text which is know to fit on a slide, but is not yet added
to the list of slides. (unicode string)
``previous_raw``
The raw text (with display tags) which is know to fit on a slide,
but is not yet added to the list of slides. (unicode string)
``html_list``
The elements which do not fit on a slide and needs to be processed
using the binary chop. The text contains html.
``raw_list``
The elements which do not fit on a slide and needs to be processed
using the binary chop. The elements can contain display tags.
``separator``
The separator for the elements. For lines this is ``u'<br>'`` and
for words this is ``u' '``.
``line_end``
The text added after each "element line". Either ``u' '`` or
``u'<br>``. This is needed for bibles.
"""
smallest_index = 0
highest_index = len(html_list) - 1
index = int(highest_index / 2)
while True:
html = self.page_shell + previous_html + \
separator.join(html_list[:index + 1]).strip() + HTML_END
self.web.setHtml(html)
if self.web_frame.contentsSize().height() > self.page_height:
# We know that it does not fit, so change/calculate the
# new index and highest_index accordingly.
highest_index = index
index = int(index - (index - smallest_index) / 2)
else:
smallest_index = index
index = int(index + (highest_index - index) / 2)
# We found the number of words which will fit.
if smallest_index == index or highest_index == index:
index = smallest_index
formatted.append(previous_raw.rstrip(u'<br>') +
separator.join(raw_list[:index + 1]))
previous_html = u''
previous_raw = u''
# Stop here as the theme line count was requested.
if self.force_page:
Receiver.send_message(u'theme_line_count', index + 1)
break
else:
continue
# Check if the remaining elements fit on the slide.
html = self.page_shell + \
separator.join(html_list[index + 1:]).strip() + HTML_END
self.web.setHtml(html)
if self.web_frame.contentsSize().height() <= self.page_height:
previous_html = separator.join(
html_list[index + 1:]).strip() + line_end
previous_raw = separator.join(
raw_list[index + 1:]).strip() + line_end
break
else:
# The remaining elements do not fit, thus reset the indexes,
# create a new list and continue.
raw_list = raw_list[index + 1:]
html_list = html_list[index + 1:]
smallest_index = 0
highest_index = len(html_list) - 1
index = int(highest_index / 2)
return previous_html, previous_raw
def _words_split(self, line): def _words_split(self, line):
""" """
Split the slide up by word so can wrap better Split the slide up by word so can wrap better
""" """
# this parse we are to be wordy # this parse we are to be wordy
line = line.replace(u'\n', u' ') line = line.replace(u'\n', u' ')
words = line.split(u' ') return line.split(u' ')
return [word + u' ' for word in words]
def _lines_split(self, text): def _lines_split(self, text):
""" """
@ -479,5 +503,5 @@ class Renderer(object):
""" """
# this parse we do not want to use this so remove it # this parse we do not want to use this so remove it
text = text.replace(u'\n[---]', u'') text = text.replace(u'\n[---]', u'')
lines = text.split(u'\n') text = text.replace(u'[---]', u'')
return [line.replace(u'[---]', u'') for line in lines] return text.split(u'\n')

View File

@ -164,7 +164,6 @@ class ServiceItem(object):
log.debug(u'Render called') log.debug(u'Render called')
self._display_frames = [] self._display_frames = []
self.bg_image_bytes = None self.bg_image_bytes = None
line_break = not self.is_capable(ItemCapabilities.NoLineBreaks)
theme = self.theme if self.theme else None theme = self.theme if self.theme else None
self.main, self.footer = \ self.main, self.footer = \
self.renderer.set_override_theme(theme, use_override) self.renderer.set_override_theme(theme, use_override)
@ -172,9 +171,8 @@ class ServiceItem(object):
if self.service_item_type == ServiceItemType.Text: if self.service_item_type == ServiceItemType.Text:
log.debug(u'Formatting slides') log.debug(u'Formatting slides')
for slide in self._raw_frames: for slide in self._raw_frames:
formatted = self.renderer \ pages = self.renderer.format_slide(slide[u'raw_slide'], self)
.format_slide(slide[u'raw_slide'], line_break, self) for page in pages:
for page in formatted:
page = page.replace(u'<br>', u'{br}') page = page.replace(u'<br>', u'{br}')
html = expand_tags(cgi.escape(page.rstrip())) html = expand_tags(cgi.escape(page.rstrip()))
self._display_frames.append({ self._display_frames.append({
@ -209,7 +207,7 @@ class ServiceItem(object):
""" """
self.service_item_type = ServiceItemType.Image self.service_item_type = ServiceItemType.Image
self._raw_frames.append({u'title': title, u'path': path}) self._raw_frames.append({u'title': title, u'path': path})
self.renderer.image_manager.add_image(title, path) self.renderer.imageManager.add_image(title, path)
self._new_item() self._new_item()
def add_from_text(self, title, raw_slide, verse_tag=None): def add_from_text(self, title, raw_slide, verse_tag=None):
@ -463,7 +461,7 @@ class ServiceItem(object):
elif not start and end: elif not start and end:
return end return end
else: else:
return u'%s <br />%s' % (start, end) return u'%s <br>%s' % (start, end)
def update_theme(self, theme): def update_theme(self, theme):
""" """

View File

@ -48,13 +48,13 @@ class MainDisplay(QtGui.QGraphicsView):
""" """
This is the display screen. This is the display screen.
""" """
def __init__(self, parent, image_manager, live): def __init__(self, parent, imageManager, live):
if live: if live:
QtGui.QGraphicsView.__init__(self) QtGui.QGraphicsView.__init__(self)
else: else:
QtGui.QGraphicsView.__init__(self, parent) QtGui.QGraphicsView.__init__(self, parent)
self.isLive = live self.isLive = live
self.image_manager = image_manager self.imageManager = imageManager
self.screens = ScreenList.get_instance() self.screens = ScreenList.get_instance()
self.alertTab = None self.alertTab = None
self.hideMode = None self.hideMode = None
@ -232,7 +232,7 @@ class MainDisplay(QtGui.QGraphicsView):
""" """
API for replacement backgrounds so Images are added directly to cache API for replacement backgrounds so Images are added directly to cache
""" """
self.image_manager.add_image(name, path) self.imageManager.add_image(name, path)
if hasattr(self, u'serviceItem'): if hasattr(self, u'serviceItem'):
self.override[u'image'] = name self.override[u'image'] = name
self.override[u'theme'] = self.serviceItem.themedata.theme_name self.override[u'theme'] = self.serviceItem.themedata.theme_name
@ -249,7 +249,7 @@ class MainDisplay(QtGui.QGraphicsView):
The name of the image to be displayed The name of the image to be displayed
""" """
log.debug(u'image to display') log.debug(u'image to display')
image = self.image_manager.get_image_bytes(name) image = self.imageManager.get_image_bytes(name)
self.resetVideo() self.resetVideo()
self.displayImage(image) self.displayImage(image)
return self.preview() return self.preview()
@ -482,13 +482,13 @@ class MainDisplay(QtGui.QGraphicsView):
self.override = {} self.override = {}
else: else:
# replace the background # replace the background
background = self.image_manager. \ background = self.imageManager. \
get_image_bytes(self.override[u'image']) get_image_bytes(self.override[u'image'])
if self.serviceItem.themedata.background_filename: if self.serviceItem.themedata.background_filename:
self.serviceItem.bg_image_bytes = self.image_manager. \ self.serviceItem.bg_image_bytes = self.imageManager. \
get_image_bytes(self.serviceItem.themedata.theme_name) get_image_bytes(self.serviceItem.themedata.theme_name)
if image: if image:
image_bytes = self.image_manager.get_image_bytes(image) image_bytes = self.imageManager.get_image_bytes(image)
else: else:
image_bytes = None image_bytes = None
html = build_html(self.serviceItem, self.screen, self.alertTab, html = build_html(self.serviceItem, self.screen, self.alertTab,

View File

@ -240,7 +240,7 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
translate('OpenLP.ServiceManager', 'Notes: '), p, translate('OpenLP.ServiceManager', 'Notes: '), p,
classId=u'itemNotesTitle') classId=u'itemNotesTitle')
notes = self._addElement(u'span', notes = self._addElement(u'span',
item.notes.replace(u'\n', u'<br />'), p, item.notes.replace(u'\n', u'<br>'), p,
classId=u'itemNotesText') classId=u'itemNotesText')
# Add play length of media files. # Add play length of media files.
if item.is_media() and self.metaDataCheckBox.isChecked(): if item.is_media() and self.metaDataCheckBox.isChecked():

View File

@ -943,7 +943,7 @@ class ServiceManager(QtGui.QWidget):
if item[u'service_item'] \ if item[u'service_item'] \
.is_capable(ItemCapabilities.AllowsVariableStartTime): .is_capable(ItemCapabilities.AllowsVariableStartTime):
tips.append(item[u'service_item'].get_media_time()) tips.append(item[u'service_item'].get_media_time())
treewidgetitem.setToolTip(0, u'<br />'.join(tips)) treewidgetitem.setToolTip(0, u'<br>'.join(tips))
treewidgetitem.setData(0, QtCore.Qt.UserRole, treewidgetitem.setData(0, QtCore.Qt.UserRole,
QtCore.QVariant(item[u'order'])) QtCore.QVariant(item[u'order']))
treewidgetitem.setSelected(item[u'selected']) treewidgetitem.setSelected(item[u'selected'])

View File

@ -90,7 +90,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.onVerseListViewPressed) self.onVerseListViewPressed)
QtCore.QObject.connect(self.themeAddButton, QtCore.QObject.connect(self.themeAddButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'),
self.mediaitem.plugin.renderer.theme_manager.onAddTheme) self.mediaitem.plugin.renderer.themeManager.onAddTheme)
QtCore.QObject.connect(self.maintenanceButton, QtCore.QObject.connect(self.maintenanceButton,
QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked) QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),