diff --git a/openlp.pyw b/openlp.pyw
index c4f062b87..dfe973ceb 100755
--- a/openlp.pyw
+++ b/openlp.pyw
@@ -129,11 +129,11 @@ class OpenLP(QtGui.QApplication):
screens = ScreenList()
# Decide how many screens we have and their size
for screen in xrange(0, self.desktop().numScreens()):
+ size = self.desktop().screenGeometry(screen);
screens.add_screen({u'number': screen,
- u'size': self.desktop().availableGeometry(screen),
+ u'size': size,
u'primary': (self.desktop().primaryScreen() == screen)})
- log.info(u'Screen %d found with resolution %s',
- screen, self.desktop().availableGeometry(screen))
+ log.info(u'Screen %d found with resolution %s', screen, size)
# start the main app window
self.mainWindow = MainWindow(screens, app_version)
self.mainWindow.show()
diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py
index 721b6ae23..1f911491f 100644
--- a/openlp/core/lib/__init__.py
+++ b/openlp/core/lib/__init__.py
@@ -316,6 +316,7 @@ def expand_tags(text):
text = text.replace(tag[u'end tag'], tag[u'end html'])
return text
+from spelltextedit import SpellTextEdit
from eventreceiver import Receiver
from settingsmanager import SettingsManager
from plugin import PluginStatus, Plugin
@@ -324,7 +325,8 @@ from settingstab import SettingsTab
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
diff --git a/openlp/core/lib/htmlbuilder.py b/openlp/core/lib/htmlbuilder.py
index d03b7f7cc..9c696526e 100644
--- a/openlp/core/lib/htmlbuilder.py
+++ b/openlp/core/lib/htmlbuilder.py
@@ -24,10 +24,13 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
+import logging
from PyQt4 import QtWebKit
from openlp.core.lib import image_to_byte
+log = logging.getLogger(__name__)
+
HTMLSRC = u"""
@@ -37,9 +40,10 @@ HTMLSRC = u"""
margin: 0;
padding: 0;
border: 0;
+ overflow: hidden;
}
body {
- background-color: black;
+ %s;
}
.size {
position: absolute;
@@ -192,7 +196,7 @@ body {
function show_text(newtext){
if(timer != null)
clearTimeout(timer);
- text_fade('lyricsmain', newtext);
+ text_fade('lyricsmain', newtext);
text_fade('lyricsoutline', newtext);
text_fade('lyricsshadow', newtext);
if(text_opacity()==1) return;
@@ -233,7 +237,7 @@ body {
var text = document.getElementById('lyricsmain');
return getComputedStyle(text, '').opacity;
}
-
+
function show_text_complete(){
return (text_opacity()==1);
}
@@ -263,58 +267,101 @@ def build_html(item, screen, alert, islive):
`islive`
Item is going live, rather than preview/theme building
"""
- try:
- webkitvers = float(QtWebKit.qWebKitVersion())
- except AttributeError:
- webkitvers = 0
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:
image = u''
- html = HTMLSRC % (width, height,
+ html = HTMLSRC % (build_background_css(item, width, height),
+ width, height,
build_alert_css(alert, width),
build_footer_css(item),
build_lyrics_css(item, webkitvers),
u'true' if theme and theme.display_slideTransition and islive \
else u'false',
- image,
+ image,
build_lyrics_html(item, webkitvers))
return html
-def build_lyrics_css(item, webkitvers):
+def webkit_version():
"""
- Build the video display css
+ Return the Webkit version in use.
+ Note method added relatively recently, so return 0 if prior to this
+ """
+ try:
+ webkitvers = float(QtWebKit.qWebKitVersion())
+ log.debug(u'Webkit version = %s' % webkitvers)
+ except AttributeError:
+ webkitvers = 0
+ return webkitvers
+
+def build_background_css(item, width, height):
+ """
+ Build the background css
`item`
Service Item containing theme and location information
-
+
+ """
+ width = int(width) / 2
+ theme = item.themedata
+ background = u'background-color: black'
+ if theme:
+ if theme.background_type == u'solid':
+ background = u'background-color: %s' % theme.background_color
+ else:
+ if theme.background_direction == u'horizontal':
+ background = \
+ u'background: ' \
+ u'-webkit-gradient(linear, left top, left bottom, ' \
+ 'from(%s), to(%s))' % (theme.background_startColor,
+ theme.background_endColor)
+ elif theme.background_direction == u'vertical':
+ background = \
+ u'background: -webkit-gradient(linear, left top, ' \
+ u'right top, from(%s), to(%s))' % \
+ (theme.background_startColor, theme.background_endColor)
+ else:
+ background = \
+ u'background: -webkit-gradient(radial, %s 50%%, 100, %s ' \
+ u'50%%, %s, from(%s), to(%s))' % (width, width, width,
+ theme.background_startColor, theme.background_endColor)
+ return background
+
+def build_lyrics_css(item, webkitvers):
+ """
+ Build the lyrics display css
+
+ `item`
+ Service Item containing theme and location information
+
`webkitvers`
The version of qtwebkit we're using
"""
style = """
-.lyricstable {
- z-index:4;
- position: absolute;
- display: table;
- %s
-}
-.lyricscell {
- display:table-cell;
- word-wrap: break-word;
+.lyricstable {
+ z-index:4;
+ position: absolute;
+ display: table;
%s
}
-.lyricsmain {
-%s
+.lyricscell {
+ display:table-cell;
+ word-wrap: break-word;
+ %s
}
-.lyricsoutline {
-%s
+.lyricsmain {
+%s
}
-.lyricsshadow {
-%s
+.lyricsoutline {
+%s
+}
+.lyricsshadow {
+%s
}
"""
theme = item.themedata
@@ -326,74 +373,117 @@ def build_lyrics_css(item, webkitvers):
if theme:
lyricstable = u'left: %spx; top: %spx;' % \
(item.main.x(), item.main.y())
- 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'width: %spx; height: %spx; text-align: %s; ' \
- 'vertical-align: %s; font-family: %s; font-size: %spt; ' \
- 'color: %s; line-height: %d%%;' % \
- (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())
# 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
+ # especially when animating/transitions.
+ # However some bugs in older versions of qtwebkit mean we need to
# perform workarounds and add extra divs. Only do these when needed.
#
- # Before 533.3 the webkit-text-fill colour wasn't displayed, only the
+ # Before 533.3 the webkit-text-fill colour wasn't displayed, only the
# stroke (outline) color. So put stroke layer underneath the main text.
#
- # Before 534.4 the webkit-text-stroke was sometimes out of alignment
+ # Before 534.4 the webkit-text-stroke was sometimes out of alignment
# with the fill, or normal text. letter-spacing=1 is workaround
# https://bugs.webkit.org/show_bug.cgi?id=44403
#
- # Before 534.4 the text-shadow didn't get displayed when
- # webkit-text-stroke was used. So use an offset text layer underneath.
+ # 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
- if theme.display_outline:
- if webkitvers < 534.3:
- lyrics += u' letter-spacing: 1px;'
- outline = u' -webkit-text-stroke: %sem %s; ' \
- '-webkit-text-fill-color: %s; ' % \
- (float(theme.display_outline_size) / 16,
- theme.display_outline_color, theme.font_main_color)
- if webkitvers >= 533.3:
- lyricsmain += outline
- if theme.display_shadow and webkitvers < 534.3:
- shadow = u'-webkit-text-stroke: %sem %s; ' \
- u'-webkit-text-fill-color: %s; ' \
- u' padding-left: %spx; padding-top: %spx' % \
- (float(theme.display_outline_size) / 16,
- theme.display_shadow_color, theme.display_shadow_color,
- theme.display_shadow_size, theme.display_shadow_size)
- if theme.display_shadow and \
- (not theme.display_outline or webkitvers >= 534.3):
- 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)
lyrics_css = style % (lyricstable, lyrics, lyricsmain, outline, shadow)
return lyrics_css
+def build_lyrics_outline_css(theme, is_shadow=False):
+ """
+ Build the css which controls the theme outline
+ Also used by renderer for splitting verses
+
+ `theme`
+ Object containing theme information
+
+ `is_shadow`
+ If true, use the shadow colors instead
+ """
+ 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
+
+ `theme`
+ Object containing theme information
+
+ `width`
+ Width of the lyrics block
+
+ `height`
+ Height of the lyrics block
+
+ """
+ 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
+
def build_lyrics_html(item, webkitvers):
"""
Build the HTML required to show the lyrics
`item`
Service Item containing theme and location information
-
+
`webkitvers`
The version of qtwebkit we're using
"""
- # Bugs in some versions of QtWebKit mean we sometimes need additional
+ # Bugs in some versions of QtWebKit mean we sometimes need additional
# divs for outline and shadow, since the CSS doesn't work.
# To support vertical alignment middle and bottom, nested div's using
# display:table/display:table-cell are required for each lyric block.
@@ -411,7 +501,7 @@ def build_lyrics_html(item, webkitvers):
u''
return lyrics
-
+
def build_footer_css(item):
"""
Build the display of the item footer
diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py
index 41e547800..0cb92ad39 100644
--- a/openlp/core/lib/renderer.py
+++ b/openlp/core/lib/renderer.py
@@ -29,9 +29,10 @@ format it for the output display.
"""
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__)
@@ -69,21 +70,11 @@ class Renderer(object):
self.theme_name = theme.theme_name
if theme.background_type == u'image':
if theme.background_filename:
- self.set_bg_image(theme.background_filename)
-
- def set_bg_image(self, filename):
- """
- Set a background image.
-
- ``filename``
- The name of the image file.
- """
- log.debug(u'set bg image %s', filename)
- self._bg_image_filename = unicode(filename)
- if self.frame:
- self.bg_image = resize_image(self._bg_image_filename,
- self.frame.width(),
- self.frame.height())
+ self._bg_image_filename = unicode(theme.background_filename)
+ if self.frame:
+ self.bg_image = resize_image(self._bg_image_filename,
+ self.frame.width(),
+ self.frame.height())
def set_text_rectangle(self, rect_main, rect_footer):
"""
@@ -99,7 +90,7 @@ class Renderer(object):
self._rect = rect_main
self._rect_footer = rect_footer
- def set_frame_dest(self, frame_width, frame_height, preview=False):
+ def set_frame_dest(self, frame_width, frame_height):
"""
Set the size of the slide.
@@ -109,11 +100,7 @@ class Renderer(object):
``frame_height``
The height of the slide.
- ``preview``
- Defaults to *False*. Whether or not to generate a preview.
"""
- if preview:
- self.bg_frame = None
log.debug(u'set frame dest (frame) w %d h %d', frame_width,
frame_height)
self.frame = QtGui.QImage(frame_width, frame_height,
@@ -121,8 +108,17 @@ class Renderer(object):
if self._bg_image_filename and not self.bg_image:
self.bg_image = resize_image(self._bg_image_filename,
self.frame.width(), self.frame.height())
- if self.bg_frame is None:
- self._generate_background_frame()
+ if self._theme.background_type == u'image':
+ self.bg_frame = QtGui.QImage(self.frame.width(),
+ self.frame.height(), QtGui.QImage.Format_ARGB32_Premultiplied)
+ painter = QtGui.QPainter()
+ painter.begin(self.bg_frame)
+ painter.fillRect(self.frame.rect(), QtCore.Qt.black)
+ if self.bg_image:
+ painter.drawImage(0, 0, self.bg_image)
+ painter.end()
+ else:
+ self.bg_frame = None
def format_slide(self, words, line_break):
"""
@@ -143,91 +139,33 @@ class Renderer(object):
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'' \
+ u'' % \
+ (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'
'
+ 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
-
- 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)
- 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_type == u'solid':
- painter.fillRect(self.frame.rect(),
- QtGui.QColor(self._theme.background_color))
- elif self._theme.background_type == u'gradient':
- # gradient
- gradient = None
- if self._theme.background_direction == u'horizontal':
- w = int(self.frame.width()) / 2
- # vertical
- 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)
- else:
- w = int(self.frame.width()) / 2
- h = int(self.frame.height()) / 2
- # Circular
- gradient = QtGui.QRadialGradient(w, h, w)
- gradient.setColorAt(0,
- QtGui.QColor(self._theme.background_startColor))
- gradient.setColorAt(1,
- QtGui.QColor(self._theme.background_endColor))
- painter.setBrush(QtGui.QBrush(gradient))
- rect_path = QtGui.QPainterPath()
- max_x = self.frame.width()
- max_y = self.frame.height()
- rect_path.moveTo(0, 0)
- rect_path.lineTo(0, max_y)
- rect_path.lineTo(max_x, max_y)
- rect_path.lineTo(max_x, 0)
- rect_path.closeSubpath()
- painter.drawPath(rect_path)
- elif self._theme.background_type == u'image':
- # image
- painter.fillRect(self.frame.rect(), QtCore.Qt.black)
- if self.bg_image:
- painter.drawImage(0, 0, self.bg_image)
- painter.end()
diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py
index 134df0c42..0e8625ce7 100644
--- a/openlp/core/lib/serviceitem.py
+++ b/openlp/core/lib/serviceitem.py
@@ -160,9 +160,9 @@ class ServiceItem(object):
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()),
diff --git a/openlp/core/lib/spelltextedit.py b/openlp/core/lib/spelltextedit.py
new file mode 100644
index 000000000..7d227079b
--- /dev/null
+++ b/openlp/core/lib/spelltextedit.py
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
+
+###############################################################################
+# OpenLP - Open Source Lyrics Projection #
+# --------------------------------------------------------------------------- #
+# Copyright (c) 2008-2010 Raoul Snyman #
+# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
+# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian #
+# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
+# Carsten Tinggaard, Frode Woldsund #
+# --------------------------------------------------------------------------- #
+# This program is free software; you can redistribute it and/or modify it #
+# under the terms of the GNU General Public License as published by the Free #
+# Software Foundation; version 2 of the License. #
+# #
+# This program is distributed in the hope that it will be useful, but WITHOUT #
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
+# more details. #
+# #
+# You should have received a copy of the GNU General Public License along #
+# with this program; if not, write to the Free Software Foundation, Inc., 59 #
+# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
+###############################################################################
+
+import re
+import sys
+try:
+ import enchant
+ enchant_available = True
+except ImportError:
+ enchant_available = False
+
+# based on code from
+# http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/
+
+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.
+ if enchant_available:
+ 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()
+ # only select text if not already selected
+ if not cursor.hasSelection():
+ cursor.select(QtGui.QTextCursor.WordUnderCursor)
+ self.setTextCursor(cursor)
+ # Check if the selected word is misspelled and offer spelling
+ # suggestions if it is.
+ if enchant_available and 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())))
diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py
index dad79cb7b..33ba25046 100644
--- a/openlp/core/ui/__init__.py
+++ b/openlp/core/ui/__init__.py
@@ -27,141 +27,6 @@
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
-try:
- import enchant
- enchant_available = True
-except ImportError:
- enchant_available = False
-
-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.
- if enchant_available:
- 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 enchant_available and 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.
diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py
index bc050b6f9..d8481e801 100644
--- a/openlp/core/ui/generaltab.py
+++ b/openlp/core/ui/generaltab.py
@@ -195,6 +195,19 @@ class GeneralTab(SettingsTab):
self.currentYValueLabel.setObjectName(u'currentYValueLabel')
self.currentYLayout.addWidget(self.currentYValueLabel)
self.currentLayout.addLayout(self.currentYLayout)
+ self.currentWidthLayout = QtGui.QVBoxLayout()
+ self.currentWidthLayout.setSpacing(0)
+ self.currentWidthLayout.setMargin(0)
+ self.currentWidthLayout.setObjectName(u'currentWidthLayout')
+ self.currentWidthLabel = QtGui.QLabel(self.displayGroupBox)
+ self.currentWidthLabel.setAlignment(QtCore.Qt.AlignCenter)
+ self.currentWidthLabel.setObjectName(u'currentWidthLabel')
+ self.currentWidthLayout.addWidget(self.currentWidthLabel)
+ self.currentWidthValueLabel = QtGui.QLabel(self.displayGroupBox)
+ self.currentWidthValueLabel.setAlignment(QtCore.Qt.AlignCenter)
+ self.currentWidthValueLabel.setObjectName(u'currentWidthValueLabel')
+ self.currentWidthLayout.addWidget(self.currentWidthValueLabel)
+ self.currentLayout.addLayout(self.currentWidthLayout)
self.currentHeightLayout = QtGui.QVBoxLayout()
self.currentHeightLayout.setSpacing(0)
self.currentHeightLayout.setMargin(0)
@@ -209,19 +222,6 @@ class GeneralTab(SettingsTab):
self.currentHeightValueLabel.setObjectName(u'Height')
self.currentHeightLayout.addWidget(self.currentHeightValueLabel)
self.currentLayout.addLayout(self.currentHeightLayout)
- self.currentWidthLayout = QtGui.QVBoxLayout()
- self.currentWidthLayout.setSpacing(0)
- self.currentWidthLayout.setMargin(0)
- self.currentWidthLayout.setObjectName(u'currentWidthLayout')
- self.currentWidthLabel = QtGui.QLabel(self.displayGroupBox)
- self.currentWidthLabel.setAlignment(QtCore.Qt.AlignCenter)
- self.currentWidthLabel.setObjectName(u'currentWidthLabel')
- self.currentWidthLayout.addWidget(self.currentWidthLabel)
- self.currentWidthValueLabel = QtGui.QLabel(self.displayGroupBox)
- self.currentWidthValueLabel.setAlignment(QtCore.Qt.AlignCenter)
- self.currentWidthValueLabel.setObjectName(u'currentWidthValueLabel')
- self.currentWidthLayout.addWidget(self.currentWidthValueLabel)
- self.currentLayout.addLayout(self.currentWidthLayout)
self.displayLayout.addLayout(self.currentLayout)
self.overrideCheckBox = QtGui.QCheckBox(self.displayGroupBox)
self.overrideCheckBox.setObjectName(u'overrideCheckBox')
@@ -256,18 +256,6 @@ class GeneralTab(SettingsTab):
self.customYValueEdit.setObjectName(u'customYValueEdit')
self.customYLayout.addWidget(self.customYValueEdit)
self.customLayout.addLayout(self.customYLayout)
- self.customHeightLayout = QtGui.QVBoxLayout()
- self.customHeightLayout.setSpacing(0)
- self.customHeightLayout.setMargin(0)
- self.customHeightLayout.setObjectName(u'customHeightLayout')
- self.customHeightLabel = QtGui.QLabel(self.displayGroupBox)
- self.customHeightLabel.setAlignment(QtCore.Qt.AlignCenter)
- self.customHeightLabel.setObjectName(u'customHeightLabel')
- self.customHeightLayout.addWidget(self.customHeightLabel)
- self.customHeightValueEdit = QtGui.QLineEdit(self.displayGroupBox)
- self.customHeightValueEdit.setObjectName(u'customHeightValueEdit')
- self.customHeightLayout.addWidget(self.customHeightValueEdit)
- self.customLayout.addLayout(self.customHeightLayout)
self.customWidthLayout = QtGui.QVBoxLayout()
self.customWidthLayout.setSpacing(0)
self.customWidthLayout.setMargin(0)
@@ -281,6 +269,18 @@ class GeneralTab(SettingsTab):
self.customWidthValueEdit.setObjectName(u'customWidthValueEdit')
self.customWidthLayout.addWidget(self.customWidthValueEdit)
self.customLayout.addLayout(self.customWidthLayout)
+ self.customHeightLayout = QtGui.QVBoxLayout()
+ self.customHeightLayout.setSpacing(0)
+ self.customHeightLayout.setMargin(0)
+ self.customHeightLayout.setObjectName(u'customHeightLayout')
+ self.customHeightLabel = QtGui.QLabel(self.displayGroupBox)
+ self.customHeightLabel.setAlignment(QtCore.Qt.AlignCenter)
+ self.customHeightLabel.setObjectName(u'customHeightLabel')
+ self.customHeightLayout.addWidget(self.customHeightLabel)
+ self.customHeightValueEdit = QtGui.QLineEdit(self.displayGroupBox)
+ self.customHeightValueEdit.setObjectName(u'customHeightValueEdit')
+ self.customHeightLayout.addWidget(self.customHeightValueEdit)
+ self.customLayout.addLayout(self.customHeightLayout)
self.displayLayout.addLayout(self.customLayout)
# Bottom spacer
self.generalRightSpacer = QtGui.QSpacerItem(20, 40,
@@ -476,7 +476,6 @@ class GeneralTab(SettingsTab):
# Order is important so be careful if you change
if self.overrideChanged or postUpdate:
Receiver.send_message(u'config_screen_changed')
- Receiver.send_message(u'config_updated')
self.overrideChanged = False
def onOverrideCheckBoxToggled(self, checked):
diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py
index 868399f83..e682a3a0f 100644
--- a/openlp/core/ui/maindisplay.py
+++ b/openlp/core/ui/maindisplay.py
@@ -125,6 +125,8 @@ class MainDisplay(DisplayWidget):
self.frame = self.page.mainFrame()
QtCore.QObject.connect(self.webView,
QtCore.SIGNAL(u'loadFinished(bool)'), self.isLoaded)
+ self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
+ self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.frame.setScrollBarPolicy(QtCore.Qt.Vertical,
QtCore.Qt.ScrollBarAlwaysOff)
self.frame.setScrollBarPolicy(QtCore.Qt.Horizontal,
@@ -138,7 +140,7 @@ class MainDisplay(DisplayWidget):
painter_image = QtGui.QPainter()
painter_image.begin(self.black)
painter_image.fillRect(self.black.rect(), QtCore.Qt.black)
- #Build the initial frame.
+ # Build the initial frame.
initialFrame = QtGui.QImage(
self.screens.current[u'size'].width(),
self.screens.current[u'size'].height(),
diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py
index 97f2aebaf..37fe1f329 100644
--- a/openlp/core/ui/settingsform.py
+++ b/openlp/core/ui/settingsform.py
@@ -30,6 +30,7 @@ import logging
from PyQt4 import QtGui
+from openlp.core.lib import Receiver
from openlp.core.ui import AdvancedTab, GeneralTab, ThemesTab
from settingsdialog import Ui_SettingsDialog
@@ -87,6 +88,8 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog):
"""
for tabIndex in range(0, self.settingsTabWidget.count()):
self.settingsTabWidget.widget(tabIndex).save()
+ # Must go after all settings are save
+ Receiver.send_message(u'config_updated')
return QtGui.QDialog.accept(self)
def postSetUp(self):
diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py
index 8399ee1d4..0903c9625 100644
--- a/openlp/plugins/bibles/lib/biblestab.py
+++ b/openlp/plugins/bibles/lib/biblestab.py
@@ -196,10 +196,10 @@ class BiblesTab(SettingsTab):
self.show_new_chapters = True
def onBibleDualCheckBox(self, check_state):
- self.duel_bibles = False
+ self.dual_bibles = False
# we have a set value convert to True/False
if check_state == QtCore.Qt.Checked:
- self.duel_bibles = True
+ self.dual_bibles = True
def load(self):
settings = QtCore.QSettings()
@@ -212,12 +212,12 @@ class BiblesTab(SettingsTab):
u'verse layout style', QtCore.QVariant(0)).toInt()[0]
self.bible_theme = unicode(
settings.value(u'bible theme', QtCore.QVariant(u'')).toString())
- self.duel_bibles = settings.value(
+ self.dual_bibles = settings.value(
u'dual bibles', QtCore.QVariant(True)).toBool()
self.NewChaptersCheckBox.setChecked(self.show_new_chapters)
self.DisplayStyleComboBox.setCurrentIndex(self.display_style)
self.LayoutStyleComboBox.setCurrentIndex(self.layout_style)
- self.BibleDualCheckBox.setChecked(self.duel_bibles)
+ self.BibleDualCheckBox.setChecked(self.dual_bibles)
settings.endGroup()
def save(self):
@@ -229,7 +229,7 @@ class BiblesTab(SettingsTab):
QtCore.QVariant(self.display_style))
settings.setValue(u'verse layout style',
QtCore.QVariant(self.layout_style))
- settings.setValue(u'dual bibles', QtCore.QVariant(self.duel_bibles))
+ settings.setValue(u'dual bibles', QtCore.QVariant(self.dual_bibles))
settings.setValue(u'bible theme', QtCore.QVariant(self.bible_theme))
settings.endGroup()
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index ac0febb82..d1189282b 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -273,8 +273,9 @@ class BibleMediaItem(MediaManagerItem):
self.SearchProgress.setObjectName(u'SearchProgress')
def configUpdated(self):
+ log.debug(u'configUpdated')
if QtCore.QSettings().value(self.settingsSection + u'/dual bibles',
- QtCore.QVariant(False)).toBool():
+ QtCore.QVariant(True)).toBool():
self.AdvancedSecondBibleLabel.setVisible(True)
self.AdvancedSecondBibleComboBox.setVisible(True)
self.QuickSecondVersionLabel.setVisible(True)
diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py
index d8557b5e2..84a310cb9 100644
--- a/openlp/plugins/custom/forms/editcustomdialog.py
+++ b/openlp/plugins/custom/forms/editcustomdialog.py
@@ -26,8 +26,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import build_icon, translate
-from openlp.core.ui import SpellTextEdit
+from openlp.core.lib import build_icon, translate, SpellTextEdit
class Ui_CustomEditDialog(object):
def setupUi(self, customEditDialog):
diff --git a/openlp/plugins/songs/forms/editversedialog.py b/openlp/plugins/songs/forms/editversedialog.py
index 64d56322f..43dc8b96d 100644
--- a/openlp/plugins/songs/forms/editversedialog.py
+++ b/openlp/plugins/songs/forms/editversedialog.py
@@ -26,8 +26,7 @@
from PyQt4 import QtCore, QtGui
-from openlp.core.lib import build_icon, translate
-from openlp.core.ui import SpellTextEdit
+from openlp.core.lib import build_icon, translate, SpellTextEdit
from openlp.plugins.songs.lib import VerseType
class Ui_EditVerseDialog(object):
diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py
index 9299669a6..8197d6ec4 100644
--- a/openlp/plugins/songs/lib/mediaitem.py
+++ b/openlp/plugins/songs/lib/mediaitem.py
@@ -357,16 +357,13 @@ class SongMediaItem(MediaManagerItem):
author_list = author_list + u', '
author_list = author_list + unicode(author.display_name)
author_audit.append(unicode(author.display_name))
- if song.ccli_number is None or len(song.ccli_number) == 0:
- ccli = QtCore.QSettings().value(u'general/ccli number',
- QtCore.QVariant(u'')).toString()
- else:
- ccli = unicode(song.ccli_number)
raw_footer.append(song.title)
raw_footer.append(author_list)
raw_footer.append(song.copyright )
raw_footer.append(unicode(
- translate('SongsPlugin.MediaItem', 'CCLI Licence: ') + ccli))
+ translate('SongsPlugin.MediaItem', 'CCLI Licence: ') +
+ QtCore.QSettings().value(u'general/ccli number',
+ QtCore.QVariant(u'')).toString()))
service_item.raw_footer = raw_footer
service_item.audit = [
song.title, author_audit, song.copyright, unicode(song.ccli_number)
diff --git a/openlp/plugins/songs/lib/oooimport.py b/openlp/plugins/songs/lib/oooimport.py
index 76b4b6c0d..e8c723c0e 100644
--- a/openlp/plugins/songs/lib/oooimport.py
+++ b/openlp/plugins/songs/lib/oooimport.py
@@ -28,6 +28,7 @@ import os
from PyQt4 import QtCore
+from openlp.core.lib import Receiver
from songimport import SongImport
if os.name == u'nt':
@@ -43,23 +44,32 @@ else:
except ImportError:
pass
-class OooImport(object):
+class OooImport(SongImport):
"""
Import songs from Impress/Powerpoint docs using Impress
"""
- def __init__(self, songmanager):
+ def __init__(self, master_manager, **kwargs):
"""
Initialise the class. Requires a songmanager class which is passed
to SongImport for writing song to disk
"""
+ SongImport.__init__(self, master_manager)
self.song = None
- self.manager = songmanager
+ self.master_manager = master_manager
self.document = None
self.process_started = False
+ self.filenames = kwargs[u'filenames']
+ QtCore.QObject.connect(Receiver.get_receiver(),
+ QtCore.SIGNAL(u'song_stop_import'), self.stop_import)
- def import_docs(self, filenames):
+ def do_import(self):
+ self.abort = False
+ self.import_wizard.importProgressBar.setMaximum(0)
self.start_ooo()
- for filename in filenames:
+ for filename in self.filenames:
+ if self.abort:
+ self.import_wizard.incrementProgressBar(u'Import cancelled', 0)
+ return
filename = unicode(filename)
if os.path.isfile(filename):
self.open_ooo_file(filename)
@@ -72,6 +82,12 @@ class OooImport(object):
self.process_doc()
self.close_ooo_file()
self.close_ooo()
+ self.import_wizard.importProgressBar.setMaximum(1)
+ self.import_wizard.incrementProgressBar(u'', 1)
+ return True
+
+ def stop_import(self):
+ self.abort = True
def start_ooo(self):
"""
@@ -135,6 +151,9 @@ class OooImport(object):
"com.sun.star.presentation.PresentationDocument") and not \
self.document.supportsService("com.sun.star.text.TextDocument"):
self.close_ooo_file()
+ else:
+ self.import_wizard.incrementProgressBar(
+ u'Processing file ' + filepath, 0)
except:
pass
return
@@ -161,6 +180,9 @@ class OooImport(object):
slides = doc.getDrawPages()
text = u''
for slide_no in range(slides.getCount()):
+ if self.abort:
+ self.import_wizard.incrementProgressBar(u'Import cancelled', 0)
+ return
slide = slides.getByIndex(slide_no)
slidetext = u''
for idx in range(slide.getCount()):
diff --git a/openlp/plugins/songs/lib/sofimport.py b/openlp/plugins/songs/lib/sofimport.py
index 54cfd07ac..ab91e1923 100644
--- a/openlp/plugins/songs/lib/sofimport.py
+++ b/openlp/plugins/songs/lib/sofimport.py
@@ -68,19 +68,30 @@ class SofImport(OooImport):
It attempts to detect italiced verses, and treats these as choruses in
the verse ordering. Again not perfect, but a start.
"""
- def __init__(self, songmanager):
+ def __init__(self, master_manager, **kwargs):
"""
Initialise the class. Requires a songmanager class which is passed
to SongImport for writing song to disk
"""
- OooImport.__init__(self, songmanager)
+ OooImport.__init__(self, master_manager, **kwargs)
- def import_sof(self, filename):
+ def do_import(self):
+ self.abort = False
self.start_ooo()
- self.open_ooo_file(filename)
- self.process_sof_file()
- self.close_ooo_file()
+ for filename in self.filenames:
+ if self.abort:
+ self.import_wizard.incrementProgressBar(u'Import cancelled', 0)
+ return
+ filename = unicode(filename)
+ if os.path.isfile(filename):
+ self.open_ooo_file(filename)
+ if self.document:
+ self.process_sof_file()
+ self.close_ooo_file()
self.close_ooo()
+ self.import_wizard.importProgressBar.setMaximum(1)
+ self.import_wizard.incrementProgressBar(u'', 1)
+ return True
def process_sof_file(self):
"""
@@ -90,6 +101,9 @@ class SofImport(OooImport):
self.new_song()
paragraphs = self.document.getText().createEnumeration()
while paragraphs.hasMoreElements():
+ if self.abort:
+ self.import_wizard.incrementProgressBar(u'Import cancelled', 0)
+ return
paragraph = paragraphs.nextElement()
if paragraph.supportsService("com.sun.star.text.Paragraph"):
self.process_paragraph(paragraph)
@@ -244,6 +258,7 @@ class SofImport(OooImport):
if title.endswith(u','):
title = title[:-1]
self.song.title = title
+ self.import_wizard.incrementProgressBar(u'Processing song ' + title, 0)
def add_author(self, text):
"""
diff --git a/openlp/plugins/songs/lib/songimport.py b/openlp/plugins/songs/lib/songimport.py
index bf5079c8c..17000a2ba 100644
--- a/openlp/plugins/songs/lib/songimport.py
+++ b/openlp/plugins/songs/lib/songimport.py
@@ -129,13 +129,13 @@ class SongImport(QtCore.QObject):
def process_verse_text(self, text):
lines = text.split(u'\n')
- if text.lower().find(COPYRIGHT_STRING) >= 0 \
- or text.lower().find(COPYRIGHT_SYMBOL) >= 0:
+ if text.lower().find(self.copyright_string) >= 0 \
+ or text.lower().find(self.copyright_symbol) >= 0:
copyright_found = False
for line in lines:
if (copyright_found or
- line.lower().find(COPYRIGHT_STRING) >= 0 or
- line.lower().find(COPYRIGHT_SYMBOL) >= 0):
+ line.lower().find(self.copyright_string) >= 0 or
+ line.lower().find(self.copyright_symbol) >= 0):
copyright_found = True
self.add_copyright(line)
else:
@@ -300,7 +300,7 @@ class SongImport(QtCore.QObject):
topic = Topic.populate(name=topictext)
song.topics.append(topic)
self.manager.save_object(song)
- self.setDefaults()
+ self.set_defaults()
def print_song(self):
"""