openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #03213
[Merge] lp:~j-corwin/openlp/render into lp:openlp
Jonathan Corwin has proposed merging lp:~j-corwin/openlp/render into lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
Replace QtTextDocument with QWebView in renderer to more accurately detect page breaks.
Prevent multiple spaces getting compressed
Other HTML/CSS tidies
--
https://code.launchpad.net/~j-corwin/openlp/render/+merge/34614
Your team OpenLP Core is requested to review the proposed merge of lp:~j-corwin/openlp/render into lp:openlp.
=== modified file 'openlp/core/lib/__init__.py'
--- openlp/core/lib/__init__.py 2010-09-04 08:12:54 +0000
+++ openlp/core/lib/__init__.py 2010-09-04 13:57:42 +0000
@@ -325,7 +325,8 @@
from serviceitem import ServiceItem
from serviceitem import ServiceItemType
from serviceitem import ItemCapabilities
-from htmlbuilder import build_html
+from htmlbuilder import build_html, build_lyrics_format_css, \
+ build_lyrics_outline_css
from toolbar import OpenLPToolbar
from dockwidget import OpenLPDockWidget
from theme import ThemeLevel, ThemeXML
=== modified file 'openlp/core/lib/htmlbuilder.py'
--- openlp/core/lib/htmlbuilder.py 2010-09-04 07:48:58 +0000
+++ openlp/core/lib/htmlbuilder.py 2010-09-04 13:57:42 +0000
@@ -266,14 +266,18 @@
`islive`
Item is going live, rather than preview/theme building
"""
+<<<<<<< TREE
try:
webkitvers = float(QtWebKit.qWebKitVersion())
log.debug(u'Webkit version = %s' % webkitvers)
except AttributeError:
webkitvers = 0
+=======
+>>>>>>> MERGE-SOURCE
width = screen[u'size'].width()
height = screen[u'size'].height()
theme = item.themedata
+ webkitvers = webkit_version()
if item.bg_frame:
image = u'data:image/png;base64,%s' % image_to_byte(item.bg_frame)
else:
@@ -289,6 +293,7 @@
build_lyrics_html(item, webkitvers))
return html
+<<<<<<< TREE
def build_background_css(item, width, height):
"""
Build the background css
@@ -321,9 +326,18 @@
theme.background_endColor)
return background
+=======
+def webkit_version():
+ try:
+ webkitvers = float(QtWebKit.qWebKitVersion())
+ except AttributeError:
+ webkitvers = 0
+ return webkitvers
+
+>>>>>>> MERGE-SOURCE
def build_lyrics_css(item, webkitvers):
"""
- Build the video display css
+ Build the lyrics display css
`item`
Service Item containing theme and location information
@@ -333,6 +347,7 @@
"""
style = """
+<<<<<<< TREE
.lyricstable {
z-index:4;
position: absolute;
@@ -352,6 +367,26 @@
}
.lyricsshadow {
%s
+=======
+.lyricstable {
+ z-index:4;
+ position: absolute;
+ display: table;
+ %s
+}
+.lyricscell {
+ display:table-cell;
+ %s
+}
+.lyricsmain {
+%s
+}
+.lyricsoutline {
+%s
+}
+.lyricsshadow {
+%s
+>>>>>>> MERGE-SOURCE
}
"""
theme = item.themedata
@@ -363,6 +398,7 @@
if theme:
lyricstable = u'left: %spx; top: %spx;' % \
(item.main.x(), item.main.y())
+<<<<<<< TREE
if theme.display_horizontalAlign == 2:
align = u'center'
elif theme.display_horizontalAlign == 1:
@@ -381,6 +417,10 @@
(item.main.width(), item.main.height(), align, valign,
theme.font_main_name, theme.font_main_proportion,
theme.font_main_color, 100 + int(theme.font_main_line_adjustment))
+=======
+ lyrics = build_lyrics_format_css(theme, item.main.width(),
+ item.main.height())
+>>>>>>> MERGE-SOURCE
# For performance reasons we want to show as few DIV's as possible,
# especially when animating/transitions.
# However some bugs in older versions of qtwebkit mean we need to
@@ -396,6 +436,7 @@
# Before 534.4 the text-shadow didn't get displayed when
# webkit-text-stroke was used. So use an offset text layer underneath.
# https://bugs.webkit.org/show_bug.cgi?id=19728
+<<<<<<< TREE
if theme.display_outline:
if webkitvers < 534.3:
lyrics += u' letter-spacing: 1px;'
@@ -417,9 +458,82 @@
lyricsmain += u' text-shadow: %s %spx %spx;' % \
(theme.display_shadow_color, theme.display_shadow_size,
theme.display_shadow_size)
+=======
+ if webkitvers >= 533.3:
+ lyricsmain += build_lyrics_outline_css(theme)
+ else:
+ outline = build_lyrics_outline_css(theme)
+ if theme.display_shadow:
+ if theme.display_outline and webkitvers < 534.3:
+ shadow = u'padding-left: %spx; padding-top: %spx ' % \
+ (theme.display_shadow_size, theme.display_shadow_size)
+ shadow += build_lyrics_outline_css(theme, True)
+ else:
+ lyricsmain += u' text-shadow: %s %spx %spx;' % \
+ (theme.display_shadow_color, theme.display_shadow_size,
+ theme.display_shadow_size)
+>>>>>>> MERGE-SOURCE
lyrics_css = style % (lyricstable, lyrics, lyricsmain, outline, shadow)
return lyrics_css
-
+<<<<<<< TREE
+
+=======
+
+def build_lyrics_outline_css(theme, is_shadow=False):
+ if theme.display_outline:
+ size = float(theme.display_outline_size) / 16
+ if is_shadow:
+ fill_color = theme.display_shadow_color
+ outline_color = theme.display_shadow_color
+ else:
+ fill_color = theme.font_main_color
+ outline_color = theme.display_outline_color
+ return u' -webkit-text-stroke: %sem %s; ' \
+ u'-webkit-text-fill-color: %s; ' % (size, outline_color, fill_color)
+ else:
+ return u''
+
+def build_lyrics_format_css(theme, width, height):
+ """
+ Build the css which controls the theme format
+ Also used by renderer for splitting verses
+
+ `item`
+ Service Item containing theme and location information
+
+ `webkitvers`
+ The version of qtwebkit we're using
+
+ """
+ if theme.display_horizontalAlign == 2:
+ align = u'center'
+ elif theme.display_horizontalAlign == 1:
+ align = u'right'
+ else:
+ align = u'left'
+ if theme.display_verticalAlign == 2:
+ valign = u'bottom'
+ elif theme.display_verticalAlign == 1:
+ valign = u'middle'
+ else:
+ valign = u'top'
+ lyrics = u'white-space:pre-wrap; word-wrap: break-word; ' \
+ 'text-align: %s; vertical-align: %s; font-family: %s; ' \
+ 'font-size: %spt; color: %s; line-height: %d%%; ' \
+ 'margin:0; padding:0; width: %spx; height: %spx; ' % \
+ (align, valign, theme.font_main_name, theme.font_main_proportion,
+ theme.font_main_color, 100 + int(theme.font_main_line_adjustment),
+ width, height)
+ if theme.display_outline:
+ if webkit_version() < 534.3:
+ lyrics += u' letter-spacing: 1px;'
+ if theme.font_main_italics:
+ lyrics += u' font-style:italic; '
+ if theme.font_main_weight == u'Bold':
+ lyrics += u' font-weight:bold; '
+ return lyrics
+
+>>>>>>> MERGE-SOURCE
def build_lyrics_html(item, webkitvers):
"""
Build the HTML required to show the lyrics
=== modified file 'openlp/core/lib/renderer.py'
--- openlp/core/lib/renderer.py 2010-09-04 07:48:58 +0000
+++ openlp/core/lib/renderer.py 2010-09-04 13:57:42 +0000
@@ -29,9 +29,10 @@
"""
import logging
-from PyQt4 import QtGui, QtCore
+from PyQt4 import QtGui, QtCore, QtWebKit
-from openlp.core.lib import resize_image, expand_tags
+from openlp.core.lib import resize_image, expand_tags, \
+ build_lyrics_format_css, build_lyrics_outline_css
log = logging.getLogger(__name__)
@@ -143,41 +144,35 @@
lines = verse.split(u'\n')
for line in lines:
text.append(line)
- doc = QtGui.QTextDocument()
- doc.setPageSize(QtCore.QSizeF(self._rect.width(), self._rect.height()))
- df = doc.defaultFont()
- df.setPointSize(self._theme.font_main_proportion)
- df.setFamily(self._theme.font_main_name)
- main_weight = 50
- if self._theme.font_main_weight == u'Bold':
- main_weight = 75
- df.setWeight(main_weight)
- doc.setDefaultFont(df)
- layout = doc.documentLayout()
+
+ web = QtWebKit.QWebView()
+ web.resize(self._rect.width(), self._rect.height())
+ web.setVisible(False)
+ frame = web.page().mainFrame()
+ # Adjust width and height to account for shadow. outline done in css
+ width = self._rect.width() + int(self._theme.display_shadow_size)
+ height = self._rect.height() + int(self._theme.display_shadow_size)
+ shell = u'<html><head><style>#main {%s %s}</style><body>' \
+ u'<div id="main">' % \
+ (build_lyrics_format_css(self._theme, width, height),
+ build_lyrics_outline_css(self._theme))
formatted = []
- if self._theme.font_main_weight == u'Bold' and \
- self._theme.font_main_italics:
- shell = u'{p}{st}{it}%s{/it}{/st}{/p}'
- elif self._theme.font_main_weight == u'Bold' and \
- not self._theme.font_main_italics:
- shell = u'{p}{st}%s{/st}{/p}'
- elif self._theme.font_main_italics:
- shell = u'{p}{it}%s{/it}{/p}'
- else:
- shell = u'{p}%s{/p}'
- temp_text = u''
- old_html_text = u''
+ html_text = u''
+ styled_text = u''
+ js_height = 'document.getElementById("main").scrollHeight'
for line in text:
- # mark line ends
- temp_text = temp_text + line + line_end
- html_text = shell % expand_tags(temp_text)
- doc.setHtml(html_text)
- # Text too long so gone to next mage
- if layout.pageCount() != 1:
- formatted.append(shell % old_html_text)
- temp_text = line + line_end
- old_html_text = temp_text
- formatted.append(shell % old_html_text)
+ styled_line = expand_tags(line) + line_end
+ styled_text += styled_line
+ html = shell + styled_text + u'</div></body></html>'
+ web.setHtml(html)
+ # Text too long so go to next page
+ text_height = int(frame.evaluateJavaScript(js_height).toString())
+ if text_height > height:
+ formatted.append(html_text)
+ html_text = u''
+ styled_text = styled_line
+ html_text += line + line_end
+ formatted.append(html_text)
log.debug(u'format_slide - End')
return formatted
=== modified file 'openlp/core/lib/serviceitem.py'
--- openlp/core/lib/serviceitem.py 2010-08-24 17:12:47 +0000
+++ openlp/core/lib/serviceitem.py 2010-09-04 13:57:42 +0000
@@ -160,9 +160,9 @@
self.themedata = self.render_manager.renderer._theme
for slide in self._raw_frames:
before = time.time()
- formated = self.render_manager \
+ formatted = self.render_manager \
.format_slide(slide[u'raw_slide'], line_break)
- for page in formated:
+ for page in formatted:
self._display_frames.append(
{u'title': clean_tags(page),
u'text': clean_tags(page.rstrip()),
Follow ups