HEAD r1593

This commit is contained in:
Armin Köhler 2011-05-29 19:03:48 +02:00
commit 17b97e87a8
8 changed files with 300 additions and 134 deletions

7
documentation/manual.txt Normal file
View File

@ -0,0 +1,7 @@
OpenLP Manual
=============
If you're reading this file, you're probably looking for the OpenLP manual. The
manual is hosted online at http://manual.openlp.org/. If you want to help with
the manual, contact the OpenLP team via IRC in the #openlp.org channel on the
Freenode network.

View File

@ -32,7 +32,7 @@ import os
from PyQt4 import QtCore from PyQt4 import QtCore
from sqlalchemy import create_engine, MetaData from sqlalchemy import create_engine, MetaData
from sqlalchemy.exceptions import InvalidRequestError from sqlalchemy.exc import InvalidRequestError
from sqlalchemy.orm import scoped_session, sessionmaker from sqlalchemy.orm import scoped_session, sessionmaker
from sqlalchemy.pool import NullPool from sqlalchemy.pool import NullPool

View File

@ -179,7 +179,7 @@ class Ui_MainWindow(object):
u'printServiceItem', [QtGui.QKeySequence(u'Ctrl+P')], u'printServiceItem', [QtGui.QKeySequence(u'Ctrl+P')],
self.serviceManagerContents.printServiceOrder, self.serviceManagerContents.printServiceOrder,
category=UiStrings().File) category=UiStrings().File)
self.fileExitItem = shortcut_action(mainWindow, u'FileExitItem', self.fileExitItem = shortcut_action(mainWindow, u'fileExitItem',
[QtGui.QKeySequence(u'Alt+F4')], mainWindow.close, [QtGui.QKeySequence(u'Alt+F4')], mainWindow.close,
u':/system/system_exit.png', category=UiStrings().File) u':/system/system_exit.png', category=UiStrings().File)
action_list.add_category(UiStrings().Import, CategoryOrder.standardMenu) action_list.add_category(UiStrings().Import, CategoryOrder.standardMenu)

View File

