mirror of https://gitlab.com/openlp/openlp.git
Merged trunk
This commit is contained in:
commit
394a02c696
|
@ -92,6 +92,7 @@ class OpenLP(QtGui.QApplication):
|
|||
"""
|
||||
Override exec method to allow the shared memory to be released on exit
|
||||
"""
|
||||
self.eventLoopIsActive = True
|
||||
QtGui.QApplication.exec_()
|
||||
self.sharedMemory.detach()
|
||||
|
||||
|
@ -99,6 +100,7 @@ class OpenLP(QtGui.QApplication):
|
|||
"""
|
||||
Run the OpenLP application.
|
||||
"""
|
||||
self.eventLoopIsActive = False
|
||||
# On Windows, the args passed into the constructor are
|
||||
# ignored. Not very handy, so set the ones we want to use.
|
||||
self.args.extend(args)
|
||||
|
@ -110,7 +112,7 @@ class OpenLP(QtGui.QApplication):
|
|||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'cursor_normal'), self.setNormalCursor)
|
||||
# Decide how many screens we have and their size
|
||||
screens = ScreenList(self.desktop())
|
||||
screens = ScreenList.create(self.desktop())
|
||||
# First time checks in settings
|
||||
has_run_wizard = Settings().value(
|
||||
u'general/has run wizard', QtCore.QVariant(False)).toBool()
|
||||
|
@ -128,7 +130,7 @@ class OpenLP(QtGui.QApplication):
|
|||
# make sure Qt really display the splash screen
|
||||
self.processEvents()
|
||||
# start the main app window
|
||||
self.mainWindow = MainWindow(self.clipboard(), self.args)
|
||||
self.mainWindow = MainWindow(self)
|
||||
self.mainWindow.show()
|
||||
if show_splash:
|
||||
# now kill the splashscreen
|
||||
|
|
|
@ -52,7 +52,7 @@ class OpenLPDockWidget(QtGui.QDockWidget):
|
|||
if icon:
|
||||
self.setWindowIcon(build_icon(icon))
|
||||
# Sort out the minimum width.
|
||||
screens = ScreenList.get_instance()
|
||||
screens = ScreenList()
|
||||
mainwindow_docbars = screens.current[u'size'].width() / 5
|
||||
if mainwindow_docbars > 300:
|
||||
self.setMinimumWidth(300)
|
||||
|
|
|
@ -163,7 +163,7 @@ class ImageManager(QtCore.QObject):
|
|||
|
||||
def __init__(self):
|
||||
QtCore.QObject.__init__(self)
|
||||
current_screen = ScreenList.get_instance().current
|
||||
current_screen = ScreenList().current
|
||||
self.width = current_screen[u'size'].width()
|
||||
self.height = current_screen[u'size'].height()
|
||||
self._cache = {}
|
||||
|
@ -177,7 +177,7 @@ class ImageManager(QtCore.QObject):
|
|||
Screen has changed size so rebuild the cache to new size.
|
||||
"""
|
||||
log.debug(u'update_display')
|
||||
current_screen = ScreenList.get_instance().current
|
||||
current_screen = ScreenList().current
|
||||
self.width = current_screen[u'size'].width()
|
||||
self.height = current_screen[u'size'].height()
|
||||
# Mark the images as dirty for a rebuild by setting the image and byte
|
||||
|
|
|
@ -69,7 +69,7 @@ class Renderer(object):
|
|||
log.debug(u'Initialisation started')
|
||||
self.themeManager = themeManager
|
||||
self.imageManager = imageManager
|
||||
self.screens = ScreenList.get_instance()
|
||||
self.screens = ScreenList()
|
||||
self.service_theme = u''
|
||||
self.theme_level = u''
|
||||
self.override_background = None
|
||||
|
|
|
@ -94,6 +94,7 @@ class UiStrings(object):
|
|||
self.NewService = translate('OpenLP.Ui', 'New Service')
|
||||
self.NewTheme = translate('OpenLP.Ui', 'New Theme')
|
||||
self.NextTrack = translate('OpenLP.Ui', 'Next Track')
|
||||
self.NFdSs = translate('OpenLP.Ui', 'No Folder Selected', 'Singular')
|
||||
self.NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular')
|
||||
self.NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural')
|
||||
self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular')
|
||||
|
|
|
@ -57,6 +57,9 @@ class ThemeScreenshotThread(QtCore.QThread):
|
|||
themes = themes.split(u',')
|
||||
config = self.parent().config
|
||||
for theme in themes:
|
||||
# Stop if the wizard has been cancelled.
|
||||
if self.parent().downloadCancelled:
|
||||
return
|
||||
title = config.get(u'theme_%s' % theme, u'title')
|
||||
filename = config.get(u'theme_%s' % theme, u'filename')
|
||||
screenshot = config.get(u'theme_%s' % theme, u'screenshot')
|
||||
|
@ -87,7 +90,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard):
|
|||
files = self.webAccess.read()
|
||||
self.config.readfp(io.BytesIO(files))
|
||||
self.updateScreenListCombo()
|
||||
self.downloadCanceled = False
|
||||
self.downloadCancelled = False
|
||||
self.downloading = unicode(translate('OpenLP.FirstTimeWizard',
|
||||
'Downloading %s...'))
|
||||
QtCore.QObject.connect(self.cancelButton, QtCore.SIGNAL('clicked()'),
|
||||
|
@ -243,11 +246,12 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard):
|
|||
Process the triggering of the cancel button.
|
||||
"""
|
||||
if self.lastId == FirstTimePage.NoInternet or \
|
||||
(self.lastId <= FirstTimePage.Plugins and \
|
||||
not self.hasRunWizard):
|
||||
(self.lastId <= FirstTimePage.Plugins and not self.hasRunWizard):
|
||||
QtCore.QCoreApplication.exit()
|
||||
sys.exit()
|
||||
self.downloadCanceled = True
|
||||
self.downloadCancelled = True
|
||||
while self.themeScreenshotThread.isRunning():
|
||||
time.sleep(0.1)
|
||||
Receiver.send_message(u'cursor_normal')
|
||||
|
||||
def onNoInternetFinishButtonClicked(self):
|
||||
|
@ -273,7 +277,7 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard):
|
|||
filesize = urlfile.headers["Content-Length"]
|
||||
filename = open(fpath, "wb")
|
||||
# Download until finished or canceled.
|
||||
while not self.downloadCanceled:
|
||||
while not self.downloadCancelled:
|
||||
data = urlfile.read(block_size)
|
||||
if not data:
|
||||
break
|
||||
|
@ -281,8 +285,8 @@ class FirstTimeForm(QtGui.QWizard, Ui_FirstTimeWizard):
|
|||
block_count += 1
|
||||
self._downloadProgress(block_count, block_size, filesize)
|
||||
filename.close()
|
||||
# Delete file if canceled, it may be a partial file.
|
||||
if self.downloadCanceled:
|
||||
# Delete file if cancelled, it may be a partial file.
|
||||
if self.downloadCancelled:
|
||||
os.remove(fpath)
|
||||
|
||||
def _buildThemeScreenshots(self):
|
||||
|
|
|
@ -43,7 +43,7 @@ class GeneralTab(SettingsTab):
|
|||
"""
|
||||
Initialise the general settings tab
|
||||
"""
|
||||
self.screens = ScreenList.get_instance()
|
||||
self.screens = ScreenList()
|
||||
self.iconPath = u':/icon/openlp-logo-16x16.png'
|
||||
generalTranslated = translate('OpenLP.GeneralTab', 'General')
|
||||
SettingsTab.__init__(self, parent, u'General', generalTranslated)
|
||||
|
|
|
@ -120,7 +120,7 @@ class MainDisplay(Display):
|
|||
def __init__(self, parent, imageManager, live, controller):
|
||||
Display.__init__(self, parent, live, controller)
|
||||
self.imageManager = imageManager
|
||||
self.screens = ScreenList.get_instance()
|
||||
self.screens = ScreenList()
|
||||
self.plugins = PluginManager.get_instance().plugins
|
||||
self.rebuildCSS = False
|
||||
self.hideMode = None
|
||||
|
|
|
@ -543,14 +543,15 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
"""
|
||||
log.info(u'MainWindow loaded')
|
||||
|
||||
def __init__(self, clipboard, arguments):
|
||||
def __init__(self, application):
|
||||
"""
|
||||
This constructor sets up the interface, the various managers, and the
|
||||
plugins.
|
||||
"""
|
||||
QtGui.QMainWindow.__init__(self)
|
||||
self.clipboard = clipboard
|
||||
self.arguments = arguments
|
||||
self.application = application
|
||||
self.clipboard = self.application.clipboard()
|
||||
self.arguments = self.application.args
|
||||
# Set up settings sections for the main application
|
||||
# (not for use by plugins)
|
||||
self.uiSettingsSection = u'user interface'
|
||||
|
@ -796,7 +797,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
if answer == QtGui.QMessageBox.No:
|
||||
return
|
||||
Receiver.send_message(u'cursor_busy')
|
||||
screens = ScreenList.get_instance()
|
||||
screens = ScreenList()
|
||||
FirstTimeForm(screens, self).exec_()
|
||||
self.firstTime()
|
||||
for plugin in self.pluginManager.plugins:
|
||||
|
@ -831,7 +832,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
translate('OpenLP.MainWindow',
|
||||
'OpenLP Main Display Blanked'),
|
||||
translate('OpenLP.MainWindow',
|
||||
'The Main Display has been blanked out'))
|
||||
'The Main Display has been blanked out'))
|
||||
|
||||
def onErrorMessage(self, data):
|
||||
Receiver.send_message(u'close_splash')
|
||||
|
@ -1133,6 +1134,11 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
"""
|
||||
Hook to close the main window and display windows on exit
|
||||
"""
|
||||
# The MainApplication did not even enter the event loop (this happens
|
||||
# when OpenLP is not fully loaded). Just ignore the event.
|
||||
if not self.application.eventLoopIsActive:
|
||||
event.ignore()
|
||||
return
|
||||
# If we just did a settings import, close without saving changes.
|
||||
if self.settingsImported:
|
||||
event.accept()
|
||||
|
@ -1185,7 +1191,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||
# Save settings
|
||||
self.saveSettings()
|
||||
# Close down the display
|
||||
self.liveController.display.close()
|
||||
if self.liveController.display:
|
||||
self.liveController.display.close()
|
||||
self.liveController.display = None
|
||||
|
||||
def serviceChanged(self, reset=False, serviceName=None):
|
||||
"""
|
||||
|
|
|
@ -42,36 +42,40 @@ class ScreenList(object):
|
|||
"""
|
||||
Wrapper to handle the parameters of the display screen.
|
||||
|
||||
To get access to the screen list call ``ScreenList.get_instance()``.
|
||||
To get access to the screen list call ``ScreenList()``.
|
||||
"""
|
||||
log.info(u'Screen loaded')
|
||||
instance = None
|
||||
__instance__ = None
|
||||
|
||||
@staticmethod
|
||||
def get_instance():
|
||||
return ScreenList.instance
|
||||
def __new__(cls):
|
||||
if not cls.__instance__:
|
||||
cls.__instance__ = object.__new__(cls)
|
||||
return cls.__instance__
|
||||
|
||||
def __init__(self, desktop):
|
||||
@classmethod
|
||||
def create(cls, desktop):
|
||||
"""
|
||||
Initialise the screen list.
|
||||
|
||||
``desktop``
|
||||
A ``QDesktopWidget`` object.
|
||||
"""
|
||||
ScreenList.instance = self
|
||||
self.desktop = desktop
|
||||
self.preview = None
|
||||
self.current = None
|
||||
self.override = None
|
||||
self.screen_list = []
|
||||
self.display_count = 0
|
||||
self.screen_count_changed()
|
||||
self._load_screen_settings()
|
||||
screen_list = cls()
|
||||
screen_list.desktop = desktop
|
||||
screen_list.preview = None
|
||||
screen_list.current = None
|
||||
screen_list.override = None
|
||||
screen_list.screen_list = []
|
||||
screen_list.display_count = 0
|
||||
screen_list.screen_count_changed()
|
||||
screen_list._load_screen_settings()
|
||||
QtCore.QObject.connect(desktop,
|
||||
QtCore.SIGNAL(u'resized(int)'), self.screen_resolution_changed)
|
||||
QtCore.SIGNAL(u'resized(int)'),
|
||||
screen_list.screen_resolution_changed)
|
||||
QtCore.QObject.connect(desktop,
|
||||
QtCore.SIGNAL(u'screenCountChanged(int)'),
|
||||
self.screen_count_changed)
|
||||
screen_list.screen_count_changed)
|
||||
return screen_list
|
||||
|
||||
def screen_resolution_changed(self, number):
|
||||
"""
|
||||
|
@ -234,8 +238,8 @@ class ScreenList(object):
|
|||
y = window.y() + (window.height() / 2)
|
||||
for screen in self.screen_list:
|
||||
size = screen[u'size']
|
||||
if x >= size.x() and x <= (size.x() + size.width()) \
|
||||
and y >= size.y() and y <= (size.y() + size.height()):
|
||||
if x >= size.x() and x <= (size.x() + size.width()) and \
|
||||
y >= size.y() and y <= (size.y() + size.height()):
|
||||
return screen[u'number']
|
||||
|
||||
def _load_screen_settings(self):
|
||||
|
|
|
@ -74,6 +74,7 @@ class Controller(QtGui.QWidget):
|
|||
controller = self
|
||||
Receiver.send_message('%s' % sender, [controller, args])
|
||||
|
||||
|
||||
class SlideController(Controller):
|
||||
"""
|
||||
SlideController is the slide controller widget. This widget is what the
|
||||
|
@ -84,7 +85,7 @@ class SlideController(Controller):
|
|||
Set up the Slide Controller.
|
||||
"""
|
||||
Controller.__init__(self, parent, isLive)
|
||||
self.screens = ScreenList.get_instance()
|
||||
self.screens = ScreenList()
|
||||
try:
|
||||
self.ratio = float(self.screens.current[u'size'].width()) / \
|
||||
float(self.screens.current[u'size'].height())
|
||||
|
@ -578,8 +579,7 @@ class SlideController(Controller):
|
|||
# rebuild display as screen size changed
|
||||
if self.display:
|
||||
self.display.close()
|
||||
self.display = MainDisplay(self, self.imageManager, self.isLive,
|
||||
self)
|
||||
self.display = MainDisplay(self, self.imageManager, self.isLive, self)
|
||||
self.display.setup()
|
||||
if self.isLive:
|
||||
self.__addActionsToWidget(self.display)
|
||||
|
|
|
@ -72,11 +72,14 @@ class WizardStrings(object):
|
|||
'importer, you will need to install the "python-sqlite" '
|
||||
'module.')
|
||||
OpenTypeFile = unicode(translate('OpenLP.Ui', 'Open %s File'))
|
||||
OpenTypeFolder = unicode(translate('OpenLP.Ui', 'Open %s Folder'))
|
||||
PercentSymbolFormat = unicode(translate('OpenLP.Ui', '%p%'))
|
||||
Ready = translate('OpenLP.Ui', 'Ready.')
|
||||
StartingImport = translate('OpenLP.Ui', 'Starting import...')
|
||||
YouSpecifyFile = unicode(translate('OpenLP.Ui', 'You need to specify at '
|
||||
'least one %s file to import from.', 'A file type e.g. OpenSong'))
|
||||
YouSpecifyFolder = unicode(translate('OpenLP.Ui', 'You need to specify a '
|
||||
'%s folder to import from.', 'A file type e.g. OpenSong'))
|
||||
|
||||
|
||||
class OpenLPWizard(QtGui.QWizard):
|
||||
|
@ -254,7 +257,7 @@ class OpenLPWizard(QtGui.QWizard):
|
|||
The title of the dialog (unicode).
|
||||
|
||||
``editbox``
|
||||
A editbox (QLineEdit).
|
||||
An editbox (QLineEdit).
|
||||
|
||||
``filters``
|
||||
The file extension filters. It should contain the file description
|
||||
|
@ -265,11 +268,28 @@ class OpenLPWizard(QtGui.QWizard):
|
|||
if filters:
|
||||
filters += u';;'
|
||||
filters += u'%s (*)' % UiStrings().AllFiles
|
||||
filename = QtGui.QFileDialog.getOpenFileName(self, title,
|
||||
filename = unicode(QtGui.QFileDialog.getOpenFileName(self, title,
|
||||
os.path.dirname(SettingsManager.get_last_dir(
|
||||
self.plugin.settingsSection, 1)), filters)
|
||||
self.plugin.settingsSection, 1)), filters))
|
||||
if filename:
|
||||
editbox.setText(filename)
|
||||
SettingsManager.set_last_dir(self.plugin.settingsSection,
|
||||
filename, 1)
|
||||
|
||||
def getFolder(self, title, editbox):
|
||||
"""
|
||||
Opens a QFileDialog and saves the selected folder to the given editbox.
|
||||
|
||||
``title``
|
||||
The title of the dialog (unicode).
|
||||
|
||||
``editbox``
|
||||
An editbox (QLineEdit).
|
||||
"""
|
||||
folder = unicode(QtGui.QFileDialog.getExistingDirectory(self, title,
|
||||
os.path.dirname(SettingsManager.get_last_dir(
|
||||
self.plugin.settingsSection, 1)), QtGui.QFileDialog.ShowDirsOnly))
|
||||
if folder:
|
||||
editbox.setText(folder)
|
||||
SettingsManager.set_last_dir(self.plugin.settingsSection,
|
||||
folder, 1)
|
||||
|
|
|
@ -34,7 +34,6 @@ import os
|
|||
import re
|
||||
from subprocess import Popen, PIPE
|
||||
import sys
|
||||
import time
|
||||
import urllib2
|
||||
|
||||
from openlp.core.lib.settings import Settings
|
||||
|
@ -71,7 +70,7 @@ class VersionThread(QtCore.QThread):
|
|||
"""
|
||||
Run the thread.
|
||||
"""
|
||||
time.sleep(1)
|
||||
self.sleep(1)
|
||||
app_version = get_application_version()
|
||||
version = check_latest_version(app_version)
|
||||
if LooseVersion(str(version)) > LooseVersion(str(app_version[u'full'])):
|
||||
|
|
|
@ -363,11 +363,5 @@ class SongExportForm(OpenLPWizard):
|
|||
Called when the *directoryButton* was clicked. Opens a dialog and writes
|
||||
the path to *directoryLineEdit*.
|
||||
"""
|
||||
path = unicode(QtGui.QFileDialog.getExistingDirectory(self,
|
||||
translate('SongsPlugin.ExportWizardForm',
|
||||
'Select Destination Folder'),
|
||||
SettingsManager.get_last_dir(self.plugin.settingsSection, 1),
|
||||
options=QtGui.QFileDialog.ShowDirsOnly))
|
||||
SettingsManager.set_last_dir(self.plugin.settingsSection, path, 1)
|
||||
self.directoryLineEdit.setText(path)
|
||||
|
||||
self.getFolder(translate('SongsPlugin.ExportWizardForm',
|
||||
'Select Destination Folder'), self.directoryLineEdit)
|
||||
|
|
|
@ -106,6 +106,9 @@ class SongImportForm(OpenLPWizard):
|
|||
QtCore.QObject.connect(self.openLP1BrowseButton,
|
||||
QtCore.SIGNAL(u'clicked()'),
|
||||
self.onOpenLP1BrowseButtonClicked)
|
||||
QtCore.QObject.connect(self.powerSongBrowseButton,
|
||||
QtCore.SIGNAL(u'clicked()'),
|
||||
self.onPowerSongBrowseButtonClicked)
|
||||
QtCore.QObject.connect(self.openLyricsAddButton,
|
||||
QtCore.SIGNAL(u'clicked()'),
|
||||
self.onOpenLyricsAddButtonClicked)
|
||||
|
@ -172,12 +175,6 @@ class SongImportForm(OpenLPWizard):
|
|||
QtCore.QObject.connect(self.foilPresenterRemoveButton,
|
||||
QtCore.SIGNAL(u'clicked()'),
|
||||
self.onFoilPresenterRemoveButtonClicked)
|
||||
QtCore.QObject.connect(self.powerSongAddButton,
|
||||
QtCore.SIGNAL(u'clicked()'),
|
||||
self.onPowerSongAddButtonClicked)
|
||||
QtCore.QObject.connect(self.powerSongRemoveButton,
|
||||
QtCore.SIGNAL(u'clicked()'),
|
||||
self.onPowerSongRemoveButtonClicked)
|
||||
|
||||
def addCustomPages(self):
|
||||
"""
|
||||
|
@ -225,7 +222,7 @@ class SongImportForm(OpenLPWizard):
|
|||
# Open Song
|
||||
self.addFileSelectItem(u'openSong', u'OpenSong')
|
||||
# PowerSong
|
||||
self.addFileSelectItem(u'powerSong')
|
||||
self.addFileSelectItem(u'powerSong', single_select=True)
|
||||
# SongBeamer
|
||||
self.addFileSelectItem(u'songBeamer')
|
||||
# Song Show Plus
|
||||
|
@ -291,6 +288,9 @@ class SongImportForm(OpenLPWizard):
|
|||
translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
||||
self.openLP1BrowseButton.setText(UiStrings().Browse)
|
||||
self.openLP1DisabledLabel.setText(WizardStrings.NoSqlite)
|
||||
self.powerSongFilenameLabel.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Folder:'))
|
||||
self.powerSongBrowseButton.setText(UiStrings().Browse)
|
||||
self.openLyricsAddButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||
self.openLyricsRemoveButton.setText(
|
||||
|
@ -316,10 +316,6 @@ class SongImportForm(OpenLPWizard):
|
|||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||
self.dreamBeamRemoveButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
||||
self.powerSongAddButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||
self.powerSongRemoveButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
||||
self.songsOfFellowshipAddButton.setText(
|
||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||
self.songsOfFellowshipRemoveButton.setText(
|
||||
|
@ -390,6 +386,7 @@ class SongImportForm(OpenLPWizard):
|
|||
source_format = self.formatComboBox.currentIndex()
|
||||
Settings().setValue(u'songs/last import type',
|
||||
source_format)
|
||||
import_class = SongFormat.get_class(source_format)
|
||||
if source_format == SongFormat.OpenLP2:
|
||||
if self.openLP2FilenameEdit.text().isEmpty():
|
||||
critical_error_message_box(UiStrings().NFSs,
|
||||
|
@ -402,6 +399,14 @@ class SongImportForm(OpenLPWizard):
|
|||
WizardStrings.YouSpecifyFile % UiStrings().OLPV1)
|
||||
self.openLP1BrowseButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.PowerSong:
|
||||
if self.powerSongFilenameEdit.text().isEmpty() or \
|
||||
not import_class.isValidSource(
|
||||
folder=self.powerSongFilenameEdit.text()):
|
||||
critical_error_message_box(UiStrings().NFdSs,
|
||||
WizardStrings.YouSpecifyFolder % WizardStrings.PS)
|
||||
self.powerSongBrowseButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.OpenLyrics:
|
||||
if self.openLyricsFileListWidget.count() == 0:
|
||||
critical_error_message_box(UiStrings().NFSp,
|
||||
|
@ -432,12 +437,6 @@ class SongImportForm(OpenLPWizard):
|
|||
WizardStrings.YouSpecifyFile % WizardStrings.DB)
|
||||
self.dreamBeamAddButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.PowerSong:
|
||||
if self.powerSongFileListWidget.count() == 0:
|
||||
critical_error_message_box(UiStrings().NFSp,
|
||||
WizardStrings.YouSpecifyFile % WizardStrings.PS)
|
||||
self.powerSongAddButton.setFocus()
|
||||
return False
|
||||
elif source_format == SongFormat.SongsOfFellowship:
|
||||
if self.songsOfFellowshipFileListWidget.count() == 0:
|
||||
critical_error_message_box(UiStrings().NFSp,
|
||||
|
@ -547,6 +546,13 @@ class SongImportForm(OpenLPWizard):
|
|||
'openlp.org v1.x Databases')
|
||||
)
|
||||
|
||||
def onPowerSongBrowseButtonClicked(self):
|
||||
"""
|
||||
Get PowerSong song database folder
|
||||
"""
|
||||
self.getFolder(WizardStrings.OpenTypeFolder % WizardStrings.PS,
|
||||
self.powerSongFilenameEdit)
|
||||
|
||||
def onOpenLyricsAddButtonClicked(self):
|
||||
"""
|
||||
Get OpenLyrics song database files
|
||||
|
@ -621,22 +627,6 @@ class SongImportForm(OpenLPWizard):
|
|||
"""
|
||||
self.removeSelectedItems(self.dreamBeamFileListWidget)
|
||||
|
||||
def onPowerSongAddButtonClicked(self):
|
||||
"""
|
||||
Get PowerSong song database files
|
||||
"""
|
||||
self.getFiles(WizardStrings.OpenTypeFile % WizardStrings.PS,
|
||||
self.powerSongFileListWidget, u'%s (*.song)'
|
||||
% translate('SongsPlugin.ImportWizardForm',
|
||||
'PowerSong 1.0 Song Files')
|
||||
)
|
||||
|
||||
def onPowerSongRemoveButtonClicked(self):
|
||||
"""
|
||||
Remove selected PowerSong files from the import list
|
||||
"""
|
||||
self.removeSelectedItems(self.powerSongFileListWidget)
|
||||
|
||||
def onSongsOfFellowshipAddButtonClicked(self):
|
||||
"""
|
||||
Get Songs of Fellowship song database files
|
||||
|
@ -749,12 +739,12 @@ class SongImportForm(OpenLPWizard):
|
|||
self.formatComboBox.setCurrentIndex(last_import_type)
|
||||
self.openLP2FilenameEdit.setText(u'')
|
||||
self.openLP1FilenameEdit.setText(u'')
|
||||
self.powerSongFilenameEdit.setText(u'')
|
||||
self.openLyricsFileListWidget.clear()
|
||||
self.openSongFileListWidget.clear()
|
||||
self.wordsOfWorshipFileListWidget.clear()
|
||||
self.ccliFileListWidget.clear()
|
||||
self.dreamBeamFileListWidget.clear()
|
||||
self.powerSongFileListWidget.clear()
|
||||
self.songsOfFellowshipFileListWidget.clear()
|
||||
self.genericFileListWidget.clear()
|
||||
self.easySlidesFilenameEdit.setText(u'')
|
||||
|
@ -795,6 +785,11 @@ class SongImportForm(OpenLPWizard):
|
|||
filename=unicode(self.openLP1FilenameEdit.text()),
|
||||
plugin=self.plugin
|
||||
)
|
||||
elif source_format == SongFormat.PowerSong:
|
||||
# Import PowerSong folder
|
||||
importer = self.plugin.importSongs(SongFormat.PowerSong,
|
||||
folder=unicode(self.powerSongFilenameEdit.text())
|
||||
)
|
||||
elif source_format == SongFormat.OpenLyrics:
|
||||
# Import OpenLyrics songs
|
||||
importer = self.plugin.importSongs(SongFormat.OpenLyrics,
|
||||
|
@ -822,12 +817,6 @@ class SongImportForm(OpenLPWizard):
|
|||
filenames=self.getListOfFiles(
|
||||
self.dreamBeamFileListWidget)
|
||||
)
|
||||
elif source_format == SongFormat.PowerSong:
|
||||
# Import PowerSong songs
|
||||
importer = self.plugin.importSongs(SongFormat.PowerSong,
|
||||
filenames=self.getListOfFiles(
|
||||
self.powerSongFileListWidget)
|
||||
)
|
||||
elif source_format == SongFormat.SongsOfFellowship:
|
||||
# Import a Songs of Fellowship RTF file
|
||||
importer = self.plugin.importSongs(SongFormat.SongsOfFellowship,
|
||||
|
@ -865,11 +854,7 @@ class SongImportForm(OpenLPWizard):
|
|||
filenames=self.getListOfFiles(self.foilPresenterFileListWidget)
|
||||
)
|
||||
importer.doImport()
|
||||
if importer.errorLog:
|
||||
self.progressLabel.setText(translate(
|
||||
'SongsPlugin.SongImportForm', 'Your song import failed.'))
|
||||
else:
|
||||
self.progressLabel.setText(WizardStrings.FinishedImport)
|
||||
self.progressLabel.setText(WizardStrings.FinishedImport)
|
||||
|
||||
def onErrorCopyToButtonClicked(self):
|
||||
"""
|
||||
|
|
|
@ -29,8 +29,11 @@ The :mod:`powersongimport` module provides the functionality for importing
|
|||
PowerSong songs into the OpenLP database.
|
||||
"""
|
||||
import logging
|
||||
import fnmatch
|
||||
import os
|
||||
|
||||
from openlp.core.lib import translate
|
||||
from openlp.core.ui.wizard import WizardStrings
|
||||
from openlp.plugins.songs.lib.songimport import SongImport
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
@ -69,13 +72,39 @@ class PowerSongImport(SongImport):
|
|||
* .song
|
||||
"""
|
||||
|
||||
@staticmethod
|
||||
def isValidSource(**kwargs):
|
||||
"""
|
||||
Checks if source is a PowerSong 1.0 folder:
|
||||
* is a directory
|
||||
* contains at least one *.song file
|
||||
"""
|
||||
if u'folder' in kwargs:
|
||||
dir = kwargs[u'folder']
|
||||
if os.path.isdir(dir):
|
||||
for file in os.listdir(dir):
|
||||
if fnmatch.fnmatch(file, u'*.song'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def doImport(self):
|
||||
"""
|
||||
Receive a list of files to import.
|
||||
Receive either a list of files or a folder (unicode) to import.
|
||||
"""
|
||||
if not isinstance(self.importSource, list):
|
||||
if isinstance(self.importSource, unicode):
|
||||
if os.path.isdir(self.importSource):
|
||||
dir = self.importSource
|
||||
self.importSource = []
|
||||
for file in os.listdir(dir):
|
||||
if fnmatch.fnmatch(file, u'*.song'):
|
||||
self.importSource.append(os.path.join(dir, file))
|
||||
else:
|
||||
self.importSource = u''
|
||||
if not self.importSource or not isinstance(self.importSource, list):
|
||||
self.logError(unicode(translate('SongsPlugin.PowerSongImport',
|
||||
'No files to import.')))
|
||||
'No songs to import.')),
|
||||
unicode(translate('SongsPlugin.PowerSongImport',
|
||||
'No %s files found.' % WizardStrings.PS)))
|
||||
return
|
||||
self.importWizard.progressBar.setMaximum(len(self.importSource))
|
||||
for file in self.importSource:
|
||||
|
@ -92,9 +121,10 @@ class PowerSongImport(SongImport):
|
|||
field = self._readString(song_data)
|
||||
except ValueError:
|
||||
parse_error = True
|
||||
self.logError(file, unicode(
|
||||
self.logError(os.path.basename(file), unicode(
|
||||
translate('SongsPlugin.PowerSongImport',
|
||||
'Invalid PowerSong file. Unexpected byte value.')))
|
||||
'Invalid %s file. Unexpected byte value.'
|
||||
% WizardStrings.PS)))
|
||||
break
|
||||
else:
|
||||
if label == u'TITLE':
|
||||
|
@ -110,26 +140,26 @@ class PowerSongImport(SongImport):
|
|||
continue
|
||||
# Check that file had TITLE field
|
||||
if not self.title:
|
||||
self.logError(file, unicode(
|
||||
self.logError(os.path.basename(file), unicode(
|
||||
translate('SongsPlugin.PowerSongImport',
|
||||
'Invalid PowerSong file. Missing "TITLE" header.')))
|
||||
'Invalid %s file. Missing "TITLE" header.'
|
||||
% WizardStrings.PS)))
|
||||
continue
|
||||
# Check that file had COPYRIGHTLINE label
|
||||
if not found_copyright:
|
||||
self.logError(file, unicode(
|
||||
self.logError(self.title, unicode(
|
||||
translate('SongsPlugin.PowerSongImport',
|
||||
'"%s" Invalid PowerSong file. Missing "COPYRIGHTLINE" '
|
||||
'header.' % self.title)))
|
||||
'Invalid %s file. Missing "COPYRIGHTLINE" '
|
||||
'header.' % WizardStrings.PS)))
|
||||
continue
|
||||
# Check that file had at least one verse
|
||||
if not self.verses:
|
||||
self.logError(file, unicode(
|
||||
self.logError(self.title, unicode(
|
||||
translate('SongsPlugin.PowerSongImport',
|
||||
'"%s" Verses not found. Missing "PART" header.'
|
||||
% self.title)))
|
||||
'Verses not found. Missing "PART" header.')))
|
||||
continue
|
||||
if not self.finish():
|
||||
self.logError(file)
|
||||
self.logError(self.title)
|
||||
|
||||
def _readString(self, file_object):
|
||||
"""
|
||||
|
|
|
@ -50,6 +50,13 @@ class SongImport(QtCore.QObject):
|
|||
whether the authors etc already exist and add them or refer to them
|
||||
as necessary
|
||||
"""
|
||||
@staticmethod
|
||||
def isValidSource(**kwargs):
|
||||
"""
|
||||
Override this method to validate the source prior to import.
|
||||
"""
|
||||
pass
|
||||
|
||||
def __init__(self, manager, **kwargs):
|
||||
"""
|
||||
Initialise and create defaults for properties
|
||||
|
@ -65,14 +72,16 @@ class SongImport(QtCore.QObject):
|
|||
self.importSource = kwargs[u'filename']
|
||||
elif u'filenames' in kwargs:
|
||||
self.importSource = kwargs[u'filenames']
|
||||
elif u'folder' in kwargs:
|
||||
self.importSource = kwargs[u'folder']
|
||||
else:
|
||||
raise KeyError(u'Keyword arguments "filename[s]" not supplied.')
|
||||
raise KeyError(
|
||||
u'Keyword arguments "filename[s]" or "folder" not supplied.')
|
||||
log.debug(self.importSource)
|
||||
self.importWizard = None
|
||||
self.song = None
|
||||
self.stopImportFlag = False
|
||||
self.setDefaults()
|
||||
self.errorLog = []
|
||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||
QtCore.SIGNAL(u'openlp_stop_wizard'), self.stopImport)
|
||||
|
||||
|
|
Loading…
Reference in New Issue