From a1b8b431fbfa58f8628e9a72e90f671f386a83aa Mon Sep 17 00:00:00 2001 From: Raoul Snyman Date: Sat, 10 Feb 2018 22:34:14 -0700 Subject: [PATCH] Comment out a whole lot of code to make OpenLP start. Also figured out that OpenLP now requires OpenGL --- openlp.py | 2 + openlp/core/app.py | 2 +- openlp/core/common/registry.py | 1 + openlp/core/display/screens.py | 10 +- openlp/core/ui/generaltab.py | 23 ++-- openlp/core/ui/mainwindow.py | 15 +-- openlp/core/ui/servicemanager.py | 4 +- openlp/core/ui/slidecontroller.py | 86 +++++--------- openlp/core/ui/themestab.py | 4 +- openlp/core/widgets/layouts.py | 182 ++++++++++++++++++++++++++++++ 10 files changed, 240 insertions(+), 89 deletions(-) create mode 100644 openlp/core/widgets/layouts.py diff --git a/openlp.py b/openlp.py index 38e270a9d..5b4cef725 100755 --- a/openlp.py +++ b/openlp.py @@ -27,6 +27,8 @@ import faulthandler import multiprocessing import sys +from OpenGL import GL + from openlp.core.app import main from openlp.core.common import is_win, is_macosx from openlp.core.common.applocation import AppLocation diff --git a/openlp/core/app.py b/openlp/core/app.py index 78f87d257..c486ab542 100644 --- a/openlp/core/app.py +++ b/openlp/core/app.py @@ -33,7 +33,7 @@ import time from datetime import datetime from traceback import format_exception -from PyQt5 import QtCore, QtWidgets +from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets # noqa from openlp.core.common import is_macosx, is_win from openlp.core.common.applocation import AppLocation diff --git a/openlp/core/common/registry.py b/openlp/core/common/registry.py index 969518297..d4de6ae4e 100644 --- a/openlp/core/common/registry.py +++ b/openlp/core/common/registry.py @@ -143,6 +143,7 @@ class Registry(object): if event in self.functions_list: for function in self.functions_list[event]: try: + log.debug('Running function {} for {}'.format(function, event)) result = function(*args, **kwargs) if result: results.append(result) diff --git a/openlp/core/display/screens.py b/openlp/core/display/screens.py index d05b51916..5fe3c88be 100644 --- a/openlp/core/display/screens.py +++ b/openlp/core/display/screens.py @@ -206,11 +206,11 @@ class ScreenList(object): } Settings.extend_default_settings(screen_settings) monitors = Settings().value('core/monitors') - for number, monitor in monitors.items(): - if self.has_screen(number): - self[number].update(monitor) - else: - self.screens.append(Screen.from_dict(monitor)) + # for number, monitor in monitors.items(): + # if self.has_screen(number): + # self[number].update(monitor) + # else: + # self.screens.append(Screen.from_dict(monitor)) def save_screen_settings(self): """ diff --git a/openlp/core/ui/generaltab.py b/openlp/core/ui/generaltab.py index adb322438..c70905b79 100644 --- a/openlp/core/ui/generaltab.py +++ b/openlp/core/ui/generaltab.py @@ -49,7 +49,7 @@ class GeneralTab(SettingsTab): """ self.logo_file = ':/graphics/openlp-splash-screen.png' self.logo_background_color = '#ffffff' - self.screen_list = ScreenList() + self.screens = ScreenList() self.icon_path = ':/icon/openlp-logo.svg' general_translated = translate('OpenLP.GeneralTab', 'General') super(GeneralTab, self).__init__(parent, 'Core', general_translated) @@ -283,16 +283,21 @@ class GeneralTab(SettingsTab): settings = Settings() settings.beginGroup(self.settings_section) self.monitor_combo_box.clear() - self.monitor_combo_box.addItems([str(screen) for screen in self.screen_list]) - monitor_number = settings.value('monitor') - self.monitor_combo_box.setCurrentIndex(monitor_number) + self.monitor_combo_box.addItems([str(screen) for screen in self.screens]) + monitors = settings.value('monitors') + for number, monitor in monitors.items(): + if monitor['is_display']: + self.monitor_combo_box.setCurrentIndex(int(number)) + else: + self.monitor_combo_box.setCurrentIndex(0) self.number_edit.setText(settings.value('ccli number')) self.username_edit.setText(settings.value('songselect username')) self.password_edit.setText(settings.value('songselect password')) self.save_check_service_check_box.setChecked(settings.value('save prompt')) self.auto_unblank_check_box.setChecked(settings.value('auto unblank')) self.click_live_slide_to_unblank_check_box.setChecked(settings.value('click live slide to unblank')) - self.display_on_monitor_check.setChecked(self.screens.display) + # TODO: This is going to be a more complicated setup + # self.display_on_monitor_check.setChecked(self.screens.display) self.warning_check_box.setChecked(settings.value('blank warning')) self.auto_open_check_box.setChecked(settings.value('auto open')) self.show_splash_check_box.setChecked(settings.value('show splash')) @@ -305,10 +310,10 @@ class GeneralTab(SettingsTab): self.timeout_spin_box.setValue(settings.value('loop delay')) self.monitor_radio_button.setChecked(not settings.value('override position',)) self.override_radio_button.setChecked(settings.value('override position')) - self.custom_X_value_edit.setValue(settings.value('x position')) - self.custom_Y_value_edit.setValue(settings.value('y position')) - self.custom_height_value_edit.setValue(settings.value('height')) - self.custom_width_value_edit.setValue(settings.value('width')) + # self.custom_X_value_edit.setValue(settings.value('x position')) + # self.custom_Y_value_edit.setValue(settings.value('y position')) + # self.custom_height_value_edit.setValue(settings.value('height')) + # self.custom_width_value_edit.setValue(settings.value('width')) self.start_paused_check_box.setChecked(settings.value('audio start paused')) self.repeat_list_check_box.setChecked(settings.value('audio repeat list')) settings.endGroup() diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index 72ad1f2ce..8b1524b59 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -584,8 +584,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): """ process the bootstrap post setup request """ - self.preview_controller.panel.setVisible(Settings().value('user interface/preview panel')) - self.live_controller.panel.setVisible(Settings().value('user interface/live panel')) + # self.preview_controller.panel.setVisible(Settings().value('user interface/preview panel')) + # self.live_controller.panel.setVisible(Settings().value('user interface/live panel')) self.load_settings() self.restore_current_media_manager_item() Registry().execute('theme_update_global') @@ -637,8 +637,8 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): Show the main form, as well as the display form """ QtWidgets.QWidget.show(self) - if self.live_controller.display.isVisible(): - self.live_controller.display.setFocus() + # if self.live_controller.display.isVisible(): + # self.live_controller.display.setFocus() self.activateWindow() if self.arguments: self.open_cmd_line_files(self.arguments) @@ -829,13 +829,6 @@ class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow, RegistryProperties): """ self.settings_form.exec() - def paintEvent(self, event): - """ - We need to make sure, that the SlidePreview's size is correct. - """ - self.preview_controller.preview_size_changed() - self.live_controller.preview_size_changed() - def on_settings_shortcuts_item_clicked(self): """ Show the shortcuts dialog diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py index 554e0a7e9..e24985a77 100644 --- a/openlp/core/ui/servicemanager.py +++ b/openlp/core/ui/servicemanager.py @@ -1272,7 +1272,9 @@ class ServiceManager(QtWidgets.QWidget, RegistryBase, Ui_ServiceManager, LogMixi """ The theme may have changed in the settings dialog so make sure the theme combo box is in the correct state. """ - visible = self.renderer.theme_level != ThemeLevel.Global + # TODO: Gotta fix this too + # visible = self.renderer.theme_level != ThemeLevel.Global + visible = True self.toolbar.actions['theme_combo_box'].setVisible(visible) self.toolbar.actions['theme_label'].setVisible(visible) self.regenerate_service_items() diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 8d98218c8..a6b795b3c 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -40,6 +40,7 @@ from openlp.core.lib import ItemCapabilities, ImageSource, ServiceItemAction, bu from openlp.core.lib.ui import create_action from openlp.core.ui import HideMode, DisplayControllerType from openlp.core.display.window import DisplayWindow +from openlp.core.widgets.layouts import AspectRatioLayout from openlp.core.widgets.toolbar import OpenLPToolbar from openlp.core.widgets.views import ListPreviewWidget @@ -118,6 +119,7 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): self.is_live = False self.controller_type = None self.displays = [] + self.screens = ScreenList() Registry().set_flag('has doubleclick added item to service', True) Registry().set_flag('replace service manager item', False) @@ -141,13 +143,16 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): self.displays.append(display) # display.media_watcher.progress.connect(self.on_audio_time_remaining) + @property + def display(self): + return self.displays[0] if self.displays else None + def initialise(self): """ Initialise the UI elements of the controller """ - self.screens = ScreenList() try: - self.ratio = self.screens.current['size'].width() / self.screens.current['size'].height() + self.ratio = self.screens.current.geometry.width() / self.screens.current.geometry.height() except ZeroDivisionError: self.ratio = 1 self.process_queue_lock = Lock() @@ -359,31 +364,14 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): self.preview_frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.preview_frame.setFrameShadow(QtWidgets.QFrame.Sunken) self.preview_frame.setObjectName('preview_frame') - self.grid = QtWidgets.QGridLayout(self.preview_frame) - self.grid.setContentsMargins(8, 8, 8, 8) - self.grid.setObjectName('grid') - self.slide_layout = QtWidgets.QVBoxLayout() + self.slide_layout = AspectRatioLayout(self.preview_frame, self.ratio) + self.slide_layout.margin = 8 self.slide_layout.setSpacing(0) - self.slide_layout.setContentsMargins(0, 0, 0, 0) self.slide_layout.setObjectName('SlideLayout') # Set up the preview display - # self.preview_display = DisplayWindow(self) - # self.slide_layout.insertWidget(0, self.preview_display) - # self.preview_display.hide() + self.preview_display = DisplayWindow(self) + self.slide_layout.addWidget(self.preview_display) # Actual preview screen - self.slide_preview = QtWidgets.QLabel(self) - size_policy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) - size_policy.setHorizontalStretch(0) - size_policy.setVerticalStretch(0) - size_policy.setHeightForWidth(self.slide_preview.sizePolicy().hasHeightForWidth()) - self.slide_preview.setSizePolicy(size_policy) - self.slide_preview.setFrameShape(QtWidgets.QFrame.Box) - self.slide_preview.setFrameShadow(QtWidgets.QFrame.Plain) - self.slide_preview.setLineWidth(1) - self.slide_preview.setScaledContents(True) - self.slide_preview.setObjectName('slide_preview') - self.slide_layout.insertWidget(0, self.slide_preview) - self.grid.addLayout(self.slide_layout, 0, 0, 1, 1) if self.is_live: self.current_shortcut = '' self.shortcut_timer = QtCore.QTimer() @@ -589,8 +577,8 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): if self.displays: for display in self.displays: display.resize(self.screens.current['size']) - if self.is_live: - self.__add_actions_to_widget(self.display) + # if self.is_live: + # self.__add_actions_to_widget(self.display) # The SlidePreview's ratio. # TODO: Need to basically update everything @@ -613,28 +601,6 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): self.theme_screen, self.blank_screen]) - def preview_size_changed(self): - """ - Takes care of the SlidePreview's size. Is called when one of the the splitters is moved or when the screen - size is changed. Note, that this method is (also) called frequently from the mainwindow *paintEvent*. - """ - if self.ratio < self.preview_frame.width() / self.preview_frame.height(): - # We have to take the height as limit. - max_height = self.preview_frame.height() - self.grid.contentsMargins().top() * 2 - self.slide_preview.setFixedSize(QtCore.QSize(max_height * self.ratio, max_height)) - self.preview_display.setFixedSize(QtCore.QSize(max_height * self.ratio, max_height)) - self.preview_display.screen = {'size': self.preview_display.geometry()} - else: - # We have to take the width as limit. - max_width = self.preview_frame.width() - self.grid.contentsMargins().top() * 2 - self.slide_preview.setFixedSize(QtCore.QSize(max_width, max_width / self.ratio)) - self.preview_display.setFixedSize(QtCore.QSize(max_width, max_width / self.ratio)) - self.preview_display.screen = {'size': self.preview_display.geometry()} - # Only update controller layout if width has actually changed - if self.controller_width != self.controller.width(): - self.controller_width = self.controller.width() - self.on_controller_size_changed(self.controller_width) - def on_controller_size_changed(self, width): """ Change layout of display control buttons on controller size change @@ -943,18 +909,18 @@ class SlideController(QtWidgets.QWidget, LogMixin, RegistryProperties): Allow the main display to blank the main display at startup time """ display_type = Settings().value(self.main_window.general_settings_section + '/screen blank') - if self.screens.which_screen(self.window()) != self.screens.which_screen(self.display): - # Order done to handle initial conversion - if display_type == 'themed': - self.on_theme_display(True) - elif display_type == 'hidden': - self.on_hide_display(True) - elif display_type == 'blanked': - self.on_blank_display(True) - else: - Registry().execute('live_display_show') - else: - self.on_hide_display_enable() + # if self.screens.which_screen(self.window()) != self.screens.which_screen(self.display): + # # Order done to handle initial conversion + # if display_type == 'themed': + # self.on_theme_display(True) + # elif display_type == 'hidden': + # self.on_hide_display(True) + # elif display_type == 'blanked': + # self.on_blank_display(True) + # else: + # Registry().execute('live_display_show') + # else: + # self.on_hide_display_enable() def on_slide_blank(self): """ @@ -1515,7 +1481,7 @@ class PreviewController(RegistryBase, SlideController): """ Set up the base Controller as a preview. """ - self.__registry_name = 'preview_slidecontroller' + self.__registry_name = 'preview_controller' super().__init__(*args, **kwargs) self.split = 0 self.type_prefix = 'preview' diff --git a/openlp/core/ui/themestab.py b/openlp/core/ui/themestab.py index 077f59d83..3a917d1a4 100644 --- a/openlp/core/ui/themestab.py +++ b/openlp/core/ui/themestab.py @@ -203,8 +203,8 @@ class ThemesTab(SettingsTab): self.default_combo_box.clear() self.default_combo_box.addItems(theme_list) find_and_set_in_combo_box(self.default_combo_box, self.global_theme) - self.renderer.set_global_theme() - self.renderer.set_theme_level(self.theme_level) + # self.renderer.set_global_theme() + # self.renderer.set_theme_level(self.theme_level) if self.global_theme is not '': self._preview_global_theme() diff --git a/openlp/core/widgets/layouts.py b/openlp/core/widgets/layouts.py new file mode 100644 index 000000000..76840be1d --- /dev/null +++ b/openlp/core/widgets/layouts.py @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- +# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 + +############################################################################### +# OpenLP - Open Source Lyrics Projection # +# --------------------------------------------------------------------------- # +# Copyright (c) 2008-2018 OpenLP Developers # +# --------------------------------------------------------------------------- # +# This program is free software; you can redistribute it and/or modify it # +# under the terms of the GNU General Public License as published by the Free # +# Software Foundation; version 2 of the License. # +# # +# This program is distributed in the hope that it will be useful, but WITHOUT # +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # +# more details. # +# # +# You should have received a copy of the GNU General Public License along # +# with this program; if not, write to the Free Software Foundation, Inc., 59 # +# Temple Place, Suite 330, Boston, MA 02111-1307 USA # +############################################################################### +""" +The :mod:`~openlp.core.widgets.layouts` module contains customised layout classes +""" +from PyQt5 import QtCore, QtWidgets + + +class AspectRatioLayout(QtWidgets.QLayout): + """ + A layout that contains a single widget and maintains the aspect ratio of the widget + + This is based on the C++ example here: https://gist.github.com/pavel-perina/1324ff064aedede0e01311aab315f83d + """ + def __init__(self, parent=None, aspect_ratio=None): + """ + Create a layout. + + :param PyQt5.QtWidgets.QWidget parent: The parent widget, can be None. + :param float aspect_ratio: The aspect ratio as a float (e.g. 16.0/9.0) + """ + super().__init__(parent) + self._aspect_ratio = aspect_ratio + self._item = None + self._margin = 0 + self.setContentsMargins(0, 0, 0, 0) + + def get_aspect_ratio(self): + """ + Return the aspect ratio + + :return: The aspect ration + :rtype: float + """ + return self._aspect_ratio + + def set_aspect_ratio(self, aspect_ratio): + """ + Set the aspect ratio + + :param float aspect_ratio: The aspect ratio to set + """ + # TODO: Update the layout/widget if this changes + self._aspect_ratio = aspect_ratio + + aspect_ratio = property(get_aspect_ratio, set_aspect_ratio) + + def get_margin(self): + """ + Return the margin + + :return: The margin + :rtype: int + """ + return self._margin + + def set_margin(self, value): + """ + Set the margin + + :param int value: The margin + """ + self._margin = int(value) + + margin = property(get_margin, set_margin) + + def count(self): + """ + Overridden Qt method + """ + return 1 if self._item else 0 + + def addItem(self, item): + """ + Overridden Qt method + """ + if self._item is not None: + raise ValueError('AspectRatioLayout can contain only 1 widget') + self._item = item + # self._item.setAlignment(0) + + def itemAt(self, index): + """ + Overridden Qt method + """ + if index != 0: + return None + return self._item + + def takeAt(self, index): + """ + Overridden Qt method + """ + if index != 0: + return None + result = self._item + self._item = None + return result + + def expandingDirections(self): + """ + Overridden Qt method + """ + return QtCore.Qt.Horizontal | QtCore.Qt.Vertical + + def hasHeightForWidth(self): + """ + Overridden Qt method + """ + return False + + def heightForWidth(self, width): + """ + Overridden Qt method + """ + height = (width - 2 * self.margin) / (self._aspect_ratio + 2 * self.margin) + return height + + def setGeometry(self, rect): + """ + Overridden Qt method + """ + super().setGeometry(rect) + if self._item: + widget = self._item.widget() + available_width = rect.width() - 2 * self.margin + available_height = rect.height() - 2 * self.margin + height = available_height + width = height * self._aspect_ratio + if width > available_width: + width = available_width + height = width / self._aspect_ratio + if self._item.alignment() & QtCore.Qt.AlignTop: + y = self.margin + elif self._item.alignment() & QtCore.Qt.AlignBottom: + y = rect.height() - self.margin - height + else: + y = self.margin + (available_height - height) / 2 + widget.setGeometry(rect.x() + self.margin, rect.y() + y, width, height) + else: + if self._item.alignment() & QtCore.Qt.AlignLeft: + x = self.margin + elif self._item.alignment() & QtCore.Qt.AlignRight: + x = rect.width() - self.margin - width + else: + x = self.margin + (available_width - width) / 2 + widget.setGeometry(rect.x() + x, rect.y() + self.margin, width, height) + + def sizeHint(self): + """ + Overridden Qt method + """ + margins = 2 * self.margin + return self._item.sizeHint() + QtCore.QSize(margins, margins) \ + if self._item else QtCore.QSize(margins, margins) + + def minimumSize(self): + """ + Overridden Qt method + """ + margins = 2 * self.margin + return self._item.minimumSize() + QtCore.QSize(margins, margins) \ + if self._item else QtCore.QSize(margins, margins)