@ -66,7 +66,7 @@ class SlideController(QtGui.QWidget):
float(self.screens.current[u'size'].height()) float(self.screens.current[u'size'].height())
self.image_manager = self.parent.image_manager self.image_manager = self.parent.image_manager
self.loopList = [ self.loopList = [
u'Start Loop', u'Play Slides Menu',
u'Loop Separator', u'Loop Separator',
u'Image SpinBox' u'Image SpinBox'
] ]
@ -153,6 +153,7 @@ class SlideController(QtGui.QWidget):
context=QtCore.Qt.WidgetWithChildrenShortcut) context=QtCore.Qt.WidgetWithChildrenShortcut)
self.toolbar.addToolbarSeparator(u'Close Separator') self.toolbar.addToolbarSeparator(u'Close Separator')
if self.isLive: if self.isLive:
# Hide Menu
self.hideMenu = QtGui.QToolButton(self.toolbar) self.hideMenu = QtGui.QToolButton(self.toolbar)
self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide')) self.hideMenu.setText(translate('OpenLP.SlideController', 'Hide'))
self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup) self.hideMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup)
@ -180,27 +181,34 @@ class SlideController(QtGui.QWidget):
self.hideMenu.menu().addAction(self.themeScreen) self.hideMenu.menu().addAction(self.themeScreen)
self.hideMenu.menu().addAction(self.desktopScreen) self.hideMenu.menu().addAction(self.desktopScreen)
self.toolbar.addToolbarSeparator(u'Loop Separator') self.toolbar.addToolbarSeparator(u'Loop Separator')
startLoop = self.toolbar.addToolbarButton( # Play Slides Menu
# Does not need translating - control string. self.playSlidesMenu = QtGui.QToolButton(self.toolbar)
u'Start Loop', u':/media/media_time.png', self.playSlidesMenu.setText(translate('OpenLP.SlideController',
translate('OpenLP.SlideController', 'Enable timed slides.'), 'Play Slides'))
self.onStartLoop) self.playSlidesMenu.setPopupMode(QtGui.QToolButton.MenuButtonPopup)
startLoop.setObjectName(u'startLoop') self.toolbar.addToolbarWidget(u'Play Slides Menu',
action_list = ActionList.get_instance() self.playSlidesMenu)
action_list.add_action(startLoop, UiStrings().LiveToolbar) self.playSlidesMenu.setMenu(QtGui.QMenu(
stopLoop = self.toolbar.addToolbarButton( translate('OpenLP.SlideController', 'Play Slides'),
# Does not need translating - control string. self.toolbar))
u'Stop Loop', u':/media/media_stop.png', self.playSlidesLoop = shortcut_action(self.playSlidesMenu,
translate('OpenLP.SlideController', 'Stop timed slides.'), u'playSlidesLoop', [], self.onPlaySlidesLoop,
self.onStopLoop) u':/media/media_time.png', False, UiStrings().LiveToolbar)
stopLoop.setObjectName(u'stopLoop') self.playSlidesLoop.setText(
action_list.add_action(stopLoop, UiStrings().LiveToolbar) translate('OpenLP.SlideController', 'Play Slides in Loop'))
self.toogleLoop = shortcut_action(self, u'toogleLoop', self.playSlidesOnce = shortcut_action(self.playSlidesMenu,
[QtGui.QKeySequence(u'L')], self.onToggleLoop, u'playSlidesOnce', [], self.onPlaySlidesOnce,
category=UiStrings().LiveToolbar) u':/media/media_time.png', False, UiStrings().LiveToolbar)
self.toogleLoop.setText(translate('OpenLP.SlideController', self.playSlidesOnce.setText(
'Start/Stop continuous loop')) translate('OpenLP.SlideController', 'Play Slides to End'))
self.addAction(self.toogleLoop) if QtCore.QSettings().value(self.parent.generalSettingsSection +
u'/enable slide loop', QtCore.QVariant(True)).toBool():
self.playSlidesMenu.setDefaultAction(self.playSlidesLoop)
else:
self.playSlidesMenu.setDefaultAction(self.playSlidesOnce)
self.playSlidesMenu.menu().addAction(self.playSlidesLoop)
self.playSlidesMenu.menu().addAction(self.playSlidesOnce)
# Loop Delay Spinbox
self.delaySpinBox = QtGui.QSpinBox() self.delaySpinBox = QtGui.QSpinBox()
self.delaySpinBox.setRange(1, 180) self.delaySpinBox.setRange(1, 180)
self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox) self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox)
@ -321,7 +329,6 @@ class SlideController(QtGui.QWidget):
QtCore.SIGNAL(u'slidecontroller_live_spin_delay'), QtCore.SIGNAL(u'slidecontroller_live_spin_delay'),
self.receiveSpinDelay) self.receiveSpinDelay)
self.toolbar.makeWidgetsInvisible(self.loopList) self.toolbar.makeWidgetsInvisible(self.loopList)
self.toolbar.actions[u'Stop Loop'].setVisible(False)
else: else:
QtCore.QObject.connect(self.previewListWidget, QtCore.QObject.connect(self.previewListWidget,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), QtCore.SIGNAL(u'doubleClicked(QModelIndex)'),
@ -496,10 +503,6 @@ class SlideController(QtGui.QWidget):
self.mediabar.setVisible(False) self.mediabar.setVisible(False)
self.toolbar.makeWidgetsInvisible([u'Song Menu']) self.toolbar.makeWidgetsInvisible([u'Song Menu'])
self.toolbar.makeWidgetsInvisible(self.loopList) self.toolbar.makeWidgetsInvisible(self.loopList)
self.toogleLoop.setEnabled(False)
self.toolbar.actions[u'Start Loop'].setEnabled(False)
self.toolbar.actions[u'Stop Loop'].setEnabled(False)
self.toolbar.actions[u'Stop Loop'].setVisible(False)
if item.is_text(): if item.is_text():
if QtCore.QSettings().value( if QtCore.QSettings().value(
self.parent.songsSettingsSection + u'/display songbar', self.parent.songsSettingsSection + u'/display songbar',
@ -508,9 +511,6 @@ class SlideController(QtGui.QWidget):
if item.is_capable(ItemCapabilities.AllowsLoop) and \ if item.is_capable(ItemCapabilities.AllowsLoop) and \
len(item.get_frames()) > 1: len(item.get_frames()) > 1:
self.toolbar.makeWidgetsVisible(self.loopList) self.toolbar.makeWidgetsVisible(self.loopList)
self.toogleLoop.setEnabled(True)
self.toolbar.actions[u'Start Loop'].setEnabled(True)
self.toolbar.actions[u'Stop Loop'].setEnabled(True)
if item.is_media(): if item.is_media():
self.toolbar.setVisible(False) self.toolbar.setVisible(False)
self.mediabar.setVisible(True) self.mediabar.setVisible(True)
@ -841,6 +841,11 @@ class SlideController(QtGui.QWidget):
Receiver.send_message(u'%s_unblank' Receiver.send_message(u'%s_unblank'
% self.serviceItem.name.lower(), % self.serviceItem.name.lower(),
[self.serviceItem, self.isLive]) [self.serviceItem, self.isLive])
else:
if hide_mode:
Receiver.send_message(u'maindisplay_hide', hide_mode)
else:
Receiver.send_message(u'maindisplay_show')
def hidePlugin(self, hide): def hidePlugin(self, hide):
""" """
@ -859,6 +864,11 @@ class SlideController(QtGui.QWidget):
Receiver.send_message(u'%s_unblank' Receiver.send_message(u'%s_unblank'
% self.serviceItem.name.lower(), % self.serviceItem.name.lower(),
[self.serviceItem, self.isLive]) [self.serviceItem, self.isLive])
else:
if hide:
Receiver.send_message(u'maindisplay_hide', HideMode.Screen)
else:
Receiver.send_message(u'maindisplay_show')
def onSlideSelected(self, start=False): def onSlideSelected(self, start=False):
""" """
@ -933,7 +943,7 @@ class SlideController(QtGui.QWidget):
rect.y(), rect.width(), rect.height()) rect.y(), rect.width(), rect.height())
self.slidePreview.setPixmap(winimg) self.slidePreview.setPixmap(winimg)
def onSlideSelectedNext(self): def onSlideSelectedNext(self, wrap=None):
""" """
Go to the next slide. Go to the next slide.
""" """
@ -946,8 +956,11 @@ class SlideController(QtGui.QWidget):
else: else:
row = self.previewListWidget.currentRow() + 1 row = self.previewListWidget.currentRow() + 1
if row == self.previewListWidget.rowCount(): if row == self.previewListWidget.rowCount():
if QtCore.QSettings().value(self.parent.generalSettingsSection + if wrap is None:
u'/enable slide loop', QtCore.QVariant(True)).toBool(): wrap = QtCore.QSettings().value(
self.parent.generalSettingsSection +
u'/enable slide loop', QtCore.QVariant(True)).toBool()
if wrap:
row = 0 row = 0
else: else:
row = self.previewListWidget.rowCount() - 1 row = self.previewListWidget.rowCount() - 1
@ -996,11 +1009,11 @@ class SlideController(QtGui.QWidget):
self.previewListWidget.rowCount() - 1) self.previewListWidget.rowCount() - 1)
self.slideSelected() self.slideSelected()
def onToggleLoop(self, toggled): def onToggleLoop(self):
""" """
Toggles the loop state. Toggles the loop state.
""" """
if self.toolbar.actions[u'Start Loop'].isVisible(): if self.playSlidesLoop.isChecked() or self.playSlidesOnce.isChecked():
self.onStartLoop() self.onStartLoop()
else: else:
self.onStopLoop() self.onStopLoop()
@ -1012,8 +1025,6 @@ class SlideController(QtGui.QWidget):
if self.previewListWidget.rowCount() > 1: if self.previewListWidget.rowCount() > 1:
self.timer_id = self.startTimer( self.timer_id = self.startTimer(
int(self.delaySpinBox.value()) * 1000) int(self.delaySpinBox.value()) * 1000)
self.toolbar.actions[u'Stop Loop'].setVisible(True)
self.toolbar.actions[u'Start Loop'].setVisible(False)
def onStopLoop(self): def onStopLoop(self):
""" """
@ -1022,15 +1033,39 @@ class SlideController(QtGui.QWidget):
if self.timer_id != 0: if self.timer_id != 0:
self.killTimer(self.timer_id) self.killTimer(self.timer_id)
self.timer_id = 0 self.timer_id = 0
self.toolbar.actions[u'Start Loop'].setVisible(True)
self.toolbar.actions[u'Stop Loop'].setVisible(False) def onPlaySlidesLoop(self, checked=None):
"""
Start or stop 'Play Slides in Loop'
"""
if checked is None:
checked = self.playSlidesLoop.isChecked()
else:
self.playSlidesLoop.setChecked(checked)
log.debug(u'onPlaySlidesLoop %s' % checked)
self.playSlidesMenu.setDefaultAction(self.playSlidesLoop)
self.playSlidesOnce.setChecked(False)
self.onToggleLoop()
def onPlaySlidesOnce(self, checked=None):
"""
Start or stop 'Play Slides to End'
"""
if checked is None:
checked = self.playSlidesOnce.isChecked()
else:
self.playSlidesOnce.setChecked(checked)
log.debug(u'onPlaySlidesOnce %s' % checked)
self.playSlidesMenu.setDefaultAction(self.playSlidesOnce)
self.playSlidesLoop.setChecked(False)
self.onToggleLoop()
def timerEvent(self, event): def timerEvent(self, event):
""" """
If the timer event is for this window select next slide If the timer event is for this window select next slide
""" """
if event.timerId() == self.timer_id: if event.timerId() == self.timer_id:
self.onSlideSelectedNext() self.onSlideSelectedNext(self.playSlidesLoop.isChecked())
def onEditSong(self): def onEditSong(self):
""" """

