diff --git a/openlp/core/common/settings.py b/openlp/core/common/settings.py index 7a1e31553..6d79fdccd 100644 --- a/openlp/core/common/settings.py +++ b/openlp/core/common/settings.py @@ -121,6 +121,7 @@ class Settings(QtCore.QSettings): 'advanced/enable exit confirmation': True, 'advanced/expand service item': False, 'advanced/hide mouse': True, + 'advanced/ignore aspect ratio': False, 'advanced/is portable': False, 'advanced/max recent files': 20, 'advanced/print file meta data': False, diff --git a/openlp/core/lib/__init__.py b/openlp/core/lib/__init__.py index 77fefee39..28fa2cc38 100644 --- a/openlp/core/lib/__init__.py +++ b/openlp/core/lib/__init__.py @@ -230,7 +230,7 @@ def validate_thumb(file_path, thumb_path): return image_date <= thumb_date -def resize_image(image_path, width, height, background='#000000'): +def resize_image(image_path, width, height, background='#000000', ignore_aspect_ratio=False): """ Resize an image to fit on the current screen. @@ -247,7 +247,7 @@ def resize_image(image_path, width, height, background='#000000'): image_ratio = reader.size().width() / reader.size().height() resize_ratio = width / height # Figure out the size we want to resize the image to (keep aspect ratio). - if image_ratio == resize_ratio: + if image_ratio == resize_ratio or ignore_aspect_ratio: size = QtCore.QSize(width, height) elif image_ratio < resize_ratio: # Use the image's height as reference for the new size. diff --git a/openlp/core/lib/imagemanager.py b/openlp/core/lib/imagemanager.py index f2071a190..79c3a2c90 100644 --- a/openlp/core/lib/imagemanager.py +++ b/openlp/core/lib/imagemanager.py @@ -31,7 +31,7 @@ import queue from PyQt5 import QtCore -from openlp.core.common import Registry +from openlp.core.common import Registry, Settings from openlp.core.lib import ScreenList, resize_image, image_to_byte log = logging.getLogger(__name__) @@ -327,7 +327,8 @@ class ImageManager(QtCore.QObject): # Let's see if the image was requested with specific dimensions width = self.width if image.width == -1 else image.width height = self.height if image.height == -1 else image.height - image.image = resize_image(image.path, width, height, image.background) + image.image = resize_image(image.path, width, height, image.background, + Settings().value('advanced/ignore aspect ratio')) # Set the priority to Lowest and stop here as we need to process more important images first. if image.priority == Priority.Normal: self._conversion_queue.modify_priority(image, Priority.Lowest) diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index 58989ad8a..4d9b0543f 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -208,6 +208,9 @@ class AdvancedTab(SettingsTab): self.display_workaround_group_box.setObjectName('display_workaround_group_box') self.display_workaround_layout = QtWidgets.QVBoxLayout(self.display_workaround_group_box) self.display_workaround_layout.setObjectName('display_workaround_layout') + self.ignore_aspect_ratio_check_box = QtWidgets.QCheckBox(self.display_workaround_group_box) + self.ignore_aspect_ratio_check_box.setObjectName('ignore_aspect_ratio_check_box') + self.display_workaround_layout.addWidget(self.ignore_aspect_ratio_check_box) self.x11_bypass_check_box = QtWidgets.QCheckBox(self.display_workaround_group_box) self.x11_bypass_check_box.setObjectName('x11_bypass_check_box') self.display_workaround_layout.addWidget(self.x11_bypass_check_box) @@ -311,6 +314,7 @@ class AdvancedTab(SettingsTab): translate('OpenLP.AdvancedTab', 'WARNING: New data directory location contains ' 'OpenLP data files. These files WILL be replaced during a copy.')) self.display_workaround_group_box.setTitle(translate('OpenLP.AdvancedTab', 'Display Workarounds')) + self.ignore_aspect_ratio_check_box.setText(translate('OpenLP.AdvancedTab', 'Ignore Aspect Ratio')) self.x11_bypass_check_box.setText(translate('OpenLP.AdvancedTab', 'Bypass X11 Window Manager')) self.alternate_rows_check_box.setText(translate('OpenLP.AdvancedTab', 'Use alternating row colours in lists')) # Slide Limits @@ -355,6 +359,7 @@ class AdvancedTab(SettingsTab): default_service_enabled = settings.value('default service enabled') self.service_name_check_box.setChecked(default_service_enabled) self.service_name_check_box_toggled(default_service_enabled) + self.ignore_aspect_ratio_check_box.setChecked(settings.value('ignore aspect ratio')) self.x11_bypass_check_box.setChecked(settings.value('x11 bypass wm')) self.slide_limits = settings.value('slide limits') self.is_search_as_you_type_enabled = settings.value('search as type') @@ -410,6 +415,7 @@ class AdvancedTab(SettingsTab): settings.setValue('hide mouse', self.hide_mouse_check_box.isChecked()) settings.setValue('alternate rows', self.alternate_rows_check_box.isChecked()) settings.setValue('slide limits', self.slide_limits) + settings.setValue('ignore aspect ratio', self.ignore_aspect_ratio_check_box.isChecked()) if self.x11_bypass_check_box.isChecked() != settings.value('x11 bypass wm'): settings.setValue('x11 bypass wm', self.x11_bypass_check_box.isChecked()) self.settings_form.register_post_process('config_screen_changed') diff --git a/tests/functional/openlp_core_lib/test_lib.py b/tests/functional/openlp_core_lib/test_lib.py index 5e9b52dfd..a897f8754 100644 --- a/tests/functional/openlp_core_lib/test_lib.py +++ b/tests/functional/openlp_core_lib/test_lib.py @@ -704,6 +704,27 @@ class TestLib(TestCase): self.assertEqual(wanted_width, result_size.width(), 'The image should have the requested width.') self.assertEqual(image.pixel(0, 0), wanted_background_rgb, 'The background should be white.') + def test_resize_thumb_ignoring_aspect_ratio(self): + """ + Test the resize_thumb() function ignoring aspect ratio + """ + # GIVEN: A path to an image. + image_path = os.path.join(TEST_PATH, 'church.jpg') + wanted_width = 1000 + wanted_height = 1000 + # We want the background to be white. + wanted_background_hex = '#FFFFFF' + wanted_background_rgb = QtGui.QColor(wanted_background_hex).rgb() + + # WHEN: Resize the image and add a background. + image = resize_image(image_path, wanted_width, wanted_height, wanted_background_hex, True) + + # THEN: Check if the size is correct and the background was set. + result_size = image.size() + self.assertEqual(wanted_height, result_size.height(), 'The image should have the requested height.') + self.assertEqual(wanted_width, result_size.width(), 'The image should have the requested width.') + self.assertEqual(image.pixel(0, 0), wanted_background_rgb, 'The background should be white.') + def test_create_separated_list_qlocate(self): """ Test the create_separated_list function using the Qt provided method