diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 38bcd127c..bd117c6b0 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -35,7 +35,7 @@ from PyQt4 import QtCore, QtGui log = logging.getLogger(__name__) -def translate(context, text): +def translate(context, text, comment=None): """ A special shortcut method to wrap around the Qt4 translation functions. This abstracts the translation procedure so that we can change it if at a @@ -48,8 +48,8 @@ def translate(context, text): ``text`` The text to put into the translation tables for translation. """ - return QtGui.QApplication.translate( - context, text, None, QtGui.QApplication.UnicodeUTF8) + return QtCore.QCoreApplication.translate(context, text, + comment) def get_text_file_string(text_file): """ diff --git a/openlp/core/lib/eventreceiver.py b/openlp/core/lib/eventreceiver.py index 5b79fc40a..2e1cf9d39 100644 --- a/openlp/core/lib/eventreceiver.py +++ b/openlp/core/lib/eventreceiver.py @@ -115,6 +115,9 @@ class EventReceiver(QtCore.QObject): ``version_check`` Version has changed so pop up window. + ``mainDisplay_active`` + Version has changed so pop up window. + """ def __init__(self): """ diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 0ba8f8da8..675c57476 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -29,6 +29,7 @@ from serviceitemeditform import ServiceItemEditForm from screen import ScreenList from maindisplay import MainDisplay from maindisplay import VideoDisplay +from maindisplay import DisplayManager from amendthemeform import AmendThemeForm from slidecontroller import SlideController from splashscreen import SplashScreen diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 4883cd732..15fc29650 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -34,6 +34,28 @@ from openlp.core.ui import HideMode log = logging.getLogger(__name__) + +class DisplayManager(QtGui.QWidget): + """ + Wrapper class to hold the display widgets. + I will provide API's in future to access the screens allow for + extra displays to be added. + """ + def __init__(self, screens): + QtGui.QWidget.__init__(self) + self.screens = screens + self.videoDisplay = VideoDisplay(self, screens) + self.mainDisplay = MainDisplay(self, screens) + + def setup(self): + self.videoDisplay.setup() + self.mainDisplay.setup() + + def close(self): + self.videoDisplay.close() + self.mainDisplay.close() + + class DisplayWidget(QtGui.QWidget): """ Customised version of QTableWidget which can respond to keyboard @@ -42,7 +64,7 @@ class DisplayWidget(QtGui.QWidget): log.info(u'MainDisplay loaded') def __init__(self, parent=None, name=None): - QtGui.QWidget.__init__(self, parent) + QtGui.QWidget.__init__(self, None) self.parent = parent self.hotkey_map = {QtCore.Qt.Key_Return: 'servicemanager_next_item', QtCore.Qt.Key_Space: 'live_slidecontroller_next_noloop', @@ -92,11 +114,10 @@ class MainDisplay(DisplayWidget): The list of screens. """ log.debug(u'Initilisation started') - DisplayWidget.__init__(self, None) + DisplayWidget.__init__(self, parent) self.parent = parent self.setWindowTitle(u'OpenLP Display') self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.screens = screens self.display_image = QtGui.QLabel(self) self.display_image.setScaledContents(True) @@ -116,7 +137,7 @@ class MainDisplay(DisplayWidget): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'live_slide_show'), self.showDisplay) QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'media_start'), self.onMediaQueue) + QtCore.SIGNAL(u'media_start'), self.hideDisplay) def setup(self): """ @@ -184,6 +205,13 @@ class MainDisplay(DisplayWidget): self.display_image.setPixmap(self.transparent) self.display_alert.setPixmap(self.transparent) self.display_text.setPixmap(self.transparent) + self.moveToTop() + + def moveToTop(self): + log.debug(u'moveToTop') + self.setWindowFlags(QtCore.Qt.WindowStaysOnTopHint \ + | QtCore.Qt.FramelessWindowHint | QtCore.Qt.Dialog) + self.show() def showDisplay(self): log.debug(u'showDisplay') @@ -198,6 +226,7 @@ class MainDisplay(DisplayWidget): self.screen[u'size'].width(), self.screen[u'size'].height() ) self.display_image.setPixmap(QtGui.QPixmap.fromImage(frame)) + self.moveToTop() def setAlertSize(self, top, height): log.debug(u'setAlertSize') @@ -211,6 +240,7 @@ class MainDisplay(DisplayWidget): self.display_alert.setPixmap(self.transparent) else: self.display_alert.setPixmap(frame) + self.moveToTop() def frameView(self, frame, transition=False): """ @@ -266,59 +296,15 @@ class MainDisplay(DisplayWidget): elif self.display_frame: self.frameView(self.display_frame) - def onMediaQueue(self, message): - log.debug(u'Queue new media message %s' % message) - self.hideDisplay() - self.activateWindow() -class VideoWidget(QtGui.QWidget): - """ - Customised version of QTableWidget which can respond to keyboard - events. - """ - log.info(u'MainDisplay loaded') - - def __init__(self, parent=None, name=None): - QtGui.QWidget.__init__(self, None) - self.parent = parent - self.hotkey_map = {QtCore.Qt.Key_Return: 'servicemanager_next_item', - QtCore.Qt.Key_Space: 'live_slidecontroller_next_noloop', - QtCore.Qt.Key_Enter: 'live_slidecontroller_next_noloop', - QtCore.Qt.Key_0: 'servicemanager_next_item', - QtCore.Qt.Key_Backspace: 'live_slidecontroller_previous_noloop'} - - def keyPressEvent(self, event): - if type(event) == QtGui.QKeyEvent: - #here accept the event and do something - if event.key() == QtCore.Qt.Key_Up: - Receiver.send_message(u'live_slidecontroller_previous') - event.accept() - elif event.key() == QtCore.Qt.Key_Down: - Receiver.send_message(u'live_slidecontroller_next') - event.accept() - elif event.key() == QtCore.Qt.Key_PageUp: - Receiver.send_message(u'live_slidecontroller_first') - event.accept() - elif event.key() == QtCore.Qt.Key_PageDown: - Receiver.send_message(u'live_slidecontroller_last') - event.accept() - elif event.key() in self.hotkey_map: - Receiver.send_message(self.hotkey_map[event.key()]) - event.accept() - elif event.key() == QtCore.Qt.Key_Escape: - self.resetDisplay() - event.accept() - event.ignore() - else: - event.ignore() - -class VideoDisplay(VideoWidget): +class VideoDisplay(Phonon.VideoWidget): """ This is the form that is used to display videos on the projector. """ log.info(u'VideoDisplay Loaded') - def __init__(self, parent, screens): + def __init__(self, parent, screens, + aspect=Phonon.VideoWidget.AspectRatioWidget): """ The constructor for the display form. @@ -329,19 +315,15 @@ class VideoDisplay(VideoWidget): The list of screens. """ log.debug(u'VideoDisplay Initilisation started') - VideoWidget.__init__(self, parent) + Phonon.VideoWidget.__init__(self) self.setWindowTitle(u'OpenLP Video Display') self.parent = parent self.screens = screens - self.setAttribute(QtCore.Qt.WA_TranslucentBackground) - self.setWindowFlags(QtCore.Qt.FramelessWindowHint) - self.mediaObject = Phonon.MediaObject(self) - self.video = Phonon.VideoWidget() - self.video.setVisible(False) - self.audio = Phonon.AudioOutput(Phonon.VideoCategory, self.mediaObject) - Phonon.createPath(self.mediaObject, self.video) - Phonon.createPath(self.mediaObject, self.audio) - self.firstTime = True + self.mediaObject = Phonon.MediaObject() + self.setAspectRatio(aspect) + self.audioObject = Phonon.AudioOutput(Phonon.VideoCategory) + Phonon.createPath(self.mediaObject, self) + Phonon.createPath(self.mediaObject, self.audioObject) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'media_start'), self.onMediaQueue) QtCore.QObject.connect(Receiver.get_receiver(), @@ -353,6 +335,16 @@ class VideoDisplay(VideoWidget): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'update_config'), self.setup) + def keyPressEvent(self, event): + if type(event) == QtGui.QKeyEvent: + #here accept the event and do something + if event.key() == QtCore.Qt.Key_Escape: + self.onMediaStop() + event.accept() + event.ignore() + else: + event.ignore() + def setup(self): """ Sets up the screen on a particular screen. @@ -363,30 +355,30 @@ class VideoDisplay(VideoWidget): self.screen = self.screens.current #Sort out screen locations and sizes self.setGeometry(self.screen[u'size']) - self.video.setGeometry(self.screen[u'size']) + # To display or not to display? + if not self.screen[u'primary']: + self.showFullScreen() + self.primary = False + else: + self.setVisible(False) + self.primary = True def onMediaQueue(self, message): log.debug(u'VideoDisplay Queue new media message %s' % message) file = os.path.join(message[1], message[2]) - if self.firstTime: - source = self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) - self.firstTime = False - else: - self.mediaObject.enqueue(Phonon.MediaSource(file)) + source = self.mediaObject.setCurrentSource(Phonon.MediaSource(file)) self.onMediaPlay() def onMediaPlay(self): log.debug(u'VideoDisplay Play the new media, Live ') - self.firstTime = True - self.setWindowState(QtCore.Qt.WindowMinimized) - self.video.setFullScreen(True) self.mediaObject.play() self.setVisible(True) - self.lower() + self.showFullScreen() def onMediaPause(self): log.debug(u'VideoDisplay Media paused by user') self.mediaObject.pause() + self.show() def onMediaStop(self): log.debug(u'VideoDisplay Media stopped by user') @@ -395,7 +387,5 @@ class VideoDisplay(VideoWidget): def onMediaFinish(self): log.debug(u'VideoDisplay Reached end of media playlist') - self.mediaObject.stop() self.mediaObject.clearQueue() - self.video.setVisible(False) self.setVisible(False) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index c52c62fcd..aded72482 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -29,9 +29,9 @@ import time from PyQt4 import QtCore, QtGui from openlp.core.ui import AboutForm, SettingsForm, \ - ServiceManager, ThemeManager, MainDisplay, SlideController, \ - PluginForm, MediaDockManager, VideoDisplay -from openlp.core.lib import RenderManager, PluginConfig, build_icon, \ + ServiceManager, ThemeManager, SlideController, \ + PluginForm, MediaDockManager, DisplayManager +from openlp.core.lib import translate, RenderManager, PluginConfig, build_icon, \ OpenLPDockWidget, SettingsManager, PluginManager, Receiver, str_to_bool from openlp.core.utils import check_latest_version, AppLocation, LanguageManager, ConfigHelper @@ -74,7 +74,6 @@ class VersionThread(QtCore.QThread): if version != self.app_version[u'full']: Receiver.send_message(u'version_check', u'%s' % version) - class Ui_MainWindow(object): def setupUi(self, MainWindow): """ @@ -354,98 +353,98 @@ class Ui_MainWindow(object): """ Set up the translation system """ - MainWindow.mainTitle = MainWindow.trUtf8('OpenLP 2.0') - MainWindow.language = MainWindow.trUtf8('English') - MainWindow.defaultThemeText = MainWindow.trUtf8( + MainWindow.mainTitle = translate('MainWindow','OpenLP 2.0') + MainWindow.language = translate('MainWindow', 'English') + MainWindow.defaultThemeText = translate('MainWindow', 'Default Theme: ') MainWindow.setWindowTitle(MainWindow.mainTitle) - self.FileMenu.setTitle(MainWindow.trUtf8('&File')) - self.FileImportMenu.setTitle(MainWindow.trUtf8('&Import')) - self.FileExportMenu.setTitle(MainWindow.trUtf8('&Export')) - self.OptionsMenu.setTitle(MainWindow.trUtf8('&Options')) - self.OptionsViewMenu.setTitle(MainWindow.trUtf8('&View')) - self.ViewModeMenu.setTitle(MainWindow.trUtf8('M&ode')) - self.OptionsLanguageMenu.setTitle(MainWindow.trUtf8( + self.FileMenu.setTitle(translate('MainWindow', '&File')) + self.FileImportMenu.setTitle(translate('MainWindow', '&Import')) + self.FileExportMenu.setTitle(translate('MainWindow', '&Export')) + self.OptionsMenu.setTitle(translate('MainWindow', '&Options')) + self.OptionsViewMenu.setTitle(translate('MainWindow', '&View')) + self.ViewModeMenu.setTitle(translate('MainWindow', 'M&ode')) + self.OptionsLanguageMenu.setTitle(translate('MainWindow', u'&Language')) - self.ToolsMenu.setTitle(MainWindow.trUtf8('&Tools')) - self.HelpMenu.setTitle(MainWindow.trUtf8('&Help')) + self.ToolsMenu.setTitle(translate('MainWindow', '&Tools')) + self.HelpMenu.setTitle(translate('MainWindow', '&Help')) self.MediaManagerDock.setWindowTitle( - MainWindow.trUtf8('Media Manager')) + translate('MainWindow', 'Media Manager')) self.ServiceManagerDock.setWindowTitle( - MainWindow.trUtf8('Service Manager')) + translate('MainWindow', 'Service Manager')) self.ThemeManagerDock.setWindowTitle( - MainWindow.trUtf8('Theme Manager')) - self.FileNewItem.setText(MainWindow.trUtf8('&New')) - self.FileNewItem.setToolTip(MainWindow.trUtf8('New Service')) - self.FileNewItem.setStatusTip(MainWindow.trUtf8('Create a new Service')) - self.FileNewItem.setShortcut(MainWindow.trUtf8('Ctrl+N')) - self.FileOpenItem.setText(MainWindow.trUtf8('&Open')) - self.FileOpenItem.setToolTip(MainWindow.trUtf8('Open Service')) - self.FileOpenItem.setStatusTip(MainWindow.trUtf8('Open an existing service')) - self.FileOpenItem.setShortcut(MainWindow.trUtf8('Ctrl+O')) - self.FileSaveItem.setText(MainWindow.trUtf8('&Save')) - self.FileSaveItem.setToolTip(MainWindow.trUtf8('Save Service')) + translate('MainWindow', 'Theme Manager')) + self.FileNewItem.setText(translate('MainWindow', '&New')) + self.FileNewItem.setToolTip(translate('MainWindow', 'New Service')) + self.FileNewItem.setStatusTip(translate('MainWindow', 'Create a new Service')) + self.FileNewItem.setShortcut(translate('MainWindow', 'Ctrl+N')) + self.FileOpenItem.setText(translate('MainWindow', '&Open')) + self.FileOpenItem.setToolTip(translate('MainWindow', 'Open Service')) + self.FileOpenItem.setStatusTip(translate('MainWindow', 'Open an existing service')) + self.FileOpenItem.setShortcut(translate('MainWindow', 'Ctrl+O')) + self.FileSaveItem.setText(translate('MainWindow', '&Save')) + self.FileSaveItem.setToolTip(translate('MainWindow', 'Save Service')) self.FileSaveItem.setStatusTip( - MainWindow.trUtf8('Save the current service to disk')) - self.FileSaveItem.setShortcut(MainWindow.trUtf8('Ctrl+S')) - self.FileSaveAsItem.setText(MainWindow.trUtf8('Save &As...')) - self.FileSaveAsItem.setToolTip(MainWindow.trUtf8('Save Service As')) + translate('MainWindow', 'Save the current service to disk')) + self.FileSaveItem.setShortcut(translate('MainWindow', 'Ctrl+S')) + self.FileSaveAsItem.setText(translate('MainWindow', 'Save &As...')) + self.FileSaveAsItem.setToolTip(translate('MainWindow', 'Save Service As')) self.FileSaveAsItem.setStatusTip( - MainWindow.trUtf8('Save the current service under a new name')) - self.FileSaveAsItem.setShortcut(MainWindow.trUtf8('F12')) - self.FileExitItem.setText(MainWindow.trUtf8('E&xit')) - self.FileExitItem.setStatusTip(MainWindow.trUtf8('Quit OpenLP')) - self.FileExitItem.setShortcut(MainWindow.trUtf8('Alt+F4')) - self.ImportThemeItem.setText(MainWindow.trUtf8('&Theme')) - self.ImportLanguageItem.setText(MainWindow.trUtf8('&Language')) - self.ExportThemeItem.setText(MainWindow.trUtf8('&Theme')) - self.ExportLanguageItem.setText(MainWindow.trUtf8('&Language')) - self.actionLook_Feel.setText(MainWindow.trUtf8('Look && &Feel')) - self.OptionsSettingsItem.setText(MainWindow.trUtf8('&Settings')) - self.ViewMediaManagerItem.setText(MainWindow.trUtf8('&Media Manager')) - self.ViewMediaManagerItem.setToolTip(MainWindow.trUtf8('Toggle Media Manager')) + translate('MainWindow', 'Save the current service under a new name')) + self.FileSaveAsItem.setShortcut(translate('MainWindow', 'F12')) + self.FileExitItem.setText(translate('MainWindow', 'E&xit')) + self.FileExitItem.setStatusTip(translate('MainWindow', 'Quit OpenLP')) + self.FileExitItem.setShortcut(translate('MainWindow', 'Alt+F4')) + self.ImportThemeItem.setText(translate('MainWindow', '&Theme')) + self.ImportLanguageItem.setText(translate('MainWindow', '&Language')) + self.ExportThemeItem.setText(translate('MainWindow', '&Theme')) + self.ExportLanguageItem.setText(translate('MainWindow', '&Language')) + self.actionLook_Feel.setText(translate('MainWindow', 'Look && &Feel')) + self.OptionsSettingsItem.setText(translate('MainWindow', '&Settings')) + self.ViewMediaManagerItem.setText(translate('MainWindow', '&Media Manager')) + self.ViewMediaManagerItem.setToolTip(translate('MainWindow', 'Toggle Media Manager')) self.ViewMediaManagerItem.setStatusTip( - MainWindow.trUtf8('Toggle the visibility of the Media Manager')) - self.ViewMediaManagerItem.setShortcut(MainWindow.trUtf8('F8')) - self.ViewThemeManagerItem.setText(MainWindow.trUtf8('&Theme Manager')) - self.ViewThemeManagerItem.setToolTip(MainWindow.trUtf8('Toggle Theme Manager')) + translate('MainWindow', 'Toggle the visibility of the Media Manager')) + self.ViewMediaManagerItem.setShortcut(translate('MainWindow', 'F8')) + self.ViewThemeManagerItem.setText(translate('MainWindow', '&Theme Manager')) + self.ViewThemeManagerItem.setToolTip(translate('MainWindow', 'Toggle Theme Manager')) self.ViewThemeManagerItem.setStatusTip( - MainWindow.trUtf8('Toggle the visibility of the Theme Manager')) - self.ViewThemeManagerItem.setShortcut(MainWindow.trUtf8('F10')) - self.ViewServiceManagerItem.setText(MainWindow.trUtf8('&Service Manager')) + translate('MainWindow', 'Toggle the visibility of the Theme Manager')) + self.ViewThemeManagerItem.setShortcut(translate('MainWindow', 'F10')) + self.ViewServiceManagerItem.setText(translate('MainWindow', '&Service Manager')) self.ViewServiceManagerItem.setToolTip( - MainWindow.trUtf8('Toggle Service Manager')) + translate('MainWindow', 'Toggle Service Manager')) self.ViewServiceManagerItem.setStatusTip( - MainWindow.trUtf8('Toggle the visibility of the Service Manager')) - self.ViewServiceManagerItem.setShortcut(MainWindow.trUtf8('F9')) - self.action_Preview_Panel.setText(MainWindow.trUtf8('&Preview Panel')) - self.action_Preview_Panel.setToolTip(MainWindow.trUtf8('Toggle Preview Panel')) + translate('MainWindow', 'Toggle the visibility of the Service Manager')) + self.ViewServiceManagerItem.setShortcut(translate('MainWindow', 'F9')) + self.action_Preview_Panel.setText(translate('MainWindow', '&Preview Panel')) + self.action_Preview_Panel.setToolTip(translate('MainWindow', 'Toggle Preview Panel')) self.action_Preview_Panel.setStatusTip( - MainWindow.trUtf8('Toggle the visibility of the Preview Panel')) - self.action_Preview_Panel.setShortcut(MainWindow.trUtf8('F11')) - self.PluginItem.setText(MainWindow.trUtf8('&Plugin List')) - self.PluginItem.setStatusTip(MainWindow.trUtf8('List the Plugins')) - self.PluginItem.setShortcut(MainWindow.trUtf8('Alt+F7')) - self.HelpDocumentationItem.setText(MainWindow.trUtf8('&User Guide')) - self.HelpAboutItem.setText(MainWindow.trUtf8('&About')) + translate('MainWindow', 'Toggle the visibility of the Preview Panel')) + self.action_Preview_Panel.setShortcut(translate('MainWindow', 'F11')) + self.PluginItem.setText(translate('MainWindow', '&Plugin List')) + self.PluginItem.setStatusTip(translate('MainWindow', 'List the Plugins')) + self.PluginItem.setShortcut(translate('MainWindow', 'Alt+F7')) + self.HelpDocumentationItem.setText(translate('MainWindow', '&User Guide')) + self.HelpAboutItem.setText(translate('MainWindow', '&About')) self.HelpAboutItem.setStatusTip( - MainWindow.trUtf8('More information about OpenLP')) - self.HelpAboutItem.setShortcut(MainWindow.trUtf8('Ctrl+F1')) - self.HelpOnlineHelpItem.setText(MainWindow.trUtf8('&Online Help')) - self.HelpWebSiteItem.setText(MainWindow.trUtf8('&Web Site')) + translate('MainWindow', 'More information about OpenLP')) + self.HelpAboutItem.setShortcut(translate('MainWindow', 'Ctrl+F1')) + self.HelpOnlineHelpItem.setText(translate('MainWindow', '&Online Help')) + self.HelpWebSiteItem.setText(translate('MainWindow', '&Web Site')) #i18n - self.AutoLanguageItem.setText(MainWindow.trUtf8('&Auto Detect')) + self.AutoLanguageItem.setText(translate('MainWindow', '&Auto Detect')) self.AutoLanguageItem.setStatusTip( - MainWindow.trUtf8('Choose System language, if available')) + translate('MainWindow', 'Choose System language, if available')) for item in self.LanguageItem: self.LanguageItem[item].setText(self.LanguageItem[item].objectName()) self.LanguageItem[item].setStatusTip( - MainWindow.trUtf8('Set the interface language to %1').arg(self.LanguageItem[item].objectName())) - self.ToolsAddToolItem.setText(MainWindow.trUtf8('Add &Tool...')) + translate('MainWindow', 'Set the interface language to %1').arg(self.LanguageItem[item].objectName())) + self.ToolsAddToolItem.setText(translate('MainWindow', 'Add &Tool...')) self.ToolsAddToolItem.setStatusTip( - MainWindow.trUtf8('Add an application to the list of tools')) - self.action_Preview_Panel.setText(MainWindow.trUtf8('&Preview Pane')) - self.ModeLiveItem.setText(MainWindow.trUtf8('&Live')) + translate('MainWindow', 'Add an application to the list of tools')) + self.action_Preview_Panel.setText(translate('MainWindow', '&Preview Pane')) + self.ModeLiveItem.setText(translate('MainWindow', '&Live')) class MainWindow(QtGui.QMainWindow, Ui_MainWindow): @@ -465,8 +464,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.serviceNotSaved = False self.settingsmanager = SettingsManager(screens) self.generalConfig = PluginConfig(u'General') - self.videoDisplay = VideoDisplay(self, screens) - self.mainDisplay = MainDisplay(self, screens) + self.displayManager = DisplayManager(screens) self.aboutForm = AboutForm(self, applicationVersion) self.settingsForm = SettingsForm(self.screens, self, self) # Set up the path with plugins @@ -521,6 +519,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtCore.SIGNAL(u'blank_check'), self.blankCheck) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'screen_changed'), self.screenChanged) + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'status_message'), self.showStatusMessage) QtCore.QObject.connect(self.FileNewItem, QtCore.SIGNAL(u'triggered()'), self.ServiceManagerContents.onNewService) @@ -553,7 +553,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.plugin_helpers[u'service'] = self.ServiceManagerContents self.plugin_helpers[u'settings'] = self.settingsForm self.plugin_helpers[u'toolbox'] = self.mediaDockManager - self.plugin_helpers[u'maindisplay'] = self.mainDisplay + self.plugin_helpers[u'maindisplay'] = self.displayManager.mainDisplay self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers) # hook methods have to happen after find_plugins. Find plugins needs # the controllers hence the hooks have moved from setupUI() to here @@ -581,13 +581,14 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): #i18n def setAutoLanguage(self, value): - self.LanguageGroup.setEnabled(not value) + self.LanguageGroup.setDisabled(value) LanguageManager.AutoLanguage = value LanguageManager.set_language(self.LanguageGroup.checkedAction()) def versionCheck(self, version): """ Checks the version of the Application called from openlp.pyw + Triggered by delay thread. """ app_version = self.applicationVersion[u'full'] version_text = unicode(self.trUtf8('Version %s of OpenLP is now ' @@ -605,17 +606,18 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ self.showMaximized() #screen_number = self.getMonitorNumber() - self.mainDisplay.setup() - self.videoDisplay.setup() - if self.mainDisplay.isVisible(): - self.mainDisplay.setFocus() + self.displayManager.setup() + if self.displayManager.mainDisplay.isVisible(): + self.displayManager.mainDisplay.setFocus() self.activateWindow() if str_to_bool(self.generalConfig.get_config(u'auto open', False)): self.ServiceManagerContents.onLoadService(True) - self.videoDisplay.lower() - self.mainDisplay.raise_() def blankCheck(self): + """ + Check and display message if screen blank on setup. + Triggered by delay thread. + """ if str_to_bool(self.generalConfig.get_config(u'screen blank', False)) \ and str_to_bool(self.generalConfig.get_config(u'blank warning', False)): self.LiveController.onBlankDisplay(True) @@ -626,6 +628,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtGui.QMessageBox.Ok) def versionThread(self): + """ + Start an initial setup thread to delay notifications + """ vT = VersionThread(self, self.applicationVersion, self.generalConfig) vT.start() @@ -650,8 +655,13 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.settingsForm.exec_() def screenChanged(self): + """ + The screen has changed to so tell the displays to update_display + their locations + """ self.RenderManager.update_display() - self.mainDisplay.setup() + self.displayManager.setup() + self.setFocus() self.activateWindow() def closeEvent(self, event): @@ -669,20 +679,14 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): QtGui.QMessageBox.Save) if ret == QtGui.QMessageBox.Save: self.ServiceManagerContents.onSaveService() - self.mainDisplay.close() - self.videoDisplay.close() self.cleanUp() event.accept() elif ret == QtGui.QMessageBox.Discard: - self.mainDisplay.close() - self.videoDisplay.close() self.cleanUp() event.accept() else: event.ignore() else: - self.mainDisplay.close() - self.videoDisplay.close() self.cleanUp() event.accept() @@ -695,10 +699,12 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # Call the cleanup method to shutdown plugins. log.info(u'cleanup plugins') self.plugin_manager.finalise_plugins() + #Close down the displays + self.displayManager.close() def serviceChanged(self, reset=False, serviceName=None): """ - Hook to change the main window title when the service changes + Hook to change the main window title when the service chmainwindow.pyanges ``reset`` Shows if the service has been cleared or saved @@ -718,6 +724,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): title = u'%s - %s*' % (self.mainTitle, service_name) self.setWindowTitle(title) + def showStatusMessage(self, message): + self.StatusBar.showMessage(message) + def defaultThemeChanged(self, theme): self.DefaultThemeLabel.setText( u'%s %s' % (self.defaultThemeText, theme)) @@ -743,4 +752,4 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): def togglePreviewPanel(self): previewBool = self.PreviewController.Panel.isVisible() self.PreviewController.Panel.setVisible(not previewBool) - self.settingsmanager.togglePreviewPanel(not previewBool) \ No newline at end of file + self.settingsmanager.togglePreviewPanel(not previewBool) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 09122dea2..aae646f52 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -635,7 +635,7 @@ class SlideController(QtGui.QWidget): self.SlidePreview.setPixmap(QtGui.QPixmap.fromImage(frame[u'main'])) log.log(15, u'Slide Rendering took %4s' % (time.time() - before)) if self.isLive: - self.parent.mainDisplay.frameView(frame, True) + self.parent.displayManager.mainDisplay.frameView(frame, True) self.selectedRow = row def onSlideChange(self, row): diff --git a/openlp/core/utils/languagemanager.py b/openlp/core/utils/languagemanager.py index 81e885070..ff5c20b1f 100644 --- a/openlp/core/utils/languagemanager.py +++ b/openlp/core/utils/languagemanager.py @@ -29,6 +29,7 @@ from logging import FileHandler from PyQt4 import QtCore, QtGui import os from openlp.core.utils import AppLocation, ConfigHelper +from openlp.core.lib import translate log = logging.getLogger() @@ -86,9 +87,10 @@ class LanguageManager(object): language = u'%s' % qmList[actionName] log.info(u'Language file: \'%s\' written to conf file' % language) ConfigHelper.set_config(u'general', u'language', language) - QtGui.QMessageBox.information(None, - u'Language', - u'After restart new Language settings will be used.') + QtGui.QMessageBox.information(None, + translate('LanguageManager', 'Language'), + translate('LanguageManager', + 'After restart new Language settings will be used.')) @staticmethod def init_qm_list(): @@ -105,4 +107,4 @@ class LanguageManager(object): def get_qm_list(): if LanguageManager.__qmList__ == None: LanguageManager.init_qm_list() - return LanguageManager.__qmList__ \ No newline at end of file + return LanguageManager.__qmList__ diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 819e8eed6..aeba0ab41 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -27,7 +27,7 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import Plugin, build_icon, PluginStatus +from openlp.core.lib import Plugin, build_icon, PluginStatus, Receiver from openlp.plugins.alerts.lib import AlertsManager, DBManager from openlp.plugins.alerts.forms import AlertsTab, AlertForm @@ -88,6 +88,7 @@ class alertsPlugin(Plugin): def onAlertsTrigger(self): self.alertForm.loadList() self.alertForm.exec_() + Receiver.send_message(u'text_onTop') def about(self): about_text = self.trUtf8('Alerts Plugin
This plugin ' diff --git a/openlp/plugins/alerts/forms/alertdialog.py b/openlp/plugins/alerts/forms/alertdialog.py index 442cfadd2..804975ff1 100644 --- a/openlp/plugins/alerts/forms/alertdialog.py +++ b/openlp/plugins/alerts/forms/alertdialog.py @@ -1,87 +1,134 @@ # -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2010 Raoul Snyman # -# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael # -# Gorven, Scott Guerrieri, Christian Richter, Maikel Stuivenberg, Martin # -# Thompson, Jon Tibble, Carsten Tinggaard # -# --------------------------------------------------------------------------- # -# 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 # -############################################################################### +# Form implementation generated from reading ui file 'alertdialog.ui' +# +# Created: Sat Apr 17 08:07:40 2010 +# by: PyQt4 UI code generator 4.7 +# +# WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui class Ui_AlertDialog(object): - def setupUi(self, AlertForm): - AlertForm.setObjectName(u'AlertDialog') - AlertForm.resize(430, 320) + def setupUi(self, AlertDialog): + AlertDialog.setObjectName("AlertDialog") + AlertDialog.resize(567, 440) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - AlertForm.setWindowIcon(icon) - self.AlertFormLayout = QtGui.QVBoxLayout(AlertForm) + icon.addPixmap(QtGui.QPixmap(":/icon/openlp.org-icon-32.bmp"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + AlertDialog.setWindowIcon(icon) + self.AlertFormLayout = QtGui.QVBoxLayout(AlertDialog) self.AlertFormLayout.setSpacing(8) self.AlertFormLayout.setMargin(8) - self.AlertFormLayout.setObjectName(u'AlertFormLayout') - self.AlertEntryWidget = QtGui.QWidget(AlertForm) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.AlertEntryWidget.sizePolicy().hasHeightForWidth()) - self.AlertEntryWidget.setSizePolicy(sizePolicy) - self.AlertEntryWidget.setObjectName(u'AlertEntryWidget') - self.verticalLayout_2 = QtGui.QVBoxLayout(self.AlertEntryWidget) - self.verticalLayout_2.setObjectName(u'verticalLayout_2') - self.verticalLayout = QtGui.QVBoxLayout() - self.verticalLayout.setObjectName(u'verticalLayout') - self.AlertEntryLabel = QtGui.QLabel(self.AlertEntryWidget) + self.AlertFormLayout.setObjectName("AlertFormLayout") + self.AlertTextLayout = QtGui.QFormLayout() + self.AlertTextLayout.setContentsMargins(0, 0, -1, -1) + self.AlertTextLayout.setSpacing(8) + self.AlertTextLayout.setObjectName("AlertTextLayout") + self.AlertEntryLabel = QtGui.QLabel(AlertDialog) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.AlertEntryLabel.sizePolicy().hasHeightForWidth()) self.AlertEntryLabel.setSizePolicy(sizePolicy) - self.AlertEntryLabel.setObjectName(u'AlertEntryLabel') - self.verticalLayout.addWidget(self.AlertEntryLabel) - self.AlertEntryEditItem = QtGui.QLineEdit(self.AlertEntryWidget) - self.AlertEntryEditItem.setObjectName(u'AlertEntryEditItem') - self.verticalLayout.addWidget(self.AlertEntryEditItem) - self.AlertListWidget = QtGui.QListWidget(self.AlertEntryWidget) + self.AlertEntryLabel.setObjectName("AlertEntryLabel") + self.AlertTextLayout.setWidget(0, QtGui.QFormLayout.LabelRole, self.AlertEntryLabel) + self.AlertParameter = QtGui.QLabel(AlertDialog) + self.AlertParameter.setObjectName("AlertParameter") + self.AlertTextLayout.setWidget(1, QtGui.QFormLayout.LabelRole, self.AlertParameter) + self.ParameterEdit = QtGui.QLineEdit(AlertDialog) + self.ParameterEdit.setObjectName("ParameterEdit") + self.AlertTextLayout.setWidget(1, QtGui.QFormLayout.FieldRole, self.ParameterEdit) + self.AlertTextEdit = QtGui.QLineEdit(AlertDialog) + self.AlertTextEdit.setObjectName("AlertTextEdit") + self.AlertTextLayout.setWidget(0, QtGui.QFormLayout.FieldRole, self.AlertTextEdit) + self.AlertFormLayout.addLayout(self.AlertTextLayout) + self.ManagementLayout = QtGui.QHBoxLayout() + self.ManagementLayout.setSpacing(8) + self.ManagementLayout.setContentsMargins(-1, -1, -1, 0) + self.ManagementLayout.setObjectName("ManagementLayout") + self.AlertListWidget = QtGui.QListWidget(AlertDialog) self.AlertListWidget.setAlternatingRowColors(True) - self.AlertListWidget.setObjectName(u'AlertListWidget') - self.verticalLayout.addWidget(self.AlertListWidget) - self.verticalLayout_2.addLayout(self.verticalLayout) - self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName(u'horizontalLayout') - spacerItem = QtGui.QSpacerItem(181, 38, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - self.horizontalLayout.addItem(spacerItem) - self.DisplayButton = QtGui.QPushButton(self.AlertEntryWidget) - self.DisplayButton.setObjectName(u'DisplayButton') - self.horizontalLayout.addWidget(self.DisplayButton) - self.CancelButton = QtGui.QPushButton(self.AlertEntryWidget) - self.CancelButton.setObjectName(u'CancelButton') - self.horizontalLayout.addWidget(self.CancelButton) - self.verticalLayout_2.addLayout(self.horizontalLayout) - self.AlertFormLayout.addWidget(self.AlertEntryWidget) + self.AlertListWidget.setObjectName("AlertListWidget") + self.ManagementLayout.addWidget(self.AlertListWidget) + self.ManageButtonLayout = QtGui.QVBoxLayout() + self.ManageButtonLayout.setSpacing(8) + self.ManageButtonLayout.setObjectName("ManageButtonLayout") + self.NewButton = QtGui.QPushButton(AlertDialog) + icon1 = QtGui.QIcon() + icon1.addPixmap(QtGui.QPixmap(":/general/general_new.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.NewButton.setIcon(icon1) + self.NewButton.setObjectName("NewButton") + self.ManageButtonLayout.addWidget(self.NewButton) + self.SaveButton = QtGui.QPushButton(AlertDialog) + self.SaveButton.setEnabled(False) + icon2 = QtGui.QIcon() + icon2.addPixmap(QtGui.QPixmap(":/general/general_save.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.SaveButton.setIcon(icon2) + self.SaveButton.setObjectName("SaveButton") + self.ManageButtonLayout.addWidget(self.SaveButton) + self.EditButton = QtGui.QPushButton(AlertDialog) + icon3 = QtGui.QIcon() + icon3.addPixmap(QtGui.QPixmap(":/general/general_edit.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.EditButton.setIcon(icon3) + self.EditButton.setObjectName("EditButton") + self.ManageButtonLayout.addWidget(self.EditButton) + self.DeleteButton = QtGui.QPushButton(AlertDialog) + icon4 = QtGui.QIcon() + icon4.addPixmap(QtGui.QPixmap(":/general/general_delete.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.DeleteButton.setIcon(icon4) + self.DeleteButton.setObjectName("DeleteButton") + self.ManageButtonLayout.addWidget(self.DeleteButton) + spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + self.ManageButtonLayout.addItem(spacerItem) + self.ManagementLayout.addLayout(self.ManageButtonLayout) + self.AlertFormLayout.addLayout(self.ManagementLayout) + self.AlertButtonLayout = QtGui.QHBoxLayout() + self.AlertButtonLayout.setSpacing(8) + self.AlertButtonLayout.setObjectName("AlertButtonLayout") + spacerItem1 = QtGui.QSpacerItem(181, 0, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.AlertButtonLayout.addItem(spacerItem1) + self.DisplayButton = QtGui.QPushButton(AlertDialog) + icon5 = QtGui.QIcon() + icon5.addPixmap(QtGui.QPixmap(":/general/general_live.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.DisplayButton.setIcon(icon5) + self.DisplayButton.setObjectName("DisplayButton") + self.AlertButtonLayout.addWidget(self.DisplayButton) + self.DisplayCloseButton = QtGui.QPushButton(AlertDialog) + self.DisplayCloseButton.setIcon(icon5) + self.DisplayCloseButton.setObjectName("DisplayCloseButton") + self.AlertButtonLayout.addWidget(self.DisplayCloseButton) + self.CloseButton = QtGui.QPushButton(AlertDialog) + icon6 = QtGui.QIcon() + icon6.addPixmap(QtGui.QPixmap(":/system/system_close.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off) + self.CloseButton.setIcon(icon6) + self.CloseButton.setObjectName("CloseButton") + self.AlertButtonLayout.addWidget(self.CloseButton) + self.AlertFormLayout.addLayout(self.AlertButtonLayout) + self.AlertEntryLabel.setBuddy(self.AlertTextEdit) + self.AlertParameter.setBuddy(self.ParameterEdit) - self.retranslateUi(AlertForm) - QtCore.QObject.connect(self.CancelButton, QtCore.SIGNAL(u'clicked()'), self.close) - QtCore.QMetaObject.connectSlotsByName(AlertForm) + self.retranslateUi(AlertDialog) + QtCore.QObject.connect(self.CloseButton, QtCore.SIGNAL("clicked()"), AlertDialog.close) + QtCore.QMetaObject.connectSlotsByName(AlertDialog) + AlertDialog.setTabOrder(self.AlertTextEdit, self.ParameterEdit) + AlertDialog.setTabOrder(self.ParameterEdit, self.AlertListWidget) + AlertDialog.setTabOrder(self.AlertListWidget, self.NewButton) + AlertDialog.setTabOrder(self.NewButton, self.SaveButton) + AlertDialog.setTabOrder(self.SaveButton, self.EditButton) + AlertDialog.setTabOrder(self.EditButton, self.DeleteButton) + AlertDialog.setTabOrder(self.DeleteButton, self.DisplayButton) + AlertDialog.setTabOrder(self.DisplayButton, self.DisplayCloseButton) + AlertDialog.setTabOrder(self.DisplayCloseButton, self.CloseButton) + + def retranslateUi(self, AlertDialog): + AlertDialog.setWindowTitle(QtGui.QApplication.translate("AlertDialog", "Alert Message", None, QtGui.QApplication.UnicodeUTF8)) + self.AlertEntryLabel.setText(QtGui.QApplication.translate("AlertDialog", "Alert &text:", None, QtGui.QApplication.UnicodeUTF8)) + self.AlertParameter.setText(QtGui.QApplication.translate("AlertDialog", "&Parameter(s):", None, QtGui.QApplication.UnicodeUTF8)) + self.NewButton.setText(QtGui.QApplication.translate("AlertDialog", "&New", None, QtGui.QApplication.UnicodeUTF8)) + self.SaveButton.setText(QtGui.QApplication.translate("AlertDialog", "&Save", None, QtGui.QApplication.UnicodeUTF8)) + self.EditButton.setText(QtGui.QApplication.translate("AlertDialog", "&Edit", None, QtGui.QApplication.UnicodeUTF8)) + self.DeleteButton.setText(QtGui.QApplication.translate("AlertDialog", "&Delete", None, QtGui.QApplication.UnicodeUTF8)) + self.DisplayButton.setText(QtGui.QApplication.translate("AlertDialog", "Displ&ay", None, QtGui.QApplication.UnicodeUTF8)) + self.DisplayCloseButton.setText(QtGui.QApplication.translate("AlertDialog", "Display && Cl&ose", None, QtGui.QApplication.UnicodeUTF8)) + self.CloseButton.setText(QtGui.QApplication.translate("AlertDialog", "&Close", None, QtGui.QApplication.UnicodeUTF8)) - def retranslateUi(self, AlertForm): - AlertForm.setWindowTitle(self.trUtf8('Alert Message')) - self.AlertEntryLabel.setText(self.trUtf8('Alert Text:')) - self.DisplayButton.setText(self.trUtf8('Display')) - self.CancelButton.setText(self.trUtf8('Cancel')) diff --git a/openlp/plugins/alerts/forms/alertform.py b/openlp/plugins/alerts/forms/alertform.py index 0d21cf4b9..08e5f5e02 100644 --- a/openlp/plugins/alerts/forms/alertform.py +++ b/openlp/plugins/alerts/forms/alertform.py @@ -45,9 +45,24 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): QtCore.QObject.connect(self.DisplayButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayClicked) - QtCore.QObject.connect(self.AlertEntryEditItem, + QtCore.QObject.connect(self.DisplayCloseButton, + QtCore.SIGNAL(u'clicked()'), + self.onDisplayCloseClicked) + QtCore.QObject.connect(self.AlertTextEdit, QtCore.SIGNAL(u'textChanged(const QString&)'), self.onTextChanged) + QtCore.QObject.connect(self.NewButton, + QtCore.SIGNAL(u'clicked()'), + self.onNewClick) + QtCore.QObject.connect(self.DeleteButton, + QtCore.SIGNAL(u'clicked()'), + self.onDeleteClick) + QtCore.QObject.connect(self.EditButton, + QtCore.SIGNAL(u'clicked()'), + self.onEditClick) + QtCore.QObject.connect(self.SaveButton, + QtCore.SIGNAL(u'clicked()'), + self.onSaveClick) QtCore.QObject.connect(self.AlertListWidget, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onDoubleClick) @@ -60,19 +75,64 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): alerts = self.manager.get_all_alerts() for alert in alerts: item_name = QtGui.QListWidgetItem(alert.text) + item_name.setData( + QtCore.Qt.UserRole, QtCore.QVariant(alert.id)) self.AlertListWidget.addItem(item_name) + self.SaveButton.setEnabled(False) + self.EditButton.setEnabled(False) + self.DeleteButton.setEnabled(False) def onDisplayClicked(self): - self.triggerAlert(unicode(self.AlertEntryEditItem.text())) - if self.parent.alertsTab.save_history and self.history_required: + if self.triggerAlert(unicode(self.AlertTextEdit.text())): + self.history_required = False + self.loadList() + + def onDisplayCloseClicked(self): + if self.triggerAlert(unicode(self.AlertTextEdit.text())): + self.close() + + def onDeleteClick(self): + item = self.AlertListWidget.currentItem() + if item: + item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] + self.parent.manager.delete_alert(item_id) + row = self.AlertListWidget.row(item) + self.AlertListWidget.takeItem(row) + self.AlertTextEdit.setText(u'') + self.SaveButton.setEnabled(False) + self.DeleteButton.setEnabled(False) + self.EditButton.setEnabled(False) + + def onEditClick(self): + item = self.AlertListWidget.currentItem() + if item: + self.item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] + self.AlertTextEdit.setText(unicode(item.text())) + self.SaveButton.setEnabled(True) + self.DeleteButton.setEnabled(True) + self.EditButton.setEnabled(False) + + def onNewClick(self): + if len(self.AlertTextEdit.text()) == 0: + QtGui.QMessageBox.information(self, + self.trUtf8('Item selected to Add'), + self.trUtf8('Missing data')) + else: alert = AlertItem() - alert.text = unicode(self.AlertEntryEditItem.text()) + alert.text = unicode(self.AlertTextEdit.text()) self.manager.save_alert(alert) - self.history_required = False + self.onClearClick() + self.loadList() + + def onSaveClick(self): + alert = self.manager.get_alert(self.item_id) + alert.text = unicode(self.AlertTextEdit.text()) + self.manager.save_alert(alert) + self.onClearClick() self.loadList() def onTextChanged(self): - #Data has changed by editing it so potential storage + #Data has changed by editing it so potential storage required self.history_required = True def onDoubleClick(self): @@ -93,8 +153,17 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog): items = self.AlertListWidget.selectedIndexes() for item in items: bitem = self.AlertListWidget.item(item.row()) - self.AlertEntryEditItem.setText(bitem.text()) + self.AlertTextEdit.setText(bitem.text()) self.history_required = False + self.EditButton.setEnabled(True) + self.DeleteButton.setEnabled(True) def triggerAlert(self, text): - self.parent.alertsmanager.displayAlert(text) + if text: + self.parent.alertsmanager.displayAlert(text) + if self.parent.alertsTab.save_history and self.history_required: + alert = AlertItem() + alert.text = unicode(self.AlertTextEdit.text()) + self.manager.save_alert(alert) + return True + return False diff --git a/openlp/plugins/alerts/forms/alertstab.py b/openlp/plugins/alerts/forms/alertstab.py index 33c574de5..d15865a6d 100644 --- a/openlp/plugins/alerts/forms/alertstab.py +++ b/openlp/plugins/alerts/forms/alertstab.py @@ -188,43 +188,6 @@ class AlertsTab(SettingsTab): self.SlideRightSpacer = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) self.SlideRightLayout.addItem(self.SlideRightSpacer) - self.layoutWidget = QtGui.QWidget(self) - self.layoutWidget.setGeometry(QtCore.QRect(20, 10, 361, 251)) - self.layoutWidget.setObjectName(u'layoutWidget') - self.verticalLayout_2 = QtGui.QVBoxLayout(self.layoutWidget) - self.verticalLayout_2.setObjectName(u'verticalLayout_2') - self.horizontalLayout_2 = QtGui.QHBoxLayout() - self.horizontalLayout_2.setObjectName(u'horizontalLayout_2') - self.AlertLineEdit = QtGui.QLineEdit(self.layoutWidget) - self.AlertLineEdit.setObjectName(u'AlertLineEdit') - self.horizontalLayout_2.addWidget(self.AlertLineEdit) - self.verticalLayout_2.addLayout(self.horizontalLayout_2) - self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName(u'horizontalLayout') - self.AlertListWidget = QtGui.QListWidget(self.layoutWidget) - self.AlertListWidget.setAlternatingRowColors(True) - self.AlertListWidget.setObjectName(u'AlertListWidget') - self.horizontalLayout.addWidget(self.AlertListWidget) - self.verticalLayout = QtGui.QVBoxLayout() - self.verticalLayout.setObjectName(u'verticalLayout') - self.SaveButton = QtGui.QPushButton(self.layoutWidget) - self.SaveButton.setObjectName(u'SaveButton') - self.verticalLayout.addWidget(self.SaveButton) - self.ClearButton = QtGui.QPushButton(self.layoutWidget) - self.ClearButton.setObjectName(u'ClearButton') - self.verticalLayout.addWidget(self.ClearButton) - self.AddButton = QtGui.QPushButton(self.layoutWidget) - self.AddButton.setObjectName(u'AddButton') - self.verticalLayout.addWidget(self.AddButton) - self.EditButton = QtGui.QPushButton(self.layoutWidget) - self.EditButton.setObjectName(u'EditButton') - self.verticalLayout.addWidget(self.EditButton) - self.DeleteButton = QtGui.QPushButton(self.layoutWidget) - self.DeleteButton.setObjectName(u'DeleteButton') - self.verticalLayout.addWidget(self.DeleteButton) - self.horizontalLayout.addLayout(self.verticalLayout) - self.verticalLayout_2.addLayout(self.horizontalLayout) - self.SlideRightLayout.addWidget(self.layoutWidget) self.AlertsLayout.addWidget(self.AlertRightColumn) # Signals and slots QtCore.QObject.connect(self.HistoryCheckBox, @@ -242,27 +205,6 @@ class AlertsTab(SettingsTab): QtCore.SIGNAL(u'valueChanged(int)'), self.onTimeoutSpinBoxChanged) QtCore.QObject.connect(self.FontSizeSpinBox, QtCore.SIGNAL(u'valueChanged(int)'), self.onFontSizeSpinBoxChanged) - QtCore.QObject.connect(self.DeleteButton, - QtCore.SIGNAL(u'clicked()'), - self.onDeleteClick) - QtCore.QObject.connect(self.ClearButton, - QtCore.SIGNAL(u'clicked()'), - self.onClearClick) - QtCore.QObject.connect(self.EditButton, - QtCore.SIGNAL(u'clicked()'), - self.onEditClick) - QtCore.QObject.connect(self.AddButton, - QtCore.SIGNAL(u'clicked()'), - self.onAddClick) - QtCore.QObject.connect(self.SaveButton, - QtCore.SIGNAL(u'clicked()'), - self.onSaveClick) - QtCore.QObject.connect(self.AlertListWidget, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), - self.onItemSelected) - QtCore.QObject.connect(self.AlertListWidget, - QtCore.SIGNAL(u'clicked(QModelIndex)'), - self.onItemSelected) def retranslateUi(self): self.FontGroupBox.setTitle(self.trUtf8('Font')) @@ -279,11 +221,6 @@ class AlertsTab(SettingsTab): self.FontPreview.setText(self.trUtf8('openlp.org')) self.LocationComboBox.setItemText(0, self.trUtf8('Top')) self.LocationComboBox.setItemText(1, self.trUtf8('Bottom')) - self.SaveButton.setText(self.trUtf8('Save')) - self.ClearButton.setText(self.trUtf8('Clear')) - self.AddButton.setText(self.trUtf8('Add')) - self.EditButton.setText(self.trUtf8('Edit')) - self.DeleteButton.setText(self.trUtf8('Delete')) def onBackgroundColorButtonClicked(self): self.bg_color = QtGui.QColorDialog.getColor( @@ -342,76 +279,11 @@ class AlertsTab(SettingsTab): font.setFamily(self.font_face) self.FontComboBox.setCurrentFont(font) self.updateDisplay() - self.loadList() - - def loadList(self): - self.AlertListWidget.clear() - alerts = self.manager.get_all_alerts() - for alert in alerts: - item_name = QtGui.QListWidgetItem(alert.text) - item_name.setData( - QtCore.Qt.UserRole, QtCore.QVariant(alert.id)) - self.AlertListWidget.addItem(item_name) - self.AddButton.setEnabled(True) - self.ClearButton.setEnabled(False) - self.SaveButton.setEnabled(False) - self.EditButton.setEnabled(False) - self.DeleteButton.setEnabled(False) def onItemSelected(self): self.EditButton.setEnabled(True) self.DeleteButton.setEnabled(True) - def onDeleteClick(self): - item = self.AlertListWidget.currentItem() - if item: - item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.parent.manager.delete_alert(item_id) - row = self.AlertListWidget.row(item) - self.AlertListWidget.takeItem(row) - self.AddButton.setEnabled(True) - self.SaveButton.setEnabled(False) - self.DeleteButton.setEnabled(False) - self.EditButton.setEnabled(False) - - def onEditClick(self): - item = self.AlertListWidget.currentItem() - if item: - self.item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] - self.AlertLineEdit.setText(unicode(item.text())) - self.AddButton.setEnabled(True) - self.ClearButton.setEnabled(True) - self.SaveButton.setEnabled(True) - self.DeleteButton.setEnabled(True) - self.EditButton.setEnabled(False) - - def onClearClick(self): - self.AlertLineEdit.setText(u'') - self.AddButton.setEnabled(False) - self.ClearButton.setEnabled(True) - self.SaveButton.setEnabled(False) - self.DeleteButton.setEnabled(False) - self.EditButton.setEnabled(False) - - def onAddClick(self): - if len(self.AlertLineEdit.text()) == 0: - QtGui.QMessageBox.information(self, - self.trUtf8('Item selected to Add'), - self.trUtf8('Missing data')) - else: - alert = AlertItem() - alert.text = unicode(self.AlertLineEdit.text()) - self.manager.save_alert(alert) - self.onClearClick() - self.loadList() - - def onSaveClick(self): - alert = self.manager.get_alert(self.item_id) - alert.text = unicode(self.AlertLineEdit.text()) - self.manager.save_alert(alert) - self.onClearClick() - self.loadList() - def save(self): self.font_face = self.FontComboBox.currentFont().family() self.config.set_config(u'background color', unicode(self.bg_color)) diff --git a/openlp/plugins/alerts/lib/alertsmanager.py b/openlp/plugins/alerts/lib/alertsmanager.py index 69a6d6f53..2243b5bef 100644 --- a/openlp/plugins/alerts/lib/alertsmanager.py +++ b/openlp/plugins/alerts/lib/alertsmanager.py @@ -65,9 +65,12 @@ class AlertsManager(QtCore.QObject): if self.alertTab.location == 0: self.alertScreenPosition = 0 else: - self.alertScreenPosition = self.screen[u'size'].height() - self.alertHeight - self.alertHeight = self.screen[u'size'].height() - self.alertScreenPosition - self.parent.maindisplay.setAlertSize(self.alertScreenPosition, self.alertHeight) + self.alertScreenPosition = self.screen[u'size'].height() \ + - self.alertHeight + self.alertHeight = self.screen[u'size'].height() \ + - self.alertScreenPosition + self.parent.maindisplay.setAlertSize(self.alertScreenPosition,\ + self.alertHeight) def displayAlert(self, text=u''): """ @@ -79,12 +82,12 @@ class AlertsManager(QtCore.QObject): log.debug(u'display alert called %s' % text) if not self.screen: self.screenChanged() - self.parent.maindisplay.parent.StatusBar.showMessage(u'') self.alertList.append(text) if self.timer_id != 0: - self.parent.maindisplay.parent.StatusBar.showMessage(\ - self.trUtf8(u'Alert message created and delayed')) + Receiver.send_message(u'status_message', + self.trUtf8(u'Alert message created and delayed')) return + Receiver.send_message(u'status_message', u'') self.generateAlert() def generateAlert(self): @@ -116,6 +119,7 @@ class AlertsManager(QtCore.QObject): self.timer_id = self.startTimer(int(alertTab.timeout) * 1000) def timerEvent(self, event): + log.debug(u'timer event') if event.timerId() == self.timer_id: self.parent.maindisplay.addAlertImage(None, True) self.killTimer(self.timer_id) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 7b4367a72..92717b6d7 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -155,6 +155,10 @@ class ImpressController(PresentationController): desktop = self.get_uno_desktop() else: desktop = self.get_com_desktop() + #Sometimes we get a failure and desktop is None + if not desktop: + log.exception(u'Failed to terminate OpenOffice') + return docs = desktop.getComponents() if docs.hasElements(): log.debug(u'OpenOffice not terminated') diff --git a/openlp/plugins/songs/forms/editsongdialog.py b/openlp/plugins/songs/forms/editsongdialog.py index 87f7d3601..b992aeea4 100644 --- a/openlp/plugins/songs/forms/editsongdialog.py +++ b/openlp/plugins/songs/forms/editsongdialog.py @@ -135,7 +135,7 @@ class Ui_EditSongDialog(object): sizePolicy.setHeightForWidth( self.AuthorsSelectionComboItem.sizePolicy().hasHeightForWidth()) self.AuthorsSelectionComboItem.setSizePolicy(sizePolicy) - self.AuthorsSelectionComboItem.setEditable(False) + self.AuthorsSelectionComboItem.setEditable(True) self.AuthorsSelectionComboItem.setInsertPolicy( QtGui.QComboBox.InsertAlphabetically) self.AuthorsSelectionComboItem.setSizeAdjustPolicy( @@ -212,6 +212,7 @@ class Ui_EditSongDialog(object): sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.SongTopicCombo.sizePolicy().hasHeightForWidth()) + self.SongTopicCombo.setEditable(True) self.SongTopicCombo.setSizePolicy(sizePolicy) self.SongTopicCombo.setObjectName(u'SongTopicCombo') self.TopicAddLayout.addWidget(self.SongTopicCombo) @@ -256,6 +257,7 @@ class Ui_EditSongDialog(object): sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.SongbookCombo.sizePolicy().hasHeightForWidth()) + self.SongbookCombo.setEditable(True) self.SongbookCombo.setSizePolicy(sizePolicy) self.SongbookCombo.setObjectName(u'SongbookCombo') self.SongbookLayout.addWidget(self.SongbookCombo, 0, 0, 1, 1) @@ -293,6 +295,7 @@ class Ui_EditSongDialog(object): self.ThemeLayout.setMargin(8) self.ThemeLayout.setObjectName(u'ThemeLayout') self.ThemeSelectionComboItem = QtGui.QComboBox(self.ThemeGroupBox) + self.ThemeSelectionComboItem.setEditable(True) self.ThemeSelectionComboItem.setObjectName(u'ThemeSelectionComboItem') self.ThemeLayout.addWidget(self.ThemeSelectionComboItem) self.ThemeAddButton = QtGui.QPushButton(self.ThemeGroupBox) diff --git a/openlp/plugins/songs/forms/editsongform.py b/openlp/plugins/songs/forms/editsongform.py index b2b1b14c4..2c03d13f6 100644 --- a/openlp/plugins/songs/forms/editsongform.py +++ b/openlp/plugins/songs/forms/editsongform.py @@ -122,6 +122,11 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): def loadAuthors(self): authors = self.songmanager.get_authors() + authorsCompleter = QtGui.QCompleter( + [author.display_name for author in authors], + self.AuthorsSelectionComboItem) + authorsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); + self.AuthorsSelectionComboItem.setCompleter(authorsCompleter); self.AuthorsSelectionComboItem.clear() for author in authors: row = self.AuthorsSelectionComboItem.count() @@ -131,6 +136,11 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): def loadTopics(self): topics = self.songmanager.get_topics() + topicsCompleter = QtGui.QCompleter( + [topic.name for topic in topics], + self.SongTopicCombo) + topicsCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); + self.SongTopicCombo.setCompleter(topicsCompleter); self.SongTopicCombo.clear() for topic in topics: row = self.SongTopicCombo.count() @@ -139,6 +149,11 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): def loadBooks(self): books = self.songmanager.get_books() + booksCompleter = QtGui.QCompleter( + [book.name for book in books], + self.SongbookCombo) + booksCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); + self.SongbookCombo.setCompleter(booksCompleter); self.SongbookCombo.clear() self.SongbookCombo.addItem(u' ') for book in books: @@ -147,6 +162,11 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog): self.SongbookCombo.setItemData(row, QtCore.QVariant(book.id)) def loadThemes(self, theme_list): + themesCompleter = QtGui.QCompleter( + [theme for theme in theme_list], + self.ThemeSelectionComboItem) + themesCompleter.setCaseSensitivity(QtCore.Qt.CaseInsensitive); + self.ThemeSelectionComboItem.setCompleter(themesCompleter); self.ThemeSelectionComboItem.clear() self.ThemeSelectionComboItem.addItem(u' ') for theme in theme_list: diff --git a/resources/forms/alertdialog.ui b/resources/forms/alertdialog.ui index da56f3847..fd4cee5fc 100644 --- a/resources/forms/alertdialog.ui +++ b/resources/forms/alertdialog.ui @@ -1,13 +1,13 @@ - AlertForm - + AlertDialog + 0 0 - 430 - 320 + 567 + 440 @@ -25,85 +25,212 @@ 8 - - - - 0 - 0 - + + + 8 - - - - - - - - 0 - 0 - - - - Alert Text: - - - - - - - - - - true - - - - - - - - - - - Qt::Horizontal - - - - 181 - 38 - - - - - - - - Display - - - - - - - Cancel - - - - - - - + + 8 + + + 0 + + + 0 + + + + + + 0 + 0 + + + + Alert &text: + + + AlertTextEdit + + + + + + + &Parameter(s): + + + ParameterEdit + + + + + + + + + + + + + + + 8 + + + 0 + + + + + true + + + + + + + 8 + + + + + &New + + + + :/general/general_new.png:/general/general_new.png + + + + + + + false + + + &Save + + + + :/general/general_save.png:/general/general_save.png + + + + + + + &Edit + + + + :/general/general_edit.png:/general/general_edit.png + + + + + + + &Delete + + + + :/general/general_delete.png:/general/general_delete.png + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + 8 + + + + + Qt::Horizontal + + + + 181 + 0 + + + + + + + + Displ&ay + + + + :/general/general_live.png:/general/general_live.png + + + + + + + Display && Cl&ose + + + + :/general/general_live.png:/general/general_live.png + + + + + + + &Close + + + + :/system/system_close.png:/system/system_close.png + + + + + + AlertTextEdit + ParameterEdit + AlertListWidget + NewButton + SaveButton + EditButton + DeleteButton + DisplayButton + DisplayCloseButton + CloseButton + - + - CancelButton + CloseButton clicked() - AlertForm + AlertDialog close() diff --git a/resources/forms/alerteditdialog.ui b/resources/forms/alerteditdialog.ui deleted file mode 100644 index 352e3d7b1..000000000 --- a/resources/forms/alerteditdialog.ui +++ /dev/null @@ -1,101 +0,0 @@ - - - AlertEditDialog - - - - 0 - 0 - 400 - 300 - - - - Maintain Alerts - - - - - 220 - 270 - 173 - 27 - - - - QDialogButtonBox::Cancel - - - - - - 20 - 10 - 361 - 251 - - - - - - - - - - - - - - - - true - - - - - - - - - Save - - - - - - - Clear - - - - - - - Add - - - - - - - Edit - - - - - - - Delete - - - - - - - - - - - - -