View File

@ -29,6 +29,7 @@ The bible import functions for OpenLP
import logging import logging
import os.path import os.path
import re import re
import shutil
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
@ -133,6 +134,38 @@ class BibleUpgradeForm(OpenLPWizard):
if number in self.success and self.success[number] == True: if number in self.success and self.success[number] == True:
delete_file(os.path.join(self.path, filename[0])) delete_file(os.path.join(self.path, filename[0]))
def onBackupBrowseButtonClicked(self):
"""
Show the file open dialog for the OSIS file.
"""
filename = QtGui.QFileDialog.getExistingDirectory(self, translate(
'BiblesPlugin.UpgradeWizardForm', 'Select a Backup Directory'),
os.path.dirname(SettingsManager.get_last_dir(
self.plugin.settingsSection, 1)))
if filename:
self.backupDirectoryEdit.setText(filename)
SettingsManager.set_last_dir(self.plugin.settingsSection,
filename, 1)
def onNoBackupCheckBoxToggled(self, checked):
"""
Enable or disable the backup directory widgets.
"""
self.backupDirectoryEdit.setEnabled(not checked)
self.backupBrowseButton.setEnabled(not checked)
def backupOldBibles(self, backupdirectory):
"""
Backup old bible databases in a given folder.
"""
for filename in self.files:
try:
shutil.copy(os.path.join(self.path, filename[0]),
backupdirectory)
except:
return False
return True
def customInit(self): def customInit(self):
""" """
Perform any custom initialisation for bible upgrading. Perform any custom initialisation for bible upgrading.
@ -146,11 +179,54 @@ class BibleUpgradeForm(OpenLPWizard):
""" """
QtCore.QObject.connect(self.finishButton, QtCore.QObject.connect(self.finishButton,
QtCore.SIGNAL(u'clicked()'), self.onFinishButton) QtCore.SIGNAL(u'clicked()'), self.onFinishButton)
QtCore.QObject.connect(self.backupBrowseButton,
QtCore.SIGNAL(u'clicked()'), self.onBackupBrowseButtonClicked)
QtCore.QObject.connect(self.noBackupCheckBox,
QtCore.SIGNAL(u'toggled(bool)'), self.onNoBackupCheckBoxToggled)
def addCustomPages(self): def addCustomPages(self):
""" """
Add the bible import specific wizard pages. Add the bible import specific wizard pages.
""" """
# Backup Page
self.backupPage = QtGui.QWizardPage()
self.backupPage.setObjectName(u'BackupPage')
self.backupLayout = QtGui.QVBoxLayout(self.backupPage)
self.backupLayout.setObjectName(u'BackupLayout')
self.backupInfoLabel = QtGui.QLabel(self.backupPage)
self.backupInfoLabel.setOpenExternalLinks(True)
self.backupInfoLabel.setTextFormat(QtCore.Qt.RichText)
self.backupInfoLabel.setWordWrap(True)
self.backupInfoLabel.setObjectName(u'backupInfoLabel')
self.backupLayout.addWidget(self.backupInfoLabel)
self.selectLabel = QtGui.QLabel(self.backupPage)
self.selectLabel.setObjectName(u'selectLabel')
self.backupLayout.addWidget(self.selectLabel)
self.formLayout = QtGui.QFormLayout()
self.formLayout.setMargin(0)
self.formLayout.setObjectName(u'FormLayout')
self.backupDirectoryLabel = QtGui.QLabel(self.backupPage)
self.backupDirectoryLabel.setObjectName(u'backupDirectoryLabel')
self.backupDirectoryLayout = QtGui.QHBoxLayout()
self.backupDirectoryLayout.setObjectName(u'BackupDirectoryLayout')
self.backupDirectoryEdit = QtGui.QLineEdit(self.backupPage)
self.backupDirectoryEdit.setObjectName(u'BackupFolderEdit')
self.backupDirectoryLayout.addWidget(self.backupDirectoryEdit)
self.backupBrowseButton = QtGui.QToolButton(self.backupPage)
self.backupBrowseButton.setIcon(self.openIcon)
self.backupBrowseButton.setObjectName(u'BackupBrowseButton')
self.backupDirectoryLayout.addWidget(self.backupBrowseButton)
self.formLayout.addRow(self.backupDirectoryLabel,
self.backupDirectoryLayout)
self.backupLayout.addLayout(self.formLayout)
self.noBackupCheckBox = QtGui.QCheckBox(self.backupPage)
self.noBackupCheckBox.setObjectName('NoBackupCheckBox')
self.backupLayout.addWidget(self.noBackupCheckBox)
self.spacer = QtGui.QSpacerItem(10, 0, QtGui.QSizePolicy.Fixed,
QtGui.QSizePolicy.Minimum)
self.backupLayout.addItem(self.spacer)
self.addPage(self.backupPage)
# Select Page
self.selectPage = QtGui.QWizardPage() self.selectPage = QtGui.QWizardPage()
self.selectPage.setObjectName(u'SelectPage') self.selectPage.setObjectName(u'SelectPage')
self.pageLayout = QtGui.QVBoxLayout(self.selectPage) self.pageLayout = QtGui.QVBoxLayout(self.selectPage)
@ -289,7 +365,27 @@ class BibleUpgradeForm(OpenLPWizard):
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'This wizard will help you to upgrade your existing Bibles from a ' 'This wizard will help you to upgrade your existing Bibles from a '
'prior version of OpenLP 2. Click the next button below to start ' 'prior version of OpenLP 2. Click the next button below to start '
'the process by selecting the Bibles to upgrade.')) 'the upgrade process.'))
self.backupPage.setTitle(
translate('BiblesPlugin.UpgradeWizardForm',
'Select Backup Directory'))
self.backupPage.setSubTitle(
translate('BiblesPlugin.UpgradeWizardForm',
'Please select a backup directory for your Bibles'))
self.backupInfoLabel.setText(translate('BiblesPlugin.UpgradeWizardForm',
'Previous releases of OpenLP 2.0 are unable to use upgraded Bibles.'
' This will create a backup of your current Bibles so that you can '
'simply copy the files back to your OpenLP data directory if you '
'need to revert to a previous release of OpenLP. Instructions on '
'how to restore the files can be found in our <a href="'
'http://wiki.openlp.org/faq">Frequently Asked Questions</a>.'))
self.selectLabel.setText(translate('BiblesPlugin.UpgradeWizardForm',
'Please select a backup location for your Bibles.'))
self.backupDirectoryLabel.setText(
translate('BiblesPlugin.UpgradeWizardForm', 'Backup Directory:'))
self.noBackupCheckBox.setText(
translate('BiblesPlugin.UpgradeWizardForm',
'There is no need to backup my Bibles'))
self.selectPage.setTitle( self.selectPage.setTitle(
translate('BiblesPlugin.UpgradeWizardForm', translate('BiblesPlugin.UpgradeWizardForm',
'Select Bibles')) 'Select Bibles'))
@ -316,6 +412,33 @@ class BibleUpgradeForm(OpenLPWizard):
""" """
if self.currentPage() == self.welcomePage: if self.currentPage() == self.welcomePage:
return True return True
elif self.currentPage() == self.backupPage:
if not self.noBackupCheckBox.checkState() == QtCore.Qt.Checked:
if not unicode(self.backupDirectoryEdit.text()):
critical_error_message_box(UiStrings().EmptyField,
translate('BiblesPlugin.UpgradeWizardForm',
'You need to specify a Backup Directory for your '
'Bibles.'))
self.backupDirectoryEdit.setFocus()
return False
elif not os.path.exists(unicode(
self.backupDirectoryEdit.text())):
critical_error_message_box(UiStrings().Error,
translate('BiblesPlugin.UpgradeWizardForm',
'The given path is not an existing directory.'))
self.backupDirectoryEdit.setFocus()
return False
else:
if not self.backupOldBibles(unicode(
self.backupDirectoryEdit.text())):
critical_error_message_box(UiStrings().Error,
translate('BiblesPlugin.UpgradeWizardForm',
'The backup was not successfull.\nTo backup your '
'Bibles you need the permission to write in the given '
'directory. If you have a permissions to write and '
'this error still occurs, please report a bug.'))
return False
return True
elif self.currentPage() == self.selectPage: elif self.currentPage() == self.selectPage:
for number, filename in enumerate(self.files): for number, filename in enumerate(self.files):
if not self.checkBox[number].checkState() == QtCore.Qt.Checked: if not self.checkBox[number].checkState() == QtCore.Qt.Checked:
@ -627,7 +750,6 @@ class BibleUpgradeForm(OpenLPWizard):
successful_import = 0 successful_import = 0
failed_import = 0 failed_import = 0
for number, filename in enumerate(self.files): for number, filename in enumerate(self.files):
#for number, success in self.success.iteritems():
if number in self.success and self.success[number] == True: if number in self.success and self.success[number] == True:
successful_import += 1 successful_import += 1
elif self.checkBox[number].checkState() == QtCore.Qt.Checked: elif self.checkBox[number].checkState() == QtCore.Qt.Checked:
@ -635,21 +757,21 @@ class BibleUpgradeForm(OpenLPWizard):
if failed_import > 0: if failed_import > 0:
failed_import_text = unicode(translate( failed_import_text = unicode(translate(
'BiblesPlugin.UpgradeWizardForm', 'BiblesPlugin.UpgradeWizardForm',
' - %s upgrade fail')) % failed_import ', %s failed')) % failed_import
else: else:
failed_import_text = u'' failed_import_text = u''
if successful_import > 0: if successful_import > 0:
if include_webbible: if include_webbible:
self.progressLabel.setText(unicode( self.progressLabel.setText(unicode(
translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade %s ' translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading '
'Bible(s) successful%s.\nPlease note, that verses from ' 'Bible(s): %s successful%s\nPlease note, that verses from '
'Web Bibles will be downloaded\non demand and so an ' 'Web Bibles will be downloaded\non demand and so an '
'Internet connection is required.')) % 'Internet connection is required.')) %
(successful_import, failed_import_text)) (successful_import, failed_import_text))
else: else:
self.progressLabel.setText(unicode( self.progressLabel.setText(unicode(
translate('BiblesPlugin.UpgradeWizardForm', 'Upgrade %s ' translate('BiblesPlugin.UpgradeWizardForm', 'Upgrading '
'Bible(s) successful.%s')) % (successful_import, 'Bible(s): %s successful%s')) % (successful_import,
failed_import_text)) failed_import_text))
else: else:
self.progressLabel.setText( self.progressLabel.setText(

View File

@ -80,7 +80,6 @@ class BookNameForm(QDialog, Ui_BookNameDialog):
Reload the Combobox items Reload the Combobox items
''' '''
self.correspondingComboBox.clear() self.correspondingComboBox.clear()
self.correspondingComboBox.addItem(u'')
items = BiblesResourcesDB.get_books() items = BiblesResourcesDB.get_books()
for item in items: for item in items:
addBook = True addBook = True

View File

@ -265,52 +265,57 @@ def clean_song(manager, song):
whitespace = re.compile(r'\W+', re.UNICODE) whitespace = re.compile(r'\W+', re.UNICODE)
song.search_title = (whitespace.sub(u' ', song.title).strip() + u'@' + song.search_title = (whitespace.sub(u' ', song.title).strip() + u'@' +
whitespace.sub(u' ', song.alternate_title).strip()).strip().lower() whitespace.sub(u' ', song.alternate_title).strip()).strip().lower()
# Remove the old "language" attribute from lyrics tag (prior to 1.9.5). This # Only do this, if we the song is a 1.9.4 song (or older).
# is not very important, but this keeps the database clean. This can be if song.lyrics.find(u'<lyrics language="en">') != -1:
# removed when everybody has cleaned his songs. # Remove the old "language" attribute from lyrics tag (prior to 1.9.5).
song.lyrics = song.lyrics.replace(u'<lyrics language="en">', u'<lyrics>') # This is not very important, but this keeps the database clean. This
verses = SongXML().get_verses(song.lyrics) # can be removed when everybody has cleaned his songs.
lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses]) song.lyrics = song.lyrics.replace(
song.search_lyrics = lyrics.lower() u'<lyrics language="en">', u'<lyrics>')
# We need a new and clean SongXML instance. verses = SongXML().get_verses(song.lyrics)
sxml = SongXML() lyrics = u' '.join([whitespace.sub(u' ', verse[1]) for verse in verses])
# Rebuild the song's verses, to remove any wrong verse names (for example song.search_lyrics = lyrics.lower()
# translated ones), which might have been added prior to 1.9.5. # We need a new and clean SongXML instance.
# List for later comparison. sxml = SongXML()
compare_order = [] # Rebuild the song's verses, to remove any wrong verse names (for
for verse in verses: # example translated ones), which might have been added prior to 1.9.5.
verse_type = VerseType.Tags[VerseType.from_loose_input( # List for later comparison.
verse[0][u'type'])] compare_order = []
sxml.add_verse_to_lyrics( for verse in verses:
verse_type, verse_type = VerseType.Tags[VerseType.from_loose_input(
verse[0][u'label'], verse[0][u'type'])]
verse[1], sxml.add_verse_to_lyrics(
verse[0][u'lang'] if verse[0].has_key(u'lang') else None verse_type,
) verse[0][u'label'],
compare_order.append((u'%s%s' % (verse_type, verse[0][u'label']) verse[1],
).upper()) verse[0][u'lang'] if verse[0].has_key(u'lang') else None
if verse[0][u'label'] == u'1': )
compare_order.append(verse_type.upper()) compare_order.append((u'%s%s' % (verse_type, verse[0][u'label'])
song.lyrics = unicode(sxml.extract_xml(), u'utf-8') ).upper())
# Rebuild the verse order, to convert translated verse tags, which might if verse[0][u'label'] == u'1':
# have been added prior to 1.9.5. compare_order.append(verse_type.upper())
if song.verse_order: song.lyrics = unicode(sxml.extract_xml(), u'utf-8')
order = song.verse_order.strip().split() # Rebuild the verse order, to convert translated verse tags, which might
else: # have been added prior to 1.9.5.
order = [] if song.verse_order:
new_order = [] order = song.verse_order.strip().split()
for verse_def in order:
verse_type = VerseType.Tags[VerseType.from_loose_input(verse_def[0])]
if len(verse_def) > 1:
new_order.append((u'%s%s' % (verse_type, verse_def[1:])).upper())
else: else:
new_order.append(verse_type.upper()) order = []
song.verse_order = u' '.join(new_order) new_order = []
# Check if the verse order contains tags for verses which do not exist. for verse_def in order:
for order in new_order: verse_type = VerseType.Tags[
if order not in compare_order: VerseType.from_loose_input(verse_def[0])]
song.verse_order = u'' if len(verse_def) > 1:
break new_order.append(
(u'%s%s' % (verse_type, verse_def[1:])).upper())
else:
new_order.append(verse_type.upper())
song.verse_order = u' '.join(new_order)
# Check if the verse order contains tags for verses which do not exist.
for order in new_order:
if order not in compare_order:
song.verse_order = u''
break
# The song does not have any author, add one. # The song does not have any author, add one.
if not song.authors: if not song.authors:
name = SongStrings.AuthorUnknown name = SongStrings.AuthorUnknown

