forked from openlp/openlp
Head r1901
This commit is contained in:
commit
e487ca46fa
@ -53,60 +53,64 @@ class GeneralTab(SettingsTab):
|
||||
"""
|
||||
self.setObjectName(u'GeneralTab')
|
||||
SettingsTab.setupUi(self)
|
||||
self.tabLayout.setStretch(1, 1)
|
||||
# Monitors
|
||||
self.monitorGroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||
self.monitorGroupBox.setObjectName(u'monitorGroupBox')
|
||||
self.monitorLayout = QtGui.QFormLayout(self.monitorGroupBox)
|
||||
self.monitorLayout = QtGui.QGridLayout(self.monitorGroupBox)
|
||||
self.monitorLayout.setObjectName(u'monitorLayout')
|
||||
self.monitorLabel = QtGui.QLabel(self.monitorGroupBox)
|
||||
self.monitorLabel.setObjectName(u'monitorLabel')
|
||||
self.monitorLayout.addRow(self.monitorLabel)
|
||||
self.monitorRadioButton = QtGui.QRadioButton(self.monitorGroupBox)
|
||||
self.monitorRadioButton.setObjectName(u'monitorRadioButton')
|
||||
self.monitorLayout.addWidget(self.monitorRadioButton, 0, 0, 1, 5)
|
||||
self.monitorComboBox = QtGui.QComboBox(self.monitorGroupBox)
|
||||
self.monitorComboBox.setObjectName(u'monitorComboBox')
|
||||
self.monitorLayout.addRow(self.monitorComboBox)
|
||||
self.monitorLayout.addWidget(self.monitorComboBox, 1, 1, 1, 4)
|
||||
self.displayOnMonitorCheck = QtGui.QCheckBox(self.monitorGroupBox)
|
||||
self.displayOnMonitorCheck.setObjectName(u'monitorComboBox')
|
||||
self.monitorLayout.addRow(self.displayOnMonitorCheck)
|
||||
self.monitorLayout.addWidget(self.displayOnMonitorCheck, 2, 1, 1, 4)
|
||||
# Display Position
|
||||
self.overrideRadioButton = QtGui.QRadioButton(self.monitorGroupBox)
|
||||
self.overrideRadioButton.setObjectName(u'overrideRadioButton')
|
||||
self.monitorLayout.addWidget(self.overrideRadioButton, 3, 0, 1, 5)
|
||||
# Custom position
|
||||
self.customXLabel = QtGui.QLabel(self.monitorGroupBox)
|
||||
self.customXLabel.setObjectName(u'customXLabel')
|
||||
self.monitorLayout.addWidget(self.customXLabel, 4, 1)
|
||||
self.customXValueEdit = QtGui.QSpinBox(self.monitorGroupBox)
|
||||
self.customXValueEdit.setObjectName(u'customXValueEdit')
|
||||
self.customXValueEdit.setRange(-9999, 9999)
|
||||
self.monitorLayout.addWidget(self.customXValueEdit, 5, 1)
|
||||
self.customYLabel = QtGui.QLabel(self.monitorGroupBox)
|
||||
self.customYLabel.setObjectName(u'customYLabel')
|
||||
self.monitorLayout.addWidget(self.customYLabel, 4, 2)
|
||||
self.customYValueEdit = QtGui.QSpinBox(self.monitorGroupBox)
|
||||
self.customYValueEdit.setObjectName(u'customYValueEdit')
|
||||
self.customYValueEdit.setRange(-9999, 9999)
|
||||
self.monitorLayout.addWidget(self.customYValueEdit, 5, 2)
|
||||
self.customWidthLabel = QtGui.QLabel(self.monitorGroupBox)
|
||||
self.customWidthLabel.setObjectName(u'customWidthLabel')
|
||||
self.monitorLayout.addWidget(self.customWidthLabel, 4, 3)
|
||||
self.customWidthValueEdit = QtGui.QSpinBox(self.monitorGroupBox)
|
||||
self.customWidthValueEdit.setObjectName(u'customWidthValueEdit')
|
||||
self.customWidthValueEdit.setMaximum(9999)
|
||||
self.monitorLayout.addWidget(self.customWidthValueEdit, 5, 3)
|
||||
self.customHeightLabel = QtGui.QLabel(self.monitorGroupBox)
|
||||
self.customHeightLabel.setObjectName(u'customHeightLabel')
|
||||
self.monitorLayout.addWidget(self.customHeightLabel, 4, 4)
|
||||
self.customHeightValueEdit = QtGui.QSpinBox(self.monitorGroupBox)
|
||||
self.customHeightValueEdit.setObjectName(u'customHeightValueEdit')
|
||||
self.customHeightValueEdit.setMaximum(9999)
|
||||
self.monitorLayout.addWidget(self.customHeightValueEdit, 5, 4)
|
||||
# Set up the stretchiness of each column, so that the first column
|
||||
# less stretchy (and therefore smaller) than the others
|
||||
self.monitorLayout.setColumnStretch(0, 1)
|
||||
self.monitorLayout.setColumnStretch(1, 3)
|
||||
self.monitorLayout.setColumnStretch(2, 3)
|
||||
self.monitorLayout.setColumnStretch(3, 3)
|
||||
self.monitorLayout.setColumnStretch(4, 3)
|
||||
self.leftLayout.addWidget(self.monitorGroupBox)
|
||||
self.startupGroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||
self.startupGroupBox.setObjectName(u'startupGroupBox')
|
||||
self.startupLayout = QtGui.QVBoxLayout(self.startupGroupBox)
|
||||
self.startupLayout.setObjectName(u'startupLayout')
|
||||
self.warningCheckBox = QtGui.QCheckBox(self.startupGroupBox)
|
||||
self.warningCheckBox.setObjectName(u'warningCheckBox')
|
||||
self.startupLayout.addWidget(self.warningCheckBox)
|
||||
self.autoOpenCheckBox = QtGui.QCheckBox(self.startupGroupBox)
|
||||
self.autoOpenCheckBox.setObjectName(u'autoOpenCheckBox')
|
||||
self.startupLayout.addWidget(self.autoOpenCheckBox)
|
||||
self.showSplashCheckBox = QtGui.QCheckBox(self.startupGroupBox)
|
||||
self.showSplashCheckBox.setObjectName(u'showSplashCheckBox')
|
||||
self.startupLayout.addWidget(self.showSplashCheckBox)
|
||||
self.checkForUpdatesCheckBox = QtGui.QCheckBox(self.startupGroupBox)
|
||||
self.checkForUpdatesCheckBox.setObjectName(u'checkForUpdatesCheckBox')
|
||||
self.startupLayout.addWidget(self.checkForUpdatesCheckBox)
|
||||
self.leftLayout.addWidget(self.startupGroupBox)
|
||||
self.settingsGroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||
self.settingsGroupBox.setObjectName(u'settingsGroupBox')
|
||||
self.settingsLayout = QtGui.QFormLayout(self.settingsGroupBox)
|
||||
self.settingsLayout.setObjectName(u'settingsLayout')
|
||||
self.saveCheckServiceCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
|
||||
self.saveCheckServiceCheckBox.setObjectName(u'saveCheckServiceCheckBox')
|
||||
self.settingsLayout.addRow(self.saveCheckServiceCheckBox)
|
||||
self.autoUnblankCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
|
||||
self.autoUnblankCheckBox.setObjectName(u'autoUnblankCheckBox')
|
||||
self.settingsLayout.addRow(self.autoUnblankCheckBox)
|
||||
self.autoPreviewCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
|
||||
self.autoPreviewCheckBox.setObjectName(u'autoPreviewCheckBox')
|
||||
self.settingsLayout.addRow(self.autoPreviewCheckBox)
|
||||
# Moved here from image tab
|
||||
self.timeoutLabel = QtGui.QLabel(self.settingsGroupBox)
|
||||
self.timeoutLabel.setObjectName(u'timeoutLabel')
|
||||
self.timeoutSpinBox = QtGui.QSpinBox(self.settingsGroupBox)
|
||||
self.timeoutSpinBox.setObjectName(u'timeoutSpinBox')
|
||||
self.timeoutSpinBox.setRange(1, 180)
|
||||
self.settingsLayout.addRow(self.timeoutLabel, self.timeoutSpinBox)
|
||||
self.leftLayout.addWidget(self.settingsGroupBox)
|
||||
self.leftLayout.addStretch()
|
||||
self.ccliGroupBox = QtGui.QGroupBox(self.rightColumn)
|
||||
# CCLI Details
|
||||
self.ccliGroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||
self.ccliGroupBox.setObjectName(u'ccliGroupBox')
|
||||
self.ccliLayout = QtGui.QFormLayout(self.ccliGroupBox)
|
||||
self.ccliLayout.setObjectName(u'ccliLayout')
|
||||
@ -127,48 +131,9 @@ class GeneralTab(SettingsTab):
|
||||
self.passwordEdit.setEchoMode(QtGui.QLineEdit.Password)
|
||||
self.passwordEdit.setObjectName(u'passwordEdit')
|
||||
self.ccliLayout.addRow(self.passwordLabel, self.passwordEdit)
|
||||
self.rightLayout.addWidget(self.ccliGroupBox)
|
||||
# Moved here from display tab
|
||||
self.displayGroupBox = QtGui.QGroupBox(self.rightColumn)
|
||||
self.displayGroupBox.setObjectName(u'displayGroupBox')
|
||||
self.displayLayout = QtGui.QGridLayout(self.displayGroupBox)
|
||||
self.displayLayout.setObjectName(u'displayLayout')
|
||||
self.overrideCheckBox = QtGui.QCheckBox(self.displayGroupBox)
|
||||
self.overrideCheckBox.setObjectName(u'overrideCheckBox')
|
||||
self.displayLayout.addWidget(self.overrideCheckBox, 2, 0, 1, 4)
|
||||
self.rightLayout.addWidget(self.displayGroupBox)
|
||||
# Custom position
|
||||
self.customXLabel = QtGui.QLabel(self.displayGroupBox)
|
||||
self.customXLabel.setObjectName(u'customXLabel')
|
||||
self.displayLayout.addWidget(self.customXLabel, 3, 0)
|
||||
self.customXValueEdit = QtGui.QSpinBox(self.displayGroupBox)
|
||||
self.customXValueEdit.setObjectName(u'customXValueEdit')
|
||||
self.customXValueEdit.setRange(-9999, 9999)
|
||||
self.displayLayout.addWidget(self.customXValueEdit, 4, 0)
|
||||
self.customYLabel = QtGui.QLabel(self.displayGroupBox)
|
||||
self.customYLabel.setObjectName(u'customYLabel')
|
||||
self.displayLayout.addWidget(self.customYLabel, 3, 1)
|
||||
self.customYValueEdit = QtGui.QSpinBox(self.displayGroupBox)
|
||||
self.customYValueEdit.setObjectName(u'customYValueEdit')
|
||||
self.customYValueEdit.setRange(-9999, 9999)
|
||||
self.displayLayout.addWidget(self.customYValueEdit, 4, 1)
|
||||
self.customWidthLabel = QtGui.QLabel(self.displayGroupBox)
|
||||
self.customWidthLabel.setObjectName(u'customWidthLabel')
|
||||
self.displayLayout.addWidget(self.customWidthLabel, 3, 2)
|
||||
self.customWidthValueEdit = QtGui.QSpinBox(self.displayGroupBox)
|
||||
self.customWidthValueEdit.setObjectName(u'customWidthValueEdit')
|
||||
self.customWidthValueEdit.setMaximum(9999)
|
||||
self.displayLayout.addWidget(self.customWidthValueEdit, 4, 2)
|
||||
self.customHeightLabel = QtGui.QLabel(self.displayGroupBox)
|
||||
self.customHeightLabel.setObjectName(u'customHeightLabel')
|
||||
self.displayLayout.addWidget(self.customHeightLabel, 3, 3)
|
||||
self.customHeightValueEdit = QtGui.QSpinBox(self.displayGroupBox)
|
||||
self.customHeightValueEdit.setObjectName(u'customHeightValueEdit')
|
||||
self.customHeightValueEdit.setMaximum(9999)
|
||||
self.displayLayout.addWidget(self.customHeightValueEdit, 4, 3)
|
||||
self.rightLayout.addWidget(self.displayGroupBox)
|
||||
self.leftLayout.addWidget(self.ccliGroupBox)
|
||||
# Background audio
|
||||
self.audioGroupBox = QtGui.QGroupBox(self.rightColumn)
|
||||
self.audioGroupBox = QtGui.QGroupBox(self.leftColumn)
|
||||
self.audioGroupBox.setObjectName(u'audioGroupBox')
|
||||
self.audioLayout = QtGui.QVBoxLayout(self.audioGroupBox)
|
||||
self.audioLayout.setObjectName(u'audioLayout')
|
||||
@ -178,11 +143,52 @@ class GeneralTab(SettingsTab):
|
||||
self.repeatListCheckBox = QtGui.QCheckBox(self.audioGroupBox)
|
||||
self.repeatListCheckBox.setObjectName(u'repeatListCheckBox')
|
||||
self.audioLayout.addWidget(self.repeatListCheckBox)
|
||||
self.rightLayout.addWidget(self.audioGroupBox)
|
||||
self.leftLayout.addWidget(self.audioGroupBox)
|
||||
self.leftLayout.addStretch()
|
||||
# Application Startup
|
||||
self.startupGroupBox = QtGui.QGroupBox(self.rightColumn)
|
||||
self.startupGroupBox.setObjectName(u'startupGroupBox')
|
||||
self.startupLayout = QtGui.QVBoxLayout(self.startupGroupBox)
|
||||
self.startupLayout.setObjectName(u'startupLayout')
|
||||
self.warningCheckBox = QtGui.QCheckBox(self.startupGroupBox)
|
||||
self.warningCheckBox.setObjectName(u'warningCheckBox')
|
||||
self.startupLayout.addWidget(self.warningCheckBox)
|
||||
self.autoOpenCheckBox = QtGui.QCheckBox(self.startupGroupBox)
|
||||
self.autoOpenCheckBox.setObjectName(u'autoOpenCheckBox')
|
||||
self.startupLayout.addWidget(self.autoOpenCheckBox)
|
||||
self.showSplashCheckBox = QtGui.QCheckBox(self.startupGroupBox)
|
||||
self.showSplashCheckBox.setObjectName(u'showSplashCheckBox')
|
||||
self.startupLayout.addWidget(self.showSplashCheckBox)
|
||||
self.checkForUpdatesCheckBox = QtGui.QCheckBox(self.startupGroupBox)
|
||||
self.checkForUpdatesCheckBox.setObjectName(u'checkForUpdatesCheckBox')
|
||||
self.startupLayout.addWidget(self.checkForUpdatesCheckBox)
|
||||
self.rightLayout.addWidget(self.startupGroupBox)
|
||||
# Application Settings
|
||||
self.settingsGroupBox = QtGui.QGroupBox(self.rightColumn)
|
||||
self.settingsGroupBox.setObjectName(u'settingsGroupBox')
|
||||
self.settingsLayout = QtGui.QFormLayout(self.settingsGroupBox)
|
||||
self.settingsLayout.setObjectName(u'settingsLayout')
|
||||
self.saveCheckServiceCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
|
||||
self.saveCheckServiceCheckBox.setObjectName(u'saveCheckServiceCheckBox')
|
||||
self.settingsLayout.addRow(self.saveCheckServiceCheckBox)
|
||||
self.autoUnblankCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
|
||||
self.autoUnblankCheckBox.setObjectName(u'autoUnblankCheckBox')
|
||||
self.settingsLayout.addRow(self.autoUnblankCheckBox)
|
||||
self.autoPreviewCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
|
||||
self.autoPreviewCheckBox.setObjectName(u'autoPreviewCheckBox')
|
||||
self.settingsLayout.addRow(self.autoPreviewCheckBox)
|
||||
# Moved here from image tab
|
||||
self.timeoutLabel = QtGui.QLabel(self.settingsGroupBox)
|
||||
self.timeoutLabel.setObjectName(u'timeoutLabel')
|
||||
self.timeoutSpinBox = QtGui.QSpinBox(self.settingsGroupBox)
|
||||
self.timeoutSpinBox.setObjectName(u'timeoutSpinBox')
|
||||
self.timeoutSpinBox.setRange(1, 180)
|
||||
self.settingsLayout.addRow(self.timeoutLabel, self.timeoutSpinBox)
|
||||
self.rightLayout.addWidget(self.settingsGroupBox)
|
||||
self.rightLayout.addStretch()
|
||||
# Signals and slots
|
||||
QtCore.QObject.connect(self.overrideCheckBox,
|
||||
QtCore.SIGNAL(u'toggled(bool)'), self.onOverrideCheckBoxToggled)
|
||||
QtCore.QObject.connect(self.overrideRadioButton,
|
||||
QtCore.SIGNAL(u'toggled(bool)'), self.onOverrideRadioButtonPressed)
|
||||
QtCore.QObject.connect(self.customHeightValueEdit,
|
||||
QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged)
|
||||
QtCore.QObject.connect(self.customWidthValueEdit,
|
||||
@ -209,7 +215,7 @@ class GeneralTab(SettingsTab):
|
||||
self.tabTitleVisible = translate('OpenLP.GeneralTab', 'General')
|
||||
self.monitorGroupBox.setTitle(translate('OpenLP.GeneralTab',
|
||||
'Monitors'))
|
||||
self.monitorLabel.setText(translate('OpenLP.GeneralTab',
|
||||
self.monitorRadioButton.setText(translate('OpenLP.GeneralTab',
|
||||
'Select monitor for output display:'))
|
||||
self.displayOnMonitorCheck.setText(
|
||||
translate('OpenLP.GeneralTab', 'Display if a single screen'))
|
||||
@ -242,10 +248,8 @@ class GeneralTab(SettingsTab):
|
||||
self.passwordLabel.setText(
|
||||
translate('OpenLP.GeneralTab', 'SongSelect password:'))
|
||||
# Moved from display tab
|
||||
self.displayGroupBox.setTitle(
|
||||
translate('OpenLP.GeneralTab', 'Display Position'))
|
||||
self.overrideCheckBox.setText(translate('OpenLP.GeneralTab',
|
||||
'Override display position'))
|
||||
self.overrideRadioButton.setText(translate('OpenLP.GeneralTab',
|
||||
'Override display position:'))
|
||||
self.customXLabel.setText(translate('OpenLP.GeneralTab', 'X'))
|
||||
self.customYLabel.setText(translate('OpenLP.GeneralTab', 'Y'))
|
||||
self.customHeightLabel.setText(translate('OpenLP.GeneralTab', 'Height'))
|
||||
@ -291,7 +295,9 @@ class GeneralTab(SettingsTab):
|
||||
QtCore.QVariant(False)).toBool())
|
||||
self.timeoutSpinBox.setValue(settings.value(u'loop delay',
|
||||
QtCore.QVariant(5)).toInt()[0])
|
||||
self.overrideCheckBox.setChecked(settings.value(u'override position',
|
||||
self.monitorRadioButton.setChecked(not settings.value(u'override position',
|
||||
QtCore.QVariant(False)).toBool())
|
||||
self.overrideRadioButton.setChecked(settings.value(u'override position',
|
||||
QtCore.QVariant(False)).toBool())
|
||||
self.customXValueEdit.setValue(settings.value(u'x position',
|
||||
QtCore.QVariant(self.screens.current[u'size'].x())).toInt()[0])
|
||||
@ -306,10 +312,12 @@ class GeneralTab(SettingsTab):
|
||||
self.repeatListCheckBox.setChecked(settings.value(
|
||||
u'audio repeat list', QtCore.QVariant(False)).toBool())
|
||||
settings.endGroup()
|
||||
self.customXValueEdit.setEnabled(self.overrideCheckBox.isChecked())
|
||||
self.customYValueEdit.setEnabled(self.overrideCheckBox.isChecked())
|
||||
self.customHeightValueEdit.setEnabled(self.overrideCheckBox.isChecked())
|
||||
self.customWidthValueEdit.setEnabled(self.overrideCheckBox.isChecked())
|
||||
self.monitorComboBox.setDisabled(self.overrideRadioButton.isChecked())
|
||||
self.displayOnMonitorCheck.setDisabled(self.overrideRadioButton.isChecked())
|
||||
self.customXValueEdit.setEnabled(self.overrideRadioButton.isChecked())
|
||||
self.customYValueEdit.setEnabled(self.overrideRadioButton.isChecked())
|
||||
self.customHeightValueEdit.setEnabled(self.overrideRadioButton.isChecked())
|
||||
self.customWidthValueEdit.setEnabled(self.overrideRadioButton.isChecked())
|
||||
self.display_changed = False
|
||||
settings.beginGroup(self.settingsSection)
|
||||
|
||||
@ -354,7 +362,7 @@ class GeneralTab(SettingsTab):
|
||||
settings.setValue(u'width',
|
||||
QtCore.QVariant(self.customWidthValueEdit.value()))
|
||||
settings.setValue(u'override position',
|
||||
QtCore.QVariant(self.overrideCheckBox.isChecked()))
|
||||
QtCore.QVariant(self.overrideRadioButton.isChecked()))
|
||||
settings.setValue(u'audio start paused',
|
||||
QtCore.QVariant(self.startPausedCheckBox.isChecked()))
|
||||
settings.setValue(u'audio repeat list',
|
||||
@ -380,7 +388,7 @@ class GeneralTab(SettingsTab):
|
||||
self.customYValueEdit.value(),
|
||||
self.customWidthValueEdit.value(),
|
||||
self.customHeightValueEdit.value())
|
||||
if self.overrideCheckBox.isChecked():
|
||||
if self.overrideRadioButton.isChecked():
|
||||
self.screens.set_override_display()
|
||||
else:
|
||||
self.screens.reset_current_display()
|
||||
@ -388,13 +396,15 @@ class GeneralTab(SettingsTab):
|
||||
Receiver.send_message(u'config_screen_changed')
|
||||
self.display_changed = False
|
||||
|
||||
def onOverrideCheckBoxToggled(self, checked):
|
||||
def onOverrideRadioButtonPressed(self, checked):
|
||||
"""
|
||||
Toggle screen state depending on check box state.
|
||||
|
||||
``checked``
|
||||
The state of the check box (boolean).
|
||||
"""
|
||||
self.monitorComboBox.setDisabled(checked)
|
||||
self.displayOnMonitorCheck.setDisabled(checked)
|
||||
self.customXValueEdit.setEnabled(checked)
|
||||
self.customYValueEdit.setEnabled(checked)
|
||||
self.customHeightValueEdit.setEnabled(checked)
|
||||
|
@ -137,13 +137,13 @@ class ThemeManager(QtGui.QWidget):
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'config_updated'), self.configUpdated)
|
||||
# Variables
|
||||
self.themelist = []
|
||||
self.theme_list = []
|
||||
self.path = AppLocation.get_section_data_path(self.settingsSection)
|
||||
check_directory_exists(self.path)
|
||||
self.thumbPath = os.path.join(self.path, u'thumbnails')
|
||||
check_directory_exists(self.thumbPath)
|
||||
self.thumb_path = os.path.join(self.path, u'thumbnails')
|
||||
check_directory_exists(self.thumb_path)
|
||||
self.themeForm.path = self.path
|
||||
self.oldBackgroundImage = None
|
||||
self.old_background_image = None
|
||||
self.bad_v1_name_chars = re.compile(r'[%+\[\]]')
|
||||
# Last little bits of setting up
|
||||
self.configUpdated()
|
||||
@ -175,10 +175,10 @@ class ThemeManager(QtGui.QWidget):
|
||||
"""
|
||||
if item is None:
|
||||
return
|
||||
realThemeName = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
themeName = unicode(item.text())
|
||||
real_theme_name = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
theme_name = unicode(item.text())
|
||||
# If default theme restrict actions
|
||||
if realThemeName == themeName:
|
||||
if real_theme_name == theme_name:
|
||||
self.deleteToolbarAction.setVisible(True)
|
||||
else:
|
||||
self.deleteToolbarAction.setVisible(False)
|
||||
@ -191,35 +191,35 @@ class ThemeManager(QtGui.QWidget):
|
||||
item = self.themeListWidget.itemAt(point)
|
||||
if item is None:
|
||||
return
|
||||
realThemeName = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
themeName = unicode(item.text())
|
||||
real_theme_name = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
theme_name = unicode(item.text())
|
||||
self.deleteAction.setVisible(False)
|
||||
self.renameAction.setVisible(False)
|
||||
self.globalAction.setVisible(False)
|
||||
# If default theme restrict actions
|
||||
if realThemeName == themeName:
|
||||
if real_theme_name == theme_name:
|
||||
self.deleteAction.setVisible(True)
|
||||
self.renameAction.setVisible(True)
|
||||
self.globalAction.setVisible(True)
|
||||
self.menu.exec_(self.themeListWidget.mapToGlobal(point))
|
||||
|
||||
def changeGlobalFromTab(self, themeName):
|
||||
def changeGlobalFromTab(self, theme_name):
|
||||
"""
|
||||
Change the global theme when it is changed through the Themes settings
|
||||
tab
|
||||
"""
|
||||
log.debug(u'changeGlobalFromTab %s', themeName)
|
||||
log.debug(u'changeGlobalFromTab %s', theme_name)
|
||||
for count in range (0, self.themeListWidget.count()):
|
||||
# reset the old name
|
||||
item = self.themeListWidget.item(count)
|
||||
oldName = item.text()
|
||||
newName = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
if oldName != newName:
|
||||
self.themeListWidget.item(count).setText(newName)
|
||||
old_name = item.text()
|
||||
new_name = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
if old_name != new_name:
|
||||
self.themeListWidget.item(count).setText(new_name)
|
||||
# Set the new name
|
||||
if themeName == newName:
|
||||
if theme_name == new_name:
|
||||
name = unicode(translate('OpenLP.ThemeManager',
|
||||
'%s (default)')) % newName
|
||||
'%s (default)')) % new_name
|
||||
self.themeListWidget.item(count).setText(name)
|
||||
|
||||
def changeGlobalFromScreen(self, index=-1):
|
||||
@ -231,9 +231,9 @@ class ThemeManager(QtGui.QWidget):
|
||||
selected_row = self.themeListWidget.currentRow()
|
||||
for count in range (0, self.themeListWidget.count()):
|
||||
item = self.themeListWidget.item(count)
|
||||
oldName = item.text()
|
||||
old_name = item.text()
|
||||
# reset the old name
|
||||
if oldName != unicode(item.data(QtCore.Qt.UserRole).toString()):
|
||||
if old_name != unicode(item.data(QtCore.Qt.UserRole).toString()):
|
||||
self.themeListWidget.item(count).setText(
|
||||
unicode(item.data(QtCore.Qt.UserRole).toString()))
|
||||
# Set the new name
|
||||
@ -269,19 +269,19 @@ class ThemeManager(QtGui.QWidget):
|
||||
unicode(translate('OpenLP.ThemeManager', 'Rename %s theme?')),
|
||||
False, False):
|
||||
item = self.themeListWidget.currentItem()
|
||||
oldThemeName = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
self.fileRenameForm.fileNameEdit.setText(oldThemeName)
|
||||
old_theme_name = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
self.fileRenameForm.fileNameEdit.setText(old_theme_name)
|
||||
if self.fileRenameForm.exec_():
|
||||
newThemeName = unicode(self.fileRenameForm.fileNameEdit.text())
|
||||
if oldThemeName == newThemeName:
|
||||
new_theme_name = unicode(self.fileRenameForm.fileNameEdit.text())
|
||||
if old_theme_name == new_theme_name:
|
||||
return
|
||||
if self.checkIfThemeExists(newThemeName):
|
||||
oldThemeData = self.getThemeData(oldThemeName)
|
||||
self.cloneThemeData(oldThemeData, newThemeName)
|
||||
self.deleteTheme(oldThemeName)
|
||||
if self.checkIfThemeExists(new_theme_name):
|
||||
old_theme_data = self.getThemeData(old_theme_name)
|
||||
self.cloneThemeData(old_theme_data, new_theme_name)
|
||||
self.deleteTheme(old_theme_name)
|
||||
for plugin in self.mainwindow.pluginManager.plugins:
|
||||
if plugin.usesTheme(oldThemeName):
|
||||
plugin.renameTheme(oldThemeName, newThemeName)
|
||||
if plugin.usesTheme(old_theme_name):
|
||||
plugin.renameTheme(old_theme_name, new_theme_name)
|
||||
self.loadThemes()
|
||||
|
||||
def onCopyTheme(self):
|
||||
@ -289,30 +289,30 @@ class ThemeManager(QtGui.QWidget):
|
||||
Copies an existing theme to a new name
|
||||
"""
|
||||
item = self.themeListWidget.currentItem()
|
||||
oldThemeName = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
old_theme_name = unicode(item.data(QtCore.Qt.UserRole).toString())
|
||||
self.fileRenameForm.fileNameEdit.setText(
|
||||
unicode(translate('OpenLP.ThemeManager',
|
||||
'Copy of %s','Copy of <theme name>')) % oldThemeName)
|
||||
'Copy of %s', 'Copy of <theme name>')) % old_theme_name)
|
||||
if self.fileRenameForm.exec_(True):
|
||||
newThemeName = unicode(self.fileRenameForm.fileNameEdit.text())
|
||||
if self.checkIfThemeExists(newThemeName):
|
||||
themeData = self.getThemeData(oldThemeName)
|
||||
self.cloneThemeData(themeData, newThemeName)
|
||||
new_theme_name = unicode(self.fileRenameForm.fileNameEdit.text())
|
||||
if self.checkIfThemeExists(new_theme_name):
|
||||
theme_data = self.getThemeData(old_theme_name)
|
||||
self.cloneThemeData(theme_data, new_theme_name)
|
||||
|
||||
def cloneThemeData(self, themeData, newThemeName):
|
||||
def cloneThemeData(self, theme_data, new_theme_name):
|
||||
"""
|
||||
Takes a theme and makes a new copy of it as well as saving it.
|
||||
"""
|
||||
log.debug(u'cloneThemeData')
|
||||
saveTo = None
|
||||
saveFrom = None
|
||||
if themeData.background_type == u'image':
|
||||
saveTo = os.path.join(self.path, newThemeName,
|
||||
os.path.split(unicode(themeData.background_filename))[1])
|
||||
saveFrom = themeData.background_filename
|
||||
themeData.theme_name = newThemeName
|
||||
themeData.extend_image_filename(self.path)
|
||||
self.saveTheme(themeData, saveFrom, saveTo)
|
||||
save_to = None
|
||||
save_from = None
|
||||
if theme_data.background_type == u'image':
|
||||
save_to = os.path.join(self.path, new_theme_name,
|
||||
os.path.split(unicode(theme_data.background_filename))[1])
|
||||
save_from = theme_data.background_filename
|
||||
theme_data.theme_name = new_theme_name
|
||||
theme_data.extend_image_filename(self.path)
|
||||
self.saveTheme(theme_data, save_from, save_to)
|
||||
|
||||
def onEditTheme(self):
|
||||
"""
|
||||
@ -326,10 +326,10 @@ class ThemeManager(QtGui.QWidget):
|
||||
theme = self.getThemeData(
|
||||
unicode(item.data(QtCore.Qt.UserRole).toString()))
|
||||
if theme.background_type == u'image':
|
||||
self.oldBackgroundImage = theme.background_filename
|
||||
self.old_background_image = theme.background_filename
|
||||
self.themeForm.theme = theme
|
||||
self.themeForm.exec_(True)
|
||||
self.oldBackgroundImage = None
|
||||
self.old_background_image = None
|
||||
|
||||
def onDeleteTheme(self):
|
||||
"""
|
||||
@ -355,10 +355,10 @@ class ThemeManager(QtGui.QWidget):
|
||||
``theme``
|
||||
The theme to delete.
|
||||
"""
|
||||
self.themelist.remove(theme)
|
||||
self.theme_list.remove(theme)
|
||||
thumb = u'%s.png' % theme
|
||||
delete_file(os.path.join(self.path, thumb))
|
||||
delete_file(os.path.join(self.thumbPath, thumb))
|
||||
delete_file(os.path.join(self.thumb_path, thumb))
|
||||
try:
|
||||
encoding = get_filesystem_encoding()
|
||||
shutil.rmtree(os.path.join(self.path, theme).encode(encoding))
|
||||
@ -383,10 +383,10 @@ class ThemeManager(QtGui.QWidget):
|
||||
Receiver.send_message(u'cursor_busy')
|
||||
if path:
|
||||
SettingsManager.set_last_dir(self.settingsSection, path, 1)
|
||||
themePath = os.path.join(path, theme + u'.otz')
|
||||
theme_path = os.path.join(path, theme + u'.otz')
|
||||
zip = None
|
||||
try:
|
||||
zip = zipfile.ZipFile(themePath, u'w')
|
||||
zip = zipfile.ZipFile(theme_path, u'w')
|
||||
source = os.path.join(self.path, theme)
|
||||
for files in os.walk(source):
|
||||
for name in files[2]:
|
||||
@ -436,9 +436,8 @@ class ThemeManager(QtGui.QWidget):
|
||||
The plugins will call back in to get the real list if they want it.
|
||||
"""
|
||||
log.debug(u'Load themes from dir')
|
||||
self.themelist = []
|
||||
self.theme_list = []
|
||||
self.themeListWidget.clear()
|
||||
dirList = os.listdir(self.path)
|
||||
files = SettingsManager.get_files(self.settingsSection, u'.png')
|
||||
if firstTime:
|
||||
self.firstTime()
|
||||
@ -455,29 +454,29 @@ class ThemeManager(QtGui.QWidget):
|
||||
files = SettingsManager.get_files(self.settingsSection, u'.png')
|
||||
# Sort the themes by its name considering language specific characters.
|
||||
# lower() is needed for windows!
|
||||
files.sort(key=lambda filename: unicode(filename).lower(),
|
||||
files.sort(key=lambda file_name: unicode(file_name).lower(),
|
||||
cmp=locale.strcoll)
|
||||
# now process the file list of png files
|
||||
for name in files:
|
||||
# check to see file is in theme root directory
|
||||
theme = os.path.join(self.path, name)
|
||||
if os.path.exists(theme):
|
||||
textName = os.path.splitext(name)[0]
|
||||
if textName == self.global_theme:
|
||||
text_name = os.path.splitext(name)[0]
|
||||
if text_name == self.global_theme:
|
||||
name = unicode(translate('OpenLP.ThemeManager',
|
||||
'%s (default)')) % textName
|
||||
'%s (default)')) % text_name
|
||||
else:
|
||||
name = textName
|
||||
thumb = os.path.join(self.thumbPath, u'%s.png' % textName)
|
||||
name = text_name
|
||||
thumb = os.path.join(self.thumb_path, u'%s.png' % text_name)
|
||||
item_name = QtGui.QListWidgetItem(name)
|
||||
if validate_thumb(theme, thumb):
|
||||
icon = build_icon(thumb)
|
||||
else:
|
||||
icon = create_thumb(theme, thumb)
|
||||
item_name.setIcon(icon)
|
||||
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(textName))
|
||||
item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(text_name))
|
||||
self.themeListWidget.addItem(item_name)
|
||||
self.themelist.append(textName)
|
||||
self.theme_list.append(text_name)
|
||||
self._pushThemes()
|
||||
|
||||
def _pushThemes(self):
|
||||
@ -490,50 +489,68 @@ class ThemeManager(QtGui.QWidget):
|
||||
"""
|
||||
Return the list of loaded themes
|
||||
"""
|
||||
return self.themelist
|
||||
return self.theme_list
|
||||
|
||||
def getThemeData(self, themeName):
|
||||
def getThemeData(self, theme_name):
|
||||
"""
|
||||
Returns a theme object from an XML file
|
||||
|
||||
``themeName``
|
||||
``theme_name``
|
||||
Name of the theme to load from file
|
||||
"""
|
||||
log.debug(u'getthemedata for theme %s', themeName)
|
||||
xmlFile = os.path.join(self.path, unicode(themeName),
|
||||
unicode(themeName) + u'.xml')
|
||||
xml = get_text_file_string(xmlFile)
|
||||
log.debug(u'getthemedata for theme %s', theme_name)
|
||||
xml_file = os.path.join(self.path, unicode(theme_name),
|
||||
unicode(theme_name) + u'.xml')
|
||||
xml = get_text_file_string(xml_file)
|
||||
if not xml:
|
||||
log.debug("No theme data - using default theme")
|
||||
return ThemeXML()
|
||||
else:
|
||||
return self._createThemeFromXml(xml, self.path)
|
||||
|
||||
def unzipTheme(self, filename, dir):
|
||||
def overWriteMessageBox(self, theme_name):
|
||||
ret = QtGui.QMessageBox.question(self,
|
||||
translate('OpenLP.ThemeManager', 'Theme Already Exists'),
|
||||
translate('OpenLP.ThemeManager',
|
||||
'Theme %s already exists. Do you want to replace it?'
|
||||
% theme_name),
|
||||
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes |
|
||||
QtGui.QMessageBox.No),
|
||||
QtGui.QMessageBox.No)
|
||||
return ret == QtGui.QMessageBox.Yes
|
||||
|
||||
def unzipTheme(self, file_name, dir):
|
||||
"""
|
||||
Unzip the theme, remove the preview file if stored
|
||||
Generate a new preview file. Check the XML theme version and upgrade if
|
||||
necessary.
|
||||
"""
|
||||
log.debug(u'Unzipping theme %s', filename)
|
||||
filename = unicode(filename)
|
||||
log.debug(u'Unzipping theme %s', file_name)
|
||||
file_name = unicode(file_name)
|
||||
zip = None
|
||||
outfile = None
|
||||
filexml = None
|
||||
out_file = None
|
||||
file_xml = None
|
||||
try:
|
||||
zip = zipfile.ZipFile(filename)
|
||||
xmlfile = filter(lambda name:
|
||||
zip = zipfile.ZipFile(file_name)
|
||||
xml_file = filter(lambda name:
|
||||
os.path.splitext(name)[1].lower() == u'.xml', zip.namelist())
|
||||
if len(xmlfile) != 1:
|
||||
log.exception(u'Theme contains "%s" XML files' % len(xmlfile))
|
||||
if len(xml_file) != 1:
|
||||
log.exception(u'Theme contains "%s" XML files' % len(xml_file))
|
||||
raise Exception(u'validation')
|
||||
xml_tree = ElementTree(element=XML(zip.read(xmlfile[0]))).getroot()
|
||||
xml_tree = ElementTree(element=XML(zip.read(xml_file[0]))).getroot()
|
||||
v1_background = xml_tree.find(u'BackgroundType')
|
||||
if v1_background is not None:
|
||||
(themename, filexml, outfile) = self.unzipVersion122(dir, zip,
|
||||
xmlfile[0], xml_tree, v1_background, outfile)
|
||||
theme_name, file_xml, out_file, abort_import = self.unzipVersion122(dir, zip,
|
||||
xml_file[0], xml_tree, v1_background, out_file)
|
||||
else:
|
||||
themename = xml_tree.find(u'name').text.strip()
|
||||
theme_name = xml_tree.find(u'name').text.strip()
|
||||
theme_folder = os.path.join(dir, theme_name)
|
||||
theme_exists = os.path.exists(theme_folder)
|
||||
if theme_exists and not self.overWriteMessageBox(theme_name):
|
||||
abort_import = True
|
||||
return
|
||||
else:
|
||||
abort_import = False
|
||||
for name in zip.namelist():
|
||||
try:
|
||||
uname = unicode(name, u'utf-8')
|
||||
@ -542,22 +559,22 @@ class ThemeManager(QtGui.QWidget):
|
||||
u' "%s"' % name.decode(u'utf-8', u'replace'))
|
||||
raise Exception(u'validation')
|
||||
uname = uname.replace(u'/', os.path.sep)
|
||||
splitname = uname.split(os.path.sep)
|
||||
if splitname[-1] == u'' or len(splitname) == 1:
|
||||
split_name = uname.split(os.path.sep)
|
||||
if split_name[-1] == u'' or len(split_name) == 1:
|
||||
# is directory or preview file
|
||||
continue
|
||||
fullname = os.path.join(dir, uname)
|
||||
check_directory_exists(os.path.dirname(fullname))
|
||||
full_name = os.path.join(dir, uname)
|
||||
check_directory_exists(os.path.dirname(full_name))
|
||||
if os.path.splitext(uname)[1].lower() == u'.xml':
|
||||
filexml = unicode(zip.read(name), u'utf-8')
|
||||
outfile = open(fullname, u'w')
|
||||
outfile.write(filexml.encode(u'utf-8'))
|
||||
file_xml = unicode(zip.read(name), u'utf-8')
|
||||
out_file = open(full_name, u'w')
|
||||
out_file.write(file_xml.encode(u'utf-8'))
|
||||
else:
|
||||
outfile = open(fullname, u'wb')
|
||||
outfile.write(zip.read(name))
|
||||
outfile.close()
|
||||
out_file = open(full_name, u'wb')
|
||||
out_file.write(zip.read(name))
|
||||
out_file.close()
|
||||
except (IOError, zipfile.BadZipfile):
|
||||
log.exception(u'Importing theme from zip failed %s' % filename)
|
||||
log.exception(u'Importing theme from zip failed %s' % file_name)
|
||||
raise Exception(u'validation')
|
||||
except Exception as info:
|
||||
if unicode(info) == u'validation':
|
||||
@ -570,60 +587,65 @@ class ThemeManager(QtGui.QWidget):
|
||||
# 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)
|
||||
# Only show the error message, when IOError was not raised (in this
|
||||
# case the error message has already been shown).
|
||||
elif zip is not None:
|
||||
critical_error_message_box(
|
||||
translate('OpenLP.ThemeManager', 'Validation Error'),
|
||||
translate('OpenLP.ThemeManager',
|
||||
'File is not a valid theme.'))
|
||||
log.exception(u'Theme file does not contain XML data %s' %
|
||||
filename)
|
||||
if out_file:
|
||||
out_file.close()
|
||||
if not abort_import:
|
||||
# As all files are closed, we can create the Theme.
|
||||
if file_xml:
|
||||
theme = self._createThemeFromXml(file_xml, self.path)
|
||||
self.generateAndSaveImage(dir, theme_name, theme)
|
||||
# Only show the error message, when IOError was not raised (in this
|
||||
# case the error message has already been shown).
|
||||
elif zip is not None:
|
||||
critical_error_message_box(
|
||||
translate('OpenLP.ThemeManager', 'Validation Error'),
|
||||
translate('OpenLP.ThemeManager',
|
||||
'File is not a valid theme.'))
|
||||
log.exception(u'Theme file does not contain XML data %s' %
|
||||
file_name)
|
||||
|
||||
def unzipVersion122(self, dir, zip, xmlfile, xml_tree, background, outfile):
|
||||
def unzipVersion122(self, dir, zip, xml_file, xml_tree, background, out_file):
|
||||
"""
|
||||
Unzip openlp.org 1.2x theme file and upgrade the theme xml. When calling
|
||||
this method, please keep in mind, that some parameters are redundant.
|
||||
"""
|
||||
themename = xml_tree.find(u'Name').text.strip()
|
||||
themename = self.bad_v1_name_chars.sub(u'', themename)
|
||||
themedir = os.path.join(dir, themename)
|
||||
theme_name = xml_tree.find(u'Name').text.strip()
|
||||
theme_name = self.bad_v1_name_chars.sub(u'', theme_name)
|
||||
theme_folder = os.path.join(dir, theme_name)
|
||||
theme_exists = os.path.exists(theme_folder)
|
||||
if theme_exists and not self.overWriteMessageBox(theme_name):
|
||||
return '', '', '', True
|
||||
themedir = os.path.join(dir, theme_name)
|
||||
check_directory_exists(themedir)
|
||||
filexml = unicode(zip.read(xmlfile), u'utf-8')
|
||||
filexml = self._migrateVersion122(filexml)
|
||||
outfile = open(os.path.join(themedir, themename + u'.xml'), u'w')
|
||||
outfile.write(filexml.encode(u'utf-8'))
|
||||
outfile.close()
|
||||
file_xml = unicode(zip.read(xml_file), u'utf-8')
|
||||
file_xml = self._migrateVersion122(file_xml)
|
||||
out_file = open(os.path.join(themedir, theme_name + u'.xml'), u'w')
|
||||
out_file.write(file_xml.encode(u'utf-8'))
|
||||
out_file.close()
|
||||
if background.text.strip() == u'2':
|
||||
imagename = xml_tree.find(u'BackgroundParameter1').text.strip()
|
||||
image_name = xml_tree.find(u'BackgroundParameter1').text.strip()
|
||||
# image file has same extension and is in subfolder
|
||||
imagefile = filter(lambda name: os.path.splitext(name)[1].lower()
|
||||
== os.path.splitext(imagename)[1].lower() and name.find(r'/'),
|
||||
== os.path.splitext(image_name)[1].lower() and name.find(r'/'),
|
||||
zip.namelist())
|
||||
if len(imagefile) >= 1:
|
||||
outfile = open(os.path.join(themedir, imagename), u'wb')
|
||||
outfile.write(zip.read(imagefile[0]))
|
||||
outfile.close()
|
||||
out_file = open(os.path.join(themedir, image_name), u'wb')
|
||||
out_file.write(zip.read(imagefile[0]))
|
||||
out_file.close()
|
||||
else:
|
||||
log.exception(u'Theme file does not contain image file "%s"' %
|
||||
imagename.decode(u'utf-8', u'replace'))
|
||||
image_name.decode(u'utf-8', u'replace'))
|
||||
raise Exception(u'validation')
|
||||
return (themename, filexml, outfile)
|
||||
return theme_name, file_xml, out_file, False
|
||||
|
||||
def checkIfThemeExists(self, themeName):
|
||||
def checkIfThemeExists(self, theme_name):
|
||||
"""
|
||||
Check if theme already exists and displays error message
|
||||
|
||||
``themeName``
|
||||
``theme_name``
|
||||
Name of the Theme to test
|
||||
"""
|
||||
theme_dir = os.path.join(self.path, themeName)
|
||||
theme_dir = os.path.join(self.path, theme_name)
|
||||
if os.path.exists(theme_dir):
|
||||
critical_error_message_box(
|
||||
translate('OpenLP.ThemeManager', 'Validation Error'),
|
||||
@ -632,12 +654,12 @@ class ThemeManager(QtGui.QWidget):
|
||||
return False
|
||||
return True
|
||||
|
||||
def saveTheme(self, theme, imageFrom, imageTo):
|
||||
def saveTheme(self, theme, image_from, image_to):
|
||||
"""
|
||||
Called by thememaintenance Dialog to save the theme
|
||||
and to trigger the reload of the theme list
|
||||
"""
|
||||
self._writeTheme(theme, imageFrom, imageTo)
|
||||
self._writeTheme(theme, image_from, image_to)
|
||||
if theme.background_type == \
|
||||
BackgroundType.to_string(BackgroundType.Image):
|
||||
self.mainwindow.imageManager.update_image(theme.theme_name,
|
||||
@ -645,7 +667,7 @@ class ThemeManager(QtGui.QWidget):
|
||||
self.mainwindow.imageManager.process_updates()
|
||||
self.loadThemes()
|
||||
|
||||
def _writeTheme(self, theme, imageFrom, imageTo):
|
||||
def _writeTheme(self, theme, image_from, image_to):
|
||||
"""
|
||||
Writes the theme to the disk and handles the background image if
|
||||
necessary
|
||||
@ -656,24 +678,24 @@ class ThemeManager(QtGui.QWidget):
|
||||
theme_dir = os.path.join(self.path, name)
|
||||
check_directory_exists(theme_dir)
|
||||
theme_file = os.path.join(theme_dir, name + u'.xml')
|
||||
if self.oldBackgroundImage and \
|
||||
imageTo != self.oldBackgroundImage:
|
||||
delete_file(self.oldBackgroundImage)
|
||||
outfile = None
|
||||
if self.old_background_image and \
|
||||
image_to != self.old_background_image:
|
||||
delete_file(self.old_background_image)
|
||||
out_file = None
|
||||
try:
|
||||
outfile = open(theme_file, u'w')
|
||||
outfile.write(theme_pretty_xml)
|
||||
out_file = open(theme_file, u'w')
|
||||
out_file.write(theme_pretty_xml)
|
||||
except IOError:
|
||||
log.exception(u'Saving theme to file failed')
|
||||
finally:
|
||||
if outfile:
|
||||
outfile.close()
|
||||
if imageFrom and imageFrom != imageTo:
|
||||
if out_file:
|
||||
out_file.close()
|
||||
if image_from and image_from != image_to:
|
||||
try:
|
||||
encoding = get_filesystem_encoding()
|
||||
shutil.copyfile(
|
||||
unicode(imageFrom).encode(encoding),
|
||||
unicode(imageTo).encode(encoding))
|
||||
unicode(image_from).encode(encoding),
|
||||
unicode(image_to).encode(encoding))
|
||||
except IOError:
|
||||
log.exception(u'Failed to save theme image')
|
||||
self.generateAndSaveImage(self.path, name, theme)
|
||||
@ -681,39 +703,39 @@ class ThemeManager(QtGui.QWidget):
|
||||
def generateAndSaveImage(self, dir, name, theme):
|
||||
log.debug(u'generateAndSaveImage %s %s', dir, name)
|
||||
frame = self.generateImage(theme)
|
||||
samplepathname = os.path.join(self.path, name + u'.png')
|
||||
if os.path.exists(samplepathname):
|
||||
os.unlink(samplepathname)
|
||||
frame.save(samplepathname, u'png')
|
||||
thumb = os.path.join(self.thumbPath, u'%s.png' % name)
|
||||
create_thumb(samplepathname, thumb, False)
|
||||
log.debug(u'Theme image written to %s', samplepathname)
|
||||
sample_path_name = os.path.join(self.path, name + u'.png')
|
||||
if os.path.exists(sample_path_name):
|
||||
os.unlink(sample_path_name)
|
||||
frame.save(sample_path_name, u'png')
|
||||
thumb = os.path.join(self.thumb_path, u'%s.png' % name)
|
||||
create_thumb(sample_path_name, thumb, False)
|
||||
log.debug(u'Theme image written to %s', sample_path_name)
|
||||
|
||||
def updatePreviewImages(self):
|
||||
"""
|
||||
Called to update the themes' preview images.
|
||||
"""
|
||||
self.mainwindow.displayProgressBar(len(self.themelist))
|
||||
for theme in self.themelist:
|
||||
self.mainwindow.displayProgressBar(len(self.theme_list))
|
||||
for theme in self.theme_list:
|
||||
self.mainwindow.incrementProgressBar()
|
||||
self.generateAndSaveImage(
|
||||
self.path, theme, self.getThemeData(theme))
|
||||
self.mainwindow.finishedProgressBar()
|
||||
self.loadThemes()
|
||||
|
||||
def generateImage(self, themeData, forcePage=False):
|
||||
def generateImage(self, theme_data, forcePage=False):
|
||||
"""
|
||||
Call the renderer to build a Sample Image
|
||||
|
||||
``themeData``
|
||||
``theme_data``
|
||||
The theme to generated a preview for.
|
||||
|
||||
``forcePage``
|
||||
Flag to tell message lines per page need to be generated.
|
||||
"""
|
||||
log.debug(u'generateImage \n%s ', themeData)
|
||||
log.debug(u'generateImage \n%s ', theme_data)
|
||||
return self.mainwindow.renderer.generate_preview(
|
||||
themeData, forcePage)
|
||||
theme_data, forcePage)
|
||||
|
||||
def getPreviewImage(self, theme):
|
||||
"""
|
||||
@ -726,15 +748,15 @@ class ThemeManager(QtGui.QWidget):
|
||||
image = os.path.join(self.path, theme + u'.png')
|
||||
return image
|
||||
|
||||
def _createThemeFromXml(self, themeXml, path):
|
||||
def _createThemeFromXml(self, theme_xml, path):
|
||||
"""
|
||||
Return a theme object using information parsed from XML
|
||||
|
||||
``themeXml``
|
||||
``theme_xml``
|
||||
The XML data to load into the theme
|
||||
"""
|
||||
theme = ThemeXML()
|
||||
theme.parse(themeXml)
|
||||
theme.parse(theme_xml)
|
||||
theme.extend_image_filename(path)
|
||||
return theme
|
||||
|
||||
@ -789,53 +811,53 @@ class ThemeManager(QtGui.QWidget):
|
||||
Version 1 theme to convert
|
||||
"""
|
||||
theme = Theme(xml_data)
|
||||
newtheme = ThemeXML()
|
||||
newtheme.theme_name = self.bad_v1_name_chars.sub(u'', theme.Name)
|
||||
new_theme = ThemeXML()
|
||||
new_theme.theme_name = self.bad_v1_name_chars.sub(u'', theme.Name)
|
||||
if theme.BackgroundType == 0:
|
||||
newtheme.background_type = \
|
||||
new_theme.background_type = \
|
||||
BackgroundType.to_string(BackgroundType.Solid)
|
||||
newtheme.background_color = \
|
||||
new_theme.background_color = \
|
||||
unicode(theme.BackgroundParameter1.name())
|
||||
elif theme.BackgroundType == 1:
|
||||
newtheme.background_type = \
|
||||
new_theme.background_type = \
|
||||
BackgroundType.to_string(BackgroundType.Gradient)
|
||||
newtheme.background_direction = \
|
||||
new_theme.background_direction = \
|
||||
BackgroundGradientType. \
|
||||
to_string(BackgroundGradientType.Horizontal)
|
||||
if theme.BackgroundParameter3.name() == 1:
|
||||
newtheme.background_direction = \
|
||||
new_theme.background_direction = \
|
||||
BackgroundGradientType. \
|
||||
to_string(BackgroundGradientType.Horizontal)
|
||||
newtheme.background_start_color = \
|
||||
new_theme.background_start_color = \
|
||||
unicode(theme.BackgroundParameter1.name())
|
||||
newtheme.background_end_color = \
|
||||
new_theme.background_end_color = \
|
||||
unicode(theme.BackgroundParameter2.name())
|
||||
elif theme.BackgroundType == 2:
|
||||
newtheme.background_type = \
|
||||
new_theme.background_type = \
|
||||
BackgroundType.to_string(BackgroundType.Image)
|
||||
newtheme.background_filename = unicode(theme.BackgroundParameter1)
|
||||
new_theme.background_filename = unicode(theme.BackgroundParameter1)
|
||||
elif theme.BackgroundType == 3:
|
||||
newtheme.background_type = \
|
||||
new_theme.background_type = \
|
||||
BackgroundType.to_string(BackgroundType.Transparent)
|
||||
newtheme.font_main_name = theme.FontName
|
||||
newtheme.font_main_color = unicode(theme.FontColor.name())
|
||||
newtheme.font_main_size = theme.FontProportion * 3
|
||||
newtheme.font_footer_name = theme.FontName
|
||||
newtheme.font_footer_color = unicode(theme.FontColor.name())
|
||||
newtheme.font_main_shadow = False
|
||||
new_theme.font_main_name = theme.FontName
|
||||
new_theme.font_main_color = unicode(theme.FontColor.name())
|
||||
new_theme.font_main_size = theme.FontProportion * 3
|
||||
new_theme.font_footer_name = theme.FontName
|
||||
new_theme.font_footer_color = unicode(theme.FontColor.name())
|
||||
new_theme.font_main_shadow = False
|
||||
if theme.Shadow == 1:
|
||||
newtheme.font_main_shadow = True
|
||||
newtheme.font_main_shadow_color = unicode(theme.ShadowColor.name())
|
||||
new_theme.font_main_shadow = True
|
||||
new_theme.font_main_shadow_color = unicode(theme.ShadowColor.name())
|
||||
if theme.Outline == 1:
|
||||
newtheme.font_main_outline = True
|
||||
newtheme.font_main_outline_color = \
|
||||
new_theme.font_main_outline = True
|
||||
new_theme.font_main_outline_color = \
|
||||
unicode(theme.OutlineColor.name())
|
||||
vAlignCorrection = VerticalType.Top
|
||||
if theme.VerticalAlign == 2:
|
||||
vAlignCorrection = VerticalType.Middle
|
||||
elif theme.VerticalAlign == 1:
|
||||
vAlignCorrection = VerticalType.Bottom
|
||||
newtheme.display_horizontal_align = theme.HorizontalAlign
|
||||
newtheme.display_vertical_align = vAlignCorrection
|
||||
return newtheme.extract_xml()
|
||||
new_theme.display_horizontal_align = theme.HorizontalAlign
|
||||
new_theme.display_vertical_align = vAlignCorrection
|
||||
return new_theme.extract_xml()
|
||||
|
||||
|
@ -34,6 +34,7 @@ import re
|
||||
from PyQt4 import QtCore
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.plugins.bibles.lib.db import BiblesResourcesDB
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -59,6 +60,122 @@ class DisplayStyle(object):
|
||||
Square = 3
|
||||
|
||||
|
||||
class LanguageSelection(object):
|
||||
"""
|
||||
An enumeration for bible bookname language.
|
||||
And standard strings for use throughout the bibles plugin.
|
||||
"""
|
||||
Bible = 0
|
||||
Application = 1
|
||||
English = 2
|
||||
|
||||
|
||||
class BibleStrings(object):
|
||||
"""
|
||||
Provide standard strings for objects to use.
|
||||
"""
|
||||
__instance__ = None
|
||||
|
||||
def __new__(cls):
|
||||
"""
|
||||
Override the default object creation method to return a single instance.
|
||||
"""
|
||||
if not cls.__instance__:
|
||||
cls.__instance__ = object.__new__(cls)
|
||||
return cls.__instance__
|
||||
|
||||
def __init__(self):
|
||||
"""
|
||||
These strings should need a good reason to be retranslated elsewhere.
|
||||
"""
|
||||
self.Booknames = {
|
||||
u'Gen': translate('BiblesPlugin', 'Genesis'),
|
||||
u'Exod': translate('BiblesPlugin', 'Exodus'),
|
||||
u'Lev': translate('BiblesPlugin', 'Leviticus'),
|
||||
u'Num': translate('BiblesPlugin', 'Numbers'),
|
||||
u'Deut': translate('BiblesPlugin', 'Deuteronomy'),
|
||||
u'Josh': translate('BiblesPlugin', 'Joshua'),
|
||||
u'Judg': translate('BiblesPlugin', 'Judges'),
|
||||
u'Ruth': translate('BiblesPlugin', 'Ruth'),
|
||||
u'1Sam': translate('BiblesPlugin', '1 Samuel'),
|
||||
u'2Sam': translate('BiblesPlugin', '2 Samuel'),
|
||||
u'1Kgs': translate('BiblesPlugin', '1 Kings'),
|
||||
u'2Kgs': translate('BiblesPlugin', '2 Kings'),
|
||||
u'1Chr': translate('BiblesPlugin', '1 Chronicles'),
|
||||
u'2Chr': translate('BiblesPlugin', '2 Chronicles'),
|
||||
u'Esra': translate('BiblesPlugin', 'Ezra'),
|
||||
u'Neh': translate('BiblesPlugin', 'Nehemiah'),
|
||||
u'Esth': translate('BiblesPlugin', 'Esther'),
|
||||
u'Job': translate('BiblesPlugin', 'Job'),
|
||||
u'Ps': translate('BiblesPlugin', 'Psalms'),
|
||||
u'Prov': translate('BiblesPlugin', 'Proverbs'),
|
||||
u'Eccl': translate('BiblesPlugin', 'Ecclesiastes'),
|
||||
u'Song': translate('BiblesPlugin', 'Song of Solomon'),
|
||||
u'Isa': translate('BiblesPlugin', 'Isaiah'),
|
||||
u'Jer': translate('BiblesPlugin', 'Jeremiah'),
|
||||
u'Lam': translate('BiblesPlugin', 'Lamentations'),
|
||||
u'Ezek': translate('BiblesPlugin', 'Ezekiel'),
|
||||
u'Dan': translate('BiblesPlugin', 'Daniel'),
|
||||
u'Hos': translate('BiblesPlugin', 'Hosea'),
|
||||
u'Joel': translate('BiblesPlugin', 'Joel'),
|
||||
u'Amos': translate('BiblesPlugin', 'Amos'),
|
||||
u'Obad': translate('BiblesPlugin', 'Obadiah'),
|
||||
u'Jonah': translate('BiblesPlugin', 'Jonah'),
|
||||
u'Mic': translate('BiblesPlugin', 'Micah'),
|
||||
u'Nah': translate('BiblesPlugin', 'Nahum'),
|
||||
u'Hab': translate('BiblesPlugin', 'Habakkuk'),
|
||||
u'Zeph': translate('BiblesPlugin', 'Zephaniah'),
|
||||
u'Hag': translate('BiblesPlugin', 'Haggai'),
|
||||
u'Zech': translate('BiblesPlugin', 'Zechariah'),
|
||||
u'Mal': translate('BiblesPlugin', 'Malachi'),
|
||||
u'Matt': translate('BiblesPlugin', 'Matthew'),
|
||||
u'Mark': translate('BiblesPlugin', 'Mark'),
|
||||
u'Luke': translate('BiblesPlugin', 'Luke'),
|
||||
u'John': translate('BiblesPlugin', 'John'),
|
||||
u'Acts': translate('BiblesPlugin', 'Acts'),
|
||||
u'Rom': translate('BiblesPlugin', 'Romans'),
|
||||
u'1Cor': translate('BiblesPlugin', '1 Corinthians'),
|
||||
u'2Cor': translate('BiblesPlugin', '2 Corinthians'),
|
||||
u'Gal': translate('BiblesPlugin', 'Galatians'),
|
||||
u'Eph': translate('BiblesPlugin', 'Ephesians'),
|
||||
u'Phil': translate('BiblesPlugin', 'Philippians'),
|
||||
u'Col': translate('BiblesPlugin', 'Colossians'),
|
||||
u'1Thess': translate('BiblesPlugin', '1 Thessalonians'),
|
||||
u'2Thess': translate('BiblesPlugin', '2 Thessalonians'),
|
||||
u'1Tim': translate('BiblesPlugin', '1 Timothy'),
|
||||
u'2Tim': translate('BiblesPlugin', '2 Timothy'),
|
||||
u'Titus': translate('BiblesPlugin', 'Titus'),
|
||||
u'Phlm': translate('BiblesPlugin', 'Philemon'),
|
||||
u'Heb': translate('BiblesPlugin', 'Hebrews'),
|
||||
u'Jas': translate('BiblesPlugin', 'James'),
|
||||
u'1Pet': translate('BiblesPlugin', '1 Peter'),
|
||||
u'2Pet': translate('BiblesPlugin', '2 Peter'),
|
||||
u'1John': translate('BiblesPlugin', '1 John'),
|
||||
u'2John': translate('BiblesPlugin', '2 John'),
|
||||
u'3John': translate('BiblesPlugin', '3 John'),
|
||||
u'Jude': translate('BiblesPlugin', 'Jude'),
|
||||
u'Rev': translate('BiblesPlugin', 'Revelation'),
|
||||
u'Jdt': translate('BiblesPlugin', 'Judith'),
|
||||
u'Wis': translate('BiblesPlugin', 'Wisdom'),
|
||||
u'Tob': translate('BiblesPlugin', 'Tobit'),
|
||||
u'Sir': translate('BiblesPlugin', 'Sirach'),
|
||||
u'Bar': translate('BiblesPlugin', 'Baruch'),
|
||||
u'1Macc': translate('BiblesPlugin', '1 Maccabees'),
|
||||
u'2Macc': translate('BiblesPlugin', '2 Maccabees'),
|
||||
u'3Macc': translate('BiblesPlugin', '3 Maccabees'),
|
||||
u'4Macc': translate('BiblesPlugin', '4 Maccabees'),
|
||||
u'AddDan': translate('BiblesPlugin', 'Rest of Daniel'),
|
||||
u'AddEsth': translate('BiblesPlugin', 'Rest of Esther'),
|
||||
u'PrMan': translate('BiblesPlugin', 'Prayer of Manasses'),
|
||||
u'LetJer': translate('BiblesPlugin', 'Letter of Jeremiah'),
|
||||
u'PrAza': translate('BiblesPlugin', 'Prayer of Azariah'),
|
||||
u'Sus': translate('BiblesPlugin', 'Susanna'),
|
||||
u'Bel': translate('BiblesPlugin', 'Bel'),
|
||||
u'1Esdr': translate('BiblesPlugin', '1 Esdras'),
|
||||
u'2Esdr': translate('BiblesPlugin', '2 Esdras')
|
||||
}
|
||||
|
||||
|
||||
def update_reference_separators():
|
||||
"""
|
||||
Updates separators and matches for parsing and formating scripture
|
||||
@ -139,7 +256,7 @@ def get_reference_match(match_type):
|
||||
update_reference_separators()
|
||||
return REFERENCE_MATCHES[match_type]
|
||||
|
||||
def parse_reference(reference):
|
||||
def parse_reference(reference, bible, language_selection, book_ref_id=False):
|
||||
"""
|
||||
This is the next generation über-awesome function that takes a person's
|
||||
typed in string and converts it to a list of references to be queried from
|
||||
@ -147,6 +264,16 @@ def parse_reference(reference):
|
||||
|
||||
``reference``
|
||||
A string. The Bible reference to parse.
|
||||
|
||||
``bible``
|
||||
A object. The Bible database object.
|
||||
|
||||
``language_selection``
|
||||
An int. The language selection the user has choosen in settings
|
||||
section.
|
||||
|
||||
``book_ref_id``
|
||||
A string. The book reference id.
|
||||
|
||||
Returns ``None`` or a reference list.
|
||||
|
||||
@ -232,6 +359,51 @@ def parse_reference(reference):
|
||||
if match:
|
||||
log.debug(u'Matched reference %s' % reference)
|
||||
book = match.group(u'book')
|
||||
if not book_ref_id:
|
||||
booknames = BibleStrings().Booknames
|
||||
# escape reserved characters
|
||||
book_escaped = book
|
||||
for character in u'\\.^$*+?{}[]()':
|
||||
book_escaped = book_escaped.replace(
|
||||
character, u'\\' + character)
|
||||
regex_book = re.compile(u'\s*%s\s*' % u'\s*'.join(
|
||||
book_escaped.split()), re.UNICODE | re.IGNORECASE)
|
||||
if language_selection == LanguageSelection.Bible:
|
||||
db_book = bible.get_book(book)
|
||||
if db_book:
|
||||
book_ref_id = db_book.book_reference_id
|
||||
elif language_selection == LanguageSelection.Application:
|
||||
book_list = []
|
||||
for key, value in booknames.iteritems():
|
||||
if regex_book.match(unicode(value)):
|
||||
book_list.append(key)
|
||||
books = []
|
||||
if book_list:
|
||||
for value in book_list:
|
||||
item = BiblesResourcesDB.get_book(value)
|
||||
if item:
|
||||
books.append(item)
|
||||
if books:
|
||||
for value in books:
|
||||
if bible.get_book_by_book_ref_id(value[u'id']):
|
||||
book_ref_id = value[u'id']
|
||||
break
|
||||
elif language_selection == LanguageSelection.English:
|
||||
books = BiblesResourcesDB.get_books_like(book)
|
||||
if books:
|
||||
book_list = []
|
||||
for value in books:
|
||||
if regex_book.match(value[u'name']):
|
||||
book_list.append(value)
|
||||
if not book_list:
|
||||
book_list = books
|
||||
for value in book_list:
|
||||
if bible.get_book_by_book_ref_id(value[u'id']):
|
||||
book_ref_id = value[u'id']
|
||||
break
|
||||
else:
|
||||
if not bible.get_book_by_book_ref_id(book_ref_id):
|
||||
book_ref_id = False
|
||||
ranges = match.group(u'ranges')
|
||||
range_list = get_reference_match(u'range_separator').split(ranges)
|
||||
ref_list = []
|
||||
@ -277,16 +449,18 @@ def parse_reference(reference):
|
||||
if not to_verse:
|
||||
to_verse = -1
|
||||
if to_chapter > from_chapter:
|
||||
ref_list.append((book, from_chapter, from_verse, -1))
|
||||
ref_list.append((book_ref_id, from_chapter, from_verse, -1))
|
||||
for i in range(from_chapter + 1, to_chapter):
|
||||
ref_list.append((book, i, 1, -1))
|
||||
ref_list.append((book, to_chapter, 1, to_verse))
|
||||
ref_list.append((book_ref_id, i, 1, -1))
|
||||
ref_list.append((book_ref_id, to_chapter, 1, to_verse))
|
||||
elif to_verse >= from_verse or to_verse == -1:
|
||||
ref_list.append((book, from_chapter, from_verse, to_verse))
|
||||
ref_list.append((book_ref_id, from_chapter,
|
||||
from_verse, to_verse))
|
||||
elif from_verse:
|
||||
ref_list.append((book, from_chapter, from_verse, from_verse))
|
||||
ref_list.append((book_ref_id, from_chapter,
|
||||
from_verse, from_verse))
|
||||
else:
|
||||
ref_list.append((book, from_chapter, 1, -1))
|
||||
ref_list.append((book_ref_id, from_chapter, 1, -1))
|
||||
return ref_list
|
||||
else:
|
||||
log.debug(u'Invalid reference: %s' % reference)
|
||||
|
@ -32,7 +32,7 @@ from PyQt4 import QtCore, QtGui
|
||||
from openlp.core.lib import Receiver, SettingsTab, translate
|
||||
from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box
|
||||
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \
|
||||
update_reference_separators, get_reference_separator
|
||||
update_reference_separators, get_reference_separator, LanguageSelection
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -140,9 +140,25 @@ class BiblesTab(SettingsTab):
|
||||
self.scriptureReferenceLayout.addWidget(self.endSeparatorLineEdit, 3,
|
||||
1)
|
||||
self.leftLayout.addWidget(self.scriptureReferenceGroupBox)
|
||||
self.leftLayout.addStretch()
|
||||
self.rightColumn.setSizePolicy(
|
||||
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
|
||||
self.languageSelectionGroupBox = QtGui.QGroupBox(self.rightColumn)
|
||||
self.languageSelectionGroupBox.setObjectName(
|
||||
u'languageSelectionGroupBox')
|
||||
self.languageSelectionLayout = QtGui.QVBoxLayout(
|
||||
self.languageSelectionGroupBox)
|
||||
self.languageSelectionLabel = QtGui.QLabel(
|
||||
self.languageSelectionGroupBox)
|
||||
self.languageSelectionLabel.setObjectName(u'languageSelectionLabel')
|
||||
self.languageSelectionComboBox = QtGui.QComboBox(
|
||||
self.languageSelectionGroupBox)
|
||||
self.languageSelectionComboBox.setObjectName(
|
||||
u'languageSelectionComboBox')
|
||||
self.languageSelectionComboBox.addItems([u'', u'', u''])
|
||||
self.languageSelectionLayout.addWidget(self.languageSelectionLabel)
|
||||
self.languageSelectionLayout.addWidget(self.languageSelectionComboBox)
|
||||
self.rightLayout.addWidget(self.languageSelectionGroupBox)
|
||||
self.leftLayout.addStretch()
|
||||
self.rightLayout.addStretch()
|
||||
# Signals and slots
|
||||
QtCore.QObject.connect(
|
||||
@ -198,6 +214,9 @@ class BiblesTab(SettingsTab):
|
||||
self.onEndSeparatorLineEditFinished)
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList)
|
||||
QtCore.QObject.connect(
|
||||
self.languageSelectionComboBox, QtCore.SIGNAL(u'activated(int)'),
|
||||
self.onLanguageSelectionComboBoxChanged)
|
||||
|
||||
def retranslateUi(self):
|
||||
self.verseDisplayGroupBox.setTitle(
|
||||
@ -257,6 +276,23 @@ class BiblesTab(SettingsTab):
|
||||
'end marks may be defined.\nThey have to be separated by a '
|
||||
'vertical bar "|".\nPlease clear this edit line to use the '
|
||||
'default value.'))
|
||||
self.languageSelectionGroupBox.setTitle(
|
||||
translate('BiblesPlugin.BiblesTab', 'Preferred Bookname Language'))
|
||||
self.languageSelectionLabel.setText(translate('BiblesPlugin.BiblesTab',
|
||||
'Choose the language in which the book names of the\nBible should '
|
||||
'be displayed in the Bible search:'))
|
||||
self.languageSelectionComboBox.setItemText(LanguageSelection.Bible,
|
||||
translate('BiblesPlugin.BiblesTab', 'Bible language'))
|
||||
self.languageSelectionComboBox.setItemText(
|
||||
LanguageSelection.Application,
|
||||
translate('BiblesPlugin.BiblesTab', 'Application language'))
|
||||
self.languageSelectionComboBox.setItemText(LanguageSelection.English,
|
||||
translate('BiblesPlugin.BiblesTab', 'English'))
|
||||
self.languageSelectionComboBox.setToolTip(
|
||||
translate('BiblesPlugin.BiblesTab', 'Multiple options:\n '
|
||||
'Bible language - the language in which the Bible book names '
|
||||
'were imported\n Application language - the language you have '
|
||||
'chosen for OpenLP\n English - always use English book names'))
|
||||
|
||||
def onBibleThemeComboBoxChanged(self):
|
||||
self.bible_theme = self.bibleThemeComboBox.currentText()
|
||||
@ -267,6 +303,9 @@ class BiblesTab(SettingsTab):
|
||||
def onLayoutStyleComboBoxChanged(self):
|
||||
self.layout_style = self.layoutStyleComboBox.currentIndex()
|
||||
|
||||
def onLanguageSelectionComboBoxChanged(self):
|
||||
self.language_selection = self.languageSelectionComboBox.currentIndex()
|
||||
|
||||
def onNewChaptersCheckBoxChanged(self, check_state):
|
||||
self.show_new_chapters = False
|
||||
# We have a set value convert to True/False.
|
||||
@ -448,6 +487,9 @@ class BiblesTab(SettingsTab):
|
||||
self.endSeparatorLineEdit.setPalette(
|
||||
self.getGreyTextPalette(False))
|
||||
self.endSeparatorCheckBox.setChecked(True)
|
||||
self.language_selection = settings.value(
|
||||
u'bookname language', QtCore.QVariant(0)).toInt()[0]
|
||||
self.languageSelectionComboBox.setCurrentIndex(self.language_selection)
|
||||
settings.endGroup()
|
||||
|
||||
def save(self):
|
||||
@ -459,6 +501,8 @@ class BiblesTab(SettingsTab):
|
||||
QtCore.QVariant(self.display_style))
|
||||
settings.setValue(u'verse layout style',
|
||||
QtCore.QVariant(self.layout_style))
|
||||
settings.setValue(u'bookname language',
|
||||
QtCore.QVariant(self.language_selection))
|
||||
settings.setValue(u'second bibles', QtCore.QVariant(self.second_bibles))
|
||||
settings.setValue(u'bible theme', QtCore.QVariant(self.bible_theme))
|
||||
if self.verseSeparatorCheckBox.isChecked():
|
||||
@ -482,6 +526,7 @@ class BiblesTab(SettingsTab):
|
||||
else:
|
||||
settings.remove(u'end separator')
|
||||
update_reference_separators()
|
||||
Receiver.send_message(u'bibles_load_list')
|
||||
settings.endGroup()
|
||||
|
||||
def updateThemeList(self, theme_list):
|
||||
|
@ -435,19 +435,19 @@ class BibleDB(QtCore.QObject, Manager):
|
||||
else:
|
||||
return count
|
||||
|
||||
def get_verse_count(self, book_id, chapter):
|
||||
def get_verse_count(self, book_ref_id, chapter):
|
||||
"""
|
||||
Return the number of verses in a chapter.
|
||||
|
||||
``book``
|
||||
The book containing the chapter.
|
||||
``book_ref_id``
|
||||
The book reference id.
|
||||
|
||||
``chapter``
|
||||
The chapter to get the verse count for.
|
||||
"""
|
||||
log.debug(u'BibleDB.get_verse_count("%s", "%s")', book_id, chapter)
|
||||
log.debug(u'BibleDB.get_verse_count("%s", "%s")', book_ref_id, chapter)
|
||||
count = self.session.query(Verse).join(Book)\
|
||||
.filter(Book.book_reference_id==book_id)\
|
||||
.filter(Book.book_reference_id==book_ref_id)\
|
||||
.filter(Verse.chapter==chapter)\
|
||||
.count()
|
||||
if not count:
|
||||
@ -595,6 +595,35 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
|
||||
else:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_books_like(string):
|
||||
"""
|
||||
Return the books which include string.
|
||||
|
||||
``string``
|
||||
The string to search for in the booknames or abbreviations.
|
||||
"""
|
||||
log.debug(u'BiblesResourcesDB.get_book_like("%s")', string)
|
||||
if not isinstance(string, unicode):
|
||||
name = unicode(string)
|
||||
books = BiblesResourcesDB.run_sql(u'SELECT id, testament_id, name, '
|
||||
u'abbreviation, chapters FROM book_reference WHERE '
|
||||
u'LOWER(name) LIKE ? OR LOWER(abbreviation) LIKE ?',
|
||||
(u'%' + string.lower() + u'%', u'%' + string.lower() + u'%'))
|
||||
if books:
|
||||
return [
|
||||
{
|
||||
u'id': book[0],
|
||||
u'testament_id': book[1],
|
||||
u'name': unicode(book[2]),
|
||||
u'abbreviation': unicode(book[3]),
|
||||
u'chapters': book[4]
|
||||
}
|
||||
for book in books
|
||||
]
|
||||
else:
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_book_by_id(id):
|
||||
"""
|
||||
@ -621,23 +650,23 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_chapter(book_id, chapter):
|
||||
def get_chapter(book_ref_id, chapter):
|
||||
"""
|
||||
Return the chapter details for a specific chapter of a book.
|
||||
|
||||
``book_id``
|
||||
``book_ref_id``
|
||||
The id of a book.
|
||||
|
||||
``chapter``
|
||||
The chapter number.
|
||||
"""
|
||||
log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_id,
|
||||
log.debug(u'BiblesResourcesDB.get_chapter("%s", "%s")', book_ref_id,
|
||||
chapter)
|
||||
if not isinstance(chapter, int):
|
||||
chapter = int(chapter)
|
||||
chapters = BiblesResourcesDB.run_sql(u'SELECT id, book_reference_id, '
|
||||
u'chapter, verse_count FROM chapters WHERE book_reference_id = ?',
|
||||
(book_id,))
|
||||
(book_ref_id,))
|
||||
try:
|
||||
return {
|
||||
u'id': chapters[chapter-1][0],
|
||||
@ -649,21 +678,21 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def get_chapter_count(book_id):
|
||||
def get_chapter_count(book_ref_id):
|
||||
"""
|
||||
Return the number of chapters in a book.
|
||||
|
||||
``book_id``
|
||||
``book_ref_id``
|
||||
The id of the book.
|
||||
"""
|
||||
log.debug(u'BiblesResourcesDB.get_chapter_count("%s")', book_id)
|
||||
details = BiblesResourcesDB.get_book_by_id(book_id)
|
||||
log.debug(u'BiblesResourcesDB.get_chapter_count("%s")', book_ref_id)
|
||||
details = BiblesResourcesDB.get_book_by_id(book_ref_id)
|
||||
if details:
|
||||
return details[u'chapters']
|
||||
return 0
|
||||
|
||||
@staticmethod
|
||||
def get_verse_count(book_id, chapter):
|
||||
def get_verse_count(book_ref_id, chapter):
|
||||
"""
|
||||
Return the number of verses in a chapter.
|
||||
|
||||
@ -673,9 +702,9 @@ class BiblesResourcesDB(QtCore.QObject, Manager):
|
||||
``chapter``
|
||||
The number of the chapter.
|
||||
"""
|
||||
log.debug(u'BiblesResourcesDB.get_verse_count("%s", "%s")', book_id,
|
||||
log.debug(u'BiblesResourcesDB.get_verse_count("%s", "%s")', book_ref_id,
|
||||
chapter)
|
||||
details = BiblesResourcesDB.get_chapter(book_id, chapter)
|
||||
details = BiblesResourcesDB.get_chapter(book_ref_id, chapter)
|
||||
if details:
|
||||
return details[u'verse_count']
|
||||
return 0
|
||||
|
@ -33,7 +33,8 @@ from PyQt4 import QtCore
|
||||
from openlp.core.lib import Receiver, SettingsManager, translate
|
||||
from openlp.core.lib.ui import critical_error_message_box
|
||||
from openlp.core.utils import AppLocation, delete_file
|
||||
from openlp.plugins.bibles.lib import parse_reference, get_reference_separator
|
||||
from openlp.plugins.bibles.lib import parse_reference, \
|
||||
get_reference_separator, LanguageSelection
|
||||
from openlp.plugins.bibles.lib.db import BibleDB, BibleMeta
|
||||
from csvbible import CSVBible
|
||||
from http import HTTPBible
|
||||
@ -227,6 +228,19 @@ class BibleManager(object):
|
||||
for book in self.db_cache[bible].get_books()
|
||||
]
|
||||
|
||||
def get_book_by_id(self, bible, id):
|
||||
"""
|
||||
Returns a book object by given id.
|
||||
|
||||
``bible``
|
||||
Unicode. The Bible to get the list of books from.
|
||||
|
||||
``id``
|
||||
Unicode. The book_reference_id to get the book for.
|
||||
"""
|
||||
log.debug(u'BibleManager.get_book_by_id("%s", "%s")', bible, id)
|
||||
return self.db_cache[bible].get_book_by_book_ref_id(id)
|
||||
|
||||
def get_chapter_count(self, bible, book):
|
||||
"""
|
||||
Returns the number of Chapters for a given book.
|
||||
@ -252,7 +266,16 @@ class BibleManager(object):
|
||||
book_ref_id = db_book.book_reference_id
|
||||
return self.db_cache[bible].get_verse_count(book_ref_id, chapter)
|
||||
|
||||
def get_verses(self, bible, versetext, firstbible=False, show_error=True):
|
||||
def get_verse_count_by_book_ref_id(self, bible, book_ref_id, chapter):
|
||||
"""
|
||||
Returns all the number of verses for a given
|
||||
book_ref_id and chapterMaxBibleBookVerses.
|
||||
"""
|
||||
log.debug(u'BibleManager.get_verse_count_by_book_ref_id("%s", "%s", '
|
||||
u'"%s")', bible, book_ref_id, chapter)
|
||||
return self.db_cache[bible].get_verse_count(book_ref_id, chapter)
|
||||
|
||||
def get_verses(self, bible, versetext, book_ref_id=False, show_error=True):
|
||||
"""
|
||||
Parses a scripture reference, fetches the verses from the Bible
|
||||
specified, and returns a list of ``Verse`` objects.
|
||||
@ -270,6 +293,10 @@ class BibleManager(object):
|
||||
- Genesis 1:1-10,15-20
|
||||
- Genesis 1:1-2:10
|
||||
- Genesis 1:1-10,2:1-10
|
||||
|
||||
``book_ref_id``
|
||||
Unicode. The book referece id from the book in versetext.
|
||||
For second bible this is necessary.
|
||||
"""
|
||||
log.debug(u'BibleManager.get_verses("%s", "%s")', bible, versetext)
|
||||
if not bible:
|
||||
@ -282,30 +309,12 @@ class BibleManager(object):
|
||||
'Import Wizard to install one or more Bibles.')
|
||||
})
|
||||
return None
|
||||
reflist = parse_reference(versetext)
|
||||
language_selection = QtCore.QSettings().value(
|
||||
self.settingsSection + u'/bookname language',
|
||||
QtCore.QVariant(0)).toInt()[0]
|
||||
reflist = parse_reference(versetext, self.db_cache[bible],
|
||||
language_selection, book_ref_id)
|
||||
if reflist:
|
||||
new_reflist = []
|
||||
for item in reflist:
|
||||
if item:
|
||||
if firstbible:
|
||||
db_book = self.db_cache[firstbible].get_book(item[0])
|
||||
db_book = self.db_cache[bible].get_book_by_book_ref_id(
|
||||
db_book.book_reference_id)
|
||||
else:
|
||||
db_book = self.db_cache[bible].get_book(item[0])
|
||||
if db_book:
|
||||
book_id = db_book.book_reference_id
|
||||
log.debug(u'Book name corrected to "%s"', db_book.name)
|
||||
new_reflist.append((book_id, item[1], item[2],
|
||||
item[3]))
|
||||
else:
|
||||
log.debug(u'OpenLP failed to find book %s', item[0])
|
||||
critical_error_message_box(
|
||||
translate('BiblesPlugin', 'No Book Found'),
|
||||
translate('BiblesPlugin', 'No matching book '
|
||||
'could be found in this Bible. Check that you have '
|
||||
'spelled the name of the book correctly.'))
|
||||
reflist = new_reflist
|
||||
return self.db_cache[bible].get_verses(reflist, show_error)
|
||||
else:
|
||||
if show_error:
|
||||
|
@ -38,7 +38,8 @@ from openlp.core.lib.ui import UiStrings, add_widget_completer, \
|
||||
find_and_set_in_combo_box, build_icon
|
||||
from openlp.plugins.bibles.forms import BibleImportForm
|
||||
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \
|
||||
VerseReferenceList, get_reference_separator
|
||||
VerseReferenceList, get_reference_separator, LanguageSelection, BibleStrings
|
||||
from openlp.plugins.bibles.lib.db import BiblesResourcesDB
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
@ -424,20 +425,37 @@ class BibleMediaItem(MediaManagerItem):
|
||||
book_data = book_data_temp
|
||||
self.advancedBookComboBox.clear()
|
||||
first = True
|
||||
language_selection = QtCore.QSettings().value(
|
||||
self.settingsSection + u'/bookname language',
|
||||
QtCore.QVariant(0)).toInt()[0]
|
||||
booknames = BibleStrings().Booknames
|
||||
for book in book_data:
|
||||
row = self.advancedBookComboBox.count()
|
||||
self.advancedBookComboBox.addItem(book[u'name'])
|
||||
if language_selection == LanguageSelection.Bible:
|
||||
self.advancedBookComboBox.addItem(book[u'name'])
|
||||
elif language_selection == LanguageSelection.Application:
|
||||
data = BiblesResourcesDB.get_book_by_id(
|
||||
book[u'book_reference_id'])
|
||||
self.advancedBookComboBox.addItem(
|
||||
booknames[data[u'abbreviation']])
|
||||
elif language_selection == LanguageSelection.English:
|
||||
data = BiblesResourcesDB.get_book_by_id(
|
||||
book[u'book_reference_id'])
|
||||
self.advancedBookComboBox.addItem(data[u'name'])
|
||||
self.advancedBookComboBox.setItemData(
|
||||
row, QtCore.QVariant(book[u'chapters']))
|
||||
row, QtCore.QVariant(book[u'book_reference_id']))
|
||||
if first:
|
||||
first = False
|
||||
self.initialiseChapterVerse(bible, book[u'name'],
|
||||
book[u'chapters'])
|
||||
book[u'book_reference_id'])
|
||||
|
||||
def initialiseChapterVerse(self, bible, book, chapter_count):
|
||||
log.debug(u'initialiseChapterVerse %s, %s', bible, book)
|
||||
self.chapter_count = chapter_count
|
||||
verse_count = self.plugin.manager.get_verse_count(bible, book, 1)
|
||||
def initialiseChapterVerse(self, bible, book, book_ref_id):
|
||||
log.debug(u'initialiseChapterVerse %s, %s, %s', bible, book,
|
||||
book_ref_id)
|
||||
book = self.plugin.manager.get_book_by_id(bible, book_ref_id)
|
||||
self.chapter_count = self.plugin.manager.get_chapter_count(bible, book)
|
||||
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible,
|
||||
book_ref_id, 1)
|
||||
if verse_count == 0:
|
||||
self.advancedSearchButton.setEnabled(False)
|
||||
critical_error_message_box(
|
||||
@ -456,6 +474,7 @@ class BibleMediaItem(MediaManagerItem):
|
||||
completion depends on the bible. It is only updated when we are doing a
|
||||
reference search, otherwise the auto completion list is removed.
|
||||
"""
|
||||
log.debug(u'updateAutoCompleter')
|
||||
# Save the current search type to the configuration.
|
||||
QtCore.QSettings().setValue(u'%s/last search type' %
|
||||
self.settingsSection,
|
||||
@ -480,7 +499,22 @@ class BibleMediaItem(MediaManagerItem):
|
||||
secondbook.book_reference_id:
|
||||
book_data_temp.append(book)
|
||||
book_data = book_data_temp
|
||||
books = [book.name + u' ' for book in book_data]
|
||||
language_selection = QtCore.QSettings().value(
|
||||
self.settingsSection + u'/bookname language',
|
||||
QtCore.QVariant(0)).toInt()[0]
|
||||
if language_selection == LanguageSelection.Bible:
|
||||
books = [book.name + u' ' for book in book_data]
|
||||
elif language_selection == LanguageSelection.Application:
|
||||
booknames = BibleStrings().Booknames
|
||||
for book in book_data:
|
||||
data = BiblesResourcesDB.get_book_by_id(
|
||||
book.book_reference_id)
|
||||
books.append(data[u'name'] + u' ')
|
||||
elif language_selection == LanguageSelection.English:
|
||||
for book in book_data:
|
||||
data = BiblesResourcesDB.get_book_by_id(
|
||||
book.book_reference_id)
|
||||
books.append(data[u'name'] + u' ')
|
||||
books.sort(cmp=locale.strcoll)
|
||||
add_widget_completer(books, self.quickSearchEdit)
|
||||
|
||||
@ -547,29 +581,31 @@ class BibleMediaItem(MediaManagerItem):
|
||||
self.initialiseChapterVerse(
|
||||
unicode(self.advancedVersionComboBox.currentText()),
|
||||
unicode(self.advancedBookComboBox.currentText()),
|
||||
self.advancedBookComboBox.itemData(item).toInt()[0])
|
||||
unicode(self.advancedBookComboBox.itemData(item).toString()))
|
||||
|
||||
def onAdvancedFromVerse(self):
|
||||
chapter_from = int(self.advancedFromChapter.currentText())
|
||||
chapter_to = int(self.advancedToChapter.currentText())
|
||||
if chapter_from == chapter_to:
|
||||
bible = unicode(self.advancedVersionComboBox.currentText())
|
||||
book = unicode(self.advancedBookComboBox.currentText())
|
||||
book_ref_id = unicode(self.advancedBookComboBox.itemData(
|
||||
int(self.advancedBookComboBox.currentIndex())).toString())
|
||||
verse_from = int(self.advancedFromVerse.currentText())
|
||||
verse_count = self.plugin.manager.get_verse_count(bible, book,
|
||||
chapter_to)
|
||||
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(
|
||||
bible, book_ref_id, chapter_to)
|
||||
self.adjustComboBox(verse_from, verse_count,
|
||||
self.advancedToVerse, True)
|
||||
|
||||
def onAdvancedToChapter(self):
|
||||
bible = unicode(self.advancedVersionComboBox.currentText())
|
||||
book = unicode(self.advancedBookComboBox.currentText())
|
||||
book_ref_id = unicode(self.advancedBookComboBox.itemData(
|
||||
int(self.advancedBookComboBox.currentIndex())).toString())
|
||||
chapter_from = int(self.advancedFromChapter.currentText())
|
||||
chapter_to = int(self.advancedToChapter.currentText())
|
||||
verse_from = int(self.advancedFromVerse.currentText())
|
||||
verse_to = int(self.advancedToVerse.currentText())
|
||||
verse_count = self.plugin.manager.get_verse_count(bible, book,
|
||||
chapter_to)
|
||||
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible,
|
||||
book_ref_id, chapter_to)
|
||||
if chapter_from == chapter_to and verse_from > verse_to:
|
||||
self.adjustComboBox(verse_from, verse_count, self.advancedToVerse)
|
||||
else:
|
||||
@ -577,11 +613,12 @@ class BibleMediaItem(MediaManagerItem):
|
||||
|
||||
def onAdvancedFromChapter(self):
|
||||
bible = unicode(self.advancedVersionComboBox.currentText())
|
||||
book = unicode(self.advancedBookComboBox.currentText())
|
||||
book_ref_id = unicode(self.advancedBookComboBox.itemData(
|
||||
int(self.advancedBookComboBox.currentIndex())).toString())
|
||||
chapter_from = int(self.advancedFromChapter.currentText())
|
||||
chapter_to = int(self.advancedToChapter.currentText())
|
||||
verse_count = self.plugin.manager.get_verse_count(bible, book,
|
||||
chapter_from)
|
||||
verse_count = self.plugin.manager.get_verse_count_by_book_ref_id(bible,
|
||||
book_ref_id, chapter_from)
|
||||
self.adjustComboBox(1, verse_count, self.advancedFromVerse)
|
||||
if chapter_from > chapter_to:
|
||||
self.adjustComboBox(1, verse_count, self.advancedToVerse)
|
||||
@ -630,6 +667,8 @@ class BibleMediaItem(MediaManagerItem):
|
||||
bible = unicode(self.advancedVersionComboBox.currentText())
|
||||
second_bible = unicode(self.advancedSecondComboBox.currentText())
|
||||
book = unicode(self.advancedBookComboBox.currentText())
|
||||
book_ref_id = unicode(self.advancedBookComboBox.itemData(
|
||||
int(self.advancedBookComboBox.currentIndex())).toString())
|
||||
chapter_from = self.advancedFromChapter.currentText()
|
||||
chapter_to = self.advancedToChapter.currentText()
|
||||
verse_from = self.advancedFromVerse.currentText()
|
||||
@ -640,10 +679,11 @@ class BibleMediaItem(MediaManagerItem):
|
||||
range_separator + chapter_to + verse_separator + verse_to
|
||||
versetext = u'%s %s' % (book, verse_range)
|
||||
Receiver.send_message(u'cursor_busy')
|
||||
self.search_results = self.plugin.manager.get_verses(bible, versetext)
|
||||
self.search_results = self.plugin.manager.get_verses(bible, versetext,
|
||||
book_ref_id)
|
||||
if second_bible:
|
||||
self.second_search_results = self.plugin.manager.get_verses(
|
||||
second_bible, versetext, bible)
|
||||
second_bible, versetext, book_ref_id)
|
||||
if not self.advancedLockButton.isChecked():
|
||||
self.listView.clear()
|
||||
if self.listView.count() != 0:
|
||||
@ -671,7 +711,8 @@ class BibleMediaItem(MediaManagerItem):
|
||||
self.search_results = self.plugin.manager.get_verses(bible, text)
|
||||
if second_bible and self.search_results:
|
||||
self.second_search_results = self.plugin.manager.get_verses(
|
||||
second_bible, text, bible)
|
||||
second_bible, text,
|
||||
self.search_results[0].book.book_reference_id)
|
||||
else:
|
||||
# We are doing a 'Text Search'.
|
||||
Receiver.send_message(u'cursor_busy')
|
||||
@ -989,8 +1030,7 @@ class BibleMediaItem(MediaManagerItem):
|
||||
Search for some Bible verses (by reference).
|
||||
"""
|
||||
bible = unicode(self.quickVersionComboBox.currentText())
|
||||
search_results = self.plugin.manager.get_verses(bible, string, False,
|
||||
False)
|
||||
search_results = self.plugin.manager.get_verses(bible, string, False)
|
||||
if search_results:
|
||||
versetext = u' '.join([verse.text for verse in search_results])
|
||||
return [[string, versetext]]
|
||||
|
@ -681,14 +681,14 @@ class OpenLyrics(object):
|
||||
unicode(translate('OpenLP.OpenLyricsImportError',
|
||||
'<lyrics> tag is missing.')))
|
||||
try:
|
||||
verses = lyrics.verse
|
||||
verse_list = lyrics.verse
|
||||
except AttributeError:
|
||||
raise OpenLyricsError(OpenLyricsError.VerseError,
|
||||
'<verse> tag is missing.',
|
||||
unicode(translate('OpenLP.OpenLyricsImportError',
|
||||
'<verse> tag is missing.')))
|
||||
# Loop over the "verse" elements.
|
||||
for verse in verses:
|
||||
for verse in verse_list:
|
||||
text = u''
|
||||
# Loop over the "lines" elements.
|
||||
for lines in verse.lines:
|
||||
|
Loading…
Reference in New Issue
Block a user