This commit is contained in:
Tim Bentley 2010-06-21 17:21:00 +01:00
commit b08707cc80
16 changed files with 167 additions and 145 deletions

View File

@ -208,40 +208,40 @@ class MediaManagerItem(QtGui.QWidget):
## Import Button ## ## Import Button ##
if self.hasImportIcon: if self.hasImportIcon:
self.addToolbarButton( self.addToolbarButton(
unicode(translate('MediaManagerItem', 'Import %s')) % \ unicode(translate('MediaManagerItem', 'Import %s')) %
self.PluginNameShort, self.PluginNameShort,
unicode(translate('MediaManagerItem', 'Import a %s')) % \ unicode(translate('MediaManagerItem', 'Import a %s')) %
self.PluginNameVisible, self.PluginNameVisible,
u':/general/general_import.png', self.onImportClick) u':/general/general_import.png', self.onImportClick)
## File Button ## ## File Button ##
if self.hasFileIcon: if self.hasFileIcon:
self.addToolbarButton( self.addToolbarButton(
unicode(translate('MediaManagerItem', 'Load %s')) % \ unicode(translate('MediaManagerItem', 'Load %s')) %
self.PluginNameShort, self.PluginNameShort,
unicode(translate('MediaManagerItem', 'Load a new %s')) % \ unicode(translate('MediaManagerItem', 'Load a new %s')) %
self.PluginNameVisible, self.PluginNameVisible,
u':/general/general_open.png', self.onFileClick) u':/general/general_open.png', self.onFileClick)
## New Button ## ## New Button ##
if self.hasNewIcon: if self.hasNewIcon:
self.addToolbarButton( self.addToolbarButton(
unicode(translate('MediaManagerItem', 'New %s')) % \ unicode(translate('MediaManagerItem', 'New %s')) %
self.PluginNameShort, self.PluginNameShort,
unicode(translate('MediaManagerItem', 'Add a new %s')) % \ unicode(translate('MediaManagerItem', 'Add a new %s')) %
self.PluginNameVisible, self.PluginNameVisible,
u':/general/general_new.png', self.onNewClick) u':/general/general_new.png', self.onNewClick)
## Edit Button ## ## Edit Button ##
if self.hasEditIcon: if self.hasEditIcon:
self.addToolbarButton( self.addToolbarButton(
unicode(translate('MediaManagerItem', 'Edit %s')) % \ unicode(translate('MediaManagerItem', 'Edit %s')) %
self.PluginNameShort, self.PluginNameShort,
unicode(translate( unicode(translate(
'MediaManagerItem', 'Edit the selected %s')) % \ 'MediaManagerItem', 'Edit the selected %s')) %
self.PluginNameVisible, self.PluginNameVisible,
u':/general/general_edit.png', self.onEditClick) u':/general/general_edit.png', self.onEditClick)
## Delete Button ## ## Delete Button ##
if self.hasDeleteIcon: if self.hasDeleteIcon:
self.addToolbarButton( self.addToolbarButton(
unicode(translate('MediaManagerItem', 'Delete %s')) % \ unicode(translate('MediaManagerItem', 'Delete %s')) %
self.PluginNameShort, self.PluginNameShort,
translate('MediaManagerItem', 'Delete the selected item'), translate('MediaManagerItem', 'Delete the selected item'),
u':/general/general_delete.png', self.onDeleteClick) u':/general/general_delete.png', self.onDeleteClick)
@ -249,7 +249,7 @@ class MediaManagerItem(QtGui.QWidget):
self.addToolbarSeparator() self.addToolbarSeparator()
## Preview ## ## Preview ##
self.addToolbarButton( self.addToolbarButton(
unicode(translate('MediaManagerItem', 'Preview %s')) % \ unicode(translate('MediaManagerItem', 'Preview %s')) %
self.PluginNameShort, self.PluginNameShort,
translate('MediaManagerItem', 'Preview the selected item'), translate('MediaManagerItem', 'Preview the selected item'),
u':/general/general_preview.png', self.onPreviewClick) u':/general/general_preview.png', self.onPreviewClick)
@ -260,7 +260,7 @@ class MediaManagerItem(QtGui.QWidget):
u':/general/general_live.png', self.onLiveClick) u':/general/general_live.png', self.onLiveClick)
## Add to service Button ## ## Add to service Button ##
self.addToolbarButton( self.addToolbarButton(
unicode(translate('MediaManagerItem', 'Add %s to Service')) % \ unicode(translate('MediaManagerItem', 'Add %s to Service')) %
self.PluginNameShort, self.PluginNameShort,
translate('MediaManagerItem', translate('MediaManagerItem',
'Add the selected item(s) to the service'), 'Add the selected item(s) to the service'),
@ -285,7 +285,7 @@ class MediaManagerItem(QtGui.QWidget):
self.ListView.addAction( self.ListView.addAction(
context_menu_action( context_menu_action(
self.ListView, u':/general/general_edit.png', self.ListView, u':/general/general_edit.png',
unicode(translate('MediaManagerItem', '&Edit %s')) % \ unicode(translate('MediaManagerItem', '&Edit %s')) %
self.PluginNameVisible, self.PluginNameVisible,
self.onEditClick)) self.onEditClick))
self.ListView.addAction(context_menu_separator(self.ListView)) self.ListView.addAction(context_menu_separator(self.ListView))
@ -293,14 +293,14 @@ class MediaManagerItem(QtGui.QWidget):
self.ListView.addAction( self.ListView.addAction(
context_menu_action( context_menu_action(
self.ListView, u':/general/general_delete.png', self.ListView, u':/general/general_delete.png',
unicode(translate('MediaManagerItem', '&Delete %s')) % \ unicode(translate('MediaManagerItem', '&Delete %s')) %
self.PluginNameVisible, self.PluginNameVisible,
self.onDeleteClick)) self.onDeleteClick))
self.ListView.addAction(context_menu_separator(self.ListView)) self.ListView.addAction(context_menu_separator(self.ListView))
self.ListView.addAction( self.ListView.addAction(
context_menu_action( context_menu_action(
self.ListView, u':/general/general_preview.png', self.ListView, u':/general/general_preview.png',
unicode(translate('MediaManagerItem', '&Preview %s')) % \ unicode(translate('MediaManagerItem', '&Preview %s')) %
self.PluginNameVisible, self.PluginNameVisible,
self.onPreviewClick)) self.onPreviewClick))
self.ListView.addAction( self.ListView.addAction(

View File

@ -90,7 +90,7 @@ class ServiceItem(object):
self.from_plugin = False self.from_plugin = False
self.capabilities = [] self.capabilities = []
self.is_valid = True self.is_valid = True
self.cache = [] self.cache = {}
self.icon = None self.icon = None
def add_capability(self, capability): def add_capability(self, capability):
@ -129,7 +129,7 @@ class ServiceItem(object):
""" """
log.debug(u'Render called') log.debug(u'Render called')
self._display_frames = [] self._display_frames = []
self.cache = [] self.clear_cache()
if self.service_item_type == ServiceItemType.Text: if self.service_item_type == ServiceItemType.Text:
log.debug(u'Formatting slides') log.debug(u'Formatting slides')
if self.theme is None: if self.theme is None:
@ -149,7 +149,8 @@ class ServiceItem(object):
self._display_frames.append({u'title': title, self._display_frames.append({u'title': title,
u'text': lines.rstrip(), u'text': lines.rstrip(),
u'verseTag': slide[u'verseTag'] }) u'verseTag': slide[u'verseTag'] })
self.cache.insert(len(self._display_frames), None) if len(self._display_frames) in self.cache.keys():
del self.cache[len(self._display_frames)]
log.log(15, u'Formatting took %4s' % (time.time() - before)) log.log(15, u'Formatting took %4s' % (time.time() - before))
elif self.service_item_type == ServiceItemType.Image: elif self.service_item_type == ServiceItemType.Image:
for slide in self._raw_frames: for slide in self._raw_frames:
@ -172,8 +173,7 @@ class ServiceItem(object):
else: else:
self.render_manager.set_override_theme(self.theme) self.render_manager.set_override_theme(self.theme)
format = self._display_frames[row][u'text'].split(u'\n') format = self._display_frames[row][u'text'].split(u'\n')
#if screen blank then do not display footer if self.cache.get(row):
if len(self.cache) > 0 and self.cache[row] is not None:
frame = self.cache[row] frame = self.cache[row]
else: else:
if format[0]: if format[0]:
@ -385,3 +385,8 @@ class ServiceItem(object):
""" """
return self._raw_frames[row][u'path'] return self._raw_frames[row][u'path']
def clear_cache(self):
"""
Clear's the service item's cache.
"""
self.cache = {}

View File

@ -339,7 +339,8 @@ class ThemeXML(object):
""" """
Pull out the XML string formatted for human consumption Pull out the XML string formatted for human consumption
""" """
return self.theme_xml.toprettyxml(indent=u' ', newl=u'\n', encoding=u'utf-8') return self.theme_xml.toprettyxml(indent=u' ', newl=u'\n',
encoding=u'utf-8')
def parse(self, xml): def parse(self, xml):
""" """
@ -364,7 +365,8 @@ class ThemeXML(object):
``xml`` ``xml``
The XML string to parse. The XML string to parse.
""" """
theme_xml = ElementTree(element=XML(xml.encode(u'ascii', u'xmlcharrefreplace'))) theme_xml = ElementTree(element=XML(xml.encode(u'ascii',
u'xmlcharrefreplace')))
xml_iter = theme_xml.getiterator() xml_iter = theme_xml.getiterator()
master = u'' master = u''
for element in xml_iter: for element in xml_iter:

View File

@ -175,7 +175,8 @@ class Theme(object):
``xml`` ``xml``
The data to apply to the theme The data to apply to the theme
""" """
root = ElementTree(element=XML(xml.encode(u'ascii', u'xmlcharrefreplace'))) root = ElementTree(element=XML(xml.encode(u'ascii',
u'xmlcharrefreplace')))
xml_iter = root.getiterator() xml_iter = root.getiterator()
for element in xml_iter: for element in xml_iter:
delphi_color_change = False delphi_color_change = False

View File

@ -30,6 +30,7 @@ import os.path
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import ThemeXML, translate from openlp.core.lib import ThemeXML, translate
from openlp.core.utils import get_images_filter
from amendthemedialog import Ui_AmendThemeDialog from amendthemedialog import Ui_AmendThemeDialog
log = logging.getLogger(u'AmendThemeForm') log = logging.getLogger(u'AmendThemeForm')
@ -209,8 +210,11 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
self.previewTheme() self.previewTheme()
def onImageToolButtonClicked(self): def onImageToolButtonClicked(self):
filename = unicode(QtGui.QFileDialog.getOpenFileName( images_filter = get_images_filter()
self, translate('AmendThemeForm', 'Open File'))) images_filter = '%s;;%s (*.*) (*)' % (images_filter,
translate('AmendThemeForm', 'All Files'))
filename = QtGui.QFileDialog.getOpenFileName(self,
translate('AmendThemeForm', 'Select Image'), u'', images_filter)
if filename: if filename:
self.ImageLineEdit.setText(filename) self.ImageLineEdit.setText(filename)
self.theme.background_filename = filename self.theme.background_filename = filename

View File

@ -661,8 +661,7 @@ class ServiceManager(QtGui.QWidget):
filename = unicode(filename) filename = unicode(filename)
name = filename.split(os.path.sep) name = filename.split(os.path.sep)
if filename: if filename:
SettingsManager.set_last_dir( SettingsManager.set_last_dir(self.parent.serviceSettingsSection,
self.parent.serviceSettingsSection,
os.path.split(filename)[0]) os.path.split(filename)[0])
zip = None zip = None
file_to = None file_to = None
@ -677,7 +676,7 @@ class ServiceManager(QtGui.QWidget):
translate('ServiceManager', translate('ServiceManager',
'File is not a valid service.\n' 'File is not a valid service.\n'
'The content encoding is not UTF-8.')) 'The content encoding is not UTF-8.'))
log.exception(u'Filename "%s" is not valid UTF-8' % \ log.exception(u'Filename "%s" is not valid UTF-8' %
file.decode(u'utf-8', u'replace')) file.decode(u'utf-8', u'replace'))
continue continue
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile)) osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
@ -697,7 +696,7 @@ class ServiceManager(QtGui.QWidget):
self.onNewService() self.onNewService()
for item in items: for item in items:
serviceitem = ServiceItem() serviceitem = ServiceItem()
serviceitem.RenderManager = self.parent.RenderManager serviceitem.render_manager = self.parent.RenderManager
serviceitem.set_from_service(item, self.servicePath) serviceitem.set_from_service(item, self.servicePath)
self.validateItem(serviceitem) self.validateItem(serviceitem)
self.addServiceItem(serviceitem) self.addServiceItem(serviceitem)

View File

@ -537,7 +537,7 @@ class SlideController(QtGui.QWidget):
before = time.time() before = time.time()
#Clear the old serviceItem cache to release memory #Clear the old serviceItem cache to release memory
if self.serviceItem and self.serviceItem is not serviceItem: if self.serviceItem and self.serviceItem is not serviceItem:
self.serviceItem.cache = [] self.serviceItem.clear_cache()
self.serviceItem = serviceItem self.serviceItem = serviceItem
self.PreviewListWidget.clear() self.PreviewListWidget.clear()
self.PreviewListWidget.setRowCount(0) self.PreviewListWidget.setRowCount(0)

View File

@ -398,7 +398,7 @@ class ThemeManager(QtGui.QWidget):
self, translate('ThemeManager', 'Error'), self, translate('ThemeManager', 'Error'),
translate('ThemeManager', 'File is not a valid theme.\n' translate('ThemeManager', 'File is not a valid theme.\n'
'The content encoding is not UTF-8.')) 'The content encoding is not UTF-8.'))
log.exception(u'Filename "%s" is not valid UTF-8' % \ log.exception(u'Filename "%s" is not valid UTF-8' %
file.decode(u'utf-8', u'replace')) file.decode(u'utf-8', u'replace'))
continue continue
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile)) osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
@ -424,8 +424,8 @@ class ThemeManager(QtGui.QWidget):
xml_data = xml_data.decode(u'utf-8') xml_data = xml_data.decode(u'utf-8')
except UnicodeDecodeError: except UnicodeDecodeError:
log.exception(u'Theme XML is not UTF-8 ' log.exception(u'Theme XML is not UTF-8 '
'encoded.') u'encoded.')
break; break
if self.checkVersion1(xml_data): if self.checkVersion1(xml_data):
# upgrade theme xml # upgrade theme xml
filexml = self.migrateVersion122(xml_data) filexml = self.migrateVersion122(xml_data)

