openlp/openlp/core/ui/wizard.py

295 lines
12 KiB
Python
Raw Normal View History

2011-01-13 17:55:29 +00:00
# -*- coding: utf-8 -*-
2012-12-29 15:25:29 +00:00
# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4
2011-01-13 17:55:29 +00:00
###############################################################################
# OpenLP - Open Source Lyrics Projection #
# --------------------------------------------------------------------------- #
2012-12-29 20:56:56 +00:00
# Copyright (c) 2008-2013 Raoul Snyman #
# Portions copyright (c) 2008-2013 Tim Bentley, Gerald Britton, Jonathan #
# Corwin, Samuel Findlay, Michael Gorven, Scott Guerrieri, Matthias Hub, #
2012-11-11 21:16:14 +00:00
# Meinert Jordan, Armin Köhler, Erik Lundin, Edwin Lunando, Brian T. Meyer. #
2012-10-21 13:16:22 +00:00
# Joshua Miller, Stevan Pettit, Andreas Preikschat, Mattias Põldaru, #
# Christian Richter, Philip Ridout, Simon Scudder, Jeffrey Smith, #
# Maikel Stuivenberg, Martin Thompson, Jon Tibble, Dave Warnock, #
# Frode Woldsund, Martin Zibricky, Patrick Zimmermann #
2011-01-13 17:55:29 +00:00
# --------------------------------------------------------------------------- #
# This program is free software; you can redistribute it and/or modify it #
# under the terms of the GNU General Public License as published by the Free #
# Software Foundation; version 2 of the License. #
# #
# This program is distributed in the hope that it will be useful, but WITHOUT #
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
# more details. #
# #
# You should have received a copy of the GNU General Public License along #
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
"""
The :mod:``wizard`` module provides generic wizard tools for OpenLP.
"""
import logging
2011-02-10 21:07:28 +00:00
import os
2011-01-13 17:55:29 +00:00
from PyQt4 import QtCore, QtGui
2013-02-07 08:42:17 +00:00
from openlp.core.lib import Registry, Settings, UiStrings, build_icon, translate
from openlp.core.lib.ui import add_welcome_page
2011-01-13 17:55:29 +00:00
log = logging.getLogger(__name__)
2013-02-01 21:34:23 +00:00
2011-02-12 02:43:13 +00:00
class WizardStrings(object):
"""
Provide standard strings for wizards to use.
"""
2011-02-12 20:25:40 +00:00
# Applications/Formats we import from or export to. These get used in
# multiple places but do not need translating unless you find evidence of
# the writers translating their own product name.
CSV = u'CSV'
OS = u'OpenSong'
OSIS = u'OSIS'
2011-02-12 02:43:13 +00:00
# These strings should need a good reason to be retranslated elsewhere.
FinishedImport = translate('OpenLP.Ui', 'Finished import.')
2011-02-12 02:43:13 +00:00
FormatLabel = translate('OpenLP.Ui', 'Format:')
HeaderStyle = u'<span style="font-size:14pt; font-weight:600;">%s</span>'
2011-02-12 15:37:02 +00:00
Importing = translate('OpenLP.Ui', 'Importing')
2012-05-17 18:57:01 +00:00
ImportingType = translate('OpenLP.Ui', 'Importing "%s"...')
2011-02-12 02:43:13 +00:00
ImportSelect = translate('OpenLP.Ui', 'Select Import Source')
ImportSelectLong = translate('OpenLP.Ui', 'Select the import format and the location to import from.')
NoSqlite = translate('OpenLP.Ui', 'The openlp.org 1.x importer has been disabled due to a missing Python module. '
'If you want to use this importer, you will need to install the "python-sqlite" module.')
2012-05-17 18:57:01 +00:00
OpenTypeFile = translate('OpenLP.Ui', 'Open %s File')
2012-10-03 16:38:06 +00:00
OpenTypeFolder = translate('OpenLP.Ui', 'Open %s Folder')
2012-05-17 18:57:01 +00:00
PercentSymbolFormat = translate('OpenLP.Ui', '%p%')
2011-02-13 01:09:04 +00:00
Ready = translate('OpenLP.Ui', 'Ready.')
StartingImport = translate('OpenLP.Ui', 'Starting import...')
2012-10-03 16:38:06 +00:00
YouSpecifyFile = translate('OpenLP.Ui', 'You need to specify one '
'%s file to import from.', 'A file type e.g. OpenSong')
YouSpecifyFiles = translate('OpenLP.Ui', 'You need to specify at '
2012-05-17 18:57:01 +00:00
'least one %s file to import from.', 'A file type e.g. OpenSong')
2012-10-03 16:38:06 +00:00
YouSpecifyFolder = translate('OpenLP.Ui', 'You need to specify one '
'%s folder to import from.', 'A song format e.g. PowerSong')
2011-02-12 02:43:13 +00:00
2011-01-13 17:55:29 +00:00
class OpenLPWizard(QtGui.QWizard):
"""
Generic OpenLP wizard to provide generic functionality and a unified look
and feel.
"""
def __init__(self, parent, plugin, name, image):
2013-02-01 21:34:23 +00:00
"""
Constructor
"""
2011-01-13 17:55:29 +00:00
QtGui.QWizard.__init__(self, parent)
2011-02-12 02:43:13 +00:00
self.plugin = plugin
2011-01-13 17:55:29 +00:00
self.setObjectName(name)
2013-03-07 08:05:43 +00:00
self.open_icon = build_icon(u':/general/general_open.png')
self.delete_icon = build_icon(u':/general/general_delete.png')
self.finish_button = self.button(QtGui.QWizard.FinishButton)
self.cancel_button = self.button(QtGui.QWizard.CancelButton)
2011-01-13 17:55:29 +00:00
self.setupUi(image)
2013-03-07 08:05:43 +00:00
self.register_fields()
2011-01-13 17:55:29 +00:00
self.customInit()
self.customSignals()
2013-03-07 08:05:43 +00:00
QtCore.QObject.connect(self, QtCore.SIGNAL(u'currentIdChanged(int)'), self.on_current_id_changed)
QtCore.QObject.connect(self.error_copy_to_button, QtCore.SIGNAL(u'clicked()'), self.on_error_copy_to_button_clicked)
QtCore.QObject.connect(self.error_save_to_button, QtCore.SIGNAL(u'clicked()'), self.on_error_save_to_button_clicked)
2011-01-13 17:55:29 +00:00
def setupUi(self, image):
"""
2012-06-01 07:32:58 +00:00
Set up the wizard UI.
2011-01-13 17:55:29 +00:00
"""
self.setModal(True)
self.setWizardStyle(QtGui.QWizard.ModernStyle)
self.setOptions(QtGui.QWizard.IndependentPages |
QtGui.QWizard.NoBackButtonOnStartPage | QtGui.QWizard.NoBackButtonOnLastPage)
add_welcome_page(self, image)
2011-01-13 17:55:29 +00:00
self.addCustomPages()
self.addProgressPage()
self.retranslateUi()
2013-03-07 08:05:43 +00:00
def register_fields(self):
2011-02-10 19:28:17 +00:00
"""
Hook method for wizards to register any fields they need.
"""
pass
2011-01-13 17:55:29 +00:00
def addProgressPage(self):
"""
2011-01-18 18:53:09 +00:00
Add the progress page for the wizard. This page informs the user how
2011-01-13 17:55:29 +00:00
the wizard is progressing with its task.
"""
2013-03-07 08:05:43 +00:00
self.progress_page = QtGui.QWizardPage()
self.progress_page.setObjectName(u'progress_page')
self.progress_layout = QtGui.QVBoxLayout(self.progress_page)
self.progress_layout.setMargin(48)
self.progress_layout.setObjectName(u'progress_layout')
self.progress_label = QtGui.QLabel(self.progress_page)
self.progress_label.setObjectName(u'progress_label')
self.progress_label.setWordWrap(True)
self.progress_layout.addWidget(self.progress_label)
self.progress_bar = QtGui.QProgressBar(self.progress_page)
self.progress_bar.setObjectName(u'progress_bar')
self.progress_layout.addWidget(self.progress_bar)
# Add a QTextEdit and a copy to file and copy to clipboard button to be
# able to provide feedback to the user. Hidden by default.
2013-03-07 08:05:43 +00:00
self.error_report_text_edit = QtGui.QTextEdit(self.progress_page)
self.error_report_text_edit.setObjectName(u'progresserrorReportTextEdit')
self.error_report_text_edit.setHidden(True)
self.error_report_text_edit.setReadOnly(True)
self.progress_layout.addWidget(self.error_report_text_edit)
self.error_button_layout = QtGui.QHBoxLayout()
self.error_button_layout.setObjectName(u'error_button_layout')
2012-12-29 15:25:29 +00:00
spacer = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum)
2013-03-07 08:05:43 +00:00
self.error_button_layout.addItem(spacer)
self.error_copy_to_button = QtGui.QPushButton(self.progress_page)
self.error_copy_to_button.setObjectName(u'error_copy_to_button')
self.error_copy_to_button.setHidden(True)
self.error_copy_to_button.setIcon(build_icon(u':/system/system_edit_copy.png'))
self.error_button_layout.addWidget(self.error_copy_to_button)
self.error_save_to_button = QtGui.QPushButton(self.progress_page)
self.error_save_to_button.setObjectName(u'error_save_to_button')
self.error_save_to_button.setHidden(True)
self.error_save_to_button.setIcon(build_icon(u':/general/general_save.png'))
self.error_button_layout.addWidget(self.error_save_to_button)
self.progress_layout.addLayout(self.error_button_layout)
self.addPage(self.progress_page)
2011-01-13 17:55:29 +00:00
def exec_(self):
"""
Run the wizard.
"""
self.setDefaults()
return QtGui.QWizard.exec_(self)
def reject(self):
"""
Stop the wizard on cancel button, close button or ESC key.
"""
log.debug(u'Wizard cancelled by user.')
2013-03-07 08:05:43 +00:00
if self.currentPage() == self.progress_page:
2013-02-07 08:42:17 +00:00
Registry().execute(u'openlp_stop_wizard')
2011-01-18 18:53:09 +00:00
self.done(QtGui.QDialog.Rejected)
2011-01-13 17:55:29 +00:00
2013-03-07 08:05:43 +00:00
def on_current_id_changed(self, pageId):
2011-01-13 17:55:29 +00:00
"""
Perform necessary functions depending on which wizard page is active.
"""
2013-03-07 08:05:43 +00:00
if self.page(pageId) == self.progress_page:
self.pre_wizard()
2011-01-13 17:55:29 +00:00
self.performWizard()
self.postWizard()
else:
2013-03-07 08:05:43 +00:00
self.custom_cage_changed(pageId)
2013-03-07 08:05:43 +00:00
def custom_cage_changed(self, pageId):
"""
Called when changing to a page other than the progress page
"""
pass
2011-01-13 17:55:29 +00:00
2013-03-07 08:05:43 +00:00
def on_error_copy_to_button_clicked(self):
"""
2013-03-07 08:05:43 +00:00
Called when the ``on_error_copy_to_button_clicked`` has been clicked.
"""
pass
2013-03-07 08:05:43 +00:00
def on_error_save_to_button_clicked(self):
"""
2013-03-07 08:05:43 +00:00
Called when the ``on_error_save_to_button_clicked`` has been clicked.
"""
pass
2013-03-07 08:05:43 +00:00
def increment_progress_bar(self, status_text, increment=1):
2011-01-13 17:55:29 +00:00
"""
Update the wizard progress page.
``status_text``
Current status information to display.
``increment``
The value to increment the progress bar by.
"""
log.debug(u'IncrementBar %s', status_text)
2013-03-07 08:05:43 +00:00
self.progress_label.setText(status_text)
2011-01-13 17:55:29 +00:00
if increment > 0:
2013-03-07 08:05:43 +00:00
self.progress_bar.setValue(self.progress_bar.value() + increment)
2013-02-03 19:23:12 +00:00
self.application.process_events()
2011-01-13 17:55:29 +00:00
2013-03-07 08:05:43 +00:00
def pre_wizard(self):
2011-01-13 17:55:29 +00:00
"""
Prepare the UI for the import.
"""
2013-03-07 08:05:43 +00:00
self.finish_button.setVisible(False)
self.progress_bar.setMinimum(0)
self.progress_bar.setMaximum(1188)
self.progress_bar.setValue(0)
2011-01-13 17:55:29 +00:00
def postWizard(self):
"""
Clean up the UI after the import has finished.
"""
2013-03-07 08:05:43 +00:00
self.progress_bar.setValue(self.progress_bar.maximum())
self.finish_button.setVisible(True)
self.cancel_button.setVisible(False)
2013-02-03 19:23:12 +00:00
self.application.process_events()
2011-02-10 19:37:02 +00:00
2013-03-07 08:05:43 +00:00
def get_file_name(self, title, editbox, setting_name, filters=u''):
2011-02-10 19:37:02 +00:00
"""
Opens a QFileDialog and saves the filename to the given editbox.
``title``
The title of the dialog (unicode).
``editbox``
2012-05-07 10:36:39 +00:00
An editbox (QLineEdit).
2011-02-10 19:37:02 +00:00
2013-01-18 20:35:30 +00:00
``setting_name``
The place where to save the last opened directory.
2011-02-10 19:37:02 +00:00
``filters``
The file extension filters. It should contain the file description
as well as the file extension. For example::
u'OpenLP 2.0 Databases (*.sqlite)'
"""
if filters:
filters += u';;'
filters += u'%s (*)' % UiStrings().AllFiles
filename = QtGui.QFileDialog.getOpenFileName(self, title,
2013-01-18 20:35:30 +00:00
os.path.dirname(Settings().value(self.plugin.settingsSection + u'/' + setting_name)), filters)
2011-02-10 19:37:02 +00:00
if filename:
editbox.setText(filename)
2013-01-18 20:35:30 +00:00
Settings().setValue(self.plugin.settingsSection + u'/' + setting_name, filename)
2013-03-07 08:05:43 +00:00
def get_folder(self, title, editbox, setting_name):
2012-05-07 10:36:39 +00:00
"""
Opens a QFileDialog and saves the selected folder to the given editbox.
``title``
The title of the dialog (unicode).
``editbox``
An editbox (QLineEdit).
2013-01-18 20:35:30 +00:00
``setting_name``
The place where to save the last opened directory.
2012-05-07 10:36:39 +00:00
"""
folder = QtGui.QFileDialog.getExistingDirectory(self, title,
Settings().value(self.plugin.settingsSection + u'/' + setting_name), QtGui.QFileDialog.ShowDirsOnly)
2012-05-07 10:36:39 +00:00
if folder:
editbox.setText(folder)
2013-01-18 20:35:30 +00:00
Settings().setValue(self.plugin.settingsSection + u'/' + setting_name, folder)
2013-02-03 09:07:31 +00:00
2013-02-03 19:23:12 +00:00
def _get_application(self):
2013-02-03 09:07:31 +00:00
"""
Adds the openlp to the class dynamically
"""
2013-02-03 19:23:12 +00:00
if not hasattr(self, u'_application'):
self._application = Registry().get(u'application')
return self._application
2013-02-03 09:07:31 +00:00
2013-02-05 08:05:28 +00:00
application = property(_get_application)