From 0d755e33549e116cb9998f912c1ea9d6fda44c0e Mon Sep 17 00:00:00 2001 From: Tim Bentley Date: Fri, 22 Apr 2016 19:32:45 +0100 Subject: [PATCH] more files --- openlp/core/ui/__init__.py | 3 +- openlp/core/ui/lib/__init__.py | 3 + openlp/core/ui/listpreviewwidget.py | 226 ---------------------------- openlp/core/ui/mainwindow.py | 3 +- openlp/core/ui/slidecontroller.py | 3 +- 5 files changed, 8 insertions(+), 230 deletions(-) delete mode 100644 openlp/core/ui/listpreviewwidget.py diff --git a/openlp/core/ui/__init__.py b/openlp/core/ui/__init__.py index 0f0b14b05..599efd8e7 100644 --- a/openlp/core/ui/__init__.py +++ b/openlp/core/ui/__init__.py @@ -113,7 +113,6 @@ from .settingsform import SettingsForm from .formattingtagform import FormattingTagForm from .formattingtagcontroller import FormattingTagController from .shortcutlistform import ShortcutListForm -from openlp.core.ui.lib.mediadockmanager import MediaDockManager from .servicemanager import ServiceManager from .thememanager import ThemeManager from .projector.manager import ProjectorManager @@ -121,7 +120,7 @@ from .projector.tab import ProjectorTab from .projector.editform import ProjectorEditForm __all__ = ['SplashScreen', 'AboutForm', 'SettingsForm', 'MainDisplay', 'SlideController', 'ServiceManager', 'ThemeForm', - 'ThemeManager', 'MediaDockManager', 'ServiceItemEditForm', 'FirstTimeForm', 'FirstTimeLanguageForm', + 'ThemeManager', 'ServiceItemEditForm', 'FirstTimeForm', 'FirstTimeLanguageForm', 'Display', 'ServiceNoteForm', 'ThemeLayoutForm', 'FileRenameForm', 'StartTimeForm', 'MainDisplay', 'SlideController', 'DisplayController', 'GeneralTab', 'ThemesTab', 'AdvancedTab', 'PluginForm', 'FormattingTagForm', 'ShortcutListForm', 'FormattingTagController', 'SingleColumnTableWidget', diff --git a/openlp/core/ui/lib/__init__.py b/openlp/core/ui/lib/__init__.py index 2bb3ac157..d4e21e7bd 100644 --- a/openlp/core/ui/lib/__init__.py +++ b/openlp/core/ui/lib/__init__.py @@ -26,3 +26,6 @@ from .treewidgetwithdnd import TreeWidgetWithDnD from .toolbar import OpenLPToolbar from .dockwidget import OpenLPDockWidget from .wizard import OpenLPWizard, WizardStrings +from .mediadockmanager import MediaDockManager +from .listpreviewwidget import ListPreviewWidget + diff --git a/openlp/core/ui/listpreviewwidget.py b/openlp/core/ui/listpreviewwidget.py deleted file mode 100644 index 88aef818a..000000000 --- a/openlp/core/ui/listpreviewwidget.py +++ /dev/null @@ -1,226 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=120 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2016 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:`listpreviewwidget` is a widget that lists the slides in the slide controller. -It is based on a QTableWidget but represents its contents in list form. -""" - -from PyQt5 import QtCore, QtGui, QtWidgets - -from openlp.core.common import RegistryProperties, Settings -from openlp.core.lib import ImageSource, ServiceItem - - -class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties): - """ - A special type of QTableWidget which lists the slides in the slide controller - - :param parent: - :param screen_ratio: - """ - - def __init__(self, parent, screen_ratio): - """ - Initializes the widget to default state. - - An empty ``ServiceItem`` is used by default. replace_service_manager_item() needs to be called to make this - widget display something. - """ - super(QtWidgets.QTableWidget, self).__init__(parent) - self._setup(screen_ratio) - - def _setup(self, screen_ratio): - """ - Set up the widget - """ - self.setColumnCount(1) - self.horizontalHeader().setVisible(False) - self.setColumnWidth(0, self.parent().width()) - self.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectRows) - self.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) - self.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) - self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff) - self.setAlternatingRowColors(True) - # Initialize variables. - self.service_item = ServiceItem() - self.screen_ratio = screen_ratio - # Connect signals - self.verticalHeader().sectionResized.connect(self.row_resized) - - def resizeEvent(self, event): - """ - Overloaded method from QTableWidget. Will recalculate the layout. - """ - self.__recalculate_layout() - - def __recalculate_layout(self): - """ - Recalculates the layout of the table widget. It will set height and width - of the table cells. QTableWidget does not adapt the cells to the widget size on its own. - """ - self.setColumnWidth(0, self.viewport().width()) - if self.service_item: - # Sort out songs, bibles, etc. - if self.service_item.is_text(): - self.resizeRowsToContents() - # Sort out image heights. - else: - height = self.viewport().width() // self.screen_ratio - max_img_row_height = Settings().value('advanced/slide max height') - # Adjust for row height cap if in use. - if isinstance(max_img_row_height, int) and max_img_row_height > 0 and height > max_img_row_height: - height = max_img_row_height - # Apply new height to slides - for frame_number in range(len(self.service_item.get_frames())): - self.setRowHeight(frame_number, height) - - def row_resized(self, row, old_height, new_height): - """ - Will scale non-image slides. - """ - # Only for non-text slides when row height cap in use - max_img_row_height = Settings().value('advanced/slide max height') - if self.service_item.is_text() or not isinstance(max_img_row_height, int) or max_img_row_height <= 0: - return - # Get and validate label widget containing slide & adjust max width - try: - self.cellWidget(row, 0).children()[1].setMaximumWidth(new_height * self.screen_ratio) - except: - return - - def screen_size_changed(self, screen_ratio): - """ - This method is called whenever the live screen size changes, which then makes a layout recalculation necessary - - :param screen_ratio: The new screen ratio - """ - self.screen_ratio = screen_ratio - self.__recalculate_layout() - - def replace_service_item(self, service_item, width, slide_number): - """ - Replace the current preview items with the ones in service_item and display the given slide - - :param service_item: The service item to insert - :param width: The width of the column - :param slide_number: The slide number to pre-select - """ - self.service_item = service_item - self.setRowCount(0) - self.clear() - self.setColumnWidth(0, width) - row = 0 - text = [] - for frame_number, frame in enumerate(self.service_item.get_frames()): - self.setRowCount(self.slide_count() + 1) - item = QtWidgets.QTableWidgetItem() - slide_height = 0 - if self.service_item.is_text(): - if frame['verseTag']: - # These tags are already translated. - verse_def = frame['verseTag'] - verse_def = '%s%s' % (verse_def[0], verse_def[1:]) - two_line_def = '%s\n%s' % (verse_def[0], verse_def[1:]) - row = two_line_def - else: - row += 1 - item.setText(frame['text']) - else: - label = QtWidgets.QLabel() - label.setContentsMargins(4, 4, 4, 4) - if self.service_item.is_media(): - label.setAlignment(QtCore.Qt.AlignHCenter | QtCore.Qt.AlignVCenter) - else: - label.setScaledContents(True) - if self.service_item.is_command(): - pixmap = QtGui.QPixmap(frame['image']) - pixmap.setDevicePixelRatio(label.devicePixelRatio()) - label.setPixmap(pixmap) - else: - image = self.image_manager.get_image(frame['path'], ImageSource.ImagePlugin) - pixmap = QtGui.QPixmap.fromImage(image) - pixmap.setDevicePixelRatio(label.devicePixelRatio()) - label.setPixmap(pixmap) - slide_height = width // self.screen_ratio - # Setup and validate row height cap if in use. - max_img_row_height = Settings().value('advanced/slide max height') - if isinstance(max_img_row_height, int) and max_img_row_height > 0: - if slide_height > max_img_row_height: - slide_height = max_img_row_height - label.setMaximumWidth(max_img_row_height * self.screen_ratio) - label.resize(max_img_row_height * self.screen_ratio, max_img_row_height) - # Build widget with stretch padding - container = QtWidgets.QWidget() - hbox = QtWidgets.QHBoxLayout() - hbox.setContentsMargins(0, 0, 0, 0) - hbox.addWidget(label, stretch=1) - hbox.addStretch(0) - container.setLayout(hbox) - # Add to table - self.setCellWidget(frame_number, 0, container) - else: - # Add to table - self.setCellWidget(frame_number, 0, label) - row += 1 - text.append(str(row)) - self.setItem(frame_number, 0, item) - if slide_height: - self.setRowHeight(frame_number, slide_height) - self.setVerticalHeaderLabels(text) - if self.service_item.is_text(): - self.resizeRowsToContents() - self.setColumnWidth(0, self.viewport().width()) - self.change_slide(slide_number) - - def change_slide(self, slide): - """ - Switches to the given row. - """ - # Retrieve setting - autoscrolling = Settings().value('advanced/autoscrolling') - # Check if auto-scroll disabled (None) and validate value as dict containing 'dist' and 'pos' - # 'dist' represents the slide to scroll to relative to the new slide (-1 = previous, 0 = current, 1 = next) - # 'pos' represents the vert position of of the slide (0 = in view, 1 = top, 2 = middle, 3 = bottom) - if not (isinstance(autoscrolling, dict) and 'dist' in autoscrolling and 'pos' in autoscrolling and - isinstance(autoscrolling['dist'], int) and isinstance(autoscrolling['pos'], int)): - return - # prevent scrolling past list bounds - scroll_to_slide = slide + autoscrolling['dist'] - if scroll_to_slide < 0: - scroll_to_slide = 0 - if scroll_to_slide >= self.slide_count(): - scroll_to_slide = self.slide_count() - 1 - # Scroll to item if possible. - self.scrollToItem(self.item(scroll_to_slide, 0), autoscrolling['pos']) - self.selectRow(slide) - - def current_slide_number(self): - """ - Returns the position of the currently active item. Will return -1 if the widget is empty. - """ - return super(ListPreviewWidget, self).currentRow() - - def slide_count(self): - """ - Returns the number of slides this widget holds. - """ - return super(ListPreviewWidget, self).rowCount() diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index e586e6928..b13f1c187 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -41,13 +41,14 @@ from openlp.core.common.versionchecker import get_application_version from openlp.core.lib import Renderer, PluginManager, ImageManager, PluginStatus, ScreenList, build_icon from openlp.core.lib.ui import UiStrings, create_action from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, ThemeManager, LiveController, PluginForm, \ - MediaDockManager, ShortcutListForm, FormattingTagForm, PreviewController + ShortcutListForm, FormattingTagForm, PreviewController from openlp.core.ui.firsttimeform import FirstTimeForm from openlp.core.ui.media import MediaController from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.ui.projector.manager import ProjectorManager from openlp.core.ui.lib.toolbar import OpenLPToolbar from openlp.core.ui.lib.dockwidget import OpenLPDockWidget +from openlp.core.ui.lib.mediadockmanager import MediaDockManager log = logging.getLogger(__name__) diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index 7ec4bfe29..ea2abe5fb 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -38,8 +38,9 @@ from openlp.core.lib import ItemCapabilities, ServiceItem, ImageSource, ServiceI from openlp.core.lib.ui import create_action from openlp.core.ui.lib.toolbar import OpenLPToolbar from openlp.core.ui.lib.dockwidget import OpenLPDockWidget +from openlp.core.ui.lib.listpreviewwidget import ListPreviewWidget from openlp.core.ui import HideMode, MainDisplay, Display, DisplayControllerType -from openlp.core.ui.listpreviewwidget import ListPreviewWidget + # Threshold which has to be trespassed to toggle. HIDE_MENU_THRESHOLD = 27