View File

@ -30,17 +30,20 @@ import os
import sys import sys
import logging import logging
import urllib2 import urllib2
from datetime import datetime from datetime import datetime
from PyQt4 import QtCore
from PyQt4 import QtGui, QtCore
import openlp import openlp
from openlp.core.lib import translate
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
images_filter = None
class AppLocation(object): class AppLocation(object):
""" """
Retrieve a directory based on the directory type. The :class:`AppLocation` class is a static class which retrieves a
directory based on the directory type.
""" """
AppDir = 1 AppDir = 1
ConfigDir = 2 ConfigDir = 2
@ -176,6 +179,22 @@ def get_filesystem_encoding():
encoding = sys.getdefaultencoding() encoding = sys.getdefaultencoding()
return encoding return encoding
def get_images_filter():
"""
Returns a filter string for a file dialog containing all the supported
image formats.
"""
global images_filter
if not images_filter:
log.debug(u'Generating images filter.')
formats = [unicode(fmt)
for fmt in QtGui.QImageReader.supportedImageFormats()]
visible_formats = u'(*.%s)' % u'; *.'.join(formats)
actual_formats = u'(*.%s)' % u' *.'.join(formats)
images_filter = u'%s %s %s' % (translate('OpenLP', 'Image Files'),
visible_formats, actual_formats)
return images_filter
from languagemanager import LanguageManager from languagemanager import LanguageManager
__all__ = [u'AppLocation', u'check_latest_version', u'add_actions', __all__ = [u'AppLocation', u'check_latest_version', u'add_actions',

View File

@ -294,5 +294,5 @@ class AlertsTab(SettingsTab):
font.setBold(True) font.setBold(True)
font.setPointSize(self.font_size) font.setPointSize(self.font_size)
self.FontPreview.setFont(font) self.FontPreview.setFont(font)
self.FontPreview.setStyleSheet(u'background-color: %s; color: %s' % \ self.FontPreview.setStyleSheet(u'background-color: %s; color: %s' %
(self.bg_color, self.font_color)) (self.bg_color, self.font_color))

View File

@ -30,7 +30,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \ from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
context_menu_action, ItemCapabilities, SettingsManager, translate context_menu_action, ItemCapabilities, SettingsManager, translate
from openlp.core.utils import AppLocation from openlp.core.utils import AppLocation, get_images_filter
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -61,12 +61,9 @@ class ImageMediaItem(MediaManagerItem):
def retranslateUi(self): def retranslateUi(self):
self.OnNewPrompt = translate('ImagePlugin.MediaItem', self.OnNewPrompt = translate('ImagePlugin.MediaItem',
'Select Image(s)') 'Select Image(s)')
file_formats = u'' file_formats = get_images_filter()
for file_format in QtGui.QImageReader.supportedImageFormats(): self.OnNewFileMasks = u'%s;;%s (*.*) (*)' % (file_formats,
file_formats += u'*.%s ' % file_format unicode(translate('ImagePlugin.MediaItem', 'All Files')))
self.OnNewFileMasks = unicode(
translate('ImagePlugin.MediaItem',
'Images (%s);; All files (*)')) % file_formats
def requiredIcons(self): def requiredIcons(self):
MediaManagerItem.requiredIcons(self) MediaManagerItem.requiredIcons(self)

View File

@ -384,9 +384,6 @@ class Ui_EditSongDialog(object):
self.CommentsLayout.addWidget(self.CommentsEdit) self.CommentsLayout.addWidget(self.CommentsEdit)
self.ThemeCopyCommentsLayout.addWidget(self.CommentsGroupBox) self.ThemeCopyCommentsLayout.addWidget(self.CommentsGroupBox)
self.ThemeTabLayout.addWidget(self.ThemeCopyCommentsWidget) self.ThemeTabLayout.addWidget(self.ThemeCopyCommentsWidget)
spacerItem5 = QtGui.QSpacerItem(20, 40,
QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding)
self.ThemeTabLayout.addItem(spacerItem5)
self.SongTabWidget.addTab(self.ThemeTab, u'') self.SongTabWidget.addTab(self.ThemeTab, u'')
self.verticalLayout.addWidget(self.SongTabWidget) self.verticalLayout.addWidget(self.SongTabWidget)
self.ButtonBox = QtGui.QDialogButtonBox(EditSongDialog) self.ButtonBox = QtGui.QDialogButtonBox(EditSongDialog)

View File

@ -30,6 +30,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate
from openlp.plugins.songs.forms import EditVerseForm from openlp.plugins.songs.forms import EditVerseForm
from openlp.plugins.songs.lib import VerseType
from openlp.plugins.songs.lib.models import Song, Author, Topic, Book from openlp.plugins.songs.lib.models import Song, Author, Topic, Book
from editsongdialog import Ui_EditSongDialog from editsongdialog import Ui_EditSongDialog
@ -90,16 +91,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.parent.parent.render_manager.theme_manager.onAddTheme) self.parent.parent.render_manager.theme_manager.onAddTheme)
QtCore.QObject.connect(self.MaintenanceButton, QtCore.QObject.connect(self.MaintenanceButton,
QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked) QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked)
QtCore.QObject.connect(self.TitleEditItem,
QtCore.SIGNAL(u'editingFinished()'), self.onTitleEditItemLostFocus)
QtCore.QObject.connect(self.CCLNumberEdit,
QtCore.SIGNAL(u'lostFocus()'), self.onCCLNumberEditLostFocus)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'theme_update_list'), self.loadThemes) QtCore.SIGNAL(u'theme_update_list'), self.loadThemes)
QtCore.QObject.connect(self.CommentsEdit,
QtCore.SIGNAL(u'lostFocus()'), self.onCommentsEditLostFocus)
QtCore.QObject.connect(self.VerseOrderEdit,
QtCore.SIGNAL(u'lostFocus()'), self.onVerseOrderEditLostFocus)
self.previewButton = QtGui.QPushButton() self.previewButton = QtGui.QPushButton()
self.previewButton.setObjectName(u'previewButton') self.previewButton.setObjectName(u'previewButton')
self.previewButton.setText( self.previewButton.setText(
@ -247,7 +240,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.VerseListWidget.setRowCount( self.VerseListWidget.setRowCount(
self.VerseListWidget.rowCount() + 1) self.VerseListWidget.rowCount() + 1)
item = QtGui.QTableWidgetItem(verse) item = QtGui.QTableWidgetItem(verse)
variant = u'Verse:%s' % unicode(count + 1) variant = u'%s:%s' % \
(VerseType.to_string(VerseType.Verse), unicode(count + 1))
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(variant)) item.setData(QtCore.Qt.UserRole, QtCore.QVariant(variant))
self.VerseListWidget.setItem(count, 0, item) self.VerseListWidget.setItem(count, 0, item)
self.VerseListWidget.resizeRowsToContents() self.VerseListWidget.resizeRowsToContents()
@ -264,7 +258,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
topic_name = QtGui.QListWidgetItem(unicode(topic.name)) topic_name = QtGui.QListWidgetItem(unicode(topic.name))
topic_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(topic.id)) topic_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(topic.id))
self.TopicsListView.addItem(topic_name) self.TopicsListView.addItem(topic_name)
self._validate_song()
self.TitleEditItem.setFocus(QtCore.Qt.OtherFocusReason) self.TitleEditItem.setFocus(QtCore.Qt.OtherFocusReason)
#if not preview hide the preview button #if not preview hide the preview button
self.previewButton.setVisible(False) self.previewButton.setVisible(False)
@ -522,42 +515,75 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
if len(self.TitleEditItem.displayText()) == 0: if len(self.TitleEditItem.displayText()) == 0:
self.SongTabWidget.setCurrentIndex(0) self.SongTabWidget.setCurrentIndex(0)
self.TitleEditItem.setFocus() self.TitleEditItem.setFocus()
return False, translate(u'SongsPlugin.EditSongForm', QtGui.QMessageBox.critical(self,
u'You need to enter a song title.') translate(u'SongsPlugin.EditSongForm', u'Error'),
translate(u'SongsPlugin.EditSongForm',
u'You need to enter a song title.'))
return False
if self.VerseListWidget.rowCount() == 0: if self.VerseListWidget.rowCount() == 0:
self.SongTabWidget.setCurrentIndex(0) self.SongTabWidget.setCurrentIndex(0)
self.VerseListWidget.setFocus() self.VerseListWidget.setFocus()
return False, translate(u'SongsPlugin.EditSongForm', QtGui.QMessageBox.critical(self,
u'You need to enter some verses.') translate(u'SongsPlugin.EditSongForm', u'Error'),
translate('uSongsPlugin.EditSongForm',
u'You need to enter some verses.'))
return False
if self.AuthorsListView.count() == 0: if self.AuthorsListView.count() == 0:
self.SongTabWidget.setCurrentIndex(1) self.SongTabWidget.setCurrentIndex(1)
self.AuthorsListView.setFocus() self.AuthorsListView.setFocus()
#split the verse list by space and mark lower case for testing answer = QtGui.QMessageBox.warning(self,
taglist = unicode(translate(u'SongsPlugin.EditSongForm', u' bitpeovc')) translate(u'SongsPlugin.EditSongForm', u'Warning'),
for verse in unicode(self.VerseOrderEdit.text()).lower().split(u' '): translate('SongsPlugin.EditSongForm',
if len(verse) > 1: 'You have set no author.\n'
if taglist.find(verse[0:1]) > -1 \ 'Do you want to add now a author?'),
and verse[1:].isdigit(): QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
pass if answer == QtGui.QMessageBox.Yes:
return False
if self.song.verse_order:
order = []
order_names = self.song.verse_order.split(u' ')
for item in order_names:
if len(item) == 1:
order.append(item.lower() + u'1')
else: else:
order.append(item.lower())
verses = []
verse_names = []
for index in range (0, self.VerseListWidget.rowCount()):
verse = self.VerseListWidget.item(index, 0)
verse = unicode(verse.data(QtCore.Qt.UserRole).toString())
if verse not in verse_names:
verses.append(
re.sub(r'(.)[^:]*:(.*)', r'\1\2', verse.lower()))
verse_names.append(verse)
for count, item in enumerate(order):
if item not in verses:
self.SongTabWidget.setCurrentIndex(0) self.SongTabWidget.setCurrentIndex(0)
self.VerseOrderEdit.setFocus() self.VerseOrderEdit.setFocus()
return False, translate(u'SongsPlugin.EditSongForm', valid = verses.pop(0)
u'Invalid verse entry, values must be I,B,T,P,E,O,V,C ' for verse in verses:
u'followed by a number') valid = valid + u', ' + verse
return True, u'' QtGui.QMessageBox.critical(self,
translate(u'SongsPlugin.EditSongForm', u'Error'),
def onTitleEditItemLostFocus(self): unicode(translate('SongsPlugin.EditSongForm',
self.song.title = unicode(self.TitleEditItem.text()) 'The verse order is invalid. There is no verse '
'corresponding to %s. Valid entries are %s.')) % \
def onVerseOrderEditLostFocus(self): (order_names[count], valid))
self.song.verse_order = unicode(self.VerseOrderEdit.text()) return False
for count, verse in enumerate(verses):
def onCommentsEditLostFocus(self): if verse not in order:
self.song.comments = unicode(self.CommentsEdit.text()) self.SongTabWidget.setCurrentIndex(0)
self.VerseOrderEdit.setFocus()
def onCCLNumberEditLostFocus(self): answer = QtGui.QMessageBox.warning(self,
self.song.ccli_number = self.CCLNumberEdit.text() translate(u'SongsPlugin.EditSongForm', u'Warning'),
unicode(translate('SongsPlugin.EditSongForm',
'%s is not addressed in the verse order.\n'
'Do you want to save anyhow?')) % \
verse_names[count].replace(u':', u' '),
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
if answer == QtGui.QMessageBox.No:
return False
return True
def onCopyrightInsertButtonTriggered(self): def onCopyrightInsertButtonTriggered(self):
text = self.CopyrightEditItem.text() text = self.CopyrightEditItem.text()
@ -593,23 +619,19 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.close() self.close()
def saveSong(self): def saveSong(self):
valid, message = self._validate_song()
if not valid:
QtGui.QMessageBox.critical(
self, translate(u'SongsPlugin.EditSongForm', u'Error'), message,
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok))
return False
self.song.title = unicode(self.TitleEditItem.text()) self.song.title = unicode(self.TitleEditItem.text())
self.song.copyright = unicode(self.CopyrightEditItem.text()) self.song.copyright = unicode(self.CopyrightEditItem.text())
self.song.search_title = unicode(self.TitleEditItem.text()) + \ self.song.search_title = self.song.title + u'@' + \
u'@'+ unicode(self.AlternativeEdit.text()) unicode(self.AlternativeEdit.text())
self.song.comments = unicode(self.CommentsEdit.toPlainText()) self.song.comments = unicode(self.CommentsEdit.toPlainText())
self.song.verse_order = unicode(self.VerseOrderEdit.text()) self.song.verse_order = unicode(self.VerseOrderEdit.text())
self.song.ccli_number = unicode(self.CCLNumberEdit.text()) self.song.ccli_number = unicode(self.CCLNumberEdit.text())
if self._validate_song():
self.processLyrics() self.processLyrics()
self.processTitle() self.processTitle()
self.songmanager.save_song(self.song) self.songmanager.save_song(self.song)
return True return True
return False
def processLyrics(self): def processLyrics(self):
log.debug(u'processLyrics') log.debug(u'processLyrics')
@ -617,41 +639,29 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
sxml = SongXMLBuilder() sxml = SongXMLBuilder()
sxml.new_document() sxml.new_document()
sxml.add_lyrics_to_song() sxml.add_lyrics_to_song()
text = u' ' text = u''
multiple = []
for i in range (0, self.VerseListWidget.rowCount()): for i in range (0, self.VerseListWidget.rowCount()):
item = self.VerseListWidget.item(i, 0) item = self.VerseListWidget.item(i, 0)
verseId = unicode(item.data(QtCore.Qt.UserRole).toString()) verseId = unicode(item.data(QtCore.Qt.UserRole).toString())
bits = verseId.split(u':') bits = verseId.split(u':')
sxml.add_verse_to_lyrics(bits[0], bits[1], unicode(item.text())) sxml.add_verse_to_lyrics(bits[0], bits[1], unicode(item.text()))
text = text + unicode(self.VerseListWidget.item(i, 0).text()) \ text = text + re.sub(r'\W+', u' ',
+ u' ' unicode(self.VerseListWidget.item(i, 0).text())) + u' '
text = text.replace(u'\'', u'') if (bits[1] > u'1') and (bits[0][0] not in multiple):
text = text.replace(u',', u'') multiple.append(bits[0][0])
text = text.replace(u';', u'') self.song.search_lyrics = text
text = text.replace(u':', u'')
text = text.replace(u'(', u'')
text = text.replace(u')', u'')
text = text.replace(u'{', u'')
text = text.replace(u'}', u'')
text = text.replace(u'?', u'')
self.song.search_lyrics = unicode(text)
self.song.lyrics = unicode(sxml.extract_xml(), u'utf-8') self.song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
for verse in multiple:
self.song.verse_order = re.sub(u'([' + verse.upper() +
verse.lower() + u'])(\W|$)', r'\g<1>1\2',
self.song.verse_order)
except: except:
log.exception(u'Problem processing song Lyrics \n%s', log.exception(u'Problem processing song Lyrics \n%s',
sxml.dump_xml()) sxml.dump_xml())
def processTitle(self): def processTitle(self):
log.debug(u'processTitle') log.debug(u'processTitle')
self.song.search_title = unicode(self.song.search_title) self.song.search_title = \
self.song.search_title = self.song.search_title.replace(u'\'', u'') re.sub(r'[\'"`,;:(){}?]+', u'', unicode(self.song.search_title))
self.song.search_title = self.song.search_title.replace(u'\"', u'')
self.song.search_title = self.song.search_title.replace(u'`', u'')
self.song.search_title = self.song.search_title.replace(u',', u'')
self.song.search_title = self.song.search_title.replace(u';', u'')
self.song.search_title = self.song.search_title.replace(u':', u'')
self.song.search_title = self.song.search_title.replace(u'(', u'')
self.song.search_title = self.song.search_title.replace(u')', u'')
self.song.search_title = self.song.search_title.replace(u'{', u'')
self.song.search_title = self.song.search_title.replace(u'}', u'')
self.song.search_title = self.song.search_title.replace(u'?', u'')

View File

@ -350,8 +350,8 @@ class SongMediaItem(MediaManagerItem):
if len(order) == 0: if len(order) == 0:
break break
for verse in verseList: for verse in verseList:
if verse[0][u'label'] == order[1:] and \ if verse[0][u'type'][0] == order[0] and \
verse[0][u'type'][0] == order[0]: (verse[0][u'label'] == order[1:] or not order[1:]):
verseTag = u'%s:%s' % \ verseTag = u'%s:%s' % \
(verse[0][u'type'], verse[0][u'label']) (verse[0][u'type'], verse[0][u'label'])
service_item.add_from_text( service_item.add_from_text(

View File

@ -23,7 +23,7 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
import string import re
from PyQt4 import QtGui from PyQt4 import QtGui
@ -89,9 +89,6 @@ class SongImport(object):
Get rid of some dodgy unicode and formatting characters we're not Get rid of some dodgy unicode and formatting characters we're not
interested in. Some can be converted to ascii. interested in. Some can be converted to ascii.
""" """
text = text.replace(u'\t', u' ')
text = text.replace(u'\r\n', u'\n')
text = text.replace(u'\r', u'\n')
text = text.replace(u'\u2018', u'\'') text = text.replace(u'\u2018', u'\'')
text = text.replace(u'\u2019', u'\'') text = text.replace(u'\u2019', u'\'')
text = text.replace(u'\u201c', u'"') text = text.replace(u'\u201c', u'"')
@ -100,15 +97,9 @@ class SongImport(object):
text = text.replace(u'\u2013', u'-') text = text.replace(u'\u2013', u'-')
text = text.replace(u'\u2014', u'-') text = text.replace(u'\u2014', u'-')
# Remove surplus blank lines, spaces, trailing/leading spaces # Remove surplus blank lines, spaces, trailing/leading spaces
while text.find(u' ') >= 0: text = re.sub(r'[ \t\v]+', u' ', text)
text = text.replace(u' ', u' ') text = re.sub(r' ?(\r\n?|\n) ?', u'\n', text)
text = text.replace(u'\n ', u'\n') text = re.sub(r' ?(\n{5}|\f)+ ?', u'\f', text)
text = text.replace(u' \n', u'\n')
text = text.replace(u'\n\n\n\n\n', u'\f')
text = text.replace(u'\f ', u'\f')
text = text.replace(u' \f', u'\f')
while text.find(u'\f\f') >= 0:
text = text.replace(u'\f\f', u'\f')
return text return text
def process_song_text(self, text): def process_song_text(self, text):
@ -264,11 +255,9 @@ class SongImport(object):
def remove_punctuation(self, text): def remove_punctuation(self, text):
""" """
Remove punctuation from the string for searchable fields Extracts alphanumeric words for searchable fields
""" """
for character in string.punctuation: return re.sub(r'\W+', u' ', text)
text = text.replace(character, u'')
return text
def finish(self): def finish(self):
""" """

View File

@ -71,12 +71,11 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
def accept(self): def accept(self):
log.debug(u'Detailed report generated') log.debug(u'Detailed report generated')
filename = u'usage_detail_%s_%s.txt' % \ filename = u'usage_detail_%s_%s.txt' % (
(self.FromDate.selectedDate().toString(u'ddMMyyyy'), self.FromDate.selectedDate().toString(u'ddMMyyyy'),
self.ToDate.selectedDate().toString(u'ddMMyyyy')) self.ToDate.selectedDate().toString(u'ddMMyyyy'))
usage = self.parent.songusagemanager.get_all_songusage(\ usage = self.parent.songusagemanager.get_all_songusage(
self.FromDate.selectedDate(), \ self.FromDate.selectedDate(), self.ToDate.selectedDate())
self.ToDate.selectedDate())
outname = os.path.join(unicode(self.FileLineEdit.text()), filename) outname = os.path.join(unicode(self.FileLineEdit.text()), filename)
file = None file = None
try: try: