Added smart scaling when manually resized, integrated with settings dialog, fixed some pep8 errors

This commit is contained in:
Ian Knight 2016-03-06 03:11:32 +10:30
parent 1e94cd92e9
commit 68460f5e3f
4 changed files with 58 additions and 23 deletions

View File

@ -121,6 +121,7 @@ class Settings(QtCore.QSettings):
'advanced/double click live': False,
'advanced/enable exit confirmation': True,
'advanced/expand service item': False,
'advanced/slide max height': 0,
'advanced/hide mouse': True,
'advanced/is portable': False,
'advanced/max recent files': 20,

View File

@ -80,6 +80,13 @@ class AdvancedTab(SettingsTab):
self.expand_service_item_check_box = QtWidgets.QCheckBox(self.ui_group_box)
self.expand_service_item_check_box.setObjectName('expand_service_item_check_box')
self.ui_layout.addRow(self.expand_service_item_check_box)
self.slide_max_height_label = QtWidgets.QLabel(self.ui_group_box)
self.slide_max_height_label.setObjectName('slide_max_height_label')
self.slide_max_height_spin_box = QtWidgets.QSpinBox(self.ui_group_box)
self.slide_max_height_spin_box.setObjectName('slide_max_height_spin_box')
self.slide_max_height_spin_box.setRange(0,1000)
self.slide_max_height_spin_box.setSingleStep(20)
self.ui_layout.addRow(self.slide_max_height_label,self.slide_max_height_spin_box)
self.search_as_type_check_box = QtWidgets.QCheckBox(self.ui_group_box)
self.search_as_type_check_box.setObjectName('SearchAsType_check_box')
self.ui_layout.addRow(self.search_as_type_check_box)
@ -272,6 +279,9 @@ class AdvancedTab(SettingsTab):
'Preview items when clicked in Media Manager'))
self.expand_service_item_check_box.setText(translate('OpenLP.AdvancedTab',
'Expand new service items on creation'))
self.slide_max_height_label.setText(translate('OpenLP.AdvancedTab',
'Max height for non-text slides\nin slide controller:'))
self.slide_max_height_spin_box.setSpecialValueText(translate('OpenLP.AdvancedTab', 'Disabled'))
self.enable_auto_close_check_box.setText(translate('OpenLP.AdvancedTab',
'Enable application exit confirmation'))
self.service_name_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Default Service Name'))
@ -340,6 +350,7 @@ class AdvancedTab(SettingsTab):
self.double_click_live_check_box.setChecked(settings.value('double click live'))
self.single_click_preview_check_box.setChecked(settings.value('single click preview'))
self.expand_service_item_check_box.setChecked(settings.value('expand service item'))
self.slide_max_height_spin_box.setValue(settings.value('slide max height'))
self.enable_auto_close_check_box.setChecked(settings.value('enable exit confirmation'))
self.hide_mouse_check_box.setChecked(settings.value('hide mouse'))
self.service_name_day.setCurrentIndex(settings.value('default service day'))
@ -421,6 +432,7 @@ class AdvancedTab(SettingsTab):
settings.setValue('double click live', self.double_click_live_check_box.isChecked())
settings.setValue('single click preview', self.single_click_preview_check_box.isChecked())
settings.setValue('expand service item', self.expand_service_item_check_box.isChecked())
settings.setValue('slide max height', self.slide_max_height_spin_box.value())
settings.setValue('enable exit confirmation', self.enable_auto_close_check_box.isChecked())
settings.setValue('hide mouse', self.hide_mouse_check_box.isChecked())
settings.setValue('alternate rows', self.alternate_rows_check_box.isChecked())

View File

@ -26,7 +26,7 @@ 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
from openlp.core.common import RegistryProperties, Settings
from openlp.core.lib import ImageSource, ServiceItem
@ -47,9 +47,6 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties):
"""
super(QtWidgets.QTableWidget, self).__init__(parent)
self._setup(screen_ratio)
# max row height for non-text slides in pixels. If <= 0, will disable max row height.
self.max_img_row_height = 200
def _setup(self, screen_ratio):
"""
@ -66,6 +63,8 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties):
# Initialize variables.
self.service_item = ServiceItem()
self.screen_ratio = screen_ratio
# Connect signals
self.verticalHeader().sectionResized.connect(self.row_resized)
def resizeEvent(self, event):
"""
@ -83,14 +82,30 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties):
# Sort out songs, bibles, etc.
if self.service_item.is_text():
self.resizeRowsToContents()
# Sort out image heights.
else:
# Sort out image heights.
height = self.viewport().width() // self.screen_ratio ### Moved out of loop as only needs to run once
if self.max_img_row_height > 0 and height > self.max_img_row_height: ### Apply row height cap.
height = self.max_img_row_height
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 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
if self.service_item.is_text() or Settings().value('advanced/slide max 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
@ -144,21 +159,26 @@ class ListPreviewWidget(QtWidgets.QTableWidget, RegistryProperties):
pixmap = QtGui.QPixmap.fromImage(image)
pixmap.setDevicePixelRatio(label.devicePixelRatio())
label.setPixmap(pixmap)
### begin added/modified content
if self.max_img_row_height > 0:
label.setMaximumWidth(self.max_img_row_height * self.screen_ratio) ### set max width based on max height
label.resize(self.max_img_row_height * self.screen_ratio,self.max_img_row_height) ### resize to max width and max height; may be adjusted when setRowHeight called.
container = QtWidgets.QWidget() ### container widget
hbox = QtWidgets.QHBoxLayout() ### hbox to allow for horizonal stretch padding
hbox.setContentsMargins(0, 0, 0, 0) ### 0 contents margins to avoid extra padding
hbox.addWidget(label,stretch=1) ### add slide, stretch allows growing to max-width
hbox.addStretch(0) ### add strech padding with lowest priority; will only grow when slide has hit max-width
container.setLayout(hbox) ### populate container widget
self.setCellWidget(frame_number, 0, container) ### populate cell with container
else:
self.setCellWidget(frame_number, 0, label) ### populate cell with slide
### end added/modified content
slide_height = width // self.screen_ratio
# Setup row height cap if in use.
max_img_row_height = Settings().value('advanced/slide max height')
if 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)

View File

@ -23,9 +23,11 @@
Package to test the openlp.core.ui.listpreviewwidget package.
"""
from unittest import TestCase
from openlp.core.common import Settings
from openlp.core.ui.listpreviewwidget import ListPreviewWidget
from tests.functional import patch
from tests.functional import MagicMock, patch
class TestListPreviewWidget(TestCase):