forked from openlp/openlp
r1976
This commit is contained in:
commit
a641bb9a8a
|
@ -91,6 +91,7 @@ class OpenLP(QtGui.QApplication):
|
||||||
"""
|
"""
|
||||||
Override exec method to allow the shared memory to be released on exit
|
Override exec method to allow the shared memory to be released on exit
|
||||||
"""
|
"""
|
||||||
|
self.eventLoopIsActive = True
|
||||||
QtGui.QApplication.exec_()
|
QtGui.QApplication.exec_()
|
||||||
self.sharedMemory.detach()
|
self.sharedMemory.detach()
|
||||||
|
|
||||||
|
@ -98,6 +99,7 @@ class OpenLP(QtGui.QApplication):
|
||||||
"""
|
"""
|
||||||
Run the OpenLP application.
|
Run the OpenLP application.
|
||||||
"""
|
"""
|
||||||
|
self.eventLoopIsActive = False
|
||||||
# On Windows, the args passed into the constructor are
|
# On Windows, the args passed into the constructor are
|
||||||
# ignored. Not very handy, so set the ones we want to use.
|
# ignored. Not very handy, so set the ones we want to use.
|
||||||
self.args.extend(args)
|
self.args.extend(args)
|
||||||
|
@ -109,7 +111,7 @@ class OpenLP(QtGui.QApplication):
|
||||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
QtCore.SIGNAL(u'cursor_normal'), self.setNormalCursor)
|
QtCore.SIGNAL(u'cursor_normal'), self.setNormalCursor)
|
||||||
# Decide how many screens we have and their size
|
# Decide how many screens we have and their size
|
||||||
screens = ScreenList(self.desktop())
|
screens = ScreenList.create(self.desktop())
|
||||||
# First time checks in settings
|
# First time checks in settings
|
||||||
has_run_wizard = QtCore.QSettings().value(
|
has_run_wizard = QtCore.QSettings().value(
|
||||||
u'general/has run wizard', QtCore.QVariant(False)).toBool()
|
u'general/has run wizard', QtCore.QVariant(False)).toBool()
|
||||||
|
@ -127,7 +129,7 @@ class OpenLP(QtGui.QApplication):
|
||||||
# make sure Qt really display the splash screen
|
# make sure Qt really display the splash screen
|
||||||
self.processEvents()
|
self.processEvents()
|
||||||
# start the main app window
|
# start the main app window
|
||||||
self.mainWindow = MainWindow(self.clipboard(), self.args)
|
self.mainWindow = MainWindow(self)
|
||||||
self.mainWindow.show()
|
self.mainWindow.show()
|
||||||
if show_splash:
|
if show_splash:
|
||||||
# now kill the splashscreen
|
# now kill the splashscreen
|
||||||
|
|
|
@ -52,7 +52,7 @@ class OpenLPDockWidget(QtGui.QDockWidget):
|
||||||
if icon:
|
if icon:
|
||||||
self.setWindowIcon(build_icon(icon))
|
self.setWindowIcon(build_icon(icon))
|
||||||
# Sort out the minimum width.
|
# Sort out the minimum width.
|
||||||
screens = ScreenList.get_instance()
|
screens = ScreenList()
|
||||||
mainwindow_docbars = screens.current[u'size'].width() / 5
|
mainwindow_docbars = screens.current[u'size'].width() / 5
|
||||||
if mainwindow_docbars > 300:
|
if mainwindow_docbars > 300:
|
||||||
self.setMinimumWidth(300)
|
self.setMinimumWidth(300)
|
||||||
|
|
|
@ -163,7 +163,7 @@ class ImageManager(QtCore.QObject):
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
QtCore.QObject.__init__(self)
|
QtCore.QObject.__init__(self)
|
||||||
current_screen = ScreenList.get_instance().current
|
current_screen = ScreenList().current
|
||||||
self.width = current_screen[u'size'].width()
|
self.width = current_screen[u'size'].width()
|
||||||
self.height = current_screen[u'size'].height()
|
self.height = current_screen[u'size'].height()
|
||||||
self._cache = {}
|
self._cache = {}
|
||||||
|
@ -177,7 +177,7 @@ class ImageManager(QtCore.QObject):
|
||||||
Screen has changed size so rebuild the cache to new size.
|
Screen has changed size so rebuild the cache to new size.
|
||||||
"""
|
"""
|
||||||
log.debug(u'update_display')
|
log.debug(u'update_display')
|
||||||
current_screen = ScreenList.get_instance().current
|
current_screen = ScreenList().current
|
||||||
self.width = current_screen[u'size'].width()
|
self.width = current_screen[u'size'].width()
|
||||||
self.height = current_screen[u'size'].height()
|
self.height = current_screen[u'size'].height()
|
||||||
# Mark the images as dirty for a rebuild by setting the image and byte
|
# 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')
|
log.debug(u'Initialisation started')
|
||||||
self.themeManager = themeManager
|
self.themeManager = themeManager
|
||||||
self.imageManager = imageManager
|
self.imageManager = imageManager
|
||||||
self.screens = ScreenList.get_instance()
|
self.screens = ScreenList()
|
||||||
self.service_theme = u''
|
self.service_theme = u''
|
||||||
self.theme_level = u''
|
self.theme_level = u''
|
||||||
self.override_background = None
|
self.override_background = None
|
||||||
|
|
|
@ -94,6 +94,7 @@ class UiStrings(object):
|
||||||
self.NewService = translate('OpenLP.Ui', 'New Service')
|
self.NewService = translate('OpenLP.Ui', 'New Service')
|
||||||
self.NewTheme = translate('OpenLP.Ui', 'New Theme')
|
self.NewTheme = translate('OpenLP.Ui', 'New Theme')
|
||||||
self.NextTrack = translate('OpenLP.Ui', 'Next Track')
|
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.NFSs = translate('OpenLP.Ui', 'No File Selected', 'Singular')
|
||||||
self.NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural')
|
self.NFSp = translate('OpenLP.Ui', 'No Files Selected', 'Plural')
|
||||||
self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular')
|
self.NISs = translate('OpenLP.Ui', 'No Item Selected', 'Singular')
|
||||||
|
|
|
@ -42,7 +42,7 @@ class GeneralTab(SettingsTab):
|
||||||
"""
|
"""
|
||||||
Initialise the general settings tab
|
Initialise the general settings tab
|
||||||
"""
|
"""
|
||||||
self.screens = ScreenList.get_instance()
|
self.screens = ScreenList()
|
||||||
self.iconPath = u':/icon/openlp-logo-16x16.png'
|
self.iconPath = u':/icon/openlp-logo-16x16.png'
|
||||||
generalTranslated = translate('OpenLP.GeneralTab', 'General')
|
generalTranslated = translate('OpenLP.GeneralTab', 'General')
|
||||||
SettingsTab.__init__(self, parent, u'General', generalTranslated)
|
SettingsTab.__init__(self, parent, u'General', generalTranslated)
|
||||||
|
|
|
@ -119,7 +119,7 @@ class MainDisplay(Display):
|
||||||
def __init__(self, parent, imageManager, live, controller):
|
def __init__(self, parent, imageManager, live, controller):
|
||||||
Display.__init__(self, parent, live, controller)
|
Display.__init__(self, parent, live, controller)
|
||||||
self.imageManager = imageManager
|
self.imageManager = imageManager
|
||||||
self.screens = ScreenList.get_instance()
|
self.screens = ScreenList()
|
||||||
self.plugins = PluginManager.get_instance().plugins
|
self.plugins = PluginManager.get_instance().plugins
|
||||||
self.rebuildCSS = False
|
self.rebuildCSS = False
|
||||||
self.hideMode = None
|
self.hideMode = None
|
||||||
|
|
|
@ -542,14 +542,15 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||||
"""
|
"""
|
||||||
log.info(u'MainWindow loaded')
|
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
|
This constructor sets up the interface, the various managers, and the
|
||||||
plugins.
|
plugins.
|
||||||
"""
|
"""
|
||||||
QtGui.QMainWindow.__init__(self)
|
QtGui.QMainWindow.__init__(self)
|
||||||
self.clipboard = clipboard
|
self.application = application
|
||||||
self.arguments = arguments
|
self.clipboard = self.application.clipboard()
|
||||||
|
self.arguments = self.application.args
|
||||||
# Set up settings sections for the main application
|
# Set up settings sections for the main application
|
||||||
# (not for use by plugins)
|
# (not for use by plugins)
|
||||||
self.uiSettingsSection = u'user interface'
|
self.uiSettingsSection = u'user interface'
|
||||||
|
@ -795,7 +796,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||||
if answer == QtGui.QMessageBox.No:
|
if answer == QtGui.QMessageBox.No:
|
||||||
return
|
return
|
||||||
Receiver.send_message(u'cursor_busy')
|
Receiver.send_message(u'cursor_busy')
|
||||||
screens = ScreenList.get_instance()
|
screens = ScreenList()
|
||||||
FirstTimeForm(screens, self).exec_()
|
FirstTimeForm(screens, self).exec_()
|
||||||
self.firstTime()
|
self.firstTime()
|
||||||
for plugin in self.pluginManager.plugins:
|
for plugin in self.pluginManager.plugins:
|
||||||
|
@ -1132,6 +1133,11 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||||
"""
|
"""
|
||||||
Hook to close the main window and display windows on exit
|
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 we just did a settings import, close without saving changes.
|
||||||
if self.settingsImported:
|
if self.settingsImported:
|
||||||
event.accept()
|
event.accept()
|
||||||
|
@ -1184,7 +1190,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
||||||
# Save settings
|
# Save settings
|
||||||
self.saveSettings()
|
self.saveSettings()
|
||||||
# Close down the display
|
# Close down the display
|
||||||
|
if self.liveController.display:
|
||||||
self.liveController.display.close()
|
self.liveController.display.close()
|
||||||
|
self.liveController.display = None
|
||||||
|
|
||||||
def serviceChanged(self, reset=False, serviceName=None):
|
def serviceChanged(self, reset=False, serviceName=None):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -41,36 +41,40 @@ class ScreenList(object):
|
||||||
"""
|
"""
|
||||||
Wrapper to handle the parameters of the display screen.
|
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')
|
log.info(u'Screen loaded')
|
||||||
instance = None
|
__instance__ = None
|
||||||
|
|
||||||
@staticmethod
|
def __new__(cls):
|
||||||
def get_instance():
|
if not cls.__instance__:
|
||||||
return ScreenList.instance
|
cls.__instance__ = object.__new__(cls)
|
||||||
|
return cls.__instance__
|
||||||
|
|
||||||
def __init__(self, desktop):
|
@classmethod
|
||||||
|
def create(cls, desktop):
|
||||||
"""
|
"""
|
||||||
Initialise the screen list.
|
Initialise the screen list.
|
||||||
|
|
||||||
``desktop``
|
``desktop``
|
||||||
A ``QDesktopWidget`` object.
|
A ``QDesktopWidget`` object.
|
||||||
"""
|
"""
|
||||||
ScreenList.instance = self
|
screen_list = cls()
|
||||||
self.desktop = desktop
|
screen_list.desktop = desktop
|
||||||
self.preview = None
|
screen_list.preview = None
|
||||||
self.current = None
|
screen_list.current = None
|
||||||
self.override = None
|
screen_list.override = None
|
||||||
self.screen_list = []
|
screen_list.screen_list = []
|
||||||
self.display_count = 0
|
screen_list.display_count = 0
|
||||||
self.screen_count_changed()
|
screen_list.screen_count_changed()
|
||||||
self._load_screen_settings()
|
screen_list._load_screen_settings()
|
||||||
QtCore.QObject.connect(desktop,
|
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.QObject.connect(desktop,
|
||||||
QtCore.SIGNAL(u'screenCountChanged(int)'),
|
QtCore.SIGNAL(u'screenCountChanged(int)'),
|
||||||
self.screen_count_changed)
|
screen_list.screen_count_changed)
|
||||||
|
return screen_list
|
||||||
|
|
||||||
def screen_resolution_changed(self, number):
|
def screen_resolution_changed(self, number):
|
||||||
"""
|
"""
|
||||||
|
@ -233,8 +237,8 @@ class ScreenList(object):
|
||||||
y = window.y() + (window.height() / 2)
|
y = window.y() + (window.height() / 2)
|
||||||
for screen in self.screen_list:
|
for screen in self.screen_list:
|
||||||
size = screen[u'size']
|
size = screen[u'size']
|
||||||
if x >= size.x() and x <= (size.x() + size.width()) \
|
if x >= size.x() and x <= (size.x() + size.width()) and \
|
||||||
and y >= size.y() and y <= (size.y() + size.height()):
|
y >= size.y() and y <= (size.y() + size.height()):
|
||||||
return screen[u'number']
|
return screen[u'number']
|
||||||
|
|
||||||
def _load_screen_settings(self):
|
def _load_screen_settings(self):
|
||||||
|
|
|
@ -73,6 +73,7 @@ class Controller(QtGui.QWidget):
|
||||||
controller = self
|
controller = self
|
||||||
Receiver.send_message('%s' % sender, [controller, args])
|
Receiver.send_message('%s' % sender, [controller, args])
|
||||||
|
|
||||||
|
|
||||||
class SlideController(Controller):
|
class SlideController(Controller):
|
||||||
"""
|
"""
|
||||||
SlideController is the slide controller widget. This widget is what the
|
SlideController is the slide controller widget. This widget is what the
|
||||||
|
@ -83,7 +84,7 @@ class SlideController(Controller):
|
||||||
Set up the Slide Controller.
|
Set up the Slide Controller.
|
||||||
"""
|
"""
|
||||||
Controller.__init__(self, parent, isLive)
|
Controller.__init__(self, parent, isLive)
|
||||||
self.screens = ScreenList.get_instance()
|
self.screens = ScreenList()
|
||||||
try:
|
try:
|
||||||
self.ratio = float(self.screens.current[u'size'].width()) / \
|
self.ratio = float(self.screens.current[u'size'].width()) / \
|
||||||
float(self.screens.current[u'size'].height())
|
float(self.screens.current[u'size'].height())
|
||||||
|
@ -577,8 +578,7 @@ class SlideController(Controller):
|
||||||
# rebuild display as screen size changed
|
# rebuild display as screen size changed
|
||||||
if self.display:
|
if self.display:
|
||||||
self.display.close()
|
self.display.close()
|
||||||
self.display = MainDisplay(self, self.imageManager, self.isLive,
|
self.display = MainDisplay(self, self.imageManager, self.isLive, self)
|
||||||
self)
|
|
||||||
self.display.setup()
|
self.display.setup()
|
||||||
if self.isLive:
|
if self.isLive:
|
||||||
self.__addActionsToWidget(self.display)
|
self.__addActionsToWidget(self.display)
|
||||||
|
|
|
@ -72,11 +72,14 @@ class WizardStrings(object):
|
||||||
'importer, you will need to install the "python-sqlite" '
|
'importer, you will need to install the "python-sqlite" '
|
||||||
'module.')
|
'module.')
|
||||||
OpenTypeFile = unicode(translate('OpenLP.Ui', 'Open %s File'))
|
OpenTypeFile = unicode(translate('OpenLP.Ui', 'Open %s File'))
|
||||||
|
OpenTypeFolder = unicode(translate('OpenLP.Ui', 'Open %s Folder'))
|
||||||
PercentSymbolFormat = unicode(translate('OpenLP.Ui', '%p%'))
|
PercentSymbolFormat = unicode(translate('OpenLP.Ui', '%p%'))
|
||||||
Ready = translate('OpenLP.Ui', 'Ready.')
|
Ready = translate('OpenLP.Ui', 'Ready.')
|
||||||
StartingImport = translate('OpenLP.Ui', 'Starting import...')
|
StartingImport = translate('OpenLP.Ui', 'Starting import...')
|
||||||
YouSpecifyFile = unicode(translate('OpenLP.Ui', 'You need to specify at '
|
YouSpecifyFile = unicode(translate('OpenLP.Ui', 'You need to specify at '
|
||||||
'least one %s file to import from.', 'A file type e.g. OpenSong'))
|
'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):
|
class OpenLPWizard(QtGui.QWizard):
|
||||||
|
@ -254,7 +257,7 @@ class OpenLPWizard(QtGui.QWizard):
|
||||||
The title of the dialog (unicode).
|
The title of the dialog (unicode).
|
||||||
|
|
||||||
``editbox``
|
``editbox``
|
||||||
A editbox (QLineEdit).
|
An editbox (QLineEdit).
|
||||||
|
|
||||||
``filters``
|
``filters``
|
||||||
The file extension filters. It should contain the file description
|
The file extension filters. It should contain the file description
|
||||||
|
@ -265,11 +268,28 @@ class OpenLPWizard(QtGui.QWizard):
|
||||||
if filters:
|
if filters:
|
||||||
filters += u';;'
|
filters += u';;'
|
||||||
filters += u'%s (*)' % UiStrings().AllFiles
|
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(
|
os.path.dirname(SettingsManager.get_last_dir(
|
||||||
self.plugin.settingsSection, 1)), filters)
|
self.plugin.settingsSection, 1)), filters))
|
||||||
if filename:
|
if filename:
|
||||||
editbox.setText(filename)
|
editbox.setText(filename)
|
||||||
SettingsManager.set_last_dir(self.plugin.settingsSection,
|
SettingsManager.set_last_dir(self.plugin.settingsSection,
|
||||||
filename, 1)
|
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
|
import re
|
||||||
from subprocess import Popen, PIPE
|
from subprocess import Popen, PIPE
|
||||||
import sys
|
import sys
|
||||||
import time
|
|
||||||
import urllib2
|
import urllib2
|
||||||
|
|
||||||
from PyQt4 import QtGui, QtCore
|
from PyQt4 import QtGui, QtCore
|
||||||
|
@ -69,7 +68,7 @@ class VersionThread(QtCore.QThread):
|
||||||
"""
|
"""
|
||||||
Run the thread.
|
Run the thread.
|
||||||
"""
|
"""
|
||||||
time.sleep(1)
|
self.sleep(1)
|
||||||
app_version = get_application_version()
|
app_version = get_application_version()
|
||||||
version = check_latest_version(app_version)
|
version = check_latest_version(app_version)
|
||||||
if LooseVersion(str(version)) > LooseVersion(str(app_version[u'full'])):
|
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
|
Called when the *directoryButton* was clicked. Opens a dialog and writes
|
||||||
the path to *directoryLineEdit*.
|
the path to *directoryLineEdit*.
|
||||||
"""
|
"""
|
||||||
path = unicode(QtGui.QFileDialog.getExistingDirectory(self,
|
self.getFolder(translate('SongsPlugin.ExportWizardForm',
|
||||||
translate('SongsPlugin.ExportWizardForm',
|
'Select Destination Folder'), self.directoryLineEdit)
|
||||||
'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)
|
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,9 @@ class SongImportForm(OpenLPWizard):
|
||||||
QtCore.QObject.connect(self.openLP1BrowseButton,
|
QtCore.QObject.connect(self.openLP1BrowseButton,
|
||||||
QtCore.SIGNAL(u'clicked()'),
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
self.onOpenLP1BrowseButtonClicked)
|
self.onOpenLP1BrowseButtonClicked)
|
||||||
|
QtCore.QObject.connect(self.powerSongBrowseButton,
|
||||||
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
|
self.onPowerSongBrowseButtonClicked)
|
||||||
QtCore.QObject.connect(self.openLyricsAddButton,
|
QtCore.QObject.connect(self.openLyricsAddButton,
|
||||||
QtCore.SIGNAL(u'clicked()'),
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
self.onOpenLyricsAddButtonClicked)
|
self.onOpenLyricsAddButtonClicked)
|
||||||
|
@ -171,12 +174,6 @@ class SongImportForm(OpenLPWizard):
|
||||||
QtCore.QObject.connect(self.foilPresenterRemoveButton,
|
QtCore.QObject.connect(self.foilPresenterRemoveButton,
|
||||||
QtCore.SIGNAL(u'clicked()'),
|
QtCore.SIGNAL(u'clicked()'),
|
||||||
self.onFoilPresenterRemoveButtonClicked)
|
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):
|
def addCustomPages(self):
|
||||||
"""
|
"""
|
||||||
|
@ -224,7 +221,7 @@ class SongImportForm(OpenLPWizard):
|
||||||
# Open Song
|
# Open Song
|
||||||
self.addFileSelectItem(u'openSong', u'OpenSong')
|
self.addFileSelectItem(u'openSong', u'OpenSong')
|
||||||
# PowerSong
|
# PowerSong
|
||||||
self.addFileSelectItem(u'powerSong')
|
self.addFileSelectItem(u'powerSong', single_select=True)
|
||||||
# SongBeamer
|
# SongBeamer
|
||||||
self.addFileSelectItem(u'songBeamer')
|
self.addFileSelectItem(u'songBeamer')
|
||||||
# Song Show Plus
|
# Song Show Plus
|
||||||
|
@ -290,6 +287,9 @@ class SongImportForm(OpenLPWizard):
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
translate('SongsPlugin.ImportWizardForm', 'Filename:'))
|
||||||
self.openLP1BrowseButton.setText(UiStrings().Browse)
|
self.openLP1BrowseButton.setText(UiStrings().Browse)
|
||||||
self.openLP1DisabledLabel.setText(WizardStrings.NoSqlite)
|
self.openLP1DisabledLabel.setText(WizardStrings.NoSqlite)
|
||||||
|
self.powerSongFilenameLabel.setText(
|
||||||
|
translate('SongsPlugin.ImportWizardForm', 'Folder:'))
|
||||||
|
self.powerSongBrowseButton.setText(UiStrings().Browse)
|
||||||
self.openLyricsAddButton.setText(
|
self.openLyricsAddButton.setText(
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||||
self.openLyricsRemoveButton.setText(
|
self.openLyricsRemoveButton.setText(
|
||||||
|
@ -315,10 +315,6 @@ class SongImportForm(OpenLPWizard):
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||||
self.dreamBeamRemoveButton.setText(
|
self.dreamBeamRemoveButton.setText(
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Remove File(s)'))
|
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(
|
self.songsOfFellowshipAddButton.setText(
|
||||||
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
translate('SongsPlugin.ImportWizardForm', 'Add Files...'))
|
||||||
self.songsOfFellowshipRemoveButton.setText(
|
self.songsOfFellowshipRemoveButton.setText(
|
||||||
|
@ -389,6 +385,7 @@ class SongImportForm(OpenLPWizard):
|
||||||
source_format = self.formatComboBox.currentIndex()
|
source_format = self.formatComboBox.currentIndex()
|
||||||
QtCore.QSettings().setValue(u'songs/last import type',
|
QtCore.QSettings().setValue(u'songs/last import type',
|
||||||
source_format)
|
source_format)
|
||||||
|
import_class = SongFormat.get_class(source_format)
|
||||||
if source_format == SongFormat.OpenLP2:
|
if source_format == SongFormat.OpenLP2:
|
||||||
if self.openLP2FilenameEdit.text().isEmpty():
|
if self.openLP2FilenameEdit.text().isEmpty():
|
||||||
critical_error_message_box(UiStrings().NFSs,
|
critical_error_message_box(UiStrings().NFSs,
|
||||||
|
@ -401,6 +398,14 @@ class SongImportForm(OpenLPWizard):
|
||||||
WizardStrings.YouSpecifyFile % UiStrings().OLPV1)
|
WizardStrings.YouSpecifyFile % UiStrings().OLPV1)
|
||||||
self.openLP1BrowseButton.setFocus()
|
self.openLP1BrowseButton.setFocus()
|
||||||
return False
|
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:
|
elif source_format == SongFormat.OpenLyrics:
|
||||||
if self.openLyricsFileListWidget.count() == 0:
|
if self.openLyricsFileListWidget.count() == 0:
|
||||||
critical_error_message_box(UiStrings().NFSp,
|
critical_error_message_box(UiStrings().NFSp,
|
||||||
|
@ -431,12 +436,6 @@ class SongImportForm(OpenLPWizard):
|
||||||
WizardStrings.YouSpecifyFile % WizardStrings.DB)
|
WizardStrings.YouSpecifyFile % WizardStrings.DB)
|
||||||
self.dreamBeamAddButton.setFocus()
|
self.dreamBeamAddButton.setFocus()
|
||||||
return False
|
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:
|
elif source_format == SongFormat.SongsOfFellowship:
|
||||||
if self.songsOfFellowshipFileListWidget.count() == 0:
|
if self.songsOfFellowshipFileListWidget.count() == 0:
|
||||||
critical_error_message_box(UiStrings().NFSp,
|
critical_error_message_box(UiStrings().NFSp,
|
||||||
|
@ -546,6 +545,13 @@ class SongImportForm(OpenLPWizard):
|
||||||
'openlp.org v1.x Databases')
|
'openlp.org v1.x Databases')
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def onPowerSongBrowseButtonClicked(self):
|
||||||
|
"""
|
||||||
|
Get PowerSong song database folder
|
||||||
|
"""
|
||||||
|
self.getFolder(WizardStrings.OpenTypeFolder % WizardStrings.PS,
|
||||||
|
self.powerSongFilenameEdit)
|
||||||
|
|
||||||
def onOpenLyricsAddButtonClicked(self):
|
def onOpenLyricsAddButtonClicked(self):
|
||||||
"""
|
"""
|
||||||
Get OpenLyrics song database files
|
Get OpenLyrics song database files
|
||||||
|
@ -620,22 +626,6 @@ class SongImportForm(OpenLPWizard):
|
||||||
"""
|
"""
|
||||||
self.removeSelectedItems(self.dreamBeamFileListWidget)
|
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):
|
def onSongsOfFellowshipAddButtonClicked(self):
|
||||||
"""
|
"""
|
||||||
Get Songs of Fellowship song database files
|
Get Songs of Fellowship song database files
|
||||||
|
@ -748,12 +738,12 @@ class SongImportForm(OpenLPWizard):
|
||||||
self.formatComboBox.setCurrentIndex(last_import_type)
|
self.formatComboBox.setCurrentIndex(last_import_type)
|
||||||
self.openLP2FilenameEdit.setText(u'')
|
self.openLP2FilenameEdit.setText(u'')
|
||||||
self.openLP1FilenameEdit.setText(u'')
|
self.openLP1FilenameEdit.setText(u'')
|
||||||
|
self.powerSongFilenameEdit.setText(u'')
|
||||||
self.openLyricsFileListWidget.clear()
|
self.openLyricsFileListWidget.clear()
|
||||||
self.openSongFileListWidget.clear()
|
self.openSongFileListWidget.clear()
|
||||||
self.wordsOfWorshipFileListWidget.clear()
|
self.wordsOfWorshipFileListWidget.clear()
|
||||||
self.ccliFileListWidget.clear()
|
self.ccliFileListWidget.clear()
|
||||||
self.dreamBeamFileListWidget.clear()
|
self.dreamBeamFileListWidget.clear()
|
||||||
self.powerSongFileListWidget.clear()
|
|
||||||
self.songsOfFellowshipFileListWidget.clear()
|
self.songsOfFellowshipFileListWidget.clear()
|
||||||
self.genericFileListWidget.clear()
|
self.genericFileListWidget.clear()
|
||||||
self.easySlidesFilenameEdit.setText(u'')
|
self.easySlidesFilenameEdit.setText(u'')
|
||||||
|
@ -794,6 +784,11 @@ class SongImportForm(OpenLPWizard):
|
||||||
filename=unicode(self.openLP1FilenameEdit.text()),
|
filename=unicode(self.openLP1FilenameEdit.text()),
|
||||||
plugin=self.plugin
|
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:
|
elif source_format == SongFormat.OpenLyrics:
|
||||||
# Import OpenLyrics songs
|
# Import OpenLyrics songs
|
||||||
importer = self.plugin.importSongs(SongFormat.OpenLyrics,
|
importer = self.plugin.importSongs(SongFormat.OpenLyrics,
|
||||||
|
@ -821,12 +816,6 @@ class SongImportForm(OpenLPWizard):
|
||||||
filenames=self.getListOfFiles(
|
filenames=self.getListOfFiles(
|
||||||
self.dreamBeamFileListWidget)
|
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:
|
elif source_format == SongFormat.SongsOfFellowship:
|
||||||
# Import a Songs of Fellowship RTF file
|
# Import a Songs of Fellowship RTF file
|
||||||
importer = self.plugin.importSongs(SongFormat.SongsOfFellowship,
|
importer = self.plugin.importSongs(SongFormat.SongsOfFellowship,
|
||||||
|
@ -864,10 +853,6 @@ class SongImportForm(OpenLPWizard):
|
||||||
filenames=self.getListOfFiles(self.foilPresenterFileListWidget)
|
filenames=self.getListOfFiles(self.foilPresenterFileListWidget)
|
||||||
)
|
)
|
||||||
importer.doImport()
|
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):
|
def onErrorCopyToButtonClicked(self):
|
||||||
|
|
|
@ -29,8 +29,11 @@ The :mod:`powersongimport` module provides the functionality for importing
|
||||||
PowerSong songs into the OpenLP database.
|
PowerSong songs into the OpenLP database.
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
|
import fnmatch
|
||||||
|
import os
|
||||||
|
|
||||||
from openlp.core.lib import translate
|
from openlp.core.lib import translate
|
||||||
|
from openlp.core.ui.wizard import WizardStrings
|
||||||
from openlp.plugins.songs.lib.songimport import SongImport
|
from openlp.plugins.songs.lib.songimport import SongImport
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
@ -69,13 +72,39 @@ class PowerSongImport(SongImport):
|
||||||
* .song
|
* .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):
|
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',
|
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
|
return
|
||||||
self.importWizard.progressBar.setMaximum(len(self.importSource))
|
self.importWizard.progressBar.setMaximum(len(self.importSource))
|
||||||
for file in self.importSource:
|
for file in self.importSource:
|
||||||
|
@ -92,9 +121,10 @@ class PowerSongImport(SongImport):
|
||||||
field = self._readString(song_data)
|
field = self._readString(song_data)
|
||||||
except ValueError:
|
except ValueError:
|
||||||
parse_error = True
|
parse_error = True
|
||||||
self.logError(file, unicode(
|
self.logError(os.path.basename(file), unicode(
|
||||||
translate('SongsPlugin.PowerSongImport',
|
translate('SongsPlugin.PowerSongImport',
|
||||||
'Invalid PowerSong file. Unexpected byte value.')))
|
'Invalid %s file. Unexpected byte value.'
|
||||||
|
% WizardStrings.PS)))
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
if label == u'TITLE':
|
if label == u'TITLE':
|
||||||
|
@ -110,26 +140,26 @@ class PowerSongImport(SongImport):
|
||||||
continue
|
continue
|
||||||
# Check that file had TITLE field
|
# Check that file had TITLE field
|
||||||
if not self.title:
|
if not self.title:
|
||||||
self.logError(file, unicode(
|
self.logError(os.path.basename(file), unicode(
|
||||||
translate('SongsPlugin.PowerSongImport',
|
translate('SongsPlugin.PowerSongImport',
|
||||||
'Invalid PowerSong file. Missing "TITLE" header.')))
|
'Invalid %s file. Missing "TITLE" header.'
|
||||||
|
% WizardStrings.PS)))
|
||||||
continue
|
continue
|
||||||
# Check that file had COPYRIGHTLINE label
|
# Check that file had COPYRIGHTLINE label
|
||||||
if not found_copyright:
|
if not found_copyright:
|
||||||
self.logError(file, unicode(
|
self.logError(self.title, unicode(
|
||||||
translate('SongsPlugin.PowerSongImport',
|
translate('SongsPlugin.PowerSongImport',
|
||||||
'"%s" Invalid PowerSong file. Missing "COPYRIGHTLINE" '
|
'Invalid %s file. Missing "COPYRIGHTLINE" '
|
||||||
'header.' % self.title)))
|
'header.' % WizardStrings.PS)))
|
||||||
continue
|
continue
|
||||||
# Check that file had at least one verse
|
# Check that file had at least one verse
|
||||||
if not self.verses:
|
if not self.verses:
|
||||||
self.logError(file, unicode(
|
self.logError(self.title, unicode(
|
||||||
translate('SongsPlugin.PowerSongImport',
|
translate('SongsPlugin.PowerSongImport',
|
||||||
'"%s" Verses not found. Missing "PART" header.'
|
'Verses not found. Missing "PART" header.')))
|
||||||
% self.title)))
|
|
||||||
continue
|
continue
|
||||||
if not self.finish():
|
if not self.finish():
|
||||||
self.logError(file)
|
self.logError(self.title)
|
||||||
|
|
||||||
def _readString(self, file_object):
|
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
|
whether the authors etc already exist and add them or refer to them
|
||||||
as necessary
|
as necessary
|
||||||
"""
|
"""
|
||||||
|
@staticmethod
|
||||||
|
def isValidSource(**kwargs):
|
||||||
|
"""
|
||||||
|
Override this method to validate the source prior to import.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
def __init__(self, manager, **kwargs):
|
def __init__(self, manager, **kwargs):
|
||||||
"""
|
"""
|
||||||
Initialise and create defaults for properties
|
Initialise and create defaults for properties
|
||||||
|
@ -65,14 +72,16 @@ class SongImport(QtCore.QObject):
|
||||||
self.importSource = kwargs[u'filename']
|
self.importSource = kwargs[u'filename']
|
||||||
elif u'filenames' in kwargs:
|
elif u'filenames' in kwargs:
|
||||||
self.importSource = kwargs[u'filenames']
|
self.importSource = kwargs[u'filenames']
|
||||||
|
elif u'folder' in kwargs:
|
||||||
|
self.importSource = kwargs[u'folder']
|
||||||
else:
|
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)
|
log.debug(self.importSource)
|
||||||
self.importWizard = None
|
self.importWizard = None
|
||||||
self.song = None
|
self.song = None
|
||||||
self.stopImportFlag = False
|
self.stopImportFlag = False
|
||||||
self.setDefaults()
|
self.setDefaults()
|
||||||
self.errorLog = []
|
|
||||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
QtCore.SIGNAL(u'openlp_stop_wizard'), self.stopImport)
|
QtCore.SIGNAL(u'openlp_stop_wizard'), self.stopImport)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue