From cbd7ae2afcddf1e85e9b89b2a684e00fb68bc127 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 4 May 2011 19:31:02 +0200 Subject: [PATCH 01/33] - make start up smoother by setting up the displays correct the first time - do not pass screens as argument --- openlp.pyw | 5 ++--- openlp/core/lib/imagemanager.py | 4 +++- openlp/core/lib/renderer.py | 17 +++++++------- openlp/core/lib/settingsmanager.py | 9 ++++---- openlp/core/ui/__init__.py | 2 +- openlp/core/ui/generaltab.py | 27 +++++----------------- openlp/core/ui/maindisplay.py | 6 ++--- openlp/core/ui/mainwindow.py | 16 +++++-------- openlp/core/ui/screen.py | 36 ++++++++++++++++++++++++++++++ openlp/core/ui/settingsform.py | 4 ++-- openlp/core/ui/slidecontroller.py | 14 +++++------- 11 files changed, 77 insertions(+), 63 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index c287072f5..3badf1701 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -97,7 +97,7 @@ class OpenLP(QtGui.QApplication): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_normal'), self.setNormalCursor) # Decide how many screens we have and their size - screens = ScreenList(self.desktop()) + screens = ScreenList.get_instance(self.desktop()) # First time checks in settings has_run_wizard = QtCore.QSettings().value( u'general/has run wizard', QtCore.QVariant(False)).toBool() @@ -115,8 +115,7 @@ class OpenLP(QtGui.QApplication): # make sure Qt really display the splash screen self.processEvents() # start the main app window - self.mainWindow = MainWindow(screens, self.clipboard(), - self.arguments()) + self.mainWindow = MainWindow(self.clipboard(), self.arguments()) self.mainWindow.show() if show_splash: # now kill the splashscreen diff --git a/openlp/core/lib/imagemanager.py b/openlp/core/lib/imagemanager.py index 4873f4975..e7f826b38 100644 --- a/openlp/core/lib/imagemanager.py +++ b/openlp/core/lib/imagemanager.py @@ -68,8 +68,10 @@ class ImageManager(QtCore.QObject): """ log.info(u'Image Manager loaded') - def __init__(self): + def __init__(self, width, height): QtCore.QObject.__init__(self) + self.width = width + self.height = height self._cache = {} self._thread_running = False self._cache_dirty = False diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index bba85d176..856b68937 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -32,7 +32,7 @@ from openlp.core.lib import ServiceItem, ImageManager, expand_tags, \ build_lyrics_format_css, build_lyrics_outline_css, Receiver, \ ItemCapabilities from openlp.core.lib.theme import ThemeLevel -from openlp.core.ui import MainDisplay +from openlp.core.ui import MainDisplay, ScreenList log = logging.getLogger(__name__) @@ -56,22 +56,21 @@ class Renderer(object): ``theme_manager`` The ThemeManager instance, used to get the current theme details. - ``screens`` - Contains information about the Screens. - ``screen_number`` Defaults to *0*. The index of the output/display screen. """ log.info(u'Renderer Loaded') - def __init__(self, theme_manager, screens): + def __init__(self, theme_manager): """ Initialise the render manager. """ log.debug(u'Initilisation started') - self.screens = screens - self.image_manager = ImageManager() - self.display = MainDisplay(self, screens, False) + self.screens = ScreenList.get_instance() + self.width = self.screens.current[u'size'].width() + self.height = self.screens.current[u'size'].height() + self.image_manager = ImageManager(self.width, self.height) + self.display = MainDisplay(self, False) self.display.imageManager = self.image_manager self.theme_manager = theme_manager self.service_theme = u'' @@ -86,7 +85,7 @@ class Renderer(object): """ log.debug(u'Update Display') self._calculate_default(self.screens.current[u'size']) - self.display = MainDisplay(self, self.screens, False) + self.display = MainDisplay(self, False) self.display.imageManager = self.image_manager self.display.setup() self.bg_frame = None diff --git a/openlp/core/lib/settingsmanager.py b/openlp/core/lib/settingsmanager.py index bb83371e6..5e66ed807 100644 --- a/openlp/core/lib/settingsmanager.py +++ b/openlp/core/lib/settingsmanager.py @@ -33,6 +33,7 @@ import os from PyQt4 import QtCore +#from openlp.core.ui import ScreenList from openlp.core.utils import AppLocation class SettingsManager(object): @@ -40,8 +41,9 @@ class SettingsManager(object): Class to control the initial settings for the UI and provide helper functions for the loading and saving of application settings. """ - def __init__(self, screen): - self.screen = screen.current + def __init__(self): + from openlp.core.ui import ScreenList + self.screen = ScreenList.get_instance().current self.width = self.screen[u'size'].width() self.height = self.screen[u'size'].height() self.mainwindow_height = self.height * 0.8 @@ -54,9 +56,6 @@ class SettingsManager(object): else: self.mainwindow_left = mainwindow_docbars self.mainwindow_right = mainwindow_docbars - self.slidecontroller = (self.width - ( - self.mainwindow_left + self.mainwindow_right) - 100) / 2 - self.slidecontroller_image = self.slidecontroller - 50 @staticmethod def get_last_dir(section, num=None): diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index a2985c0b8..fced32a0d 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -56,10 +56,10 @@ from firsttimelanguageform import FirstTimeLanguageForm from themeform import ThemeForm from filerenameform import FileRenameForm from starttimeform import StartTimeForm +from screen import ScreenList from maindisplay import MainDisplay from servicenoteform import ServiceNoteForm from serviceitemeditform import ServiceItemEditForm -from screen import ScreenList from slidecontroller import SlideController from splashscreen import SplashScreen from generaltab import GeneralTab diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 7dac2fe9d..3f9e67e98 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -29,6 +29,7 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import SettingsTab, Receiver, translate from openlp.core.lib.ui import UiStrings +from openlp.core.ui import ScreenList log = logging.getLogger(__name__) @@ -36,33 +37,16 @@ class GeneralTab(SettingsTab): """ GeneralTab is the general settings tab in the settings dialog. """ - def __init__(self, parent, screens): + def __init__(self, parent): """ Initialise the general settings tab """ - self.screens = screens + self.screens = ScreenList.get_instance() self.monitorNumber = 0 - # Set to True to allow PostSetup to work on application start up - self.overrideChanged = True self.icon_path = u':/icon/openlp-logo-16x16.png' generalTranslated = translate('GeneralTab', 'General') SettingsTab.__init__(self, parent, u'General', generalTranslated) - def preLoad(self): - """ - Set up the display screen and set correct screen values. - If not set before default to last screen. - """ - settings = QtCore.QSettings() - settings.beginGroup(self.settingsSection) - self.monitorNumber = settings.value(u'monitor', - QtCore.QVariant(self.screens.display_count - 1)).toInt()[0] - self.screens.set_current_display(self.monitorNumber) - self.screens.monitor_number = self.monitorNumber - self.screens.display = settings.value( - u'display on monitor', QtCore.QVariant(True)).toBool() - settings.endGroup() - def setupUi(self): """ Create the user interface for the general settings tab @@ -203,7 +187,6 @@ class GeneralTab(SettingsTab): self.passwordLabel.setVisible(False) self.passwordEdit.setVisible(False) - def retranslateUi(self): """ Translate the general settings tab to the currently selected language @@ -300,6 +283,7 @@ class GeneralTab(SettingsTab): self.customYValueEdit.setEnabled(self.overrideCheckBox.isChecked()) self.customHeightValueEdit.setEnabled(self.overrideCheckBox.isChecked()) self.customWidthValueEdit.setEnabled(self.overrideCheckBox.isChecked()) + self.overrideChanged = False def save(self): """ @@ -394,4 +378,5 @@ class GeneralTab(SettingsTab): """ Called when the width, height, x position or y position has changed. """ - self.overrideChanged = True \ No newline at end of file + self.overrideChanged = True + diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 5fd066a12..58ff7d6e3 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -36,7 +36,7 @@ from PyQt4.phonon import Phonon from openlp.core.lib import Receiver, build_html, ServiceItem, image_to_byte, \ translate -from openlp.core.ui import HideMode +from openlp.core.ui import HideMode, ScreenList log = logging.getLogger(__name__) @@ -60,10 +60,10 @@ class MainDisplay(DisplayWidget): """ This is the display screen. """ - def __init__(self, parent, screens, live): + def __init__(self, parent, live): DisplayWidget.__init__(self, live, parent=None) self.parent = parent - self.screens = screens + self.screens = ScreenList.get_instance() self.isLive = live self.alertTab = None self.hideMode = None diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index aadc1c175..d8dcac630 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -86,10 +86,8 @@ class Ui_MainWindow(object): self.controlSplitter.setObjectName(u'controlSplitter') self.mainContentLayout.addWidget(self.controlSplitter) # Create slide controllers - self.previewController = SlideController(self, self.settingsmanager, - self.screens) - self.liveController = SlideController(self, self.settingsmanager, - self.screens, True) + self.previewController = SlideController(self, self.settingsmanager) + self.liveController = SlideController(self, self.settingsmanager, True) previewVisible = QtCore.QSettings().value( u'user interface/preview panel', QtCore.QVariant(True)).toBool() self.previewController.panel.setVisible(previewVisible) @@ -461,13 +459,12 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): """ log.info(u'MainWindow loaded') - def __init__(self, screens, clipboard, arguments): + def __init__(self, clipboard, arguments): """ This constructor sets up the interface, the various managers, and the plugins. """ QtGui.QMainWindow.__init__(self) - self.screens = screens self.clipboard = clipboard self.arguments = arguments # Set up settings sections for the main application @@ -477,9 +474,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.serviceSettingsSection = u'servicemanager' self.songsSettingsSection = u'songs' self.serviceNotSaved = False - self.settingsmanager = SettingsManager(screens) + self.settingsmanager = SettingsManager() self.aboutForm = AboutForm(self) - self.settingsForm = SettingsForm(self.screens, self, self) + self.settingsForm = SettingsForm(self, self) self.displayTagForm = DisplayTagForm(self) self.shortcutForm = ShortcutListForm(self) self.recentFiles = QtCore.QStringList() @@ -552,8 +549,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # warning cyclic dependency # renderer needs to call ThemeManager and # ThemeManager needs to call Renderer - self.renderer = Renderer( - self.themeManagerContents, self.screens) + self.renderer = Renderer(self.themeManagerContents) # Define the media Dock Manager self.mediaDockManager = MediaDockManager(self.MediaToolBox) log.info(u'Load Plugins') diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index 15dbd9883..d81b18ce3 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -41,6 +41,13 @@ class ScreenList(object): Wrapper to handle the parameters of the display screen """ log.info(u'Screen loaded') + instance = None + + @staticmethod + def get_instance(desktop=None): + if desktop is not None and ScreenList.instance is None: + ScreenList.instance = ScreenList(desktop) + return ScreenList.instance def __init__(self, desktop): """ @@ -60,6 +67,7 @@ class ScreenList(object): # save config display number self.monitor_number = 0 self.screen_count_changed() + self._load_screen_settings() QtCore.QObject.connect(desktop, QtCore.SIGNAL(u'resized(int)'), self.screen_resolution_changed) QtCore.QObject.connect(desktop, @@ -215,3 +223,31 @@ class ScreenList(object): """ log.debug(u'reset_current_display') self.set_current_display(self.current_display) + + def _load_screen_settings(self): + """ + Loads the screen size and the monitor number from the settings. + """ + settings = QtCore.QSettings() + settings.beginGroup(u'general') + self.monitor_number = settings.value(u'monitor', + QtCore.QVariant(self.display_count - 1)).toInt()[0] + self.set_current_display(self.monitor_number) + self.display = settings.value( + u'display on monitor', QtCore.QVariant(True)).toBool() + override_display = settings.value( + u'override position', QtCore.QVariant(False)).toBool() + x = settings.value(u'x position', + QtCore.QVariant(self.current[u'size'].x())).toInt()[0] + y = settings.value(u'y position', + QtCore.QVariant(self.current[u'size'].y())).toInt()[0] + width = settings.value(u'width', + QtCore.QVariant(self.current[u'size'].width())).toInt()[0] + height = settings.value(u'height', + QtCore.QVariant(self.current[u'size'].height())).toInt()[0] + settings.endGroup() + self.override[u'size'] = QtCore.QRect(x, y, width, height) + if override_display: + self.set_override_display() + else: + self.reset_current_display() diff --git a/openlp/core/ui/settingsform.py b/openlp/core/ui/settingsform.py index 1967412f5..265a03f48 100644 --- a/openlp/core/ui/settingsform.py +++ b/openlp/core/ui/settingsform.py @@ -40,14 +40,14 @@ class SettingsForm(QtGui.QDialog, Ui_SettingsDialog): """ Provide the form to manipulate the settings for OpenLP """ - def __init__(self, screens, mainWindow, parent=None): + def __init__(self, mainWindow, parent=None): """ Initialise the settings form """ QtGui.QDialog.__init__(self, parent) self.setupUi(self) # General tab - self.generalTab = GeneralTab(self, screens) + self.generalTab = GeneralTab(self) # Themes tab self.themesTab = ThemesTab(self, mainWindow) # Advanced tab diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index fdbf184b5..204470638 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -33,7 +33,7 @@ from PyQt4.phonon import Phonon from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ ItemCapabilities, translate from openlp.core.lib.ui import UiStrings, shortcut_action -from openlp.core.ui import HideMode, MainDisplay +from openlp.core.ui import HideMode, MainDisplay, ScreenList from openlp.core.utils.actions import ActionList, CategoryOrder log = logging.getLogger(__name__) @@ -53,7 +53,7 @@ class SlideController(QtGui.QWidget): SlideController is the slide controller widget. This widget is what the user uses to control the displaying of verses/slides/etc on the screen. """ - def __init__(self, parent, settingsmanager, screens, isLive=False): + def __init__(self, parent, settingsmanager, isLive=False): """ Set up the Slide Controller. """ @@ -61,10 +61,11 @@ class SlideController(QtGui.QWidget): self.settingsmanager = settingsmanager self.isLive = isLive self.parent = parent - self.screens = screens + self.screens = ScreenList.get_instance() self.ratio = float(self.screens.current[u'size'].width()) / \ float(self.screens.current[u'size'].height()) - self.display = MainDisplay(self, screens, isLive) + self.display = MainDisplay(self, isLive) + self.display.setup() self.loopList = [ u'Start Loop', u'Loop Separator', @@ -296,9 +297,6 @@ class SlideController(QtGui.QWidget): sizePolicy.setHeightForWidth( self.slidePreview.sizePolicy().hasHeightForWidth()) self.slidePreview.setSizePolicy(sizePolicy) - self.slidePreview.setFixedSize( - QtCore.QSize(self.settingsmanager.slidecontroller_image, - self.settingsmanager.slidecontroller_image / self.ratio)) self.slidePreview.setFrameShape(QtGui.QFrame.Box) self.slidePreview.setFrameShadow(QtGui.QFrame.Plain) self.slidePreview.setLineWidth(1) @@ -424,7 +422,7 @@ class SlideController(QtGui.QWidget): screen previews. """ # rebuild display as screen size changed - self.display = MainDisplay(self, self.screens, self.isLive) + self.display = MainDisplay(self, self.isLive) self.display.imageManager = self.parent.renderer.image_manager self.display.alertTab = self.alertTab self.display.setup() From e25145a81be0fddb352edff9ece5664974ffa281 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 5 May 2011 13:51:47 +0200 Subject: [PATCH 02/33] --- openlp/core/lib/__init__.py | 2 +- openlp/core/lib/dockwidget.py | 9 +++++++++ openlp/core/lib/imagemanager.py | 8 +++++--- openlp/core/lib/renderer.py | 18 ++++++++---------- openlp/core/lib/settingsmanager.py | 16 ---------------- openlp/core/ui/maindisplay.py | 7 ++++--- openlp/core/ui/mainwindow.py | 20 ++++++-------------- openlp/core/ui/slidecontroller.py | 16 +++++++--------- 8 files changed, 40 insertions(+), 56 deletions(-) diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index ef2520dac..27a34d54d 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -277,7 +277,6 @@ from listwidgetwithdnd import ListWidgetWithDnD from displaytags import DisplayTags from eventreceiver import Receiver from spelltextedit import SpellTextEdit -from imagemanager import ImageManager from settingsmanager import SettingsManager from plugin import PluginStatus, StringContent, Plugin from pluginmanager import PluginManager @@ -289,6 +288,7 @@ from htmlbuilder import build_html, build_lyrics_format_css, \ build_lyrics_outline_css from toolbar import OpenLPToolbar from dockwidget import OpenLPDockWidget +from imagemanager import ImageManager from renderer import Renderer from mediamanageritem import MediaManagerItem from openlp.core.utils.actions import ActionList diff --git a/openlp/core/lib/dockwidget.py b/openlp/core/lib/dockwidget.py index 9b4661fee..ace364ed0 100644 --- a/openlp/core/lib/dockwidget.py +++ b/openlp/core/lib/dockwidget.py @@ -32,6 +32,7 @@ import logging from PyQt4 import QtGui from openlp.core.lib import build_icon +from openlp.core.ui import ScreenList log = logging.getLogger(__name__) @@ -50,3 +51,11 @@ class OpenLPDockWidget(QtGui.QDockWidget): self.setObjectName(name) if icon: self.setWindowIcon(build_icon(icon)) + # Sort out the minimum width. + screens = ScreenList.get_instance() + screen_width = screens.current[u'size'].width() + mainwindow_docbars = screen_width / 5 + if mainwindow_docbars > 300: + self.setMinimumWidth(300) + else: + self.setMinimumWidth(mainwindow_docbars) diff --git a/openlp/core/lib/imagemanager.py b/openlp/core/lib/imagemanager.py index e7f826b38..f144248ed 100644 --- a/openlp/core/lib/imagemanager.py +++ b/openlp/core/lib/imagemanager.py @@ -35,6 +35,7 @@ import time from PyQt4 import QtCore from openlp.core.lib import resize_image, image_to_byte +from openlp.core.ui import ScreenList log = logging.getLogger(__name__) @@ -68,10 +69,11 @@ class ImageManager(QtCore.QObject): """ log.info(u'Image Manager loaded') - def __init__(self, width, height): + def __init__(self): QtCore.QObject.__init__(self) - self.width = width - self.height = height + current_screen = ScreenList.get_instance().current + self.width = current_screen[u'size'].width() + self.height = current_screen[u'size'].height() self._cache = {} self._thread_running = False self._cache_dirty = False diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 856b68937..4346d4d3f 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -28,7 +28,7 @@ import logging from PyQt4 import QtCore, QtWebKit -from openlp.core.lib import ServiceItem, ImageManager, expand_tags, \ +from openlp.core.lib import ServiceItem, expand_tags, \ build_lyrics_format_css, build_lyrics_outline_css, Receiver, \ ItemCapabilities from openlp.core.lib.theme import ThemeLevel @@ -61,23 +61,22 @@ class Renderer(object): """ log.info(u'Renderer Loaded') - def __init__(self, theme_manager): + def __init__(self, imageManager, theme_manager): """ Initialise the render manager. """ log.debug(u'Initilisation started') - self.screens = ScreenList.get_instance() - self.width = self.screens.current[u'size'].width() - self.height = self.screens.current[u'size'].height() - self.image_manager = ImageManager(self.width, self.height) - self.display = MainDisplay(self, False) - self.display.imageManager = self.image_manager self.theme_manager = theme_manager + self.image_manager = imageManager + self.screens = ScreenList.get_instance() self.service_theme = u'' self.theme_level = u'' self.override_background = None self.theme_data = None + self.bg_frame = None self.force_page = False + self.display = MainDisplay(self, self.image_manager, False) + self.display.setup() def update_display(self): """ @@ -85,8 +84,7 @@ class Renderer(object): """ log.debug(u'Update Display') self._calculate_default(self.screens.current[u'size']) - self.display = MainDisplay(self, False) - self.display.imageManager = self.image_manager + self.display = MainDisplay(self, self.image_manager, False) self.display.setup() self.bg_frame = None self.theme_data = None diff --git a/openlp/core/lib/settingsmanager.py b/openlp/core/lib/settingsmanager.py index 5e66ed807..fbc639ba6 100644 --- a/openlp/core/lib/settingsmanager.py +++ b/openlp/core/lib/settingsmanager.py @@ -33,7 +33,6 @@ import os from PyQt4 import QtCore -#from openlp.core.ui import ScreenList from openlp.core.utils import AppLocation class SettingsManager(object): @@ -41,21 +40,6 @@ class SettingsManager(object): Class to control the initial settings for the UI and provide helper functions for the loading and saving of application settings. """ - def __init__(self): - from openlp.core.ui import ScreenList - self.screen = ScreenList.get_instance().current - self.width = self.screen[u'size'].width() - self.height = self.screen[u'size'].height() - self.mainwindow_height = self.height * 0.8 - mainwindow_docbars = self.width / 5 - self.mainwindow_left = 0 - self.mainwindow_right = 0 - if mainwindow_docbars > 300: - self.mainwindow_left = 300 - self.mainwindow_right = 300 - else: - self.mainwindow_left = mainwindow_docbars - self.mainwindow_right = mainwindow_docbars @staticmethod def get_last_dir(section, num=None): diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 58ff7d6e3..45528accc 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -60,11 +60,12 @@ class MainDisplay(DisplayWidget): """ This is the display screen. """ - def __init__(self, parent, live): - DisplayWidget.__init__(self, live, parent=None) + def __init__(self, parent, imageManager, live): + DisplayWidget.__init__(self, live, parent) self.parent = parent - self.screens = ScreenList.get_instance() self.isLive = live + self.imageManager = imageManager + self.screens = ScreenList.get_instance() self.alertTab = None self.hideMode = None self.videoHide = False diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index d8dcac630..abff4068e 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -31,7 +31,7 @@ from tempfile import gettempdir from PyQt4 import QtCore, QtGui from openlp.core.lib import Renderer, build_icon, OpenLPDockWidget, \ - SettingsManager, PluginManager, Receiver, translate + PluginManager, Receiver, translate, ImageManager from openlp.core.lib.ui import UiStrings, base_action, checkable_action, \ icon_action, shortcut_action from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ @@ -69,8 +69,6 @@ class Ui_MainWindow(object): Set up the user interface """ mainWindow.setObjectName(u'MainWindow') - mainWindow.resize(self.settingsmanager.width, - self.settingsmanager.height) mainWindow.setWindowIcon(build_icon(u':/icon/openlp-logo-64x64.png')) mainWindow.setDockNestingEnabled(True) # Set up the main container, which contains all the other form widgets. @@ -86,8 +84,8 @@ class Ui_MainWindow(object): self.controlSplitter.setObjectName(u'controlSplitter') self.mainContentLayout.addWidget(self.controlSplitter) # Create slide controllers - self.previewController = SlideController(self, self.settingsmanager) - self.liveController = SlideController(self, self.settingsmanager, True) + self.previewController = SlideController(self) + self.liveController = SlideController(self, True) previewVisible = QtCore.QSettings().value( u'user interface/preview panel', QtCore.QVariant(True)).toBool() self.previewController.panel.setVisible(previewVisible) @@ -135,8 +133,6 @@ class Ui_MainWindow(object): self.mediaManagerDock = OpenLPDockWidget(mainWindow, u'mediaManagerDock', u':/system/system_mediamanager.png') self.mediaManagerDock.setStyleSheet(MEDIA_MANAGER_STYLE) - self.mediaManagerDock.setMinimumWidth( - self.settingsmanager.mainwindow_left) # Create the media toolbox self.MediaToolBox = QtGui.QToolBox(self.mediaManagerDock) self.MediaToolBox.setObjectName(u'MediaToolBox') @@ -146,8 +142,6 @@ class Ui_MainWindow(object): # Create the service manager self.serviceManagerDock = OpenLPDockWidget(mainWindow, u'serviceManagerDock', u':/system/system_servicemanager.png') - self.serviceManagerDock.setMinimumWidth( - self.settingsmanager.mainwindow_right) self.ServiceManagerContents = ServiceManager(mainWindow, self.serviceManagerDock) self.serviceManagerDock.setWidget(self.ServiceManagerContents) @@ -156,8 +150,6 @@ class Ui_MainWindow(object): # Create the theme manager self.themeManagerDock = OpenLPDockWidget(mainWindow, u'themeManagerDock', u':/system/system_thememanager.png') - self.themeManagerDock.setMinimumWidth( - self.settingsmanager.mainwindow_right) self.themeManagerContents = ThemeManager(mainWindow, self.themeManagerDock) self.themeManagerContents.setObjectName(u'themeManagerContents') @@ -474,7 +466,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): self.serviceSettingsSection = u'servicemanager' self.songsSettingsSection = u'songs' self.serviceNotSaved = False - self.settingsmanager = SettingsManager() self.aboutForm = AboutForm(self) self.settingsForm = SettingsForm(self, self) self.displayTagForm = DisplayTagForm(self) @@ -484,6 +475,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): pluginpath = AppLocation.get_directory(AppLocation.PluginsDir) self.pluginManager = PluginManager(pluginpath) self.pluginHelpers = {} + self.imageManager = ImageManager() # Set up the interface self.setupUi(self) # Load settings after setupUi so default UI sizes are overwritten @@ -549,7 +541,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # warning cyclic dependency # renderer needs to call ThemeManager and # ThemeManager needs to call Renderer - self.renderer = Renderer(self.themeManagerContents) + self.renderer = Renderer(self.imageManager, self.themeManagerContents) # Define the media Dock Manager self.mediaDockManager = MediaDockManager(self.MediaToolBox) log.info(u'Load Plugins') @@ -782,8 +774,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): their locations """ log.debug(u'screenChanged') - self.renderer.update_display() self.setFocus() + self.renderer.update_display() self.activateWindow() def closeEvent(self, event): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 204470638..7937f6e51 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -53,18 +53,19 @@ class SlideController(QtGui.QWidget): SlideController is the slide controller widget. This widget is what the user uses to control the displaying of verses/slides/etc on the screen. """ - def __init__(self, parent, settingsmanager, isLive=False): + def __init__(self, parent, isLive=False): """ Set up the Slide Controller. """ QtGui.QWidget.__init__(self, parent) - self.settingsmanager = settingsmanager self.isLive = isLive self.parent = parent self.screens = ScreenList.get_instance() self.ratio = float(self.screens.current[u'size'].width()) / \ float(self.screens.current[u'size'].height()) - self.display = MainDisplay(self, isLive) + self.image_manager = self.parent.imageManager + self.display = MainDisplay(self, self.image_manager, isLive) + #self.display.alertTab = self.alertTab self.display.setup() self.loopList = [ u'Start Loop', @@ -422,8 +423,7 @@ class SlideController(QtGui.QWidget): screen previews. """ # rebuild display as screen size changed - self.display = MainDisplay(self, self.isLive) - self.display.imageManager = self.parent.renderer.image_manager + self.display = MainDisplay(self, self.image_manager, self.isLive) self.display.alertTab = self.alertTab self.display.setup() if self.isLive: @@ -637,10 +637,8 @@ class SlideController(QtGui.QWidget): # If current slide set background to image if framenumber == slideno: self.serviceItem.bg_image_bytes = \ - self.parent.renderer.image_manager. \ - get_image_bytes(frame[u'title']) - image = self.parent.renderer.image_manager. \ - get_image(frame[u'title']) + self.image_manager.get_image_bytes(frame[u'title']) + image = self.image_manager.get_image(frame[u'title']) label.setPixmap(QtGui.QPixmap.fromImage(image)) self.previewListWidget.setCellWidget(framenumber, 0, label) slideHeight = width * self.parent.renderer.screen_ratio From 2a7c5bd4debfe964fbf64323575163daf380335d Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 5 May 2011 17:16:55 +0200 Subject: [PATCH 03/33] names changes --- openlp/core/lib/renderer.py | 7 ++----- openlp/core/ui/maindisplay.py | 14 +++++++------- openlp/core/ui/mainwindow.py | 6 +++--- openlp/core/ui/slidecontroller.py | 2 +- 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 4346d4d3f..431e3cd97 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -55,19 +55,16 @@ class Renderer(object): ``theme_manager`` The ThemeManager instance, used to get the current theme details. - - ``screen_number`` - Defaults to *0*. The index of the output/display screen. """ log.info(u'Renderer Loaded') - def __init__(self, imageManager, theme_manager): + def __init__(self, image_manager, theme_manager): """ Initialise the render manager. """ log.debug(u'Initilisation started') self.theme_manager = theme_manager - self.image_manager = imageManager + self.image_manager = image_manager self.screens = ScreenList.get_instance() self.service_theme = u'' self.theme_level = u'' diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index a20d28c39..c6edbca25 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -60,11 +60,11 @@ class MainDisplay(DisplayWidget): """ This is the display screen. """ - def __init__(self, parent, imageManager, live): + def __init__(self, parent, image_manager, live): DisplayWidget.__init__(self, live, parent) self.parent = parent self.isLive = live - self.imageManager = imageManager + self.image_manager = image_manager self.screens = ScreenList.get_instance() self.alertTab = None self.hideMode = None @@ -245,7 +245,7 @@ class MainDisplay(DisplayWidget): """ API for replacement backgrounds so Images are added directly to cache """ - self.imageManager.add_image(name, path) + self.image_manager.add_image(name, path) self.image(name) if hasattr(self, u'serviceItem'): self.override[u'image'] = name @@ -260,7 +260,7 @@ class MainDisplay(DisplayWidget): The name of the image to be displayed """ log.debug(u'image to display') - image = self.imageManager.get_image_bytes(name) + image = self.image_manager.get_image_bytes(name) self.resetVideo() self.displayImage(image) return self.preview() @@ -490,13 +490,13 @@ class MainDisplay(DisplayWidget): self.override = {} else: # replace the background - background = self.imageManager. \ + background = self.image_manager. \ get_image_bytes(self.override[u'image']) if self.serviceItem.themedata.background_filename: - self.serviceItem.bg_image_bytes = self.imageManager. \ + self.serviceItem.bg_image_bytes = self.image_manager. \ get_image_bytes(self.serviceItem.themedata.theme_name) if image: - image_bytes = self.imageManager.get_image_bytes(image) + image_bytes = self.image_manager.get_image_bytes(image) else: image_bytes = None html = build_html(self.serviceItem, self.screen, self.alertTab, diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index abff4068e..9f526fb2e 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -475,7 +475,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): pluginpath = AppLocation.get_directory(AppLocation.PluginsDir) self.pluginManager = PluginManager(pluginpath) self.pluginHelpers = {} - self.imageManager = ImageManager() + self.image_manager = ImageManager() # Set up the interface self.setupUi(self) # Load settings after setupUi so default UI sizes are overwritten @@ -541,7 +541,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # warning cyclic dependency # renderer needs to call ThemeManager and # ThemeManager needs to call Renderer - self.renderer = Renderer(self.imageManager, self.themeManagerContents) + self.renderer = Renderer(self.image_manager, self.themeManagerContents) # Define the media Dock Manager self.mediaDockManager = MediaDockManager(self.MediaToolBox) log.info(u'Load Plugins') @@ -774,8 +774,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): their locations """ log.debug(u'screenChanged') - self.setFocus() self.renderer.update_display() + self.setFocus() self.activateWindow() def closeEvent(self, event): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index de90e7cd4..ad3d4ec87 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -63,7 +63,7 @@ class SlideController(QtGui.QWidget): self.screens = ScreenList.get_instance() self.ratio = float(self.screens.current[u'size'].width()) / \ float(self.screens.current[u'size'].height()) - self.image_manager = self.parent.imageManager + self.image_manager = self.parent.image_manager self.display = MainDisplay(self, self.image_manager, isLive) self.display.setup() self.loopList = [ From e1b1f7c6d00dd35b3ba3b1be9cb5774923a4d1c6 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 5 May 2011 20:40:04 +0200 Subject: [PATCH 04/33] fixed alert bug --- openlp/core/ui/mainwindow.py | 3 +++ openlp/core/ui/slidecontroller.py | 3 --- openlp/plugins/alerts/alertsplugin.py | 1 - 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 9f526fb2e..cf5926793 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -573,6 +573,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): # Call the initialise method to setup plugins. log.info(u'initialise plugins') self.pluginManager.initialise_plugins() + # Create the displays as all necessary components are loaded. + self.previewController.screenSizeChanged() + self.liveController.screenSizeChanged() log.info(u'Load data from Settings') if QtCore.QSettings().value(u'advanced/save current plugin', QtCore.QVariant(False)).toBool(): diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index ad3d4ec87..a526d99fa 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -64,8 +64,6 @@ class SlideController(QtGui.QWidget): self.ratio = float(self.screens.current[u'size'].width()) / \ float(self.screens.current[u'size'].height()) self.image_manager = self.parent.image_manager - self.display = MainDisplay(self, self.image_manager, isLive) - self.display.setup() self.loopList = [ u'Start Loop', u'Loop Separator', @@ -326,7 +324,6 @@ class SlideController(QtGui.QWidget): if self.isLive: self.setLiveHotkeys(self) self.__addActionsToWidget(self.previewListWidget) - self.__addActionsToWidget(self.display) else: self.setPreviewHotkeys() self.previewListWidget.addActions( diff --git a/openlp/plugins/alerts/alertsplugin.py b/openlp/plugins/alerts/alertsplugin.py index 2669537aa..979ebb01d 100644 --- a/openlp/plugins/alerts/alertsplugin.py +++ b/openlp/plugins/alerts/alertsplugin.py @@ -79,7 +79,6 @@ class AlertsPlugin(Plugin): action_list = ActionList.get_instance() action_list.add_action(self.toolsAlertItem, UiStrings().Tools) self.liveController.alertTab = self.settings_tab - self.liveController.display.alertTab = self.settings_tab def finalise(self): """ From 090e8378aecef9f7ef36564703b5ca372771ec31 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 6 May 2011 21:09:40 +0200 Subject: [PATCH 05/33] - allow negative x and y values - fixes - removed redundant variables --- openlp/core/ui/generaltab.py | 75 ++++++++++++++++++++--------------- openlp/core/ui/maindisplay.py | 27 ++++++------- openlp/core/ui/screen.py | 28 ++++++------- 3 files changed, 69 insertions(+), 61 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 3f9e67e98..58fbd618c 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -42,7 +42,6 @@ class GeneralTab(SettingsTab): Initialise the general settings tab """ self.screens = ScreenList.get_instance() - self.monitorNumber = 0 self.icon_path = u':/icon/openlp-logo-16x16.png' generalTranslated = translate('GeneralTab', 'General') SettingsTab.__init__(self, parent, u'General', generalTranslated) @@ -142,14 +141,14 @@ class GeneralTab(SettingsTab): self.displayLayout.addWidget(self.customXLabel, 3, 0) self.customXValueEdit = QtGui.QSpinBox(self.displayGroupBox) self.customXValueEdit.setObjectName(u'customXValueEdit') - self.customXValueEdit.setMaximum(9999) + self.customXValueEdit.setRange(-9999, 9999) self.displayLayout.addWidget(self.customXValueEdit, 4, 0) self.customYLabel = QtGui.QLabel(self.displayGroupBox) self.customYLabel.setObjectName(u'customYLabel') self.displayLayout.addWidget(self.customYLabel, 3, 1) self.customYValueEdit = QtGui.QSpinBox(self.displayGroupBox) self.customYValueEdit.setObjectName(u'customYValueEdit') - self.customYValueEdit.setMaximum(9999) + self.customYValueEdit.setRange(-9999, 9999) self.displayLayout.addWidget(self.customYValueEdit, 4, 1) self.customWidthLabel = QtGui.QLabel(self.displayGroupBox) self.customWidthLabel.setObjectName(u'customWidthLabel') @@ -171,13 +170,16 @@ class GeneralTab(SettingsTab): QtCore.QObject.connect(self.overrideCheckBox, QtCore.SIGNAL(u'toggled(bool)'), self.onOverrideCheckBoxToggled) QtCore.QObject.connect(self.customHeightValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayPositionChanged) + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) QtCore.QObject.connect(self.customWidthValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayPositionChanged) + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) QtCore.QObject.connect(self.customYValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayPositionChanged) + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) QtCore.QObject.connect(self.customXValueEdit, - QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayPositionChanged) + QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) + QtCore.QObject.connect(self.monitorComboBox, + QtCore.SIGNAL(u'currentIndexChanged(int)'), + self.onMonitorComboBoxChanged) # Reload the tab, as the screen resolution/count may have changed. QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_screen_changed'), self.load) @@ -244,6 +246,9 @@ class GeneralTab(SettingsTab): settings.beginGroup(self.settingsSection) self.monitorComboBox.clear() self.monitorComboBox.addItems(self.screens.get_screen_list()) + monitorNumber = settings.value(u'monitor', + QtCore.QVariant(self.screens.display_count - 1)).toInt()[0] + self.monitorComboBox.setCurrentIndex(monitorNumber) self.numberEdit.setText(unicode(settings.value( u'ccli number', QtCore.QVariant(u'')).toString())) self.usernameEdit.setText(unicode(settings.value( @@ -254,7 +259,6 @@ class GeneralTab(SettingsTab): QtCore.QVariant(False)).toBool()) self.autoUnblankCheckBox.setChecked(settings.value(u'auto unblank', QtCore.QVariant(False)).toBool()) - self.monitorComboBox.setCurrentIndex(self.monitorNumber) self.displayOnMonitorCheck.setChecked(self.screens.display) self.warningCheckBox.setChecked(settings.value(u'blank warning', QtCore.QVariant(False)).toBool()) @@ -283,16 +287,16 @@ class GeneralTab(SettingsTab): self.customYValueEdit.setEnabled(self.overrideCheckBox.isChecked()) self.customHeightValueEdit.setEnabled(self.overrideCheckBox.isChecked()) self.customWidthValueEdit.setEnabled(self.overrideCheckBox.isChecked()) - self.overrideChanged = False + self.display_changed = False def save(self): """ Save the settings from the form """ - self.monitorNumber = self.monitorComboBox.currentIndex() settings = QtCore.QSettings() settings.beginGroup(self.settingsSection) - settings.setValue(u'monitor', QtCore.QVariant(self.monitorNumber)) + settings.setValue(u'monitor', + QtCore.QVariant(self.monitorComboBox.currentIndex())) settings.setValue(u'display on monitor', QtCore.QVariant(self.displayOnMonitorCheck.isChecked())) settings.setValue(u'blank warning', @@ -328,15 +332,8 @@ class GeneralTab(SettingsTab): settings.setValue(u'override position', QtCore.QVariant(self.overrideCheckBox.isChecked())) settings.endGroup() - self.screens.display = self.displayOnMonitorCheck.isChecked() - # Monitor Number has changed. - postUpdate = False - if self.screens.monitor_number != self.monitorNumber: - self.screens.monitor_number = self.monitorNumber - self.screens.set_current_display(self.monitorNumber) - postUpdate = True # On save update the screens as well - self.postSetUp(postUpdate) + self.postSetUp(True) def postSetUp(self, postUpdate=False): """ @@ -345,21 +342,24 @@ class GeneralTab(SettingsTab): """ Receiver.send_message(u'slidecontroller_live_spin_delay', self.timeoutSpinBox.value()) - # Reset screens after initial definition - if self.overrideChanged: - self.screens.override[u'size'] = QtCore.QRect( - self.customXValueEdit.value(), - self.customYValueEdit.value(), - self.customWidthValueEdit.value(), - self.customHeightValueEdit.value()) + # Do not continue on start up. + if not postUpdate: + return + self.screens.set_current_display(self.monitorComboBox.currentIndex()) + self.screens.display = self.displayOnMonitorCheck.isChecked() + self.screens.override[u'size'] = QtCore.QRect( + self.customXValueEdit.value(), + self.customYValueEdit.value(), + self.customWidthValueEdit.value(), + self.customHeightValueEdit.value()) if self.overrideCheckBox.isChecked(): self.screens.set_override_display() else: self.screens.reset_current_display() - # Order is important so be careful if you change - if self.overrideChanged or postUpdate: + if self.display_changed: Receiver.send_message(u'config_screen_changed') - self.overrideChanged = False + self.display_changed = False + def onOverrideCheckBoxToggled(self, checked): """ @@ -372,11 +372,22 @@ class GeneralTab(SettingsTab): self.customYValueEdit.setEnabled(checked) self.customHeightValueEdit.setEnabled(checked) self.customWidthValueEdit.setEnabled(checked) - self.overrideChanged = True + self.display_changed = True - def onDisplayPositionChanged(self): + def onDisplayChanged(self): """ Called when the width, height, x position or y position has changed. """ - self.overrideChanged = True + self.display_changed = True + def onMonitorComboBoxChanged(self, index): + """ + """ + self.display_changed = True + if self.overrideCheckBox.isChecked(): + return + screen = self.screens.screen_list[index] + self.customXValueEdit.setValue(screen[u'size'].x()) + self.customYValueEdit.setValue(screen[u'size'].y()) + self.customHeightValueEdit.setValue(screen[u'size'].height()) + self.customWidthValueEdit.setValue(screen[u'size'].width()) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index c6edbca25..3ff8ed1f2 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -95,8 +95,7 @@ class MainDisplay(DisplayWidget): """ Set up and build the output screen """ - log.debug(u'Start setup for monitor %s (live = %s)' % - (self.screens.monitor_number, self.isLive)) + log.debug(u'Start MainDisplay setup (live = %s)' % self.isLive) self.usePhonon = QtCore.QSettings().value( u'media/use phonon', QtCore.QVariant(True)).toBool() self.phononActive = False @@ -107,11 +106,11 @@ class MainDisplay(DisplayWidget): self.videoWidget.setVisible(False) self.videoWidget.setGeometry(QtCore.QRect(0, 0, self.screen[u'size'].width(), self.screen[u'size'].height())) - log.debug(u'Setup Phonon for monitor %s' % self.screens.monitor_number) + log.debug(u'Setup Phonon') if self.isLive: if not self.firstTime: self.createMediaObject() - log.debug(u'Setup webView for monitor %s' % self.screens.monitor_number) + log.debug(u'Setup webView') self.webView = QtWebKit.QWebView(self) self.webView.setGeometry(0, 0, self.screen[u'size'].width(), self.screen[u'size'].height()) @@ -128,8 +127,8 @@ class MainDisplay(DisplayWidget): if self.isLive: # Build the initial frame. self.black = QtGui.QImage( - self.screens.current[u'size'].width(), - self.screens.current[u'size'].height(), + self.screen[u'size'].width(), + self.screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied) painter_image = QtGui.QPainter() painter_image.begin(self.black) @@ -146,17 +145,16 @@ class MainDisplay(DisplayWidget): background_color = QtCore.Qt.white splash_image = QtGui.QImage(image_file) self.initialFrame = QtGui.QImage( - self.screens.current[u'size'].width(), - self.screens.current[u'size'].height(), + self.screen[u'size'].width(), + self.screen[u'size'].height(), QtGui.QImage.Format_ARGB32_Premultiplied) painter_image = QtGui.QPainter() painter_image.begin(self.initialFrame) painter_image.fillRect(self.initialFrame.rect(), background_color) painter_image.drawImage( - (self.screens.current[u'size'].width() - - splash_image.width()) / 2, - (self.screens.current[u'size'].height() - - splash_image.height()) / 2, splash_image) + (self.screen[u'size'].width() - splash_image.width()) / 2, + (self.screen[u'size'].height() - splash_image.height()) / 2, + splash_image) serviceItem = ServiceItem() serviceItem.bg_image_bytes = image_to_byte(self.initialFrame) self.webView.setHtml(build_html(serviceItem, self.screen, @@ -168,8 +166,7 @@ class MainDisplay(DisplayWidget): self.primary = False else: self.primary = True - log.debug( - u'Finished setup for monitor %s' % self.screens.monitor_number) + log.debug(u'Finished MainDisplay setup') def createMediaObject(self): self.firstTime = False @@ -452,7 +449,7 @@ class MainDisplay(DisplayWidget): self.hideDisplay(self.hideMode) else: # Single screen active - if self.screens.monitor_number == 0: + if self.screens.display_count == 1: # Only make visible if setting enabled if QtCore.QSettings().value(u'general/display on monitor', QtCore.QVariant(True)).toBool(): diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index d81b18ce3..330b5d53f 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -36,9 +36,16 @@ from openlp.core.lib import Receiver, translate log = logging.getLogger(__name__) +class Screen(object): + primary = True + number = 0 + size = QtCore.QRect(0, 0, 1024, 768) + class ScreenList(object): """ - Wrapper to handle the parameters of the display screen + Wrapper to handle the parameters of the display screen. + + To get access to the screen list call ``ScreenList.get_instance()``. """ log.info(u'Screen loaded') instance = None @@ -62,10 +69,6 @@ class ScreenList(object): self.override = None self.screen_list = [] self.display_count = 0 - # actual display number - self.current_display = 0 - # save config display number - self.monitor_number = 0 self.screen_count_changed() self._load_screen_settings() QtCore.QObject.connect(desktop, @@ -158,6 +161,7 @@ class ScreenList(object): screen[u'number'], screen[u'size']) if screen[u'primary']: self.current = screen + self.override = copy.deepcopy(self.current) self.screen_list.append(screen) self.display_count += 1 @@ -197,13 +201,10 @@ class ScreenList(object): log.debug(u'set_current_display %s', number) if number + 1 > self.display_count: self.current = self.screen_list[0] - self.override = copy.deepcopy(self.current) - self.current_display = 0 else: self.current = self.screen_list[number] - self.override = copy.deepcopy(self.current) self.preview = copy.deepcopy(self.current) - self.current_display = number + self.override = copy.deepcopy(self.current) if self.display_count == 1: self.preview = self.screen_list[0] @@ -222,7 +223,7 @@ class ScreenList(object): use the correct screen attributes. """ log.debug(u'reset_current_display') - self.set_current_display(self.current_display) + self.set_current_display(self.current[u'number']) def _load_screen_settings(self): """ @@ -230,9 +231,8 @@ class ScreenList(object): """ settings = QtCore.QSettings() settings.beginGroup(u'general') - self.monitor_number = settings.value(u'monitor', - QtCore.QVariant(self.display_count - 1)).toInt()[0] - self.set_current_display(self.monitor_number) + self.set_current_display(settings.value(u'monitor', + QtCore.QVariant(self.display_count - 1)).toInt()[0]) self.display = settings.value( u'display on monitor', QtCore.QVariant(True)).toBool() override_display = settings.value( @@ -245,8 +245,8 @@ class ScreenList(object): QtCore.QVariant(self.current[u'size'].width())).toInt()[0] height = settings.value(u'height', QtCore.QVariant(self.current[u'size'].height())).toInt()[0] - settings.endGroup() self.override[u'size'] = QtCore.QRect(x, y, width, height) + settings.endGroup() if override_display: self.set_override_display() else: From a81a43c15e2b962a1480745967cd25013800bb35 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 6 May 2011 21:19:09 +0200 Subject: [PATCH 06/33] clean up --- openlp/core/ui/generaltab.py | 1 + openlp/core/ui/screen.py | 5 ----- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 58fbd618c..fcd807a6c 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -382,6 +382,7 @@ class GeneralTab(SettingsTab): def onMonitorComboBoxChanged(self, index): """ + The ``monitorComboBox`` has changed to the given ``index``. """ self.display_changed = True if self.overrideCheckBox.isChecked(): diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index 330b5d53f..88d8b2b64 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -36,11 +36,6 @@ from openlp.core.lib import Receiver, translate log = logging.getLogger(__name__) -class Screen(object): - primary = True - number = 0 - size = QtCore.QRect(0, 0, 1024, 768) - class ScreenList(object): """ Wrapper to handle the parameters of the display screen. From 9a16666639f2c413f5f47d89b66ea560097c942c Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 6 May 2011 21:31:29 +0200 Subject: [PATCH 07/33] removed blank line --- openlp/core/ui/generaltab.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index fcd807a6c..91999d05b 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -360,7 +360,6 @@ class GeneralTab(SettingsTab): Receiver.send_message(u'config_screen_changed') self.display_changed = False - def onOverrideCheckBoxToggled(self, checked): """ Toggle screen state depending on check box state. From 25a697e03e67ce85f641515013c9d696974d662f Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 6 May 2011 21:55:16 +0200 Subject: [PATCH 08/33] removed more old code --- openlp/core/ui/maindisplay.py | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 3ff8ed1f2..bb890124a 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -43,25 +43,12 @@ log = logging.getLogger(__name__) #http://www.steveheffernan.com/html5-video-player/demo-video-player.html #http://html5demos.com/two-videos -class DisplayWidget(QtGui.QGraphicsView): - """ - Customised version of QTableWidget which can respond to keyboard - events. - """ - log.info(u'Display Widget loaded') - - def __init__(self, live, parent=None): - QtGui.QGraphicsView.__init__(self) - self.parent = parent - self.live = live - - -class MainDisplay(DisplayWidget): +class MainDisplay(QtGui.QGraphicsView): """ This is the display screen. """ def __init__(self, parent, image_manager, live): - DisplayWidget.__init__(self, live, parent) + QtGui.QGraphicsView.__init__(self) self.parent = parent self.isLive = live self.image_manager = image_manager From cd8e96b6a3522a6793a4b818de325b1a90162d19 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 7 May 2011 17:51:44 +0200 Subject: [PATCH 09/33] Fixed the order of components which need to update their screen information --- openlp/core/lib/imagemanager.py | 7 ++++--- openlp/core/lib/renderer.py | 1 - openlp/core/ui/mainwindow.py | 3 +++ openlp/core/ui/slidecontroller.py | 2 -- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/openlp/core/lib/imagemanager.py b/openlp/core/lib/imagemanager.py index f144248ed..f06dc2767 100644 --- a/openlp/core/lib/imagemanager.py +++ b/openlp/core/lib/imagemanager.py @@ -79,13 +79,14 @@ class ImageManager(QtCore.QObject): self._cache_dirty = False self.image_thread = ImageThread(self) - def update_display(self, width, height): + def update_display(self): """ Screen has changed size so rebuild the cache to new size """ log.debug(u'update_display') - self.width = width - self.height = height + current_screen = ScreenList.get_instance().current + self.width = current_screen[u'size'].width() + self.height = current_screen[u'size'].height() # mark the images as dirty for a rebuild for key in self._cache.keys(): image = self._cache[key] diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 431e3cd97..0eb9eabd1 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -85,7 +85,6 @@ class Renderer(object): self.display.setup() self.bg_frame = None self.theme_data = None - self.image_manager.update_display(self.width, self.height) def set_global_theme(self, global_theme, theme_level=ThemeLevel.Global): """ diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index cf5926793..5a94f8f75 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -777,7 +777,10 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): their locations """ log.debug(u'screenChanged') + self.image_manager.update_display() self.renderer.update_display() + self.liveController.screenSizeChanged() + self.previewController.screenSizeChanged() self.setFocus() self.activateWindow() diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index a526d99fa..c14380d4d 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -366,8 +366,6 @@ class SlideController(QtGui.QWidget): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'slidecontroller_%s_text_request' % self.typePrefix), self.onTextRequest) - QtCore.QObject.connect(Receiver.get_receiver(), - QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged) def setPreviewHotkeys(self, parent=None): self.previousItem.setObjectName(u'previousItemPreview') From 3761a056cab4ad4d859fff18df8e9821edc30681 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 7 May 2011 22:55:11 +0200 Subject: [PATCH 10/33] updated doc --- openlp/core/lib/renderer.py | 10 +++++++--- openlp/core/lib/settingsmanager.py | 4 ++-- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 0eb9eabd1..ee80d90bc 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -52,15 +52,19 @@ class Renderer(object): Class to pull all Renderer interactions into one place. The plugins will call helper methods to do the rendering but this class will provide display defense code. - - ``theme_manager`` - The ThemeManager instance, used to get the current theme details. """ log.info(u'Renderer Loaded') def __init__(self, image_manager, theme_manager): """ Initialise the render manager. + + ``image_manager`` + A ImageManager instance which takes care of e. g. caching and resizing + images. + + ``theme_manager`` + The ThemeManager instance, used to get the current theme details. """ log.debug(u'Initilisation started') self.theme_manager = theme_manager diff --git a/openlp/core/lib/settingsmanager.py b/openlp/core/lib/settingsmanager.py index fbc639ba6..472c66e23 100644 --- a/openlp/core/lib/settingsmanager.py +++ b/openlp/core/lib/settingsmanager.py @@ -37,8 +37,8 @@ from openlp.core.utils import AppLocation class SettingsManager(object): """ - Class to control the initial settings for the UI and provide helper - functions for the loading and saving of application settings. + Class to provide helper functions for the loading and saving of application + settings. """ @staticmethod From 1e0ef1ecb8be79248e8496fcffb4a57efe3937a4 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 9 May 2011 10:15:59 +0200 Subject: [PATCH 11/33] clean up --- openlp.pyw | 2 +- openlp/core/ui/screen.py | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/openlp.pyw b/openlp.pyw index 3badf1701..76d334bae 100755 --- a/openlp.pyw +++ b/openlp.pyw @@ -97,7 +97,7 @@ class OpenLP(QtGui.QApplication): QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'cursor_normal'), self.setNormalCursor) # Decide how many screens we have and their size - screens = ScreenList.get_instance(self.desktop()) + screens = ScreenList(self.desktop()) # First time checks in settings has_run_wizard = QtCore.QSettings().value( u'general/has run wizard', QtCore.QVariant(False)).toBool() diff --git a/openlp/core/ui/screen.py b/openlp/core/ui/screen.py index 88d8b2b64..2186a221e 100644 --- a/openlp/core/ui/screen.py +++ b/openlp/core/ui/screen.py @@ -46,9 +46,7 @@ class ScreenList(object): instance = None @staticmethod - def get_instance(desktop=None): - if desktop is not None and ScreenList.instance is None: - ScreenList.instance = ScreenList(desktop) + def get_instance(): return ScreenList.instance def __init__(self, desktop): @@ -58,6 +56,7 @@ class ScreenList(object): ``desktop`` A ``QDesktopWidget`` object. """ + ScreenList.instance = self self.desktop = desktop self.preview = None self.current = None From 34e0355921f22504687359899cee9711c799e3b5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Mon, 9 May 2011 13:41:12 +0200 Subject: [PATCH 12/33] removed debug line --- openlp/core/ui/maindisplay.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index bb890124a..8af061f2b 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -93,7 +93,6 @@ class MainDisplay(QtGui.QGraphicsView): self.videoWidget.setVisible(False) self.videoWidget.setGeometry(QtCore.QRect(0, 0, self.screen[u'size'].width(), self.screen[u'size'].height())) - log.debug(u'Setup Phonon') if self.isLive: if not self.firstTime: self.createMediaObject() From 78c3c3ef393b69e1158db48b2adffd48581a9cb1 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Tue, 10 May 2011 16:08:11 +0200 Subject: [PATCH 13/33] clean up --- openlp/plugins/songs/lib/foilpresenterimport.py | 4 ++-- openlp/plugins/songs/lib/songshowplusimport.py | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/openlp/plugins/songs/lib/foilpresenterimport.py b/openlp/plugins/songs/lib/foilpresenterimport.py index 0c7152bfd..c5dfd5d96 100644 --- a/openlp/plugins/songs/lib/foilpresenterimport.py +++ b/openlp/plugins/songs/lib/foilpresenterimport.py @@ -431,7 +431,7 @@ class FoilPresenter(object): verse_sortnr = self._child(strophe.sortnr) sortnr = True # In older Version there is no sortnr, but we need one - if sortnr == False: + if not sortnr: verse_sortnr = unicode(temp_sortnr_backup) temp_sortnr_backup += 1 # Foilpresenter allows e. g. "Ref" or "1", but we need "C1" or "V1". @@ -467,7 +467,7 @@ class FoilPresenter(object): # test if foilpresenter have the same versenumber two times with # different parts raise the verse number for value in temp_verse_order_backup: - if value == (u''.join((verse_type, verse_number))): + if value == u''.join((verse_type, verse_number)): verse_number = unicode(int(verse_number) + 1) verse_type_index = VerseType.from_tag(verse_type[0]) verse_type = VerseType.Names[verse_type_index] diff --git a/openlp/plugins/songs/lib/songshowplusimport.py b/openlp/plugins/songs/lib/songshowplusimport.py index 6d2e1f5b6..ac06d7840 100644 --- a/openlp/plugins/songs/lib/songshowplusimport.py +++ b/openlp/plugins/songs/lib/songshowplusimport.py @@ -150,13 +150,13 @@ class SongShowPlusImport(SongImport): self.ccli_number = int(data) elif blockKey == VERSE: self.add_verse(unicode(data, u'cp1252'), - "V%s" % verseNo) + "%s%s" % (VerseType.Tags[VerseType.Verse], verseNo)) elif blockKey == CHORUS: self.add_verse(unicode(data, u'cp1252'), - "C%s" % verseNo) + "%s%s" % (VerseType.Tags[VerseType.Chorus], verseNo)) elif blockKey == BRIDGE: self.add_verse(unicode(data, u'cp1252'), - "B%s" % verseNo) + "%s%s" % (VerseType.Tags[VerseType.Bridge], verseNo)) elif blockKey == TOPIC: self.topics.append(unicode(data, u'cp1252')) elif blockKey == COMMENTS: From c0df166105aa592163041c045dca70d24d127e38 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Wed, 11 May 2011 20:38:26 +0200 Subject: [PATCH 14/33] removed bug/feature which resets the values in the spin box --- openlp/core/ui/generaltab.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index 91999d05b..bd6a8e373 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -178,8 +178,7 @@ class GeneralTab(SettingsTab): QtCore.QObject.connect(self.customXValueEdit, QtCore.SIGNAL(u'valueChanged(int)'), self.onDisplayChanged) QtCore.QObject.connect(self.monitorComboBox, - QtCore.SIGNAL(u'currentIndexChanged(int)'), - self.onMonitorComboBoxChanged) + QtCore.SIGNAL(u'currentIndexChanged(int)'), self.onDisplayChanged) # Reload the tab, as the screen resolution/count may have changed. QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'config_screen_changed'), self.load) @@ -378,16 +377,3 @@ class GeneralTab(SettingsTab): Called when the width, height, x position or y position has changed. """ self.display_changed = True - - def onMonitorComboBoxChanged(self, index): - """ - The ``monitorComboBox`` has changed to the given ``index``. - """ - self.display_changed = True - if self.overrideCheckBox.isChecked(): - return - screen = self.screens.screen_list[index] - self.customXValueEdit.setValue(screen[u'size'].x()) - self.customYValueEdit.setValue(screen[u'size'].y()) - self.customHeightValueEdit.setValue(screen[u'size'].height()) - self.customWidthValueEdit.setValue(screen[u'size'].width()) From 3e1bdc7475f98e72207e2056a85e7a3f95800919 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Wed, 11 May 2011 23:32:25 +0100 Subject: [PATCH 15/33] More stageview changes --- openlp/core/lib/renderer.py | 4 +-- openlp/core/lib/serviceitem.py | 2 ++ openlp/plugins/remotes/html/stage.css | 6 ++-- openlp/plugins/remotes/html/stage.js | 37 ++++++++++++++++++------ openlp/plugins/remotes/lib/httpserver.py | 9 +++--- 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index bba85d176..98ae877b2 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -189,10 +189,10 @@ class Renderer(object): serviceItem.theme = theme_data if self.force_page: # make big page for theme edit dialog to get line count - serviceItem.add_from_text(u'', VERSE + VERSE + VERSE, FOOTER) + serviceItem.add_from_text(u'', VERSE + VERSE + VERSE) else: self.image_manager.del_image(theme_data.theme_name) - serviceItem.add_from_text(u'', VERSE, FOOTER) + serviceItem.add_from_text(u'', VERSE) serviceItem.renderer = self serviceItem.raw_footer = FOOTER serviceItem.render(True) diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index c1ae95b8b..95702f229 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -219,6 +219,8 @@ class ServiceItem(object): ``raw_slide`` The raw text of the slide. """ + if verse_tag: + verse_tag = verse_tag.upper() self.service_item_type = ServiceItemType.Text title = title.split(u'\n')[0] self._raw_frames.append( diff --git a/openlp/plugins/remotes/html/stage.css b/openlp/plugins/remotes/html/stage.css index a773c2393..73551b92e 100644 --- a/openlp/plugins/remotes/html/stage.css +++ b/openlp/plugins/remotes/html/stage.css @@ -30,12 +30,14 @@ body { #currentslide { font-size: 40pt; color: white; + padding-bottom: 0px; } #nextslide { - font-size: 30pt; + font-size: 40pt; color: grey; - padding-top: 25px; + padding-top: 0px; + padding-bottom: 0px; } #right { diff --git a/openlp/plugins/remotes/html/stage.js b/openlp/plugins/remotes/html/stage.js index 96e4c5a14..0c1c0ce63 100644 --- a/openlp/plugins/remotes/html/stage.js +++ b/openlp/plugins/remotes/html/stage.js @@ -46,15 +46,21 @@ window.OpenLP = { function (data, status) { OpenLP.currentSlides = data.results.slides; OpenLP.currentSlide = 0; + OpenLP.currentTags = Array(); var div = $("#verseorder"); div.html(""); + var tag = ""; + var tags = 0; for (idx in data.results.slides) { idx = parseInt(idx, 10); - div.append(" "); - var tag = data.results.slides[idx]["tag"]; - if (tag == 'None') - tag = idx; - $("#verseorder span").last().attr("id", "tag" + idx).text(tag); + var prevtag = tag; + tag = data.results.slides[idx]["tag"]; + if (tag != prevtag) { + tags = tags + 1; + div.append(" "); + $("#verseorder span").last().attr("id", "tag" + tags).text(tag); + } + OpenLP.currentTags[idx] = tags; if (data.results.slides[idx]["selected"]) OpenLP.currentSlide = idx; } @@ -64,17 +70,30 @@ window.OpenLP = { }, updateSlide: function() { $("#verseorder span").removeClass("currenttag"); - $("#tag" + OpenLP.currentSlide).addClass("currenttag"); - var text = OpenLP.currentSlides[OpenLP.currentSlide]["text"]; + $("#tag" + OpenLP.currentTags[OpenLP.currentSlide]).addClass("currenttag"); + var slide = OpenLP.currentSlides[OpenLP.currentSlide]; + var text = slide["text"]; text = text.replace(/\n/g, '
'); $("#currentslide").html(text); + text = ""; if (OpenLP.currentSlide < OpenLP.currentSlides.length - 1) { - text = OpenLP.currentSlides[OpenLP.currentSlide + 1]["text"]; + for (var idx = OpenLP.currentSlide + 1; idx < OpenLP.currentSlides.length; idx++) { + var prevslide = slide; + slide = OpenLP.currentSlides[idx]; + if (slide["tag"] != prevslide["tag"]) + text = text + '

'; + text = text + slide["text"]; + if (slide["tag"] != prevslide["tag"]) + text = text + '

'; + else + text = text + '
'; + } text = text.replace(/\n/g, '
'); $("#nextslide").html(text); } else - $("#nextslide").html("Next: " + OpenLP.nextSong); + text = '

Next: ' + OpenLP.nextSong + '

'; + $("#nextslide").html(text); }, updateClock: function() { var div = $("#clock"); diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 790175965..6e5c2c0b6 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -115,7 +115,6 @@ import os import urlparse import re from pprint import pformat -from lxml import html try: import json @@ -402,9 +401,11 @@ class HttpConnection(object): for index, frame in enumerate(current_item.get_frames()): item = {} if current_item.is_text(): - item[u'tag'] = unicode(frame[u'verseTag']) - text = unicode(frame[u'html'].replace('
', '\n')) - item[u'text'] = html.fromstring(text).text_content() + if frame[u'verseTag']: + item[u'tag'] = unicode(frame[u'verseTag']) + else: + item[u'tag'] = unicode(index) + item[u'text'] = unicode(frame[u'text']) item[u'html'] = unicode(frame[u'html']) else: item[u'tag'] = unicode(index) From e940279b34c792480d15658370eb495a8ab52eb2 Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Thu, 12 May 2011 00:16:53 +0100 Subject: [PATCH 16/33] More stageview changes --- openlp/core/ui/slidecontroller.py | 2 +- openlp/plugins/remotes/lib/httpserver.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index fdbf184b5..7623faa9b 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -616,7 +616,7 @@ class SlideController(QtGui.QWidget): if frame[u'verseTag']: # These tags are already translated. verse_def = frame[u'verseTag'] - verse_def = u'%s%s' % (verse_def[0].upper(), verse_def[1:]) + verse_def = u'%s%s' % (verse_def[0], verse_def[1:]) two_line_def = u'%s\n%s' % (verse_def[0], verse_def[1:]) row = two_line_def if self.isLive: diff --git a/openlp/plugins/remotes/lib/httpserver.py b/openlp/plugins/remotes/lib/httpserver.py index 6e5c2c0b6..20005840c 100644 --- a/openlp/plugins/remotes/lib/httpserver.py +++ b/openlp/plugins/remotes/lib/httpserver.py @@ -404,11 +404,11 @@ class HttpConnection(object): if frame[u'verseTag']: item[u'tag'] = unicode(frame[u'verseTag']) else: - item[u'tag'] = unicode(index) + item[u'tag'] = unicode(index + 1) item[u'text'] = unicode(frame[u'text']) item[u'html'] = unicode(frame[u'html']) else: - item[u'tag'] = unicode(index) + item[u'tag'] = unicode(index + 1) item[u'text'] = u'' item[u'html'] = u'' item[u'selected'] = (self.parent.current_slide == index) From 5e954d86b69cf4c694f471fec0f105190187ce53 Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 12 May 2011 01:25:11 +0200 Subject: [PATCH 17/33] Changed from a QTabWidget to QTabBar, giving us resizeable tabs. --- openlp/plugins/bibles/lib/mediaitem.py | 119 ++++++++++++++----------- 1 file changed, 66 insertions(+), 53 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 461828d9e..d729399cf 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -74,6 +74,16 @@ class BibleMediaItem(MediaManagerItem): self.addToServiceItem = False def addSearchTab(self, prefix, name): + self.searchTabBar.addTab(name) + tab = QtGui.QWidget() + tab.setObjectName(prefix + u'Tab') + tab.setSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) + layout = QtGui.QGridLayout(tab) + layout.setObjectName(prefix + u'Layout') + setattr(self, prefix + u'Tab', tab) + setattr(self, prefix + u'Layout', layout) + + def addSearchFields(self, prefix, name): """ Creates and adds generic search tab. @@ -83,121 +93,113 @@ class BibleMediaItem(MediaManagerItem): ``name`` The translated string to display. """ - tab = QtGui.QWidget() - tab.setObjectName(prefix + u'Tab') - layout = QtGui.QGridLayout(tab) - layout.setObjectName(prefix + u'Layout') + if prefix == u'quick': + idx = 2 + else: + idx = 5 + tab = getattr(self, prefix + u'Tab') + layout = getattr(self, prefix + u'Layout') versionLabel = QtGui.QLabel(tab) versionLabel.setObjectName(prefix + u'VersionLabel') - layout.addWidget(versionLabel, 0, 0, QtCore.Qt.AlignRight) - versionComboBox = media_item_combo_box(tab, prefix + u'VersionComboBox') + layout.addWidget(versionLabel, idx, 0, QtCore.Qt.AlignRight) + versionComboBox = media_item_combo_box(tab, + prefix + u'VersionComboBox') versionLabel.setBuddy(versionComboBox) - layout.addWidget(versionComboBox, 0, 1, 1, 2) + layout.addWidget(versionComboBox, idx, 1, 1, 2) secondLabel = QtGui.QLabel(tab) secondLabel.setObjectName(prefix + u'SecondLabel') - layout.addWidget(secondLabel, 1, 0, QtCore.Qt.AlignRight) + layout.addWidget(secondLabel, idx + 1, 0, QtCore.Qt.AlignRight) secondComboBox = media_item_combo_box(tab, prefix + u'SecondComboBox') versionLabel.setBuddy(secondComboBox) - layout.addWidget(secondComboBox, 1, 1, 1, 2) + layout.addWidget(secondComboBox, idx + 1, 1, 1, 2) + clearLabel = QtGui.QLabel(tab) + clearLabel.setObjectName(prefix + u'ClearLabel') + layout.addWidget(clearLabel, idx + 2, 0, QtCore.Qt.AlignRight) + clearComboBox = media_item_combo_box(tab, prefix + u'ClearComboBox') + clearLabel.setBuddy(clearComboBox) + layout.addWidget(clearComboBox, idx + 2, 1, 1, 2) searchButtonLayout = QtGui.QHBoxLayout() searchButtonLayout.setObjectName(prefix + u'SearchButtonLayout') searchButtonLayout.addStretch() searchButton = QtGui.QPushButton(tab) searchButton.setObjectName(prefix + u'SearchButton') searchButtonLayout.addWidget(searchButton) - self.searchTabWidget.addTab(tab, name) - setattr(self, prefix + u'Tab', tab) - setattr(self, prefix + u'Layout', layout) + layout.addLayout(searchButtonLayout, idx + 3, 1, 1, 2) + self.pageLayout.addWidget(tab) + tab.setVisible(False) setattr(self, prefix + u'VersionLabel', versionLabel) setattr(self, prefix + u'VersionComboBox', versionComboBox) setattr(self, prefix + u'SecondLabel', secondLabel) setattr(self, prefix + u'SecondComboBox', secondComboBox) + setattr(self, prefix + u'ClearLabel', clearLabel) + setattr(self, prefix + u'ClearComboBox', clearComboBox) setattr(self, prefix + u'SearchButtonLayout', searchButtonLayout) setattr(self, prefix + u'SearchButton', searchButton) def addEndHeaderBar(self): - self.searchTabWidget = QtGui.QTabWidget(self) - self.searchTabWidget.setSizePolicy( - QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) - self.searchTabWidget.setObjectName(u'searchTabWidget') + self.searchTabBar = QtGui.QTabBar(self) + self.searchTabBar.setExpanding(False) + self.searchTabBar.setObjectName(u'searchTabBar') + self.pageLayout.addWidget(self.searchTabBar) # Add the Quick Search tab. self.addSearchTab( u'quick', translate('BiblesPlugin.MediaItem', 'Quick')) self.quickSearchLabel = QtGui.QLabel(self.quickTab) self.quickSearchLabel.setObjectName(u'quickSearchLabel') self.quickLayout.addWidget( - self.quickSearchLabel, 2, 0, QtCore.Qt.AlignRight) + self.quickSearchLabel, 0, 0, QtCore.Qt.AlignRight) self.quickSearchEdit = SearchEdit(self.quickTab) self.quickSearchEdit.setObjectName(u'quickSearchEdit') self.quickSearchLabel.setBuddy(self.quickSearchEdit) - self.quickLayout.addWidget(self.quickSearchEdit, 2, 1, 1, 2) + self.quickLayout.addWidget(self.quickSearchEdit, 0, 1, 1, 2) self.quickLayoutLabel = QtGui.QLabel(self.quickTab) self.quickLayoutLabel.setObjectName(u'quickClearLabel') self.quickLayout.addWidget( - self.quickLayoutLabel, 3, 0, QtCore.Qt.AlignRight) + self.quickLayoutLabel, 1, 0, QtCore.Qt.AlignRight) self.quickLayoutComboBox = media_item_combo_box(self.quickTab, u'quickLayoutComboBox') self.quickLayoutComboBox.addItems([u'', u'', u'']) - self.quickLayout.addWidget(self.quickLayoutComboBox, 3, 1, 1, 2) - self.quickClearLabel = QtGui.QLabel(self.quickTab) - self.quickClearLabel.setObjectName(u'quickClearLabel') - self.quickLayout.addWidget( - self.quickClearLabel, 4, 0, QtCore.Qt.AlignRight) - self.quickClearComboBox = media_item_combo_box(self.quickTab, - u'quickClearComboBox') - self.quickLayout.addWidget(self.quickClearComboBox, 4, 1, 1, 2) - self.quickLayout.addLayout(self.quickSearchButtonLayout, 6, 1, 1, 2) - # Add a QWidget, so that the quick tab has as many rows as the advanced - # tab. - self.quickLayout.addWidget(QtGui.QWidget(), 7, 0) + self.quickLayout.addWidget(self.quickLayoutComboBox, 1, 1, 1, 2) + self.addSearchFields( + u'quick', translate('BiblesPlugin.MediaItem', 'Quick')) + self.quickTab.setVisible(True) # Add the Advanced Search tab. self.addSearchTab(u'advanced', UiStrings().Advanced) self.advancedBookLabel = QtGui.QLabel(self.advancedTab) self.advancedBookLabel.setObjectName(u'advancedBookLabel') - self.advancedLayout.addWidget(self.advancedBookLabel, 2, 0, + self.advancedLayout.addWidget(self.advancedBookLabel, 0, 0, QtCore.Qt.AlignRight) self.advancedBookComboBox = media_item_combo_box(self.advancedTab, u'advancedBookComboBox') self.advancedBookLabel.setBuddy(self.advancedBookComboBox) - self.advancedLayout.addWidget(self.advancedBookComboBox, 2, 1, 1, 2) + self.advancedLayout.addWidget(self.advancedBookComboBox, 0, 1, 1, 2) self.advancedChapterLabel = QtGui.QLabel(self.advancedTab) self.advancedChapterLabel.setObjectName(u'advancedChapterLabel') - self.advancedLayout.addWidget(self.advancedChapterLabel, 3, 1, 1, 2) + self.advancedLayout.addWidget(self.advancedChapterLabel, 1, 1, 1, 2) self.advancedVerseLabel = QtGui.QLabel(self.advancedTab) self.advancedVerseLabel.setObjectName(u'advancedVerseLabel') - self.advancedLayout.addWidget(self.advancedVerseLabel, 3, 2) + self.advancedLayout.addWidget(self.advancedVerseLabel, 1, 2) self.advancedFromLabel = QtGui.QLabel(self.advancedTab) self.advancedFromLabel.setObjectName(u'advancedFromLabel') - self.advancedLayout.addWidget(self.advancedFromLabel, 4, 0, + self.advancedLayout.addWidget(self.advancedFromLabel, 3, 0, QtCore.Qt.AlignRight) self.advancedFromChapter = QtGui.QComboBox(self.advancedTab) self.advancedFromChapter.setObjectName(u'advancedFromChapter') - self.advancedLayout.addWidget(self.advancedFromChapter, 4, 1) + self.advancedLayout.addWidget(self.advancedFromChapter, 3, 1) self.advancedFromVerse = QtGui.QComboBox(self.advancedTab) self.advancedFromVerse.setObjectName(u'advancedFromVerse') - self.advancedLayout.addWidget(self.advancedFromVerse, 4, 2) + self.advancedLayout.addWidget(self.advancedFromVerse, 3, 2) self.advancedToLabel = QtGui.QLabel(self.advancedTab) self.advancedToLabel.setObjectName(u'advancedToLabel') - self.advancedLayout.addWidget(self.advancedToLabel, 5, 0, + self.advancedLayout.addWidget(self.advancedToLabel, 4, 0, QtCore.Qt.AlignRight) self.advancedToChapter = QtGui.QComboBox(self.advancedTab) self.advancedToChapter.setObjectName(u'advancedToChapter') - self.advancedLayout.addWidget(self.advancedToChapter, 5, 1) + self.advancedLayout.addWidget(self.advancedToChapter, 4, 1) self.advancedToVerse = QtGui.QComboBox(self.advancedTab) self.advancedToVerse.setObjectName(u'advancedToVerse') - self.advancedLayout.addWidget(self.advancedToVerse, 5, 2) - self.advancedClearLabel = QtGui.QLabel(self.quickTab) - self.advancedClearLabel.setObjectName(u'advancedClearLabel') - self.advancedLayout.addWidget(self.advancedClearLabel, 6, 0, - QtCore.Qt.AlignRight) - self.advancedClearComboBox = media_item_combo_box(self.quickTab, - u'advancedClearComboBox') - self.advancedClearLabel.setBuddy(self.advancedClearComboBox) - self.advancedLayout.addWidget(self.advancedClearComboBox, 6, 1, 1, 2) - self.advancedLayout.addLayout( - self.advancedSearchButtonLayout, 7, 0, 1, 3) - # Add the search tab widget to the page layout. - self.pageLayout.addWidget(self.searchTabWidget) + self.advancedLayout.addWidget(self.advancedToVerse, 4, 2) + self.addSearchFields(u'advanced', UiStrings().Advanced) # Combo Boxes QtCore.QObject.connect(self.advancedVersionComboBox, QtCore.SIGNAL(u'activated(int)'), self.onAdvancedVersionComboBox) @@ -226,6 +228,9 @@ class BibleMediaItem(MediaManagerItem): # Other stuff QtCore.QObject.connect(self.quickSearchEdit, QtCore.SIGNAL(u'returnPressed()'), self.onQuickSearchButton) + QtCore.QObject.connect(self.searchTabBar, + QtCore.SIGNAL(u'currentChanged(int)'), + self.onSearchTabBarCurrentChanged) def configUpdated(self): log.debug(u'configUpdated') @@ -312,6 +317,14 @@ class BibleMediaItem(MediaManagerItem): if self.import_wizard.exec_(): self.reloadBibles() + def onSearchTabBarCurrentChanged(self, index): + if index == 0: + self.advancedTab.setVisible(False) + self.quickTab.setVisible(True) + else: + self.quickTab.setVisible(False) + self.advancedTab.setVisible(True) + def loadBibles(self): log.debug(u'Loading Bibles') self.quickVersionComboBox.clear() From e55e9f284a5bf78e68bf16d00855b89bcff932ec Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 12 May 2011 01:59:04 +0200 Subject: [PATCH 18/33] Dropped the results dropdowns in favour of a toggle button. --- openlp/plugins/bibles/lib/mediaitem.py | 46 +++++++++++++------------- resources/images/openlp-2.qrc | 2 ++ 2 files changed, 25 insertions(+), 23 deletions(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index d729399cf..9f3a97a0b 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -55,6 +55,8 @@ class BibleMediaItem(MediaManagerItem): def __init__(self, parent, plugin, icon): self.IconPath = u'songs/song' + self.lockIcon = QtGui.QIcon(u':/bibles/bibles_search_lock.png') + self.unlockIcon = QtGui.QIcon(u':/bibles/bibles_search_unlock.png') MediaManagerItem.__init__(self, parent, plugin, icon) # Place to store the search results for both bibles. self.settings = self.parent.settings_tab @@ -112,27 +114,27 @@ class BibleMediaItem(MediaManagerItem): secondComboBox = media_item_combo_box(tab, prefix + u'SecondComboBox') versionLabel.setBuddy(secondComboBox) layout.addWidget(secondComboBox, idx + 1, 1, 1, 2) - clearLabel = QtGui.QLabel(tab) - clearLabel.setObjectName(prefix + u'ClearLabel') - layout.addWidget(clearLabel, idx + 2, 0, QtCore.Qt.AlignRight) - clearComboBox = media_item_combo_box(tab, prefix + u'ClearComboBox') - clearLabel.setBuddy(clearComboBox) - layout.addWidget(clearComboBox, idx + 2, 1, 1, 2) searchButtonLayout = QtGui.QHBoxLayout() searchButtonLayout.setObjectName(prefix + u'SearchButtonLayout') searchButtonLayout.addStretch() + lockButton = QtGui.QToolButton(tab) + lockButton.setIcon(self.unlockIcon) + lockButton.setCheckable(True) + lockButton.setObjectName(prefix + u'LockButton') + searchButtonLayout.addWidget(lockButton) searchButton = QtGui.QPushButton(tab) searchButton.setObjectName(prefix + u'SearchButton') searchButtonLayout.addWidget(searchButton) - layout.addLayout(searchButtonLayout, idx + 3, 1, 1, 2) + layout.addLayout(searchButtonLayout, idx + 2, 1, 1, 2) self.pageLayout.addWidget(tab) tab.setVisible(False) + QtCore.QObject.connect(lockButton, QtCore.SIGNAL(u'toggled(bool)'), + self.onLockButtonToggled) setattr(self, prefix + u'VersionLabel', versionLabel) setattr(self, prefix + u'VersionComboBox', versionComboBox) setattr(self, prefix + u'SecondLabel', secondLabel) setattr(self, prefix + u'SecondComboBox', secondComboBox) - setattr(self, prefix + u'ClearLabel', clearLabel) - setattr(self, prefix + u'ClearComboBox', clearComboBox) + setattr(self, prefix + u'LockButton', lockButton) setattr(self, prefix + u'SearchButtonLayout', searchButtonLayout) setattr(self, prefix + u'SearchButton', searchButton) @@ -255,8 +257,8 @@ class BibleMediaItem(MediaManagerItem): self.quickSearchLabel.setText( translate('BiblesPlugin.MediaItem', 'Find:')) self.quickSearchButton.setText(UiStrings().Search) - self.quickClearLabel.setText( - translate('BiblesPlugin.MediaItem', 'Results:')) + self.quickLockButton.setToolTip(translate('BiblesPlugin.MediaItem', + 'Toggle to keep or clear the previous results')) self.advancedVersionLabel.setText(u'%s:' % UiStrings().Version) self.advancedSecondLabel.setText( translate('BiblesPlugin.MediaItem', 'Second:')) @@ -270,17 +272,9 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'From:')) self.advancedToLabel.setText( translate('BiblesPlugin.MediaItem', 'To:')) - self.advancedClearLabel.setText( - translate('BiblesPlugin.MediaItem', 'Results:')) self.advancedSearchButton.setText(UiStrings().Search) - self.quickClearComboBox.addItem( - translate('BiblesPlugin.MediaItem', 'Clear')) - self.quickClearComboBox.addItem( - translate('BiblesPlugin.MediaItem', 'Keep')) - self.advancedClearComboBox.addItem( - translate('BiblesPlugin.MediaItem', 'Clear')) - self.advancedClearComboBox.addItem( - translate('BiblesPlugin.MediaItem', 'Keep')) + self.advancedLockButton.setToolTip(translate('BiblesPlugin.MediaItem', + 'Toggle to keep or clear the previous results')) self.quickLayoutLabel.setText(UiStrings().LayoutStyle) self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide) @@ -325,6 +319,12 @@ class BibleMediaItem(MediaManagerItem): self.quickTab.setVisible(False) self.advancedTab.setVisible(True) + def onLockButtonToggled(self, checked): + if checked: + self.sender().setIcon(self.lockIcon) + else: + self.sender().setIcon(self.unlockIcon) + def loadBibles(self): log.debug(u'Loading Bibles') self.quickVersionComboBox.clear() @@ -530,7 +530,7 @@ class BibleMediaItem(MediaManagerItem): if second_bible: self.second_search_results = self.parent.manager.get_verses( second_bible, versetext) - if self.advancedClearComboBox.currentIndex() == 0: + if not self.advancedLockButton.isChecked(): self.listView.clear() if self.listView.count() != 0: self.__checkSecondBible(bible, second_bible) @@ -571,7 +571,7 @@ class BibleMediaItem(MediaManagerItem): verse.verse)) self.second_search_results = \ bibles[second_bible].get_verses(text) - if self.quickClearComboBox.currentIndex() == 0: + if not self.quickLockButton.isChecked(): self.listView.clear() if self.listView.count() != 0 and self.search_results: self.__checkSecondBible(bible, second_bible) diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc index 364a75810..a32d15940 100644 --- a/resources/images/openlp-2.qrc +++ b/resources/images/openlp-2.qrc @@ -24,6 +24,8 @@ bibles_search_text.png bibles_search_reference.png + bibles_search_unlock.png + bibles_search_lock.png plugin_alerts.png From cfb7e0be1aceda9963d601034abd5b42f5b7d7ed Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Thu, 12 May 2011 01:59:37 +0200 Subject: [PATCH 19/33] Added the missing images. --- resources/images/bibles_search_lock.png | Bin 0 -> 452 bytes resources/images/bibles_search_unlock.png | Bin 0 -> 440 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/images/bibles_search_lock.png create mode 100644 resources/images/bibles_search_unlock.png diff --git a/resources/images/bibles_search_lock.png b/resources/images/bibles_search_lock.png new file mode 100644 index 0000000000000000000000000000000000000000..ac2fd6f90f473f0e497f9ec65e01b26e8fcbc1e4 GIT binary patch literal 452 zcmV;#0XzPQP){*xqu6zo97u8y1ZJ6plT?@BQ4ok{ z+TdZhC=vE=s3yPtE(pTv`m^2X6qh6^;cz(S^xkLL z&o;NmD#TR4R~VS);WMLje^R3O!hz^@Kh)i9`%foV1%w+4~N55nzQfvtjFUy&15ol zJ!2#oB>{Mz*BamI^ZDd-It@MZtw0pTVxvG11UZ#T84D7^G_I5}oJWRnxZ00xZx^Co z8#WQ`#K^LN3SNTc+x1dZRgv)F~$k_|^fFLKc#)GiFZk*b-n u5N$*!(L?kT14JLuO<0LmqJ?PE_q_mVmxN%}APaE-0000#GNQ#XgniT2Vo?-i9TY0a1g_U iov;yRqKoKkeyR`IorwpbwM(D?0000 Date: Thu, 12 May 2011 13:55:53 +0200 Subject: [PATCH 20/33] Fixed a missing full stop in a tool tip. --- openlp/plugins/bibles/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 9f3a97a0b..b6085ea1e 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -274,7 +274,7 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'To:')) self.advancedSearchButton.setText(UiStrings().Search) self.advancedLockButton.setToolTip(translate('BiblesPlugin.MediaItem', - 'Toggle to keep or clear the previous results')) + 'Toggle to keep or clear the previous results.')) self.quickLayoutLabel.setText(UiStrings().LayoutStyle) self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerSlide, UiStrings().VersePerSlide) From 4778bfd781e9765cf18555244e288f715574bf78 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 12 May 2011 17:44:20 +0200 Subject: [PATCH 22/33] disable drops for search edit --- openlp/core/lib/searchedit.py | 1 + 1 file changed, 1 insertion(+) diff --git a/openlp/core/lib/searchedit.py b/openlp/core/lib/searchedit.py index b524855ba..fc007227e 100644 --- a/openlp/core/lib/searchedit.py +++ b/openlp/core/lib/searchedit.py @@ -62,6 +62,7 @@ class SearchEdit(QtGui.QLineEdit): self._onSearchEditTextChanged ) self._updateStyleSheet() + self.setAcceptDrops(False) def _updateStyleSheet(self): """ From 4e870ed705987481e11bfe62c511a1744b98a8e5 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Thu, 12 May 2011 17:50:20 +0200 Subject: [PATCH 23/33] only allow drag if an item is selected --- openlp/core/lib/listwidgetwithdnd.py | 3 +++ openlp/core/ui/servicemanager.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/openlp/core/lib/listwidgetwithdnd.py b/openlp/core/lib/listwidgetwithdnd.py index c45b4cc9d..2419d1a35 100644 --- a/openlp/core/lib/listwidgetwithdnd.py +++ b/openlp/core/lib/listwidgetwithdnd.py @@ -49,6 +49,9 @@ class ListWidgetWithDnD(QtGui.QListWidget): if event.buttons() != QtCore.Qt.LeftButton: event.ignore() return + if not self.selectedItems(): + event.ignore() + return drag = QtGui.QDrag(self) mimeData = QtCore.QMimeData() drag.setMimeData(mimeData) diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index b5e8bbc54..9031a0b1a 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -73,6 +73,9 @@ class ServiceManagerList(QtGui.QTreeWidget): if event.buttons() != QtCore.Qt.LeftButton: event.ignore() return + if not self.selectedItems(): + event.ignore() + return drag = QtGui.QDrag(self) mimeData = QtCore.QMimeData() drag.setMimeData(mimeData) From ef5c4bc7d413369cc771b9325a4be285f86cd89a Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Thu, 12 May 2011 22:55:45 +0100 Subject: [PATCH 24/33] Detect repeat verses --- openlp/plugins/remotes/html/stage.js | 47 +++++++++++++++++++++------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/openlp/plugins/remotes/html/stage.js b/openlp/plugins/remotes/html/stage.js index 0c1c0ce63..8ca041366 100644 --- a/openlp/plugins/remotes/html/stage.js +++ b/openlp/plugins/remotes/html/stage.js @@ -51,24 +51,50 @@ window.OpenLP = { div.html(""); var tag = ""; var tags = 0; - for (idx in data.results.slides) { - idx = parseInt(idx, 10); + var lastChange = 0; + $.each(data.results.slides, function(idx, slide) { var prevtag = tag; - tag = data.results.slides[idx]["tag"]; + tag = slide["tag"]; if (tag != prevtag) { + // If the tag has changed, add new one to the list + lastChange = idx; tags = tags + 1; div.append(" "); $("#verseorder span").last().attr("id", "tag" + tags).text(tag); } + else { + if ((slide["text"] == data.results.slides[lastChange]["text"]) && + (data.results.slides.length > idx + (idx - lastChange))) { + // If the tag hasn't changed, check to see if the same verse + // has been repeated consecutively. Note the verse may have been + // split over several slides, so search through. If so, repeat the tag. + var match = true; + for (var idx2 = 0; idx2 < idx - lastChange; idx2++) { + if(data.results.slides[lastChange + idx2]["text"] != data.results.slides[idx + idx2]["text"]) { + match = false; + break; + } + } + if (match) { + lastChange = idx; + tags = tags + 1; + div.append(" "); + $("#verseorder span").last().attr("id", "tag" + tags).text(tag); + } + } + } OpenLP.currentTags[idx] = tags; - if (data.results.slides[idx]["selected"]) + if (slide["selected"]) OpenLP.currentSlide = idx; - } + }) OpenLP.loadService(); } ); }, updateSlide: function() { + // Show the current slide on top. Any trailing slides for the same verse + // are shown too underneath in grey. + // Then leave a blank line between following verses $("#verseorder span").removeClass("currenttag"); $("#tag" + OpenLP.currentTags[OpenLP.currentSlide]).addClass("currenttag"); var slide = OpenLP.currentSlides[OpenLP.currentSlide]; @@ -78,12 +104,10 @@ window.OpenLP = { text = ""; if (OpenLP.currentSlide < OpenLP.currentSlides.length - 1) { for (var idx = OpenLP.currentSlide + 1; idx < OpenLP.currentSlides.length; idx++) { - var prevslide = slide; - slide = OpenLP.currentSlides[idx]; - if (slide["tag"] != prevslide["tag"]) + if (OpenLP.currentTags[idx] != OpenLP.currentTags[idx - 1]) text = text + '

'; - text = text + slide["text"]; - if (slide["tag"] != prevslide["tag"]) + text = text + OpenLP.currentSlides[idx]["text"]; + if (OpenLP.currentTags[idx] != OpenLP.currentTags[idx - 1]) text = text + '

'; else text = text + '
'; @@ -91,9 +115,10 @@ window.OpenLP = { text = text.replace(/\n/g, '
'); $("#nextslide").html(text); } - else + else { text = '

Next: ' + OpenLP.nextSong + '

'; $("#nextslide").html(text); + } }, updateClock: function() { var div = $("#clock"); From be413a688c507863e2d9f20eb6d068480949e81a Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Thu, 12 May 2011 21:23:01 -0400 Subject: [PATCH 25/33] modified: resources/windows/OpenLP-2.0.iss scripts/windows-builder.py --- resources/windows/OpenLP-2.0.iss | 2 +- scripts/windows-builder.py | 38 ++++++++++++++++++++++++-------- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/resources/windows/OpenLP-2.0.iss b/resources/windows/OpenLP-2.0.iss index 8cc8a4aa7..9f193b0e8 100644 --- a/resources/windows/OpenLP-2.0.iss +++ b/resources/windows/OpenLP-2.0.iss @@ -69,7 +69,7 @@ Source: ..\..\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs [Icons] Name: {group}\{#AppName}; Filename: {app}\{#AppExeName} Name: {group}\{#AppName} (Debug); Filename: {app}\{#AppExeName}; Parameters: -l debug -Name: {group}\{#AppName} Help; Filename: {app}\{#AppName}.chm +Name: {group}\{#AppName} Help; Filename: {app}\{#AppName}.chm; Check: FileExists(ExpandConstant('{app}\{#AppName}.chm')) Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL} Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe} Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon diff --git a/scripts/windows-builder.py b/scripts/windows-builder.py index 0271f80b8..27798a850 100644 --- a/scripts/windows-builder.py +++ b/scripts/windows-builder.py @@ -53,7 +53,8 @@ UPX add that directory to your PATH environment variable. Sphinx - This is used to build the documentation + This is used to build the documentation. The documentation trunk must be at + the same directory level as Openlp trunk and named "documentation" HTML Help Workshop This is used to create the help file @@ -99,6 +100,7 @@ windows-builder.py import os import sys from shutil import copy +from shutil import rmtree from subprocess import Popen, PIPE python_exe = sys.executable @@ -108,12 +110,14 @@ sphinx_exe = os.path.join(os.path.split(python_exe)[0], u'Scripts', u'sphinx-build.exe') hhc_exe = os.path.join(os.getenv(u'PROGRAMFILES'), 'HTML Help Workshop', u'hhc.exe') -vcbuild_exe = os.path.join(os.getenv(u'PROGRAMFILES'), +vcbuild_exe = os.path.join(os.getenv(u'PROGRAMFILES'), u'Microsoft Visual Studio 9.0', u'VC', u'vcpackages', u'vcbuild.exe') # Base paths script_path = os.path.split(os.path.abspath(__file__))[0] branch_path = os.path.abspath(os.path.join(script_path, u'..')) +doc_branch_path = os.path.abspath(os.path.join(script_path, u'..', + u'..',u'documentation')) site_packages = os.path.join(os.path.split(python_exe)[0], u'Lib', u'site-packages') @@ -125,7 +129,9 @@ i18n_utils = os.path.join(script_path, u'translation_utils.py') # Paths source_path = os.path.join(branch_path, u'openlp') -manual_path = os.path.join(branch_path, u'documentation', u'manual') +manual_path = os.path.join(doc_branch_path, u'manual') +manual_build_path = os.path.join(manual_path, u'build') +helpfile_path = os.path.join(manual_build_path, u'htmlhelp') i18n_path = os.path.join(branch_path, u'resources', u'i18n') winres_path = os.path.join(branch_path, u'resources', u'windows') build_path = os.path.join(branch_path, u'build', u'pyi.win32', u'OpenLP') @@ -219,6 +225,12 @@ def copy_windows_files(): os.path.join(dist_path, u'OpenLP.ico')) copy(os.path.join(winres_path, u'LICENSE.txt'), os.path.join(dist_path, u'LICENSE.txt')) + if os.path.isfile(os.path.join(helpfile_path, u'Openlp.chm')): + print u' Windows help file found' + copy(os.path.join(helpfile_path,u'Openlp.chm'), + os.path.join(dist_path, u'Openlp.chm')) + else: + print u' WARNING ---- Windows help file not found ---- WARNING' def update_translations(): print u'Updating translations...' @@ -253,6 +265,9 @@ def compile_translations(): os.path.join(dist_path, u'i18n', filename)) def run_sphinx(): + print u'Deleting previous manual build...',manual_build_path + if os.path.exists(manual_build_path): + rmtree(manual_build_path) print u'Running Sphinx...' os.chdir(manual_path) sphinx = Popen((sphinx_exe, u'-b', u'htmlhelp', u'-d', u'build/doctrees', @@ -265,7 +280,7 @@ def run_sphinx(): def run_htmlhelp(): print u'Running HTML Help Workshop...' - os.chdir(os.path.join(manual_path, u'build', u'htmlhelp')) + os.chdir(os.path.join(manual_build_path, u'htmlhelp')) hhc = Popen((hhc_exe, u'OpenLP.chm'), stdout=PIPE) output, error = hhc.communicate() code = hhc.wait() @@ -273,9 +288,6 @@ def run_htmlhelp(): print u'Exit code:', code print output raise Exception(u'Error running HTML Help Workshop') - else: - copy(os.path.join(manual_path, u'build', 'htmlhelp', u'OpenLP.chm'), - os.path.join(dist_path, u'OpenLP.chm')) def run_innosetup(): print u'Running Inno Setup...' @@ -306,6 +318,8 @@ def main(): print "Source path:", source_path print "\"dist\" path:", dist_path print "PyInstaller:", pyi_build + print "Documentation branch path:", doc_branch_path + print "Help file build path;", helpfile_path print "Inno Setup path:", innosetup_exe print "Windows resources:", winres_path print "VCBuild path:", vcbuild_exe @@ -324,11 +338,17 @@ def main(): write_version_file() copy_enchant() copy_plugins() + if os.path.exists(manual_path): + run_sphinx() + run_htmlhelp() + else: + print u' ' + print u' WARNING ---- Documentation Trunk not found ---- WARNING' + print u' --- Windows Help file will not be included in build ---' + print u' ' copy_windows_files() update_translations() compile_translations() - run_sphinx() - run_htmlhelp() run_innosetup() print "Done." From a4fa470817ab76421433f6e7249aad5f9aad9d8d Mon Sep 17 00:00:00 2001 From: Stevan Pettit Date: Fri, 13 May 2011 07:45:41 -0400 Subject: [PATCH 26/33] modified: scripts/windows-builder.py --- scripts/windows-builder.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/windows-builder.py b/scripts/windows-builder.py index 27798a850..8f2dc0171 100644 --- a/scripts/windows-builder.py +++ b/scripts/windows-builder.py @@ -117,7 +117,7 @@ vcbuild_exe = os.path.join(os.getenv(u'PROGRAMFILES'), script_path = os.path.split(os.path.abspath(__file__))[0] branch_path = os.path.abspath(os.path.join(script_path, u'..')) doc_branch_path = os.path.abspath(os.path.join(script_path, u'..', - u'..',u'documentation')) + u'..', u'documentation')) site_packages = os.path.join(os.path.split(python_exe)[0], u'Lib', u'site-packages') @@ -227,7 +227,7 @@ def copy_windows_files(): os.path.join(dist_path, u'LICENSE.txt')) if os.path.isfile(os.path.join(helpfile_path, u'Openlp.chm')): print u' Windows help file found' - copy(os.path.join(helpfile_path,u'Openlp.chm'), + copy(os.path.join(helpfile_path, u'Openlp.chm'), os.path.join(dist_path, u'Openlp.chm')) else: print u' WARNING ---- Windows help file not found ---- WARNING' @@ -265,7 +265,7 @@ def compile_translations(): os.path.join(dist_path, u'i18n', filename)) def run_sphinx(): - print u'Deleting previous manual build...',manual_build_path + print u'Deleting previous manual build...', manual_build_path if os.path.exists(manual_build_path): rmtree(manual_build_path) print u'Running Sphinx...' From d4f7bf1e0a5b015913b03803e7843e10cdeddda8 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 13 May 2011 14:55:04 +0200 Subject: [PATCH 27/33] --- openlp/core/lib/mediamanageritem.py | 34 ++++++++++++++++++++--------- openlp/core/lib/ui.py | 2 ++ 2 files changed, 26 insertions(+), 10 deletions(-) diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index e5e8ed3b1..225d4023e 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -238,13 +238,21 @@ class MediaManagerItem(QtGui.QWidget): self.plugin.getString(action[0])[u'tooltip'], action[1], action[2]) + def contextMenu(self, point): + item = self.listView.itemAt(point) + if item is None: + return + if not item.flags() & QtCore.Qt.ItemIsSelectable: + return + self.menu.exec_(self.listView.mapToGlobal(point)) + def addListViewToToolBar(self): """ Creates the main widget for listing items the media item is tracking """ # Add the List widget self.listView = ListWidgetWithDnD(self, self.plugin.name) - self.listView.uniformItemSizes = True + self.listView.setUniformItemSizes(True) self.listView.setSpacing(1) self.listView.setSelectionMode( QtGui.QAbstractItemView.ExtendedSelection) @@ -254,43 +262,46 @@ class MediaManagerItem(QtGui.QWidget): # Add to pageLayout self.pageLayout.addWidget(self.listView) # define and add the context menu - self.listView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) + self.listView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) + self.menu = QtGui.QMenu() + # Create the actions. All actions are automatically added to the + # listView. if self.hasEditIcon: - self.listView.addAction( + self.menu.addAction( context_menu_action( self.listView, u':/general/general_edit.png', self.plugin.getString(StringContent.Edit)[u'title'], self.onEditClick, context=QtCore.Qt.WidgetShortcut)) - self.listView.addAction(context_menu_separator(self.listView)) + self.menu.addAction(context_menu_separator(self.listView)) if self.hasDeleteIcon: - self.listView.addAction( + self.menu.addAction( context_menu_action( self.listView, u':/general/general_delete.png', self.plugin.getString(StringContent.Delete)[u'title'], self.onDeleteClick, [QtCore.Qt.Key_Delete], context=QtCore.Qt.WidgetShortcut)) - self.listView.addAction(context_menu_separator(self.listView)) - self.listView.addAction( + self.menu.addAction(context_menu_separator(self.listView)) + self.menu.addAction( context_menu_action( self.listView, u':/general/general_preview.png', self.plugin.getString(StringContent.Preview)[u'title'], self.onPreviewClick, [QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return], context=QtCore.Qt.WidgetShortcut)) - self.listView.addAction( + self.menu.addAction( context_menu_action( self.listView, u':/general/general_live.png', self.plugin.getString(StringContent.Live)[u'title'], self.onLiveClick, [QtCore.Qt.ShiftModifier + \ QtCore.Qt.Key_Enter, QtCore.Qt.ShiftModifier + \ QtCore.Qt.Key_Return], context=QtCore.Qt.WidgetShortcut)) - self.listView.addAction( + self.menu.addAction( context_menu_action( self.listView, u':/general/general_add.png', self.plugin.getString(StringContent.Service)[u'title'], self.onAddClick, [QtCore.Qt.Key_Plus, QtCore.Qt.Key_Equal], context=QtCore.Qt.WidgetShortcut)) if self.addToServiceItem: - self.listView.addAction( + self.menu.addAction( context_menu_action( self.listView, u':/general/general_add.png', translate('OpenLP.MediaManagerItem', @@ -302,6 +313,9 @@ class MediaManagerItem(QtGui.QWidget): QtCore.QObject.connect(self.listView, QtCore.SIGNAL(u'itemSelectionChanged()'), self.onSelectionChange) + QtCore.QObject.connect(self.listView, + QtCore.SIGNAL('customContextMenuRequested(QPoint)'), + self.contextMenu) def initialise(self): """ diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index e8be32a92..3fdf9642d 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -364,6 +364,7 @@ def context_menu_action(base, icon, text, slot, shortcuts=None, category=None, action.setShortcutContext(context) action_list = ActionList.get_instance() action_list.add_action(action) + base.addAction(action) return action def context_menu(base, icon, text): @@ -392,6 +393,7 @@ def context_menu_separator(base): """ action = QtGui.QAction(u'', base) action.setSeparator(True) + base.addAction(action) return action def add_widget_completer(cache, widget): From 07b704677abd00283f7c3941e57a2edede9eccd4 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 13 May 2011 15:58:17 +0200 Subject: [PATCH 28/33] --- openlp/core/lib/ui.py | 6 +-- openlp/core/ui/servicemanager.py | 76 ++++++++++++++------------------ 2 files changed, 35 insertions(+), 47 deletions(-) diff --git a/openlp/core/lib/ui.py b/openlp/core/lib/ui.py index 3fdf9642d..7350d8b74 100644 --- a/openlp/core/lib/ui.py +++ b/openlp/core/lib/ui.py @@ -331,7 +331,7 @@ def shortcut_action(parent, name, shortcuts, function, icon=None, checked=None, def context_menu_action(base, icon, text, slot, shortcuts=None, category=None, context=QtCore.Qt.WindowShortcut): """ - Utility method to help build context menus for plugins + Utility method to help build context menus. ``base`` The parent menu to add this menu item to @@ -350,7 +350,7 @@ def context_menu_action(base, icon, text, slot, shortcuts=None, category=None, ``category`` The category the shortcut should be listed in the shortcut dialog. If - left to None, then the action will be hidden in the shortcut dialog. + left to ``None``, then the action will be hidden in the shortcut dialog. ``context`` The context the shortcut is valid. @@ -369,7 +369,7 @@ def context_menu_action(base, icon, text, slot, shortcuts=None, category=None, def context_menu(base, icon, text): """ - Utility method to help build context menus for plugins + Utility method to help build context menus. ``base`` The parent object to add this menu to diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 9031a0b1a..358877cc7 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -36,7 +36,7 @@ from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, \ ItemCapabilities, SettingsManager, translate from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.ui import UiStrings, critical_error_message_box, \ - context_menu_action, find_and_set_in_combo_box + context_menu_action, context_menu_separator, find_and_set_in_combo_box from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ @@ -301,31 +301,34 @@ class ServiceManager(QtGui.QWidget): self.addToAction.setIcon(build_icon(u':/general/general_edit.png')) # build the context menu self.menu = QtGui.QMenu() - self.editAction = self.menu.addAction( - translate('OpenLP.ServiceManager', '&Edit Item')) - self.editAction.setIcon(build_icon(u':/general/general_edit.png')) - self.maintainAction = self.menu.addAction( - translate('OpenLP.ServiceManager', '&Reorder Item')) - self.maintainAction.setIcon(build_icon(u':/general/general_edit.png')) - self.notesAction = self.menu.addAction( - translate('OpenLP.ServiceManager', '&Notes')) - self.notesAction.setIcon(build_icon(u':/services/service_notes.png')) - self.timeAction = self.menu.addAction( - translate('OpenLP.ServiceManager', '&Start Time')) - self.timeAction.setIcon(build_icon(u':/media/media_time.png')) - self.deleteAction = self.menu.addAction( - translate('OpenLP.ServiceManager', '&Delete From Service')) - self.deleteAction.setIcon(build_icon(u':/general/general_delete.png')) - self.sep1 = self.menu.addAction(u'') - self.sep1.setSeparator(True) - self.previewAction = self.menu.addAction( - translate('OpenLP.ServiceManager', 'Show &Preview')) - self.previewAction.setIcon(build_icon(u':/general/general_preview.png')) - self.liveAction = self.menu.addAction( - translate('OpenLP.ServiceManager', 'Show &Live')) - self.liveAction.setIcon(build_icon(u':/general/general_live.png')) - self.sep2 = self.menu.addAction(u'') - self.sep2.setSeparator(True) + self.editAction = context_menu_action( + self.menu, u':/general/general_edit.png', + translate('OpenLP.ServiceManager', '&Edit Item'), self.remoteEdit) + self.maintainAction = context_menu_action( + self.menu, u':/general/general_edit.png', + translate('OpenLP.ServiceManager', '&Reorder Item'), + self.onServiceItemEditForm) + self.notesAction = context_menu_action( + self.menu, u':/services/service_notes.png', + translate('OpenLP.ServiceManager', '&Notes'), + self.onServiceItemNoteForm) + self.timeAction = context_menu_action( + self.menu, u':/media/media_time.png', + translate('OpenLP.ServiceManager', '&Start Time'), + self.onStartTimeForm) + self.deleteAction = context_menu_action( + self.menu, u':/general/general_delete.png', + translate('OpenLP.ServiceManager', '&Delete From Service'), + self.onDeleteFromService) + context_menu_separator(self.menu) + self.previewAction = context_menu_action( + self.menu, u':/general/general_preview.png', + translate('OpenLP.ServiceManager', 'Show &Preview'), + self.makePreview) + self.liveAction = context_menu_action( + self.menu, u':/general/general_live.png', + translate('OpenLP.ServiceManager', 'Show &Live'), self.makeLive) + context_menu_separator(self.menu) self.themeMenu = QtGui.QMenu( translate('OpenLP.ServiceManager', '&Change Item Theme')) self.menu.addMenu(self.themeMenu) @@ -675,20 +678,6 @@ class ServiceManager(QtGui.QWidget): if serviceItem[u'service_item'].is_text(): self.themeMenu.menuAction().setVisible(True) action = self.menu.exec_(self.serviceManagerList.mapToGlobal(point)) - if action == self.editAction: - self.remoteEdit() - elif action == self.maintainAction: - self.onServiceItemEditForm() - elif action == self.deleteAction: - self.onDeleteFromService() - elif action == self.notesAction: - self.onServiceItemNoteForm() - elif action == self.timeAction: - self.onStartTimeForm() - elif action == self.previewAction: - self.makePreview() - elif action == self.liveAction: - self.makeLive() def onServiceItemNoteForm(self): item = self.findServiceItem()[0] @@ -840,7 +829,7 @@ class ServiceManager(QtGui.QWidget): correct state. """ pos = item.data(0, QtCore.Qt.UserRole).toInt()[0] - self.serviceItems[pos -1 ][u'expanded'] = False + self.serviceItems[pos - 1][u'expanded'] = False def onExpandAll(self): """ @@ -1288,9 +1277,8 @@ class ServiceManager(QtGui.QWidget): self.themeComboBox.addItem(u'') for theme in theme_list: self.themeComboBox.addItem(theme) - action = context_menu_action(self.serviceManagerList, None, theme, - self.onThemeChangeAction, context=QtCore.Qt.WidgetShortcut) - self.themeMenu.addAction(action) + context_menu_action(self.themeMenu, None, theme, + self.onThemeChangeAction) find_and_set_in_combo_box(self.themeComboBox, self.service_theme) self.mainwindow.renderer.set_service_theme(self.service_theme) self.regenerateServiceItems() From 31cebdf4f7dcc6105fc110918a8f03dba74ed2e6 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 13 May 2011 17:34:56 +0200 Subject: [PATCH 29/33] added missing period --- openlp/plugins/bibles/lib/mediaitem.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index b6085ea1e..4f349c998 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -258,7 +258,7 @@ class BibleMediaItem(MediaManagerItem): translate('BiblesPlugin.MediaItem', 'Find:')) self.quickSearchButton.setText(UiStrings().Search) self.quickLockButton.setToolTip(translate('BiblesPlugin.MediaItem', - 'Toggle to keep or clear the previous results')) + 'Toggle to keep or clear the previous results.')) self.advancedVersionLabel.setText(u'%s:' % UiStrings().Version) self.advancedSecondLabel.setText( translate('BiblesPlugin.MediaItem', 'Second:')) From 1f4bc114a9e3d6368c92bdf1cd8c1e3894ffde61 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 13 May 2011 21:44:34 +0200 Subject: [PATCH 30/33] Fixed traceback, when 'locked' and no dual bible selected. --- openlp/plugins/bibles/lib/mediaitem.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index 4f349c998..f8b23d3ec 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -587,7 +587,12 @@ class BibleMediaItem(MediaManagerItem): Check if the first item is a second bible item or not. """ bitem = self.listView.item(0) - item_second_bible = self._decodeQtObject(bitem, 'second_bible') + if not bitem.flags() & QtCore.Qt.ItemIsSelectable: + # The item is the "No Search Results" item. + self.listView.clear() + item_second_bible = None + else: + item_second_bible = self._decodeQtObject(bitem, 'second_bible') if item_second_bible and second_bible or not item_second_bible and \ not second_bible: self.displayResults(bible, second_bible) From b1979857e40878d77a25f14cf208f8550a3a77b0 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 13 May 2011 21:58:05 +0200 Subject: [PATCH 31/33] complete fix --- openlp/plugins/bibles/lib/mediaitem.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py index f8b23d3ec..281f9bcc5 100644 --- a/openlp/plugins/bibles/lib/mediaitem.py +++ b/openlp/plugins/bibles/lib/mediaitem.py @@ -590,7 +590,8 @@ class BibleMediaItem(MediaManagerItem): if not bitem.flags() & QtCore.Qt.ItemIsSelectable: # The item is the "No Search Results" item. self.listView.clear() - item_second_bible = None + self.displayResults(bible, second_bible) + return else: item_second_bible = self._decodeQtObject(bitem, 'second_bible') if item_second_bible and second_bible or not item_second_bible and \ From b04e688647f44c4163e3bb6c93ce87d8312095ff Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Fri, 13 May 2011 22:59:14 +0200 Subject: [PATCH 32/33] fixed attribute error --- openlp/plugins/presentations/lib/impresscontroller.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index a67d8f818..b691c47ce 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -252,7 +252,7 @@ class ImpressDocument(PresentationDocument): window.setVisible(False) self.presentation = self.document.getPresentation() self.presentation.Display = \ - self.controller.plugin.renderer.screens.current_display + 1 + self.controller.plugin.renderer.screens.current[u'number'] + 1 self.control = None self.create_thumbnails() return True From 144ff29e9080cda45407c6828a250e76f2b0dd26 Mon Sep 17 00:00:00 2001 From: Andreas Preikschat Date: Sat, 14 May 2011 13:48:15 +0200 Subject: [PATCH 33/33] fixed bug #744463 Fixes: https://launchpad.net/bugs/744463 --- openlp/core/ui/mainwindow.py | 3 +++ openlp/core/ui/splashscreen.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 11727f4ae..09e2ec9e7 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -672,12 +672,15 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow): 'The Main Display has been blanked out')) def onErrorMessage(self, data): + Receiver.send_message(u'close_splash') QtGui.QMessageBox.critical(self, data[u'title'], data[u'message']) def onWarningMessage(self, data): + Receiver.send_message(u'close_splash') QtGui.QMessageBox.warning(self, data[u'title'], data[u'message']) def onInformationMessage(self, data): + Receiver.send_message(u'close_splash') QtGui.QMessageBox.information(self, data[u'title'], data[u'message']) def onHelpWebSiteClicked(self): diff --git a/openlp/core/ui/splashscreen.py b/openlp/core/ui/splashscreen.py index 84aa1d7df..2bb516d00 100644 --- a/openlp/core/ui/splashscreen.py +++ b/openlp/core/ui/splashscreen.py @@ -23,6 +23,7 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### +from openlp.core.lib import Receiver from PyQt4 import QtCore, QtGui @@ -30,6 +31,8 @@ class SplashScreen(QtGui.QSplashScreen): def __init__(self): QtGui.QSplashScreen.__init__(self) self.setupUi() + QtCore.QObject.connect(Receiver.get_receiver(), + QtCore.SIGNAL(u'close_splash'), self.close) def setupUi(self): self.setObjectName(u'splash_screen')