From a164a5e6577fac2ce72aca57e3f859aa720e5fea Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Mon, 14 Sep 2026 16:57:10 -0700 Subject: [PATCH] refactor: move leftover controller logic on TagDataView to TagData --- .../qt/controllers/tiles/tag_data.py | 35 ++++++++++++------- src/tagstudio/qt/views/tiles/tag_data_view.py | 34 +----------------- 2 files changed, 23 insertions(+), 46 deletions(-) diff --git a/src/tagstudio/qt/controllers/tiles/tag_data.py b/src/tagstudio/qt/controllers/tiles/tag_data.py index 88328522..9fd91319 100644 --- a/src/tagstudio/qt/controllers/tiles/tag_data.py +++ b/src/tagstudio/qt/controllers/tiles/tag_data.py @@ -16,6 +16,7 @@ from tagstudio.core.utils.types import unwrap from tagstudio.qt.controllers.modal import Modal from tagstudio.qt.controllers.tiles.tile_data import TileData from tagstudio.qt.mixed.build_tag import BuildTagPanel +from tagstudio.qt.mixed.tag_widget import TagWidget from tagstudio.qt.views.tiles.tag_data_view import TagDataView if TYPE_CHECKING: @@ -31,25 +32,36 @@ class TagData(TileData): def __init__(self, title: str, driver: QtDriver): self._driver = driver + self._lib = driver.lib self._entries: list[int] = [] - super().__init__(title, TagDataView(driver.lib)) - self._connect_callbacks() + super().__init__(title, TagDataView()) + self.setObjectName("tag_data") @override def layout(self) -> TagDataView: return super().layout() # pyright: ignore[reportReturnType] - def _connect_callbacks(self) -> None: - self.layout().tag_clicked.connect(self._on_click) - self.layout().tag_removed.connect(self._on_remove) - self.layout().tag_edited.connect(self._on_edit) - self.layout().tag_searched.connect(self._on_search) - def set_entries(self, entries: list[int]) -> None: self._entries = entries def set_tags(self, tags: Iterable[Tag]) -> None: - self.layout().set_tags(tags) + tags_ = sorted(list(tags), key=lambda tag: self._lib.tag_display_name(tag)) + logger.info("[TagData] Tags:", tags=tags) + + layout = self.layout() + while item := layout.takeAt(0): + if widget := item.widget(): + widget.deleteLater() + + for tag in tags_: + tag_widget = TagWidget(tag, library=self._lib, has_edit=True, has_remove=True) + tag_widget.on_click.connect(lambda t=tag: self._on_click(t)) + tag_widget.on_remove.connect(lambda t=tag: self._on_remove(t)) + tag_widget.on_edit.connect(lambda t=tag: self._on_edit(t)) + tag_widget.search_for_tag_action.triggered.connect( + lambda checked=False, t=tag: self._on_search(t) + ) + layout.addWidget(tag_widget) def _on_click(self, tag: Tag) -> None: match self._driver.settings.tag_click_action: @@ -75,10 +87,7 @@ class TagData(TileData): ) def _on_remove(self, tag: Tag) -> None: - logger.info( - "[TagData] remove_tag", - selected=self._entries, - ) + logger.info("[TagData] remove_tag", selected=self._entries) for entry_id in self._entries: self._driver.lib.remove_tags_from_entries(entry_id, tag.id) diff --git a/src/tagstudio/qt/views/tiles/tag_data_view.py b/src/tagstudio/qt/views/tiles/tag_data_view.py index 4e985a57..b5179170 100644 --- a/src/tagstudio/qt/views/tiles/tag_data_view.py +++ b/src/tagstudio/qt/views/tiles/tag_data_view.py @@ -2,45 +2,13 @@ # SPDX-License-Identifier: GPL-3.0-only -from collections.abc import Iterable - -import structlog -from PySide6.QtCore import Signal - -from tagstudio.core.library.alchemy.library import Library -from tagstudio.core.library.alchemy.models import Tag -from tagstudio.qt.mixed.tag_widget import TagWidget from tagstudio.qt.views.layouts.flow_layout import FlowLayout -logger = structlog.get_logger(__name__) - class TagDataView(FlowLayout): """The layout used for a TagData widget.""" - tag_clicked = Signal(Tag) - tag_removed = Signal(Tag) - tag_edited = Signal(Tag) - tag_searched = Signal(Tag) - - def __init__(self, library: Library) -> None: + def __init__(self) -> None: super().__init__() - self._lib = library self.enable_grid_optimizations(value=False) self.setContentsMargins(0, 0, 0, 0) - - def set_tags(self, tags: Iterable[Tag]) -> None: - tags_ = sorted(list(tags), key=lambda tag: self._lib.tag_display_name(tag)) - logger.info("[TagData] Tags:", tags=tags) - while self.itemAt(0): - self.takeAt(0).widget().deleteLater() # pyright: ignore[reportOptionalMemberAccess] - - for tag in tags_: - tag_widget = TagWidget(tag, library=self._lib, has_edit=True, has_remove=True) - tag_widget.on_click.connect(lambda t=tag: self.tag_clicked.emit(t)) - tag_widget.on_remove.connect(lambda t=tag: self.tag_removed.emit(t)) - tag_widget.on_edit.connect(lambda t=tag: self.tag_edited.emit(t)) - tag_widget.search_for_tag_action.triggered.connect( - lambda checked=False, t=tag: self.tag_searched.emit(t) - ) - self.addWidget(tag_widget)