feat: add thumbnail generation toggle (#1057)

This commit is contained in:
Eric
2025-08-27 09:51:36 +08:00
committed by GitHub
parent eb2887e871
commit 5dfcc36d70
6 changed files with 28 additions and 14 deletions

View File

@@ -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)

View File

@@ -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"]

View File

@@ -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)

View File

@@ -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),

View File

@@ -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:

View File

@@ -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",