diff --git a/src/tagstudio/core/global_settings.py b/src/tagstudio/core/global_settings.py index 5320e61e..087e2dc1 100644 --- a/src/tagstudio/core/global_settings.py +++ b/src/tagstudio/core/global_settings.py @@ -44,6 +44,7 @@ class Theme(Enum): class GlobalSettings(BaseModel): language: str = Field(default="en") open_last_loaded_on_startup: bool = Field(default=True) + generate_thumbs: bool = Field(default=False) autoplay: bool = Field(default=True) loop: bool = Field(default=True) show_filenames_in_grid: bool = Field(default=True) diff --git a/src/tagstudio/qt/modals/settings_panel.py b/src/tagstudio/qt/modals/settings_panel.py index 9e90bcf8..5c533256 100644 --- a/src/tagstudio/qt/modals/settings_panel.py +++ b/src/tagstudio/qt/modals/settings_panel.py @@ -135,6 +135,10 @@ class SettingsPanel(PanelWidget): Translations["settings.open_library_on_start"], self.open_last_lib_checkbox ) + self.generate_thumbs = QCheckBox() + self.generate_thumbs.setChecked(self.driver.settings.generate_thumbs) + form_layout.addRow(Translations["settings.generate_thumbs"], self.generate_thumbs) + # Autoplay self.autoplay_checkbox = QCheckBox() self.autoplay_checkbox.setChecked(self.driver.settings.autoplay) @@ -232,6 +236,7 @@ class SettingsPanel(PanelWidget): return { "language": self.__get_language(), "open_last_loaded_on_startup": self.open_last_lib_checkbox.isChecked(), + "generate_thumbs": self.generate_thumbs.isChecked(), "autoplay": self.autoplay_checkbox.isChecked(), "show_filenames_in_grid": self.show_filenames_checkbox.isChecked(), "page_size": int(self.page_size_line_edit.text()), @@ -249,6 +254,7 @@ class SettingsPanel(PanelWidget): driver.settings.language = settings["language"] driver.settings.open_last_loaded_on_startup = settings["open_last_loaded_on_startup"] driver.settings.autoplay = settings["autoplay"] + driver.settings.generate_thumbs = settings["generate_thumbs"] driver.settings.show_filenames_in_grid = settings["show_filenames_in_grid"] driver.settings.page_size = settings["page_size"] driver.settings.show_filepath = settings["show_filepath"] diff --git a/src/tagstudio/qt/view/widgets/preview/preview_thumb_view.py b/src/tagstudio/qt/view/widgets/preview/preview_thumb_view.py index ffeae996..d3615f9a 100644 --- a/src/tagstudio/qt/view/widgets/preview/preview_thumb_view.py +++ b/src/tagstudio/qt/view/widgets/preview/preview_thumb_view.py @@ -98,7 +98,7 @@ class PreviewThumbView(QWidget): self.__media_player_page = QWidget() self.__stacked_page_setup(self.__media_player_page, self.__media_player) - self.__thumb_renderer = ThumbRenderer(library) + self.__thumb_renderer = ThumbRenderer(library, driver) self.__thumb_renderer.updated.connect(self.__thumb_renderer_updated_callback) self.__thumb_renderer.updated_ratio.connect(self.__thumb_renderer_updated_ratio_callback) diff --git a/src/tagstudio/qt/widgets/item_thumb.py b/src/tagstudio/qt/widgets/item_thumb.py index 3d6780cd..f011d726 100644 --- a/src/tagstudio/qt/widgets/item_thumb.py +++ b/src/tagstudio/qt/widgets/item_thumb.py @@ -201,7 +201,7 @@ class ItemThumb(FlowWidget): self.thumb_layout.addWidget(self.bottom_container) self.thumb_button = ThumbButton(self.thumb_container, thumb_size) - self.renderer = ThumbRenderer(self.lib) + self.renderer = ThumbRenderer(self.lib, self.driver) self.renderer.updated.connect( lambda timestamp, image, size, filename: ( self.update_thumb(image, timestamp), diff --git a/src/tagstudio/qt/widgets/thumb_renderer.py b/src/tagstudio/qt/widgets/thumb_renderer.py index f660a974..3d06cd47 100644 --- a/src/tagstudio/qt/widgets/thumb_renderer.py +++ b/src/tagstudio/qt/widgets/thumb_renderer.py @@ -11,7 +11,7 @@ import zipfile from copy import deepcopy from io import BytesIO from pathlib import Path -from typing import cast +from typing import TYPE_CHECKING, cast from warnings import catch_warnings import cv2 @@ -72,6 +72,9 @@ from tagstudio.qt.helpers.vendored.pydub.audio_segment import ( ) from tagstudio.qt.resource_manager import ResourceManager +if TYPE_CHECKING: + from tagstudio.qt.ts_qt import QtDriver + ImageFile.LOAD_TRUNCATED_IMAGES = True os.environ["OPENCV_IO_ENABLE_OPENEXR"] = "1" @@ -99,10 +102,11 @@ class ThumbRenderer(QObject): last_cache_folder: Path | None = None - def __init__(self, library) -> None: + def __init__(self, library, driver: "QtDriver") -> None: """Initialize the class.""" super().__init__() self.lib = library + self.driver = driver ThumbRenderer.cache.set_library(self.lib) # Cached thumbnail elements. @@ -1437,7 +1441,8 @@ class ThumbRenderer(QObject): if image: ThumbRenderer.last_cache_folder = folder break - if not image: + + if not image and self.driver.settings.generate_thumbs: # Render from file, return result, and try to save a cached version. # TODO: Audio waveforms are dynamically sized based on the base_size, so hardcoding # the resolution breaks that. @@ -1449,15 +1454,16 @@ class ThumbRenderer(QObject): is_grid_thumb, save_to_file=Path(f"{hash_value}{ThumbRenderer.cached_img_ext}"), ) - # If the normal renderer failed, fallback the the defaults - # (with native non-cached sizing!) - if not image: - image = ( - render_unlinked((adj_size, adj_size), pixel_ratio) - if not filepath.exists() or filepath.is_dir() - else render_default((adj_size, adj_size), pixel_ratio) - ) - render_mask_and_edge = False + + # If the normal renderer failed, fallback the the defaults + # (with native non-cached sizing!) + if not image: + image = ( + render_unlinked((adj_size, adj_size), pixel_ratio) + if not filepath.exists() or filepath.is_dir() + else render_default((adj_size, adj_size), pixel_ratio) + ) + render_mask_and_edge = False # Apply the mask and edge if image: diff --git a/src/tagstudio/resources/translations/en.json b/src/tagstudio/resources/translations/en.json index 62e6d90a..57bd2588 100644 --- a/src/tagstudio/resources/translations/en.json +++ b/src/tagstudio/resources/translations/en.json @@ -243,6 +243,7 @@ "settings.language": "Language", "settings.library": "Library Settings", "settings.open_library_on_start": "Open Library on Start", + "settings.generate_thumbs": "Thumbnail Generation", "settings.page_size": "Page Size", "settings.restart_required": "Please restart TagStudio for changes to take effect.", "settings.show_filenames_in_grid": "Show Filenames in Grid",