From 148f792c344ad91ce07b82475ff2b55ef0f17753 Mon Sep 17 00:00:00 2001 From: Travis Abendshien Date: Wed, 21 Aug 2024 14:47:26 -0700 Subject: [PATCH] refactor(ui): move loading icon to `ResourceManager` --- .../resources/qt/images/thumb_loading.png | Bin 0 -> 18128 bytes .../resources/qt/images/thumb_loading_512.png | Bin 12467 -> 0 bytes tagstudio/src/qt/resources.json | 4 ++ tagstudio/src/qt/widgets/thumb_renderer.py | 43 ++++++++++-------- 4 files changed, 29 insertions(+), 18 deletions(-) create mode 100644 tagstudio/resources/qt/images/thumb_loading.png delete mode 100644 tagstudio/resources/qt/images/thumb_loading_512.png diff --git a/tagstudio/resources/qt/images/thumb_loading.png b/tagstudio/resources/qt/images/thumb_loading.png new file mode 100644 index 0000000000000000000000000000000000000000..174a1879d211a7a98963b903087326172ee79056 GIT binary patch literal 18128 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 diff --git a/tagstudio/src/qt/resources.json b/tagstudio/src/qt/resources.json index 30e23f7b..ef007b6f 100644 --- a/tagstudio/src/qt/resources.json +++ b/tagstudio/src/qt/resources.json @@ -86,5 +86,9 @@ "video": { "path": "qt/images/file_icons/video.png", "mode": "pil" + }, + "thumb_loading": { + "path": "qt/images/thumb_loading.png", + "mode": "pil" } } diff --git a/tagstudio/src/qt/widgets/thumb_renderer.py b/tagstudio/src/qt/widgets/thumb_renderer.py index 9863d9e1..f6df0bce 100644 --- a/tagstudio/src/qt/widgets/thumb_renderer.py +++ b/tagstudio/src/qt/widgets/thumb_renderer.py @@ -54,12 +54,7 @@ class ThumbRenderer(QObject): updated = Signal(float, QPixmap, QSize, str) updated_ratio = Signal(float) - thumb_loading_512: Image.Image = Image.open( - Path(__file__).parents[3] / "resources/qt/images/thumb_loading_512.png" - ) - thumb_loading_512.load() - - # TODO: Make dynamic font sized given different pixel ratios + # TODO: Make dynamic font sizes given different pixel ratios font_pixel_ratio: float = 1 ext_font = ImageFont.truetype( Path(__file__).parents[3] / "resources/qt/fonts/Oxanium-Bold.ttf", @@ -220,9 +215,13 @@ class ThumbRenderer(QObject): return (im_hl, im_sh) def _render_icon( - self, name: str, color: str, size: tuple[int, int], pixel_ratio: float + self, + name: str, + color: str, + size: tuple[int, int], + pixel_ratio: float, ) -> Image.Image: - border_factor: int = 12 + border_factor: int = 5 smooth_factor: int = math.ceil(2 * pixel_ratio) radius_factor: int = 8 icon_ratio: float = 1.75 @@ -255,10 +254,14 @@ class ThumbRenderer(QObject): draw = ImageDraw.Draw(im) draw.rounded_rectangle( (0, 0) + tuple([d - 1 for d in im.size]), - radius=math.ceil(radius_factor * smooth_factor * pixel_ratio), + radius=math.ceil( + (radius_factor * smooth_factor * pixel_ratio) + (pixel_ratio * 1.5) + ), fill="black", outline="#FF0000", - width=math.floor(pixel_ratio * border_factor), + width=math.floor( + (border_factor * smooth_factor * pixel_ratio) - (pixel_ratio * 1.5) + ), ) # Resize image to final size @@ -266,7 +269,11 @@ class ThumbRenderer(QObject): size, resample=Image.Resampling.BILINEAR, ) - fg: Image.Image = Image.new("RGB", size=size, color="#00FF00") + fg: Image.Image = Image.new( + "RGB", + size=size, + color="#00FF00", + ) # Get icon by name icon: Image.Image = self.rm.get(name) @@ -301,7 +308,7 @@ class ThumbRenderer(QObject): return im def _apply_overlay_color(self, image: Image.Image, color: str) -> Image.Image: - """Apply a gradient effect over an an image. + """Apply a color overlay effect to an image based on its color channel data. Red channel for foreground, green channel for outline, none for background.""" bg_color: str = ( get_ui_color(ColorType.DARK_ACCENT, color) @@ -750,14 +757,18 @@ class ThumbRenderer(QObject): update_on_ratio_change=False, ): """Internal renderer. Renders an entry/element thumbnail for the GUI.""" - loading_thumb: Image.Image = ThumbRenderer.thumb_loading_512 - + adj_size = math.ceil(max(base_size[0], base_size[1]) * pixel_ratio) image: Image.Image = None pixmap: QPixmap = None final: Image.Image = None _filepath: Path = Path(filepath) resampling_method = Image.Resampling.BILINEAR + # Initialize "Loading" thumbnail + loading_thumb: Image.Image = self._get_icon( + "thumb_loading", "", (adj_size, adj_size), pixel_ratio + ) + if ThumbRenderer.font_pixel_ratio != pixel_ratio: ThumbRenderer.font_pixel_ratio = pixel_ratio ThumbRenderer.ext_font = ImageFont.truetype( @@ -765,10 +776,6 @@ class ThumbRenderer(QObject): math.floor(12 * ThumbRenderer.font_pixel_ratio), ) - if QGuiApplication.styleHints().colorScheme() is Qt.ColorScheme.Light: - loading_thumb = theme_fg_overlay(loading_thumb) - - adj_size = math.ceil(max(base_size[0], base_size[1]) * pixel_ratio) if is_loading: final = loading_thumb.resize( (adj_size, adj_size), resample=Image.Resampling.BILINEAR