openlp-core team mailing list archive
-
openlp-core team
-
Mailing list archive
-
Message #11537
[Merge] lp:~mzibricky/openlp/testing into lp:openlp
matysek has proposed merging lp:~mzibricky/openlp/testing into lp:openlp.
Requested reviews:
Tim Bentley (trb143)
For more details, see:
https://code.launchpad.net/~mzibricky/openlp/testing/+merge/73026
Necessary changes for automated gui tests to work.
I removed unused code and fixed the issue displaying language dialog every startup.
Fixed the error msg "file will not open error cos corrupt".
--
https://code.launchpad.net/~mzibricky/openlp/testing/+merge/73026
Your team OpenLP Core is subscribed to branch lp:openlp.
=== modified file 'openlp.pyw'
--- openlp.pyw 2011-07-30 16:00:11 +0000
+++ openlp.pyw 2011-08-26 11:10:24 +0000
@@ -25,254 +25,15 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
-import os
-import sys
-import logging
+
# Import uuid now, to avoid the rare bug described in the support system:
# http://support.openlp.org/issues/102
# If https://bugs.gentoo.org/show_bug.cgi?id=317557 is fixed, the import can be
# removed.
import uuid
-from optparse import OptionParser
-from traceback import format_exception
-
-from PyQt4 import QtCore, QtGui
-
-from openlp.core.lib import Receiver, check_directory_exists
-from openlp.core.lib.ui import UiStrings
-from openlp.core.resources import qInitResources
-from openlp.core.ui.mainwindow import MainWindow
-from openlp.core.ui.firsttimelanguageform import FirstTimeLanguageForm
-from openlp.core.ui.firsttimeform import FirstTimeForm
-from openlp.core.ui.exceptionform import ExceptionForm
-from openlp.core.ui import SplashScreen, ScreenList
-from openlp.core.utils import AppLocation, LanguageManager, VersionThread, \
- get_application_version, DelayStartThread
-
-log = logging.getLogger()
-
-application_stylesheet = u"""
-QMainWindow::separator
-{
- border: none;
-}
-
-QDockWidget::title
-{
- border: 1px solid palette(dark);
- padding-left: 5px;
- padding-top: 2px;
- margin: 1px 0;
-}
-
-QToolBar
-{
- border: none;
- margin: 0;
- padding: 0;
-}
-"""
-
-class OpenLP(QtGui.QApplication):
- """
- The core application class. This class inherits from Qt's QApplication
- class in order to provide the core of the application.
- """
-
- args = []
-
- def exec_(self):
- """
- Override exec method to allow the shared memory to be released on exit
- """
- QtGui.QApplication.exec_()
- self.sharedMemory.detach()
-
- def run(self, args):
- """
- Run the OpenLP application.
- """
- # 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)
- # provide a listener for widgets to reqest a screen update.
- QtCore.QObject.connect(Receiver.get_receiver(),
- QtCore.SIGNAL(u'openlp_process_events'), self.processEvents)
- QtCore.QObject.connect(Receiver.get_receiver(),
- QtCore.SIGNAL(u'cursor_busy'), self.setBusyCursor)
- 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())
- # First time checks in settings
- has_run_wizard = QtCore.QSettings().value(
- u'general/has run wizard', QtCore.QVariant(False)).toBool()
- if not has_run_wizard:
- if FirstTimeForm(screens).exec_() == QtGui.QDialog.Accepted:
- QtCore.QSettings().setValue(u'general/has run wizard',
- QtCore.QVariant(True))
- if os.name == u'nt':
- self.setStyleSheet(application_stylesheet)
- show_splash = QtCore.QSettings().value(
- u'general/show splash', QtCore.QVariant(True)).toBool()
- if show_splash:
- self.splash = SplashScreen()
- self.splash.show()
- # make sure Qt really display the splash screen
- self.processEvents()
- # start the main app window
- self.mainWindow = MainWindow(self.clipboard(), self.args)
- self.mainWindow.show()
- if show_splash:
- # now kill the splashscreen
- self.splash.finish(self.mainWindow)
- log.debug(u'Splashscreen closed')
- # make sure Qt really display the splash screen
- self.processEvents()
- self.mainWindow.repaint()
- self.processEvents()
- if not has_run_wizard:
- self.mainWindow.firstTime()
- update_check = QtCore.QSettings().value(
- u'general/update check', QtCore.QVariant(True)).toBool()
- if update_check:
- VersionThread(self.mainWindow).start()
- Receiver.send_message(u'maindisplay_blank_check')
- self.mainWindow.appStartup()
- DelayStartThread(self.mainWindow).start()
- return self.exec_()
-
- def isAlreadyRunning(self):
- """
- Look to see if OpenLP is already running and ask if a 2nd copy
- is to be started.
- """
- self.sharedMemory = QtCore.QSharedMemory('OpenLP')
- if self.sharedMemory.attach():
- status = QtGui.QMessageBox.critical(None,
- UiStrings().Error, UiStrings().OpenLPStart,
- QtGui.QMessageBox.StandardButtons(
- QtGui.QMessageBox.Yes | QtGui.QMessageBox.No))
- if status == QtGui.QMessageBox.No:
- return True
- return False
- else:
- self.sharedMemory.create(1)
- return False
-
- def hookException(self, exctype, value, traceback):
- if not hasattr(self, u'mainWindow'):
- log.exception(''.join(format_exception(exctype, value, traceback)))
- return
- if not hasattr(self, u'exceptionForm'):
- self.exceptionForm = ExceptionForm(self.mainWindow)
- self.exceptionForm.exceptionTextEdit.setPlainText(
- ''.join(format_exception(exctype, value, traceback)))
- self.setNormalCursor()
- self.exceptionForm.exec_()
-
- def setBusyCursor(self):
- """
- Sets the Busy Cursor for the Application
- """
- self.setOverrideCursor(QtCore.Qt.BusyCursor)
- self.processEvents()
-
- def setNormalCursor(self):
- """
- Sets the Normal Cursor for the Application
- """
- self.restoreOverrideCursor()
-
- def event(self, event):
- """
- Enables direct file opening on OS X
- """
- if event.type() == QtCore.QEvent.FileOpen:
- file_name = event.file()
- log.debug(u'Got open file event for %s!', file_name)
- self.args.insert(0, unicode(file_name))
- return True
- else:
- return QtGui.QApplication.event(self, event)
-
-def main():
- """
- The main function which parses command line options and then runs
- the PyQt4 Application.
- """
- # Set up command line options.
- usage = 'Usage: %prog [options] [qt-options]'
- parser = OptionParser(usage=usage)
- parser.add_option('-e', '--no-error-form', dest='no_error_form',
- action='store_true', help='Disable the error notification form.')
- parser.add_option('-l', '--log-level', dest='loglevel',
- default='warning', metavar='LEVEL', help='Set logging to LEVEL '
- 'level. Valid values are "debug", "info", "warning".')
- parser.add_option('-p', '--portable', dest='portable',
- action='store_true', help='Specify if this should be run as a '
- 'portable app, off a USB flash drive (not implemented).')
- parser.add_option('-d', '--dev-version', dest='dev_version',
- action='store_true', help='Ignore the version file and pull the '
- 'version directly from Bazaar')
- parser.add_option('-s', '--style', dest='style',
- help='Set the Qt4 style (passed directly to Qt4).')
- # Set up logging
- log_path = AppLocation.get_directory(AppLocation.CacheDir)
- check_directory_exists(log_path)
- filename = os.path.join(log_path, u'openlp.log')
- logfile = logging.FileHandler(filename, u'w')
- logfile.setFormatter(logging.Formatter(
- u'%(asctime)s %(name)-55s %(levelname)-8s %(message)s'))
- log.addHandler(logfile)
- logging.addLevelName(15, u'Timer')
- # Parse command line options and deal with them.
- (options, args) = parser.parse_args()
- qt_args = []
- if options.loglevel.lower() in ['d', 'debug']:
- log.setLevel(logging.DEBUG)
- print 'Logging to:', filename
- elif options.loglevel.lower() in ['w', 'warning']:
- log.setLevel(logging.WARNING)
- else:
- log.setLevel(logging.INFO)
- if options.style:
- qt_args.extend(['-style', options.style])
- # Throw the rest of the arguments at Qt, just in case.
- qt_args.extend(args)
- # Initialise the resources
- qInitResources()
- # Now create and actually run the application.
- app = OpenLP(qt_args)
- # Instance check
- if app.isAlreadyRunning():
- sys.exit()
- app.setOrganizationName(u'OpenLP')
- app.setOrganizationDomain(u'openlp.org')
- app.setApplicationName(u'OpenLP')
- app.setApplicationVersion(get_application_version()[u'version'])
- # First time checks in settings
- if not QtCore.QSettings().value(u'general/has run wizard',
- QtCore.QVariant(False)).toBool():
- if not FirstTimeLanguageForm().exec_():
- # if cancel then stop processing
- sys.exit()
- if sys.platform == u'darwin':
- OpenLP.addLibraryPath(QtGui.QApplication.applicationDirPath()
- + "/qt4_plugins")
- # i18n Set Language
- language = LanguageManager.get_language()
- app_translator, default_translator = \
- LanguageManager.get_translator(language)
- if not app_translator.isEmpty():
- app.installTranslator(app_translator)
- if not default_translator.isEmpty():
- app.installTranslator(default_translator)
- else:
- log.debug(u'Could not find default_translator.')
- if not options.no_error_form:
- sys.excepthook = app.hookException
- sys.exit(app.run(qt_args))
+
+from openlp.core import main
+
if __name__ == u'__main__':
"""
=== modified file 'openlp/core/__init__.py'
--- openlp/core/__init__.py 2011-06-12 16:02:52 +0000
+++ openlp/core/__init__.py 2011-08-26 11:10:24 +0000
@@ -24,9 +24,265 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
+
+__all__ = ('OpenLP', 'main')
+
+import os
+import sys
+import logging
+from optparse import OptionParser
+from traceback import format_exception
+
+from PyQt4 import QtCore, QtGui
+
+from openlp.core.lib import Receiver, check_directory_exists
+from openlp.core.lib.ui import UiStrings
+from openlp.core.resources import qInitResources
+from openlp.core.ui.mainwindow import MainWindow
+from openlp.core.ui.firsttimelanguageform import FirstTimeLanguageForm
+from openlp.core.ui.firsttimeform import FirstTimeForm
+from openlp.core.ui.exceptionform import ExceptionForm
+from openlp.core.ui import SplashScreen, ScreenList
+from openlp.core.utils import AppLocation, LanguageManager, VersionThread, \
+ get_application_version, DelayStartThread
+
+log = logging.getLogger()
+
+
"""
The :mod:`core` module provides all core application functions
All the core functions of the OpenLP application including the GUI, settings,
logging and a plugin framework are contained within the openlp.core module.
"""
+
+application_stylesheet = u"""
+QMainWindow::separator
+{
+ border: none;
+}
+
+QDockWidget::title
+{
+ border: 1px solid palette(dark);
+ padding-left: 5px;
+ padding-top: 2px;
+ margin: 1px 0;
+}
+
+QToolBar
+{
+ border: none;
+ margin: 0;
+ padding: 0;
+}
+"""
+
+
+class OpenLP(QtGui.QApplication):
+ """
+ The core application class. This class inherits from Qt's QApplication
+ class in order to provide the core of the application.
+ """
+
+ args = []
+
+ def exec_(self):
+ """
+ Override exec method to allow the shared memory to be released on exit
+ """
+ QtGui.QApplication.exec_()
+ self.sharedMemory.detach()
+
+ def run(self, args, testing=False):
+ """
+ Run the OpenLP application.
+ """
+ # 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)
+ # provide a listener for widgets to reqest a screen update.
+ QtCore.QObject.connect(Receiver.get_receiver(),
+ QtCore.SIGNAL(u'openlp_process_events'), self.processEvents)
+ QtCore.QObject.connect(Receiver.get_receiver(),
+ QtCore.SIGNAL(u'cursor_busy'), self.setBusyCursor)
+ 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())
+ # First time checks in settings
+ has_run_wizard = QtCore.QSettings().value(
+ u'general/has run wizard', QtCore.QVariant(False)).toBool()
+ if not has_run_wizard:
+ if FirstTimeForm(screens).exec_() == QtGui.QDialog.Accepted:
+ QtCore.QSettings().setValue(u'general/has run wizard',
+ QtCore.QVariant(True))
+ if os.name == u'nt':
+ self.setStyleSheet(application_stylesheet)
+ show_splash = QtCore.QSettings().value(
+ u'general/show splash', QtCore.QVariant(True)).toBool()
+ if show_splash:
+ self.splash = SplashScreen()
+ self.splash.show()
+ # make sure Qt really display the splash screen
+ self.processEvents()
+ # start the main app window
+ self.mainWindow = MainWindow(self.clipboard(), self.args)
+ self.mainWindow.show()
+ if show_splash:
+ # now kill the splashscreen
+ self.splash.finish(self.mainWindow)
+ log.debug(u'Splashscreen closed')
+ # make sure Qt really display the splash screen
+ self.processEvents()
+ self.mainWindow.repaint()
+ self.processEvents()
+ if not has_run_wizard:
+ self.mainWindow.firstTime()
+ update_check = QtCore.QSettings().value(
+ u'general/update check', QtCore.QVariant(True)).toBool()
+ if update_check:
+ VersionThread(self.mainWindow).start()
+ Receiver.send_message(u'maindisplay_blank_check')
+ self.mainWindow.appStartup()
+ DelayStartThread(self.mainWindow).start()
+ # Skip exec_() for gui tests
+ if not testing:
+ return self.exec_()
+
+ def isAlreadyRunning(self):
+ """
+ Look to see if OpenLP is already running and ask if a 2nd copy
+ is to be started.
+ """
+ self.sharedMemory = QtCore.QSharedMemory('OpenLP')
+ if self.sharedMemory.attach():
+ status = QtGui.QMessageBox.critical(None,
+ UiStrings().Error, UiStrings().OpenLPStart,
+ QtGui.QMessageBox.StandardButtons(
+ QtGui.QMessageBox.Yes | QtGui.QMessageBox.No))
+ if status == QtGui.QMessageBox.No:
+ return True
+ return False
+ else:
+ self.sharedMemory.create(1)
+ return False
+
+ def hookException(self, exctype, value, traceback):
+ if not hasattr(self, u'mainWindow'):
+ log.exception(''.join(format_exception(exctype, value, traceback)))
+ return
+ if not hasattr(self, u'exceptionForm'):
+ self.exceptionForm = ExceptionForm(self.mainWindow)
+ self.exceptionForm.exceptionTextEdit.setPlainText(
+ ''.join(format_exception(exctype, value, traceback)))
+ self.setNormalCursor()
+ self.exceptionForm.exec_()
+
+ def setBusyCursor(self):
+ """
+ Sets the Busy Cursor for the Application
+ """
+ self.setOverrideCursor(QtCore.Qt.BusyCursor)
+ self.processEvents()
+
+ def setNormalCursor(self):
+ """
+ Sets the Normal Cursor for the Application
+ """
+ self.restoreOverrideCursor()
+
+ def event(self, event):
+ """
+ Enables direct file opening on OS X
+ """
+ if event.type() == QtCore.QEvent.FileOpen:
+ file_name = event.file()
+ log.debug(u'Got open file event for %s!', file_name)
+ self.args.insert(0, unicode(file_name))
+ return True
+ else:
+ return QtGui.QApplication.event(self, event)
+
+
+def main(args=None):
+ """
+ The main function which parses command line options and then runs
+ the PyQt4 Application.
+ """
+ # Set up command line options.
+ usage = 'Usage: %prog [options] [qt-options]'
+ parser = OptionParser(usage=usage)
+ parser.add_option('-e', '--no-error-form', dest='no_error_form',
+ action='store_true', help='Disable the error notification form.')
+ parser.add_option('-l', '--log-level', dest='loglevel',
+ default='warning', metavar='LEVEL', help='Set logging to LEVEL '
+ 'level. Valid values are "debug", "info", "warning".')
+ parser.add_option('-p', '--portable', dest='portable',
+ action='store_true', help='Specify if this should be run as a '
+ 'portable app, off a USB flash drive (not implemented).')
+ parser.add_option('-d', '--dev-version', dest='dev_version',
+ action='store_true', help='Ignore the version file and pull the '
+ 'version directly from Bazaar')
+ parser.add_option('-s', '--style', dest='style',
+ help='Set the Qt4 style (passed directly to Qt4).')
+ parser.add_option('--testing', dest='testing',
+ action='store_true', help='Run by testing framework')
+ # Set up logging
+ log_path = AppLocation.get_directory(AppLocation.CacheDir)
+ check_directory_exists(log_path)
+ filename = os.path.join(log_path, u'openlp.log')
+ logfile = logging.FileHandler(filename, u'w')
+ logfile.setFormatter(logging.Formatter(
+ u'%(asctime)s %(name)-55s %(levelname)-8s %(message)s'))
+ log.addHandler(logfile)
+ logging.addLevelName(15, u'Timer')
+ # Parse command line options and deal with them.
+ # Use args supplied programatically if possible.
+ (options, args) = parser.parse_args(args) if args else parser.parse_args()
+ qt_args = []
+ if options.loglevel.lower() in ['d', 'debug']:
+ log.setLevel(logging.DEBUG)
+ print 'Logging to:', filename
+ elif options.loglevel.lower() in ['w', 'warning']:
+ log.setLevel(logging.WARNING)
+ else:
+ log.setLevel(logging.INFO)
+ if options.style:
+ qt_args.extend(['-style', options.style])
+ # Throw the rest of the arguments at Qt, just in case.
+ qt_args.extend(args)
+ # Initialise the resources
+ qInitResources()
+ # Now create and actually run the application.
+ app = OpenLP(qt_args)
+ app.setOrganizationName(u'OpenLP')
+ app.setOrganizationDomain(u'openlp.org')
+ app.setApplicationName(u'OpenLP')
+ app.setApplicationVersion(get_application_version()[u'version'])
+ # Instance check
+ if app.isAlreadyRunning():
+ sys.exit()
+ # First time checks in settings
+ if not QtCore.QSettings().value(u'general/has run wizard',
+ QtCore.QVariant(False)).toBool():
+ if not FirstTimeLanguageForm().exec_():
+ # if cancel then stop processing
+ sys.exit()
+ # i18n Set Language
+ language = LanguageManager.get_language()
+ app_translator, default_translator = \
+ LanguageManager.get_translator(language)
+ if not app_translator.isEmpty():
+ app.installTranslator(app_translator)
+ if not default_translator.isEmpty():
+ app.installTranslator(default_translator)
+ else:
+ log.debug(u'Could not find default_translator.')
+ if not options.no_error_form:
+ sys.excepthook = app.hookException
+ # Do not run method app.exec_() when running gui tests
+ if options.testing:
+ app.run(qt_args, testing=True)
+ else:
+ sys.exit(app.run(qt_args))
Follow ups