forked from openlp/openlp
r1315
This commit is contained in:
commit
921480fe77
20
README.txt
Normal file
20
README.txt
Normal file
@ -0,0 +1,20 @@
|
||||
OpenLP 2.0
|
||||
==========
|
||||
|
||||
You're probably reading this because you've just downloaded the source code for
|
||||
OpenLP 2.0. If you are looking for the installer file, please go to the download
|
||||
page on the web site::
|
||||
|
||||
http://openlp.org/en/download.html
|
||||
|
||||
If you're looking for how to contribute to OpenLP, then please look at the
|
||||
contribution page on the web site::
|
||||
|
||||
http://openlp.org/en/documentation/introduction/contributing.html
|
||||
|
||||
If you've looked at that page, and are wanting to help develop, test or
|
||||
translate OpenLP, have a look at the OpenLP wiki::
|
||||
|
||||
http://wiki.openlp.org/
|
||||
|
||||
Thanks for downloading OpenLP 2.0!
|
@ -13,7 +13,7 @@ Object Library
|
||||
:members:
|
||||
|
||||
:mod:`ListWidgetWithDnD`
|
||||
----------------------
|
||||
------------------------
|
||||
|
||||
.. autoclass:: openlp.core.lib.listwidgetwithdnd.ListWidgetWithDnD
|
||||
:members:
|
||||
|
@ -54,9 +54,6 @@ Helper Classes & Functions
|
||||
.. automodule:: openlp.plugins.songs.lib.mediaitem
|
||||
:members:
|
||||
|
||||
.. autoclass:: openlp.plugins.songs.lib.mediaitem.SongListView
|
||||
:members:
|
||||
|
||||
.. automodule:: openlp.plugins.songs.lib.songimport
|
||||
:members:
|
||||
|
||||
|
@ -239,7 +239,8 @@ def resize_image(image, width, height, background=QtCore.Qt.black):
|
||||
Resize an image to fit on the current screen.
|
||||
|
||||
``image``
|
||||
The image to resize.
|
||||
The image to resize. It has to be either a ``QImage`` instance or the
|
||||
path to the image.
|
||||
|
||||
``width``
|
||||
The new image width.
|
||||
@ -320,8 +321,6 @@ def check_directory_exists(dir):
|
||||
os.makedirs(dir)
|
||||
|
||||
from listwidgetwithdnd import ListWidgetWithDnD
|
||||
from theme import ThemeLevel, ThemeXML, BackgroundGradientType, \
|
||||
BackgroundType, HorizontalType, VerticalType
|
||||
from displaytags import DisplayTags
|
||||
from spelltextedit import SpellTextEdit
|
||||
from eventreceiver import Receiver
|
||||
|
@ -28,8 +28,8 @@ import logging
|
||||
|
||||
from PyQt4 import QtWebKit
|
||||
|
||||
from openlp.core.lib import BackgroundType, BackgroundGradientType, \
|
||||
VerticalType
|
||||
from openlp.core.lib.theme import BackgroundType, BackgroundGradientType, \
|
||||
VerticalType, HorizontalType
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -531,13 +531,8 @@ def build_lyrics_format_css(theme, width, height):
|
||||
Height of the lyrics block
|
||||
|
||||
"""
|
||||
if theme.display_horizontal_align == 2:
|
||||
align = u'center'
|
||||
elif theme.display_horizontal_align == 1:
|
||||
align = u'right'
|
||||
else:
|
||||
align = u'left'
|
||||
valign = VerticalType.to_string(theme.display_vertical_align)
|
||||
align = HorizontalType.Names[theme.display_horizontal_align]
|
||||
valign = VerticalType.Names[theme.display_vertical_align]
|
||||
if theme.font_main_outline:
|
||||
left_margin = int(theme.font_main_outline_size) * 2
|
||||
else:
|
||||
@ -630,7 +625,7 @@ def build_alert_css(alertTab, width):
|
||||
"""
|
||||
if not alertTab:
|
||||
return u''
|
||||
align = VerticalType.to_string(alertTab.location)
|
||||
align = VerticalType.Names[alertTab.location]
|
||||
alert = style % (width, align, alertTab.font_face, alertTab.font_size,
|
||||
alertTab.font_color, alertTab.bg_color)
|
||||
return alert
|
||||
|
@ -85,8 +85,7 @@ class ImageManager(QtCore.QObject):
|
||||
for key in self._cache.keys():
|
||||
image = self._cache[key]
|
||||
image.dirty = True
|
||||
image.image = resize_image(image.path,
|
||||
self.width, self.height)
|
||||
image.image = resize_image(image.path, self.width, self.height)
|
||||
self._cache_dirty = True
|
||||
# only one thread please
|
||||
if not self._thread_running:
|
||||
@ -128,8 +127,7 @@ class ImageManager(QtCore.QObject):
|
||||
image = Image()
|
||||
image.name = name
|
||||
image.path = path
|
||||
image.image = resize_image(path,
|
||||
self.width, self.height)
|
||||
image.image = resize_image(path, self.width, self.height)
|
||||
self._cache[name] = image
|
||||
else:
|
||||
log.debug(u'Image in cache %s:%s' % (name, path))
|
||||
|
@ -34,6 +34,7 @@ from PyQt4 import QtCore, QtGui
|
||||
from openlp.core.lib import context_menu_action, context_menu_separator, \
|
||||
SettingsManager, OpenLPToolbar, ServiceItem, StringContent, build_icon, \
|
||||
translate, Receiver, ListWidgetWithDnD
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -65,10 +66,11 @@ class MediaManagerItem(QtGui.QWidget):
|
||||
When creating a descendant class from this class for your plugin,
|
||||
the following member variables should be set.
|
||||
|
||||
``self.OnNewPrompt``
|
||||
``self.onNewPrompt``
|
||||
|
||||
Defaults to *'Select Image(s)'*.
|
||||
|
||||
``self.OnNewFileMasks``
|
||||
``self.onNewFileMasks``
|
||||
Defaults to *'Images (*.jpg *jpeg *.gif *.png *.bmp)'*. This
|
||||
assumes that the new action is to load a file. If not, you
|
||||
need to override the ``OnNew`` method.
|
||||
@ -240,7 +242,7 @@ class MediaManagerItem(QtGui.QWidget):
|
||||
Creates the main widget for listing items the media item is tracking
|
||||
"""
|
||||
# Add the List widget
|
||||
self.listView = ListWidgetWithDnD(self, self.title)
|
||||
self.listView = ListWidgetWithDnD(self, self.plugin.name)
|
||||
self.listView.uniformItemSizes = True
|
||||
self.listView.setSpacing(1)
|
||||
self.listView.setSelectionMode(
|
||||
@ -316,9 +318,9 @@ class MediaManagerItem(QtGui.QWidget):
|
||||
Add a file to the list widget to make it available for showing
|
||||
"""
|
||||
files = QtGui.QFileDialog.getOpenFileNames(
|
||||
self, self.OnNewPrompt,
|
||||
self, self.onNewPrompt,
|
||||
SettingsManager.get_last_dir(self.settingsSection),
|
||||
self.OnNewFileMasks)
|
||||
self.onNewFileMasks)
|
||||
log.info(u'New files(s) %s', unicode(files))
|
||||
if files:
|
||||
Receiver.send_message(u'cursor_busy')
|
||||
@ -415,8 +417,7 @@ class MediaManagerItem(QtGui.QWidget):
|
||||
item to the preview slide controller.
|
||||
"""
|
||||
if not self.listView.selectedIndexes() and not self.remoteTriggered:
|
||||
QtGui.QMessageBox.information(self,
|
||||
translate('OpenLP.MediaManagerItem', 'No Items Selected'),
|
||||
QtGui.QMessageBox.information(self, UiStrings.NISp,
|
||||
translate('OpenLP.MediaManagerItem',
|
||||
'You must select one or more items to preview.'))
|
||||
else:
|
||||
@ -432,8 +433,7 @@ class MediaManagerItem(QtGui.QWidget):
|
||||
item to the live slide controller.
|
||||
"""
|
||||
if not self.listView.selectedIndexes():
|
||||
QtGui.QMessageBox.information(self,
|
||||
translate('OpenLP.MediaManagerItem', 'No Items Selected'),
|
||||
QtGui.QMessageBox.information(self, UiStrings.NISp,
|
||||
translate('OpenLP.MediaManagerItem',
|
||||
'You must select one or more items to send live.'))
|
||||
else:
|
||||
@ -448,8 +448,7 @@ class MediaManagerItem(QtGui.QWidget):
|
||||
Add a selected item to the current service
|
||||
"""
|
||||
if not self.listView.selectedIndexes() and not self.remoteTriggered:
|
||||
QtGui.QMessageBox.information(self,
|
||||
translate('OpenLP.MediaManagerItem', 'No Items Selected'),
|
||||
QtGui.QMessageBox.information(self, UiStrings.NISp,
|
||||
translate('OpenLP.MediaManagerItem',
|
||||
'You must select one or more items.'))
|
||||
else:
|
||||
@ -475,17 +474,14 @@ class MediaManagerItem(QtGui.QWidget):
|
||||
Add a selected item to an existing item in the current service.
|
||||
"""
|
||||
if not self.listView.selectedIndexes() and not self.remoteTriggered:
|
||||
QtGui.QMessageBox.information(self,
|
||||
translate('OpenLP.MediaManagerItem', 'No Items Selected'),
|
||||
QtGui.QMessageBox.information(self, UiStrings.NISp,
|
||||
translate('OpenLP.MediaManagerItem',
|
||||
'You must select one or more items'))
|
||||
'You must select one or more items.'))
|
||||
else:
|
||||
log.debug(u'%s Add requested', self.plugin.name)
|
||||
serviceItem = self.parent.serviceManager.getServiceItem()
|
||||
if not serviceItem:
|
||||
QtGui.QMessageBox.information(self,
|
||||
translate('OpenLP.MediaManagerItem',
|
||||
'No Service Item Selected'),
|
||||
QtGui.QMessageBox.information(self, UiStrings.NISs,
|
||||
translate('OpenLP.MediaManagerItem',
|
||||
'You must select an existing service item to add to.'))
|
||||
elif self.plugin.name.lower() == serviceItem.name.lower():
|
||||
|
@ -144,6 +144,7 @@ class Plugin(QtCore.QObject):
|
||||
self.name = name
|
||||
self.textStrings = {}
|
||||
self.setPluginTextStrings()
|
||||
self.nameStrings = self.textStrings[StringContent.Name]
|
||||
if version:
|
||||
self.version = version
|
||||
self.settingsSection = self.name.lower()
|
||||
|
@ -28,7 +28,8 @@ import logging
|
||||
|
||||
from PyQt4 import QtCore
|
||||
|
||||
from openlp.core.lib import Renderer, ThemeLevel, ServiceItem, ImageManager
|
||||
from openlp.core.lib import Renderer, ServiceItem, ImageManager
|
||||
from openlp.core.lib.theme import ThemeLevel
|
||||
from openlp.core.ui import MainDisplay
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -173,14 +174,13 @@ class RenderManager(object):
|
||||
main_rect = None
|
||||
footer_rect = None
|
||||
if not theme.font_main_override:
|
||||
main_rect = QtCore.QRect(10, 0,
|
||||
self.width - 20, self.footer_start)
|
||||
main_rect = QtCore.QRect(10, 0, self.width - 20, self.footer_start)
|
||||
else:
|
||||
main_rect = QtCore.QRect(theme.font_main_x, theme.font_main_y,
|
||||
theme.font_main_width - 1, theme.font_main_height - 1)
|
||||
if not theme.font_footer_override:
|
||||
footer_rect = QtCore.QRect(10, self.footer_start,
|
||||
self.width - 20, self.height - self.footer_start)
|
||||
footer_rect = QtCore.QRect(10, self.footer_start, self.width - 20,
|
||||
self.height - self.footer_start)
|
||||
else:
|
||||
footer_rect = QtCore.QRect(theme.font_footer_x,
|
||||
theme.font_footer_y, theme.font_footer_width - 1,
|
||||
|
@ -33,7 +33,8 @@ import logging
|
||||
from xml.dom.minidom import Document
|
||||
from lxml import etree, objectify
|
||||
|
||||
from openlp.core.lib import str_to_bool
|
||||
from openlp.core.lib import str_to_bool, translate
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -170,20 +171,14 @@ class HorizontalType(object):
|
||||
Type enumeration for horizontal alignment.
|
||||
"""
|
||||
Left = 0
|
||||
Center = 2
|
||||
Right = 1
|
||||
Center = 2
|
||||
|
||||
@staticmethod
|
||||
def to_string(horizontal_type):
|
||||
"""
|
||||
Return a string representation of a horizontal type.
|
||||
"""
|
||||
if horizontal_type == HorizontalType.Right:
|
||||
return u'right'
|
||||
elif horizontal_type == HorizontalType.Center:
|
||||
return u'center'
|
||||
else:
|
||||
return u'left'
|
||||
Names = [u'left', u'right', u'center']
|
||||
TranslatedNames = [
|
||||
translate('OpenLP.ThemeWizard', 'Left'),
|
||||
translate('OpenLP.ThemeWizard', 'Right'),
|
||||
translate('OpenLP.ThemeWizard', 'Center')]
|
||||
|
||||
|
||||
class VerticalType(object):
|
||||
@ -194,17 +189,8 @@ class VerticalType(object):
|
||||
Middle = 1
|
||||
Bottom = 2
|
||||
|
||||
@staticmethod
|
||||
def to_string(vertical_type):
|
||||
"""
|
||||
Return a string representation of a vertical type.
|
||||
"""
|
||||
if vertical_type == VerticalType.Bottom:
|
||||
return u'bottom'
|
||||
elif vertical_type == VerticalType.Middle:
|
||||
return u'middle'
|
||||
else:
|
||||
return u'top'
|
||||
Names = [u'top', u'middle', u'bottom']
|
||||
TranslatedNames = [UiStrings.Top, UiStrings.Middle, UiStrings.Bottom]
|
||||
|
||||
|
||||
BOOLEAN_LIST = [u'bold', u'italics', u'override', u'outline', u'shadow',
|
||||
|
@ -40,32 +40,59 @@ class UiStrings(object):
|
||||
"""
|
||||
# These strings should need a good reason to be retranslated elsewhere.
|
||||
# Should some/more/less of these have an & attached?
|
||||
About = translate('OpenLP.Ui', 'About')
|
||||
Add = translate('OpenLP.Ui', '&Add')
|
||||
Advanced = translate('OpenLP.Ui', 'Advanced')
|
||||
AllFiles = translate('OpenLP.Ui', 'All Files')
|
||||
Authors = translate('OpenLP.Ui', 'Authors')
|
||||
Bottom = translate('OpenLP.Ui', 'Bottom')
|
||||
Browse = translate('OpenLP.Ui', 'Browse...')
|
||||
Cancel = translate('OpenLP.Ui', 'Cancel')
|
||||
CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:')
|
||||
CreateService = translate('OpenLP.Ui', 'Create a new service.')
|
||||
Delete = translate('OpenLP.Ui', '&Delete')
|
||||
Edit = translate('OpenLP.Ui', '&Edit')
|
||||
EmptyField = translate('OpenLP.Ui', 'Empty Field')
|
||||
Error = translate('OpenLP.Ui', 'Error')
|
||||
Export = translate('OpenLP.Ui', 'Export')
|
||||
FontSizePtUnit = translate('OpenLP.Ui', 'pt',
|
||||
'Abbreviated font pointsize unit')
|
||||
Image = translate('OpenLP.Ui', 'Image')
|
||||
Import = translate('OpenLP.Ui', 'Import')
|
||||
LengthTime = unicode(translate('OpenLP.Ui', 'Length %s'))
|
||||
Live = translate('OpenLP.Ui', 'Live')
|
||||
LiveBGError = translate('OpenLP.Ui', 'Live Background Error')
|
||||
LivePanel = translate('OpenLP.Ui', 'Live Panel')
|
||||
Load = translate('OpenLP.Ui', 'Load')
|
||||
Middle = translate('OpenLP.Ui', 'Middle')
|
||||
New = translate('OpenLP.Ui', 'New')
|
||||
NewService = translate('OpenLP.Ui', 'New Service')
|
||||
NewTheme = translate('OpenLP.Ui', 'New Theme')
|
||||
NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular')
|
||||
NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural')
|
||||
NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular')
|
||||
NISp = translate('OpenLP.Ui', 'No Items Selected', 'Plural')
|
||||
OLPV1 = translate('OpenLP.Ui', 'openlp.org 1.x')
|
||||
OLPV2 = translate('OpenLP.Ui', 'OpenLP 2.0')
|
||||
OpenService = translate('OpenLP.Ui', 'Open Service')
|
||||
Preview = translate('OpenLP.Ui', 'Preview')
|
||||
PreviewPanel = translate('OpenLP.Ui', 'Preview Panel')
|
||||
PrintServiceOrder = translate('OpenLP.Ui', 'Print Service Order')
|
||||
ReplaceBG = translate('OpenLP.Ui', 'Replace Background')
|
||||
ReplaceLiveBG = translate('OpenLP.Ui', 'Replace Live Background')
|
||||
ResetBG = translate('OpenLP.Ui', 'Reset Background')
|
||||
ResetLiveBG = translate('OpenLP.Ui', 'Reset Live Background')
|
||||
S = translate('OpenLP.Ui', 's', 'The abbreviated unit for seconds')
|
||||
SaveAndPreview = translate('OpenLP.Ui', 'Save && Preview')
|
||||
Search = translate('OpenLP.Ui', 'Search')
|
||||
SelectDelete = translate('OpenLP.Ui', 'You must select an item to delete.')
|
||||
SelectEdit = translate('OpenLP.Ui', 'You must select an item to edit.')
|
||||
SaveService = translate('OpenLP.Ui', 'Save Service')
|
||||
Service = translate('OpenLP.Ui', 'Service')
|
||||
StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s'))
|
||||
Theme = translate('OpenLP.Ui', 'Theme')
|
||||
Themes = translate('OpenLP.Ui', 'Themes')
|
||||
Theme = translate('OpenLP.Ui', 'Theme', 'Singular')
|
||||
Themes = translate('OpenLP.Ui', 'Themes', 'Plural')
|
||||
Top = translate('OpenLP.Ui', 'Top')
|
||||
Version = translate('OpenLP.Ui', 'Version')
|
||||
|
||||
def add_welcome_page(parent, image):
|
||||
"""
|
||||
@ -278,8 +305,8 @@ def create_valign_combo(form, parent, layout):
|
||||
verticalLabel.setText(translate('OpenLP.Ui', '&Vertical Align:'))
|
||||
form.verticalComboBox = QtGui.QComboBox(parent)
|
||||
form.verticalComboBox.setObjectName(u'VerticalComboBox')
|
||||
form.verticalComboBox.addItem(translate('OpenLP.Ui', 'Top'))
|
||||
form.verticalComboBox.addItem(translate('OpenLP.Ui', 'Middle'))
|
||||
form.verticalComboBox.addItem(translate('OpenLP.Ui', 'Bottom'))
|
||||
form.verticalComboBox.addItem(UiStrings.Top)
|
||||
form.verticalComboBox.addItem(UiStrings.Middle)
|
||||
form.verticalComboBox.addItem(UiStrings.Bottom)
|
||||
verticalLabel.setBuddy(form.verticalComboBox)
|
||||
layout.addRow(verticalLabel, form.verticalComboBox)
|
||||
|
@ -27,6 +27,7 @@
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import build_icon, translate
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
|
||||
class Ui_AboutDialog(object):
|
||||
def setupUi(self, aboutDialog):
|
||||
@ -86,8 +87,7 @@ class Ui_AboutDialog(object):
|
||||
QtCore.QMetaObject.connectSlotsByName(aboutDialog)
|
||||
|
||||
def retranslateUi(self, aboutDialog):
|
||||
aboutDialog.setWindowTitle(translate('OpenLP.AboutForm',
|
||||
'About OpenLP'))
|
||||
aboutDialog.setWindowTitle(u'%s OpenLP' % UiStrings.About)
|
||||
self.aboutTextEdit.setPlainText(translate('OpenLP.AboutForm',
|
||||
'OpenLP <version><revision> - Open Source Lyrics '
|
||||
'Projection\n'
|
||||
@ -105,8 +105,7 @@ class Ui_AboutDialog(object):
|
||||
'consider contributing by using the button below.'
|
||||
))
|
||||
self.aboutNotebook.setTabText(
|
||||
self.aboutNotebook.indexOf(self.aboutTab),
|
||||
translate('OpenLP.AboutForm', 'About'))
|
||||
self.aboutNotebook.indexOf(self.aboutTab), UiStrings.About)
|
||||
self.creditsTextEdit.setPlainText(translate('OpenLP.AboutForm',
|
||||
'Project Lead\n'
|
||||
' Raoul "superfly" Snyman\n'
|
||||
|
@ -135,7 +135,7 @@ class AdvancedTab(SettingsTab):
|
||||
# self.sharedCheckBox.setText(
|
||||
# translate('AdvancedTab', 'Enable a shared data location'))
|
||||
# self.sharedLabel.setText(translate('AdvancedTab', 'Store location:'))
|
||||
# self.sharedPushButton.setText(translate('AdvancedTab', 'Browse...'))
|
||||
# self.sharedPushButton.setText(UiStrings.Browse)
|
||||
# self.databaseGroupBox.setTitle(translate('AdvancedTab', 'Databases'))
|
||||
|
||||
def load(self):
|
||||
|
@ -167,7 +167,7 @@ class DisplayTagTab(SettingsTab):
|
||||
self.deletePushButton.setText(UiStrings.Delete)
|
||||
self.defaultPushButton.setText(
|
||||
translate('OpenLP.DisplayTagTab', 'Default'))
|
||||
self.newPushButton.setText(translate('OpenLP.DisplayTagTab', 'New'))
|
||||
self.newPushButton.setText(UiStrings.New)
|
||||
self.tagTableWidget.horizontalHeaderItem(0)\
|
||||
.setText(translate('OpenLP.DisplayTagTab', 'Description'))
|
||||
self.tagTableWidget.horizontalHeaderItem(1)\
|
||||
|
@ -35,24 +35,24 @@ from PyQt4 import Qt, QtCore, QtGui
|
||||
|
||||
try:
|
||||
from PyQt4.phonon import Phonon
|
||||
phonon_version = Phonon.phononVersion()
|
||||
PHONON_VERSION = Phonon.phononVersion()
|
||||
except ImportError:
|
||||
phonon_version = u'-'
|
||||
PHONON_VERSION = u'-'
|
||||
try:
|
||||
import chardet
|
||||
chardet_version = chardet.__version__
|
||||
CHARDET_VERSION = chardet.__version__
|
||||
except ImportError:
|
||||
chardet_version = u'-'
|
||||
CHARDET_VERSION = u'-'
|
||||
try:
|
||||
import enchant
|
||||
enchant_version = enchant.__version__
|
||||
ENCHANT_VERSION = enchant.__version__
|
||||
except ImportError:
|
||||
enchant_version = u'-'
|
||||
ENCHANT_VERSION = u'-'
|
||||
try:
|
||||
import sqlite
|
||||
sqlite_version = sqlite.version
|
||||
SQLITE_VERSION = sqlite.version
|
||||
except ImportError:
|
||||
sqlite_version = u'-'
|
||||
SQLITE_VERSION = u'-'
|
||||
|
||||
from openlp.core.lib import translate, SettingsManager
|
||||
from openlp.core.lib.mailto import mailto
|
||||
@ -85,14 +85,14 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
|
||||
'Platform: %s\n')) % platform.platform()
|
||||
libraries = u'Python: %s\n' % platform.python_version() + \
|
||||
u'Qt4: %s\n' % Qt.qVersion() + \
|
||||
u'Phonon: %s\n' % phonon_version + \
|
||||
u'Phonon: %s\n' % PHONON_VERSION + \
|
||||
u'PyQt4: %s\n' % Qt.PYQT_VERSION_STR + \
|
||||
u'SQLAlchemy: %s\n' % sqlalchemy.__version__ + \
|
||||
u'BeautifulSoup: %s\n' % BeautifulSoup.__version__ + \
|
||||
u'lxml: %s\n' % etree.__version__ + \
|
||||
u'Chardet: %s\n' % chardet_version + \
|
||||
u'PyEnchant: %s\n' % enchant_version + \
|
||||
u'PySQLite: %s\n' % sqlite_version
|
||||
u'Chardet: %s\n' % CHARDET_VERSION + \
|
||||
u'PyEnchant: %s\n' % ENCHANT_VERSION + \
|
||||
u'PySQLite: %s\n' % SQLITE_VERSION
|
||||
if platform.system() == u'Linux':
|
||||
if os.environ.get(u'KDE_FULL_SESSION') == u'true':
|
||||
system = system + u'Desktop: KDE SC\n'
|
||||
|
@ -28,6 +28,7 @@ import logging
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import SettingsTab, Receiver, translate
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -267,8 +268,7 @@ class GeneralTab(SettingsTab):
|
||||
translate('OpenLP.GeneralTab', ' sec'))
|
||||
self.ccliGroupBox.setTitle(
|
||||
translate('OpenLP.GeneralTab', 'CCLI Details'))
|
||||
self.numberLabel.setText(
|
||||
translate('OpenLP.GeneralTab', 'CCLI number:'))
|
||||
self.numberLabel.setText(UiStrings.CCLINumberLabel)
|
||||
self.usernameLabel.setText(
|
||||
translate('OpenLP.GeneralTab', 'SongSelect username:'))
|
||||
self.passwordLabel.setText(
|
||||
|
@ -73,15 +73,15 @@ class Ui_MainWindow(object):
|
||||
# Set up the main container, which contains all the other form widgets.
|
||||
self.MainContent = QtGui.QWidget(mainWindow)
|
||||
self.MainContent.setObjectName(u'MainContent')
|
||||
self.MainContentLayout = QtGui.QHBoxLayout(self.MainContent)
|
||||
self.MainContentLayout.setSpacing(0)
|
||||
self.MainContentLayout.setMargin(0)
|
||||
self.MainContentLayout.setObjectName(u'MainContentLayout')
|
||||
self.mainContentLayout = QtGui.QHBoxLayout(self.MainContent)
|
||||
self.mainContentLayout.setSpacing(0)
|
||||
self.mainContentLayout.setMargin(0)
|
||||
self.mainContentLayout.setObjectName(u'mainContentLayout')
|
||||
mainWindow.setCentralWidget(self.MainContent)
|
||||
self.controlSplitter = QtGui.QSplitter(self.MainContent)
|
||||
self.controlSplitter.setOrientation(QtCore.Qt.Horizontal)
|
||||
self.controlSplitter.setObjectName(u'controlSplitter')
|
||||
self.MainContentLayout.addWidget(self.controlSplitter)
|
||||
self.mainContentLayout.addWidget(self.controlSplitter)
|
||||
# Create slide controllers
|
||||
self.previewController = SlideController(self, self.settingsmanager,
|
||||
self.screens)
|
||||
@ -152,10 +152,10 @@ class Ui_MainWindow(object):
|
||||
u'themeManagerDock', u':/system/system_thememanager.png')
|
||||
self.themeManagerDock.setMinimumWidth(
|
||||
self.settingsmanager.mainwindow_right)
|
||||
self.ThemeManagerContents = ThemeManager(mainWindow,
|
||||
self.themeManagerContents = ThemeManager(mainWindow,
|
||||
self.themeManagerDock)
|
||||
self.ThemeManagerContents.setObjectName(u'ThemeManagerContents')
|
||||
self.themeManagerDock.setWidget(self.ThemeManagerContents)
|
||||
self.themeManagerContents.setObjectName(u'themeManagerContents')
|
||||
self.themeManagerDock.setWidget(self.themeManagerContents)
|
||||
mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea,
|
||||
self.themeManagerDock)
|
||||
# Create the menu items
|
||||
@ -256,8 +256,8 @@ class Ui_MainWindow(object):
|
||||
self.HelpOnlineHelpItem = base_action(mainWindow, u'HelpOnlineHelpItem')
|
||||
self.HelpOnlineHelpItem.setEnabled(False)
|
||||
mainWindow.actionList.add_action(self.HelpOnlineHelpItem, u'Help')
|
||||
self.HelpWebSiteItem = base_action(mainWindow, u'HelpWebSiteItem')
|
||||
mainWindow.actionList.add_action(self.HelpWebSiteItem, u'Help')
|
||||
self.helpWebSiteItem = base_action(mainWindow, u'helpWebSiteItem')
|
||||
mainWindow.actionList.add_action(self.helpWebSiteItem, u'Help')
|
||||
add_actions(self.FileImportMenu,
|
||||
(self.ImportThemeItem, self.ImportLanguageItem))
|
||||
add_actions(self.FileExportMenu,
|
||||
@ -281,7 +281,7 @@ class Ui_MainWindow(object):
|
||||
add_actions(self.ToolsMenu, (self.ToolsAddToolItem, None))
|
||||
add_actions(self.ToolsMenu, (self.ToolsOpenDataFolder, None))
|
||||
add_actions(self.HelpMenu, (self.HelpDocumentationItem,
|
||||
self.HelpOnlineHelpItem, None, self.HelpWebSiteItem,
|
||||
self.HelpOnlineHelpItem, None, self.helpWebSiteItem,
|
||||
self.HelpAboutItem))
|
||||
add_actions(self.MenuBar, (self.FileMenu.menuAction(),
|
||||
self.viewMenu.menuAction(), self.ToolsMenu.menuAction(),
|
||||
@ -340,8 +340,7 @@ class Ui_MainWindow(object):
|
||||
'Save the current service under a new name.'))
|
||||
self.FileSaveAsItem.setShortcut(
|
||||
translate('OpenLP.MainWindow', 'Ctrl+Shift+S'))
|
||||
self.printServiceOrderItem.setText(
|
||||
translate('OpenLP.MainWindow', 'Print Service Order'))
|
||||
self.printServiceOrderItem.setText(UiStrings.PrintServiceOrder)
|
||||
self.printServiceOrderItem.setStatusTip(translate('OpenLP.MainWindow',
|
||||
'Print the current Service Order.'))
|
||||
self.printServiceOrderItem.setShortcut(
|
||||
@ -419,7 +418,7 @@ class Ui_MainWindow(object):
|
||||
translate('OpenLP.MainWindow', 'Ctrl+F1'))
|
||||
self.HelpOnlineHelpItem.setText(
|
||||
translate('OpenLP.MainWindow', '&Online Help'))
|
||||
self.HelpWebSiteItem.setText(
|
||||
self.helpWebSiteItem.setText(
|
||||
translate('OpenLP.MainWindow', '&Web Site'))
|
||||
self.AutoLanguageItem.setText(
|
||||
translate('OpenLP.MainWindow', '&Auto Detect'))
|
||||
@ -492,10 +491,10 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
# Set up signals and slots
|
||||
QtCore.QObject.connect(self.ImportThemeItem,
|
||||
QtCore.SIGNAL(u'triggered()'),
|
||||
self.ThemeManagerContents.onImportTheme)
|
||||
self.themeManagerContents.onImportTheme)
|
||||
QtCore.QObject.connect(self.ExportThemeItem,
|
||||
QtCore.SIGNAL(u'triggered()'),
|
||||
self.ThemeManagerContents.onExportTheme)
|
||||
self.themeManagerContents.onExportTheme)
|
||||
QtCore.QObject.connect(self.ViewMediaManagerItem,
|
||||
QtCore.SIGNAL(u'triggered(bool)'), self.toggleMediaManager)
|
||||
QtCore.QObject.connect(self.ViewServiceManagerItem,
|
||||
@ -515,7 +514,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
QtCore.QObject.connect(self.themeManagerDock,
|
||||
QtCore.SIGNAL(u'visibilityChanged(bool)'),
|
||||
self.ViewThemeManagerItem.setChecked)
|
||||
QtCore.QObject.connect(self.HelpWebSiteItem,
|
||||
QtCore.QObject.connect(self.helpWebSiteItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onHelpWebSiteClicked)
|
||||
QtCore.QObject.connect(self.HelpAboutItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onHelpAboutItemClicked)
|
||||
@ -574,7 +573,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
# RenderManager needs to call ThemeManager and
|
||||
# ThemeManager needs to call RenderManager
|
||||
self.renderManager = RenderManager(
|
||||
self.ThemeManagerContents, self.screens)
|
||||
self.themeManagerContents, self.screens)
|
||||
# Define the media Dock Manager
|
||||
self.mediaDockManager = MediaDockManager(self.MediaToolBox)
|
||||
log.info(u'Load Plugins')
|
||||
@ -608,7 +607,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||
self.pluginManager.initialise_plugins()
|
||||
# Once all components are initialised load the Themes
|
||||
log.info(u'Load Themes')
|
||||
self.ThemeManagerContents.loadThemes()
|
||||
self.themeManagerContents.loadThemes()
|
||||
log.info(u'Load data from Settings')
|
||||
if QtCore.QSettings().value(u'advanced/save current plugin',
|
||||
QtCore.QVariant(False)).toBool():
|
||||
|
@ -25,7 +25,9 @@
|
||||
###############################################################################
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
|
||||
class Ui_PluginViewDialog(object):
|
||||
def setupUi(self, pluginViewDialog):
|
||||
@ -76,10 +78,8 @@ class Ui_PluginViewDialog(object):
|
||||
translate('OpenLP.PluginForm', 'Plugin List'))
|
||||
self.pluginInfoGroupBox.setTitle(
|
||||
translate('OpenLP.PluginForm', 'Plugin Details'))
|
||||
self.versionLabel.setText(
|
||||
translate('OpenLP.PluginForm', 'Version:'))
|
||||
self.aboutLabel.setText(
|
||||
translate('OpenLP.PluginForm', 'About:'))
|
||||
self.versionLabel.setText(u'%s:' % UiStrings.Version)
|
||||
self.aboutLabel.setText(u'%s:' % UiStrings.About)
|
||||
self.statusLabel.setText(
|
||||
translate('OpenLP.PluginForm', 'Status:'))
|
||||
self.statusComboBox.setItemText(0,
|
||||
|
@ -28,7 +28,7 @@ import logging
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import PluginStatus, Receiver, StringContent, translate
|
||||
from openlp.core.lib import PluginStatus, Receiver, translate
|
||||
from plugindialog import Ui_PluginViewDialog
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -80,15 +80,14 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
|
||||
# PluginStatus.Inactive
|
||||
status_text = unicode(
|
||||
translate('OpenLP.PluginForm', '%s (Inactive)'))
|
||||
name_string = plugin.getString(StringContent.Name)
|
||||
item.setText(status_text % name_string[u'singular'])
|
||||
item.setText(status_text % plugin.nameStrings[u'singular'])
|
||||
# If the plugin has an icon, set it!
|
||||
if plugin.icon:
|
||||
item.setIcon(plugin.icon)
|
||||
self.pluginListWidget.addItem(item)
|
||||
pluginListWidth = max(pluginListWidth, self.fontMetrics().width(
|
||||
unicode(translate('OpenLP.PluginForm', '%s (Inactive)')) %
|
||||
name_string[u'singular']))
|
||||
plugin.nameStrings[u'singular']))
|
||||
self.pluginListWidget.setFixedWidth(pluginListWidth +
|
||||
self.pluginListWidget.iconSize().width() + 48)
|
||||
|
||||
@ -118,8 +117,7 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
|
||||
self.pluginListWidget.currentItem().text().split(u' ')[0]
|
||||
self.activePlugin = None
|
||||
for plugin in self.parent.pluginManager.plugins:
|
||||
name_string = plugin.getString(StringContent.Name)
|
||||
if name_string[u'singular'] == plugin_name_singular:
|
||||
if plugin.nameStrings[u'singular'] == plugin_name_singular:
|
||||
self.activePlugin = plugin
|
||||
break
|
||||
if self.activePlugin:
|
||||
@ -147,6 +145,5 @@ class PluginForm(QtGui.QDialog, Ui_PluginViewDialog):
|
||||
elif self.activePlugin.status == PluginStatus.Disabled:
|
||||
status_text = unicode(
|
||||
translate('OpenLP.PluginForm', '%s (Disabled)'))
|
||||
name_string = self.activePlugin.getString(StringContent.Name)
|
||||
self.pluginListWidget.currentItem().setText(
|
||||
status_text % name_string[u'singular'])
|
||||
status_text % self.activePlugin.nameStrings[u'singular'])
|
||||
|
@ -27,6 +27,7 @@
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import build_icon, translate, SpellTextEdit
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
|
||||
class Ui_PrintServiceOrderDialog(object):
|
||||
def setupUi(self, printServiceOrderDialog):
|
||||
@ -116,8 +117,7 @@ class Ui_PrintServiceOrderDialog(object):
|
||||
QtCore.QMetaObject.connectSlotsByName(printServiceOrderDialog)
|
||||
|
||||
def retranslateUi(self, printServiceOrderDialog):
|
||||
printServiceOrderDialog.setWindowTitle(
|
||||
translate('OpenLP.PrintServiceOrderForm', 'Print Service Order'))
|
||||
printServiceOrderDialog.setWindowTitle(UiStrings.PrintServiceOrder)
|
||||
self.previewLabel.setText(
|
||||
translate('OpenLP.ServiceManager', '<b>Preview:</b>'))
|
||||
self.printSlideTextCheckBox.setText(translate(
|
||||
@ -132,6 +132,6 @@ class Ui_PrintServiceOrderDialog(object):
|
||||
self.serviceTitleLineEdit.setText(translate('OpenLP.ServiceManager',
|
||||
'Service Order Sheet'))
|
||||
self.printButton.setText(translate('OpenLP.ServiceManager', 'Print'))
|
||||
self.cancelButton.setText(translate('OpenLP.ServiceManager', 'Cancel'))
|
||||
self.cancelButton.setText(UiStrings.Cancel)
|
||||
self.customNotesLabel.setText(
|
||||
translate('OpenLP.ServiceManager', '<b>Custom Service Notes:</b>'))
|
||||
|
@ -71,7 +71,7 @@ class ScreenList(object):
|
||||
"""
|
||||
Set up the current screen dimensions
|
||||
"""
|
||||
log.debug(u'set_current_display %s', number, )
|
||||
log.debug(u'set_current_display %s', number)
|
||||
if number + 1 > self.display_count:
|
||||
self.current = self.screen_list[0]
|
||||
self.override = copy.deepcopy(self.current)
|
||||
|
@ -33,8 +33,8 @@ log = logging.getLogger(__name__)
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \
|
||||
Receiver, build_icon, ItemCapabilities, SettingsManager, translate, \
|
||||
ThemeLevel
|
||||
Receiver, build_icon, ItemCapabilities, SettingsManager, translate
|
||||
from openlp.core.lib.theme import ThemeLevel
|
||||
from openlp.core.lib.ui import UiStrings, critical_error_message_box
|
||||
from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm
|
||||
from openlp.core.ui.printserviceorderform import PrintServiceOrderForm
|
||||
@ -107,8 +107,7 @@ class ServiceManager(QtGui.QWidget):
|
||||
translate('OpenLP.ServiceManager', 'Save this service'),
|
||||
self.saveFile)
|
||||
self.toolbar.addSeparator()
|
||||
self.themeLabel = QtGui.QLabel(translate('OpenLP.ServiceManager',
|
||||
'Theme:'), self)
|
||||
self.themeLabel = QtGui.QLabel(u'%s:' % UiStrings.Theme, self)
|
||||
self.themeLabel.setMargin(3)
|
||||
self.themeLabel.setObjectName(u'themeLabel')
|
||||
self.toolbar.addToolbarWidget(u'ThemeLabel', self.themeLabel)
|
||||
@ -1062,8 +1061,8 @@ class ServiceManager(QtGui.QWidget):
|
||||
if self.serviceItems[item][u'service_item']\
|
||||
.is_capable(ItemCapabilities.AllowsEdit):
|
||||
Receiver.send_message(u'%s_edit' %
|
||||
self.serviceItems[item][u'service_item'].name.lower(), u'L:%s' %
|
||||
self.serviceItems[item][u'service_item'].edit_id )
|
||||
self.serviceItems[item][u'service_item'].name.lower(),
|
||||
u'L:%s' % self.serviceItems[item][u'service_item'].edit_id)
|
||||
|
||||
def findServiceItem(self):
|
||||
"""
|
||||
|
@ -101,7 +101,8 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog):
|
||||
else:
|
||||
shortcutText = action.shortcut().toString()
|
||||
alternateText = u''
|
||||
actionItem = QtGui.QTreeWidgetItem([actionText, shortcutText, alternateText])
|
||||
actionItem = QtGui.QTreeWidgetItem(
|
||||
[actionText, shortcutText, alternateText])
|
||||
actionItem.setIcon(0, action.icon())
|
||||
item.addChild(actionItem)
|
||||
item.setExpanded(True)
|
||||
|
@ -191,8 +191,7 @@ class SlideController(QtGui.QWidget):
|
||||
self.delaySpinBox.setMinimum(1)
|
||||
self.delaySpinBox.setMaximum(180)
|
||||
self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox)
|
||||
self.delaySpinBox.setSuffix(translate('OpenLP.SlideController',
|
||||
's'))
|
||||
self.delaySpinBox.setSuffix(UiStrings.S)
|
||||
self.delaySpinBox.setToolTip(translate('OpenLP.SlideController',
|
||||
'Delay between slides in seconds'))
|
||||
else:
|
||||
@ -603,14 +602,15 @@ class SlideController(QtGui.QWidget):
|
||||
slideHeight = 0
|
||||
if self.serviceItem.is_text():
|
||||
if frame[u'verseTag']:
|
||||
bits = frame[u'verseTag'].split(u':')
|
||||
tag = u'%s\n%s' % (bits[0][0], bits[1][0:] )
|
||||
tag1 = u'%s%s' % (bits[0][0], bits[1][0:] )
|
||||
row = tag
|
||||
# These tags are already translated.
|
||||
verse_def = frame[u'verseTag']
|
||||
verse_def = u'%s%s' % (verse_def[0].upper(), verse_def[1:])
|
||||
two_line_def = u'%s\n%s' % (verse_def[0], verse_def[1:])
|
||||
row = two_line_def
|
||||
if self.isLive:
|
||||
if tag1 not in self.slideList:
|
||||
self.slideList[tag1] = framenumber
|
||||
self.songMenu.menu().addAction(tag1,
|
||||
if verse_def not in self.slideList:
|
||||
self.slideList[verse_def] = framenumber
|
||||
self.songMenu.menu().addAction(verse_def,
|
||||
self.onSongBarHandler)
|
||||
else:
|
||||
row += 1
|
||||
|
@ -27,7 +27,7 @@
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.core.lib.ui import create_accept_reject_button_box
|
||||
from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box
|
||||
|
||||
class Ui_StartTimeDialog(object):
|
||||
def setupUi(self, StartTimeDialog):
|
||||
@ -65,6 +65,6 @@ class Ui_StartTimeDialog(object):
|
||||
self.hourLabel.setText(translate('OpenLP.StartTimeForm', 'Hours:'))
|
||||
self.hourSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 'h'))
|
||||
self.minuteSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 'm'))
|
||||
self.secondSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 's'))
|
||||
self.secondSpinBox.setSuffix(UiStrings.S)
|
||||
self.minuteLabel.setText(translate('OpenLP.StartTimeForm', 'Minutes:'))
|
||||
self.secondLabel.setText(translate('OpenLP.StartTimeForm', 'Seconds:'))
|
||||
|
@ -29,8 +29,8 @@ import os
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import translate, BackgroundType, BackgroundGradientType, \
|
||||
Receiver
|
||||
from openlp.core.lib import Receiver, translate
|
||||
from openlp.core.lib.theme import BackgroundType, BackgroundGradientType
|
||||
from openlp.core.lib.ui import UiStrings, critical_error_message_box
|
||||
from openlp.core.utils import get_images_filter
|
||||
from themewizard import Ui_ThemeWizard
|
||||
@ -204,7 +204,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
|
||||
# Do not trigger on start up
|
||||
if self.currentPage != self.welcomePage:
|
||||
self.updateTheme()
|
||||
frame = self.thememanager.generateImage(self.theme, True)
|
||||
self.thememanager.generateImage(self.theme, True)
|
||||
|
||||
def updateLinesText(self, lines):
|
||||
"""
|
||||
@ -301,7 +301,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
|
||||
'Edit Theme - %s')) % self.theme.theme_name)
|
||||
self.next()
|
||||
else:
|
||||
self.setWindowTitle(translate('OpenLP.ThemeWizard', 'New Theme'))
|
||||
self.setWindowTitle(UiStrings.NewTheme)
|
||||
return QtGui.QWizard.exec_(self)
|
||||
|
||||
def initializePage(self, id):
|
||||
|
@ -32,10 +32,11 @@ import logging
|
||||
from xml.etree.ElementTree import ElementTree, XML
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import OpenLPToolbar, ThemeXML, get_text_file_string, \
|
||||
build_icon, Receiver, SettingsManager, translate, check_item_selected, \
|
||||
BackgroundType, BackgroundGradientType, check_directory_exists, \
|
||||
VerticalType
|
||||
from openlp.core.lib import OpenLPToolbar, get_text_file_string, build_icon, \
|
||||
Receiver, SettingsManager, translate, check_item_selected, \
|
||||
check_directory_exists
|
||||
from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, \
|
||||
BackgroundGradientType
|
||||
from openlp.core.lib.ui import UiStrings, critical_error_message_box
|
||||
from openlp.core.theme import Theme
|
||||
from openlp.core.ui import FileRenameForm, ThemeForm
|
||||
@ -62,8 +63,7 @@ class ThemeManager(QtGui.QWidget):
|
||||
self.layout.setMargin(0)
|
||||
self.layout.setObjectName(u'layout')
|
||||
self.toolbar = OpenLPToolbar(self)
|
||||
self.toolbar.addToolbarButton(
|
||||
translate('OpenLP.ThemeManager', 'New Theme'),
|
||||
self.toolbar.addToolbarButton(UiStrings.NewTheme,
|
||||
u':/themes/theme_new.png',
|
||||
translate('OpenLP.ThemeManager', 'Create a new theme.'),
|
||||
self.onAddTheme)
|
||||
@ -529,6 +529,18 @@ class ThemeManager(QtGui.QWidget):
|
||||
else:
|
||||
outfile = open(fullpath, u'wb')
|
||||
outfile.write(zip.read(file))
|
||||
except (IOError, NameError):
|
||||
critical_error_message_box(
|
||||
translate('OpenLP.ThemeManager', 'Validation Error'),
|
||||
translate('OpenLP.ThemeManager', 'File is not a valid theme.'))
|
||||
log.exception(u'Importing theme from zip failed %s' % filename)
|
||||
finally:
|
||||
# Close the files, to be able to continue creating the theme.
|
||||
if zip:
|
||||
zip.close()
|
||||
if outfile:
|
||||
outfile.close()
|
||||
# As all files are closed, we can create the Theme.
|
||||
if filexml:
|
||||
theme = self._createThemeFromXml(filexml, self.path)
|
||||
self.generateAndSaveImage(dir, themename, theme)
|
||||
@ -539,17 +551,6 @@ class ThemeManager(QtGui.QWidget):
|
||||
'File is not a valid theme.'))
|
||||
log.exception(u'Theme file does not contain XML data %s' %
|
||||
filename)
|
||||
except (IOError, NameError):
|
||||
critical_error_message_box(
|
||||
translate('OpenLP.ThemeManager', 'Validation Error'),
|
||||
translate('OpenLP.ThemeManager',
|
||||
'File is not a valid theme.'))
|
||||
log.exception(u'Importing theme from zip failed %s' % filename)
|
||||
finally:
|
||||
if zip:
|
||||
zip.close()
|
||||
if outfile:
|
||||
outfile.close()
|
||||
|
||||
def checkIfThemeExists(self, themeName):
|
||||
"""
|
||||
|
@ -26,7 +26,8 @@
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import SettingsTab, Receiver, ThemeLevel, translate
|
||||
from openlp.core.lib import SettingsTab, Receiver, translate
|
||||
from openlp.core.lib.theme import ThemeLevel
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
|
||||
class ThemesTab(SettingsTab):
|
||||
@ -199,7 +200,7 @@ class ThemesTab(SettingsTab):
|
||||
"""
|
||||
Utility method to update the global theme preview image.
|
||||
"""
|
||||
image = self.parent.ThemeManagerContents.getPreviewImage(
|
||||
image = self.parent.themeManagerContents.getPreviewImage(
|
||||
self.global_theme)
|
||||
preview = QtGui.QPixmap(unicode(image))
|
||||
if not preview.isNull():
|
||||
|
@ -27,7 +27,9 @@
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import translate, build_icon
|
||||
from openlp.core.lib.ui import add_welcome_page, create_valign_combo
|
||||
from openlp.core.lib.theme import HorizontalType, BackgroundType, \
|
||||
BackgroundGradientType
|
||||
from openlp.core.lib.ui import UiStrings, add_welcome_page, create_valign_combo
|
||||
|
||||
class Ui_ThemeWizard(object):
|
||||
def setupUi(self, themeWizard):
|
||||
@ -417,12 +419,12 @@ class Ui_ThemeWizard(object):
|
||||
'according to the parameters below.'))
|
||||
self.backgroundLabel.setText(
|
||||
translate('OpenLP.ThemeWizard', 'Background type:'))
|
||||
self.backgroundComboBox.setItemText(0,
|
||||
self.backgroundComboBox.setItemText(BackgroundType.Solid,
|
||||
translate('OpenLP.ThemeWizard', 'Solid Color'))
|
||||
self.backgroundComboBox.setItemText(1,
|
||||
self.backgroundComboBox.setItemText(BackgroundType.Gradient,
|
||||
translate('OpenLP.ThemeWizard', 'Gradient'))
|
||||
self.backgroundComboBox.setItemText(2,
|
||||
translate('OpenLP.ThemeWizard', 'Image'))
|
||||
self.backgroundComboBox.setItemText(
|
||||
BackgroundType.Image, UiStrings.Image)
|
||||
self.colorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:'))
|
||||
self.gradientStartLabel.setText(
|
||||
translate(u'OpenLP.ThemeWizard', 'Starting color:'))
|
||||
@ -430,17 +432,17 @@ class Ui_ThemeWizard(object):
|
||||
translate(u'OpenLP.ThemeWizard', 'Ending color:'))
|
||||
self.gradientTypeLabel.setText(
|
||||
translate('OpenLP.ThemeWizard', 'Gradient:'))
|
||||
self.gradientComboBox.setItemText(0,
|
||||
self.gradientComboBox.setItemText(BackgroundGradientType.Horizontal,
|
||||
translate('OpenLP.ThemeWizard', 'Horizontal'))
|
||||
self.gradientComboBox.setItemText(1,
|
||||
self.gradientComboBox.setItemText(BackgroundGradientType.Vertical,
|
||||
translate('OpenLP.ThemeWizard', 'Vertical'))
|
||||
self.gradientComboBox.setItemText(2,
|
||||
self.gradientComboBox.setItemText(BackgroundGradientType.Circular,
|
||||
translate('OpenLP.ThemeWizard', 'Circular'))
|
||||
self.gradientComboBox.setItemText(3,
|
||||
self.gradientComboBox.setItemText(BackgroundGradientType.LeftTop,
|
||||
translate('OpenLP.ThemeWizard', 'Top Left - Bottom Right'))
|
||||
self.gradientComboBox.setItemText(4,
|
||||
self.gradientComboBox.setItemText(BackgroundGradientType.LeftBottom,
|
||||
translate('OpenLP.ThemeWizard', 'Bottom Left - Top Right'))
|
||||
self.imageLabel.setText(translate('OpenLP.ThemeWizard', 'Image:'))
|
||||
self.imageLabel.setText(u'%s:' % UiStrings.Image)
|
||||
self.mainAreaPage.setTitle(
|
||||
translate('OpenLP.ThemeWizard', 'Main Area Font Details'))
|
||||
self.mainAreaPage.setSubTitle(
|
||||
@ -449,17 +451,17 @@ class Ui_ThemeWizard(object):
|
||||
self.mainFontLabel.setText(translate('OpenLP.ThemeWizard', 'Font:'))
|
||||
self.mainColorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:'))
|
||||
self.mainSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:'))
|
||||
self.mainSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt'))
|
||||
self.mainSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit)
|
||||
self.lineSpacingLabel.setText(
|
||||
translate('OpenLP.ThemeWizard', 'Line Spacing:'))
|
||||
self.lineSpacingSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt'))
|
||||
self.lineSpacingSpinBox.setSuffix(UiStrings.FontSizePtUnit)
|
||||
self.outlineCheckBox.setText(
|
||||
translate('OpenLP.ThemeWizard', '&Outline:'))
|
||||
self.outlineSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:'))
|
||||
self.outlineSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt'))
|
||||
self.outlineSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit)
|
||||
self.shadowCheckBox.setText(translate('OpenLP.ThemeWizard', '&Shadow:'))
|
||||
self.shadowSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:'))
|
||||
self.shadowSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt'))
|
||||
self.shadowSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit)
|
||||
self.mainBoldCheckBox.setText(translate('OpenLP.ThemeWizard', 'Bold'))
|
||||
self.mainItalicsCheckBox.setText(
|
||||
translate('OpenLP.ThemeWizard', 'Italic'))
|
||||
@ -471,7 +473,7 @@ class Ui_ThemeWizard(object):
|
||||
self.footerFontLabel.setText(translate('OpenLP.ThemeWizard', 'Font:'))
|
||||
self.footerColorLabel.setText(translate('OpenLP.ThemeWizard', 'Color:'))
|
||||
self.footerSizeLabel.setText(translate('OpenLP.ThemeWizard', 'Size:'))
|
||||
self.footerSizeSpinBox.setSuffix(translate('OpenLP.ThemeWizard', 'pt'))
|
||||
self.footerSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit)
|
||||
self.alignmentPage.setTitle(
|
||||
translate('OpenLP.ThemeWizard', 'Text Formatting Details'))
|
||||
self.alignmentPage.setSubTitle(
|
||||
@ -479,11 +481,11 @@ class Ui_ThemeWizard(object):
|
||||
'formatting information to be defined'))
|
||||
self.horizontalLabel.setText(
|
||||
translate('OpenLP.ThemeWizard', 'Horizontal Align:'))
|
||||
self.horizontalComboBox.setItemText(0,
|
||||
self.horizontalComboBox.setItemText(HorizontalType.Left,
|
||||
translate('OpenLP.ThemeWizard', 'Left'))
|
||||
self.horizontalComboBox.setItemText(1,
|
||||
self.horizontalComboBox.setItemText(HorizontalType.Right,
|
||||
translate('OpenLP.ThemeWizard', 'Right'))
|
||||
self.horizontalComboBox.setItemText(2,
|
||||
self.horizontalComboBox.setItemText(HorizontalType.Center,
|
||||
translate('OpenLP.ThemeWizard', 'Center'))
|
||||
self.transitionsLabel.setText(
|
||||
translate('OpenLP.ThemeWizard', 'Transitions:'))
|
||||
|
@ -31,11 +31,50 @@ import os
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import build_icon, Receiver, SettingsManager
|
||||
from openlp.core.lib import build_icon, Receiver, SettingsManager, translate
|
||||
from openlp.core.lib.ui import UiStrings, add_welcome_page
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class WizardStrings(object):
|
||||
"""
|
||||
Provide standard strings for wizards to use.
|
||||
"""
|
||||
# Applications/Formats we import from or export to. These get used in
|
||||
# multiple places but do not need translating unless you find evidence of
|
||||
# the writers translating their own product name.
|
||||
CCLI = u'CCLI/SongSelect'
|
||||
CSV = u'CSV'
|
||||
EW = u'EasyWorship'
|
||||
ES = u'EasiSlides'
|
||||
OL = u'OpenLyrics'
|
||||
OS = u'OpenSong'
|
||||
OSIS = u'OSIS'
|
||||
SB = u'SongBeamer'
|
||||
SoF = u'Songs of Fellowship'
|
||||
SSP = u'SongShow Plus'
|
||||
WoW = u'Words of Worship'
|
||||
# These strings should need a good reason to be retranslated elsewhere.
|
||||
FinishedImport = translate('OpenLP.Ui', 'Finished import.')
|
||||
FormatLabel = translate('OpenLP.Ui', 'Format:')
|
||||
HeaderStyle = u'<span style="font-size:14pt; font-weight:600;">%s</span>'
|
||||
Importing = translate('OpenLP.Ui', 'Importing')
|
||||
ImportingType = unicode(translate('OpenLP.Ui', 'Importing "%s"...'))
|
||||
ImportSelect = translate('OpenLP.Ui', 'Select Import Source')
|
||||
ImportSelectLong = unicode(translate('OpenLP.Ui',
|
||||
'Select the import format and the location to import from.'))
|
||||
NoSqlite = translate('OpenLP.Ui', 'The openlp.org 1.x importer has been '
|
||||
'disabled due to a missing Python module. If you want to use this '
|
||||
'importer, you will need to install the "python-sqlite" '
|
||||
'module.')
|
||||
OpenTypeFile = unicode(translate('OpenLP.Ui', 'Open %s File'))
|
||||
PercentSymbolFormat = unicode(translate('OpenLP.Ui', '%p%'))
|
||||
Ready = translate('OpenLP.Ui', 'Ready.')
|
||||
StartingImport = translate('OpenLP.Ui', 'Starting import...')
|
||||
YouSpecifyFile = unicode(translate('OpenLP.Ui', 'You need to specify at '
|
||||
'least one %s file to import from.', 'A file type e.g. OpenSong'))
|
||||
|
||||
|
||||
class OpenLPWizard(QtGui.QWizard):
|
||||
"""
|
||||
Generic OpenLP wizard to provide generic functionality and a unified look
|
||||
@ -43,6 +82,7 @@ class OpenLPWizard(QtGui.QWizard):
|
||||
"""
|
||||
def __init__(self, parent, plugin, name, image):
|
||||
QtGui.QWizard.__init__(self, parent)
|
||||
self.plugin = plugin
|
||||
self.setObjectName(name)
|
||||
self.openIcon = build_icon(u':/general/general_open.png')
|
||||
self.deleteIcon = build_icon(u':/general/general_delete.png')
|
||||
@ -50,7 +90,6 @@ class OpenLPWizard(QtGui.QWizard):
|
||||
self.cancelButton = self.button(QtGui.QWizard.CancelButton)
|
||||
self.setupUi(image)
|
||||
self.registerFields()
|
||||
self.plugin = plugin
|
||||
self.customInit()
|
||||
self.customSignals()
|
||||
QtCore.QObject.connect(self, QtCore.SIGNAL(u'currentIdChanged(int)'),
|
||||
|
@ -109,12 +109,10 @@ class AlertsTab(SettingsTab):
|
||||
translate('AlertsPlugin.AlertsTab', 'Background color:'))
|
||||
self.FontSizeLabel.setText(
|
||||
translate('AlertsPlugin.AlertsTab', 'Font size:'))
|
||||
self.FontSizeSpinBox.setSuffix(
|
||||
translate('AlertsPlugin.AlertsTab', 'pt'))
|
||||
self.FontSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit)
|
||||
self.TimeoutLabel.setText(
|
||||
translate('AlertsPlugin.AlertsTab', 'Alert timeout:'))
|
||||
self.TimeoutSpinBox.setSuffix(
|
||||
translate('AlertsPlugin.AlertsTab', 's'))
|
||||
self.TimeoutSpinBox.setSuffix(UiStrings.S)
|
||||
self.PreviewGroupBox.setTitle(UiStrings.Preview)
|
||||
self.FontPreview.setText(UiStrings.OLPV2)
|
||||
|
||||
|
@ -35,8 +35,8 @@ from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import Receiver, translate
|
||||
from openlp.core.lib.db import delete_database
|
||||
from openlp.core.lib.ui import critical_error_message_box
|
||||
from openlp.core.ui.wizard import OpenLPWizard
|
||||
from openlp.core.lib.ui import UiStrings, critical_error_message_box
|
||||
from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
|
||||
from openlp.core.utils import AppLocation, string_is_unicode
|
||||
from openlp.plugins.bibles.lib.manager import BibleFormat
|
||||
|
||||
@ -51,18 +51,7 @@ class WebDownload(object):
|
||||
BibleGateway = 1
|
||||
Bibleserver = 2
|
||||
|
||||
Names = {
|
||||
0: u'Crosswalk',
|
||||
1: u'BibleGateway',
|
||||
2: u'Bibleserver'
|
||||
}
|
||||
|
||||
@classmethod
|
||||
def get_name(cls, name):
|
||||
"""
|
||||
Get the web bible type name.
|
||||
"""
|
||||
return cls.Names[name]
|
||||
Names = [u'Crosswalk', u'BibleGateway', u'Bibleserver']
|
||||
|
||||
|
||||
class BibleImportForm(OpenLPWizard):
|
||||
@ -363,32 +352,22 @@ class BibleImportForm(OpenLPWizard):
|
||||
"""
|
||||
self.setWindowTitle(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Bible Import Wizard'))
|
||||
self.titleLabel.setText(
|
||||
u'<span style="font-size:14pt; font-weight:600;">%s</span>' % \
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Welcome to the Bible Import Wizard'))
|
||||
self.titleLabel.setText(WizardStrings.HeaderStyle %
|
||||
translate('OpenLP.Ui', 'Welcome to the Bible Import Wizard'))
|
||||
self.informationLabel.setText(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'This wizard will help you to import Bibles from a '
|
||||
'variety of formats. Click the next button below to start the '
|
||||
'process by selecting a format to import from.'))
|
||||
self.selectPage.setTitle(translate('BiblesPlugin.ImportWizardForm',
|
||||
'Select Import Source'))
|
||||
self.selectPage.setSubTitle(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Select the import format, and where to import from.'))
|
||||
self.formatLabel.setText(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Format:'))
|
||||
self.formatComboBox.setItemText(0,
|
||||
translate('BiblesPlugin.ImportWizardForm', 'OSIS'))
|
||||
self.formatComboBox.setItemText(1,
|
||||
translate('BiblesPlugin.ImportWizardForm', 'CSV'))
|
||||
self.formatComboBox.setItemText(2,
|
||||
translate('BiblesPlugin.ImportWizardForm', 'OpenSong'))
|
||||
self.formatComboBox.setItemText(3,
|
||||
'This wizard will help you to import Bibles from a variety of '
|
||||
'formats. Click the next button below to start the process by '
|
||||
'selecting a format to import from.'))
|
||||
self.selectPage.setTitle(WizardStrings.ImportSelect)
|
||||
self.selectPage.setSubTitle(WizardStrings.ImportSelectLong)
|
||||
self.formatLabel.setText(WizardStrings.FormatLabel)
|
||||
self.formatComboBox.setItemText(BibleFormat.OSIS, WizardStrings.OSIS)
|
||||
self.formatComboBox.setItemText(BibleFormat.CSV, WizardStrings.CSV)
|
||||
self.formatComboBox.setItemText(BibleFormat.OpenSong, WizardStrings.OS)
|
||||
self.formatComboBox.setItemText(BibleFormat.WebDownload,
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Web Download'))
|
||||
self.formatComboBox.setItemText(4,
|
||||
translate('BiblesPlugin.ImportWizardForm', 'openlp.org 1.x'))
|
||||
self.formatComboBox.setItemText(BibleFormat.OpenLP1, UiStrings.OLPV1)
|
||||
self.openlp1FileLabel.setText(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Bible file:'))
|
||||
self.osisFileLabel.setText(
|
||||
@ -403,11 +382,11 @@ class BibleImportForm(OpenLPWizard):
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Bible file:'))
|
||||
self.webSourceLabel.setText(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Location:'))
|
||||
self.webSourceComboBox.setItemText(0,
|
||||
self.webSourceComboBox.setItemText(WebDownload.Crosswalk,
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Crosswalk'))
|
||||
self.webSourceComboBox.setItemText(1,
|
||||
self.webSourceComboBox.setItemText(WebDownload.BibleGateway,
|
||||
translate('BiblesPlugin.ImportWizardForm', 'BibleGateway'))
|
||||
self.webSourceComboBox.setItemText(2,
|
||||
self.webSourceComboBox.setItemText(WebDownload.Bibleserver,
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Bibleserver'))
|
||||
self.webTranslationLabel.setText(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Bible:'))
|
||||
@ -435,19 +414,13 @@ class BibleImportForm(OpenLPWizard):
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Copyright:'))
|
||||
self.permissionsLabel.setText(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Permissions:'))
|
||||
self.progressPage.setTitle(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Importing'))
|
||||
self.progressPage.setTitle(WizardStrings.Importing)
|
||||
self.progressPage.setSubTitle(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Please wait while your Bible is imported.'))
|
||||
self.progressLabel.setText(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Ready.'))
|
||||
self.progressLabel.setText(WizardStrings.Ready)
|
||||
self.progressBar.setFormat(u'%p%')
|
||||
self.openlp1DisabledLabel.setText(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'The openlp.org 1.x '
|
||||
'importer has been disabled due to a missing Python module. If '
|
||||
'you want to use this importer, you will need to install the '
|
||||
'"python-sqlite" module.'))
|
||||
self.openlp1DisabledLabel.setText(WizardStrings.NoSqlite)
|
||||
# Align all QFormLayouts towards each other.
|
||||
labelWidth = max(self.formatLabel.minimumSizeHint().width(),
|
||||
self.osisFileLabel.minimumSizeHint().width(),
|
||||
@ -468,37 +441,28 @@ class BibleImportForm(OpenLPWizard):
|
||||
elif self.currentPage() == self.selectPage:
|
||||
if self.field(u'source_format').toInt()[0] == BibleFormat.OSIS:
|
||||
if not self.field(u'osis_location').toString():
|
||||
critical_error_message_box(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Invalid Bible Location'),
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'You need to specify a file to import your '
|
||||
'Bible from.'))
|
||||
critical_error_message_box(UiStrings.NFSs,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.OSIS)
|
||||
self.osisFileEdit.setFocus()
|
||||
return False
|
||||
elif self.field(u'source_format').toInt()[0] == BibleFormat.CSV:
|
||||
if not self.field(u'csv_testamentsfile').toString():
|
||||
answer = critical_error_message_box(translate(
|
||||
'BiblesPlugin.ImportWizardForm', 'No Testaments File'),
|
||||
answer = critical_error_message_box(UiStrings.NFSs,
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'You have not specified a testaments file. Do you '
|
||||
'want to proceed with the import?'), question=True)
|
||||
if answer == QtGui.QMessageBox.No:
|
||||
self.csvTestamentsEdit.setFocus()
|
||||
return False
|
||||
elif not self.field(u'csv_booksfile').toString():
|
||||
critical_error_message_box(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Invalid Books File'),
|
||||
if not self.field(u'csv_booksfile').toString():
|
||||
critical_error_message_box(UiStrings.NFSs,
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'You need to specify a file with books of '
|
||||
'the Bible to use in the import.'))
|
||||
self.csvBooksEdit.setFocus()
|
||||
return False
|
||||
elif not self.field(u'csv_versefile').toString():
|
||||
critical_error_message_box(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Invalid Verse File'),
|
||||
critical_error_message_box(UiStrings.NFSs,
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'You need to specify a file of Bible '
|
||||
'verses to import.'))
|
||||
@ -507,22 +471,14 @@ class BibleImportForm(OpenLPWizard):
|
||||
elif self.field(u'source_format').toInt()[0] == \
|
||||
BibleFormat.OpenSong:
|
||||
if not self.field(u'opensong_file').toString():
|
||||
critical_error_message_box(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Invalid OpenSong Bible'),
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'You need to specify an OpenSong Bible '
|
||||
'file to import.'))
|
||||
critical_error_message_box(UiStrings.NFSs,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.OS)
|
||||
self.openSongFileEdit.setFocus()
|
||||
return False
|
||||
elif self.field(u'source_format').toInt()[0] == BibleFormat.OpenLP1:
|
||||
if not self.field(u'openlp1_location').toString():
|
||||
critical_error_message_box(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Invalid Bible Location'),
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'You need to specify a file to import your '
|
||||
'Bible from.'))
|
||||
critical_error_message_box(UiStrings.NFSs,
|
||||
WizardStrings.YouSpecifyFile % UiStrings.OLPV1)
|
||||
self.openlp1FileEdit.setFocus()
|
||||
return False
|
||||
return True
|
||||
@ -531,17 +487,13 @@ class BibleImportForm(OpenLPWizard):
|
||||
license_copyright = \
|
||||
unicode(self.field(u'license_copyright').toString())
|
||||
if not license_version:
|
||||
critical_error_message_box(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Empty Version Name'),
|
||||
critical_error_message_box(UiStrings.EmptyField,
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'You need to specify a version name for your Bible.'))
|
||||
self.versionNameEdit.setFocus()
|
||||
return False
|
||||
elif not license_copyright:
|
||||
critical_error_message_box(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Empty Copyright'),
|
||||
critical_error_message_box(UiStrings.EmptyField,
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'You need to set a copyright for your Bible. '
|
||||
'Bibles in the Public Domain need to be marked as such.'))
|
||||
@ -576,24 +528,22 @@ class BibleImportForm(OpenLPWizard):
|
||||
"""
|
||||
Show the file open dialog for the OSIS file.
|
||||
"""
|
||||
self.getFileName(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Open OSIS File'),
|
||||
self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.OSIS,
|
||||
self.osisFileEdit)
|
||||
|
||||
def onCsvTestamentsBrowseButtonClicked(self):
|
||||
"""
|
||||
Show the file open dialog for the testaments CSV file.
|
||||
"""
|
||||
self.getFileName(translate('BiblesPlugin.ImportWizardForm',
|
||||
'Open Testaments CSV File'), self.csvTestamentsEdit, u'%s (*.csv)'
|
||||
self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.CSV,
|
||||
self.csvTestamentsEdit, u'%s (*.csv)'
|
||||
% translate('BiblesPlugin.ImportWizardForm', 'CSV File'))
|
||||
|
||||
def onCsvBooksBrowseButtonClicked(self):
|
||||
"""
|
||||
Show the file open dialog for the books CSV file.
|
||||
"""
|
||||
self.getFileName(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Open Books CSV File'),
|
||||
self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.CSV,
|
||||
self.csvBooksEdit, u'%s (*.csv)'
|
||||
% translate('BiblesPlugin.ImportWizardForm', 'CSV File'))
|
||||
|
||||
@ -601,27 +551,24 @@ class BibleImportForm(OpenLPWizard):
|
||||
"""
|
||||
Show the file open dialog for the verses CSV file.
|
||||
"""
|
||||
self.getFileName(translate('BiblesPlugin.ImportWizardForm',
|
||||
'Open Verses CSV File'), self.csvVersesEdit, u'%s (*.csv)'
|
||||
self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.CSV,
|
||||
self.csvVersesEdit, u'%s (*.csv)'
|
||||
% translate('BiblesPlugin.ImportWizardForm', 'CSV File'))
|
||||
|
||||
def onOpenSongBrowseButtonClicked(self):
|
||||
"""
|
||||
Show the file open dialog for the OpenSong file.
|
||||
"""
|
||||
self.getFileName(
|
||||
translate('BiblesPlugin.ImportWizardForm', 'Open OpenSong Bible'),
|
||||
self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.OS,
|
||||
self.openSongFileEdit)
|
||||
|
||||
def onOpenlp1BrowseButtonClicked(self):
|
||||
"""
|
||||
Show the file open dialog for the openlp.org 1.x file.
|
||||
"""
|
||||
self.getFileName(
|
||||
translate('BiblesPlugin.ImportWizardForm',
|
||||
'Open openlp.org 1.x Bible'), self.openlp1FileEdit,
|
||||
u'%s (*.bible)' % translate('BiblesPlugin.ImportWizardForm',
|
||||
'openlp.org 1.x bible'))
|
||||
self.getFileName(WizardStrings.OpenTypeFile % UiStrings.OLPV1,
|
||||
self.openlp1FileEdit, u'%s (*.bible)' %
|
||||
translate('BiblesPlugin.ImportWizardForm', 'openlp.org 1.x bible'))
|
||||
|
||||
def registerFields(self):
|
||||
"""
|
||||
@ -722,7 +669,7 @@ class BibleImportForm(OpenLPWizard):
|
||||
self.web_bible_list[download_type][ver] = name.strip()
|
||||
except IOError:
|
||||
log.exception(u'%s resources missing' %
|
||||
WebDownload.get_name(download_type))
|
||||
WebDownload.Names[download_type])
|
||||
finally:
|
||||
if books_file:
|
||||
books_file.close()
|
||||
@ -738,8 +685,7 @@ class BibleImportForm(OpenLPWizard):
|
||||
'BiblesPlugin.ImportWizardForm',
|
||||
'Starting Registering bible...'))
|
||||
else:
|
||||
self.progressLabel.setText(translate(
|
||||
'BiblesPlugin.ImportWizardForm', 'Starting import...'))
|
||||
self.progressLabel.setText(WizardStrings.StartingImport)
|
||||
Receiver.send_message(u'openlp_process_events')
|
||||
|
||||
def performWizard(self):
|
||||
@ -777,18 +723,10 @@ class BibleImportForm(OpenLPWizard):
|
||||
self.progressBar.setMaximum(1)
|
||||
download_location = self.field(u'web_location').toInt()[0]
|
||||
bible_version = unicode(self.webTranslationComboBox.currentText())
|
||||
if download_location == WebDownload.Crosswalk:
|
||||
bible = \
|
||||
self.web_bible_list[WebDownload.Crosswalk][bible_version]
|
||||
elif download_location == WebDownload.BibleGateway:
|
||||
bible = \
|
||||
self.web_bible_list[WebDownload.BibleGateway][bible_version]
|
||||
elif download_location == WebDownload.Bibleserver:
|
||||
bible = \
|
||||
self.web_bible_list[WebDownload.Bibleserver][bible_version]
|
||||
bible = self.web_bible_list[download_location][bible_version]
|
||||
importer = self.manager.import_bible(
|
||||
BibleFormat.WebDownload, name=license_version,
|
||||
download_source=WebDownload.get_name(download_location),
|
||||
download_source=WebDownload.Names[download_location],
|
||||
download_name=bible,
|
||||
proxy_server=unicode(self.field(u'proxy_server').toString()),
|
||||
proxy_username=\
|
||||
@ -811,8 +749,7 @@ class BibleImportForm(OpenLPWizard):
|
||||
'bible. Please note, that verses will be downloaded on\n'
|
||||
'demand and thus an internet connection is required.'))
|
||||
else:
|
||||
self.progressLabel.setText(translate(
|
||||
'BiblesPlugin.ImportWizardForm', 'Finished import.'))
|
||||
self.progressLabel.setText(WizardStrings.FinishedImport)
|
||||
else:
|
||||
self.progressLabel.setText(translate(
|
||||
'BiblesPlugin.ImportWizardForm', 'Your Bible import failed.'))
|
||||
|
@ -32,6 +32,25 @@ import re
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class LayoutStyle(object):
|
||||
"""
|
||||
An enumeration for bible screen layout styles.
|
||||
"""
|
||||
VersePerSlide = 0
|
||||
VersePerLine = 1
|
||||
Continuous = 2
|
||||
|
||||
|
||||
class DisplayStyle(object):
|
||||
"""
|
||||
An enumeration for bible text bracket display styles.
|
||||
"""
|
||||
NoBrackets = 0
|
||||
Round = 1
|
||||
Curly = 2
|
||||
Square = 3
|
||||
|
||||
|
||||
def get_reference_match(match_type):
|
||||
"""
|
||||
Provides the regexes and matches to use while parsing strings for bible
|
||||
|
@ -29,6 +29,7 @@ import logging
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import Receiver, SettingsTab, translate
|
||||
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -122,19 +123,19 @@ class BiblesTab(SettingsTab):
|
||||
translate('BiblesPlugin.BiblesTab', 'Display style:'))
|
||||
self.BibleThemeLabel.setText(
|
||||
translate('BiblesPlugin.BiblesTab', 'Bible theme:'))
|
||||
self.LayoutStyleComboBox.setItemText(0,
|
||||
self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerSlide,
|
||||
translate('BiblesPlugin.BiblesTab', 'Verse Per Slide'))
|
||||
self.LayoutStyleComboBox.setItemText(1,
|
||||
self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerLine,
|
||||
translate('BiblesPlugin.BiblesTab', 'Verse Per Line'))
|
||||
self.LayoutStyleComboBox.setItemText(2,
|
||||
self.LayoutStyleComboBox.setItemText(LayoutStyle.Continuous,
|
||||
translate('BiblesPlugin.BiblesTab', 'Continuous'))
|
||||
self.DisplayStyleComboBox.setItemText(0,
|
||||
self.DisplayStyleComboBox.setItemText(DisplayStyle.NoBrackets,
|
||||
translate('BiblesPlugin.BiblesTab', 'No Brackets'))
|
||||
self.DisplayStyleComboBox.setItemText(1,
|
||||
self.DisplayStyleComboBox.setItemText(DisplayStyle.Round,
|
||||
translate('BiblesPlugin.BiblesTab', '( And )'))
|
||||
self.DisplayStyleComboBox.setItemText(2,
|
||||
self.DisplayStyleComboBox.setItemText(DisplayStyle.Curly,
|
||||
translate('BiblesPlugin.BiblesTab', '{ And }'))
|
||||
self.DisplayStyleComboBox.setItemText(3,
|
||||
self.DisplayStyleComboBox.setItemText(DisplayStyle.Square,
|
||||
translate('BiblesPlugin.BiblesTab', '[ And ]'))
|
||||
self.ChangeNoteLabel.setText(translate('BiblesPlugin.BiblesTab',
|
||||
'Note:\nChanges do not affect verses already in the service.'))
|
||||
|
@ -34,7 +34,8 @@ from openlp.core.lib.searchedit import SearchEdit
|
||||
from openlp.core.lib.ui import UiStrings, add_widget_completer, \
|
||||
media_item_combo_box, critical_error_message_box
|
||||
from openlp.plugins.bibles.forms import BibleImportForm
|
||||
from openlp.plugins.bibles.lib import get_reference_match
|
||||
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \
|
||||
get_reference_match
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -56,6 +57,7 @@ class BibleMediaItem(MediaManagerItem):
|
||||
self.IconPath = u'songs/song'
|
||||
MediaManagerItem.__init__(self, parent, plugin, icon)
|
||||
# Place to store the search results for both bibles.
|
||||
self.settings = self.parent.settings_tab
|
||||
self.search_results = {}
|
||||
self.second_search_results = {}
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
@ -235,18 +237,15 @@ class BibleMediaItem(MediaManagerItem):
|
||||
|
||||
def retranslateUi(self):
|
||||
log.debug(u'retranslateUi')
|
||||
self.quickVersionLabel.setText(
|
||||
translate('BiblesPlugin.MediaItem', 'Version:'))
|
||||
self.quickVersionLabel.setText(u'%s:' % UiStrings.Version)
|
||||
self.quickSecondLabel.setText(
|
||||
translate('BiblesPlugin.MediaItem', 'Second:'))
|
||||
self.quickSearchLabel.setText(
|
||||
translate('BiblesPlugin.MediaItem', 'Find:'))
|
||||
self.quickSearchButton.setText(
|
||||
translate('BiblesPlugin.MediaItem', 'Search'))
|
||||
self.quickSearchButton.setText(UiStrings.Search)
|
||||
self.quickClearLabel.setText(
|
||||
translate('BiblesPlugin.MediaItem', 'Results:'))
|
||||
self.advancedVersionLabel.setText(
|
||||
translate('BiblesPlugin.MediaItem', 'Version:'))
|
||||
self.advancedVersionLabel.setText(u'%s:' % UiStrings.Version)
|
||||
self.advancedSecondLabel.setText(
|
||||
translate('BiblesPlugin.MediaItem', 'Second:'))
|
||||
self.advancedBookLabel.setText(
|
||||
@ -261,8 +260,7 @@ class BibleMediaItem(MediaManagerItem):
|
||||
translate('BiblesPlugin.MediaItem', 'To:'))
|
||||
self.advancedClearLabel.setText(
|
||||
translate('BiblesPlugin.MediaItem', 'Results:'))
|
||||
self.advancedSearchButton.setText(
|
||||
translate('BiblesPlugin.MediaItem', 'Search'))
|
||||
self.advancedSearchButton.setText(UiStrings.Search)
|
||||
self.quickClearComboBox.addItem(
|
||||
translate('BiblesPlugin.MediaItem', 'Clear'))
|
||||
self.quickClearComboBox.addItem(
|
||||
@ -670,12 +668,12 @@ class BibleMediaItem(MediaManagerItem):
|
||||
raw_slides.append(bible_text.rstrip())
|
||||
bible_text = u''
|
||||
# If we are 'Verse Per Slide' then create a new slide.
|
||||
elif self.parent.settings_tab.layout_style == 0:
|
||||
elif self.settings.layout_style == LayoutStyle.VersePerSlide:
|
||||
bible_text = u'%s %s' % (verse_text, text)
|
||||
raw_slides.append(bible_text.rstrip())
|
||||
bible_text = u''
|
||||
# If we are 'Verse Per Line' then force a new line.
|
||||
elif self.parent.settings_tab.layout_style == 1:
|
||||
elif self.settings.layout_style == LayoutStyle.VersePerLine:
|
||||
bible_text = u'%s %s %s\n' % (bible_text, verse_text, text)
|
||||
# We have to be 'Continuous'.
|
||||
else:
|
||||
@ -693,7 +691,8 @@ class BibleMediaItem(MediaManagerItem):
|
||||
raw_slides.append(bible_text.lstrip())
|
||||
bible_text = u''
|
||||
# Service Item: Capabilities
|
||||
if self.parent.settings_tab.layout_style == 2 and not second_bible:
|
||||
if self.settings.layout_style == LayoutStyle.Continuous and \
|
||||
not second_bible:
|
||||
# Split the line but do not replace line breaks in renderer.
|
||||
service_item.add_capability(ItemCapabilities.NoLineBreaks)
|
||||
service_item.add_capability(ItemCapabilities.AllowsPreview)
|
||||
@ -705,10 +704,10 @@ class BibleMediaItem(MediaManagerItem):
|
||||
else:
|
||||
service_item.title += u', ' + title
|
||||
# Service Item: Theme
|
||||
if len(self.parent.settings_tab.bible_theme) == 0:
|
||||
if len(self.settings.bible_theme) == 0:
|
||||
service_item.theme = None
|
||||
else:
|
||||
service_item.theme = self.parent.settings_tab.bible_theme
|
||||
service_item.theme = self.settings.bible_theme
|
||||
for slide in raw_slides:
|
||||
service_item.add_from_text(slide[:30], slide)
|
||||
if service_item.raw_footer:
|
||||
@ -817,16 +816,15 @@ class BibleMediaItem(MediaManagerItem):
|
||||
The verse number (int).
|
||||
"""
|
||||
verse_separator = get_reference_match(u'sep_v_display')
|
||||
if not self.parent.settings_tab.show_new_chapters or \
|
||||
old_chapter != chapter:
|
||||
if not self.settings.show_new_chapters or old_chapter != chapter:
|
||||
verse_text = unicode(chapter) + verse_separator + unicode(verse)
|
||||
else:
|
||||
verse_text = unicode(verse)
|
||||
if self.parent.settings_tab.display_style == 1:
|
||||
if self.settings.display_style == DisplayStyle.Round:
|
||||
verse_text = u'{su}(' + verse_text + u'){/su}'
|
||||
elif self.parent.settings_tab.display_style == 2:
|
||||
elif self.settings.display_style == DisplayStyle.Curly:
|
||||
verse_text = u'{su}{' + verse_text + u'}{/su}'
|
||||
elif self.parent.settings_tab.display_style == 3:
|
||||
elif self.settings.display_style == DisplayStyle.Square:
|
||||
verse_text = u'{su}[' + verse_text + u']{/su}'
|
||||
else:
|
||||
verse_text = u'{su}' + verse_text + u'{/su}'
|
||||
|
@ -29,7 +29,8 @@ import sqlite
|
||||
|
||||
from PyQt4 import QtCore
|
||||
|
||||
from openlp.core.lib import Receiver, translate
|
||||
from openlp.core.lib import Receiver
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.bibles.lib.db import BibleDB
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -73,8 +74,7 @@ class OpenLP1Bible(BibleDB):
|
||||
abbreviation = unicode(book[3], u'cp1252')
|
||||
self.create_book(name, abbreviation, testament_id)
|
||||
# Update the progess bar.
|
||||
self.wizard.incrementProgressBar(unicode(translate(
|
||||
'BiblesPlugin.OpenLP1Import', 'Importing %s...')) % name)
|
||||
self.wizard.incrementProgressBar(WizardStrings.ImportingType % name)
|
||||
# Import the verses for this book.
|
||||
cursor.execute(u'SELECT chapter, verse, text || \'\' AS text FROM '
|
||||
'verse WHERE book_id=%s' % book_id)
|
||||
|
@ -69,7 +69,7 @@ class OSISBible(BibleDB):
|
||||
self.q1_regex = re.compile(r'<q(.*?)level="1"(.*?)>')
|
||||
self.q2_regex = re.compile(r'<q(.*?)level="2"(.*?)>')
|
||||
self.trans_regex = re.compile(r'<transChange(.*?)>(.*?)</transChange>')
|
||||
self.divineName_regex = re.compile(
|
||||
self.divine_name_regex = re.compile(
|
||||
r'<divineName(.*?)>(.*?)</divineName>')
|
||||
self.spaces_regex = re.compile(r'([ ]{2,})')
|
||||
filepath = os.path.join(
|
||||
@ -161,7 +161,7 @@ class OSISBible(BibleDB):
|
||||
verse_text = self.q1_regex.sub(u'"', verse_text)
|
||||
verse_text = self.q2_regex.sub(u'\'', verse_text)
|
||||
verse_text = self.trans_regex.sub(u'', verse_text)
|
||||
verse_text = self.divineName_regex.sub(u'', verse_text)
|
||||
verse_text = self.divine_name_regex.sub(u'', verse_text)
|
||||
verse_text = verse_text.replace(u'</lb>', u'')\
|
||||
.replace(u'</l>', u'').replace(u'<lg>', u'')\
|
||||
.replace(u'</lg>', u'').replace(u'</q>', u'')\
|
||||
|
@ -51,7 +51,7 @@ class CustomPlugin(Plugin):
|
||||
CustomMediaItem, CustomTab)
|
||||
self.weight = -5
|
||||
self.manager = Manager(u'custom', init_schema)
|
||||
self.edit_custom_form = EditCustomForm(self.manager)
|
||||
self.edit_custom_form = EditCustomForm(self)
|
||||
self.icon_path = u':/plugins/plugin_custom.png'
|
||||
self.icon = build_icon(self.icon_path)
|
||||
|
||||
|
@ -124,5 +124,4 @@ class Ui_CustomEditDialog(object):
|
||||
translate('CustomPlugin.EditCustomForm', 'The&me:'))
|
||||
self.creditLabel.setText(
|
||||
translate('CustomPlugin.EditCustomForm', '&Credits:'))
|
||||
self.previewButton.setText(
|
||||
translate('CustomPlugin.EditCustomForm', 'Save && Preview'))
|
||||
self.previewButton.setText(UiStrings.SaveAndPreview)
|
||||
|
@ -42,14 +42,15 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog):
|
||||
Class documentation goes here.
|
||||
"""
|
||||
log.info(u'Custom Editor loaded')
|
||||
def __init__(self, manager, parent=None):
|
||||
def __init__(self, parent):
|
||||
"""
|
||||
Constructor
|
||||
"""
|
||||
QtGui.QDialog.__init__(self, parent)
|
||||
QtGui.QDialog.__init__(self)
|
||||
self.parent = parent
|
||||
self.manager = self.parent.manager
|
||||
self.setupUi(self)
|
||||
# Create other objects and forms.
|
||||
self.manager = manager
|
||||
self.editSlideForm = EditCustomSlideForm(self)
|
||||
# Connecting signals and slots
|
||||
QtCore.QObject.connect(self.previewButton,
|
||||
|
@ -29,7 +29,8 @@ import logging
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \
|
||||
translate, check_item_selected
|
||||
check_item_selected
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
from openlp.plugins.custom.lib import CustomXMLParser
|
||||
from openlp.plugins.custom.lib.db import CustomSlide
|
||||
|
||||
@ -108,9 +109,7 @@ class CustomMediaItem(MediaManagerItem):
|
||||
"""
|
||||
Edit a custom item
|
||||
"""
|
||||
if check_item_selected(self.listView,
|
||||
translate('CustomPlugin.MediaItem',
|
||||
'You haven\'t selected an item to edit.')):
|
||||
if check_item_selected(self.listView, UiStrings.SelectEdit):
|
||||
item = self.listView.currentItem()
|
||||
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
|
||||
self.parent.edit_custom_form.loadCustom(item_id, False)
|
||||
@ -121,9 +120,7 @@ class CustomMediaItem(MediaManagerItem):
|
||||
"""
|
||||
Remove a custom item from the list and database
|
||||
"""
|
||||
if check_item_selected(self.listView,
|
||||
translate('CustomPlugin.MediaItem',
|
||||
'You haven\'t selected an item to delete.')):
|
||||
if check_item_selected(self.listView, UiStrings.SelectDelete):
|
||||
row_list = [item.row() for item in self.listView.selectedIndexes()]
|
||||
row_list.sort(reverse=True)
|
||||
id_list = [(item.data(QtCore.Qt.UserRole)).toInt()[0]
|
||||
|
@ -50,10 +50,10 @@ class ImageMediaItem(MediaManagerItem):
|
||||
QtCore.SIGNAL(u'live_theme_changed'), self.liveThemeChanged)
|
||||
|
||||
def retranslateUi(self):
|
||||
self.OnNewPrompt = translate('ImagePlugin.MediaItem',
|
||||
self.onNewPrompt = translate('ImagePlugin.MediaItem',
|
||||
'Select Image(s)')
|
||||
file_formats = get_images_filter()
|
||||
self.OnNewFileMasks = u'%s;;%s (*.*) (*)' % (file_formats,
|
||||
self.onNewFileMasks = u'%s;;%s (*.*) (*)' % (file_formats,
|
||||
UiStrings.AllFiles)
|
||||
self.replaceAction.setText(UiStrings.ReplaceBG)
|
||||
self.replaceAction.setToolTip(UiStrings.ReplaceLiveBG)
|
||||
@ -125,8 +125,7 @@ class ImageMediaItem(MediaManagerItem):
|
||||
def generateSlideData(self, service_item, item=None, xmlVersion=False):
|
||||
items = self.listView.selectedIndexes()
|
||||
if items:
|
||||
service_item.title = unicode(
|
||||
translate('ImagePlugin.MediaItem', 'Images'))
|
||||
service_item.title = unicode(self.plugin.nameStrings[u'plural'])
|
||||
service_item.add_capability(ItemCapabilities.AllowsMaintain)
|
||||
service_item.add_capability(ItemCapabilities.AllowsPreview)
|
||||
service_item.add_capability(ItemCapabilities.AllowsLoop)
|
||||
@ -198,8 +197,7 @@ class ImageMediaItem(MediaManagerItem):
|
||||
self.parent.liveController.display.directImage(name, filename)
|
||||
self.resetAction.setVisible(True)
|
||||
else:
|
||||
critical_error_message_box(
|
||||
translate('ImagePlugin.MediaItem', 'Live Background Error'),
|
||||
critical_error_message_box(UiStrings.LiveBGError,
|
||||
unicode(translate('ImagePlugin.MediaItem',
|
||||
'There was a problem replacing your background, '
|
||||
'the image file "%s" no longer exists.')) % filename)
|
||||
|
@ -58,8 +58,8 @@ class MediaMediaItem(MediaManagerItem):
|
||||
self.videoStart)
|
||||
|
||||
def retranslateUi(self):
|
||||
self.OnNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media')
|
||||
self.OnNewFileMasks = unicode(translate('MediaPlugin.MediaItem',
|
||||
self.onNewPrompt = translate('MediaPlugin.MediaItem', 'Select Media')
|
||||
self.onNewFileMasks = unicode(translate('MediaPlugin.MediaItem',
|
||||
'Videos (%s);;Audio (%s);;%s (*)')) % (self.parent.video_list,
|
||||
self.parent.audio_list, UiStrings.AllFiles)
|
||||
self.replaceAction.setText(UiStrings.ReplaceBG)
|
||||
@ -112,8 +112,7 @@ class MediaMediaItem(MediaManagerItem):
|
||||
self.parent.liveController.display.video(filename, 0, True)
|
||||
self.resetAction.setVisible(True)
|
||||
else:
|
||||
critical_error_message_box(translate('MediaPlugin.MediaItem',
|
||||
'Live Background Error'),
|
||||
critical_error_message_box(UiStrings.LiveBGError,
|
||||
unicode(translate('MediaPlugin.MediaItem',
|
||||
'There was a problem replacing your background, '
|
||||
'the media file "%s" no longer exists.')) % filename)
|
||||
@ -125,20 +124,19 @@ class MediaMediaItem(MediaManagerItem):
|
||||
return False
|
||||
filename = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
if os.path.exists(filename):
|
||||
self.MediaState = None
|
||||
self.mediaState = None
|
||||
self.mediaObject.stop()
|
||||
self.mediaObject.clearQueue()
|
||||
self.mediaObject.setCurrentSource(Phonon.MediaSource(filename))
|
||||
self.mediaObject.play()
|
||||
service_item.title = unicode(
|
||||
translate('MediaPlugin.MediaItem', 'Media'))
|
||||
service_item.title = unicode(self.plugin.nameStrings[u'singular'])
|
||||
service_item.add_capability(ItemCapabilities.RequiresMedia)
|
||||
service_item.add_capability(ItemCapabilities.AllowsVarableStartTime)
|
||||
# force a nonexistent theme
|
||||
service_item.theme = -1
|
||||
frame = u':/media/image_clapperboard.png'
|
||||
(path, name) = os.path.split(filename)
|
||||
while not self.MediaState:
|
||||
while not self.mediaState:
|
||||
Receiver.send_message(u'openlp_process_events')
|
||||
service_item.media_length = self.mediaLength
|
||||
service_item.add_from_command(path, name, frame)
|
||||
@ -184,6 +182,6 @@ class MediaMediaItem(MediaManagerItem):
|
||||
Start the video at a predetermined point.
|
||||
"""
|
||||
if newState == Phonon.PlayingState:
|
||||
self.MediaState = newState
|
||||
self.mediaState = newState
|
||||
self.mediaLength = self.mediaObject.totalTime()/1000
|
||||
self.mediaObject.stop()
|
||||
|
@ -31,7 +31,8 @@ from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import MediaManagerItem, build_icon, SettingsManager, \
|
||||
translate, check_item_selected, Receiver, ItemCapabilities
|
||||
from openlp.core.lib.ui import critical_error_message_box, media_item_combo_box
|
||||
from openlp.core.lib.ui import UiStrings, critical_error_message_box, \
|
||||
media_item_combo_box
|
||||
from openlp.plugins.presentations.lib import MessageListener
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -59,7 +60,7 @@ class PresentationMediaItem(MediaManagerItem):
|
||||
"""
|
||||
The name of the plugin media displayed in UI
|
||||
"""
|
||||
self.OnNewPrompt = translate('PresentationPlugin.MediaItem',
|
||||
self.onNewPrompt = translate('PresentationPlugin.MediaItem',
|
||||
'Select Presentation(s)')
|
||||
self.Automatic = translate('PresentationPlugin.MediaItem',
|
||||
'Automatic')
|
||||
@ -79,7 +80,7 @@ class PresentationMediaItem(MediaManagerItem):
|
||||
if fileType.find(type) == -1:
|
||||
fileType += u'*.%s ' % type
|
||||
self.parent.serviceManager.supportedSuffixes(type)
|
||||
self.OnNewFileMasks = unicode(translate('PresentationPlugin.MediaItem',
|
||||
self.onNewFileMasks = unicode(translate('PresentationPlugin.MediaItem',
|
||||
'Presentations (%s)')) % fileType
|
||||
|
||||
def requiredIcons(self):
|
||||
@ -202,9 +203,7 @@ class PresentationMediaItem(MediaManagerItem):
|
||||
"""
|
||||
Remove a presentation item from the list
|
||||
"""
|
||||
if check_item_selected(self.listView,
|
||||
translate('PresentationPlugin.MediaItem',
|
||||
'You must select an item to delete.')):
|
||||
if check_item_selected(self.listView, UiStrings.SelectDelete):
|
||||
items = self.listView.selectedIndexes()
|
||||
row_list = [item.row() for item in items]
|
||||
row_list.sort(reverse=True)
|
||||
|
@ -85,7 +85,7 @@ class PresentationTab(SettingsTab):
|
||||
else:
|
||||
checkbox.setText(
|
||||
unicode(translate('PresentationPlugin.PresentationTab',
|
||||
'%s (unvailable)')) % controller.name)
|
||||
'%s (unavailable)')) % controller.name)
|
||||
self.AdvancedGroupBox.setTitle(UiStrings.Advanced)
|
||||
self.OverrideAppCheckBox.setText(
|
||||
translate('PresentationPlugin.PresentationTab',
|
||||
|
@ -28,6 +28,7 @@ from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import build_icon, translate
|
||||
from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box
|
||||
from openlp.plugins.songs.lib.ui import SongStrings
|
||||
|
||||
class Ui_EditSongDialog(object):
|
||||
def setupUi(self, editSongDialog):
|
||||
@ -265,21 +266,19 @@ class Ui_EditSongDialog(object):
|
||||
self.songTabWidget.setTabText(
|
||||
self.songTabWidget.indexOf(self.lyricsTab),
|
||||
translate('SongsPlugin.EditSongForm', 'Title && Lyrics'))
|
||||
self.authorsGroupBox.setTitle(UiStrings.Authors)
|
||||
self.authorsGroupBox.setTitle(SongStrings.Authors)
|
||||
self.authorAddButton.setText(
|
||||
translate('SongsPlugin.EditSongForm', '&Add to Song'))
|
||||
self.authorRemoveButton.setText(
|
||||
translate('SongsPlugin.EditSongForm', '&Remove'))
|
||||
self.maintenanceButton.setText(translate('SongsPlugin.EditSongForm',
|
||||
'&Manage Authors, Topics, Song Books'))
|
||||
self.topicsGroupBox.setTitle(
|
||||
translate('SongsPlugin.EditSongForm', 'Topic'))
|
||||
self.topicsGroupBox.setTitle(SongStrings.Topic)
|
||||
self.topicAddButton.setText(
|
||||
translate('SongsPlugin.EditSongForm', 'A&dd to Song'))
|
||||
self.topicRemoveButton.setText(
|
||||
translate('SongsPlugin.EditSongForm', 'R&emove'))
|
||||
self.songBookGroupBox.setTitle(
|
||||
translate('SongsPlugin.EditSongForm', 'Song Book'))
|
||||
self.songBookGroupBox.setTitle(SongStrings.SongBook)
|
||||
self.songBookNameLabel.setText(translate('SongsPlugin.EditSongForm',
|
||||
'Book:'))
|
||||
self.songBookNumberLabel.setText(translate('SongsPlugin.EditSongForm',
|
||||
@ -293,10 +292,8 @@ class Ui_EditSongDialog(object):
|
||||
translate('SongsPlugin.EditSongForm', 'New &Theme'))
|
||||
self.rightsGroupBox.setTitle(
|
||||
translate('SongsPlugin.EditSongForm', 'Copyright Information'))
|
||||
self.copyrightInsertButton.setText(
|
||||
translate('SongsPlugin.EditSongForm', '\xa9'))
|
||||
self.CCLILabel.setText(
|
||||
translate('SongsPlugin.EditSongForm', 'CCLI number:'))
|
||||
self.copyrightInsertButton.setText(SongStrings.CopyrightSymbol)
|
||||
self.CCLILabel.setText(UiStrings.CCLINumberLabel)
|
||||
self.commentsGroupBox.setTitle(
|
||||
translate('SongsPlugin.EditSongForm', 'Comments'))
|
||||
self.songTabWidget.setTabText(
|
||||
|
@ -30,10 +30,12 @@ import re
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import Receiver, translate
|
||||
from openlp.core.lib.ui import add_widget_completer, critical_error_message_box
|
||||
from openlp.core.lib.ui import UiStrings, add_widget_completer, \
|
||||
critical_error_message_box
|
||||
from openlp.plugins.songs.forms import EditVerseForm
|
||||
from openlp.plugins.songs.lib import SongXML, VerseType
|
||||
from openlp.plugins.songs.lib.db import Book, Song, Author, Topic
|
||||
from openlp.plugins.songs.lib.ui import SongStrings
|
||||
from editsongdialog import Ui_EditSongDialog
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -94,8 +96,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
QtCore.SIGNAL(u'theme_update_list'), self.loadThemes)
|
||||
self.previewButton = QtGui.QPushButton()
|
||||
self.previewButton.setObjectName(u'previewButton')
|
||||
self.previewButton.setText(
|
||||
translate('SongsPlugin.EditSongForm', 'Save && Preview'))
|
||||
self.previewButton.setText(UiStrings.SaveAndPreview)
|
||||
self.buttonBox.addButton(
|
||||
self.previewButton, QtGui.QDialogButtonBox.ActionRole)
|
||||
QtCore.QObject.connect(self.buttonBox,
|
||||
@ -227,10 +228,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
self.copyrightEdit.setText(u'')
|
||||
self.verseListWidget.clear()
|
||||
self.verseListWidget.setRowCount(0)
|
||||
if self.song.verse_order:
|
||||
self.verseOrderEdit.setText(self.song.verse_order)
|
||||
else:
|
||||
self.verseOrderEdit.setText(u'')
|
||||
if self.song.comments:
|
||||
self.commentsEdit.setPlainText(self.song.comments)
|
||||
else:
|
||||
@ -250,15 +247,31 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
# This is just because occasionally the lyrics come back as a "buffer"
|
||||
if isinstance(self.song.lyrics, buffer):
|
||||
self.song.lyrics = unicode(self.song.lyrics)
|
||||
verse_tags_translated = False
|
||||
if self.song.lyrics.startswith(u'<?xml version='):
|
||||
songXML = SongXML()
|
||||
verseList = songXML.get_verses(self.song.lyrics)
|
||||
for count, verse in enumerate(verseList):
|
||||
self.verseListWidget.setRowCount(
|
||||
self.verseListWidget.rowCount() + 1)
|
||||
variant = u'%s:%s' % (verse[0][u'type'], verse[0][u'label'])
|
||||
# This silently migrates from localized verse type markup.
|
||||
# If we trusted the database, this would be unnecessary.
|
||||
verse_tag = verse[0][u'type']
|
||||
index = None
|
||||
if len(verse_tag) > 1:
|
||||
index = VerseType.from_translated_string(verse_tag)
|
||||
if index is None:
|
||||
index = VerseType.from_string(verse_tag)
|
||||
else:
|
||||
verse_tags_translated = True
|
||||
if index is None:
|
||||
index = VerseType.from_tag(verse_tag)
|
||||
if index is None:
|
||||
index = VerseType.Other
|
||||
verse[0][u'type'] = VerseType.Tags[index]
|
||||
verse_def = u'%s%s' % (verse[0][u'type'], verse[0][u'label'])
|
||||
item = QtGui.QTableWidgetItem(verse[1])
|
||||
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(variant))
|
||||
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(verse_def))
|
||||
self.verseListWidget.setItem(count, 0, item)
|
||||
else:
|
||||
verses = self.song.lyrics.split(u'\n\n')
|
||||
@ -266,10 +279,24 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
self.verseListWidget.setRowCount(
|
||||
self.verseListWidget.rowCount() + 1)
|
||||
item = QtGui.QTableWidgetItem(verse)
|
||||
variant = u'%s:%s' % \
|
||||
(VerseType.to_string(VerseType.Verse), unicode(count + 1))
|
||||
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(variant))
|
||||
verse_def = u'%s%s' % \
|
||||
(VerseType.Tags[VerseType.Verse], unicode(count + 1))
|
||||
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(verse_def))
|
||||
self.verseListWidget.setItem(count, 0, item)
|
||||
if self.song.verse_order:
|
||||
# we translate verse order
|
||||
translated = []
|
||||
for verse_def in self.song.verse_order.split():
|
||||
verse_index = None
|
||||
if verse_tags_translated:
|
||||
verse_index = VerseType.from_translated_tag(verse_def[0])
|
||||
if verse_index is None:
|
||||
verse_index = VerseType.from_tag(verse_def[0])
|
||||
verse_tag = VerseType.TranslatedTags[verse_index].upper()
|
||||
translated.append(u'%s%s' % (verse_tag, verse_def[1:]))
|
||||
self.verseOrderEdit.setText(u' '.join(translated))
|
||||
else:
|
||||
self.verseOrderEdit.setText(u'')
|
||||
self.verseListWidget.resizeRowsToContents()
|
||||
self.tagRows()
|
||||
# clear the results
|
||||
@ -294,14 +321,14 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
"""
|
||||
Tag the Song List rows based on the verse list
|
||||
"""
|
||||
rowLabel = []
|
||||
row_label = []
|
||||
for row in range(0, self.verseListWidget.rowCount()):
|
||||
item = self.verseListWidget.item(row, 0)
|
||||
data = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
bit = data.split(u':')
|
||||
rowTag = u'%s%s' % (bit[0][0:1], bit[1])
|
||||
rowLabel.append(rowTag)
|
||||
self.verseListWidget.setVerticalHeaderLabels(rowLabel)
|
||||
verse_def = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
verse_tag = VerseType.translated_tag(verse_def[0])
|
||||
row_def = u'%s%s' % (verse_tag, verse_def[1:])
|
||||
row_label.append(row_def)
|
||||
self.verseListWidget.setVerticalHeaderLabels(row_label)
|
||||
|
||||
def onAuthorAddButtonClicked(self):
|
||||
item = int(self.authorsComboBox.currentIndex())
|
||||
@ -337,8 +364,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
self.__addAuthorToList(author)
|
||||
self.authorsComboBox.setCurrentIndex(0)
|
||||
else:
|
||||
QtGui.QMessageBox.warning(self,
|
||||
translate('SongsPlugin.EditSongForm', 'No Author Selected'),
|
||||
QtGui.QMessageBox.warning(self, UiStrings.NISs,
|
||||
translate('SongsPlugin.EditSongForm', 'You have not selected '
|
||||
'a valid author. Either select an author from the list, '
|
||||
'or type in a new author and click the "Add Author to '
|
||||
@ -397,8 +423,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
self.topicsListView.addItem(topic_item)
|
||||
self.topicsComboBox.setCurrentIndex(0)
|
||||
else:
|
||||
QtGui.QMessageBox.warning(self,
|
||||
translate('SongsPlugin.EditSongForm', 'No Topic Selected'),
|
||||
QtGui.QMessageBox.warning(self, UiStrings.NISs,
|
||||
translate('SongsPlugin.EditSongForm', 'You have not selected '
|
||||
'a valid topic. Either select a topic from the list, or '
|
||||
'type in a new topic and click the "Add Topic to Song" '
|
||||
@ -420,11 +445,11 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
def onVerseAddButtonClicked(self):
|
||||
self.verse_form.setVerse(u'', True)
|
||||
if self.verse_form.exec_():
|
||||
afterText, verse, subVerse = self.verse_form.getVerse()
|
||||
data = u'%s:%s' % (verse, subVerse)
|
||||
item = QtGui.QTableWidgetItem(afterText)
|
||||
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(data))
|
||||
item.setText(afterText)
|
||||
after_text, verse_tag, verse_num = self.verse_form.getVerse()
|
||||
verse_def = u'%s%s' % (verse_tag, verse_num)
|
||||
item = QtGui.QTableWidgetItem(after_text)
|
||||
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(verse_def))
|
||||
item.setText(after_text)
|
||||
self.verseListWidget.setRowCount(
|
||||
self.verseListWidget.rowCount() + 1)
|
||||
self.verseListWidget.setItem(
|
||||
@ -440,12 +465,12 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
verseId = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
self.verse_form.setVerse(tempText, True, verseId)
|
||||
if self.verse_form.exec_():
|
||||
afterText, verse, subVerse = self.verse_form.getVerse()
|
||||
data = u'%s:%s' % (verse, subVerse)
|
||||
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(data))
|
||||
item.setText(afterText)
|
||||
after_text, verse_tag, verse_num = self.verse_form.getVerse()
|
||||
verse_def = u'%s%s' % (verse_tag, verse_num)
|
||||
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(verse_def))
|
||||
item.setText(after_text)
|
||||
# number of lines has change so repaint the list moving the data
|
||||
if len(tempText.split(u'\n')) != len(afterText.split(u'\n')):
|
||||
if len(tempText.split(u'\n')) != len(after_text.split(u'\n')):
|
||||
tempList = {}
|
||||
tempId = {}
|
||||
for row in range(0, self.verseListWidget.rowCount()):
|
||||
@ -467,7 +492,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
for row in range(0, self.verseListWidget.rowCount()):
|
||||
item = self.verseListWidget.item(row, 0)
|
||||
field = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
verse_list += u'---[%s]---\n' % field
|
||||
verse_tag = VerseType.translated_name(field[0])
|
||||
verse_num = field[1:]
|
||||
verse_list += u'---[%s:%s]---\n' % (verse_tag, verse_num)
|
||||
verse_list += item.text()
|
||||
verse_list += u'\n'
|
||||
self.verse_form.setVerse(verse_list)
|
||||
@ -483,15 +510,32 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
for count, parts in enumerate(match.split(u']---\n')):
|
||||
if len(parts) > 1:
|
||||
if count == 0:
|
||||
# make sure the tag is correctly cased
|
||||
variant = u'%s%s' % \
|
||||
(parts[0:1].upper(), parts[1:].lower())
|
||||
# handling carefully user inputted versetags
|
||||
separator = parts.find(u':')
|
||||
if separator >= 0:
|
||||
verse_name = parts[0:separator].strip()
|
||||
verse_num = parts[separator+1:].strip()
|
||||
else:
|
||||
verse_name = parts
|
||||
verse_num = u'1'
|
||||
verse_index = \
|
||||
VerseType.from_loose_input(verse_name)
|
||||
verse_tag = VerseType.Tags[verse_index]
|
||||
# Later we need to handle v1a as well.
|
||||
#regex = re.compile(r'(\d+\w.)')
|
||||
regex = re.compile(r'\D*(\d+)\D*')
|
||||
match = regex.match(verse_num)
|
||||
if match:
|
||||
verse_num = match.group(1)
|
||||
else:
|
||||
verse_num = u'1'
|
||||
verse_def = u'%s%s' % (verse_tag, verse_num)
|
||||
else:
|
||||
if parts.endswith(u'\n'):
|
||||
parts = parts.rstrip(u'\n')
|
||||
item = QtGui.QTableWidgetItem(parts)
|
||||
item.setData(QtCore.Qt.UserRole,
|
||||
QtCore.QVariant(variant))
|
||||
QtCore.QVariant(verse_def))
|
||||
self.verseListWidget.setRowCount(
|
||||
self.verseListWidget.rowCount() + 1)
|
||||
self.verseListWidget.setItem(
|
||||
@ -543,25 +587,31 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
order_names = unicode(self.verseOrderEdit.text()).split()
|
||||
for item in order_names:
|
||||
if len(item) == 1:
|
||||
order.append(item.lower() + u'1')
|
||||
verse_index = VerseType.from_translated_tag(item)
|
||||
if verse_index is not None:
|
||||
order.append(VerseType.Tags[verse_index] + u'1')
|
||||
else:
|
||||
order.append(item.lower())
|
||||
order.append(u'') # it matches no verses anyway
|
||||
else:
|
||||
verse_index = VerseType.from_translated_tag(item[0])
|
||||
if verse_index is None:
|
||||
order.append(u'') # same as above
|
||||
else:
|
||||
verse_tag = VerseType.Tags[verse_index]
|
||||
verse_num = item[1:].lower()
|
||||
order.append(verse_tag + verse_num)
|
||||
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)
|
||||
verses.append(verse)
|
||||
verse_names.append(u'%s%s' % (
|
||||
VerseType.translated_tag(verse[0]), verse[1:]))
|
||||
for count, item in enumerate(order):
|
||||
if item not in verses:
|
||||
self.songTabWidget.setCurrentIndex(0)
|
||||
self.verseOrderEdit.setFocus()
|
||||
valid = verses.pop(0)
|
||||
for verse in verses:
|
||||
valid = valid + u', ' + verse
|
||||
valid = u', '.join(verse_names)
|
||||
critical_error_message_box(
|
||||
message=unicode(translate('SongsPlugin.EditSongForm',
|
||||
'The verse order is invalid. There is no verse '
|
||||
@ -577,7 +627,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
unicode(translate('SongsPlugin.EditSongForm',
|
||||
'You have not used %s anywhere in the verse '
|
||||
'order. Are you sure you want to save the song '
|
||||
'like this?')) % verse_names[count].replace(u':', u' '),
|
||||
'like this?')) % verse_names[count],
|
||||
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No)
|
||||
if answer == QtGui.QMessageBox.No:
|
||||
return False
|
||||
@ -599,7 +649,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
def onCopyrightInsertButtonTriggered(self):
|
||||
text = self.copyrightEdit.text()
|
||||
pos = self.copyrightEdit.cursorPosition()
|
||||
sign = translate('SongsPlugin.EditSongForm', '\xa9')
|
||||
sign = SongStrings.CopyrightSymbol
|
||||
text = text[:pos] + sign + text[pos:]
|
||||
self.copyrightEdit.setText(text)
|
||||
self.copyrightEdit.setFocus()
|
||||
@ -684,7 +734,14 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
else:
|
||||
self.song.search_title = self.song.title
|
||||
self.song.comments = unicode(self.commentsEdit.toPlainText())
|
||||
self.song.verse_order = unicode(self.verseOrderEdit.text())
|
||||
ordertext = unicode(self.verseOrderEdit.text())
|
||||
order = []
|
||||
for item in ordertext.split():
|
||||
verse_tag = VerseType.Tags[
|
||||
VerseType.from_translated_tag(item[0])]
|
||||
verse_num = item[1:].lower()
|
||||
order.append(u'%s%s' % (verse_tag, verse_num))
|
||||
self.song.verse_order = u' '.join(order)
|
||||
self.song.ccli_number = unicode(self.CCLNumberEdit.text())
|
||||
self.song.song_number = unicode(self.songBookNumberEdit.text())
|
||||
book_name = unicode(self.songBookComboBox.currentText())
|
||||
@ -727,12 +784,14 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
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()))
|
||||
verse_tag = verseId[0]
|
||||
verse_num = verseId[1:]
|
||||
sxml.add_verse_to_lyrics(verse_tag, verse_num,
|
||||
unicode(item.text()))
|
||||
text = text + self.whitespace.sub(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])
|
||||
if (verse_num > u'1') and (verse_tag not in multiple):
|
||||
multiple.append(verse_tag)
|
||||
self.song.search_lyrics = text.lower()
|
||||
self.song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
|
||||
for verse in multiple:
|
||||
|
@ -70,19 +70,19 @@ class Ui_EditVerseDialog(object):
|
||||
translate('SongsPlugin.EditVerseForm', 'Edit Verse'))
|
||||
self.verseTypeLabel.setText(
|
||||
translate('SongsPlugin.EditVerseForm', '&Verse type:'))
|
||||
self.verseTypeComboBox.setItemText(0,
|
||||
VerseType.to_string(VerseType.Verse))
|
||||
self.verseTypeComboBox.setItemText(1,
|
||||
VerseType.to_string(VerseType.Chorus))
|
||||
self.verseTypeComboBox.setItemText(2,
|
||||
VerseType.to_string(VerseType.Bridge))
|
||||
self.verseTypeComboBox.setItemText(3,
|
||||
VerseType.to_string(VerseType.PreChorus))
|
||||
self.verseTypeComboBox.setItemText(4,
|
||||
VerseType.to_string(VerseType.Intro))
|
||||
self.verseTypeComboBox.setItemText(5,
|
||||
VerseType.to_string(VerseType.Ending))
|
||||
self.verseTypeComboBox.setItemText(6,
|
||||
VerseType.to_string(VerseType.Other))
|
||||
self.verseTypeComboBox.setItemText(VerseType.Verse,
|
||||
VerseType.TranslatedNames[VerseType.Verse])
|
||||
self.verseTypeComboBox.setItemText(VerseType.Chorus,
|
||||
VerseType.TranslatedNames[VerseType.Chorus])
|
||||
self.verseTypeComboBox.setItemText(VerseType.Bridge,
|
||||
VerseType.TranslatedNames[VerseType.Bridge])
|
||||
self.verseTypeComboBox.setItemText(VerseType.PreChorus,
|
||||
VerseType.TranslatedNames[VerseType.PreChorus])
|
||||
self.verseTypeComboBox.setItemText(VerseType.Intro,
|
||||
VerseType.TranslatedNames[VerseType.Intro])
|
||||
self.verseTypeComboBox.setItemText(VerseType.Ending,
|
||||
VerseType.TranslatedNames[VerseType.Ending])
|
||||
self.verseTypeComboBox.setItemText(VerseType.Other,
|
||||
VerseType.TranslatedNames[VerseType.Other])
|
||||
self.insertButton.setText(
|
||||
translate('SongsPlugin.EditVerseForm', '&Insert'))
|
||||
|
@ -57,21 +57,22 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
|
||||
QtCore.QObject.connect(self.verseTypeComboBox,
|
||||
QtCore.SIGNAL(u'currentIndexChanged(int)'),
|
||||
self.onVerseTypeComboBoxChanged)
|
||||
self.verse_regex = re.compile(r'---\[([-\w]+):([\d]+)\]---')
|
||||
self.verse_regex = re.compile(r'---\[(.+):\D*(\d*)\D*.*\]---')
|
||||
|
||||
def contextMenu(self, point):
|
||||
item = self.serviceManagerList.itemAt(point)
|
||||
|
||||
def insertVerse(self, title, num=1):
|
||||
def insertVerse(self, verse_tag, verse_num=1):
|
||||
if self.verseTextEdit.textCursor().columnNumber() != 0:
|
||||
self.verseTextEdit.insertPlainText(u'\n')
|
||||
self.verseTextEdit.insertPlainText(u'---[%s:%s]---\n' % (title, num))
|
||||
verse_tag = VerseType.translated_name(verse_tag)
|
||||
self.verseTextEdit.insertPlainText(u'---[%s:%s]---\n' %
|
||||
(verse_tag, verse_num))
|
||||
self.verseTextEdit.setFocus()
|
||||
|
||||
def onInsertButtonClicked(self):
|
||||
verse_type = self.verseTypeComboBox.currentIndex()
|
||||
if VerseType.to_string(verse_type) is not None:
|
||||
self.insertVerse(VerseType.to_string(verse_type),
|
||||
verse_type_index = self.verseTypeComboBox.currentIndex()
|
||||
self.insertVerse(VerseType.Tags[verse_type_index],
|
||||
self.verseNumberBox.value())
|
||||
|
||||
def onVerseTypeComboBoxChanged(self):
|
||||
@ -81,10 +82,11 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
|
||||
"""
|
||||
position = self.verseTextEdit.textCursor().position()
|
||||
text = unicode(self.verseTextEdit.toPlainText())
|
||||
verse_type = VerseType.to_string(self.verseTypeComboBox.currentIndex())
|
||||
verse_name = VerseType.TranslatedNames[
|
||||
self.verseTypeComboBox.currentIndex()]
|
||||
if not text:
|
||||
return
|
||||
position = text.rfind(u'---[%s' % verse_type, 0, position)
|
||||
position = text.rfind(u'---[%s' % verse_name, 0, position)
|
||||
if position == -1:
|
||||
self.verseNumberBox.setValue(1)
|
||||
return
|
||||
@ -95,11 +97,11 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
|
||||
text = text[:position + 4]
|
||||
match = self.verse_regex.match(text)
|
||||
if match:
|
||||
verse_type = match.group(1)
|
||||
verse_number = int(match.group(2))
|
||||
verse_type_index = VerseType.from_string(verse_type)
|
||||
verse_tag = match.group(1)
|
||||
verse_num = int(match.group(2))
|
||||
verse_type_index = VerseType.from_loose_input(verse_tag)
|
||||
if verse_type_index is not None:
|
||||
self.verseNumberBox.setValue(verse_number)
|
||||
self.verseNumberBox.setValue(verse_num)
|
||||
|
||||
def onCursorPositionChanged(self):
|
||||
"""
|
||||
@ -124,25 +126,26 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
|
||||
match = self.verse_regex.match(text)
|
||||
if match:
|
||||
verse_type = match.group(1)
|
||||
verse_type_index = VerseType.from_loose_input(verse_type)
|
||||
verse_number = int(match.group(2))
|
||||
verse_type_index = VerseType.from_string(verse_type)
|
||||
if verse_type_index is not None:
|
||||
self.verseTypeComboBox.setCurrentIndex(verse_type_index)
|
||||
self.verseNumberBox.setValue(verse_number)
|
||||
|
||||
def setVerse(self, text, single=False,
|
||||
tag=u'%s:1' % VerseType.to_string(VerseType.Verse)):
|
||||
tag=u'%s1' % VerseType.Tags[VerseType.Verse]):
|
||||
self.hasSingleVerse = single
|
||||
if single:
|
||||
verse_type, verse_number = tag.split(u':')
|
||||
verse_type_index = VerseType.from_string(verse_type)
|
||||
verse_type_index = VerseType.from_tag(tag[0])
|
||||
verse_number = tag[1:]
|
||||
if verse_type_index is not None:
|
||||
self.verseTypeComboBox.setCurrentIndex(verse_type_index)
|
||||
self.verseNumberBox.setValue(int(verse_number))
|
||||
self.insertButton.setVisible(False)
|
||||
else:
|
||||
if not text:
|
||||
text = u'---[%s:1]---\n' % VerseType.to_string(VerseType.Verse)
|
||||
text = u'---[%s:1]---\n' % \
|
||||
VerseType.TranslatedNames[VerseType.Verse]
|
||||
self.verseTypeComboBox.setCurrentIndex(0)
|
||||
self.verseNumberBox.setValue(1)
|
||||
self.insertButton.setVisible(True)
|
||||
@ -152,14 +155,14 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
|
||||
|
||||
def getVerse(self):
|
||||
return self.verseTextEdit.toPlainText(), \
|
||||
VerseType.to_string(self.verseTypeComboBox.currentIndex()), \
|
||||
VerseType.Tags[self.verseTypeComboBox.currentIndex()], \
|
||||
unicode(self.verseNumberBox.value())
|
||||
|
||||
def getVerseAll(self):
|
||||
text = self.verseTextEdit.toPlainText()
|
||||
if not text.startsWith(u'---['):
|
||||
text = u'---[%s:1]---\n%s' % (VerseType.to_string(VerseType.Verse),
|
||||
text)
|
||||
text = u'---[%s:1]---\n%s' % \
|
||||
(VerseType.TranslatedNames[VerseType.Verse], text)
|
||||
return text
|
||||
|
||||
def accept(self):
|
||||
|
@ -32,8 +32,8 @@ import logging
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import build_icon, Receiver, SettingsManager, translate
|
||||
from openlp.core.lib.ui import critical_error_message_box
|
||||
from openlp.core.ui.wizard import OpenLPWizard
|
||||
from openlp.core.lib.ui import UiStrings, critical_error_message_box
|
||||
from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
|
||||
from openlp.plugins.songs.lib.db import Song
|
||||
from openlp.plugins.songs.lib.openlyricsexport import OpenLyricsExport
|
||||
|
||||
@ -56,7 +56,6 @@ class SongExportForm(OpenLPWizard):
|
||||
``plugin``
|
||||
The songs plugin.
|
||||
"""
|
||||
self.plugin = plugin
|
||||
OpenLPWizard.__init__(self, parent, plugin, u'songExportWizard',
|
||||
u':/wizards/wizard_exportsong.bmp')
|
||||
self.stop_export_flag = False
|
||||
@ -165,10 +164,8 @@ class SongExportForm(OpenLPWizard):
|
||||
"""
|
||||
self.setWindowTitle(
|
||||
translate('SongsPlugin.ExportWizardForm', 'Song Export Wizard'))
|
||||
self.titleLabel.setText(
|
||||
u'<span style="font-size:14pt; font-weight:600;">%s</span>' %
|
||||
translate('SongsPlugin.ExportWizardForm',
|
||||
'Welcome to the Song Export Wizard'))
|
||||
self.titleLabel.setText(WizardStrings.HeaderStyle %
|
||||
translate('OpenLP.Ui', 'Welcome to the Song Export Wizard'))
|
||||
self.informationLabel.setText(
|
||||
translate('SongsPlugin.ExportWizardForm', 'This wizard will help to'
|
||||
' export your songs to the open and free OpenLyrics worship song '
|
||||
@ -177,9 +174,8 @@ class SongExportForm(OpenLPWizard):
|
||||
translate('SongsPlugin.ExportWizardForm', 'Select Songs'))
|
||||
self.availableSongsPage.setSubTitle(
|
||||
translate('SongsPlugin.ExportWizardForm',
|
||||
'Check the songs, you want to export.'))
|
||||
self.searchLabel.setText(
|
||||
translate('SongsPlugin.ExportWizardForm', 'Search:'))
|
||||
'Check the songs you want to export.'))
|
||||
self.searchLabel.setText(u'%s:' % UiStrings.Search)
|
||||
self.uncheckButton.setText(
|
||||
translate('SongsPlugin.ExportWizardForm', 'Uncheck All'))
|
||||
self.checkButton.setText(
|
||||
@ -196,10 +192,8 @@ class SongExportForm(OpenLPWizard):
|
||||
self.progressPage.setSubTitle(
|
||||
translate('SongsPlugin.ExportWizardForm',
|
||||
'Please wait while your songs are exported.'))
|
||||
self.progressLabel.setText(
|
||||
translate('SongsPlugin.ExportWizardForm', 'Ready.'))
|
||||
self.progressBar.setFormat(
|
||||
translate('SongsPlugin.ExportWizardForm', '%p%'))
|
||||
self.progressLabel.setText(WizardStrings.Ready)
|
||||
self.progressBar.setFormat(WizardStrings.PercentSymbolFormat)
|
||||
|
||||
def validateCurrentPage(self):
|
||||
"""
|
||||
@ -213,9 +207,7 @@ class SongExportForm(OpenLPWizard):
|
||||
self.availableListWidget) if item.checkState()
|
||||
]
|
||||
if not items:
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ExportWizardForm',
|
||||
'No Song Selected'),
|
||||
critical_error_message_box(UiStrings.NISp,
|
||||
translate('SongsPlugin.ExportWizardForm',
|
||||
'You need to add at least one Song to export.'))
|
||||
return False
|
||||
|
@ -33,7 +33,7 @@ from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import Receiver, SettingsManager, translate
|
||||
from openlp.core.lib.ui import UiStrings, critical_error_message_box
|
||||
from openlp.core.ui.wizard import OpenLPWizard
|
||||
from openlp.core.ui.wizard import OpenLPWizard, WizardStrings
|
||||
from openlp.plugins.songs.lib.importer import SongFormat
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -207,61 +207,45 @@ class SongImportForm(OpenLPWizard):
|
||||
"""
|
||||
self.setWindowTitle(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Song Import Wizard'))
|
||||
self.titleLabel.setText(
|
||||
u'<span style="font-size:14pt; font-weight:600;">%s</span>' % \
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Welcome to the Song Import Wizard'))
|
||||
self.titleLabel.setText(WizardStrings.HeaderStyle %
|
||||
translate('OpenLP.Ui', 'Welcome to the Song Import Wizard'))
|
||||
self.informationLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'This wizard will help you to import songs from a variety of '
|
||||
'formats. Click the next button below to start the process by '
|
||||
'selecting a format to import from.'))
|
||||
self.sourcePage.setTitle(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Select Import Source'))
|
||||
self.sourcePage.setSubTitle(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select the import format, and where to import from.'))
|
||||
self.formatLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Format:'))
|
||||
self.formatComboBox.setItemText(0, UiStrings.OLPV2)
|
||||
self.formatComboBox.setItemText(1,
|
||||
translate('SongsPlugin.ImportWizardForm', 'openlp.org 1.x'))
|
||||
self.formatComboBox.setItemText(2,
|
||||
translate('SongsPlugin.ImportWizardForm', 'OpenLyrics'))
|
||||
self.formatComboBox.setItemText(3,
|
||||
translate('SongsPlugin.ImportWizardForm', 'OpenSong'))
|
||||
self.formatComboBox.setItemText(4,
|
||||
translate('SongsPlugin.ImportWizardForm', 'Words of Worship'))
|
||||
self.formatComboBox.setItemText(5,
|
||||
translate('SongsPlugin.ImportWizardForm', 'CCLI/SongSelect'))
|
||||
self.formatComboBox.setItemText(6,
|
||||
translate('SongsPlugin.ImportWizardForm', 'Songs of Fellowship'))
|
||||
self.formatComboBox.setItemText(7,
|
||||
self.sourcePage.setTitle(WizardStrings.ImportSelect)
|
||||
self.sourcePage.setSubTitle(WizardStrings.ImportSelectLong)
|
||||
self.formatLabel.setText(WizardStrings.FormatLabel)
|
||||
self.formatComboBox.setItemText(SongFormat.OpenLP2, UiStrings.OLPV2)
|
||||
self.formatComboBox.setItemText(SongFormat.OpenLP1, UiStrings.OLPV1)
|
||||
self.formatComboBox.setItemText(
|
||||
SongFormat.OpenLyrics, WizardStrings.OL)
|
||||
self.formatComboBox.setItemText(SongFormat.OpenSong, WizardStrings.OS)
|
||||
self.formatComboBox.setItemText(
|
||||
SongFormat.WordsOfWorship, WizardStrings.WoW)
|
||||
self.formatComboBox.setItemText(SongFormat.CCLI, WizardStrings.CCLI)
|
||||
self.formatComboBox.setItemText(
|
||||
SongFormat.SongsOfFellowship, WizardStrings.SoF)
|
||||
self.formatComboBox.setItemText(SongFormat.Generic,
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Generic Document/Presentation'))
|
||||
self.formatComboBox.setItemText(8,
|
||||
translate('SongsPlugin.ImportWizardForm', 'EasiSlides'))
|
||||
self.formatComboBox.setItemText(9,
|
||||
translate('SongsPlugin.ImportWizardForm', 'EasyWorship'))
|
||||
self.formatComboBox.setItemText(10,
|
||||
translate('SongsPlugin.ImportWizardForm', 'SongBeamer'))
|
||||
self.formatComboBox.setItemText(11,
|
||||
translate('SongsPlugin.ImportWizardForm', 'SongShow Plus'))
|
||||
# self.formatComboBox.setItemText(11,
|
||||
# translate('SongsPlugin.ImportWizardForm', 'CSV'))
|
||||
self.formatComboBox.setItemText(
|
||||
SongFormat.EasiSlides, WizardStrings.ES)
|
||||
self.formatComboBox.setItemText(
|
||||
SongFormat.EasyWorship, WizardStrings.EW)
|
||||
self.formatComboBox.setItemText(
|
||||
SongFormat.SongBeamer, WizardStrings.SB)
|
||||
self.formatComboBox.setItemText(
|
||||
SongFormat.SongShowPlus, WizardStrings.SSP)
|
||||
# self.formatComboBox.setItemText(SongFormat.CSV, WizardStrings.CSV)
|
||||
self.openLP2FilenameLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
||||
self.openLP2BrowseButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Browse...'))
|
||||
self.openLP2BrowseButton.setText(UiStrings.Browse)
|
||||
self.openLP1FilenameLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
||||
self.openLP1BrowseButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Browse...'))
|
||||
self.openLP1DisabledLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'The openlp.org 1.x '
|
||||
'importer has been disabled due to a missing Python module. If '
|
||||
'you want to use this importer, you will need to install the '
|
||||
'"python-sqlite" module.'))
|
||||
self.openLP1BrowseButton.setText(UiStrings.Browse)
|
||||
self.openLP1DisabledLabel.setText(WizardStrings.NoSqlite)
|
||||
self.openLyricsAddButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||
self.openLyricsRemoveButton.setText(
|
||||
@ -301,12 +285,10 @@ class SongImportForm(OpenLPWizard):
|
||||
'find OpenOffice.org on your computer.'))
|
||||
self.easiSlidesFilenameLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
||||
self.easiSlidesBrowseButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Browse...'))
|
||||
self.easiSlidesBrowseButton.setText(UiStrings.Browse)
|
||||
self.ewFilenameLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
||||
self.ewBrowseButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Browse...'))
|
||||
self.ewBrowseButton.setText(UiStrings.Browse)
|
||||
self.songBeamerAddButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||
self.songBeamerRemoveButton.setText(
|
||||
@ -317,17 +299,13 @@ class SongImportForm(OpenLPWizard):
|
||||
translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
||||
# self.csvFilenameLabel.setText(
|
||||
# translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
||||
# self.csvBrowseButton.setText(
|
||||
# translate('SongsPlugin.ImportWizardForm', 'Browse...'))
|
||||
self.progressPage.setTitle(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Importing'))
|
||||
# self.csvBrowseButton.setText(UiStrings.Browse)
|
||||
self.progressPage.setTitle(WizardStrings.Importing)
|
||||
self.progressPage.setSubTitle(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Please wait while your songs are imported.'))
|
||||
self.progressLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Ready.'))
|
||||
self.progressBar.setFormat(
|
||||
translate('SongsPlugin.ImportWizardForm', '%p%'))
|
||||
self.progressLabel.setText(WizardStrings.Ready)
|
||||
self.progressBar.setFormat(WizardStrings.PercentSymbolFormat)
|
||||
# Align all QFormLayouts towards each other.
|
||||
width = max(self.formatLabel.minimumSizeHint().width(),
|
||||
self.openLP2FilenameLabel.minimumSizeHint().width())
|
||||
@ -344,122 +322,76 @@ class SongImportForm(OpenLPWizard):
|
||||
source_format = self.formatComboBox.currentIndex()
|
||||
if source_format == SongFormat.OpenLP2:
|
||||
if self.openLP2FilenameEdit.text().isEmpty():
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No OpenLP 2.0 Song Database Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to select an OpenLP 2.0 song database '
|
||||
'file to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSs,
|
||||
WizardStrings.YouSpecifyFile % UiStrings.OLPV2)
|
||||
self.openLP2BrowseButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.OpenLP1:
|
||||
if self.openLP1FilenameEdit.text().isEmpty():
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No openlp.org 1.x Song Database Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to select an openlp.org 1.x song '
|
||||
'database file to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSs,
|
||||
WizardStrings.YouSpecifyFile % UiStrings.OLPV1)
|
||||
self.openLP1BrowseButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.OpenLyrics:
|
||||
if self.openLyricsFileListWidget.count() == 0:
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No OpenLyrics Files Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to add at least one OpenLyrics '
|
||||
'song file to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSp,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.OL)
|
||||
self.openLyricsAddButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.OpenSong:
|
||||
if self.openSongFileListWidget.count() == 0:
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No OpenSong Files Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to add at least one OpenSong '
|
||||
'song file to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSp,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.OS)
|
||||
self.openSongAddButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.WordsOfWorship:
|
||||
if self.wordsOfWorshipFileListWidget.count() == 0:
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No Words of Worship Files Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to add at least one Words of Worship '
|
||||
'file to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSp,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.WoW)
|
||||
self.wordsOfWorshipAddButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.CCLI:
|
||||
if self.ccliFileListWidget.count() == 0:
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No CCLI Files Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to add at least one CCLI file '
|
||||
'to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSp,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.CCLI)
|
||||
self.ccliAddButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.SongsOfFellowship:
|
||||
if self.songsOfFellowshipFileListWidget.count() == 0:
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No Songs of Fellowship File Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to add at least one Songs of Fellowship '
|
||||
'file to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSp,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.SoF)
|
||||
self.songsOfFellowshipAddButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.Generic:
|
||||
if self.genericFileListWidget.count() == 0:
|
||||
critical_error_message_box(
|
||||
critical_error_message_box(UiStrings.NFSp,
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No Document/Presentation Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to add at least one document or '
|
||||
'You need to specify at least one document or '
|
||||
'presentation file to import from.'))
|
||||
self.genericAddButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.EasiSlides:
|
||||
if self.easiSlidesFilenameEdit.text().isEmpty():
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No Easislides Songs file selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to select an xml song file exported from '
|
||||
'EasiSlides, to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSp,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.ES)
|
||||
self.easiSlidesBrowseButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.EasyWorship:
|
||||
if self.ewFilenameEdit.text().isEmpty():
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No EasyWorship Song Database Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to select an EasyWorship song database '
|
||||
'file to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSs,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.EW)
|
||||
self.ewBrowseButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.SongBeamer:
|
||||
if self.songBeamerFileListWidget.count() == 0:
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No SongBeamer File Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to add at least one SongBeamer '
|
||||
'file to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSp,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.SB)
|
||||
self.songBeamerAddButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.SongShowPlus:
|
||||
if self.songShowPlusFileListWidget.count() == 0:
|
||||
critical_error_message_box(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'No SongShow Plus Files Selected'),
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'You need to add at least one SongShow Plus '
|
||||
'file to import from.'))
|
||||
critical_error_message_box(UiStrings.NFSp,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.SSP)
|
||||
self.wordsOfWorshipAddButton.setFocus()
|
||||
return False
|
||||
return True
|
||||
@ -490,8 +422,7 @@ class SongImportForm(OpenLPWizard):
|
||||
filters)
|
||||
if filenames:
|
||||
listbox.addItems(filenames)
|
||||
SettingsManager.set_last_dir(
|
||||
self.plugin.settingsSection,
|
||||
SettingsManager.set_last_dir(self.plugin.settingsSection,
|
||||
os.path.split(unicode(filenames[0]))[0], 1)
|
||||
|
||||
def getListOfFiles(self, listbox):
|
||||
@ -515,9 +446,7 @@ class SongImportForm(OpenLPWizard):
|
||||
"""
|
||||
Get OpenLP v2 song database file
|
||||
"""
|
||||
self.getFileName(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select OpenLP 2.0 Database File'),
|
||||
self.getFileName(WizardStrings.OpenTypeFile % UiStrings.OLPV2,
|
||||
self.openLP2FilenameEdit, u'%s (*.sqlite)'
|
||||
% (translate('SongsPlugin.ImportWizardForm',
|
||||
'OpenLP 2.0 Databases'))
|
||||
@ -527,9 +456,7 @@ class SongImportForm(OpenLPWizard):
|
||||
"""
|
||||
Get OpenLP v1 song database file
|
||||
"""
|
||||
self.getFileName(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select openlp.org 1.x Database File'),
|
||||
self.getFileName(WizardStrings.OpenTypeFile % UiStrings.OLPV1,
|
||||
self.openLP1FilenameEdit, u'%s (*.olp)'
|
||||
% translate('SongsPlugin.ImportWizardForm',
|
||||
'openlp.org v1.x Databases')
|
||||
@ -539,11 +466,8 @@ class SongImportForm(OpenLPWizard):
|
||||
"""
|
||||
Get OpenLyrics song database files
|
||||
"""
|
||||
self.getFiles(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select OpenLyrics Files'),
|
||||
self.openLyricsFileListWidget
|
||||
)
|
||||
self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.OL,
|
||||
self.openLyricsFileListWidget)
|
||||
|
||||
def onOpenLyricsRemoveButtonClicked(self):
|
||||
"""
|
||||
@ -555,10 +479,8 @@ class SongImportForm(OpenLPWizard):
|
||||
"""
|
||||
Get OpenSong song database files
|
||||
"""
|
||||
self.getFiles(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Select Open Song Files'),
|
||||
self.openSongFileListWidget
|
||||
)
|
||||
self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.OS,
|
||||
self.openSongFileListWidget)
|
||||
|
||||
def onOpenSongRemoveButtonClicked(self):
|
||||
"""
|
||||
@ -570,9 +492,7 @@ class SongImportForm(OpenLPWizard):
|
||||
"""
|
||||
Get Words of Worship song database files
|
||||
"""
|
||||
self.getFiles(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select Words of Worship Files'),
|
||||
self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.WoW,
|
||||
self.wordsOfWorshipFileListWidget, u'%s (*.wsg *.wow-song)'
|
||||
% translate('SongsPlugin.ImportWizardForm',
|
||||
'Words Of Worship Song Files')
|
||||
@ -588,11 +508,8 @@ class SongImportForm(OpenLPWizard):
|
||||
"""
|
||||
Get CCLI song database files
|
||||
"""
|
||||
self.getFiles(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select CCLI Files'),
|
||||
self.ccliFileListWidget
|
||||
)
|
||||
self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.CCLI,
|
||||
self.ccliFileListWidget)
|
||||
|
||||
def onCCLIRemoveButtonClicked(self):
|
||||
"""
|
||||
@ -604,9 +521,7 @@ class SongImportForm(OpenLPWizard):
|
||||
"""
|
||||
Get Songs of Fellowship song database files
|
||||
"""
|
||||
self.getFiles(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select Songs of Fellowship Files'),
|
||||
self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.SoF,
|
||||
self.songsOfFellowshipFileListWidget, u'%s (*.rtf)'
|
||||
% translate('SongsPlugin.ImportWizardForm',
|
||||
'Songs Of Fellowship Song Files')
|
||||
@ -635,29 +550,21 @@ class SongImportForm(OpenLPWizard):
|
||||
self.removeSelectedItems(self.genericFileListWidget)
|
||||
|
||||
def onEasiSlidesBrowseButtonClicked(self):
|
||||
self.getFileName(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select EasiSlides songfile'),
|
||||
self.easiSlidesFilenameEdit
|
||||
)
|
||||
self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.ES,
|
||||
self.easiSlidesFilenameEdit)
|
||||
|
||||
def onEWBrowseButtonClicked(self):
|
||||
"""
|
||||
Get EasyWorship song database files
|
||||
"""
|
||||
self.getFileName(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select EasyWorship Database File'),
|
||||
self.ewFilenameEdit
|
||||
)
|
||||
self.getFileName(WizardStrings.OpenTypeFile % WizardStrings.EW,
|
||||
self.ewFilenameEdit)
|
||||
|
||||
def onSongBeamerAddButtonClicked(self):
|
||||
"""
|
||||
Get SongBeamer song database files
|
||||
"""
|
||||
self.getFiles(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select SongBeamer Files'),
|
||||
self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.SB,
|
||||
self.songBeamerFileListWidget, u'%s (*.sng)' %
|
||||
translate('SongsPlugin.ImportWizardForm', 'SongBeamer Files')
|
||||
)
|
||||
@ -672,9 +579,7 @@ class SongImportForm(OpenLPWizard):
|
||||
"""
|
||||
Get SongShow Plus song database files
|
||||
"""
|
||||
self.getFiles(
|
||||
translate('SongsPlugin.ImportWizardForm',
|
||||
'Select SongShow Plus Files'),
|
||||
self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.SSP,
|
||||
self.songShowPlusFileListWidget, u'%s (*.sbsong)'
|
||||
% translate('SongsPlugin.ImportWizardForm',
|
||||
'SongShow Plus Song Files')
|
||||
@ -713,8 +618,7 @@ class SongImportForm(OpenLPWizard):
|
||||
Perform pre import tasks
|
||||
"""
|
||||
OpenLPWizard.preWizard(self)
|
||||
self.progressLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Starting import...'))
|
||||
self.progressLabel.setText(WizardStrings.StartingImport)
|
||||
Receiver.send_message(u'openlp_process_events')
|
||||
|
||||
def performWizard(self):
|
||||
@ -763,7 +667,7 @@ class SongImportForm(OpenLPWizard):
|
||||
self.songsOfFellowshipFileListWidget)
|
||||
)
|
||||
elif source_format == SongFormat.Generic:
|
||||
# Import a generic document or presentatoin
|
||||
# Import a generic document or presentation
|
||||
importer = self.plugin.importSongs(SongFormat.Generic,
|
||||
filenames=self.getListOfFiles(self.genericFileListWidget)
|
||||
)
|
||||
@ -785,12 +689,10 @@ class SongImportForm(OpenLPWizard):
|
||||
elif source_format == SongFormat.SongShowPlus:
|
||||
# Import ShongShow Plus songs
|
||||
importer = self.plugin.importSongs(SongFormat.SongShowPlus,
|
||||
filenames=self.getListOfFiles(
|
||||
self.songShowPlusFileListWidget)
|
||||
filenames=self.getListOfFiles(self.songShowPlusFileListWidget)
|
||||
)
|
||||
if importer.do_import():
|
||||
self.progressLabel.setText(
|
||||
translate('SongsPlugin.SongImportForm', 'Finished import.'))
|
||||
self.progressLabel.setText(WizardStrings.FinishedImport)
|
||||
else:
|
||||
self.progressLabel.setText(
|
||||
translate('SongsPlugin.SongImportForm',
|
||||
|
@ -26,8 +26,9 @@
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import build_icon, translate
|
||||
from openlp.core.lib import build_icon
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
from openlp.plugins.songs.lib.ui import SongStrings
|
||||
|
||||
class Ui_SongMaintenanceDialog(object):
|
||||
def setupUi(self, songMaintenanceDialog):
|
||||
@ -144,14 +145,10 @@ class Ui_SongMaintenanceDialog(object):
|
||||
QtCore.QMetaObject.connectSlotsByName(songMaintenanceDialog)
|
||||
|
||||
def retranslateUi(self, songMaintenanceDialog):
|
||||
songMaintenanceDialog.setWindowTitle(
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'Song Maintenance'))
|
||||
authorsString = UiStrings.Authors
|
||||
topicsString = translate('SongsPlugin.SongMaintenanceForm', 'Topics')
|
||||
booksString = translate('SongsPlugin.SongMaintenanceForm', 'Song Books')
|
||||
self.listItemAuthors.setText(authorsString)
|
||||
self.listItemTopics.setText(topicsString)
|
||||
self.listItemBooks.setText(booksString)
|
||||
songMaintenanceDialog.setWindowTitle(SongStrings.SongMaintenance)
|
||||
self.listItemAuthors.setText(SongStrings.Authors)
|
||||
self.listItemTopics.setText(SongStrings.Topics)
|
||||
self.listItemBooks.setText(SongStrings.SongBooks)
|
||||
self.authorsAddButton.setText(UiStrings.Add)
|
||||
self.authorsEditButton.setText(UiStrings.Edit)
|
||||
self.authorsDeleteButton.setText(UiStrings.Delete)
|
||||
@ -161,8 +158,8 @@ class Ui_SongMaintenanceDialog(object):
|
||||
self.booksAddButton.setText(UiStrings.Add)
|
||||
self.booksEditButton.setText(UiStrings.Edit)
|
||||
self.booksDeleteButton.setText(UiStrings.Delete)
|
||||
typeListWidth = max(self.fontMetrics().width(authorsString),
|
||||
self.fontMetrics().width(topicsString),
|
||||
self.fontMetrics().width(booksString))
|
||||
typeListWidth = max(self.fontMetrics().width(SongStrings.Authors),
|
||||
self.fontMetrics().width(SongStrings.Topics),
|
||||
self.fontMetrics().width(SongStrings.SongBooks))
|
||||
self.typeListWidget.setFixedWidth(typeListWidth +
|
||||
self.typeListWidget.iconSize().width() + 32)
|
||||
|
@ -29,7 +29,7 @@ from PyQt4 import QtGui, QtCore
|
||||
from sqlalchemy.sql import and_
|
||||
|
||||
from openlp.core.lib import Receiver, translate
|
||||
from openlp.core.lib.ui import critical_error_message_box
|
||||
from openlp.core.lib.ui import UiStrings, critical_error_message_box
|
||||
from openlp.plugins.songs.forms import AuthorsForm, TopicsForm, SongBookForm
|
||||
from openlp.plugins.songs.lib.db import Author, Book, Topic, Song
|
||||
from songmaintenancedialog import Ui_SongMaintenanceDialog
|
||||
@ -103,19 +103,19 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
|
||||
return -1
|
||||
|
||||
def _deleteItem(self, item_class, list_widget, reset_func, dlg_title,
|
||||
del_text, err_text, sel_text):
|
||||
del_text, err_text):
|
||||
item_id = self._getCurrentItemId(list_widget)
|
||||
if item_id != -1:
|
||||
item = self.manager.get_object(item_class, item_id)
|
||||
if item and len(item.songs) == 0:
|
||||
if critical_error_message_box(title=dlg_title, message=del_text,
|
||||
parent=self, question=True) == QtGui.QMessageBox.Yes:
|
||||
if critical_error_message_box(dlg_title, del_text, self,
|
||||
True) == QtGui.QMessageBox.Yes:
|
||||
self.manager.delete_object(item_class, item.id)
|
||||
reset_func()
|
||||
else:
|
||||
critical_error_message_box(dlg_title, err_text)
|
||||
else:
|
||||
critical_error_message_box(dlg_title, sel_text)
|
||||
critical_error_message_box(dlg_title, UiStrings.NISs)
|
||||
|
||||
def resetAuthors(self):
|
||||
"""
|
||||
@ -268,11 +268,9 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
|
||||
temp_last_name = author.last_name
|
||||
temp_display_name = author.display_name
|
||||
if self.authorform.exec_(False):
|
||||
author.first_name = unicode(
|
||||
self.authorform.firstNameEdit.text())
|
||||
author.first_name = unicode(self.authorform.firstNameEdit.text())
|
||||
author.last_name = unicode(self.authorform.lastNameEdit.text())
|
||||
author.display_name = unicode(
|
||||
self.authorform.displayEdit.text())
|
||||
author.display_name = unicode(self.authorform.displayEdit.text())
|
||||
if self.checkAuthor(author, True):
|
||||
if self.manager.save_object(author):
|
||||
self.resetAuthors()
|
||||
@ -450,10 +448,8 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'Delete Author'),
|
||||
translate('SongsPlugin.SongMaintenanceForm',
|
||||
'Are you sure you want to delete the selected author?'),
|
||||
translate('SongsPlugin.SongMaintenanceForm',
|
||||
'This author cannot be deleted, they are currently '
|
||||
'assigned to at least one song.'),
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'No author selected!'))
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'This author cannot '
|
||||
'be deleted, they are currently assigned to at least one song.'))
|
||||
|
||||
def onTopicDeleteButtonClick(self):
|
||||
"""
|
||||
@ -463,10 +459,8 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'Delete Topic'),
|
||||
translate('SongsPlugin.SongMaintenanceForm',
|
||||
'Are you sure you want to delete the selected topic?'),
|
||||
translate('SongsPlugin.SongMaintenanceForm',
|
||||
'This topic cannot be deleted, it is currently '
|
||||
'assigned to at least one song.'),
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'No topic selected!'))
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'This topic cannot '
|
||||
'be deleted, it is currently assigned to at least one song.'))
|
||||
|
||||
def onBookDeleteButtonClick(self):
|
||||
"""
|
||||
@ -476,10 +470,8 @@ class SongMaintenanceForm(QtGui.QDialog, Ui_SongMaintenanceDialog):
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'Delete Book'),
|
||||
translate('SongsPlugin.SongMaintenanceForm',
|
||||
'Are you sure you want to delete the selected book?'),
|
||||
translate('SongsPlugin.SongMaintenanceForm',
|
||||
'This book cannot be deleted, it is currently '
|
||||
'assigned to at least one song.'),
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'No book selected!'))
|
||||
translate('SongsPlugin.SongMaintenanceForm', 'This book cannot be '
|
||||
'deleted, it is currently assigned to at least one song.'))
|
||||
|
||||
def onAuthorsListRowChanged(self, row):
|
||||
"""
|
||||
|
@ -40,68 +40,147 @@ class VerseType(object):
|
||||
Ending = 5
|
||||
Other = 6
|
||||
|
||||
@staticmethod
|
||||
def to_string(verse_type):
|
||||
"""
|
||||
Return a string for a given VerseType
|
||||
Names = [
|
||||
u'Verse',
|
||||
u'Chorus',
|
||||
u'Bridge',
|
||||
u'Pre-Chorus',
|
||||
u'Intro',
|
||||
u'Ending',
|
||||
u'Other']
|
||||
Tags = [name[0].lower() for name in Names]
|
||||
|
||||
``verse_type``
|
||||
The type to return a string for
|
||||
"""
|
||||
if not isinstance(verse_type, int):
|
||||
verse_type = verse_type.lower()
|
||||
if verse_type == VerseType.Verse or verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Verse)).lower()[0]:
|
||||
return translate('SongsPlugin.VerseType', 'Verse')
|
||||
elif verse_type == VerseType.Chorus or verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Chorus)).lower()[0]:
|
||||
return translate('SongsPlugin.VerseType', 'Chorus')
|
||||
elif verse_type == VerseType.Bridge or verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Bridge)).lower()[0]:
|
||||
return translate('SongsPlugin.VerseType', 'Bridge')
|
||||
elif verse_type == VerseType.PreChorus or verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.PreChorus)).lower()[0]:
|
||||
return translate('SongsPlugin.VerseType', 'Pre-Chorus')
|
||||
elif verse_type == VerseType.Intro or verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Intro)).lower()[0]:
|
||||
return translate('SongsPlugin.VerseType', 'Intro')
|
||||
elif verse_type == VerseType.Ending or verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Ending)).lower()[0]:
|
||||
return translate('SongsPlugin.VerseType', 'Ending')
|
||||
elif verse_type == VerseType.Other or verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Other)).lower()[0]:
|
||||
return translate('SongsPlugin.VerseType', 'Other')
|
||||
TranslatedNames = [
|
||||
unicode(translate('SongsPlugin.VerseType', 'Verse')),
|
||||
unicode(translate('SongsPlugin.VerseType', 'Chorus')),
|
||||
unicode(translate('SongsPlugin.VerseType', 'Bridge')),
|
||||
unicode(translate('SongsPlugin.VerseType', 'Pre-Chorus')),
|
||||
unicode(translate('SongsPlugin.VerseType', 'Intro')),
|
||||
unicode(translate('SongsPlugin.VerseType', 'Ending')),
|
||||
unicode(translate('SongsPlugin.VerseType', 'Other'))]
|
||||
TranslatedTags = [name[0].lower() for name in TranslatedNames]
|
||||
|
||||
@staticmethod
|
||||
def from_string(verse_type):
|
||||
def translated_tag(verse_tag, strict=False):
|
||||
"""
|
||||
Return the translated UPPERCASE tag for a given tag,
|
||||
used to show translated verse tags in UI
|
||||
|
||||
``verse_tag``
|
||||
The string to return a VerseType for
|
||||
|
||||
``strict``
|
||||
Determines if the default Other or None should be returned
|
||||
"""
|
||||
if strict:
|
||||
not_found_value = None
|
||||
else:
|
||||
not_found_value = VerseType.TranslatedTags[VerseType.Other].upper()
|
||||
verse_tag = verse_tag[0].lower()
|
||||
for num, tag in enumerate(VerseType.Tags):
|
||||
if verse_tag == tag:
|
||||
return VerseType.TranslatedTags[num].upper()
|
||||
return not_found_value
|
||||
|
||||
@staticmethod
|
||||
def translated_name(verse_tag, strict=False):
|
||||
"""
|
||||
Return the translated name for a given tag
|
||||
|
||||
``verse_tag``
|
||||
The string to return a VerseType for
|
||||
|
||||
``strict``
|
||||
Determines if the default Other or None should be returned
|
||||
"""
|
||||
if strict:
|
||||
not_found_value = None
|
||||
else:
|
||||
not_found_value = VerseType.TranslatedNames[VerseType.Other]
|
||||
verse_tag = verse_tag[0].lower()
|
||||
for num, tag in enumerate(VerseType.Tags):
|
||||
if verse_tag == tag:
|
||||
return VerseType.TranslatedNames[num]
|
||||
return not_found_value
|
||||
|
||||
@staticmethod
|
||||
def from_tag(verse_tag, strict=False):
|
||||
"""
|
||||
Return the VerseType for a given tag
|
||||
|
||||
``verse_tag``
|
||||
The string to return a VerseType for
|
||||
|
||||
``strict``
|
||||
Determines if the default Other or None should be returned
|
||||
"""
|
||||
if strict:
|
||||
no_return_value = None
|
||||
else:
|
||||
no_return_value = VerseType.Other
|
||||
verse_tag = verse_tag[0].lower()
|
||||
for num, tag in enumerate(VerseType.Tags):
|
||||
if verse_tag == tag:
|
||||
return num
|
||||
return no_return_value
|
||||
|
||||
@staticmethod
|
||||
def from_translated_tag(verse_tag):
|
||||
"""
|
||||
Return the VerseType for a given tag
|
||||
|
||||
``verse_tag``
|
||||
The string to return a VerseType for
|
||||
"""
|
||||
verse_tag = verse_tag[0].lower()
|
||||
for num, tag in enumerate(VerseType.TranslatedTags):
|
||||
if verse_tag == tag:
|
||||
return num
|
||||
|
||||
@staticmethod
|
||||
def from_string(verse_name):
|
||||
"""
|
||||
Return the VerseType for a given string
|
||||
|
||||
``verse_type``
|
||||
``verse_name``
|
||||
The string to return a VerseType for
|
||||
"""
|
||||
verse_type = verse_type.lower()
|
||||
if verse_type == unicode(VerseType.to_string(VerseType.Verse)).lower():
|
||||
return VerseType.Verse
|
||||
elif verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Chorus)).lower():
|
||||
return VerseType.Chorus
|
||||
elif verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Bridge)).lower():
|
||||
return VerseType.Bridge
|
||||
elif verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.PreChorus)).lower():
|
||||
return VerseType.PreChorus
|
||||
elif verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Intro)).lower():
|
||||
return VerseType.Intro
|
||||
elif verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Ending)).lower():
|
||||
return VerseType.Ending
|
||||
elif verse_type == \
|
||||
unicode(VerseType.to_string(VerseType.Other)).lower():
|
||||
return VerseType.Other
|
||||
verse_name = verse_name.lower()
|
||||
for num, name in enumerate(VerseType.Names):
|
||||
if verse_name == name.lower():
|
||||
return num
|
||||
|
||||
@staticmethod
|
||||
def from_translated_string(verse_name):
|
||||
"""
|
||||
Return the VerseType for a given string
|
||||
|
||||
``verse_name``
|
||||
The string to return a VerseType for
|
||||
"""
|
||||
verse_name = verse_name.lower()
|
||||
for num, translation in enumerate(VerseType.TranslatedNames):
|
||||
if verse_name == translation.lower():
|
||||
return num
|
||||
|
||||
@staticmethod
|
||||
def from_loose_input(verse_name):
|
||||
"""
|
||||
Return the VerseType for a given string, Other if not found
|
||||
|
||||
``verse_name``
|
||||
The string to return a VerseType for
|
||||
"""
|
||||
verse_index = None
|
||||
if len(verse_name) > 1:
|
||||
verse_index = VerseType.from_translated_string(verse_name)
|
||||
if verse_index is None:
|
||||
verse_index = VerseType.from_string(verse_name)
|
||||
if verse_index is None:
|
||||
verse_index = VerseType.from_translated_tag(verse_name)
|
||||
if verse_index is None:
|
||||
verse_index = VerseType.from_tag(verse_name)
|
||||
return verse_index
|
||||
|
||||
def retrieve_windows_encoding(recommendation=None):
|
||||
"""
|
||||
|
@ -51,22 +51,17 @@ class CCLIFileImport(SongImport):
|
||||
``filenames``
|
||||
The files to be imported.
|
||||
"""
|
||||
SongImport.__init__(self, manager)
|
||||
if u'filenames' in kwargs:
|
||||
self.filenames = kwargs[u'filenames']
|
||||
log.debug(self.filenames)
|
||||
else:
|
||||
raise KeyError(u'Keyword argument "filenames" not supplied.')
|
||||
SongImport.__init__(self, manager, **kwargs)
|
||||
|
||||
def do_import(self):
|
||||
"""
|
||||
Import either a .usr or a .txt SongSelect file
|
||||
"""
|
||||
log.debug(u'Starting CCLI File Import')
|
||||
song_total = len(self.filenames)
|
||||
song_total = len(self.import_source)
|
||||
self.import_wizard.progressBar.setMaximum(song_total)
|
||||
song_count = 1
|
||||
for filename in self.filenames:
|
||||
for filename in self.import_source:
|
||||
self.import_wizard.incrementProgressBar(unicode(translate(
|
||||
'SongsPlugin.CCLIFileImport', 'Importing song %d of %d')) %
|
||||
(song_count, song_total))
|
||||
@ -204,8 +199,11 @@ class CCLIFileImport(SongImport):
|
||||
if len(author_list) < 2:
|
||||
author_list = song_author.split(u'|')
|
||||
for author in author_list:
|
||||
seperated = author.split(u',')
|
||||
self.add_author(seperated[1].strip() + u' ' + seperated[0].strip())
|
||||
separated = author.split(u',')
|
||||
if len(separated) > 1:
|
||||
self.add_author(u' '.join(reversed(separated)))
|
||||
else:
|
||||
self.add_author(author)
|
||||
self.title = song_name
|
||||
self.copyright = song_copyright
|
||||
self.ccli_number = song_ccli
|
||||
|
@ -30,6 +30,7 @@ from lxml import etree, objectify
|
||||
import re
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.songs.lib.songimport import SongImport
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -45,33 +46,30 @@ class EasiSlidesImport(SongImport):
|
||||
"""
|
||||
Initialise the class.
|
||||
"""
|
||||
SongImport.__init__(self, manager)
|
||||
self.filename = kwargs[u'filename']
|
||||
self.song = None
|
||||
SongImport.__init__(self, manager, **kwargs)
|
||||
self.commit = True
|
||||
|
||||
def do_import(self):
|
||||
"""
|
||||
Import either each of the files in self.filenames - each element of
|
||||
Import either each of the files in self.import_sources - each element of
|
||||
which can be either a single opensong file, or a zipfile containing
|
||||
multiple opensong files. If `self.commit` is set False, the
|
||||
import will not be committed to the database (useful for test scripts).
|
||||
"""
|
||||
self.import_wizard.progressBar.setMaximum(1)
|
||||
log.info(u'Importing EasiSlides XML file %s', self.filename)
|
||||
log.info(u'Importing EasiSlides XML file %s', self.import_source)
|
||||
parser = etree.XMLParser(remove_blank_text=True)
|
||||
file = etree.parse(self.filename, parser)
|
||||
file = etree.parse(self.import_source, parser)
|
||||
xml = unicode(etree.tostring(file))
|
||||
song_xml = objectify.fromstring(xml)
|
||||
self.import_wizard.incrementProgressBar(
|
||||
unicode(translate('SongsPlugin.ImportWizardForm',
|
||||
u'Importing %s...')) % os.path.split(self.filename)[-1])
|
||||
WizardStrings.ImportingType % os.path.split(self.import_source)[-1])
|
||||
self.import_wizard.progressBar.setMaximum(len(song_xml.Item))
|
||||
for song in song_xml.Item:
|
||||
self.import_wizard.incrementProgressBar(
|
||||
unicode(translate('SongsPlugin.ImportWizardForm',
|
||||
u'Importing %s, song %s...')) %
|
||||
(os.path.split(self.filename)[-1], song.Title1))
|
||||
(os.path.split(self.import_source)[-1], song.Title1))
|
||||
success = self._parse_song(song)
|
||||
if not success or self.stop_import_flag:
|
||||
return False
|
||||
@ -81,14 +79,16 @@ class EasiSlidesImport(SongImport):
|
||||
|
||||
def _parse_song(self, song):
|
||||
self._success = True
|
||||
self._add_unicode_attribute(self.title, song.Title1, True)
|
||||
self._add_unicode_attribute(self.alternate_title, song.Title2)
|
||||
self._add_unicode_attribute(self.song_number, song.SongNumber)
|
||||
self._add_unicode_attribute(u'title', song.Title1, True)
|
||||
self._add_unicode_attribute(u'alternate_title', song.Title2)
|
||||
self._add_unicode_attribute(u'song_number', song.SongNumber)
|
||||
if self.song_number == u'0':
|
||||
self.song_number = u''
|
||||
self._add_authors(song)
|
||||
self._add_copyright(song)
|
||||
self._add_unicode_attribute(self.song_book_name, song.BookReference)
|
||||
self._add_copyright(song.Copyright)
|
||||
self._add_copyright(song.LicenceAdmin1)
|
||||
self._add_copyright(song.LicenceAdmin2)
|
||||
self._add_unicode_attribute(u'song_book_name', song.BookReference)
|
||||
self._parse_and_add_lyrics(song)
|
||||
return self._success
|
||||
|
||||
@ -110,7 +110,7 @@ class EasiSlidesImport(SongImport):
|
||||
Signals that this attribute must exist in a valid song.
|
||||
"""
|
||||
try:
|
||||
self_attribute = unicode(import_attribute).strip()
|
||||
setattr(self, self_attribute, unicode(import_attribute).strip())
|
||||
except UnicodeDecodeError:
|
||||
log.exception(u'UnicodeDecodeError decoding %s' % import_attribute)
|
||||
self._success = False
|
||||
@ -124,7 +124,7 @@ class EasiSlidesImport(SongImport):
|
||||
authors = unicode(song.Writer).split(u',')
|
||||
for author in authors:
|
||||
author = author.strip()
|
||||
if len(author) > 0:
|
||||
if len(author):
|
||||
self.authors.append(author)
|
||||
except UnicodeDecodeError:
|
||||
log.exception(u'Unicode decode error while decoding Writer')
|
||||
@ -132,35 +132,18 @@ class EasiSlidesImport(SongImport):
|
||||
except AttributeError:
|
||||
pass
|
||||
|
||||
def _add_copyright(self, song):
|
||||
"""
|
||||
Assign the copyright information from the import to the song being
|
||||
created.
|
||||
|
||||
``song``
|
||||
The current song being imported.
|
||||
"""
|
||||
copyright_list = []
|
||||
self.__add_copyright_element(copyright_list, song.Copyright)
|
||||
self.__add_copyright_element(copyright_list, song.LicenceAdmin1)
|
||||
self.__add_copyright_element(copyright_list, song.LicenceAdmin2)
|
||||
self.add_copyright(u' '.join(copyright_list))
|
||||
|
||||
def __add_copyright_element(self, copyright_list, element):
|
||||
def _add_copyright(self, element):
|
||||
"""
|
||||
Add a piece of copyright to the total copyright information for the
|
||||
song.
|
||||
|
||||
``copyright_list``
|
||||
The array to add the information to.
|
||||
|
||||
``element``
|
||||
The imported variable to get the data from.
|
||||
"""
|
||||
try:
|
||||
copyright_list.append(unicode(element).strip())
|
||||
self.add_copyright(unicode(element).strip())
|
||||
except UnicodeDecodeError:
|
||||
log.exception(u'Unicode error decoding %s' % element)
|
||||
log.exception(u'Unicode error on decoding copyright: %s' % element)
|
||||
self._success = False
|
||||
except AttributeError:
|
||||
pass
|
||||
@ -285,10 +268,12 @@ class EasiSlidesImport(SongImport):
|
||||
# as these appeared originally in the file
|
||||
for [reg, vt, vn, inst] in our_verse_order:
|
||||
if self._listHas(verses, [reg, vt, vn, inst]):
|
||||
# this is false, but needs user input
|
||||
lang = None
|
||||
versetag = u'%s%s' % (vt, vn)
|
||||
versetags.append(versetag)
|
||||
lines = u'\n'.join(verses[reg][vt][vn][inst])
|
||||
self.verses.append([versetag, lines])
|
||||
self.verses.append([versetag, lines, lang])
|
||||
|
||||
SeqTypes = {
|
||||
u'p': u'P1',
|
||||
|
@ -32,6 +32,7 @@ import os
|
||||
import struct
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.songs.lib import retrieve_windows_encoding
|
||||
from songimport import SongImport
|
||||
|
||||
@ -134,8 +135,7 @@ class EasyWorshipSongImport(SongImport):
|
||||
ability to import EasyWorship song files.
|
||||
"""
|
||||
def __init__(self, manager, **kwargs):
|
||||
self.import_source = kwargs[u'filename']
|
||||
SongImport.__init__(self, manager)
|
||||
SongImport.__init__(self, manager, **kwargs)
|
||||
|
||||
def do_import(self):
|
||||
# Open the DB and MB files if they exist
|
||||
@ -231,8 +231,7 @@ class EasyWorshipSongImport(SongImport):
|
||||
title = self.get_field(fi_title)
|
||||
if title:
|
||||
self.import_wizard.incrementProgressBar(
|
||||
unicode(translate('SongsPlugin.ImportWizardForm',
|
||||
'Importing "%s"...')) % title, 0)
|
||||
WizardStrings.ImportingType % title, 0)
|
||||
self.title = title
|
||||
# Get remaining fields
|
||||
copy = self.get_field(fi_copy)
|
||||
|
@ -33,15 +33,26 @@ from sqlalchemy.sql import or_
|
||||
|
||||
from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \
|
||||
translate, check_item_selected, PluginStatus
|
||||
from openlp.core.lib.searchedit import SearchEdit
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \
|
||||
SongImportForm, SongExportForm
|
||||
from openlp.plugins.songs.lib import OpenLyrics, SongXML
|
||||
from openlp.plugins.songs.lib import OpenLyrics, SongXML, VerseType
|
||||
from openlp.plugins.songs.lib.db import Author, Song
|
||||
from openlp.core.lib.searchedit import SearchEdit
|
||||
from openlp.plugins.songs.lib.ui import SongStrings
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
class SongSearch(object):
|
||||
"""
|
||||
An enumeration for song search methods.
|
||||
"""
|
||||
Entire = 1
|
||||
Titles = 2
|
||||
Lyrics = 3
|
||||
Authors = 4
|
||||
Themes = 5
|
||||
|
||||
class SongMediaItem(MediaManagerItem):
|
||||
"""
|
||||
This is the custom media manager item for Songs.
|
||||
@ -124,25 +135,23 @@ class SongMediaItem(MediaManagerItem):
|
||||
QtCore.QVariant(u'True')).toBool()
|
||||
|
||||
def retranslateUi(self):
|
||||
self.searchTextLabel.setText(
|
||||
translate('SongsPlugin.MediaItem', 'Search:'))
|
||||
self.searchTextButton.setText(
|
||||
translate('SongsPlugin.MediaItem', 'Search'))
|
||||
self.maintenanceAction.setText(
|
||||
translate('SongsPlugin.MediaItem', 'Song Maintenance'))
|
||||
self.searchTextLabel.setText(u'%s:' % UiStrings.Search)
|
||||
self.searchTextButton.setText(UiStrings.Search)
|
||||
self.maintenanceAction.setText(SongStrings.SongMaintenance)
|
||||
self.maintenanceAction.setToolTip(translate('SongsPlugin.MediaItem',
|
||||
'Maintain the lists of authors, topics and books'))
|
||||
|
||||
def initialise(self):
|
||||
self.searchTextEdit.setSearchTypes([
|
||||
(1, u':/songs/song_search_all.png',
|
||||
(SongSearch.Entire, u':/songs/song_search_all.png',
|
||||
translate('SongsPlugin.MediaItem', 'Entire Song')),
|
||||
(2, u':/songs/song_search_title.png',
|
||||
(SongSearch.Titles, u':/songs/song_search_title.png',
|
||||
translate('SongsPlugin.MediaItem', 'Titles')),
|
||||
(3, u':/songs/song_search_lyrics.png',
|
||||
(SongSearch.Lyrics, u':/songs/song_search_lyrics.png',
|
||||
translate('SongsPlugin.MediaItem', 'Lyrics')),
|
||||
(4, u':/songs/song_search_author.png', UiStrings.Authors),
|
||||
(5, u':/slides/slide_theme.png', UiStrings.Themes)
|
||||
(SongSearch.Authors, u':/songs/song_search_author.png',
|
||||
SongStrings.Authors),
|
||||
(SongSearch.Themes, u':/slides/slide_theme.png', UiStrings.Themes)
|
||||
])
|
||||
self.configUpdated()
|
||||
|
||||
@ -151,7 +160,7 @@ class SongMediaItem(MediaManagerItem):
|
||||
search_results = []
|
||||
# search_type = self.searchTypeComboBox.currentIndex()
|
||||
search_type = self.searchTextEdit.currentSearchType()
|
||||
if search_type == 1:
|
||||
if search_type == SongSearch.Entire:
|
||||
log.debug(u'Entire Song Search')
|
||||
search_results = self.parent.manager.get_all_objects(Song,
|
||||
or_(Song.search_title.like(u'%' + self.whitespace.sub(u' ',
|
||||
@ -159,25 +168,25 @@ class SongMediaItem(MediaManagerItem):
|
||||
Song.search_lyrics.like(u'%' + search_keywords.lower() + \
|
||||
u'%')), Song.search_title.asc())
|
||||
self.displayResultsSong(search_results)
|
||||
if search_type == 2:
|
||||
elif search_type == SongSearch.Titles:
|
||||
log.debug(u'Titles Search')
|
||||
search_results = self.parent.manager.get_all_objects(Song,
|
||||
Song.search_title.like(u'%' + self.whitespace.sub(u' ',
|
||||
search_keywords.lower()) + u'%'), Song.search_title.asc())
|
||||
self.displayResultsSong(search_results)
|
||||
elif search_type == 3:
|
||||
elif search_type == SongSearch.Lyrics:
|
||||
log.debug(u'Lyrics Search')
|
||||
search_results = self.parent.manager.get_all_objects(Song,
|
||||
Song.search_lyrics.like(u'%' + search_keywords.lower() + u'%'),
|
||||
Song.search_lyrics.asc())
|
||||
self.displayResultsSong(search_results)
|
||||
elif search_type == 4:
|
||||
elif search_type == SongSearch.Authors:
|
||||
log.debug(u'Authors Search')
|
||||
search_results = self.parent.manager.get_all_objects(Author,
|
||||
Author.display_name.like(u'%' + search_keywords + u'%'),
|
||||
Author.display_name.asc())
|
||||
self.displayResultsAuthor(search_results)
|
||||
elif search_type == 5:
|
||||
elif search_type == SongSearch.Themes:
|
||||
log.debug(u'Theme Search')
|
||||
search_results = self.parent.manager.get_all_objects(Song,
|
||||
Song.theme_name == search_keywords, Song.search_lyrics.asc())
|
||||
@ -296,9 +305,7 @@ class SongMediaItem(MediaManagerItem):
|
||||
Edit a song
|
||||
"""
|
||||
log.debug(u'onEditClick')
|
||||
if check_item_selected(self.listView,
|
||||
translate('SongsPlugin.MediaItem',
|
||||
'You must select an item to edit.')):
|
||||
if check_item_selected(self.listView, UiStrings.SelectEdit):
|
||||
self.editItem = self.listView.currentItem()
|
||||
item_id = (self.editItem.data(QtCore.Qt.UserRole)).toInt()[0]
|
||||
self.edit_song_form.loadSong(item_id, False)
|
||||
@ -308,9 +315,7 @@ class SongMediaItem(MediaManagerItem):
|
||||
"""
|
||||
Remove a song from the list and database
|
||||
"""
|
||||
if check_item_selected(self.listView,
|
||||
translate('SongsPlugin.MediaItem',
|
||||
'You must select an item to delete.')):
|
||||
if check_item_selected(self.listView, UiStrings.SelectDelete):
|
||||
items = self.listView.selectedIndexes()
|
||||
if QtGui.QMessageBox.question(self,
|
||||
translate('SongsPlugin.MediaItem', 'Delete Song(s)?'),
|
||||
@ -344,24 +349,49 @@ class SongMediaItem(MediaManagerItem):
|
||||
if song.lyrics.startswith(u'<?xml version='):
|
||||
verseList = SongXML().get_verses(song.lyrics)
|
||||
# no verse list or only 1 space (in error)
|
||||
if not song.verse_order or not song.verse_order.strip():
|
||||
verse_tags_translated = False
|
||||
if VerseType.from_translated_string(unicode(
|
||||
verseList[0][0][u'type'])) is not None:
|
||||
verse_tags_translated = True
|
||||
if not song.verse_order.strip():
|
||||
for verse in verseList:
|
||||
verseTag = u'%s:%s' % (
|
||||
verse[0][u'type'], verse[0][u'label'])
|
||||
# We cannot use from_loose_input() here, because database
|
||||
# is supposed to contain English lowercase singlechar tags.
|
||||
verse_tag = verse[0][u'type']
|
||||
verse_index = None
|
||||
if len(verse_tag) > 1:
|
||||
verse_index = \
|
||||
VerseType.from_translated_string(verse_tag)
|
||||
if verse_index is None:
|
||||
verse_index = VerseType.from_string(verse_tag)
|
||||
if verse_index is None:
|
||||
verse_index = VerseType.from_tag(verse_tag)
|
||||
verse_tag = VerseType.TranslatedTags[verse_index].upper()
|
||||
verse_def = u'%s%s' % (verse_tag, verse[0][u'label'])
|
||||
service_item.add_from_text(
|
||||
verse[1][:30], unicode(verse[1]), verseTag)
|
||||
verse[1][:30], unicode(verse[1]), verse_def)
|
||||
else:
|
||||
# Loop through the verse list and expand the song accordingly.
|
||||
for order in song.verse_order.upper().split():
|
||||
for order in song.verse_order.lower().split():
|
||||
if len(order) == 0:
|
||||
break
|
||||
for verse in verseList:
|
||||
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'])
|
||||
if verse[0][u'type'][0].lower() == order[0] and \
|
||||
(verse[0][u'label'].lower() == order[1:] or \
|
||||
not order[1:]):
|
||||
if verse_tags_translated:
|
||||
verse_index = VerseType.from_translated_tag(
|
||||
verse[0][u'type'])
|
||||
else:
|
||||
verse_index = VerseType.from_tag(
|
||||
verse[0][u'type'])
|
||||
if verse_index is None:
|
||||
verse_index = VerseType.Other
|
||||
verse_tag = VerseType.TranslatedTags[verse_index]
|
||||
verse_def = u'%s%s' % (verse_tag,
|
||||
verse[0][u'label'])
|
||||
service_item.add_from_text(
|
||||
verse[1][:30], verse[1], verseTag)
|
||||
verse[1][:30], verse[1], verse_def)
|
||||
else:
|
||||
verses = song.lyrics.split(u'\n\n')
|
||||
for slide in verses:
|
||||
|
@ -32,7 +32,7 @@ import logging
|
||||
from chardet.universaldetector import UniversalDetector
|
||||
import sqlite
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.songs.lib import retrieve_windows_encoding
|
||||
from songimport import SongImport
|
||||
|
||||
@ -55,8 +55,7 @@ class OpenLP1SongImport(SongImport):
|
||||
``filename``
|
||||
The database providing the data to import.
|
||||
"""
|
||||
SongImport.__init__(self, manager)
|
||||
self.import_source = kwargs[u'filename']
|
||||
SongImport.__init__(self, manager, **kwargs)
|
||||
|
||||
def do_import(self):
|
||||
"""
|
||||
@ -103,8 +102,7 @@ class OpenLP1SongImport(SongImport):
|
||||
lyrics = song[2].replace(u'\r\n', u'\n')
|
||||
copyright = song[3]
|
||||
self.import_wizard.incrementProgressBar(
|
||||
unicode(translate('SongsPlugin.ImportWizardForm',
|
||||
'Importing "%s"...')) % title)
|
||||
WizardStrings.ImportingType % title)
|
||||
self.title = title
|
||||
verses = lyrics.split(u'\n\n')
|
||||
for verse in verses:
|
||||
|
@ -86,9 +86,8 @@ class OpenLPSongImport(SongImport):
|
||||
``source_db``
|
||||
The database providing the data to import.
|
||||
"""
|
||||
SongImport.__init__(self, manager)
|
||||
self.import_source = u'sqlite:///%s' % kwargs[u'filename']
|
||||
log.debug(self.import_source)
|
||||
SongImport.__init__(self, manager, **kwargs)
|
||||
self.import_source = u'sqlite:///%s' % self.import_source
|
||||
self.source_session = None
|
||||
|
||||
def do_import(self):
|
||||
|
@ -28,7 +28,6 @@ import os
|
||||
|
||||
from PyQt4 import QtCore
|
||||
|
||||
from openlp.core.lib import Receiver
|
||||
from openlp.core.utils import get_uno_command, get_uno_instance
|
||||
from songimport import SongImport
|
||||
|
||||
@ -56,20 +55,15 @@ class OooImport(SongImport):
|
||||
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.master_manager = master_manager
|
||||
SongImport.__init__(self, master_manager, **kwargs)
|
||||
self.document = None
|
||||
self.process_started = False
|
||||
self.filenames = kwargs[u'filenames']
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'openlp_stop_wizard'), self.stop_import)
|
||||
|
||||
def do_import(self):
|
||||
self.stop_import_flag = False
|
||||
self.import_wizard.progressBar.setMaximum(0)
|
||||
self.start_ooo()
|
||||
for filename in self.filenames:
|
||||
for filename in self.import_source:
|
||||
if self.stop_import_flag:
|
||||
self.import_wizard.incrementProgressBar(u'Import cancelled', 0)
|
||||
return
|
||||
|
0
openlp/plugins/songs/lib/openlyricsexport.py
Executable file → Normal file
0
openlp/plugins/songs/lib/openlyricsexport.py
Executable file → Normal file
@ -33,7 +33,7 @@ import os
|
||||
|
||||
from lxml import etree
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.songs.lib.songimport import SongImport
|
||||
from openlp.plugins.songs.lib import OpenLyrics
|
||||
|
||||
@ -48,13 +48,8 @@ class OpenLyricsImport(SongImport):
|
||||
Initialise the import.
|
||||
"""
|
||||
log.debug(u'initialise OpenLyricsImport')
|
||||
SongImport.__init__(self, master_manager)
|
||||
self.master_manager = master_manager
|
||||
self.openLyrics = OpenLyrics(master_manager)
|
||||
if kwargs.has_key(u'filename'):
|
||||
self.import_source = kwargs[u'filename']
|
||||
if kwargs.has_key(u'filenames'):
|
||||
self.import_source = kwargs[u'filenames']
|
||||
SongImport.__init__(self, master_manager, **kwargs)
|
||||
self.openLyrics = OpenLyrics(self.manager)
|
||||
|
||||
def do_import(self):
|
||||
"""
|
||||
@ -65,9 +60,8 @@ class OpenLyricsImport(SongImport):
|
||||
for file_path in self.import_source:
|
||||
if self.stop_import_flag:
|
||||
return False
|
||||
self.import_wizard.incrementProgressBar(unicode(translate(
|
||||
'SongsPlugin.OpenLyricsImport', 'Importing %s...')) %
|
||||
os.path.basename(file_path))
|
||||
self.import_wizard.incrementProgressBar(
|
||||
WizardStrings.ImportingType % os.path.basename(file_path))
|
||||
try:
|
||||
parsed_file = etree.parse(file_path, parser)
|
||||
xml = unicode(etree.tostring(parsed_file))
|
||||
|
@ -31,7 +31,7 @@ from lxml import objectify
|
||||
from lxml.etree import Error, LxmlError
|
||||
import re
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.songs.lib.songimport import SongImport
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -105,21 +105,19 @@ class OpenSongImport(SongImport):
|
||||
"""
|
||||
Initialise the class.
|
||||
"""
|
||||
SongImport.__init__(self, manager)
|
||||
self.filenames = kwargs[u'filenames']
|
||||
self.song = None
|
||||
SongImport.__init__(self, manager, **kwargs)
|
||||
self.commit = True
|
||||
|
||||
def do_import(self):
|
||||
"""
|
||||
Import either each of the files in self.filenames - each element of
|
||||
Import either each of the files in self.import_source - each element of
|
||||
which can be either a single opensong file, or a zipfile containing
|
||||
multiple opensong files. If `self.commit` is set False, the
|
||||
import will not be committed to the database (useful for test scripts).
|
||||
"""
|
||||
success = True
|
||||
numfiles = 0
|
||||
for filename in self.filenames:
|
||||
for filename in self.import_source:
|
||||
ext = os.path.splitext(filename)[1]
|
||||
if ext.lower() == u'.zip':
|
||||
z = ZipFile(filename, u'r')
|
||||
@ -128,7 +126,7 @@ class OpenSongImport(SongImport):
|
||||
numfiles += 1
|
||||
log.debug(u'Total number of files: %d', numfiles)
|
||||
self.import_wizard.progressBar.setMaximum(numfiles)
|
||||
for filename in self.filenames:
|
||||
for filename in self.import_source:
|
||||
if self.stop_import_flag:
|
||||
success = False
|
||||
break
|
||||
@ -146,26 +144,26 @@ class OpenSongImport(SongImport):
|
||||
continue
|
||||
log.info(u'Zip importing %s', parts[-1])
|
||||
self.import_wizard.incrementProgressBar(
|
||||
unicode(translate('SongsPlugin.ImportWizardForm',
|
||||
'Importing %s...')) % parts[-1])
|
||||
WizardStrings.ImportingType % parts[-1])
|
||||
songfile = z.open(song)
|
||||
self.do_import_file(songfile)
|
||||
if self.commit:
|
||||
if self.do_import_file(songfile) and self.commit and \
|
||||
not self.stop_import_flag:
|
||||
self.finish()
|
||||
if self.stop_import_flag:
|
||||
else:
|
||||
success = False
|
||||
break
|
||||
else:
|
||||
# not a zipfile
|
||||
log.info(u'Direct import %s', filename)
|
||||
self.import_wizard.incrementProgressBar(
|
||||
unicode(translate('SongsPlugin.ImportWizardForm',
|
||||
'Importing %s...')) % os.path.split(filename)[-1])
|
||||
file = open(filename)
|
||||
self.do_import_file(file)
|
||||
if self.commit:
|
||||
WizardStrings.ImportingType % os.path.split(filename)[-1])
|
||||
song_file = open(filename)
|
||||
if self.do_import_file(song_file) and self.commit and \
|
||||
not self.stop_import_flag:
|
||||
self.finish()
|
||||
|
||||
else:
|
||||
success = False
|
||||
break
|
||||
return success
|
||||
|
||||
def do_import_file(self, file):
|
||||
@ -178,7 +176,7 @@ class OpenSongImport(SongImport):
|
||||
tree = objectify.parse(file)
|
||||
except (Error, LxmlError):
|
||||
log.exception(u'Error parsing XML')
|
||||
return
|
||||
return False
|
||||
root = tree.getroot()
|
||||
fields = dir(root)
|
||||
decode = {
|
||||
@ -196,114 +194,103 @@ class OpenSongImport(SongImport):
|
||||
setattr(self, fn_or_string, ustring)
|
||||
else:
|
||||
fn_or_string(ustring)
|
||||
if not len(self.title):
|
||||
# to prevent creation of empty songs from wrong files
|
||||
return False
|
||||
if u'theme' in fields and unicode(root.theme) not in self.topics:
|
||||
self.topics.append(unicode(root.theme))
|
||||
if u'alttheme' in fields and unicode(root.alttheme) not in self.topics:
|
||||
self.topics.append(unicode(root.alttheme))
|
||||
# data storage while importing
|
||||
verses = {}
|
||||
# keep track of a "default" verse order, in case none is specified
|
||||
# keep track of verses appearance order
|
||||
our_verse_order = []
|
||||
verses_seen = {}
|
||||
# in the absence of any other indication, verses are the default,
|
||||
# erm, versetype!
|
||||
versetype = u'V'
|
||||
versenum = None
|
||||
# default verse
|
||||
verse_tag = u'v'
|
||||
verse_num = u'1'
|
||||
# for the case where song has several sections with same marker
|
||||
inst = 1
|
||||
lyrics = unicode(root.lyrics)
|
||||
for thisline in lyrics.split(u'\n'):
|
||||
for this_line in lyrics.split(u'\n'):
|
||||
# remove comments
|
||||
semicolon = thisline.find(u';')
|
||||
semicolon = this_line.find(u';')
|
||||
if semicolon >= 0:
|
||||
thisline = thisline[:semicolon]
|
||||
thisline = thisline.strip()
|
||||
if len(thisline) == 0:
|
||||
this_line = this_line[:semicolon]
|
||||
this_line = this_line.strip()
|
||||
if not len(this_line):
|
||||
continue
|
||||
# skip inthisline guitar chords and page and column breaks
|
||||
if thisline[0] == u'.' or thisline.startswith(u'---') \
|
||||
or thisline.startswith(u'-!!'):
|
||||
# skip guitar chords and page and column breaks
|
||||
if this_line.startswith(u'.') or this_line.startswith(u'---') \
|
||||
or this_line.startswith(u'-!!'):
|
||||
continue
|
||||
# verse/chorus/etc. marker
|
||||
if thisline[0] == u'[':
|
||||
if this_line.startswith(u'['):
|
||||
# drop the square brackets
|
||||
right_bracket = thisline.find(u']')
|
||||
content = thisline[1:right_bracket].upper()
|
||||
right_bracket = this_line.find(u']')
|
||||
content = this_line[1:right_bracket].lower()
|
||||
# have we got any digits?
|
||||
# If so, verse number is everything from the digits
|
||||
# to the end (even if there are some alpha chars on the end)
|
||||
match = re.match(u'(.*)(\d+.*)', content)
|
||||
if match is not None:
|
||||
versetype = match.group(1)
|
||||
versenum = match.group(2)
|
||||
verse_tag = match.group(1)
|
||||
verse_num = match.group(2)
|
||||
else:
|
||||
# otherwise we assume number 1 and take the whole prefix as
|
||||
# the versetype
|
||||
versetype = content
|
||||
versenum = u'1'
|
||||
# the verse tag
|
||||
verse_tag = content
|
||||
verse_num = u'1'
|
||||
inst = 1
|
||||
if [verse_tag, verse_num, inst] in our_verse_order \
|
||||
and verses.has_key(verse_tag) \
|
||||
and verses[verse_tag].has_key(verse_num):
|
||||
inst = len(verses[verse_tag][verse_num])+1
|
||||
our_verse_order.append([verse_tag, verse_num, inst])
|
||||
continue
|
||||
words = None
|
||||
# number at start of line.. it's verse number
|
||||
if thisline[0].isdigit():
|
||||
versenum = thisline[0]
|
||||
words = thisline[1:].strip()
|
||||
if words is None:
|
||||
words = thisline
|
||||
if not versenum:
|
||||
versenum = u'1'
|
||||
if versenum is not None:
|
||||
versetag = u'%s%s' % (versetype, versenum)
|
||||
if not verses.has_key(versetype):
|
||||
verses[versetype] = {}
|
||||
if not verses[versetype].has_key(versenum):
|
||||
# storage for lines in this verse
|
||||
verses[versetype][versenum] = []
|
||||
if not verses_seen.has_key(versetag):
|
||||
verses_seen[versetag] = 1
|
||||
our_verse_order.append(versetag)
|
||||
if words:
|
||||
if this_line[0].isdigit():
|
||||
verse_num = this_line[0]
|
||||
this_line = this_line[1:].strip()
|
||||
our_verse_order.append([verse_tag, verse_num, inst])
|
||||
if not verses.has_key(verse_tag):
|
||||
verses[verse_tag] = {}
|
||||
if not verses[verse_tag].has_key(verse_num):
|
||||
verses[verse_tag][verse_num] = {}
|
||||
if not verses[verse_tag][verse_num].has_key(inst):
|
||||
verses[verse_tag][verse_num][inst] = []
|
||||
# Tidy text and remove the ____s from extended words
|
||||
words = self.tidy_text(words)
|
||||
words = words.replace('_', '')
|
||||
verses[versetype][versenum].append(words)
|
||||
this_line = self.tidy_text(this_line)
|
||||
this_line = this_line.replace(u'_', u'')
|
||||
this_line = this_line.replace(u'|', u'\n')
|
||||
verses[verse_tag][verse_num][inst].append(this_line)
|
||||
# done parsing
|
||||
versetypes = verses.keys()
|
||||
versetypes.sort()
|
||||
versetags = {}
|
||||
for versetype in versetypes:
|
||||
our_verse_type = versetype
|
||||
if our_verse_type == u'':
|
||||
our_verse_type = u'V'
|
||||
versenums = verses[versetype].keys()
|
||||
versenums.sort()
|
||||
for num in versenums:
|
||||
versetag = u'%s%s' % (our_verse_type, num)
|
||||
lines = u'\n'.join(verses[versetype][num])
|
||||
self.add_verse(lines, versetag)
|
||||
# Keep track of what we have for error checking later
|
||||
versetags[versetag] = 1
|
||||
# now figure out the presentation order
|
||||
order = []
|
||||
# add verses in original order
|
||||
for (verse_tag, verse_num, inst) in our_verse_order:
|
||||
verse_def = u'%s%s' % (verse_tag, verse_num)
|
||||
lines = u'\n'.join(verses[verse_tag][verse_num][inst])
|
||||
self.add_verse(lines, verse_def)
|
||||
# figure out the presentation order, if present
|
||||
if u'presentation' in fields and root.presentation != u'':
|
||||
order = unicode(root.presentation)
|
||||
# We make all the tags in the lyrics upper case, so match that here
|
||||
# We make all the tags in the lyrics lower case, so match that here
|
||||
# and then split into a list on the whitespace
|
||||
order = order.upper().split()
|
||||
order = order.lower().split()
|
||||
for verse_def in order:
|
||||
match = re.match(u'(.*)(\d+.*)', verse_def)
|
||||
if match is not None:
|
||||
verse_tag = match.group(1)
|
||||
verse_num = match.group(2)
|
||||
if not len(verse_tag):
|
||||
verse_tag = u'v'
|
||||
else:
|
||||
if len(our_verse_order) > 0:
|
||||
order = our_verse_order
|
||||
# Assume it's no.1 if there are no digits
|
||||
verse_tag = verse_def
|
||||
verse_num = u'1'
|
||||
verse_def = u'%s%s' % (verse_tag, verse_num)
|
||||
if verses.has_key(verse_tag) \
|
||||
and verses[verse_tag].has_key(verse_num):
|
||||
self.verse_order_list.append(verse_def)
|
||||
else:
|
||||
log.warn(u'No verse order available for %s, skipping.',
|
||||
self.title)
|
||||
# TODO: make sure that the default order list will be overwritten, if
|
||||
# the songs provides its own order list.
|
||||
for tag in order:
|
||||
if tag[0].isdigit():
|
||||
# Assume it's a verse if it has no prefix
|
||||
tag = u'V' + tag
|
||||
elif not re.search('\d+', tag):
|
||||
# Assume it's no.1 if there's no digits
|
||||
tag = tag + u'1'
|
||||
if not versetags.has_key(tag):
|
||||
log.info(u'Got order %s but not in versetags, dropping this'
|
||||
u'item from presentation order', tag)
|
||||
else:
|
||||
self.verse_order_list.append(tag)
|
||||
log.info(u'Got order %s but not in verse tags, dropping'
|
||||
u'this item from presentation order', verse_def)
|
||||
return True
|
||||
|
@ -33,7 +33,7 @@ import logging
|
||||
import os
|
||||
import re
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.songs.lib.songimport import SongImport
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -74,12 +74,7 @@ class SongBeamerImport(SongImport):
|
||||
``master_manager``
|
||||
The song manager for the running OpenLP installation.
|
||||
"""
|
||||
SongImport.__init__(self, master_manager)
|
||||
if kwargs.has_key(u'filename'):
|
||||
self.import_source = kwargs[u'filename']
|
||||
if kwargs.has_key(u'filenames'):
|
||||
self.import_source = kwargs[u'filenames']
|
||||
log.debug(self.import_source)
|
||||
SongImport.__init__(self, master_manager, **kwargs)
|
||||
|
||||
def do_import(self):
|
||||
"""
|
||||
@ -96,7 +91,7 @@ class SongBeamerImport(SongImport):
|
||||
read_verses = False
|
||||
file_name = os.path.split(file)[1]
|
||||
self.import_wizard.incrementProgressBar(
|
||||
u'Importing %s' % (file_name), 0)
|
||||
WizardStrings.ImportingType % file_name, 0)
|
||||
if os.path.isfile(file):
|
||||
detect_file = open(file, u'r')
|
||||
details = chardet.detect(detect_file.read(2048))
|
||||
@ -134,9 +129,8 @@ class SongBeamerImport(SongImport):
|
||||
self.add_verse(self.current_verse, self.current_verse_type)
|
||||
if self.check_complete():
|
||||
self.finish()
|
||||
self.import_wizard.incrementProgressBar(unicode(translate(
|
||||
'SongsPlugin.SongBeamerImport', 'Importing %s...')) %
|
||||
file_name)
|
||||
self.import_wizard.incrementProgressBar(
|
||||
WizardStrings.ImportingType % file_name)
|
||||
return True
|
||||
|
||||
def replace_html_tags(self):
|
||||
|
@ -31,6 +31,7 @@ from PyQt4 import QtCore
|
||||
from openlp.core.lib import Receiver, translate
|
||||
from openlp.plugins.songs.lib import VerseType
|
||||
from openlp.plugins.songs.lib.db import Song, Author, Topic, Book, MediaFile
|
||||
from openlp.plugins.songs.lib.ui import SongStrings
|
||||
from openlp.plugins.songs.lib.xml import SongXML
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
@ -43,7 +44,7 @@ class SongImport(QtCore.QObject):
|
||||
whether the authors etc already exist and add them or refer to them
|
||||
as necessary
|
||||
"""
|
||||
def __init__(self, manager):
|
||||
def __init__(self, manager, **kwargs):
|
||||
"""
|
||||
Initialise and create defaults for properties
|
||||
|
||||
@ -53,6 +54,14 @@ class SongImport(QtCore.QObject):
|
||||
|
||||
"""
|
||||
self.manager = manager
|
||||
if kwargs.has_key(u'filename'):
|
||||
self.import_source = kwargs[u'filename']
|
||||
elif kwargs.has_key(u'filenames'):
|
||||
self.import_source = kwargs[u'filenames']
|
||||
else:
|
||||
raise KeyError(u'Keyword arguments "filename[s]" not supplied.')
|
||||
log.debug(self.import_source)
|
||||
self.song = None
|
||||
self.stop_import_flag = False
|
||||
self.set_defaults()
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
@ -75,13 +84,13 @@ class SongImport(QtCore.QObject):
|
||||
self.media_files = []
|
||||
self.song_book_name = u''
|
||||
self.song_book_pub = u''
|
||||
self.verse_order_list_generated_useful = False
|
||||
self.verse_order_list_generated = []
|
||||
self.verse_order_list = []
|
||||
self.verses = []
|
||||
self.versecounts = {}
|
||||
self.verse_counts = {}
|
||||
self.copyright_string = unicode(translate(
|
||||
'SongsPlugin.SongImport', 'copyright'))
|
||||
self.copyright_symbol = unicode(translate(
|
||||
'SongsPlugin.SongImport', '\xa9'))
|
||||
|
||||
def stop_import(self):
|
||||
"""
|
||||
@ -128,20 +137,20 @@ class SongImport(QtCore.QObject):
|
||||
return text
|
||||
|
||||
def process_song_text(self, text):
|
||||
versetexts = text.split(u'\n\n')
|
||||
for versetext in versetexts:
|
||||
if versetext.strip() != u'':
|
||||
self.process_verse_text(versetext.strip())
|
||||
verse_texts = text.split(u'\n\n')
|
||||
for verse_text in verse_texts:
|
||||
if verse_text.strip() != u'':
|
||||
self.process_verse_text(verse_text.strip())
|
||||
|
||||
def process_verse_text(self, text):
|
||||
lines = text.split(u'\n')
|
||||
if text.lower().find(self.copyright_string) >= 0 \
|
||||
or text.lower().find(self.copyright_symbol) >= 0:
|
||||
or text.find(SongStrings.CopyrightSymbol) >= 0:
|
||||
copyright_found = False
|
||||
for line in lines:
|
||||
if (copyright_found or
|
||||
line.lower().find(self.copyright_string) >= 0 or
|
||||
line.lower().find(self.copyright_symbol) >= 0):
|
||||
line.find(SongStrings.CopyrightSymbol) >= 0):
|
||||
copyright_found = True
|
||||
self.add_copyright(line)
|
||||
else:
|
||||
@ -198,45 +207,46 @@ class SongImport(QtCore.QObject):
|
||||
return
|
||||
self.media_files.append(filename)
|
||||
|
||||
def add_verse(self, versetext, versetag=u'V', lang=None):
|
||||
def add_verse(self, verse_text, verse_def=u'v', lang=None):
|
||||
"""
|
||||
Add a verse. This is the whole verse, lines split by \\n. It will also
|
||||
attempt to detect duplicates. In this case it will just add to the verse
|
||||
order.
|
||||
|
||||
``versetext``
|
||||
``verse_text``
|
||||
The text of the verse.
|
||||
|
||||
``versetag``
|
||||
The verse tag can be V1/C1/B etc, or 'V' and 'C' (will count the
|
||||
``verse_def``
|
||||
The verse tag can be v1/c1/b etc, or 'v' and 'c' (will count the
|
||||
verses/choruses itself) or None, where it will assume verse.
|
||||
|
||||
``lang``
|
||||
The language code (ISO-639) of the verse, for example *en* or *de*.
|
||||
|
||||
"""
|
||||
for (oldversetag, oldverse, oldlang) in self.verses:
|
||||
if oldverse.strip() == versetext.strip():
|
||||
self.verse_order_list.append(oldversetag)
|
||||
for (old_verse_def, old_verse, old_lang) in self.verses:
|
||||
if old_verse.strip() == verse_text.strip():
|
||||
self.verse_order_list_generated.append(old_verse_def)
|
||||
self.verse_order_list_generated_useful = True
|
||||
return
|
||||
if versetag[0] in self.versecounts:
|
||||
self.versecounts[versetag[0]] += 1
|
||||
if verse_def[0] in self.verse_counts:
|
||||
self.verse_counts[verse_def[0]] += 1
|
||||
else:
|
||||
self.versecounts[versetag[0]] = 1
|
||||
if len(versetag) == 1:
|
||||
versetag += unicode(self.versecounts[versetag[0]])
|
||||
elif int(versetag[1:]) > self.versecounts[versetag[0]]:
|
||||
self.versecounts[versetag[0]] = int(versetag[1:])
|
||||
self.verses.append([versetag, versetext.rstrip(), lang])
|
||||
self.verse_order_list.append(versetag)
|
||||
if versetag.startswith(u'V') and u'C1' in self.verse_order_list:
|
||||
self.verse_order_list.append(u'C1')
|
||||
self.verse_counts[verse_def[0]] = 1
|
||||
if len(verse_def) == 1:
|
||||
verse_def += unicode(self.verse_counts[verse_def[0]])
|
||||
elif int(verse_def[1:]) > self.verse_counts[verse_def[0]]:
|
||||
self.verse_counts[verse_def[0]] = int(verse_def[1:])
|
||||
self.verses.append([verse_def, verse_text.rstrip(), lang])
|
||||
self.verse_order_list_generated.append(verse_def)
|
||||
|
||||
def repeat_verse(self):
|
||||
"""
|
||||
Repeat the previous verse in the verse order
|
||||
"""
|
||||
self.verse_order_list.append(self.verse_order_list[-1])
|
||||
self.verse_order_list_generated.append(
|
||||
self.verse_order_list_generated[-1])
|
||||
self.verse_order_list_generated_useful = True
|
||||
|
||||
def check_complete(self):
|
||||
"""
|
||||
@ -260,9 +270,8 @@ class SongImport(QtCore.QObject):
|
||||
All fields have been set to this song. Write the song to disk.
|
||||
"""
|
||||
if not self.authors:
|
||||
self.authors.append(unicode(translate('SongsPlugin.SongImport',
|
||||
'Author unknown')))
|
||||
log.info(u'commiting song %s to database', self.title)
|
||||
self.authors.append(SongStrings.AuthorUnknownUnT)
|
||||
log.info(u'committing song %s to database', self.title)
|
||||
song = Song()
|
||||
song.title = self.title
|
||||
song.alternate_title = self.alternate_title
|
||||
@ -273,34 +282,29 @@ class SongImport(QtCore.QObject):
|
||||
verses_changed_to_other = {}
|
||||
sxml = SongXML()
|
||||
other_count = 1
|
||||
for (versetag, versetext, lang) in self.verses:
|
||||
if versetag[0] == u'C':
|
||||
versetype = VerseType.to_string(VerseType.Chorus)
|
||||
elif versetag[0] == u'V':
|
||||
versetype = VerseType.to_string(VerseType.Verse)
|
||||
elif versetag[0] == u'B':
|
||||
versetype = VerseType.to_string(VerseType.Bridge)
|
||||
elif versetag[0] == u'I':
|
||||
versetype = VerseType.to_string(VerseType.Intro)
|
||||
elif versetag[0] == u'P':
|
||||
versetype = VerseType.to_string(VerseType.PreChorus)
|
||||
elif versetag[0] == u'E':
|
||||
versetype = VerseType.to_string(VerseType.Ending)
|
||||
for (verse_def, verse_text, lang) in self.verses:
|
||||
if verse_def[0].lower() in VerseType.Tags:
|
||||
verse_tag = verse_def[0].lower()
|
||||
else:
|
||||
newversetag = u'O%d' % other_count
|
||||
verses_changed_to_other[versetag] = newversetag
|
||||
new_verse_def = u'%s%d' % (VerseType.Tags[VerseType.Other],
|
||||
other_count)
|
||||
verses_changed_to_other[verse_def] = new_verse_def
|
||||
other_count += 1
|
||||
versetype = VerseType.to_string(VerseType.Other)
|
||||
log.info(u'Versetype %s changing to %s' , versetag, newversetag)
|
||||
versetag = newversetag
|
||||
sxml.add_verse_to_lyrics(versetype, versetag[1:], versetext, lang)
|
||||
song.search_lyrics += u' ' + self.remove_punctuation(versetext)
|
||||
verse_tag = VerseType.Tags[VerseType.Other]
|
||||
log.info(u'Versetype %s changing to %s' , verse_def,
|
||||
new_verse_def)
|
||||
verse_def = new_verse_def
|
||||
sxml.add_verse_to_lyrics(verse_tag, verse_def[1:], verse_text, lang)
|
||||
song.search_lyrics += u' ' + self.remove_punctuation(verse_text)
|
||||
song.search_lyrics = song.search_lyrics.lower()
|
||||
song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
|
||||
for i, current_verse_tag in enumerate(self.verse_order_list):
|
||||
if verses_changed_to_other.has_key(current_verse_tag):
|
||||
if not len(self.verse_order_list) and \
|
||||
self.verse_order_list_generated_useful:
|
||||
self.verse_order_list = self.verse_order_list_generated
|
||||
for i, current_verse_def in enumerate(self.verse_order_list):
|
||||
if verses_changed_to_other.has_key(current_verse_def):
|
||||
self.verse_order_list[i] = \
|
||||
verses_changed_to_other[current_verse_tag]
|
||||
verses_changed_to_other[current_verse_def]
|
||||
song.verse_order = u' '.join(self.verse_order_list)
|
||||
song.copyright = self.copyright
|
||||
song.comments = self.comments
|
||||
@ -345,9 +349,10 @@ class SongImport(QtCore.QObject):
|
||||
+ u'========================================'
|
||||
print u'TITLE: ' + self.title
|
||||
print u'ALT TITLE: ' + self.alternate_title
|
||||
for (versetag, versetext, lang) in self.verses:
|
||||
print u'VERSE ' + versetag + u': ' + versetext
|
||||
for (verse_def, verse_text, lang) in self.verses:
|
||||
print u'VERSE ' + verse_def + u': ' + verse_text
|
||||
print u'ORDER: ' + u' '.join(self.verse_order_list)
|
||||
print u'GENERATED ORDER: ' + u' '.join(self.verse_order_list_generated)
|
||||
for author in self.authors:
|
||||
print u'AUTHOR: ' + author
|
||||
if self.copyright:
|
||||
|
@ -31,6 +31,7 @@ import os
|
||||
import logging
|
||||
import struct
|
||||
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.songs.lib.songimport import SongImport
|
||||
|
||||
TITLE = 1
|
||||
@ -92,12 +93,7 @@ class SongShowPlusImport(SongImport):
|
||||
``master_manager``
|
||||
The song manager for the running OpenLP installation.
|
||||
"""
|
||||
SongImport.__init__(self, master_manager)
|
||||
if kwargs.has_key(u'filename'):
|
||||
self.import_source = kwargs[u'filename']
|
||||
if kwargs.has_key(u'filenames'):
|
||||
self.import_source = kwargs[u'filenames']
|
||||
log.debug(self.import_source)
|
||||
SongImport.__init__(self, master_manager, **kwargs)
|
||||
|
||||
def do_import(self):
|
||||
"""
|
||||
@ -112,7 +108,7 @@ class SongShowPlusImport(SongImport):
|
||||
otherList = {}
|
||||
file_name = os.path.split(file)[1]
|
||||
self.import_wizard.incrementProgressBar(
|
||||
u'Importing %s' % (file_name), 0)
|
||||
WizardStrings.ImportingType % file_name, 0)
|
||||
songData = open(file, 'rb')
|
||||
while (1):
|
||||
blockKey, = struct.unpack("I", songData.read(4))
|
||||
@ -178,7 +174,7 @@ class SongShowPlusImport(SongImport):
|
||||
songData.close()
|
||||
self.finish()
|
||||
self.import_wizard.incrementProgressBar(
|
||||
u'Importing %s' % (file_name))
|
||||
WizardStrings.ImportingType % file_name)
|
||||
return True
|
||||
|
||||
def toOpenLPVerseTag(self, verseName):
|
||||
|
46
openlp/plugins/songs/lib/ui.py
Normal file
46
openlp/plugins/songs/lib/ui.py
Normal file
@ -0,0 +1,46 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
||||
|
||||
###############################################################################
|
||||
# OpenLP - Open Source Lyrics Projection #
|
||||
# --------------------------------------------------------------------------- #
|
||||
# Copyright (c) 2008-2011 Raoul Snyman #
|
||||
# Portions copyright (c) 2008-2011 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 #
|
||||
###############################################################################
|
||||
"""
|
||||
The :mod:`openlp.plugins.songs.lib.ui` module provides standard UI components
|
||||
for the songs plugin.
|
||||
"""
|
||||
from openlp.core.lib import translate
|
||||
|
||||
class SongStrings(object):
|
||||
"""
|
||||
Provide standard strings for use throughout the songs plugin.
|
||||
"""
|
||||
# These strings should need a good reason to be retranslated elsewhere.
|
||||
Author = translate('OpenLP.Ui', 'Author', 'Singular')
|
||||
Authors = translate('OpenLP.Ui', 'Authors', 'Plural')
|
||||
AuthorUnknown = translate('OpenLP.Ui', 'Author Unknown') # Used in the UI.
|
||||
AuthorUnknownUnT = u'Author Unknown' # Used to populate the database.
|
||||
CopyrightSymbol = translate('OpenLP.Ui', '\xa9', 'Copyright symbol.')
|
||||
SongBook = translate('OpenLP.Ui', 'Song Book', 'Singular')
|
||||
SongBooks = translate('OpenLP.Ui', 'Song Books', 'Plural')
|
||||
SongMaintenance = translate('OpenLP.Ui', 'Song Maintenance')
|
||||
Topic = translate('OpenLP.Ui', 'Topic', 'Singular')
|
||||
Topics = translate('OpenLP.Ui', 'Topics', 'Plural')
|
@ -30,6 +30,7 @@ Worship songs into the OpenLP database.
|
||||
import os
|
||||
import logging
|
||||
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.songs.lib.songimport import SongImport
|
||||
|
||||
BLOCK_TYPES = (u'V', u'C', u'B')
|
||||
@ -98,12 +99,7 @@ class WowImport(SongImport):
|
||||
``master_manager``
|
||||
The song manager for the running OpenLP installation.
|
||||
"""
|
||||
SongImport.__init__(self, master_manager)
|
||||
if kwargs.has_key(u'filename'):
|
||||
self.import_source = kwargs[u'filename']
|
||||
if kwargs.has_key(u'filenames'):
|
||||
self.import_source = kwargs[u'filenames']
|
||||
log.debug(self.import_source)
|
||||
SongImport.__init__(self, master_manager, **kwargs)
|
||||
|
||||
def do_import(self):
|
||||
"""
|
||||
@ -116,7 +112,7 @@ class WowImport(SongImport):
|
||||
copyright = u''
|
||||
file_name = os.path.split(file)[1]
|
||||
self.import_wizard.incrementProgressBar(
|
||||
u'Importing %s' % (file_name), 0)
|
||||
WizardStrings.ImportingType % file_name, 0)
|
||||
# Get the song title
|
||||
self.title = file_name.rpartition(u'.')[0]
|
||||
songData = open(file, 'rb')
|
||||
@ -162,5 +158,5 @@ class WowImport(SongImport):
|
||||
songData.close()
|
||||
self.finish()
|
||||
self.import_wizard.incrementProgressBar(
|
||||
u'Importing %s' % (file_name))
|
||||
WizardStrings.ImportingType % file_name)
|
||||
return True
|
||||
|
@ -66,9 +66,9 @@ import re
|
||||
|
||||
from lxml import etree, objectify
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.plugins.songs.lib import VerseType
|
||||
from openlp.plugins.songs.lib.db import Author, Book, Song, Topic
|
||||
from openlp.plugins.songs.lib.ui import SongStrings
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -377,9 +377,7 @@ class OpenLyrics(object):
|
||||
except AttributeError:
|
||||
pass
|
||||
if not authors:
|
||||
# Add "Author unknown" (can be translated).
|
||||
authors.append((unicode(translate('SongsPlugin.XML',
|
||||
'Author unknown'))))
|
||||
authors.append(SongStrings.AuthorUnknownUnT)
|
||||
for display_name in authors:
|
||||
author = self.manager.get_object_filtered(Author,
|
||||
Author.display_name == display_name)
|
||||
@ -464,7 +462,8 @@ class OpenLyrics(object):
|
||||
text += u'\n'
|
||||
text += u'\n'.join([unicode(line) for line in lines.line])
|
||||
verse_name = self._get(verse, u'name')
|
||||
verse_type = unicode(VerseType.to_string(verse_name[0]))
|
||||
verse_type_index = VerseType.from_tag(verse_name[0])
|
||||
verse_type = VerseType.Names[verse_type_index]
|
||||
verse_number = re.compile(u'[a-zA-Z]*').sub(u'', verse_name)
|
||||
verse_part = re.compile(u'[0-9]*').sub(u'', verse_name[1:])
|
||||
# OpenLyrics allows e. g. "c", but we need "c1".
|
||||
|
@ -31,6 +31,7 @@ from PyQt4 import QtCore, QtGui
|
||||
|
||||
from openlp.core.lib import Plugin, StringContent, build_icon, translate
|
||||
from openlp.core.lib.db import Manager
|
||||
from openlp.core.lib.ui import UiStrings
|
||||
from openlp.plugins.songs.lib import SongMediaItem, SongsTab, SongXML
|
||||
from openlp.plugins.songs.lib.db import init_schema, Song
|
||||
from openlp.plugins.songs.lib.importer import SongFormat
|
||||
@ -137,8 +138,7 @@ class SongsPlugin(Plugin):
|
||||
"""
|
||||
maxSongs = self.manager.get_object_count(Song)
|
||||
progressDialog = QtGui.QProgressDialog(
|
||||
translate('SongsPlugin', 'Reindexing songs...'),
|
||||
translate('SongsPlugin', 'Cancel'),
|
||||
translate('SongsPlugin', 'Reindexing songs...'), UiStrings.Cancel,
|
||||
0, maxSongs + 1, self.formparent)
|
||||
progressDialog.setWindowModality(QtCore.Qt.WindowModal)
|
||||
songs = self.manager.get_all_objects(Song)
|
||||
|
@ -68,6 +68,7 @@ Source: ..\..\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs
|
||||
|
||||
[Icons]
|
||||
Name: {group}\{#AppName}; Filename: {app}\{#AppExeName}
|
||||
Name: {group}\{#AppName} (Debug); Filename: {app}\{#AppExeName}; Parameters: -l debug
|
||||
Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL}
|
||||
Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}
|
||||
Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon
|
||||
|
Loading…
Reference in New Issue
Block a user