diff --git a/src/tagstudio/qt/cache_manager.py b/src/tagstudio/qt/cache_manager.py index 00d812ff..98094ffc 100644 --- a/src/tagstudio/qt/cache_manager.py +++ b/src/tagstudio/qt/cache_manager.py @@ -12,7 +12,7 @@ import structlog from PIL import Image from tagstudio.core.constants import THUMB_CACHE_NAME, TS_FOLDER_NAME -from tagstudio.qt.global_settings import DEFAULT_CACHED_IMAGE_QUALITY, DEFAULT_THUMB_CACHE_SIZE +from tagstudio.qt.global_settings import DEFAULT_CACHED_THUMB_QUALITY, DEFAULT_THUMB_CACHE_SIZE logger = structlog.get_logger(__name__) @@ -31,7 +31,7 @@ class CacheManager: self, library_dir: Path, max_size: int | float = DEFAULT_THUMB_CACHE_SIZE, - img_quality: int = DEFAULT_CACHED_IMAGE_QUALITY, + img_quality: int = DEFAULT_CACHED_THUMB_QUALITY, ): """A class for managing frontend caches, such as for file thumbnails. @@ -47,7 +47,7 @@ class CacheManager: math.floor(CacheManager.MAX_FOLDER_SIZE * CacheManager.STAT_MULTIPLIER), ) self.img_quality = ( - img_quality if img_quality >= 0 and img_quality <= 100 else DEFAULT_CACHED_IMAGE_QUALITY + img_quality if img_quality >= 0 and img_quality <= 100 else DEFAULT_CACHED_THUMB_QUALITY ) self.folders: list[CacheFolder] = [] diff --git a/src/tagstudio/qt/global_settings.py b/src/tagstudio/qt/global_settings.py index e82e9648..85fe1f36 100644 --- a/src/tagstudio/qt/global_settings.py +++ b/src/tagstudio/qt/global_settings.py @@ -26,8 +26,10 @@ DEFAULT_THUMB_CACHE_SIZE = 500 # Number in MiB MIN_THUMB_CACHE_SIZE = 10 # Number in MiB # See: https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#webp-saving -DEFAULT_CACHED_IMAGE_QUALITY = 80 -DEFAULT_CACHED_IMAGE_RES = 256 +DEFAULT_CACHED_THUMB_QUALITY = 80 # WebP Compression Quality +MIN_CACHED_THUMB_RES = 32 # Pixels +MAX_CACHED_THUMB_RES = 1024 # Pixels +DEFAULT_CACHED_THUMB_RES = 256 # Pixels class Theme(IntEnum): @@ -62,8 +64,8 @@ class GlobalSettings(BaseModel): open_last_loaded_on_startup: bool = Field(default=True) generate_thumbs: bool = Field(default=True) thumb_cache_size: float = Field(default=DEFAULT_THUMB_CACHE_SIZE) - cached_thumb_quality: int = Field(default=DEFAULT_CACHED_IMAGE_QUALITY) - cached_thumb_resolution: int = Field(default=DEFAULT_CACHED_IMAGE_RES) + cached_thumb_quality: int = Field(default=DEFAULT_CACHED_THUMB_QUALITY) + cached_thumb_resolution: int = Field(default=DEFAULT_CACHED_THUMB_RES) autoplay: bool = Field(default=True) scan_files_on_open: bool = Field(default=True) loop: bool = Field(default=True) diff --git a/src/tagstudio/qt/mixed/settings_panel.py b/src/tagstudio/qt/mixed/settings_panel.py index edb7a9f4..b82393ac 100644 --- a/src/tagstudio/qt/mixed/settings_panel.py +++ b/src/tagstudio/qt/mixed/settings_panel.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING, Any import structlog from PySide6.QtCore import Qt -from PySide6.QtGui import QDoubleValidator +from PySide6.QtGui import QDoubleValidator, QIntValidator from PySide6.QtWidgets import ( QCheckBox, QComboBox, @@ -21,7 +21,10 @@ from PySide6.QtWidgets import ( from tagstudio.core.enums import ShowFilepathOption, TagClickActionOption from tagstudio.qt.global_settings import ( + DEFAULT_CACHED_THUMB_RES, DEFAULT_THUMB_CACHE_SIZE, + MAX_CACHED_THUMB_RES, + MIN_CACHED_THUMB_RES, MIN_THUMB_CACHE_SIZE, Splash, Theme, @@ -159,8 +162,10 @@ class SettingsPanel(PanelWidget): self.thumb_cache_size_layout.setSpacing(6) self.thumb_cache_size = QLineEdit() self.thumb_cache_size.setAlignment(Qt.AlignmentFlag.AlignRight) - self.validator = QDoubleValidator(MIN_THUMB_CACHE_SIZE, 1_000_000_000, 2) # High limit - self.thumb_cache_size.setValidator(self.validator) + self.thumb_cache_size_validator = QDoubleValidator( + MIN_THUMB_CACHE_SIZE, 1_000_000_000, 2 + ) # High limit + self.thumb_cache_size.setValidator(self.thumb_cache_size_validator) self.thumb_cache_size.setText( str(max(self.driver.settings.thumb_cache_size, MIN_THUMB_CACHE_SIZE)).removesuffix(".0") ) @@ -171,6 +176,23 @@ class SettingsPanel(PanelWidget): Translations["settings.thumb_cache_size.label"], self.thumb_cache_size_container ) + # Cached Thumbnail Resolution + self.cached_thumb_res_container = QWidget() + self.cached_thumb_res_layout = QHBoxLayout(self.cached_thumb_res_container) + self.cached_thumb_res_layout.setContentsMargins(0, 0, 0, 0) + self.cached_thumb_res_layout.setSpacing(6) + self.cached_thumb_res = QLineEdit() + self.cached_thumb_res.setAlignment(Qt.AlignmentFlag.AlignRight) + self.cached_thumb_res_validator = QIntValidator(MIN_CACHED_THUMB_RES, MAX_CACHED_THUMB_RES) + self.cached_thumb_res.setValidator(self.cached_thumb_res_validator) + self.cached_thumb_res.setText(str(self.driver.settings.cached_thumb_resolution)) + self.cached_thumb_res_layout.addWidget(self.cached_thumb_res) + self.cached_thumb_res_layout.setStretch(1, 2) + self.cached_thumb_res_layout.addWidget(QLabel("px")) + form_layout.addRow( + Translations["settings.cached_thumb_resolution.label"], self.cached_thumb_res_container + ) + # Autoplay self.autoplay_checkbox = QCheckBox() self.autoplay_checkbox.setChecked(self.driver.settings.autoplay) @@ -298,9 +320,16 @@ class SettingsPanel(PanelWidget): "open_last_loaded_on_startup": self.open_last_lib_checkbox.isChecked(), "generate_thumbs": self.generate_thumbs.isChecked(), "thumb_cache_size": max( - float(self.thumb_cache_size.text()) or DEFAULT_THUMB_CACHE_SIZE, + float(self.thumb_cache_size.text() or DEFAULT_THUMB_CACHE_SIZE), MIN_THUMB_CACHE_SIZE, ), + "cached_thumb_resolution": min( + max( + int(self.cached_thumb_res.text() or DEFAULT_CACHED_THUMB_RES), + MIN_CACHED_THUMB_RES, + ), + MAX_CACHED_THUMB_RES, + ), "autoplay": self.autoplay_checkbox.isChecked(), "scan_files_on_open": self.scan_files_on_open_checkbox.isChecked(), "show_filenames_in_grid": self.show_filenames_checkbox.isChecked(), @@ -324,6 +353,7 @@ class SettingsPanel(PanelWidget): driver.settings.scan_files_on_open = settings["scan_files_on_open"] driver.settings.generate_thumbs = settings["generate_thumbs"] driver.settings.thumb_cache_size = settings["thumb_cache_size"] + driver.settings.cached_thumb_resolution = settings["cached_thumb_resolution"] driver.settings.show_filenames_in_grid = settings["show_filenames_in_grid"] driver.settings.page_size = settings["page_size"] driver.settings.infinite_scroll = settings["infinite_scroll"] @@ -333,7 +363,7 @@ class SettingsPanel(PanelWidget): driver.settings.date_format = settings["date_format"] driver.settings.hour_format = settings["hour_format"] driver.settings.zero_padding = settings["zero_padding"] - driver.settings.splash = settings["splash"] + driver.settings.splash = Splash(settings["splash"]) or Splash.DEFAULT driver.settings.save() @@ -359,7 +389,7 @@ class SettingsPanel(PanelWidget): window_title=Translations["settings.title"], is_savable=True, ) - modal.done.connect(lambda: settings_panel.update_settings(driver)) + modal.saved.connect(lambda: settings_panel.update_settings(driver)) modal.title_widget.setVisible(False) return modal diff --git a/src/tagstudio/qt/previews/renderer.py b/src/tagstudio/qt/previews/renderer.py index ee087384..b0f6f29e 100644 --- a/src/tagstudio/qt/previews/renderer.py +++ b/src/tagstudio/qt/previews/renderer.py @@ -72,7 +72,11 @@ from tagstudio.core.library.ignore import Ignore from tagstudio.core.media_types import MediaCategories, MediaType from tagstudio.core.utils.encoding import detect_char_encoding from tagstudio.core.utils.types import unwrap -from tagstudio.qt.global_settings import DEFAULT_CACHED_IMAGE_RES +from tagstudio.qt.global_settings import ( + DEFAULT_CACHED_THUMB_RES, + MAX_CACHED_THUMB_RES, + MIN_CACHED_THUMB_RES, +) from tagstudio.qt.helpers.color_overlay import auto_theme_overlay from tagstudio.qt.helpers.file_tester import is_readable_video from tagstudio.qt.helpers.gradients import four_corner_gradient @@ -159,8 +163,8 @@ class ThumbRenderer(QObject): settings_res = self.driver.settings.cached_thumb_resolution self.cached_img_res = ( settings_res - if settings_res >= 16 and settings_res <= 2048 - else DEFAULT_CACHED_IMAGE_RES + if settings_res >= MIN_CACHED_THUMB_RES and settings_res <= MAX_CACHED_THUMB_RES + else DEFAULT_CACHED_THUMB_RES ) # Cached thumbnail elements. diff --git a/src/tagstudio/qt/ts_qt.py b/src/tagstudio/qt/ts_qt.py index 50dda1af..a7b26648 100644 --- a/src/tagstudio/qt/ts_qt.py +++ b/src/tagstudio/qt/ts_qt.py @@ -412,7 +412,7 @@ class QtDriver(DriverMixin, QObject): lambda: self.call_if_library_open(self.backup_library) ) - # Settings... + # Settings self.main_window.menu_bar.settings_action.triggered.connect(self.open_settings_modal) # Open Library on Start diff --git a/src/tagstudio/resources/translations/en.json b/src/tagstudio/resources/translations/en.json index 5ddcf101..5e9d27a6 100644 --- a/src/tagstudio/resources/translations/en.json +++ b/src/tagstudio/resources/translations/en.json @@ -277,6 +277,7 @@ "select.all": "Select All", "select.clear": "Clear Selection", "select.inverse": "Invert Selection", + "settings.cached_thumb_resolution.label": "Cached Thumbnail Resolution", "settings.clear_thumb_cache.title": "Clear Thumbnail Cache", "settings.dateformat.english": "English", "settings.dateformat.international": "International",