View File

@ -62,44 +62,44 @@ class SongUsagePlugin(Plugin):
""" """
log.info(u'add tools menu') log.info(u'add tools menu')
self.toolsMenu = tools_menu self.toolsMenu = tools_menu
self.SongUsageMenu = QtGui.QMenu(tools_menu) self.songUsageMenu = QtGui.QMenu(tools_menu)
self.SongUsageMenu.setObjectName(u'SongUsageMenu') self.songUsageMenu.setObjectName(u'songUsageMenu')
self.SongUsageMenu.setTitle(translate( self.songUsageMenu.setTitle(translate(
'SongUsagePlugin', '&Song Usage Tracking')) 'SongUsagePlugin', '&Song Usage Tracking'))
# SongUsage Delete # SongUsage Delete
self.SongUsageDelete = base_action(tools_menu, u'SongUsageDelete') self.songUsageDelete = base_action(tools_menu, u'songUsageDelete')
self.SongUsageDelete.setText(translate('SongUsagePlugin', self.songUsageDelete.setText(translate('SongUsagePlugin',
'&Delete Tracking Data')) '&Delete Tracking Data'))
self.SongUsageDelete.setStatusTip(translate('SongUsagePlugin', self.songUsageDelete.setStatusTip(translate('SongUsagePlugin',
'Delete song usage data up to a specified date.')) 'Delete song usage data up to a specified date.'))
# SongUsage Report # SongUsage Report
self.SongUsageReport = base_action(tools_menu, u'SongUsageReport') self.songUsageReport = base_action(tools_menu, u'songUsageReport')
self.SongUsageReport.setText( self.songUsageReport.setText(
translate('SongUsagePlugin', '&Extract Tracking Data')) translate('SongUsagePlugin', '&Extract Tracking Data'))
self.SongUsageReport.setStatusTip( self.songUsageReport.setStatusTip(
translate('SongUsagePlugin', 'Generate a report on song usage.')) translate('SongUsagePlugin', 'Generate a report on song usage.'))
# SongUsage activation # SongUsage activation
self.SongUsageStatus = shortcut_action(tools_menu, u'SongUsageStatus', self.songUsageStatus = shortcut_action(tools_menu, u'songUsageStatus',
[QtCore.Qt.Key_F4], self.toggleSongUsageState, checked=False) [QtCore.Qt.Key_F4], self.toggleSongUsageState, checked=False)
self.SongUsageStatus.setText(translate( self.songUsageStatus.setText(translate(
'SongUsagePlugin', 'Toggle Tracking')) 'SongUsagePlugin', 'Toggle Tracking'))
self.SongUsageStatus.setStatusTip(translate('SongUsagePlugin', self.songUsageStatus.setStatusTip(translate('SongUsagePlugin',
'Toggle the tracking of song usage.')) 'Toggle the tracking of song usage.'))
#Add Menus together #Add Menus together
self.toolsMenu.addAction(self.SongUsageMenu.menuAction()) self.toolsMenu.addAction(self.songUsageMenu.menuAction())
self.SongUsageMenu.addAction(self.SongUsageStatus) self.songUsageMenu.addAction(self.songUsageStatus)
self.SongUsageMenu.addSeparator() self.songUsageMenu.addSeparator()
self.SongUsageMenu.addAction(self.SongUsageDelete) self.songUsageMenu.addAction(self.songUsageDelete)
self.SongUsageMenu.addAction(self.SongUsageReport) self.songUsageMenu.addAction(self.songUsageReport)
# Signals and slots # Signals and slots
QtCore.QObject.connect(self.SongUsageStatus, QtCore.QObject.connect(self.songUsageStatus,
QtCore.SIGNAL(u'visibilityChanged(bool)'), QtCore.SIGNAL(u'visibilityChanged(bool)'),
self.SongUsageStatus.setChecked) self.songUsageStatus.setChecked)
QtCore.QObject.connect(self.SongUsageDelete, QtCore.QObject.connect(self.songUsageDelete,
QtCore.SIGNAL(u'triggered()'), self.onSongUsageDelete) QtCore.SIGNAL(u'triggered()'), self.onSongUsageDelete)
QtCore.QObject.connect(self.SongUsageReport, QtCore.QObject.connect(self.songUsageReport,
QtCore.SIGNAL(u'triggered()'), self.onSongUsageReport) QtCore.SIGNAL(u'triggered()'), self.onSongUsageReport)
self.SongUsageMenu.menuAction().setVisible(False) self.songUsageMenu.menuAction().setVisible(False)
def initialise(self): def initialise(self):
log.info(u'SongUsage Initialising') log.info(u'SongUsage Initialising')
@ -110,20 +110,20 @@ class SongUsagePlugin(Plugin):
self.SongUsageActive = QtCore.QSettings().value( self.SongUsageActive = QtCore.QSettings().value(
self.settingsSection + u'/active', self.settingsSection + u'/active',
QtCore.QVariant(False)).toBool() QtCore.QVariant(False)).toBool()
self.SongUsageStatus.setChecked(self.SongUsageActive) self.songUsageStatus.setChecked(self.SongUsageActive)
action_list = ActionList.get_instance() action_list = ActionList.get_instance()
action_list.add_action(self.SongUsageDelete, action_list.add_action(self.songUsageDelete,
translate('SongUsagePlugin', 'Song Usage')) translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.SongUsageReport, action_list.add_action(self.songUsageReport,
translate('SongUsagePlugin', 'Song Usage')) translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.SongUsageStatus, action_list.add_action(self.songUsageStatus,
translate('SongUsagePlugin', 'Song Usage')) translate('SongUsagePlugin', 'Song Usage'))
if self.manager is None: if self.manager is None:
self.manager = Manager(u'songusage', init_schema) self.manager = Manager(u'songusage', init_schema)
self.SongUsagedeleteform = SongUsageDeleteForm(self.manager, self.songUsageDeleteForm = SongUsageDeleteForm(self.manager,
self.formparent) self.formparent)
self.SongUsagedetailform = SongUsageDetailForm(self, self.formparent) self.songUsageDetailForm = SongUsageDetailForm(self, self.formparent)
self.SongUsageMenu.menuAction().setVisible(True) self.songUsageMenu.menuAction().setVisible(True)
def finalise(self): def finalise(self):
""" """
@ -132,13 +132,13 @@ class SongUsagePlugin(Plugin):
log.info(u'Plugin Finalise') log.info(u'Plugin Finalise')
self.manager.finalise() self.manager.finalise()
Plugin.finalise(self) Plugin.finalise(self)
self.SongUsageMenu.menuAction().setVisible(False) self.songUsageMenu.menuAction().setVisible(False)
action_list = ActionList.get_instance() action_list = ActionList.get_instance()
action_list.remove_action(self.SongUsageDelete, action_list.remove_action(self.songUsageDelete,
translate('SongUsagePlugin', 'Song Usage')) translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.SongUsageReport, action_list.remove_action(self.songUsageReport,
translate('SongUsagePlugin', 'Song Usage')) translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.SongUsageStatus, action_list.remove_action(self.songUsageStatus,
translate('SongUsagePlugin', 'Song Usage')) translate('SongUsagePlugin', 'Song Usage'))
#stop any events being processed #stop any events being processed
self.SongUsageActive = False self.SongUsageActive = False
@ -160,17 +160,15 @@ class SongUsagePlugin(Plugin):
song_usage_item.title = audit[0] song_usage_item.title = audit[0]
song_usage_item.copyright = audit[2] song_usage_item.copyright = audit[2]
song_usage_item.ccl_number = audit[3] song_usage_item.ccl_number = audit[3]
song_usage_item.authors = u'' song_usage_item.authors = u' '.join(audit[1])
for author in audit[1]:
song_usage_item.authors += author + u' '
self.manager.save_object(song_usage_item) self.manager.save_object(song_usage_item)
def onSongUsageDelete(self): def onSongUsageDelete(self):
self.SongUsagedeleteform.exec_() self.songUsageDeleteForm.exec_()
def onSongUsageReport(self): def onSongUsageReport(self):
self.SongUsagedetailform.initialise() self.songUsageDetailForm.initialise()
self.SongUsagedetailform.exec_() self.songUsageDetailForm.exec_()
def about(self): def about(self):
about_text = translate('SongUsagePlugin', '<strong>SongUsage Plugin' about_text = translate('SongUsagePlugin', '<strong>SongUsage Plugin'