diff --git a/openlp.pyw b/openlp.pyw index d7e43ede0..be5185c34 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -71,7 +71,7 @@ class OpenLP(QtGui.QApplication): self.mainWindow = MainWindow(screens) self.mainWindow.show() # now kill the splashscreen - self.splash.finish(self.mainWindow.mainWindow) + self.splash.finish(self.mainWindow) sys.exit(app.exec_()) if __name__ == u'__main__': diff --git a/openlp/core/lib/event.py b/openlp/core/lib/event.py index dcb84ffbb..bb857d4fe 100644 --- a/openlp/core/lib/event.py +++ b/openlp/core/lib/event.py @@ -28,6 +28,7 @@ class EventType(object): # "Default" event - a non-event Default = 0 # General application events + Ready = 10 # Service events LoadServiceItem = 20 # Preview events @@ -43,6 +44,7 @@ class Event(object): """ Provides an Event class to encapsulate events within openlp.org. """ - def __init__(self, event_type=EventType.Default, payload=None): + def __init__(self, event_type=EventType.Default, payload=None, sender=None): self.event_type = event_type self.payload = payload + self.sender = sender diff --git a/openlp/core/lib/eventmanager.py b/openlp/core/lib/eventmanager.py index 3b84a8d10..c5f768729 100644 --- a/openlp/core/lib/eventmanager.py +++ b/openlp/core/lib/eventmanager.py @@ -25,10 +25,10 @@ import logging class EventManager(object): """ - A mechanism to send events to all registered endpoints - the endpoints are registered and listen with a handle_event method - the endpoint will decide whether to do somthing with the event or ignore it - + A mechanism to send events to all registered endpoints. The + endpoints are registered and listen with a handle_event method. + The endpoint will decide whether to do somthing with the event or + ignore it. """ global log log = logging.getLogger(u'EventManager') diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index d033282fa..a192a6062 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -60,10 +60,6 @@ class MainDisplay(QtGui.QWidget): Sets up the screen on a particular screen. @param (integer) screen This is the screen number. """ - # Temporary fix until I can speak to Tim Bentley. - if screenNumber not in self.screens: - screenNumber = 0 - # /Temporary fix screen = self.screens[screenNumber] if screen[u'number'] != screenNumber: # We will most probably never actually hit this bit, but just in @@ -79,20 +75,23 @@ class MainDisplay(QtGui.QWidget): else: self.showMinimized() #Build a custom splash screen - self.InitialFrame = QtGui.QImage(screen[u'size'].width(), - screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied) + self.InitialFrame = QtGui.QImage( + screen[u'size'].width(), screen[u'size'].height(), + QtGui.QImage.Format_ARGB32_Premultiplied) splash_image = QtGui.QImage(u':/graphics/openlp-splash-screen.png') painter_image = QtGui.QPainter() painter_image.begin(self.InitialFrame) painter_image.fillRect(self.InitialFrame.rect(), QtCore.Qt.white) - painter_image.drawImage((screen[u'size'].width() - splash_image.width()) / 2, - (screen[u'size'].height() - splash_image.height()) / 2, - splash_image) + painter_image.drawImage( + (screen[u'size'].width() - splash_image.width()) / 2, + (screen[u'size'].height() - splash_image.height()) / 2, + splash_image) self.frameView(self.InitialFrame) #Build a Black screen painter = QtGui.QPainter() - self.blankFrame = QtGui.QImage(screen[u'size'].width(), - screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied) + self.blankFrame = QtGui.QImage( + screen[u'size'].width(), screen[u'size'].height(), + QtGui.QImage.Format_ARGB32_Premultiplied) painter.begin(self.blankFrame) painter.fillRect(self.blankFrame.rect(), QtCore.Qt.black) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 7bf3ae243..d63dfd494 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -22,178 +22,32 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.ui import AboutForm, SettingsForm, AlertForm, ServiceManager, \ - ThemeManager, MainDisplay, SlideController -from openlp.core.lib import translate, Plugin, MediaManagerItem, SettingsTab, \ - EventManager, RenderManager, PluginConfig, SettingsManager, PluginManager +from openlp.core.ui import AboutForm, SettingsForm, AlertForm, \ + ServiceManager, ThemeManager, MainDisplay, SlideController +from openlp.core.lib import translate, Plugin, MediaManagerItem, \ + SettingsTab, EventManager, RenderManager, PluginConfig, \ + SettingsManager, PluginManager, EventType -class MainWindow(object): - """ - The main window. - """ - global log - log = logging.getLogger(u'MainWindow') - log.info(u'MainWindow loaded') - - def __init__(self, screens): - """ - This constructor sets up the interface, the various managers, and the - plugins. - """ - self.oosNotSaved = False - self.settingsmanager = SettingsManager(screens) - self.mainWindow = QtGui.QMainWindow() - self.mainWindow.__class__.closeEvent = self.onCloseEvent - self.mainDisplay = MainDisplay(None, screens) - self.screenList = screens - self.EventManager = EventManager() - self.generalConfig = PluginConfig(u'General') - self.alertForm = AlertForm(self) - self.aboutForm = AboutForm() - self.settingsForm = SettingsForm(self.screenList, self) - # Set up the path with plugins - pluginpath = os.path.split(os.path.abspath(__file__))[0] - pluginpath = os.path.abspath( - os.path.join(pluginpath, u'..', u'..', u'plugins')) - self.plugin_manager = PluginManager(pluginpath) - self.plugin_helpers = {} - # Set up the interface - self.setupUi() - #warning cyclic dependency - #RenderManager needs to call ThemeManager and - #ThemeManager needs to call RenderManager - self.RenderManager = RenderManager(self.ThemeManagerContents, - self.screenList, int(self.generalConfig.get_config(u'Monitor', 0))) - log.info(u'Load Plugins') - #make the controllers available to the plugins - self.plugin_helpers[u'preview'] = self.PreviewController - self.plugin_helpers[u'live'] = self.LiveController - self.plugin_helpers[u'event'] = self.EventManager - self.plugin_helpers[u'theme'] = self.ThemeManagerContents - self.plugin_helpers[u'render'] = self.RenderManager - self.plugin_helpers[u'service'] = self.ServiceManagerContents - self.plugin_helpers[u'settings'] = self.settingsForm - self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers, - self.EventManager) - # hook methods have to happen after find_plugins. Find plugins needs the - # controllers hence the hooks have moved from setupUI() to here - - # Find and insert settings tabs - log.info(u'hook settings') - self.plugin_manager.hook_settings_tabs(self.settingsForm) - # Find and insert media manager items - log.info(u'hook media') - self.plugin_manager.hook_media_manager(self.MediaToolBox) - # Call the hook method to pull in import menus. - log.info(u'hook menus') - self.plugin_manager.hook_import_menu(self.FileImportMenu) - # Call the hook method to pull in export menus. - self.plugin_manager.hook_export_menu(self.FileExportMenu) - # Call the initialise method to setup plugins. - log.info(u'initialise plugins') - self.plugin_manager.initialise_plugins() - # Once all components are initialised load the Themes - log.info(u'Load Themes') - self.ThemeManagerContents.loadThemes() - - def show(self): - """ - Show the main form, as well as the display form - """ - self.mainWindow.showMaximized() - self.mainDisplay.setup(self.settingsForm.GeneralTab.MonitorNumber) - - def onHelpAboutItemClicked(self): - """ - Show the About form - """ - self.aboutForm.exec_() - - def onToolsAlertItemClicked(self): - """ - Show the Alert form - """ - self.alertForm.exec_() - - def onOptionsSettingsItemClicked(self): - """ - Show the Settings dialog - """ - self.settingsForm.exec_() - screen_number = int(self.generalConfig.get_config(u'Monitor', 0)) - self.RenderManager.update_display(screen_number) - self.mainDisplay.setup(screen_number) - - def onCloseEvent(self, event): - """ - Hook to close the main window and display windows on exit - """ - if self.oosNotSaved == True: - ret = QtGui.QMessageBox.question(None, - translate(u'mainWindow', u'Save Changes to Service?'), - translate(u'mainWindow', u'Your service has been changed, do you want to save those changes?'), - QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Save), - QtGui.QMessageBox.Save) - if ret == QtGui.QMessageBox.Save: - self.ServiceManagerContents.onSaveService() - self.mainDisplay.close() - self.cleanUp() - event.accept() - elif ret == QtGui.QMessageBox.Discard: - self.mainDisplay.close() - self.cleanUp() - event.accept() - else: - event.ignore() - else: - self.mainDisplay.close() - self.cleanUp() - event.accept() - - def cleanUp(self): - # Call the cleanup method to shutdown plugins. - log.info(u'cleanup plugins') - self.plugin_manager.initialise_plugins() - - def OosChanged(self, reset = False, oosName = None): - """ - Hook to change the title if the OOS has been changed - reset - tells if the OOS has been cleared or saved - oosName - is the name of the OOS (if it has one) - """ - if reset == True: - self.oosNotSaved = False - if oosName is None: - title = self.mainTitle - else: - title = self.mainTitle + u' - (' + oosName + u')' - else: - self.oosNotSaved = True - if oosName is None: - title = self.mainTitle + u' - *' - else: - title = self.mainTitle + u' - *(' + oosName + u')' - self.mainWindow.setWindowTitle(title) - - def setupUi(self): +class Ui_MainWindow(object): + def setupUi(self, MainWindow): """ Set up the user interface """ - self.mainWindow.setObjectName(u'mainWindow') - self.mainWindow.resize(self.settingsmanager.width, self.settingsmanager.height) + MainWindow.setObjectName(u'MainWindow') + MainWindow.resize(self.settingsmanager.width, self.settingsmanager.height) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( - self.mainWindow.sizePolicy().hasHeightForWidth()) - self.mainWindow.setSizePolicy(sizePolicy) + MainWindow.sizePolicy().hasHeightForWidth()) + MainWindow.setSizePolicy(sizePolicy) main_icon = QtGui.QIcon() main_icon.addPixmap(QtGui.QPixmap(u':/icon/openlp-logo-16x16.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) - self.mainWindow.setWindowIcon(main_icon) + MainWindow.setWindowIcon(main_icon) # Set up the main container, which contains all the other form widgets - self.MainContent = QtGui.QWidget(self.mainWindow) + self.MainContent = QtGui.QWidget(MainWindow) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) @@ -206,7 +60,7 @@ class MainWindow(object): self.MainContentLayout.setSpacing(0) self.MainContentLayout.setMargin(0) self.MainContentLayout.setObjectName(u'MainContentLayout') - self.mainWindow.setCentralWidget(self.MainContent) + MainWindow.setCentralWidget(self.MainContent) self.ControlSplitter = QtGui.QSplitter(self.MainContent) self.ControlSplitter.setOrientation(QtCore.Qt.Horizontal) self.ControlSplitter.setObjectName(u'ControlSplitter') @@ -215,7 +69,7 @@ class MainWindow(object): self.PreviewController = SlideController(self) self.LiveController = SlideController(self, True) # Create menu - self.MenuBar = QtGui.QMenuBar(self.mainWindow) + self.MenuBar = QtGui.QMenuBar(MainWindow) self.MenuBar.setGeometry(QtCore.QRect(0, 0, 1087, 27)) self.MenuBar.setObjectName(u'MenuBar') self.FileMenu = QtGui.QMenu(self.MenuBar) @@ -236,12 +90,15 @@ class MainWindow(object): self.ToolsMenu.setObjectName(u'ToolsMenu') self.HelpMenu = QtGui.QMenu(self.MenuBar) self.HelpMenu.setObjectName(u'HelpMenu') - self.mainWindow.setMenuBar(self.MenuBar) - self.StatusBar = QtGui.QStatusBar(self.mainWindow) + MainWindow.setMenuBar(self.MenuBar) + self.StatusBar = QtGui.QStatusBar(MainWindow) self.StatusBar.setObjectName(u'StatusBar') - self.mainWindow.setStatusBar(self.StatusBar) + MainWindow.setStatusBar(self.StatusBar) + self.DefaultThemeLabel = QtGui.QLabel(self.StatusBar) + self.DefaultThemeLabel.setObjectName(u'DefaultThemeLabel') + self.StatusBar.addPermanentWidget(self.DefaultThemeLabel) # Create the MediaManager - self.MediaManagerDock = QtGui.QDockWidget(self.mainWindow) + self.MediaManagerDock = QtGui.QDockWidget(MainWindow) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/system/system_mediamanager.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -258,10 +115,10 @@ class MainWindow(object): self.MediaToolBox.setObjectName(u'MediaToolBox') self.MediaManagerLayout.addWidget(self.MediaToolBox) self.MediaManagerDock.setWidget(self.MediaManagerContents) - self.mainWindow.addDockWidget( + MainWindow.addDockWidget( QtCore.Qt.DockWidgetArea(1), self.MediaManagerDock) # Create the service manager - self.ServiceManagerDock = QtGui.QDockWidget(self.mainWindow) + self.ServiceManagerDock = QtGui.QDockWidget(MainWindow) ServiceManagerIcon = QtGui.QIcon() ServiceManagerIcon.addPixmap( QtGui.QPixmap(u':/system/system_servicemanager.png'), @@ -273,10 +130,10 @@ class MainWindow(object): self.ServiceManagerDock.setMinimumWidth(300) self.ServiceManagerContents = ServiceManager(self) self.ServiceManagerDock.setWidget(self.ServiceManagerContents) - self.mainWindow.addDockWidget( + MainWindow.addDockWidget( QtCore.Qt.DockWidgetArea(2), self.ServiceManagerDock) # Create the theme manager - self.ThemeManagerDock = QtGui.QDockWidget(self.mainWindow) + self.ThemeManagerDock = QtGui.QDockWidget(MainWindow) ThemeManagerIcon = QtGui.QIcon() ThemeManagerIcon.addPixmap( QtGui.QPixmap(u':/system/system_thememanager.png'), @@ -286,97 +143,97 @@ class MainWindow(object): self.ThemeManagerDock.setObjectName(u'ThemeManagerDock') self.ThemeManagerContents = ThemeManager(self) self.ThemeManagerDock.setWidget(self.ThemeManagerContents) - self.mainWindow.addDockWidget( + MainWindow.addDockWidget( QtCore.Qt.DockWidgetArea(2), self.ThemeManagerDock) # Create the menu items - self.FileNewItem = QtGui.QAction(self.mainWindow) + self.FileNewItem = QtGui.QAction(MainWindow) self.FileNewItem.setIcon( self.ServiceManagerContents.Toolbar.getIconFromTitle(u'New Service')) self.FileNewItem.setObjectName(u'FileNewItem') - self.FileOpenItem = QtGui.QAction(self.mainWindow) + self.FileOpenItem = QtGui.QAction(MainWindow) self.FileOpenItem.setIcon( self.ServiceManagerContents.Toolbar.getIconFromTitle(u'Open Service')) self.FileOpenItem.setObjectName(u'FileOpenItem') - self.FileSaveItem = QtGui.QAction(self.mainWindow) + self.FileSaveItem = QtGui.QAction(MainWindow) self.FileSaveItem.setIcon( self.ServiceManagerContents.Toolbar.getIconFromTitle(u'Save Service')) self.FileSaveItem.setObjectName(u'FileSaveItem') - self.FileSaveAsItem = QtGui.QAction(self.mainWindow) + self.FileSaveAsItem = QtGui.QAction(MainWindow) self.FileSaveAsItem.setObjectName(u'FileSaveAsItem') - self.FileExitItem = QtGui.QAction(self.mainWindow) + self.FileExitItem = QtGui.QAction(MainWindow) ExitIcon = QtGui.QIcon() ExitIcon.addPixmap(QtGui.QPixmap(u':/system/system_exit.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.FileExitItem.setIcon(ExitIcon) self.FileExitItem.setObjectName(u'FileExitItem') - self.ImportThemeItem = QtGui.QAction(self.mainWindow) + self.ImportThemeItem = QtGui.QAction(MainWindow) self.ImportThemeItem.setObjectName(u'ImportThemeItem') - self.ImportLanguageItem = QtGui.QAction(self.mainWindow) + self.ImportLanguageItem = QtGui.QAction(MainWindow) self.ImportLanguageItem.setObjectName(u'ImportLanguageItem') - self.ExportThemeItem = QtGui.QAction(self.mainWindow) + self.ExportThemeItem = QtGui.QAction(MainWindow) self.ExportThemeItem.setObjectName(u'ExportThemeItem') - self.ExportLanguageItem = QtGui.QAction(self.mainWindow) + self.ExportLanguageItem = QtGui.QAction(MainWindow) self.ExportLanguageItem.setObjectName(u'ExportLanguageItem') - self.actionLook_Feel = QtGui.QAction(self.mainWindow) + self.actionLook_Feel = QtGui.QAction(MainWindow) self.actionLook_Feel.setObjectName(u'actionLook_Feel') - self.OptionsSettingsItem = QtGui.QAction(self.mainWindow) + self.OptionsSettingsItem = QtGui.QAction(MainWindow) SettingsIcon = QtGui.QIcon() SettingsIcon.addPixmap(QtGui.QPixmap(u':/system/system_settings.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.OptionsSettingsItem.setIcon(SettingsIcon) self.OptionsSettingsItem.setObjectName(u'OptionsSettingsItem') - self.ViewMediaManagerItem = QtGui.QAction(self.mainWindow) + self.ViewMediaManagerItem = QtGui.QAction(MainWindow) self.ViewMediaManagerItem.setCheckable(True) self.ViewMediaManagerItem.setChecked(True) self.ViewMediaManagerItem.setIcon(icon) self.ViewMediaManagerItem.setObjectName(u'ViewMediaManagerItem') - self.ViewThemeManagerItem = QtGui.QAction(self.mainWindow) + self.ViewThemeManagerItem = QtGui.QAction(MainWindow) self.ViewThemeManagerItem.setCheckable(True) self.ViewThemeManagerItem.setChecked(True) self.ViewThemeManagerItem.setIcon(ThemeManagerIcon) self.ViewThemeManagerItem.setObjectName(u'ViewThemeManagerItem') - self.ViewServiceManagerItem = QtGui.QAction(self.mainWindow) + self.ViewServiceManagerItem = QtGui.QAction(MainWindow) self.ViewServiceManagerItem.setCheckable(True) self.ViewServiceManagerItem.setChecked(True) self.ViewServiceManagerItem.setIcon(ServiceManagerIcon) self.ViewServiceManagerItem.setObjectName(u'ViewServiceManagerItem') - self.ToolsAlertItem = QtGui.QAction(self.mainWindow) + self.ToolsAlertItem = QtGui.QAction(MainWindow) AlertIcon = QtGui.QIcon() AlertIcon.addPixmap(QtGui.QPixmap(u':/tools/tools_alert.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.ToolsAlertItem.setIcon(AlertIcon) self.ToolsAlertItem.setObjectName(u'ToolsAlertItem') - self.HelpDocumentationItem = QtGui.QAction(self.mainWindow) + self.HelpDocumentationItem = QtGui.QAction(MainWindow) ContentsIcon = QtGui.QIcon() ContentsIcon.addPixmap(QtGui.QPixmap(u':/system/system_help_contents.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.HelpDocumentationItem.setIcon(ContentsIcon) self.HelpDocumentationItem.setObjectName(u'HelpDocumentationItem') - self.HelpAboutItem = QtGui.QAction(self.mainWindow) + self.HelpAboutItem = QtGui.QAction(MainWindow) AboutIcon = QtGui.QIcon() AboutIcon.addPixmap(QtGui.QPixmap(u':/system/system_about.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.HelpAboutItem.setIcon(AboutIcon) self.HelpAboutItem.setObjectName(u'HelpAboutItem') - self.HelpOnlineHelpItem = QtGui.QAction(self.mainWindow) + self.HelpOnlineHelpItem = QtGui.QAction(MainWindow) self.HelpOnlineHelpItem.setObjectName(u'HelpOnlineHelpItem') - self.HelpWebSiteItem = QtGui.QAction(self.mainWindow) + self.HelpWebSiteItem = QtGui.QAction(MainWindow) self.HelpWebSiteItem.setObjectName(u'HelpWebSiteItem') - self.LanguageTranslateItem = QtGui.QAction(self.mainWindow) + self.LanguageTranslateItem = QtGui.QAction(MainWindow) self.LanguageTranslateItem.setObjectName(u'LanguageTranslateItem') - self.LanguageEnglishItem = QtGui.QAction(self.mainWindow) + self.LanguageEnglishItem = QtGui.QAction(MainWindow) self.LanguageEnglishItem.setObjectName(u'LanguageEnglishItem') - self.ToolsAddToolItem = QtGui.QAction(self.mainWindow) + self.ToolsAddToolItem = QtGui.QAction(MainWindow) AddToolIcon = QtGui.QIcon() AddToolIcon.addPixmap(QtGui.QPixmap(u':/tools/tools_add.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.ToolsAddToolItem.setIcon(AddToolIcon) self.ToolsAddToolItem.setObjectName(u'ToolsAddToolItem') - self.action_Preview_Panel = QtGui.QAction(self.mainWindow) + self.action_Preview_Panel = QtGui.QAction(MainWindow) self.action_Preview_Panel.setCheckable(True) self.action_Preview_Panel.setChecked(True) self.action_Preview_Panel.setObjectName(u'action_Preview_Panel') - self.ModeLiveItem = QtGui.QAction(self.mainWindow) + self.ModeLiveItem = QtGui.QAction(MainWindow) self.ModeLiveItem.setObjectName(u'ModeLiveItem') self.FileImportMenu.addAction(self.ImportThemeItem) self.FileImportMenu.addAction(self.ImportLanguageItem) @@ -419,43 +276,20 @@ class MainWindow(object): self.MenuBar.addAction(self.ToolsMenu.menuAction()) self.MenuBar.addAction(self.HelpMenu.menuAction()) # Initialise the translation - self.retranslateUi() + self.retranslateUi(MainWindow) self.MediaToolBox.setCurrentIndex(0) # Connect up some signals and slots QtCore.QObject.connect(self.FileExitItem, - QtCore.SIGNAL(u'triggered()'), self.mainWindow.close) - QtCore.QObject.connect(self.ImportThemeItem, - QtCore.SIGNAL(u'triggered()'), self.ThemeManagerContents.onImportTheme) - QtCore.QObject.connect(self.ExportThemeItem, - QtCore.SIGNAL(u'triggered()'), self.ThemeManagerContents.onExportTheme) - QtCore.QObject.connect(self.ViewMediaManagerItem, - QtCore.SIGNAL(u'triggered(bool)'), self.MediaManagerDock.setVisible) - QtCore.QObject.connect(self.ViewServiceManagerItem, - QtCore.SIGNAL(u'triggered(bool)'), self.ServiceManagerDock.setVisible) - QtCore.QObject.connect(self.ViewThemeManagerItem, - QtCore.SIGNAL(u'triggered(bool)'), self.ThemeManagerDock.setVisible) - QtCore.QObject.connect(self.action_Preview_Panel, - QtCore.SIGNAL(u'toggled(bool)'), self.PreviewController.Panel.setVisible) - QtCore.QObject.connect(self.MediaManagerDock, - QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewMediaManagerItem.setChecked) - QtCore.QObject.connect(self.ServiceManagerDock, - QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewServiceManagerItem.setChecked) - QtCore.QObject.connect(self.ThemeManagerDock, - QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewThemeManagerItem.setChecked) - QtCore.QObject.connect(self.HelpAboutItem, - QtCore.SIGNAL(u'triggered()'), self.onHelpAboutItemClicked) - QtCore.QObject.connect(self.ToolsAlertItem, - QtCore.SIGNAL(u'triggered()'), self.onToolsAlertItemClicked) - QtCore.QObject.connect(self.OptionsSettingsItem, - QtCore.SIGNAL(u'triggered()'), self.onOptionsSettingsItemClicked) - QtCore.QMetaObject.connectSlotsByName(self.mainWindow) + QtCore.SIGNAL(u'triggered()'), MainWindow.close) + QtCore.QMetaObject.connectSlotsByName(MainWindow) - def retranslateUi(self): + def retranslateUi(self, MainWindow): """ Set up the translation system """ - self.mainTitle = translate(u'mainWindow', u'OpenLP 2.0') - self.mainWindow.setWindowTitle(self.mainTitle) + MainWindow.mainTitle = translate(u'mainWindow', u'OpenLP 2.0') + MainWindow.defaultThemeText = translate(u'mainWindow', 'Default Theme: ') + MainWindow.setWindowTitle(MainWindow.mainTitle) self.FileMenu.setTitle(translate(u'mainWindow', u'&File')) self.FileImportMenu.setTitle(translate(u'mainWindow', u'&Import')) self.FileExportMenu.setTitle(translate(u'mainWindow', u'&Export')) @@ -471,6 +305,8 @@ class MainWindow(object): translate(u'mainWindow', u'Service Manager')) self.ThemeManagerDock.setWindowTitle( translate(u'mainWindow', u'Theme Manager')) + self.DefaultThemeLabel.setText(MainWindow.defaultThemeText + \ + self.ThemeManagerContents.getDefault()) self.FileNewItem.setText(translate(u'mainWindow', u'&New')) self.FileNewItem.setToolTip(translate(u'mainWindow', u'New Service')) self.FileNewItem.setStatusTip( @@ -548,3 +384,198 @@ class MainWindow(object): self.action_Preview_Panel.setText( translate(u'mainWindow', u'&Preview Pane')) self.ModeLiveItem.setText(translate(u'mainWindow', u'&Live')) + + +class MainWindow(QtGui.QMainWindow, Ui_MainWindow): + """ + The main window. + """ + global log + log = logging.getLogger(u'MainWindow') + log.info(u'MainWindow loaded') + + def __init__(self, screens): + """ + This constructor sets up the interface, the various managers, and the + plugins. + """ + QtGui.QMainWindow.__init__(self) + self.closeEvent = self.onCloseEvent + self.screenList = screens + self.oosNotSaved = False + self.settingsmanager = SettingsManager(screens) + self.mainDisplay = MainDisplay(None, screens) + self.EventManager = EventManager() + self.generalConfig = PluginConfig(u'General') + self.alertForm = AlertForm(self) + self.aboutForm = AboutForm() + self.settingsForm = SettingsForm(self.screenList, self) + # Set up the path with plugins + pluginpath = os.path.split(os.path.abspath(__file__))[0] + pluginpath = os.path.abspath( + os.path.join(pluginpath, u'..', u'..', u'plugins')) + self.plugin_manager = PluginManager(pluginpath) + self.plugin_helpers = {} + # Set up the interface + self.setupUi(self) + # Set up signals and slots + QtCore.QObject.connect(self.ImportThemeItem, + QtCore.SIGNAL(u'triggered()'), self.ThemeManagerContents.onImportTheme) + QtCore.QObject.connect(self.ExportThemeItem, + QtCore.SIGNAL(u'triggered()'), self.ThemeManagerContents.onExportTheme) + QtCore.QObject.connect(self.ViewMediaManagerItem, + QtCore.SIGNAL(u'triggered(bool)'), self.MediaManagerDock.setVisible) + QtCore.QObject.connect(self.ViewServiceManagerItem, + QtCore.SIGNAL(u'triggered(bool)'), self.ServiceManagerDock.setVisible) + QtCore.QObject.connect(self.ViewThemeManagerItem, + QtCore.SIGNAL(u'triggered(bool)'), self.ThemeManagerDock.setVisible) + QtCore.QObject.connect(self.action_Preview_Panel, + QtCore.SIGNAL(u'toggled(bool)'), self.PreviewController.Panel.setVisible) + QtCore.QObject.connect(self.MediaManagerDock, + QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewMediaManagerItem.setChecked) + QtCore.QObject.connect(self.ServiceManagerDock, + QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewServiceManagerItem.setChecked) + QtCore.QObject.connect(self.ThemeManagerDock, + QtCore.SIGNAL(u'visibilityChanged(bool)'), self.ViewThemeManagerItem.setChecked) + QtCore.QObject.connect(self.HelpAboutItem, + QtCore.SIGNAL(u'triggered()'), self.onHelpAboutItemClicked) + QtCore.QObject.connect(self.ToolsAlertItem, + QtCore.SIGNAL(u'triggered()'), self.onToolsAlertItemClicked) + QtCore.QObject.connect(self.OptionsSettingsItem, + QtCore.SIGNAL(u'triggered()'), self.onOptionsSettingsItemClicked) + #warning cyclic dependency + #RenderManager needs to call ThemeManager and + #ThemeManager needs to call RenderManager + self.RenderManager = RenderManager(self.ThemeManagerContents, + self.screenList, self.getMonitorNumber()) + log.info(u'Load Plugins') + #make the controllers available to the plugins + self.plugin_helpers[u'preview'] = self.PreviewController + self.plugin_helpers[u'live'] = self.LiveController + self.plugin_helpers[u'event'] = self.EventManager + self.plugin_helpers[u'theme'] = self.ThemeManagerContents + self.plugin_helpers[u'render'] = self.RenderManager + self.plugin_helpers[u'service'] = self.ServiceManagerContents + self.plugin_helpers[u'settings'] = self.settingsForm + self.plugin_manager.find_plugins(pluginpath, self.plugin_helpers, + self.EventManager) + # hook methods have to happen after find_plugins. Find plugins needs the + # controllers hence the hooks have moved from setupUI() to here + + # Find and insert settings tabs + log.info(u'hook settings') + self.plugin_manager.hook_settings_tabs(self.settingsForm) + # Find and insert media manager items + log.info(u'hook media') + self.plugin_manager.hook_media_manager(self.MediaToolBox) + # Call the hook method to pull in import menus. + log.info(u'hook menus') + self.plugin_manager.hook_import_menu(self.FileImportMenu) + # Call the hook method to pull in export menus. + self.plugin_manager.hook_export_menu(self.FileExportMenu) + # Call the initialise method to setup plugins. + log.info(u'initialise plugins') + self.plugin_manager.initialise_plugins() + # Once all components are initialised load the Themes + log.info(u'Load Themes') + self.ThemeManagerContents.loadThemes() + # Register the main form as an event consumer. + self.EventManager.register(self) + + def getMonitorNumber(self): + """ + Set up the default behaviour of the monitor configuration in + here. Currently it is set to default to monitor 0 if the saved + monitor number does not exist. + """ + screen_number = int(self.generalConfig.get_config(u'Monitor', 0)) + if screen_number not in self.screenList: + screen_number = 0 + return screen_number + + def show(self): + """ + Show the main form, as well as the display form + """ + self.showMaximized() + screen_number = self.getMonitorNumber() + self.mainDisplay.setup(screen_number) + self.setFocus() + + def onHelpAboutItemClicked(self): + """ + Show the About form + """ + self.aboutForm.exec_() + + def onToolsAlertItemClicked(self): + """ + Show the Alert form + """ + self.alertForm.exec_() + + def onOptionsSettingsItemClicked(self): + """ + Show the Settings dialog + """ + self.settingsForm.exec_() + screen_number = self.getMonitorNumber() + self.RenderManager.update_display(screen_number) + self.mainDisplay.setup(screen_number) + + def onCloseEvent(self, event): + """ + Hook to close the main window and display windows on exit + """ + if self.oosNotSaved == True: + ret = QtGui.QMessageBox.question(None, + translate(u'mainWindow', u'Save Changes to Service?'), + translate(u'mainWindow', u'Your service has been changed, do you want to save those changes?'), + QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Cancel | QtGui.QMessageBox.Discard | QtGui.QMessageBox.Save), + QtGui.QMessageBox.Save) + if ret == QtGui.QMessageBox.Save: + self.ServiceManagerContents.onSaveService() + self.mainDisplay.close() + self.cleanUp() + event.accept() + elif ret == QtGui.QMessageBox.Discard: + self.mainDisplay.close() + self.cleanUp() + event.accept() + else: + event.ignore() + else: + self.mainDisplay.close() + self.cleanUp() + event.accept() + + def cleanUp(self): + # Call the cleanup method to shutdown plugins. + log.info(u'cleanup plugins') + self.plugin_manager.initialise_plugins() + + def OosChanged(self, reset=False, oosName=None): + """ + Hook to change the title if the OOS has been changed + reset - tells if the OOS has been cleared or saved + oosName - is the name of the OOS (if it has one) + """ + if not oosName: + service_name = u'(unsaved service)' + else: + service_name = oosName + if reset == True: + self.oosNotSaved = False + title = u'%s - %s' % (self.mainTitle, service_name) + else: + self.oosNotSaved = True + title = u'%s - %s*' % (self.mainTitle, service_name) + self.setWindowTitle(title) + + def handle_event(self, event): + if event.event_type == EventType.ThemeListChanged: + themes = self.ThemeManagerContents.getThemes() + self.ServiceManagerContents.updateThemeList(themes) + self.settingsForm.ThemesTab.updateThemeList(themes) + self.DefaultThemeLabel.setText(self.defaultThemeText + \ + self.ThemeManagerContents.getDefault()) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 95e959b7b..1f3c37c27 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -24,9 +24,12 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import OpenLPToolbar, translate, buildIcon class SlideList(QtGui.QTableWidget): - - def __init__(self,parent=None,name=None): - QtGui.QTableWidget.__init__(self,parent.Controller) + """ + Customised version of QTableWidget which can respond to keyboard + events. + """ + def __init__(self, parent=None, name=None): + QtGui.QTableWidget.__init__(self, parent.Controller) self.parent = parent def keyPressEvent(self, event): @@ -56,7 +59,7 @@ class SlideController(QtGui.QWidget): global log log = logging.getLogger(u'SlideController') - def __init__(self, parent, isLive=False): + def __init__(self, parent, isLive=False): """ Set up the Slide Controller. """ diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py index 413886d91..5b7e669c4 100644 --- a/openlp/core/ui/thememanager.py +++ b/openlp/core/ui/thememanager.py @@ -28,7 +28,9 @@ from PyQt4 import QtCore, QtGui from openlp.core.ui import AmendThemeForm, ServiceManager from openlp.core.theme import Theme -from openlp.core.lib import PluginConfig, Event, EventType, EventManager, OpenLPToolbar, ThemeXML, Renderer, translate, file_to_xml, buildIcon +from openlp.core.lib import PluginConfig, Event, EventType, \ + EventManager, OpenLPToolbar, ThemeXML, Renderer, translate, \ + file_to_xml, buildIcon from openlp.core.utils import ConfigHelper class ThemeManager(QtGui.QWidget): @@ -39,7 +41,7 @@ class ThemeManager(QtGui.QWidget): log = logging.getLogger(u'ThemeManager') def __init__(self, parent): - QtGui.QWidget.__init__(self) + QtGui.QWidget.__init__(self, parent) self.parent = parent self.Layout = QtGui.QVBoxLayout(self) self.Layout.setSpacing(0) @@ -81,6 +83,9 @@ class ThemeManager(QtGui.QWidget): self.servicePath = self.config.get_data_path() self.global_theme = unicode(self.config.get_config(u'theme global theme', u'')) + def getDefault(self): + return self.global_theme + def changeGlobal(self, index): for count in range (0, self.ThemeListWidget.count()): item = self.ThemeListWidget.item(count) @@ -91,10 +96,10 @@ class ThemeManager(QtGui.QWidget): #Set the new name if count == index.row(): self.global_theme = unicode(self.ThemeListWidget.item(count).text()) - name = (u'(%s):%s' % (translate(u'ThemeManager', u'default'), self.global_theme)) + name = u'%s (%s)' % (self.global_theme, translate(u'ThemeManager', u'default')) self.ThemeListWidget.item(count).setText(name) self.config.set_config(u'theme global theme', self.global_theme) - self.push_themes() + self.pushThemes() def onAddTheme(self): self.amendThemeForm.loadTheme(None) @@ -134,7 +139,7 @@ class ThemeManager(QtGui.QWidget): pass #As we do not reload the themes push out the change #Reaload the list as the internal lists and events need to be triggered - self.push_themes() + self.pushThemes() def onExportTheme(self): pass @@ -168,7 +173,7 @@ class ThemeManager(QtGui.QWidget): (path, filename) = os.path.split(unicode(file)) textName = os.path.splitext(name)[0] if textName == self.global_theme: - name = (u'(%s):%s' % (translate(u'ThemeManager', u'default'), textName)) + name = u'%s (%s)' % (textName, translate(u'ThemeManager', u'default')) else: name = textName item_name = QtGui.QListWidgetItem(name) @@ -176,12 +181,10 @@ class ThemeManager(QtGui.QWidget): item_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(textName)) self.ThemeListWidget.addItem(item_name) self.themelist.append(textName) - self.push_themes() + self.pushThemes() - def push_themes(self): + def pushThemes(self): self.parent.EventManager.post_event(Event(EventType.ThemeListChanged)) - self.parent.ServiceManagerContents.updateThemeList(self.getThemes()) - self.parent.settingsForm.ThemesTab.updateThemeList(self.getThemes()) def getThemes(self): return self.themelist diff --git a/openlp/plugins/images/lib/imageslidecontroller.py b/openlp/plugins/images/lib/imageslidecontroller.py index 926955846..f065b78d2 100644 --- a/openlp/plugins/images/lib/imageslidecontroller.py +++ b/openlp/plugins/images/lib/imageslidecontroller.py @@ -93,7 +93,7 @@ class ImageToolbar(MasterToolbar): Go to the last slide. """ if self.PreviewListWidget.rowCount() > 1: - self.timer_id = self.startTimer(int(self.TimeoutSpinBox.value()) * 1000) + self.timer_id = self.startTimer(int(self.TimeoutSpinBox.value()) * 1000) def onStopLoop(self): """