forked from openlp/openlp
Head864
This commit is contained in:
commit
b08707cc80
|
@ -208,40 +208,40 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
## Import Button ##
|
||||
if self.hasImportIcon:
|
||||
self.addToolbarButton(
|
||||
unicode(translate('MediaManagerItem', 'Import %s')) % \
|
||||
unicode(translate('MediaManagerItem', 'Import %s')) %
|
||||
self.PluginNameShort,
|
||||
unicode(translate('MediaManagerItem', 'Import a %s')) % \
|
||||
unicode(translate('MediaManagerItem', 'Import a %s')) %
|
||||
self.PluginNameVisible,
|
||||
u':/general/general_import.png', self.onImportClick)
|
||||
## File Button ##
|
||||
if self.hasFileIcon:
|
||||
self.addToolbarButton(
|
||||
unicode(translate('MediaManagerItem', 'Load %s')) % \
|
||||
unicode(translate('MediaManagerItem', 'Load %s')) %
|
||||
self.PluginNameShort,
|
||||
unicode(translate('MediaManagerItem', 'Load a new %s')) % \
|
||||
unicode(translate('MediaManagerItem', 'Load a new %s')) %
|
||||
self.PluginNameVisible,
|
||||
u':/general/general_open.png', self.onFileClick)
|
||||
## New Button ##
|
||||
if self.hasNewIcon:
|
||||
self.addToolbarButton(
|
||||
unicode(translate('MediaManagerItem', 'New %s')) % \
|
||||
unicode(translate('MediaManagerItem', 'New %s')) %
|
||||
self.PluginNameShort,
|
||||
unicode(translate('MediaManagerItem', 'Add a new %s')) % \
|
||||
unicode(translate('MediaManagerItem', 'Add a new %s')) %
|
||||
self.PluginNameVisible,
|
||||
u':/general/general_new.png', self.onNewClick)
|
||||
## Edit Button ##
|
||||
if self.hasEditIcon:
|
||||
self.addToolbarButton(
|
||||
unicode(translate('MediaManagerItem', 'Edit %s')) % \
|
||||
unicode(translate('MediaManagerItem', 'Edit %s')) %
|
||||
self.PluginNameShort,
|
||||
unicode(translate(
|
||||
'MediaManagerItem', 'Edit the selected %s')) % \
|
||||
'MediaManagerItem', 'Edit the selected %s')) %
|
||||
self.PluginNameVisible,
|
||||
u':/general/general_edit.png', self.onEditClick)
|
||||
## Delete Button ##
|
||||
if self.hasDeleteIcon:
|
||||
self.addToolbarButton(
|
||||
unicode(translate('MediaManagerItem', 'Delete %s')) % \
|
||||
unicode(translate('MediaManagerItem', 'Delete %s')) %
|
||||
self.PluginNameShort,
|
||||
translate('MediaManagerItem', 'Delete the selected item'),
|
||||
u':/general/general_delete.png', self.onDeleteClick)
|
||||
|
@ -249,7 +249,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
self.addToolbarSeparator()
|
||||
## Preview ##
|
||||
self.addToolbarButton(
|
||||
unicode(translate('MediaManagerItem', 'Preview %s')) % \
|
||||
unicode(translate('MediaManagerItem', 'Preview %s')) %
|
||||
self.PluginNameShort,
|
||||
translate('MediaManagerItem', 'Preview the selected item'),
|
||||
u':/general/general_preview.png', self.onPreviewClick)
|
||||
|
@ -260,7 +260,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
u':/general/general_live.png', self.onLiveClick)
|
||||
## Add to service Button ##
|
||||
self.addToolbarButton(
|
||||
unicode(translate('MediaManagerItem', 'Add %s to Service')) % \
|
||||
unicode(translate('MediaManagerItem', 'Add %s to Service')) %
|
||||
self.PluginNameShort,
|
||||
translate('MediaManagerItem',
|
||||
'Add the selected item(s) to the service'),
|
||||
|
@ -285,7 +285,7 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
self.ListView.addAction(
|
||||
context_menu_action(
|
||||
self.ListView, u':/general/general_edit.png',
|
||||
unicode(translate('MediaManagerItem', '&Edit %s')) % \
|
||||
unicode(translate('MediaManagerItem', '&Edit %s')) %
|
||||
self.PluginNameVisible,
|
||||
self.onEditClick))
|
||||
self.ListView.addAction(context_menu_separator(self.ListView))
|
||||
|
@ -293,14 +293,14 @@ class MediaManagerItem(QtGui.QWidget):
|
|||
self.ListView.addAction(
|
||||
context_menu_action(
|
||||
self.ListView, u':/general/general_delete.png',
|
||||
unicode(translate('MediaManagerItem', '&Delete %s')) % \
|
||||
unicode(translate('MediaManagerItem', '&Delete %s')) %
|
||||
self.PluginNameVisible,
|
||||
self.onDeleteClick))
|
||||
self.ListView.addAction(context_menu_separator(self.ListView))
|
||||
self.ListView.addAction(
|
||||
context_menu_action(
|
||||
self.ListView, u':/general/general_preview.png',
|
||||
unicode(translate('MediaManagerItem', '&Preview %s')) % \
|
||||
unicode(translate('MediaManagerItem', '&Preview %s')) %
|
||||
self.PluginNameVisible,
|
||||
self.onPreviewClick))
|
||||
self.ListView.addAction(
|
||||
|
|
|
@ -90,7 +90,7 @@ class ServiceItem(object):
|
|||
self.from_plugin = False
|
||||
self.capabilities = []
|
||||
self.is_valid = True
|
||||
self.cache = []
|
||||
self.cache = {}
|
||||
self.icon = None
|
||||
|
||||
def add_capability(self, capability):
|
||||
|
@ -129,7 +129,7 @@ class ServiceItem(object):
|
|||
"""
|
||||
log.debug(u'Render called')
|
||||
self._display_frames = []
|
||||
self.cache = []
|
||||
self.clear_cache()
|
||||
if self.service_item_type == ServiceItemType.Text:
|
||||
log.debug(u'Formatting slides')
|
||||
if self.theme is None:
|
||||
|
@ -149,7 +149,8 @@ class ServiceItem(object):
|
|||
self._display_frames.append({u'title': title,
|
||||
u'text': lines.rstrip(),
|
||||
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))
|
||||
elif self.service_item_type == ServiceItemType.Image:
|
||||
for slide in self._raw_frames:
|
||||
|
@ -172,8 +173,7 @@ class ServiceItem(object):
|
|||
else:
|
||||
self.render_manager.set_override_theme(self.theme)
|
||||
format = self._display_frames[row][u'text'].split(u'\n')
|
||||
#if screen blank then do not display footer
|
||||
if len(self.cache) > 0 and self.cache[row] is not None:
|
||||
if self.cache.get(row):
|
||||
frame = self.cache[row]
|
||||
else:
|
||||
if format[0]:
|
||||
|
@ -385,3 +385,8 @@ class ServiceItem(object):
|
|||
"""
|
||||
return self._raw_frames[row][u'path']
|
||||
|
||||
def clear_cache(self):
|
||||
"""
|
||||
Clear's the service item's cache.
|
||||
"""
|
||||
self.cache = {}
|
||||
|
|
|
@ -339,7 +339,8 @@ class ThemeXML(object):
|
|||
"""
|
||||
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):
|
||||
"""
|
||||
|
@ -364,7 +365,8 @@ class ThemeXML(object):
|
|||
``xml``
|
||||
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()
|
||||
master = u''
|
||||
for element in xml_iter:
|
||||
|
|
|
@ -175,7 +175,8 @@ class Theme(object):
|
|||
``xml``
|
||||
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()
|
||||
for element in xml_iter:
|
||||
delphi_color_change = False
|
||||
|
|
|
@ -30,6 +30,7 @@ import os.path
|
|||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import ThemeXML, translate
|
||||
from openlp.core.utils import get_images_filter
|
||||
from amendthemedialog import Ui_AmendThemeDialog
|
||||
|
||||
log = logging.getLogger(u'AmendThemeForm')
|
||||
|
@ -209,8 +210,11 @@ class AmendThemeForm(QtGui.QDialog, Ui_AmendThemeDialog):
|
|||
self.previewTheme()
|
||||
|
||||
def onImageToolButtonClicked(self):
|
||||
filename = unicode(QtGui.QFileDialog.getOpenFileName(
|
||||
self, translate('AmendThemeForm', 'Open File')))
|
||||
images_filter = get_images_filter()
|
||||
images_filter = '%s;;%s (*.*) (*)' % (images_filter,
|
||||
translate('AmendThemeForm', 'All Files'))
|
||||
filename = QtGui.QFileDialog.getOpenFileName(self,
|
||||
translate('AmendThemeForm', 'Select Image'), u'', images_filter)
|
||||
if filename:
|
||||
self.ImageLineEdit.setText(filename)
|
||||
self.theme.background_filename = filename
|
||||
|
|
|
@ -661,8 +661,7 @@ class ServiceManager(QtGui.QWidget):
|
|||
filename = unicode(filename)
|
||||
name = filename.split(os.path.sep)
|
||||
if filename:
|
||||
SettingsManager.set_last_dir(
|
||||
self.parent.serviceSettingsSection,
|
||||
SettingsManager.set_last_dir(self.parent.serviceSettingsSection,
|
||||
os.path.split(filename)[0])
|
||||
zip = None
|
||||
file_to = None
|
||||
|
@ -677,7 +676,7 @@ class ServiceManager(QtGui.QWidget):
|
|||
translate('ServiceManager',
|
||||
'File is not a valid service.\n'
|
||||
'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'))
|
||||
continue
|
||||
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
|
||||
|
@ -697,7 +696,7 @@ class ServiceManager(QtGui.QWidget):
|
|||
self.onNewService()
|
||||
for item in items:
|
||||
serviceitem = ServiceItem()
|
||||
serviceitem.RenderManager = self.parent.RenderManager
|
||||
serviceitem.render_manager = self.parent.RenderManager
|
||||
serviceitem.set_from_service(item, self.servicePath)
|
||||
self.validateItem(serviceitem)
|
||||
self.addServiceItem(serviceitem)
|
||||
|
|
|
@ -537,7 +537,7 @@ class SlideController(QtGui.QWidget):
|
|||
before = time.time()
|
||||
#Clear the old serviceItem cache to release memory
|
||||
if self.serviceItem and self.serviceItem is not serviceItem:
|
||||
self.serviceItem.cache = []
|
||||
self.serviceItem.clear_cache()
|
||||
self.serviceItem = serviceItem
|
||||
self.PreviewListWidget.clear()
|
||||
self.PreviewListWidget.setRowCount(0)
|
||||
|
|
|
@ -398,7 +398,7 @@ class ThemeManager(QtGui.QWidget):
|
|||
self, translate('ThemeManager', 'Error'),
|
||||
translate('ThemeManager', 'File is not a valid theme.\n'
|
||||
'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'))
|
||||
continue
|
||||
osfile = unicode(QtCore.QDir.toNativeSeparators(ucsfile))
|
||||
|
@ -424,8 +424,8 @@ class ThemeManager(QtGui.QWidget):
|
|||
xml_data = xml_data.decode(u'utf-8')
|
||||
except UnicodeDecodeError:
|
||||
log.exception(u'Theme XML is not UTF-8 '
|
||||
'encoded.')
|
||||
break;
|
||||
u'encoded.')
|
||||
break
|
||||
if self.checkVersion1(xml_data):
|
||||
# upgrade theme xml
|
||||
filexml = self.migrateVersion122(xml_data)
|
||||
|
|
|
@ -30,17 +30,20 @@ import os
|
|||
import sys
|
||||
import logging
|
||||
import urllib2
|
||||
|
||||
from datetime import datetime
|
||||
from PyQt4 import QtCore
|
||||
|
||||
from PyQt4 import QtGui, QtCore
|
||||
|
||||
import openlp
|
||||
from openlp.core.lib import translate
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
images_filter = None
|
||||
|
||||
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
|
||||
ConfigDir = 2
|
||||
|
@ -176,6 +179,22 @@ def get_filesystem_encoding():
|
|||
encoding = sys.getdefaultencoding()
|
||||
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
|
||||
|
||||
__all__ = [u'AppLocation', u'check_latest_version', u'add_actions',
|
||||
|
|
|
@ -294,5 +294,5 @@ class AlertsTab(SettingsTab):
|
|||
font.setBold(True)
|
||||
font.setPointSize(self.font_size)
|
||||
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))
|
||||
|
|
|
@ -30,7 +30,7 @@ from PyQt4 import QtCore, QtGui
|
|||
|
||||
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
|
||||
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__)
|
||||
|
||||
|
@ -61,12 +61,9 @@ class ImageMediaItem(MediaManagerItem):
|
|||
def retranslateUi(self):
|
||||
self.OnNewPrompt = translate('ImagePlugin.MediaItem',
|
||||
'Select Image(s)')
|
||||
file_formats = u''
|
||||
for file_format in QtGui.QImageReader.supportedImageFormats():
|
||||
file_formats += u'*.%s ' % file_format
|
||||
self.OnNewFileMasks = unicode(
|
||||
translate('ImagePlugin.MediaItem',
|
||||
'Images (%s);; All files (*)')) % file_formats
|
||||
file_formats = get_images_filter()
|
||||
self.OnNewFileMasks = u'%s;;%s (*.*) (*)' % (file_formats,
|
||||
unicode(translate('ImagePlugin.MediaItem', 'All Files')))
|
||||
|
||||
def requiredIcons(self):
|
||||
MediaManagerItem.requiredIcons(self)
|
||||
|
|
|
@ -384,9 +384,6 @@ class Ui_EditSongDialog(object):
|
|||
self.CommentsLayout.addWidget(self.CommentsEdit)
|
||||
self.ThemeCopyCommentsLayout.addWidget(self.CommentsGroupBox)
|
||||
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.verticalLayout.addWidget(self.SongTabWidget)
|
||||
self.ButtonBox = QtGui.QDialogButtonBox(EditSongDialog)
|
||||
|
|
|
@ -30,6 +30,7 @@ from PyQt4 import QtCore, QtGui
|
|||
|
||||
from openlp.core.lib import SongXMLBuilder, SongXMLParser, Receiver, translate
|
||||
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 editsongdialog import Ui_EditSongDialog
|
||||
|
||||
|
@ -90,16 +91,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||
self.parent.parent.render_manager.theme_manager.onAddTheme)
|
||||
QtCore.QObject.connect(self.MaintenanceButton,
|
||||
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.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.setObjectName(u'previewButton')
|
||||
self.previewButton.setText(
|
||||
|
@ -247,7 +240,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||
self.VerseListWidget.setRowCount(
|
||||
self.VerseListWidget.rowCount() + 1)
|
||||
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))
|
||||
self.VerseListWidget.setItem(count, 0, item)
|
||||
self.VerseListWidget.resizeRowsToContents()
|
||||
|
@ -264,7 +258,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||
topic_name = QtGui.QListWidgetItem(unicode(topic.name))
|
||||
topic_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(topic.id))
|
||||
self.TopicsListView.addItem(topic_name)
|
||||
self._validate_song()
|
||||
self.TitleEditItem.setFocus(QtCore.Qt.OtherFocusReason)
|
||||
#if not preview hide the preview button
|
||||
self.previewButton.setVisible(False)
|
||||
|
@ -522,42 +515,75 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||
if len(self.TitleEditItem.displayText()) == 0:
|
||||
self.SongTabWidget.setCurrentIndex(0)
|
||||
self.TitleEditItem.setFocus()
|
||||
return False, translate(u'SongsPlugin.EditSongForm',
|
||||
u'You need to enter a song title.')
|
||||
QtGui.QMessageBox.critical(self,
|
||||
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:
|
||||
self.SongTabWidget.setCurrentIndex(0)
|
||||
self.VerseListWidget.setFocus()
|
||||
return False, translate(u'SongsPlugin.EditSongForm',
|
||||
u'You need to enter some verses.')
|
||||
QtGui.QMessageBox.critical(self,
|
||||
translate(u'SongsPlugin.EditSongForm', u'Error'),
|
||||
translate('uSongsPlugin.EditSongForm',
|
||||
u'You need to enter some verses.'))
|
||||
return False
|
||||
if self.AuthorsListView.count() == 0:
|
||||
self.SongTabWidget.setCurrentIndex(1)
|
||||
self.AuthorsListView.setFocus()
|
||||
#split the verse list by space and mark lower case for testing
|
||||
taglist = unicode(translate(u'SongsPlugin.EditSongForm', u' bitpeovc'))
|
||||
for verse in unicode(self.VerseOrderEdit.text()).lower().split(u' '):
|
||||
if len(verse) > 1:
|
||||
if taglist.find(verse[0:1]) > -1 \
|
||||
and verse[1:].isdigit():
|
||||
pass
|
||||
answer = QtGui.QMessageBox.warning(self,
|
||||
translate(u'SongsPlugin.EditSongForm', u'Warning'),
|
||||
translate('SongsPlugin.EditSongForm',
|
||||
'You have set no author.\n'
|
||||
'Do you want to add now a author?'),
|
||||
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
|
||||
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:
|
||||
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.VerseOrderEdit.setFocus()
|
||||
return False, translate(u'SongsPlugin.EditSongForm',
|
||||
u'Invalid verse entry, values must be I,B,T,P,E,O,V,C '
|
||||
u'followed by a number')
|
||||
return True, u''
|
||||
|
||||
def onTitleEditItemLostFocus(self):
|
||||
self.song.title = unicode(self.TitleEditItem.text())
|
||||
|
||||
def onVerseOrderEditLostFocus(self):
|
||||
self.song.verse_order = unicode(self.VerseOrderEdit.text())
|
||||
|
||||
def onCommentsEditLostFocus(self):
|
||||
self.song.comments = unicode(self.CommentsEdit.text())
|
||||
|
||||
def onCCLNumberEditLostFocus(self):
|
||||
self.song.ccli_number = self.CCLNumberEdit.text()
|
||||
valid = verses.pop(0)
|
||||
for verse in verses:
|
||||
valid = valid + u', ' + verse
|
||||
QtGui.QMessageBox.critical(self,
|
||||
translate(u'SongsPlugin.EditSongForm', u'Error'),
|
||||
unicode(translate('SongsPlugin.EditSongForm',
|
||||
'The verse order is invalid. There is no verse '
|
||||
'corresponding to %s. Valid entries are %s.')) % \
|
||||
(order_names[count], valid))
|
||||
return False
|
||||
for count, verse in enumerate(verses):
|
||||
if verse not in order:
|
||||
self.SongTabWidget.setCurrentIndex(0)
|
||||
self.VerseOrderEdit.setFocus()
|
||||
answer = QtGui.QMessageBox.warning(self,
|
||||
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):
|
||||
text = self.CopyrightEditItem.text()
|
||||
|
@ -593,23 +619,19 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||
self.close()
|
||||
|
||||
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.copyright = unicode(self.CopyrightEditItem.text())
|
||||
self.song.search_title = unicode(self.TitleEditItem.text()) + \
|
||||
u'@'+ unicode(self.AlternativeEdit.text())
|
||||
self.song.search_title = self.song.title + u'@' + \
|
||||
unicode(self.AlternativeEdit.text())
|
||||
self.song.comments = unicode(self.CommentsEdit.toPlainText())
|
||||
self.song.verse_order = unicode(self.VerseOrderEdit.text())
|
||||
self.song.ccli_number = unicode(self.CCLNumberEdit.text())
|
||||
if self._validate_song():
|
||||
self.processLyrics()
|
||||
self.processTitle()
|
||||
self.songmanager.save_song(self.song)
|
||||
return True
|
||||
return False
|
||||
|
||||
def processLyrics(self):
|
||||
log.debug(u'processLyrics')
|
||||
|
@ -617,41 +639,29 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
|||
sxml = SongXMLBuilder()
|
||||
sxml.new_document()
|
||||
sxml.add_lyrics_to_song()
|
||||
text = u' '
|
||||
text = u''
|
||||
multiple = []
|
||||
for i in range (0, self.VerseListWidget.rowCount()):
|
||||
item = self.VerseListWidget.item(i, 0)
|
||||
verseId = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
bits = verseId.split(u':')
|
||||
sxml.add_verse_to_lyrics(bits[0], bits[1], unicode(item.text()))
|
||||
text = text + unicode(self.VerseListWidget.item(i, 0).text()) \
|
||||
+ 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'')
|
||||
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)
|
||||
text = text + re.sub(r'\W+', u' ',
|
||||
unicode(self.VerseListWidget.item(i, 0).text())) + u' '
|
||||
if (bits[1] > u'1') and (bits[0][0] not in multiple):
|
||||
multiple.append(bits[0][0])
|
||||
self.song.search_lyrics = text
|
||||
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:
|
||||
log.exception(u'Problem processing song Lyrics \n%s',
|
||||
sxml.dump_xml())
|
||||
|
||||
def processTitle(self):
|
||||
log.debug(u'processTitle')
|
||||
self.song.search_title = 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'')
|
||||
self.song.search_title = self.song.search_title.replace(u'?', u'')
|
||||
self.song.search_title = \
|
||||
re.sub(r'[\'"`,;:(){}?]+', u'', unicode(self.song.search_title))
|
||||
|
||||
|
|
|
@ -350,8 +350,8 @@ class SongMediaItem(MediaManagerItem):
|
|||
if len(order) == 0:
|
||||
break
|
||||
for verse in verseList:
|
||||
if verse[0][u'label'] == order[1:] and \
|
||||
verse[0][u'type'][0] == order[0]:
|
||||
if verse[0][u'type'][0] == order[0] and \
|
||||
(verse[0][u'label'] == order[1:] or not order[1:]):
|
||||
verseTag = u'%s:%s' % \
|
||||
(verse[0][u'type'], verse[0][u'label'])
|
||||
service_item.add_from_text(
|
||||
|
|
|
@ -23,7 +23,7 @@
|
|||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||
###############################################################################
|
||||
|
||||
import string
|
||||
import re
|
||||
|
||||
from PyQt4 import QtGui
|
||||
|
||||
|
@ -89,9 +89,6 @@ class SongImport(object):
|
|||
Get rid of some dodgy unicode and formatting characters we're not
|
||||
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'\u2019', u'\'')
|
||||
text = text.replace(u'\u201c', u'"')
|
||||
|
@ -100,15 +97,9 @@ class SongImport(object):
|
|||
text = text.replace(u'\u2013', u'-')
|
||||
text = text.replace(u'\u2014', u'-')
|
||||
# Remove surplus blank lines, spaces, trailing/leading spaces
|
||||
while text.find(u' ') >= 0:
|
||||
text = text.replace(u' ', u' ')
|
||||
text = text.replace(u'\n ', u'\n')
|
||||
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')
|
||||
text = re.sub(r'[ \t\v]+', u' ', text)
|
||||
text = re.sub(r' ?(\r\n?|\n) ?', u'\n', text)
|
||||
text = re.sub(r' ?(\n{5}|\f)+ ?', u'\f', text)
|
||||
return text
|
||||
|
||||
def process_song_text(self, text):
|
||||
|
@ -264,11 +255,9 @@ class SongImport(object):
|
|||
|
||||
def remove_punctuation(self, text):
|
||||
"""
|
||||
Remove punctuation from the string for searchable fields
|
||||
Extracts alphanumeric words for searchable fields
|
||||
"""
|
||||
for character in string.punctuation:
|
||||
text = text.replace(character, u'')
|
||||
return text
|
||||
return re.sub(r'\W+', u' ', text)
|
||||
|
||||
def finish(self):
|
||||
"""
|
||||
|
|
|
@ -71,12 +71,11 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
|
|||
|
||||
def accept(self):
|
||||
log.debug(u'Detailed report generated')
|
||||
filename = u'usage_detail_%s_%s.txt' % \
|
||||
(self.FromDate.selectedDate().toString(u'ddMMyyyy'),
|
||||
filename = u'usage_detail_%s_%s.txt' % (
|
||||
self.FromDate.selectedDate().toString(u'ddMMyyyy'),
|
||||
self.ToDate.selectedDate().toString(u'ddMMyyyy'))
|
||||
usage = self.parent.songusagemanager.get_all_songusage(\
|
||||
self.FromDate.selectedDate(), \
|
||||
self.ToDate.selectedDate())
|
||||
usage = self.parent.songusagemanager.get_all_songusage(
|
||||
self.FromDate.selectedDate(), self.ToDate.selectedDate())
|
||||
outname = os.path.join(unicode(self.FileLineEdit.text()), filename)
|
||||
file = None
|
||||
try:
|
||||
|
|
Loading…
Reference in New Issue