trb143/renderer r1020

This commit is contained in:
Jonathan Corwin 2010-08-22 23:40:27 +01:00
commit d37a635857
21 changed files with 934 additions and 794 deletions

View File

@ -1 +1 @@
1.9.2
1.9.2-bzr987

View File

@ -35,6 +35,67 @@ from PyQt4 import QtCore, QtGui
log = logging.getLogger(__name__)
# TODO make external and configurable in alpha 4 via a settings dialog
html_expands = []
html_expands.append({u'desc':u'Red', u'start tag':u'{r}', \
u'start html':u'<font color=red>', \
u'end tag':u'{/r}', u'end html':u'</font>', \
u'protected':False})
html_expands.append({u'desc':u'Black', u'start tag':u'{b}', \
u'start html':u'<font color=black>', \
u'end tag':u'{/b}', u'end html':u'</font>', \
u'protected':False})
html_expands.append({u'desc':u'Blue', u'start tag':u'{bl}', \
u'start html':u'<font color=blue>', \
u'end tag':u'{/bl}', u'end html':u'</font>', \
u'protected':False})
html_expands.append({u'desc':u'Yellow', u'start tag':u'{y}', \
u'start html':u'<font color=yellow>', \
u'end tag':u'{/y}', u'end html':u'</font>', \
u'protected':False})
html_expands.append({u'desc':u'Green', u'start tag':u'{g}', \
u'start html':u'<font color=green>', \
u'end tag':u'{/g}', u'end html':u'</font>', \
u'protected':False})
html_expands.append({u'desc':u'Pink', u'start tag':u'{pk}', \
u'start html':u'<font color=#CC33CC>', \
u'end tag':u'{/pk}', u'end html':u'</font>', \
u'protected':False})
html_expands.append({u'desc':u'Orange', u'start tag':u'{o}', \
u'start html':u'<font color=#CC0033>', \
u'end tag':u'{/o}', u'end html':u'</font>', \
u'protected':False})
html_expands.append({u'desc':u'Purple', u'start tag':u'{pp}', \
u'start html':u'<font color=#9900FF>', \
u'end tag':u'{/pp}', u'end html':u'</font>', \
u'protected':False})
html_expands.append({u'desc':u'White', u'start tag':u'{w}', \
u'start html':u'<font color=white>', \
u'end tag':u'{/w}', u'end html':u'</font>', \
u'protected':False})
html_expands.append({u'desc':u'Superscript', u'start tag':u'{su}', \
u'start html':u'<sup>', \
u'end tag':u'{/su}', u'end html':u'</sup>', \
u'protected':True})
html_expands.append({u'desc':u'Subscript', u'start tag':u'{sb}', \
u'start html':u'<sub>', \
u'end tag':u'{/sb}', u'end html':u'</sub>', \
u'protected':True})
html_expands.append({u'desc':u'Paragraph', u'start tag':u'{p}', \
u'start html':u'<p>', \
u'end tag':u'{/p}', u'end html':u'</p>', \
u'protected':True})
html_expands.append({u'desc':u'Bold', u'start tag':u'{st}', \
u'start html':u'<strong>', \
u'end tag':u'{/st}', \
u'end html':u'</strong>', \
u'protected':True})
html_expands.append({u'desc':u'Italics', u'start tag':u'{it}', \
u'start html':u'<em>', \
u'end tag':u'{/it}', u'end html':u'</em>', \
u'protected':True})
def translate(context, text, comment=None):
"""
A special shortcut method to wrap around the Qt4 translation functions.
@ -232,6 +293,25 @@ def check_item_selected(list_widget, message):
return False
return True
def clean_tags(text):
"""
Remove Tags from text for display
"""
text = text.replace(u'<br>', u'\n')
for tag in html_expands:
text = text.replace(tag[u'start tag'], u'')
text = text.replace(tag[u'end tag'], u'')
return text
def expand_tags(text):
"""
Expand tags HTML for display
"""
for tag in html_expands:
text = text.replace(tag[u'start tag'], tag[u'start html'])
text = text.replace(tag[u'end tag'], tag[u'end html'])
return text
from eventreceiver import Receiver
from settingsmanager import SettingsManager
from plugin import PluginStatus, Plugin

View File

@ -116,6 +116,7 @@ body {
else
img.style.display = 'block';
}
function show_blank(state){
var black = 'none';
var lyrics = '';
@ -175,8 +176,8 @@ body {
return text.clientHeight;
}
function show_footer(text){
document.getElementById('footer').innerHTML(text);
function show_footer(footertext){
document.getElementById('footer').innerHTML(footertext);
}
function show_text(newtext){

View File

@ -31,7 +31,7 @@ import logging
from PyQt4 import QtGui, QtCore
from openlp.core.lib import resize_image
from openlp.core.lib import resize_image, expand_tags
log = logging.getLogger(__name__)
@ -80,7 +80,6 @@ class Renderer(object):
self.bg_image = None
self._bg_image_filename = None
self.theme_name = theme.theme_name
#self._set_theme_font()
if theme.background_type == u'image':
if theme.background_filename:
self.set_bg_image(theme.background_filename)
@ -169,13 +168,22 @@ class Renderer(object):
doc.setDefaultFont(df)
layout = doc.documentLayout()
formatted = []
shell = u'<p>%s</p>'
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''
for line in text:
# mark line ends
temp_text = temp_text + line + line_end
html_text = shell % temp_text
html_text = shell % expand_tags(temp_text)
doc.setHtml(html_text)
# Text too long so gone to next mage
if layout.pageCount() != 1:
@ -186,126 +194,17 @@ class Renderer(object):
log.debug(u'format_slide - End')
return formatted
# def pre_render_text(self, text):
# metrics = QtGui.QFontMetrics(self.main_font)
# #work out line width
# line_width = self._rect.width()
# #number of lines on a page - adjust for rounding up.
# line_height = metrics.height()
# if self._theme.display_shadow:
# line_height += int(self._theme.display_shadow_size)
# if self._theme.display_outline:
# # pixels top/bottom
# line_height += 2 * int(self._theme.display_outline_size)
# page_length = int(self._rect.height() / line_height )
# #Average number of characters in line
# ave_line_width = line_width / metrics.averageCharWidth()
# #Maximum size of a character
# max_char_width = metrics.maxWidth()
# #Max characters pre line based on min size of a character
# char_per_line = line_width / metrics.width(u'i')
# log.debug(u'Page Length area height %s , metrics %s , lines %s' %
# (int(self._rect.height()), metrics.height(), page_length ))
# split_pages = []
# page = []
# split_lines = []
# count = 0
# for line in text:
# #Must be a blank line so keep it.
# if len(line) == 0:
# line = u' '
# while line:
# pos = char_per_line
# split_text = line[:pos]
# #line needs splitting
# if metrics.width(split_text, -1) > line_width:
# #We have no spaces
# if split_text.find(u' ') == -1:
# #Move back 1 char at a time till it fits
# while metrics.width(split_text, -1) > line_width:
# split_text = split_text[:-1]
# pos = len(split_text)
# else:
# #We have spaces so split at previous one
# while metrics.width(split_text, -1) > line_width:
# pos = split_text.rfind(u' ')
# #no more spaces and we are still too long
# if pos == -1:
# while \
# metrics.width(split_text, -1) > line_width:
# split_text = split_text[:-1]
# pos = len(split_text)
# else:
# split_text = line[:pos]
# split_lines.append(split_text)
# line = line[pos:].lstrip()
# #if we have more text add up to 10 spaces on the front.
# if line and self._theme.font_main_indentation > 0:
# line = u'%s%s' % \
# (u' '[:int(self._theme.font_main_indentation)],
# line)
# #Text fits in a line now
# for count, line in enumerate(split_lines):
# page.append(line)
# #last but one line and only 2 lines to go or end of page
# if (len(page) == page_length - 1 and
# len(split_lines) - 3 == count) or \
# len(page) == page_length:
# split_pages.append(page)
# page = []
# if page and page != u' ':
# split_pages.append(page)
# return split_pages
#
# def generate_frame_from_lines(self, lines, footer_lines=None):
# """
# Render a set of lines according to the theme, and return the block
# dimensions.
#
# ``lines``
# The lines to be rendered.
#
# ``footer_lines``
# Defaults to *None*. The footer to render.
# """
# log.debug(u'generate_frame_from_lines - Start')
# bbox = self._render_lines_unaligned(lines, False)
# if footer_lines:
# bbox1 = self._render_lines_unaligned(footer_lines, True)
# # reset the frame. first time do not worry about what you paint on.
# self.frame = QtGui.QImage(self.bg_frame)
# if self._theme.display_slideTransition:
# self.frame_opaque = QtGui.QImage(self.bg_frame)
# x, y = self._correct_alignment(self._rect, bbox)
# bbox = self._render_lines_unaligned(lines, False, (x, y), True)
# if footer_lines:
# bbox = self._render_lines_unaligned(footer_lines, True,
# (self._rect_footer.left(), self._rect_footer.top()), True)
# log.debug(u'generate_frame_from_lines - Finish')
# if self._theme.display_slideTransition:
# return {u'main':self.frame, u'trans':self.frame_opaque}
# else:
# return {u'main':self.frame, u'trans':None}
def _generate_background_frame(self):
"""
Generate a background frame to the same size as the frame to be used.
Results are cached for performance reasons.
"""
assert(self._theme)
# if self._theme.background_mode == u'transparent':
# self.bg_frame = \
# QtGui.QPixmap(self.frame.width(), self.frame.height())
# self.bg_frame.fill(QtCore.Qt.transparent)
# else:
self.bg_frame = QtGui.QImage(self.frame.width(),
self.frame.height(), QtGui.QImage.Format_ARGB32_Premultiplied)
log.debug(u'render background %s start', self._theme.background_type)
painter = QtGui.QPainter()
painter.begin(self.bg_frame)
# if self._theme.background_mode == u'transparent':
# painter.fillRect(self.frame.rect(), QtCore.Qt.transparent)
# else:
if self._theme.background_type == u'solid':
painter.fillRect(self.frame.rect(),
QtGui.QColor(self._theme.background_color))
@ -315,13 +214,11 @@ class Renderer(object):
if self._theme.background_direction == u'horizontal':
w = int(self.frame.width()) / 2
# vertical
gradient = QtGui.QLinearGradient(w, 0, w,
self.frame.height())
gradient = QtGui.QLinearGradient(w, 0, w, self.frame.height())
elif self._theme.background_direction == u'vertical':
h = int(self.frame.height()) / 2
# Horizontal
gradient = QtGui.QLinearGradient(0, h, self.frame.width(),
h)
gradient = QtGui.QLinearGradient(0, h, self.frame.width(), h)
else:
w = int(self.frame.width()) / 2
h = int(self.frame.height()) / 2
@ -347,273 +244,3 @@ class Renderer(object):
if self.bg_image:
painter.drawImage(0, 0, self.bg_image)
painter.end()
log.debug(u'render background End')
# def _correct_alignment(self, rect, bbox):
# """
# Corrects the vertical alignment of text.
#
# ``rect``
# The block dimentions.
#
# ``bbox``
# Footer dimensions?
# """
# x = rect.left()
# if self._theme.display_verticalAlign == 0:
# # top align
# y = rect.top()
# elif self._theme.display_verticalAlign == 2:
# # bottom align
# y = rect.bottom() - bbox.height()
# elif self._theme.display_verticalAlign == 1:
# # centre align
# y = rect.top() + (rect.height() - bbox.height()) / 2
# else:
# log.error(u'Invalid value for theme.VerticalAlign:%s',
# self._theme.display_verticalAlign)
# return x, y
#
# def _render_lines_unaligned(self, lines, footer, tlcorner=(0, 0),
# live=False):
# """
# Given a list of lines to render, render each one in turn (using the
# ``_render_single_line`` fn - which may result in going off the bottom).
# They are expected to be pre-arranged to less than a screenful (eg. by
# using split_set_of_lines).
#
# Returns the bounding box of the text as QRect.
#
# ``lines``
# The lines of text to render.
#
# ``footer``
# The slide footer.
#
# ``tlcorner``
# Defaults to *``(0, 0)``*. Co-ordinates of the top left corner.
#
# ``live``
# Defaults to *False*. Whether or not this is a live screen.
# """
# x, y = tlcorner
# brx = x
# bry = y
# for line in lines:
# # render after current bottom, but at original left edge
# # keep track of right edge to see which is biggest
# (thisx, bry) = self._render_and_wrap_single_line(line, footer,
# (x, bry), live)
# if (thisx > brx):
# brx = thisx
# retval = QtCore.QRect(x, y, brx - x, bry - y)
# if self._debug:
# painter = QtGui.QPainter()
# painter.begin(self.frame)
# painter.setPen(QtGui.QPen(QtGui.QColor(0, 0, 255)))
# painter.drawRect(retval)
# painter.end()
# return retval
#
# def _render_and_wrap_single_line(self, line, footer, tlcorner=(0, 0),
# live=False):
# """
# Render a single line of words onto the DC, top left corner specified.
# If the line is too wide for the context, it wraps, but right-aligns
# the surplus words in the manner of song lyrics.
#
# Returns the bottom-right corner (of what was rendered) as a tuple(x, y).
#
# ``line``
# Line of text to be rendered.
#
# ``footer``
# The footer of the slide.
#
# ``tlcorner``
# Defaults to *``(0, 0)``*. The top left corner.
#
# ``live``
# Defaults to *False*. Whether or not this is a live screen.
# """
# x, y = tlcorner
# maxx = self._rect.width()
# maxy = self._rect.height()
# lines = []
# lines.append(line)
# startx = x
# starty = y
# rightextent = None
# self.painter = QtGui.QPainter()
# self.painter.begin(self.frame)
# self.painter.setRenderHint(QtGui.QPainter.Antialiasing)
# if self._theme.display_slideTransition:
# self.painter2 = QtGui.QPainter()
# self.painter2.begin(self.frame_opaque)
# self.painter2.setRenderHint(QtGui.QPainter.Antialiasing)
# self.painter2.setOpacity(0.7)
# # dont allow alignment messing with footers
# if footer:
# align = 0
# display_shadow_size = self._display_shadow_size_footer
# display_outline_size = self._display_outline_size_footer
# else:
# align = self._theme.display_horizontalAlign
# display_shadow_size = int(self._theme.display_shadow_size)
# display_outline_size = int(self._theme.display_outline_size)
# for linenum in range(len(lines)):
# line = lines[linenum]
# #find out how wide line is
# w, h = self._get_extent_and_render(line, footer, tlcorner=(x, y),
# draw=False)
# if self._theme.display_shadow:
# w += display_shadow_size
# h += display_shadow_size
# if self._theme.display_outline:
# # pixels either side
# w += 2 * display_outline_size
# # pixels top/bottom
# h += 2 * display_outline_size
# if align == 0: # left align
# rightextent = x + w
# # shift right from last line's rh edge
# if self._theme.display_wrapStyle == 1 and linenum != 0:
# rightextent = self._first_line_right_extent
# if rightextent > maxx:
# rightextent = maxx
# x = rightextent - w
# # right align
# elif align == 1:
# rightextent = maxx
# x = maxx - w
# # centre
# elif align == 2:
# x = (maxx - w) / 2
# rightextent = x + w
# if live:
# # now draw the text, and any outlines/shadows
# if self._theme.display_shadow:
# self._get_extent_and_render(line, footer,
# tlcorner=(x + display_shadow_size,
# y + display_shadow_size),
# draw=True, color=self._theme.display_shadow_color)
# self._get_extent_and_render(line, footer, tlcorner=(x, y),
# draw=True, outline_size=display_outline_size)
# y += h
# if linenum == 0:
# self._first_line_right_extent = rightextent
# # draw a box around the text - debug only
#
# if self._debug:
# self.painter.setPen(QtGui.QPen(QtGui.QColor(0, 255, 0)))
# self.painter.drawRect(startx, starty, rightextent-startx, y-starty)
# brcorner = (rightextent, y)
# self.painter.end()
# if self._theme.display_slideTransition:
# self.painter2.end()
# return brcorner
#
# def _set_theme_font(self):
# """
# Set the fonts from the current theme settings.
# """
# footer_weight = 50
# if self._theme.font_footer_weight == u'Bold':
# footer_weight = 75
# #TODO Add myfont.setPixelSize((screen_height / 100) * font_size)
# self.footer_font = QtGui.QFont(self._theme.font_footer_name,
# self._theme.font_footer_proportion, # size
# footer_weight, # weight
# self._theme.font_footer_italics) # italic
# self.footer_font.setPixelSize(self._theme.font_footer_proportion)
# main_weight = 50
# if self._theme.font_main_weight == u'Bold':
# main_weight = 75
# self.main_font = QtGui.QFont(self._theme.font_main_name,
# self._theme.font_main_proportion, # size
# main_weight, # weight
# self._theme.font_main_italics)# italic
# self.main_font.setPixelSize(self._theme.font_main_proportion)
#
# def _get_extent_and_render(self, line, footer, tlcorner=(0, 0), draw=False,
# color=None, outline_size=0):
# """
# Find bounding box of text - as render_single_line. If draw is set,
# actually draw the text to the current DC as well return width and
# height of text as a tuple (w, h).
#
# ``line``
# The line of text to render.
#
# ``footer``
# The footer text.
#
# ``tlcorner``
# Defaults to *``(0, 0)``*. The top left corner co-ordinates.
#
# ``draw``
# Defaults to *False*. Draw the text to the current surface.
#
# ``color``
# Defaults to *None*. The colour to draw with.
# """
# # setup defaults
# if footer:
# font = self.footer_font
# else:
# font = self.main_font
# metrics = QtGui.QFontMetrics(font)
# w = metrics.width(line)
# if footer:
# h = metrics.height()
# else:
# h = metrics.height() + int(self._theme.font_main_line_adjustment)
# if draw:
# self.painter.setFont(font)
# if color is None:
# if footer:
# pen = QtGui.QColor(self._theme.font_footer_color)
# else:
# pen = QtGui.QColor(self._theme.font_main_color)
# else:
# pen = QtGui.QColor(color)
# x, y = tlcorner
# rowpos = y + metrics.ascent()
# if self._theme.display_outline and outline_size != 0 and not footer:
# path = QtGui.QPainterPath()
# path.addText(QtCore.QPointF(x, rowpos), font, line)
# self.painter.setBrush(self.painter.pen().brush())
# self.painter.setPen(QtGui.QPen(QtGui.QColor(
# self._theme.display_outline_color), outline_size))
# self.painter.drawPath(path)
# self.painter.setPen(pen)
# self.painter.drawText(x, rowpos, line)
# if self._theme.display_slideTransition:
# # Print 2nd image with 70% weight
# if self._theme.display_outline and outline_size != 0 and \
# not footer:
# path = QtGui.QPainterPath()
# path.addText(QtCore.QPointF(x, rowpos), font, line)
# self.painter2.setBrush(self.painter2.pen().brush())
# self.painter2.setPen(QtGui.QPen(
# QtGui.QColor(self._theme.display_outline_color),
# outline_size))
# self.painter2.drawPath(path)
# self.painter2.setFont(font)
# self.painter2.setPen(pen)
# self.painter2.drawText(x, rowpos, line)
# return (w, h)
#
# def snoop_image(self, image, image2=None):
# """
# Debugging method to allow images to be viewed.
#
# ``image``
# An image to save to disk.
#
# ``image2``
# Defaults to *None*. Another image to save to disk.
# """
# image.save(u'renderer.png', u'png')
# if image2:
# image2.save(u'renderer2.png', u'png')

View File

@ -68,16 +68,6 @@ class RenderManager(object):
self.themedata = None
self.alertTab = None
# TODO make external and configurable
self.html_expands = {
u'{r}': u'<font color=red>',
u'{b}': u'<font color=black>',
u'{u}': u'<font color=blue>',
u'{y}': u'<font color=yellow>',
u'{g}': u'<font color=green>',
u'{/}': u'</font>'
}
def update_display(self):
"""
Updates the render manager's information about the current screen.
@ -208,8 +198,8 @@ class RenderManager(object):
serviceItem.theme = themedata
serviceItem.add_from_text(u'', verse, footer)
serviceItem.render_manager = self
serviceItem.render(True)
serviceItem.raw_footer = footer
serviceItem.render(True)
self.display.buildHtml(serviceItem)
frame, raw_html = serviceItem.get_rendered_frame(0)
preview = self.display.text(raw_html)
@ -228,20 +218,6 @@ class RenderManager(object):
self.build_text_rectangle(self.themedata)
return self.renderer.format_slide(words, line_break)
# def generate_slide(self, main_text):
# """
# Generate the actual slide image.
#
# ``main_text``
# The text for the main area of the slide.
# """
# log.debug(u'generate slide')
# self.build_text_rectangle(self.themedata)
# self.renderer.set_frame_dest(self.width, self.height)
# image = self.previewDisplay.preview(self.renderer.bg_frame,
# main_text[0], self.themedata)
# return image
def calculate_default(self, screen):
"""
Calculate the default dimentions of the screen.
@ -257,23 +233,3 @@ class RenderManager(object):
self.width, self.height, self.screen_ratio )
# 90% is start of footer
self.footer_start = int(self.height * 0.90)
def clean(self, text):
"""
Remove Tags from text for display
"""
text = text.replace(u'<br>', u'\n').replace(u'<p>', u'')\
.replace(u'</p>', u'').replace(u'<sup>', u'')\
.replace(u'</sup>', u'')
for key, value in self.html_expands.iteritems():
text = text.replace(key, u'')
return text
def expand(self, text):
"""
Expand tags fto HTML for display
"""
for key, value in self.html_expands.iteritems():
text = text.replace(key, value)
return text

View File

@ -35,7 +35,7 @@ import uuid
from PyQt4 import QtGui
from openlp.core.lib import build_icon, resize_image
from openlp.core.lib import build_icon, resize_image, clean_tags, expand_tags
log = logging.getLogger(__name__)
@ -100,6 +100,11 @@ class ServiceItem(object):
self.bg_frame = None
def _new_item(self):
"""
Method to set the internal id of the item
This is used to compare service items to see if they are
the same
"""
self._uuid = unicode(uuid.uuid1())
def add_capability(self, capability):
@ -159,9 +164,9 @@ class ServiceItem(object):
.format_slide(slide[u'raw_slide'], line_break)
for page in formated:
self._display_frames.append(
{u'title': self.render_manager.clean(page),
u'text': self.render_manager.clean(page.rstrip()),
u'html': self.render_manager.expand(page.rstrip()),
{u'title': clean_tags(page),
u'text': clean_tags(page.rstrip()),
u'html': expand_tags(page.rstrip()),
u'verseTag': slide[u'verseTag'] })
log.log(15, u'Formatting took %4s' % (time.time() - before))
elif self.service_item_type == ServiceItemType.Image:

View File

@ -55,7 +55,6 @@ BLANK_THEME_XML = \
<proportion>30</proportion>
<weight>Normal</weight>
<italics>False</italics>
<indentation>0</indentation>
<line_adjustment>0</line_adjustment>
<location override="False" x="10" y="10" width="1004" height="730"/>
</font>
@ -65,7 +64,6 @@ BLANK_THEME_XML = \
<proportion>12</proportion>
<weight>Normal</weight>
<italics>False</italics>
<indentation>0</indentation>
<line_adjustment>0</line_adjustment>
<location override="False" x="10" y="730" width="1004" height="38"/>
</font>
@ -184,7 +182,7 @@ class ThemeXML(object):
self.child_element(background, u'filename', filename)
def add_font(self, name, color, proportion, override, fonttype=u'main',
weight=u'Normal', italics=u'False', indentation=0, line_adjustment=0,
weight=u'Normal', italics=u'False', line_adjustment=0,
xpos=0, ypos=0, width=0, height=0):
"""
Add a Font.
@ -210,9 +208,6 @@ class ThemeXML(object):
``italics``
Does the font render to italics Defaults to 0 Normal
``indentation``
Number of characters the wrap line is indented
``xpos``
The X position of the text block.
@ -239,8 +234,6 @@ class ThemeXML(object):
#Create italics name element
self.child_element(background, u'italics', italics)
#Create indentation name element
self.child_element(background, u'indentation', unicode(indentation))
#Create indentation name element
self.child_element(
background, u'line_adjustment', unicode(line_adjustment))

View File

@ -19,7 +19,7 @@
# 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 #
# You should have received a copy of the GNU General Pu__init__.pyblic License along #
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
@ -27,6 +27,138 @@
The :mod:`ui` module provides the core user interface for OpenLP
"""
# http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/
import re
import sys
import enchant
from PyQt4 import QtCore, QtGui
from openlp.core.lib import html_expands, translate, context_menu_action
class SpellTextEdit(QtGui.QPlainTextEdit):
def __init__(self, *args):
QtGui.QPlainTextEdit.__init__(self, *args)
# Default dictionary based on the current locale.
self.dict = enchant.Dict()
self.highlighter = Highlighter(self.document())
self.highlighter.setDict(self.dict)
def mousePressEvent(self, event):
if event.button() == QtCore.Qt.RightButton:
# Rewrite the mouse event to a left button event so the cursor is
# moved to the location of the pointer.
event = QtGui.QMouseEvent(QtCore.QEvent.MouseButtonPress, event.pos(),
QtCore.Qt.LeftButton, QtCore.Qt.LeftButton, QtCore.Qt.NoModifier)
QtGui.QPlainTextEdit.mousePressEvent(self, event)
def contextMenuEvent(self, event):
popup_menu = self.createStandardContextMenu()
# Select the word under the cursor.
cursor = self.textCursor()
cursor.select(QtGui.QTextCursor.WordUnderCursor)
self.setTextCursor(cursor)
# Check if the selected word is misspelled and offer spelling
# suggestions if it is.
if self.textCursor().hasSelection():
text = unicode(self.textCursor().selectedText())
if not self.dict.check(text):
spell_menu = QtGui.QMenu(translate('OpenLP.SpellTextEdit',
'Spelling Suggestions'))
for word in self.dict.suggest(text):
action = SpellAction(word, spell_menu)
action.correct.connect(self.correctWord)
spell_menu.addAction(action)
# Only add the spelling suggests to the menu if there are
# suggestions.
if len(spell_menu.actions()) != 0:
popup_menu.insertSeparator(popup_menu.actions()[0])
popup_menu.insertMenu(popup_menu.actions()[0], spell_menu)
tag_menu = QtGui.QMenu(translate('OpenLP.SpellTextEdit',
'Formatting Tags'))
for html in html_expands:
action = SpellAction( html[u'desc'], tag_menu)
action.correct.connect(self.htmlTag)
tag_menu.addAction(action)
popup_menu.insertSeparator(popup_menu.actions()[0])
popup_menu.insertMenu(popup_menu.actions()[0], tag_menu)
popup_menu.exec_(event.globalPos())
def correctWord(self, word):
'''
Replaces the selected text with word.
'''
cursor = self.textCursor()
cursor.beginEditBlock()
cursor.removeSelectedText()
cursor.insertText(word)
cursor.endEditBlock()
def htmlTag(self, tag):
'''
Replaces the selected text with word.
'''
for html in html_expands:
if tag == html[u'desc']:
cursor = self.textCursor()
if self.textCursor().hasSelection():
text = cursor.selectedText()
cursor.beginEditBlock()
cursor.removeSelectedText()
cursor.insertText(html[u'start tag'])
cursor.insertText(text)
cursor.insertText(html[u'end tag'])
cursor.endEditBlock()
else:
cursor = self.textCursor()
cursor.insertText(html[u'start tag'])
cursor.insertText(html[u'end tag'])
class Highlighter(QtGui.QSyntaxHighlighter):
WORDS = u'(?iu)[\w\']+'
def __init__(self, *args):
QtGui.QSyntaxHighlighter.__init__(self, *args)
self.dict = None
def setDict(self, dict):
self.dict = dict
def highlightBlock(self, text):
if not self.dict:
return
text = unicode(text)
format = QtGui.QTextCharFormat()
format.setUnderlineColor(QtCore.Qt.red)
format.setUnderlineStyle(QtGui.QTextCharFormat.SpellCheckUnderline)
for word_object in re.finditer(self.WORDS, text):
if not self.dict.check(word_object.group()):
self.setFormat(word_object.start(),
word_object.end() - word_object.start(), format)
class SpellAction(QtGui.QAction):
'''
A special QAction that returns the text in a signal.
'''
correct = QtCore.pyqtSignal(unicode)
def __init__(self, *args):
QtGui.QAction.__init__(self, *args)
self.triggered.connect(lambda x: self.correct.emit(
unicode(self.text())))
class HideMode(object):
"""
This is basically an enumeration class which specifies the mode of a Bible.

View File

@ -68,17 +68,6 @@ class Ui_AmendThemeDialog(object):
self.backgroundLayout.setMargin(8)
self.backgroundLayout.setSpacing(8)
self.backgroundLayout.setObjectName(u'backgroundLayout')
# self.backgroundLabel = QtGui.QLabel(self.backgroundTab)
# self.backgroundLabel.setObjectName(u'backgroundLabel')
# self.backgroundLayout.setWidget(0, QtGui.QFormLayout.LabelRole,
# self.backgroundLabel)
# self.backgroundComboBox = QtGui.QComboBox(self.backgroundTab)
# self.backgroundComboBox.setObjectName(u'backgroundComboBox')
# self.backgroundLabel.setBuddy(self.backgroundComboBox)
# self.backgroundComboBox.addItem(QtCore.QString())
# self.backgroundComboBox.addItem(QtCore.QString())
# self.backgroundLayout.setWidget(0, QtGui.QFormLayout.FieldRole,
# self.backgroundComboBox)
self.backgroundTypeLabel = QtGui.QLabel(self.backgroundTab)
self.backgroundTypeLabel.setObjectName(u'backgroundTypeLabel')
self.backgroundLayout.setWidget(1, QtGui.QFormLayout.LabelRole,
@ -216,17 +205,6 @@ class Ui_AmendThemeDialog(object):
self.fontMainLineAdjustmentSpinBox.setMinimum(-99)
self.mainFontLayout.setWidget(4, QtGui.QFormLayout.FieldRole,
self.fontMainLineAdjustmentSpinBox)
self.fontMainWrapIndentationLabel = QtGui.QLabel(self.fontMainGroupBox)
self.fontMainWrapIndentationLabel.setObjectName(
u'fontMainWrapIndentationLabel')
self.mainFontLayout.setWidget(5, QtGui.QFormLayout.LabelRole,
self.fontMainWrapIndentationLabel)
self.fontMainLineSpacingSpinBox = QtGui.QSpinBox(self.fontMainGroupBox)
self.fontMainLineSpacingSpinBox.setObjectName(
u'fontMainLineSpacingSpinBox')
self.fontMainLineSpacingSpinBox.setMaximum(10)
self.mainFontLayout.setWidget(5, QtGui.QFormLayout.FieldRole,
self.fontMainLineSpacingSpinBox)
self.fontMainLinesPageLabel = QtGui.QLabel(self.fontMainGroupBox)
self.fontMainLinesPageLabel.setObjectName(u'fontMainLinesPageLabel')
self.mainFontLayout.addRow(self.fontMainLinesPageLabel)
@ -661,12 +639,6 @@ class Ui_AmendThemeDialog(object):
translate('OpenLP.AmendThemeForm', 'Theme Maintenance'))
self.themeNameLabel.setText(
translate('OpenLP.AmendThemeForm', 'Theme &name:'))
# self.backgroundLabel.setText(
# translate('OpenLP.AmendThemeForm', '&Visibility:'))
# self.backgroundComboBox.setItemText(0,
# translate('OpenLP.AmendThemeForm', 'Opaque'))
# self.backgroundComboBox.setItemText(1,
# translate('OpenLP.AmendThemeForm', 'Transparent'))
self.backgroundTypeLabel.setText(
translate('OpenLP.AmendThemeForm', 'Type:'))
self.backgroundTypeComboBox.setItemText(0,
@ -700,8 +672,6 @@ class Ui_AmendThemeDialog(object):
translate('OpenLP.AmendThemeForm', 'Size:'))
self.fontMainSizeSpinBox.setSuffix(
translate('OpenLP.AmendThemeForm', 'pt'))
self.fontMainWrapIndentationLabel.setText(
translate('OpenLP.AmendThemeForm', 'Wrap indentation:'))
self.fontMainWrapLineAdjustmentLabel.setText(
translate('OpenLP.AmendThemeForm', 'Adjust line spacing:'))
self.fontMainWeightComboBox.setItemText(0,

View File

@ -50,7 +50,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.path = None
self.theme = ThemeXML()
self.setupUi(self)
# define signals
# Buttons
QtCore.QObject.connect(self.color1PushButton,
QtCore.SIGNAL(u'pressed()'), self.onColor1PushButtonClicked)
@ -68,8 +67,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
QtCore.QObject.connect(self.imageToolButton,
QtCore.SIGNAL(u'clicked()'), self.onImageToolButtonClicked)
# Combo boxes
# QtCore.QObject.connect(self.backgroundComboBox,
# QtCore.SIGNAL(u'activated(int)'), self.onBackgroundComboBoxSelected)
QtCore.QObject.connect(self.backgroundTypeComboBox,
QtCore.SIGNAL(u'activated(int)'),
self.onBackgroundTypeComboBoxSelected)
@ -109,9 +106,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
QtCore.QObject.connect(self.fontMainLineAdjustmentSpinBox,
QtCore.SIGNAL(u'editingFinished()'),
self.onFontMainLineAdjustmentSpinBoxChanged)
QtCore.QObject.connect(self.fontMainLineSpacingSpinBox,
QtCore.SIGNAL(u'editingFinished()'),
self.onFontMainLineSpacingSpinBoxChanged)
QtCore.QObject.connect(self.fontFooterXSpinBox,
QtCore.SIGNAL(u'editingFinished()'),
self.onFontFooterXSpinBoxChanged)
@ -151,9 +145,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
new_theme.new_document(theme_name)
save_from = None
save_to = None
# if self.theme.background_mode == u'transparent':
# new_theme.add_background_transparent()
# else:
if self.theme.background_type == u'solid':
new_theme.add_background_solid(
unicode(self.theme.background_color))
@ -174,7 +165,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
unicode(self.theme.font_main_override), u'main',
unicode(self.theme.font_main_weight),
unicode(self.theme.font_main_italics),
unicode(self.theme.font_main_indentation),
unicode(self.theme.font_main_line_adjustment),
unicode(self.theme.font_main_x),
unicode(self.theme.font_main_y),
@ -186,7 +176,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
unicode(self.theme.font_footer_override), u'footer',
unicode(self.theme.font_footer_weight),
unicode(self.theme.font_footer_italics),
0, # indentation
0, # line adjustment
unicode(self.theme.font_footer_x),
unicode(self.theme.font_footer_y),
@ -283,8 +272,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.fontMainHeightSpinBox.setValue(self.theme.font_main_height)
self.fontMainLineAdjustmentSpinBox.setValue(
self.theme.font_main_line_adjustment)
self.fontMainLineSpacingSpinBox.setValue(
self.theme.font_main_indentation)
self.stateChanging(self.theme)
self.previewTheme()
@ -310,13 +297,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.fontMainLineAdjustmentSpinBox.value()
self.previewTheme()
def onFontMainLineSpacingSpinBoxChanged(self):
if self.theme.font_main_indentation != \
self.fontMainLineSpacingSpinBox.value():
self.theme.font_main_indentation = \
self.fontMainLineSpacingSpinBox.value()
self.previewTheme()
def onFontMainHeightSpinBoxChanged(self):
if self.theme.font_main_height != self.fontMainHeightSpinBox.value():
self.theme.font_main_height = self.fontMainHeightSpinBox.value()
@ -410,14 +390,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.setBackground(self.backgroundTypeComboBox.currentIndex(),
currentIndex)
# def onBackgroundComboBoxSelected(self, currentIndex):
# if currentIndex == 0: # Opaque
# self.theme.background_mode = u'opaque'
# else:
# self.theme.background_mode = u'transparent'
# self.stateChanging(self.theme)
# self.previewTheme()
def onBackgroundTypeComboBoxSelected(self, currentIndex):
self.setBackground(currentIndex, self.gradientComboBox.currentIndex())
@ -543,10 +515,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.stateChanging(theme)
self.themeNameEdit.setText(self.theme.theme_name)
# Background Tab
# if self.theme.background_mode == u'opaque':
# self.backgroundComboBox.setCurrentIndex(0)
# else:
# self.backgroundComboBox.setCurrentIndex(1)
self.imageLineEdit.setText(u'')
if theme.background_type == u'solid':
self.backgroundTypeComboBox.setCurrentIndex(0)
@ -576,8 +544,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.fontMainWeightComboBox.setCurrentIndex(2)
else:
self.fontMainWeightComboBox.setCurrentIndex(3)
self.fontMainLineSpacingSpinBox.setValue(
self.theme.font_main_indentation)
self.fontMainXSpinBox.setValue(self.theme.font_main_x)
self.fontMainYSpinBox.setValue(self.theme.font_main_y)
self.fontMainWidthSpinBox.setValue(self.theme.font_main_width)
@ -641,19 +607,6 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.verticalComboBox.setCurrentIndex(self.theme.display_verticalAlign)
def stateChanging(self, theme):
# if theme.background_mode == u'transparent':
# self.color1Label.setVisible(False)
# self.color1PushButton.setVisible(False)
# self.color2Label.setVisible(False)
# self.color2PushButton.setVisible(False)
# self.imageLabel.setVisible(False)
# self.imageLineEdit.setVisible(False)
# self.imageFilenameWidget.setVisible(False)
# self.gradientLabel.setVisible(False)
# self.gradientComboBox.setVisible(False)
# self.backgroundTypeComboBox.setVisible(False)
# self.backgroundTypeLabel.setVisible(False)
# else:
self.backgroundTypeComboBox.setVisible(True)
self.backgroundTypeLabel.setVisible(True)
if theme.background_type == u'solid':

View File

@ -315,7 +315,7 @@ class MainDisplay(DisplayWidget):
self.serviceItem = serviceItem
html = build_html(self.serviceItem, self.screen, self.parent.alertTab)
self.webView.setHtml(html)
if serviceItem.footer and serviceItem.foot_text:
if serviceItem.foot_text and serviceItem.foot_text:
self.footer(serviceItem.foot_text)
def footer(self, text):

View File

@ -873,6 +873,7 @@ class ServiceManager(QtGui.QWidget):
ItemCapabilities.AllowsPreview):
self.parent.PreviewController.addServiceManagerItem(
self.serviceItems[item][u'service_item'], 0)
self.parent.LiveController.PreviewListWidget.setFocus()
else:
QtGui.QMessageBox.critical(self,
translate('OpenLP.ServiceManager', 'Missing Display Handler'),

View File

@ -957,7 +957,6 @@ class SlideController(QtGui.QWidget):
"""
log.debug(u'SlideController mediaVolume')
self.volume = self.volumeSlider.value()
print self.volume
self.display.videoVolume(self.volume)
def onMediaPause(self):

View File

@ -731,8 +731,8 @@ class ThemeManager(QtGui.QWidget):
theme.display_slideTransition = theme.display_slideTransition
theme.font_footer_color = theme.font_footer_color.strip()
theme.font_footer_height = int(theme.font_footer_height.strip())
theme.font_footer_indentation = \
int(theme.font_footer_indentation.strip())
# theme.font_footer_indentation = \
# int(theme.font_footer_indentation.strip())
theme.font_footer_italics = str_to_bool(theme.font_footer_italics)
theme.font_footer_name = theme.font_footer_name.strip()
#theme.font_footer_override
@ -745,7 +745,7 @@ class ThemeManager(QtGui.QWidget):
theme.font_main_color = theme.font_main_color.strip()
theme.font_main_height = int(theme.font_main_height.strip())
theme.font_main_italics = str_to_bool(theme.font_main_italics)
theme.font_main_indentation = int(theme.font_main_indentation)
# theme.font_main_indentation = int(theme.font_main_indentation)
theme.font_main_name = theme.font_main_name.strip()
#theme.font_main_override
theme.font_main_proportion = int(theme.font_main_proportion.strip())

View File

@ -59,10 +59,10 @@ class BibleMediaItem(MediaManagerItem):
self.pluginNameVisible = translate('BiblesPlugin.MediaItem', 'Bible')
self.IconPath = u'songs/song'
self.ListViewWithDnD_class = BibleListView
self.lastReference = []
MediaManagerItem.__init__(self, parent, icon, title)
# place to store the search results
# place to store the search results for both bibles
self.search_results = {}
self.dual_search_results = {}
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'bibles_load_list'), self.reloadBibles)
@ -423,6 +423,7 @@ class BibleMediaItem(MediaManagerItem):
def onAdvancedSearchButton(self):
log.debug(u'Advanced Search Button pressed')
bible = unicode(self.AdvancedVersionComboBox.currentText())
dual_bible = unicode(self.AdvancedSecondBibleComboBox.currentText())
book = unicode(self.AdvancedBookComboBox.currentText())
chapter_from = int(self.AdvancedFromChapter.currentText())
chapter_to = int(self.AdvancedToChapter.currentText())
@ -431,11 +432,12 @@ class BibleMediaItem(MediaManagerItem):
versetext = u'%s %s:%s-%s:%s' % (book, chapter_from, verse_from,
chapter_to, verse_to)
self.search_results = self.parent.manager.get_verses(bible, versetext)
if dual_bible:
self.dual_search_results = self.parent.manager.get_verses(
dual_bible, versetext)
if self.ClearAdvancedSearchComboBox.currentIndex() == 0:
self.listView.clear()
self.lastReference = []
self.lastReference.append(versetext)
self.displayResults(bible)
self.displayResults(bible, dual_bible)
def onAdvancedFromChapter(self):
bible = unicode(self.AdvancedVersionComboBox.currentText())
@ -450,99 +452,84 @@ class BibleMediaItem(MediaManagerItem):
def onQuickSearchButton(self):
log.debug(u'Quick Search Button pressed')
bible = unicode(self.QuickVersionComboBox.currentText())
dual_bible = unicode(self.QuickSecondBibleComboBox.currentText())
text = unicode(self.QuickSearchEdit.text())
if self.ClearQuickSearchComboBox.currentIndex() == 0:
self.listView.clear()
self.lastReference = []
self.lastReference.append(text)
self.search_results = self.parent.manager.get_verses(bible, text)
if dual_bible:
self.dual_search_results = self.parent.manager.get_verses(
dual_bible, text)
if self.search_results:
self.displayResults(bible)
self.displayResults(bible, dual_bible)
def generateSlideData(self, service_item, item=None):
'''
Generates and formats the slides for the service item.
'''
log.debug(u'generating slide data')
items = self.listView.selectedIndexes()
if len(items) == 0:
return False
old_chapter = u''
raw_slides = []
raw_footer = []
bible_text = u''
old_chapter = u''
raw_footer = []
raw_slides = []
service_item.add_capability(ItemCapabilities.AllowsPreview)
service_item.add_capability(ItemCapabilities.AllowsLoop)
service_item.add_capability(ItemCapabilities.AllowsAdditions)
#If we want to use a 2nd translation / version
bible2 = u''
if self.SearchTabWidget.currentIndex() == 0:
bible2 = unicode(self.QuickSecondBibleComboBox.currentText())
else:
bible2 = unicode(self.AdvancedSecondBibleComboBox.currentText())
if bible2:
bible2_verses = []
for scripture in self.lastReference:
bible2_verses.extend(self.parent.manager.get_verses(bible2,
scripture))
bible2_version = self.parent.manager.get_meta_data(bible2,
u'Version')
bible2_copyright = self.parent.manager.get_meta_data(bible2,
u'Copyright')
bible2_permission = self.parent.manager.get_meta_data(bible2,
u'Permissions')
if bible2_version:
bible2_version = bible2_version.value
else:
bible2_version = u''
if bible2_copyright:
bible2_copyright = bible2_copyright.value
else:
bible2_copyright = u''
if bible2_permission:
bible2_permission = bible2_permission.value
else:
bible2_permission = u''
# Let's loop through the main lot, and assemble our verses
# Let's loop through the main lot, and assemble our verses.
for item in items:
bitem = self.listView.item(item.row())
reference = bitem.data(QtCore.Qt.UserRole)
if isinstance(reference, QtCore.QVariant):
reference = reference.toPyObject()
#bible = self._decodeQtObject(reference, 'bible')
book = self._decodeQtObject(reference, 'book')
chapter = self._decodeQtObject(reference, 'chapter')
verse = self._decodeQtObject(reference, 'verse')
text = self._decodeQtObject(reference, 'text')
bible = self._decodeQtObject(reference, 'bible')
version = self._decodeQtObject(reference, 'version')
copyright = self._decodeQtObject(reference, 'copyright')
#permission = self._decodeQtObject(reference, 'permission')
text = self._decodeQtObject(reference, 'text')
dual_bible = self._decodeQtObject(reference, 'dual_bible')
if dual_bible:
dual_version = self._decodeQtObject(reference,
'dual_version')
dual_copyright = self._decodeQtObject(reference,
'dual_copyright')
#dual_permission = self._decodeQtObject(reference,
# 'dual_permission')
dual_text = self._decodeQtObject(reference, 'dual_text')
if self.parent.settings_tab.display_style == 1:
verse_text = self.formatVerse(old_chapter, chapter, verse,
u'<sup>(', u')</sup>')
u'{su}(', u'){/su}')
elif self.parent.settings_tab.display_style == 2:
verse_text = self.formatVerse(old_chapter, chapter, verse,
u'<sup>{', u'}</sup>')
u'{su}{', u'}{/su}')
elif self.parent.settings_tab.display_style == 3:
verse_text = self.formatVerse(old_chapter, chapter, verse,
u'<sup>[', u']</sup>')
u'{su}[', u']{/su}')
else:
verse_text = self.formatVerse(old_chapter, chapter, verse,
u'<sup>', u'</sup>')
u'{su}', u'{/su}')
old_chapter = chapter
footer = u'%s (%s %s)' % (book, version, copyright)
# If not found add to footer
if footer not in raw_footer:
raw_footer.append(footer)
if bible2:
footer = u'%s (%s %s)' % (book, bible2_version,
bible2_copyright)
#If not found add second version and copyright to footer
if dual_bible:
footer = u'%s (%s %s)' % (book, dual_version,
dual_copyright)
# If not found add second version and copyright to footer.
if footer not in raw_footer:
raw_footer.append(footer)
bible_text = u'%s %s \n\n %s %s' % (verse_text, text,
verse_text, bible2_verses[item.row()].text)
verse_text, dual_text)
raw_slides.append(bible_text)
bible_text = u''
else:
#Paragraph style force new line per verse
# If we are 'Verse Per Line' then force a new line.
if self.parent.settings_tab.layout_style == 1:
text = text + u'\n'
else:
@ -550,28 +537,50 @@ class BibleMediaItem(MediaManagerItem):
service_item.add_capability(ItemCapabilities.NoLineBreaks)
text = text + u'\n'
bible_text = u'%s %s %s' % (bible_text, verse_text, text)
#if we are verse per slide then create slide
# If we are 'Verse Per Slide' then create a new slide.
if self.parent.settings_tab.layout_style == 0:
raw_slides.append(bible_text)
bible_text = u''
# If we are not 'Verse Per Slide' we have to make sure, that we
# add more verses.
else:
if item.row() < len(items) - 1:
bitem = items[item.row() + 1]
reference = bitem.data(QtCore.Qt.UserRole)
if isinstance(reference, QtCore.QVariant):
reference = reference.toPyObject()
bible_new = self._decodeQtObject(reference, 'bible')
dual_bible_new = self._decodeQtObject(reference, 'dual_bible')
if dual_bible_new:
raw_slides.append(bible_text)
bible_text = u''
elif bible != bible_new:
raw_slides.append(bible_text)
bible_text = u''
else:
raw_slides.append(bible_text)
bible_text = u''
# service item title
if not service_item.title:
service_item.title = u'%s %s:%s' % (book, chapter, verse)
if dual_bible:
service_item.title = u'%s (%s, %s) %s' % (book, version,
dual_version, verse_text)
else:
service_item.title = u'%s (%s) %s' % (book, version, verse_text)
elif service_item.title.find(
translate('BiblesPlugin.MediaItem', 'etc')) == -1:
service_item.title = u'%s, %s' % (service_item.title,
translate('BiblesPlugin.MediaItem', 'etc'))
# item theme
if len(self.parent.settings_tab.bible_theme) == 0:
service_item.theme = None
else:
service_item.theme = self.parent.settings_tab.bible_theme
#if we are verse per slide we have already been added
if self.parent.settings_tab.layout_style != 0 and not bible2:
raw_slides.append(bible_text)
for slide in raw_slides:
service_item.add_from_text(slide[:30], slide)
if service_item.raw_footer:
for foot in raw_footer:
service_item.raw_footer.append(foot)
for footer in raw_footer:
service_item.raw_footer.append(footer)
else:
service_item.raw_footer = raw_footer
return True
@ -603,8 +612,8 @@ class BibleMediaItem(MediaManagerItem):
row, QtCore.QVariant(book[u'chapters']))
if first:
first = False
self.initialiseChapterVerse(
bible, book[u'name'], book[u'chapters'])
self.initialiseChapterVerse(bible, book[u'name'],
book[u'chapters'])
def initialiseChapterVerse(self, bible, book, chapters):
log.debug(u'initialiseChapterVerse %s, %s', bible, book)
@ -628,32 +637,69 @@ class BibleMediaItem(MediaManagerItem):
for i in range(int(range_from), int(range_to) + 1):
combo.addItem(unicode(i))
def displayResults(self, bible):
def displayResults(self, bible, dual_bible=None):
'''
Displays the search results in the media manager. All data needed for further
action is saved for/in each row.
'''
version = self.parent.manager.get_meta_data(bible, u'Version')
copyright = self.parent.manager.get_meta_data(bible, u'Copyright')
permission = self.parent.manager.get_meta_data(bible, u'Permissions')
if not permission:
permission = u''
if dual_bible:
dual_version = self.parent.manager.get_meta_data(dual_bible,
u'Version')
dual_copyright = self.parent.manager.get_meta_data(dual_bible,
u'Copyright')
dual_permission = self.parent.manager.get_meta_data(dual_bible,
u'Permissions')
if dual_permission:
dual_permission = dual_permission.value
else:
permission = permission.value
dual_permission = u''
# We count the number of rows which are maybe already present.
start_count = self.listView.count()
for count, verse in enumerate(self.search_results):
bible_text = u' %s %d:%d (%s)' % \
(verse.book.name, verse.chapter, verse.verse, bible)
bible_verse = QtGui.QListWidgetItem(bible_text)
#bible_verse.setData(QtCore.Qt.UserRole,
# QtCore.QVariant(bible_text))
if dual_bible:
vdict = {
'bible': QtCore.QVariant(bible),
'version': QtCore.QVariant(version.value),
'copyright': QtCore.QVariant(copyright.value),
'permission': QtCore.QVariant(permission),
'book':QtCore.QVariant(verse.book.name),
'chapter':QtCore.QVariant(verse.chapter),
'verse':QtCore.QVariant(verse.verse),
'text': QtCore.QVariant(verse.text)
'bible':QtCore.QVariant(bible),
'version':QtCore.QVariant(version.value),
'copyright':QtCore.QVariant(copyright.value),
#'permission':QtCore.QVariant(permission.value),
'text':QtCore.QVariant(verse.text),
'dual_bible':QtCore.QVariant(dual_bible),
'dual_version':QtCore.QVariant(dual_version.value),
'dual_copyright':QtCore.QVariant(dual_copyright.value),
#'dual_permission':QtCore.QVariant(dual_permission),
'dual_text':QtCore.QVariant(
self.dual_search_results[count].text)
}
bible_text = u' %s %d:%d (%s, %s)' % (verse.book.name,
verse.chapter, verse.verse, version.value, dual_version.value)
else:
vdict = {
'book':QtCore.QVariant(verse.book.name),
'chapter':QtCore.QVariant(verse.chapter),
'verse':QtCore.QVariant(verse.verse),
'bible':QtCore.QVariant(bible),
'version':QtCore.QVariant(version.value),
'copyright':QtCore.QVariant(copyright.value),
#'permission':QtCore.QVariant(permission.value),
'text':QtCore.QVariant(verse.text),
'dual_bible':QtCore.QVariant(dual_bible)
}
bible_text = u' %s %d:%d (%s)' % (verse.book.name,
verse.chapter, verse.verse, version.value)
# set the row title
bible_verse = QtGui.QListWidgetItem(bible_text)
#bible_verse.setData(QtCore.Qt.UserRole,
# QtCore.QVariant(bible_text))
bible_verse.setData(QtCore.Qt.UserRole, QtCore.QVariant(vdict))
self.listView.addItem(bible_verse)
row = self.listView.setCurrentRow(count)
row = self.listView.setCurrentRow(count + start_count)
if row:
row.setSelected(True)
self.search_results = {}
self.dual_search_results = {}

View File

@ -27,6 +27,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import build_icon, translate
from openlp.core.ui import SpellTextEdit
class Ui_CustomEditDialog(object):
def setupUi(self, customEditDialog):
@ -73,7 +74,7 @@ class Ui_CustomEditDialog(object):
self.editLayout3.setSpacing(8)
self.editLayout3.setMargin(0)
self.editLayout3.setObjectName(u'editLayout3')
self.verseTextEdit = QtGui.QTextEdit(self.editWidget)
self.verseTextEdit = SpellTextEdit(self)
self.verseTextEdit.setObjectName(u'verseTextEdit')
self.editLayout3.addWidget(self.verseTextEdit)
self.buttonWidget = QtGui.QWidget(self.editWidget)

View File

@ -422,7 +422,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.VerseDeleteButton.setEnabled(True)
def onVerseAddButtonClicked(self):
self.verse_form.setVerse(u'', True)
# Allow insert button as you do not know if multiple verses will
# be entered.
self.verse_form.setVerse(u'')
if self.verse_form.exec_():
afterText, verse, subVerse = self.verse_form.getVerse()
data = u'%s:%s' % (verse, subVerse)

View File

@ -27,6 +27,7 @@
from PyQt4 import QtCore, QtGui
from openlp.core.lib import build_icon, translate
from openlp.core.ui import SpellTextEdit
from openlp.plugins.songs.lib import VerseType
class Ui_EditVerseDialog(object):
@ -38,7 +39,7 @@ class Ui_EditVerseDialog(object):
self.EditVerseLayout.setSpacing(8)
self.EditVerseLayout.setMargin(8)
self.EditVerseLayout.setObjectName(u'EditVerseLayout')
self.VerseTextEdit = QtGui.QPlainTextEdit(EditVerseDialog)
self.VerseTextEdit = SpellTextEdit(EditVerseDialog)
self.VerseTextEdit.setObjectName(u'VerseTextEdit')
self.EditVerseLayout.addWidget(self.VerseTextEdit)
self.VerseTypeLayout = QtGui.QHBoxLayout()

View File

@ -45,6 +45,9 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
"""
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
QtCore.QObject.connect(self.VerseTextEdit,
QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
self.contextMenu)
QtCore.QObject.connect(
self.InsertButton,
QtCore.SIGNAL(u'clicked()'),
@ -57,6 +60,10 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
)
self.verse_regex = re.compile(r'---\[([-\w]+):([\d]+)\]---')
def contextMenu(self, point):
item = self.serviceManagerList.itemAt(point)
print item
def insertVerse(self, title, num=1):
if self.VerseTextEdit.textCursor().columnNumber() != 0:
self.VerseTextEdit.insertPlainText(u'\n')

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
@ -13,7 +14,7 @@
height="744.09448"
id="svg5740"
sodipodi:version="0.32"
inkscape:version="0.46"
inkscape:version="0.47 r22583"
version="1.0"
sodipodi:docname="openlp-logo.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
@ -262,14 +263,15 @@
inkscape:pageshadow="2"
inkscape:zoom="1.0119683"
inkscape:cx="513.59551"
inkscape:cy="369.01895"
inkscape:cy="490.71958"
inkscape:document-units="px"
inkscape:current-layer="layer6"
showgrid="false"
inkscape:window-width="1280"
inkscape:window-height="958"
inkscape:window-width="1600"
inkscape:window-height="839"
inkscape:window-x="-4"
inkscape:window-y="-4" />
inkscape:window-y="-3"
inkscape:window-maximized="1" />
<metadata
id="metadata5745">
<rdf:RDF>
@ -314,7 +316,7 @@
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
transform="matrix(0.6379835,0,0,0.6379835,-67.554612,-15.189295)"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
d="m 833.03006,395.26932 c 0,197.56259 -160.15613,357.71872 -357.71872,357.71872 -197.56259,0 -357.71872,-160.15613 -357.71872,-357.71872 0,-197.5626 160.15613,-357.718722 357.71872,-357.718722 197.56259,0 357.71872,160.156122 357.71872,357.718722 z"
sodipodi:ry="357.71872"
sodipodi:rx="357.71872"
sodipodi:cy="395.26932"
@ -333,14 +335,14 @@
sodipodi:cy="395.26932"
sodipodi:rx="357.71872"
sodipodi:ry="357.71872"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
d="m 833.03006,395.26932 c 0,197.56259 -160.15613,357.71872 -357.71872,357.71872 -197.56259,0 -357.71872,-160.15613 -357.71872,-357.71872 0,-197.5626 160.15613,-357.718722 357.71872,-357.718722 197.56259,0 357.71872,160.156122 357.71872,357.718722 z"
transform="matrix(0.6379835,0,0,0.6379835,-67.554612,-15.189295)" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
transform="matrix(0.6317287,0,0,0.6317287,-64.581662,-12.716988)"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
d="m 833.03006,395.26932 c 0,197.56259 -160.15613,357.71872 -357.71872,357.71872 -197.56259,0 -357.71872,-160.15613 -357.71872,-357.71872 0,-197.5626 160.15613,-357.718722 357.71872,-357.718722 197.56259,0 357.71872,160.156122 357.71872,357.718722 z"
sodipodi:ry="357.71872"
sodipodi:rx="357.71872"
sodipodi:cy="395.26932"
@ -360,133 +362,5 @@
d="M 235.67972,13.233984 C 199.75196,13.233984 165.79894,21.722639 135.704,36.792417 L 296.72396,165.96674 L 349.27738,208.13573 C 388.42508,203.26072 423.85383,195.91016 453.73266,186.69491 C 430.89209,87.375898 341.89666,13.233985 235.67972,13.233984 z M 79.118968,77.210299 C 71.146114,85.023824 63.764822,93.431949 57.026574,102.35694 L 274.63156,209.66285 L 282.95948,213.77591 C 290.87301,213.39575 298.68426,212.91815 306.39574,212.35059 L 275.3035,193.86221 L 79.118968,77.210299 z M 24.488653,162.95322 C 21.826867,170.53849 19.56686,178.3145 17.728584,186.24695 C 60.352717,199.56405 114.44154,209.03001 174.67621,212.92072 L 24.488653,162.95322 z"
style="fill:url(#linearGradient4057);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.80000019;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
</g>
<g
id="g4025"
transform="translate(-0.9881736,-11.858079)">
<g
id="g3202"
transform="matrix(0.6515729,0,0,0.6515729,482.27854,11.483464)">
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
transform="matrix(0.9791437,0,0,0.9791437,6.955563,-15.153813)"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
sodipodi:ry="357.71872"
sodipodi:rx="357.71872"
sodipodi:cy="395.26932"
sodipodi:cx="475.31134"
id="path3204"
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00028753;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter6926)"
sodipodi:type="arc" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
sodipodi:type="arc"
style="opacity:1;fill:#051e52;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00028753;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
id="path3206"
sodipodi:cx="475.31134"
sodipodi:cy="395.26932"
sodipodi:rx="357.71872"
sodipodi:ry="357.71872"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
transform="matrix(0.9791437,0,0,0.9791437,6.955563,-15.153813)" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
transform="matrix(0.9695442,0,0,0.9695442,11.51829,-11.359445)"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
sodipodi:ry="357.71872"
sodipodi:rx="357.71872"
sodipodi:cy="395.26932"
sodipodi:cx="475.31134"
id="path3208"
style="opacity:1;fill:url(#linearGradient4047);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00028753;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
sodipodi:type="arc" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
id="path3210"
d="M 472.34375,28.46875 C 417.2037,28.46875 365.09439,41.496693 318.90625,64.625 L 566.03125,262.875 L 805.59375,455.0625 C 812.23078,428.42209 815.75,400.56059 815.75,371.875 C 815.75,182.3236 661.89515,28.468751 472.34375,28.46875 z M 232.0625,126.65625 C 219.82618,138.64804 208.49776,151.55239 198.15625,165.25 L 532.125,329.9375 L 777.03125,450.71875 L 533.15625,305.6875 L 232.0625,126.65625 z M 148.21875,258.25 C 142.6509,274.11664 138.23633,290.51145 135.03125,307.34375 L 509.9375,399.96875 L 759.8125,461.71875 L 510,378.59375 L 148.21875,258.25 z M 131.375,412.5625 C 133.37791,429.50222 136.58909,446.06205 140.96875,462.15625 L 491.71875,472.15625 L 757.9375,479.78125 L 499.78125,452.0625 L 131.375,412.5625 z M 768.28125,495.84375 L 494,525.125 L 183.96875,558.21875 C 193.11462,572.33688 203.2524,585.75373 214.3125,598.34375 L 485.8125,548.09375 L 768.28125,495.84375 z M 789.4375,503.84375 L 500.34375,599.28125 L 296.21875,666.65625 C 347.72979,697.51903 407.96606,715.24999 472.34375,715.25 C 615.1411,715.25 737.67984,627.95502 789.4375,503.84375 z"
style="opacity:1;fill:url(#linearGradient4049);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
<path
id="path3212"
d="M 472.34375,28.46875 C 417.2037,28.46875 365.09439,41.496693 318.90625,64.625 L 566.03125,262.875 L 646.6875,327.59375 C 706.76934,320.11184 761.14353,308.83058 807,294.6875 C 771.94549,142.25788 635.35996,28.468751 472.34375,28.46875 z M 232.0625,126.65625 C 219.82618,138.64804 208.49776,151.55239 198.15625,165.25 L 532.125,329.9375 L 544.90625,336.25 C 557.05152,335.66655 569.03982,334.93356 580.875,334.0625 L 533.15625,305.6875 L 232.0625,126.65625 z M 148.21875,258.25 C 144.13358,269.89147 140.66504,281.82569 137.84375,294 C 203.26104,314.43839 286.27373,328.96625 378.71875,334.9375 L 148.21875,258.25 z"
style="opacity:1;fill:url(#linearGradient4051);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.80000019;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
</g>
<g
style="fill:#ffffff;fill-opacity:1;filter:url(#filter4005)"
id="g2762"
transform="matrix(0.8481394,0,0,0.8481394,20.507371,-653.75135)">
<path
style="fill:#ffffff;fill-opacity:1"
id="path2764"
d="M 801.444,1038.553 L 817.061,1038.553 C 835.923,1038.553 845.557,1048.997 845.557,1064.514 C 845.557,1079.726 835.923,1090.373 817.061,1090.373 L 808.745,1090.373 L 808.745,1107.512 L 801.444,1107.512 L 801.444,1038.553 L 801.444,1038.553 z M 816.655,1083.984 C 832.172,1083.984 837.952,1075.872 837.952,1064.513 C 837.952,1053.154 832.172,1045.042 816.655,1045.042 L 808.745,1045.042 L 808.745,1083.983 L 816.655,1083.983 L 816.655,1083.984 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2766"
d="M 852.858,1038.553 L 894.842,1038.553 L 894.842,1045.043 L 860.158,1045.043 L 860.158,1077.393 L 891.089,1077.393 L 891.089,1083.782 L 860.158,1083.782 L 860.158,1101.022 L 896.261,1101.022 L 896.261,1107.512 L 852.858,1107.512 L 852.858,1038.553 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2768"
d="M 913.197,1059.545 C 911.27,1057.212 908.43,1053.155 908.43,1053.155 C 908.43,1053.155 909.038,1058.023 909.038,1060.965 L 909.038,1107.512 L 902.142,1107.512 L 902.142,1037.843 L 903.359,1037.843 L 944.532,1086.52 C 946.459,1088.853 948.791,1091.683 948.791,1091.683 C 948.791,1091.683 948.791,1088.041 948.791,1085.101 L 948.791,1038.553 L 955.586,1038.553 L 955.586,1108.222 L 954.369,1108.222 L 913.197,1059.545 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2770"
d="M 677.015,1070.032 C 677.015,1035.196 703.268,1011.468 735.579,1011.468 C 767.89,1011.468 794.143,1035.197 794.143,1070.032 C 794.143,1104.867 767.89,1128.596 735.579,1128.596 C 703.268,1128.596 677.015,1104.868 677.015,1070.032 z M 787.075,1070.032 C 787.075,1040.077 765.03,1017.694 735.579,1017.694 C 706.128,1017.694 684.083,1040.077 684.083,1070.032 C 684.083,1099.988 706.128,1122.37 735.579,1122.37 C 765.03,1122.37 787.075,1099.988 787.075,1070.032 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2772"
d="M 967.521,1012.814 L 991.082,1012.814 L 991.082,1106.551 L 1042.915,1106.551 L 1042.915,1127.25 L 967.521,1127.25 L 967.521,1012.814 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2774"
d="M 1054.85,1012.814 L 1086.489,1012.814 C 1118.464,1012.814 1137.649,1029.475 1137.649,1057.074 C 1137.649,1084.674 1118.295,1101.166 1086.489,1101.166 L 1078.411,1101.166 L 1078.411,1127.251 L 1054.85,1127.251 L 1054.85,1012.814 z M 1085.815,1080.467 C 1105,1080.467 1113.414,1072.726 1113.414,1057.074 C 1113.414,1041.255 1104.663,1033.513 1085.815,1033.513 L 1078.41,1033.513 L 1078.41,1080.466 L 1085.815,1080.466 L 1085.815,1080.467 z" />
</g>
<g
style="fill:#000d26;fill-opacity:1"
transform="matrix(0.8481394,0,0,0.8481394,20.507371,-653.75135)"
id="g3221">
<path
style="fill:#000d26;fill-opacity:1"
d="M 801.444,1038.553 L 817.061,1038.553 C 835.923,1038.553 845.557,1048.997 845.557,1064.514 C 845.557,1079.726 835.923,1090.373 817.061,1090.373 L 808.745,1090.373 L 808.745,1107.512 L 801.444,1107.512 L 801.444,1038.553 L 801.444,1038.553 z M 816.655,1083.984 C 832.172,1083.984 837.952,1075.872 837.952,1064.513 C 837.952,1053.154 832.172,1045.042 816.655,1045.042 L 808.745,1045.042 L 808.745,1083.983 L 816.655,1083.983 L 816.655,1083.984 z"
id="path3223" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 852.858,1038.553 L 894.842,1038.553 L 894.842,1045.043 L 860.158,1045.043 L 860.158,1077.393 L 891.089,1077.393 L 891.089,1083.782 L 860.158,1083.782 L 860.158,1101.022 L 896.261,1101.022 L 896.261,1107.512 L 852.858,1107.512 L 852.858,1038.553 z"
id="path3225" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 913.197,1059.545 C 911.27,1057.212 908.43,1053.155 908.43,1053.155 C 908.43,1053.155 909.038,1058.023 909.038,1060.965 L 909.038,1107.512 L 902.142,1107.512 L 902.142,1037.843 L 903.359,1037.843 L 944.532,1086.52 C 946.459,1088.853 948.791,1091.683 948.791,1091.683 C 948.791,1091.683 948.791,1088.041 948.791,1085.101 L 948.791,1038.553 L 955.586,1038.553 L 955.586,1108.222 L 954.369,1108.222 L 913.197,1059.545 z"
id="path3227" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 677.015,1070.032 C 677.015,1035.196 703.268,1011.468 735.579,1011.468 C 767.89,1011.468 794.143,1035.197 794.143,1070.032 C 794.143,1104.867 767.89,1128.596 735.579,1128.596 C 703.268,1128.596 677.015,1104.868 677.015,1070.032 z M 787.075,1070.032 C 787.075,1040.077 765.03,1017.694 735.579,1017.694 C 706.128,1017.694 684.083,1040.077 684.083,1070.032 C 684.083,1099.988 706.128,1122.37 735.579,1122.37 C 765.03,1122.37 787.075,1099.988 787.075,1070.032 z"
id="path3229" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 967.521,1012.814 L 991.082,1012.814 L 991.082,1106.551 L 1042.915,1106.551 L 1042.915,1127.25 L 967.521,1127.25 L 967.521,1012.814 z"
id="path3231" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 1054.85,1012.814 L 1086.489,1012.814 C 1118.464,1012.814 1137.649,1029.475 1137.649,1057.074 C 1137.649,1084.674 1118.295,1101.166 1086.489,1101.166 L 1078.411,1101.166 L 1078.411,1127.251 L 1054.85,1127.251 L 1054.85,1012.814 z M 1085.815,1080.467 C 1105,1080.467 1113.414,1072.726 1113.414,1057.074 C 1113.414,1041.255 1104.663,1033.513 1085.815,1033.513 L 1078.41,1033.513 L 1078.41,1080.466 L 1085.815,1080.466 L 1085.815,1080.467 z"
id="path3233" />
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 14 KiB

492
resources/images/openlp.svg Normal file
View File

@ -0,0 +1,492 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="1052.3622"
height="744.09448"
id="svg5740"
sodipodi:version="0.32"
inkscape:version="0.46"
version="1.0"
sodipodi:docname="openlp-logo.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
inkscape:export-xdpi="91.860847"
inkscape:export-ydpi="91.860847"
style="display:inline">
<defs
id="defs5742">
<linearGradient
id="linearGradient3208">
<stop
style="stop-color:#ffffff;stop-opacity:0.25098041;"
offset="0"
id="stop3210" />
<stop
style="stop-color:#ffffff;stop-opacity:0;"
offset="1"
id="stop3212" />
</linearGradient>
<linearGradient
id="linearGradient3195">
<stop
style="stop-color:#cdcdff;stop-opacity:1;"
offset="0"
id="stop3197" />
<stop
style="stop-color:#ebebff;stop-opacity:1;"
offset="1"
id="stop3199" />
</linearGradient>
<linearGradient
id="linearGradient6359">
<stop
style="stop-color:#000d26;stop-opacity:1;"
offset="0"
id="stop6361" />
<stop
style="stop-color:#507fda;stop-opacity:1;"
offset="1"
id="stop6363" />
</linearGradient>
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 526.18109 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="744.09448 : 526.18109 : 1"
inkscape:persp3d-origin="372.04724 : 350.78739 : 1"
id="perspective5748" />
<filter
inkscape:collect="always"
id="filter6926">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="3.5771872"
id="feGaussianBlur6928" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3208"
id="linearGradient3214"
x1="470.25891"
y1="276.68851"
x2="463.2301"
y2="14.822601"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3208"
id="linearGradient3229"
gradientUnits="userSpaceOnUse"
x1="470.25891"
y1="276.68851"
x2="463.2301"
y2="14.822601" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3208"
id="linearGradient3279"
gradientUnits="userSpaceOnUse"
x1="470.25891"
y1="276.68851"
x2="463.2301"
y2="14.822601" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3208"
id="linearGradient3287"
gradientUnits="userSpaceOnUse"
x1="470.25891"
y1="276.68851"
x2="463.2301"
y2="14.822601"
gradientTransform="matrix(1.1122448,0,0,1.2037738,-57.29825,4.8849318)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3195"
id="linearGradient3196"
gradientUnits="userSpaceOnUse"
x1="117.59262"
y1="384.05795"
x2="418.20981"
y2="436.03787" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6359"
id="linearGradient3198"
gradientUnits="userSpaceOnUse"
x1="815.75"
y1="480.55844"
x2="201.10622"
y2="371.85938" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3208"
id="linearGradient3200"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1122448,0,0,1.2037738,-57.29825,4.8849318)"
x1="470.25891"
y1="276.68851"
x2="469.44925"
y2="104.30029" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3195"
id="linearGradient3215"
gradientUnits="userSpaceOnUse"
x1="117.59262"
y1="384.05795"
x2="418.20981"
y2="436.03787" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6359"
id="linearGradient3217"
gradientUnits="userSpaceOnUse"
x1="815.75"
y1="480.55844"
x2="201.10622"
y2="371.85938" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3208"
id="linearGradient3219"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1122448,0,0,1.2037738,-57.29825,4.8849318)"
x1="470.25891"
y1="276.68851"
x2="469.44925"
y2="104.30029" />
<filter
inkscape:collect="always"
id="filter4005">
<feGaussianBlur
inkscape:collect="always"
stdDeviation="4.333215"
id="feGaussianBlur4007" />
</filter>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3208"
id="linearGradient4010"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7247086,0,0,0.7843464,-109.42065,-2.1325924)"
x1="470.25891"
y1="276.68851"
x2="469.44925"
y2="104.30029" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6359"
id="linearGradient4013"
gradientUnits="userSpaceOnUse"
x1="815.75"
y1="480.55844"
x2="201.10622"
y2="371.85938"
gradientTransform="matrix(0.6515729,0,0,0.6515729,-72.086668,-5.3154816)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3195"
id="linearGradient4047"
gradientUnits="userSpaceOnUse"
x1="117.59262"
y1="384.05795"
x2="418.20981"
y2="436.03787" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6359"
id="linearGradient4049"
gradientUnits="userSpaceOnUse"
x1="815.75"
y1="480.55844"
x2="201.10622"
y2="371.85938" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3208"
id="linearGradient4051"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.1122448,0,0,1.2037738,-57.29825,4.8849318)"
x1="470.25891"
y1="276.68851"
x2="469.44925"
y2="104.30029" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3195"
id="linearGradient4053"
gradientUnits="userSpaceOnUse"
x1="117.59262"
y1="384.05795"
x2="418.20981"
y2="436.03787" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient6359"
id="linearGradient4055"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.6515729,0,0,0.6515729,-72.086668,-5.3154816)"
x1="815.75"
y1="480.55844"
x2="201.10622"
y2="371.85938" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient3208"
id="linearGradient4057"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.7247086,0,0,0.7843464,-109.42065,-2.1325924)"
x1="470.25891"
y1="276.68851"
x2="469.44925"
y2="104.30029" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
gridtolerance="10000"
guidetolerance="10"
objecttolerance="10"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1.0119683"
inkscape:cx="513.59551"
inkscape:cy="369.01895"
inkscape:document-units="px"
inkscape:current-layer="layer6"
showgrid="false"
inkscape:window-width="1280"
inkscape:window-height="958"
inkscape:window-x="-4"
inkscape:window-y="-4" />
<metadata
id="metadata5745">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Shadow"
inkscape:groupmode="layer"
id="layer1"
style="display:inline" />
<g
inkscape:groupmode="layer"
id="layer5"
inkscape:label="Border"
style="display:inline" />
<g
inkscape:groupmode="layer"
id="layer3"
inkscape:label="Rays Background"
style="display:inline" />
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="Rays Foreground"
style="display:inline" />
<g
inkscape:groupmode="layer"
id="layer6"
inkscape:label="Reflection"
style="display:inline">
<g
id="g4018"
transform="translate(9.8817328,9.8817328)">
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
transform="matrix(0.6379835,0,0,0.6379835,-67.554612,-15.189295)"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
sodipodi:ry="357.71872"
sodipodi:rx="357.71872"
sodipodi:cy="395.26932"
sodipodi:cx="475.31134"
id="path6903"
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00028753;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter6926)"
sodipodi:type="arc" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
sodipodi:type="arc"
style="fill:#051e52;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00028753;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
id="path6900"
sodipodi:cx="475.31134"
sodipodi:cy="395.26932"
sodipodi:rx="357.71872"
sodipodi:ry="357.71872"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
transform="matrix(0.6379835,0,0,0.6379835,-67.554612,-15.189295)" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
transform="matrix(0.6317287,0,0,0.6317287,-64.581662,-12.716988)"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
sodipodi:ry="357.71872"
sodipodi:rx="357.71872"
sodipodi:cy="395.26932"
sodipodi:cx="475.31134"
id="path6317"
style="fill:url(#linearGradient4053);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00028753;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
sodipodi:type="arc" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
id="path6327"
d="M 235.67972,13.233984 C 199.75196,13.233984 165.79894,21.722639 135.704,36.792417 L 296.72396,165.96674 L 452.81639,291.19091 C 457.1409,273.83274 459.43393,255.67894 459.43393,236.98819 C 459.43393,113.48164 359.18627,13.233985 235.67972,13.233984 z M 79.118968,77.210299 C 71.146114,85.023824 63.764822,93.431949 57.026574,102.35694 L 274.63156,209.66285 L 434.20584,288.36064 L 275.3035,193.86221 L 79.118968,77.210299 z M 24.488653,162.95322 C 20.860793,173.29149 17.984378,183.97391 15.896035,194.94138 L 260.17479,255.29332 L 422.98657,295.52794 L 260.21551,241.36595 L 24.488653,162.95322 z M 13.513722,263.49906 C 14.818764,274.53653 16.911081,285.32646 19.764749,295.81301 L 248.30394,302.32874 L 421.76487,307.29698 L 253.55725,289.23619 L 13.513722,263.49906 z M 428.50457,317.76287 L 249.79034,336.84174 L 47.782384,358.40473 C 53.741585,367.60372 60.347088,376.34577 67.553549,384.54909 L 244.45559,351.80755 L 428.50457,317.76287 z M 442.28941,322.97545 L 253.92376,385.15994 L 120.92144,429.05966 C 154.48464,449.16902 193.73296,460.72203 235.67972,460.72204 C 328.7226,460.72204 408.56552,403.84299 442.28941,322.97545 z"
style="fill:url(#linearGradient4055);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
<path
id="path3203"
d="M 235.67972,13.233984 C 199.75196,13.233984 165.79894,21.722639 135.704,36.792417 L 296.72396,165.96674 L 349.27738,208.13573 C 388.42508,203.26072 423.85383,195.91016 453.73266,186.69491 C 430.89209,87.375898 341.89666,13.233985 235.67972,13.233984 z M 79.118968,77.210299 C 71.146114,85.023824 63.764822,93.431949 57.026574,102.35694 L 274.63156,209.66285 L 282.95948,213.77591 C 290.87301,213.39575 298.68426,212.91815 306.39574,212.35059 L 275.3035,193.86221 L 79.118968,77.210299 z M 24.488653,162.95322 C 21.826867,170.53849 19.56686,178.3145 17.728584,186.24695 C 60.352717,199.56405 114.44154,209.03001 174.67621,212.92072 L 24.488653,162.95322 z"
style="fill:url(#linearGradient4057);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.80000019;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
</g>
<g
id="g4025"
transform="translate(-0.9881736,-11.858079)">
<g
id="g3202"
transform="matrix(0.6515729,0,0,0.6515729,482.27854,11.483464)">
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
transform="matrix(0.9791437,0,0,0.9791437,6.955563,-15.153813)"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
sodipodi:ry="357.71872"
sodipodi:rx="357.71872"
sodipodi:cy="395.26932"
sodipodi:cx="475.31134"
id="path3204"
style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00028753;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline;filter:url(#filter6926)"
sodipodi:type="arc" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
sodipodi:type="arc"
style="opacity:1;fill:#051e52;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00028753;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
id="path3206"
sodipodi:cx="475.31134"
sodipodi:cy="395.26932"
sodipodi:rx="357.71872"
sodipodi:ry="357.71872"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
transform="matrix(0.9791437,0,0,0.9791437,6.955563,-15.153813)" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
transform="matrix(0.9695442,0,0,0.9695442,11.51829,-11.359445)"
d="M 833.03006,395.26932 A 357.71872,357.71872 0 1 1 117.59262,395.26932 A 357.71872,357.71872 0 1 1 833.03006,395.26932 z"
sodipodi:ry="357.71872"
sodipodi:rx="357.71872"
sodipodi:cy="395.26932"
sodipodi:cx="475.31134"
id="path3208"
style="opacity:1;fill:url(#linearGradient4047);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5.00028753;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline"
sodipodi:type="arc" />
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/raoul/openlp-logo-0.2.png"
id="path3210"
d="M 472.34375,28.46875 C 417.2037,28.46875 365.09439,41.496693 318.90625,64.625 L 566.03125,262.875 L 805.59375,455.0625 C 812.23078,428.42209 815.75,400.56059 815.75,371.875 C 815.75,182.3236 661.89515,28.468751 472.34375,28.46875 z M 232.0625,126.65625 C 219.82618,138.64804 208.49776,151.55239 198.15625,165.25 L 532.125,329.9375 L 777.03125,450.71875 L 533.15625,305.6875 L 232.0625,126.65625 z M 148.21875,258.25 C 142.6509,274.11664 138.23633,290.51145 135.03125,307.34375 L 509.9375,399.96875 L 759.8125,461.71875 L 510,378.59375 L 148.21875,258.25 z M 131.375,412.5625 C 133.37791,429.50222 136.58909,446.06205 140.96875,462.15625 L 491.71875,472.15625 L 757.9375,479.78125 L 499.78125,452.0625 L 131.375,412.5625 z M 768.28125,495.84375 L 494,525.125 L 183.96875,558.21875 C 193.11462,572.33688 203.2524,585.75373 214.3125,598.34375 L 485.8125,548.09375 L 768.28125,495.84375 z M 789.4375,503.84375 L 500.34375,599.28125 L 296.21875,666.65625 C 347.72979,697.51903 407.96606,715.24999 472.34375,715.25 C 615.1411,715.25 737.67984,627.95502 789.4375,503.84375 z"
style="opacity:1;fill:url(#linearGradient4049);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:5;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
<path
id="path3212"
d="M 472.34375,28.46875 C 417.2037,28.46875 365.09439,41.496693 318.90625,64.625 L 566.03125,262.875 L 646.6875,327.59375 C 706.76934,320.11184 761.14353,308.83058 807,294.6875 C 771.94549,142.25788 635.35996,28.468751 472.34375,28.46875 z M 232.0625,126.65625 C 219.82618,138.64804 208.49776,151.55239 198.15625,165.25 L 532.125,329.9375 L 544.90625,336.25 C 557.05152,335.66655 569.03982,334.93356 580.875,334.0625 L 533.15625,305.6875 L 232.0625,126.65625 z M 148.21875,258.25 C 144.13358,269.89147 140.66504,281.82569 137.84375,294 C 203.26104,314.43839 286.27373,328.96625 378.71875,334.9375 L 148.21875,258.25 z"
style="opacity:1;fill:url(#linearGradient4051);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.80000019;stroke-linecap:butt;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;display:inline" />
</g>
<g
style="fill:#ffffff;fill-opacity:1;filter:url(#filter4005)"
id="g2762"
transform="matrix(0.8481394,0,0,0.8481394,20.507371,-653.75135)">
<path
style="fill:#ffffff;fill-opacity:1"
id="path2764"
d="M 801.444,1038.553 L 817.061,1038.553 C 835.923,1038.553 845.557,1048.997 845.557,1064.514 C 845.557,1079.726 835.923,1090.373 817.061,1090.373 L 808.745,1090.373 L 808.745,1107.512 L 801.444,1107.512 L 801.444,1038.553 L 801.444,1038.553 z M 816.655,1083.984 C 832.172,1083.984 837.952,1075.872 837.952,1064.513 C 837.952,1053.154 832.172,1045.042 816.655,1045.042 L 808.745,1045.042 L 808.745,1083.983 L 816.655,1083.983 L 816.655,1083.984 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2766"
d="M 852.858,1038.553 L 894.842,1038.553 L 894.842,1045.043 L 860.158,1045.043 L 860.158,1077.393 L 891.089,1077.393 L 891.089,1083.782 L 860.158,1083.782 L 860.158,1101.022 L 896.261,1101.022 L 896.261,1107.512 L 852.858,1107.512 L 852.858,1038.553 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2768"
d="M 913.197,1059.545 C 911.27,1057.212 908.43,1053.155 908.43,1053.155 C 908.43,1053.155 909.038,1058.023 909.038,1060.965 L 909.038,1107.512 L 902.142,1107.512 L 902.142,1037.843 L 903.359,1037.843 L 944.532,1086.52 C 946.459,1088.853 948.791,1091.683 948.791,1091.683 C 948.791,1091.683 948.791,1088.041 948.791,1085.101 L 948.791,1038.553 L 955.586,1038.553 L 955.586,1108.222 L 954.369,1108.222 L 913.197,1059.545 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2770"
d="M 677.015,1070.032 C 677.015,1035.196 703.268,1011.468 735.579,1011.468 C 767.89,1011.468 794.143,1035.197 794.143,1070.032 C 794.143,1104.867 767.89,1128.596 735.579,1128.596 C 703.268,1128.596 677.015,1104.868 677.015,1070.032 z M 787.075,1070.032 C 787.075,1040.077 765.03,1017.694 735.579,1017.694 C 706.128,1017.694 684.083,1040.077 684.083,1070.032 C 684.083,1099.988 706.128,1122.37 735.579,1122.37 C 765.03,1122.37 787.075,1099.988 787.075,1070.032 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2772"
d="M 967.521,1012.814 L 991.082,1012.814 L 991.082,1106.551 L 1042.915,1106.551 L 1042.915,1127.25 L 967.521,1127.25 L 967.521,1012.814 z" />
<path
style="fill:#ffffff;fill-opacity:1"
id="path2774"
d="M 1054.85,1012.814 L 1086.489,1012.814 C 1118.464,1012.814 1137.649,1029.475 1137.649,1057.074 C 1137.649,1084.674 1118.295,1101.166 1086.489,1101.166 L 1078.411,1101.166 L 1078.411,1127.251 L 1054.85,1127.251 L 1054.85,1012.814 z M 1085.815,1080.467 C 1105,1080.467 1113.414,1072.726 1113.414,1057.074 C 1113.414,1041.255 1104.663,1033.513 1085.815,1033.513 L 1078.41,1033.513 L 1078.41,1080.466 L 1085.815,1080.466 L 1085.815,1080.467 z" />
</g>
<g
style="fill:#000d26;fill-opacity:1"
transform="matrix(0.8481394,0,0,0.8481394,20.507371,-653.75135)"
id="g3221">
<path
style="fill:#000d26;fill-opacity:1"
d="M 801.444,1038.553 L 817.061,1038.553 C 835.923,1038.553 845.557,1048.997 845.557,1064.514 C 845.557,1079.726 835.923,1090.373 817.061,1090.373 L 808.745,1090.373 L 808.745,1107.512 L 801.444,1107.512 L 801.444,1038.553 L 801.444,1038.553 z M 816.655,1083.984 C 832.172,1083.984 837.952,1075.872 837.952,1064.513 C 837.952,1053.154 832.172,1045.042 816.655,1045.042 L 808.745,1045.042 L 808.745,1083.983 L 816.655,1083.983 L 816.655,1083.984 z"
id="path3223" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 852.858,1038.553 L 894.842,1038.553 L 894.842,1045.043 L 860.158,1045.043 L 860.158,1077.393 L 891.089,1077.393 L 891.089,1083.782 L 860.158,1083.782 L 860.158,1101.022 L 896.261,1101.022 L 896.261,1107.512 L 852.858,1107.512 L 852.858,1038.553 z"
id="path3225" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 913.197,1059.545 C 911.27,1057.212 908.43,1053.155 908.43,1053.155 C 908.43,1053.155 909.038,1058.023 909.038,1060.965 L 909.038,1107.512 L 902.142,1107.512 L 902.142,1037.843 L 903.359,1037.843 L 944.532,1086.52 C 946.459,1088.853 948.791,1091.683 948.791,1091.683 C 948.791,1091.683 948.791,1088.041 948.791,1085.101 L 948.791,1038.553 L 955.586,1038.553 L 955.586,1108.222 L 954.369,1108.222 L 913.197,1059.545 z"
id="path3227" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 677.015,1070.032 C 677.015,1035.196 703.268,1011.468 735.579,1011.468 C 767.89,1011.468 794.143,1035.197 794.143,1070.032 C 794.143,1104.867 767.89,1128.596 735.579,1128.596 C 703.268,1128.596 677.015,1104.868 677.015,1070.032 z M 787.075,1070.032 C 787.075,1040.077 765.03,1017.694 735.579,1017.694 C 706.128,1017.694 684.083,1040.077 684.083,1070.032 C 684.083,1099.988 706.128,1122.37 735.579,1122.37 C 765.03,1122.37 787.075,1099.988 787.075,1070.032 z"
id="path3229" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 967.521,1012.814 L 991.082,1012.814 L 991.082,1106.551 L 1042.915,1106.551 L 1042.915,1127.25 L 967.521,1127.25 L 967.521,1012.814 z"
id="path3231" />
<path
style="fill:#000d26;fill-opacity:1"
d="M 1054.85,1012.814 L 1086.489,1012.814 C 1118.464,1012.814 1137.649,1029.475 1137.649,1057.074 C 1137.649,1084.674 1118.295,1101.166 1086.489,1101.166 L 1078.411,1101.166 L 1078.411,1127.251 L 1054.85,1127.251 L 1054.85,1012.814 z M 1085.815,1080.467 C 1105,1080.467 1113.414,1072.726 1113.414,1057.074 C 1113.414,1041.255 1104.663,1033.513 1085.815,1033.513 L 1078.41,1033.513 L 1078.41,1080.466 L 1085.815,1080.466 L 1085.815,1080.467 z"
id="path3233" />
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 24 KiB