From 0529925cd1f1e52d767db13969a531dabeade0a5 Mon Sep 17 00:00:00 2001 From: CallMeHein <37670876+CallMeHein@users.noreply.github.com> Date: Sat, 8 Nov 2025 01:18:07 +0100 Subject: [PATCH] fix: "Search for Tag" in Tag Manager executes multiple queries (#1173) * test: add test to ensure actions are replaced when widgets are replaced * fix: disconnect previous action before adding new action --- src/tagstudio/qt/mixed/tag_search.py | 1 + tests/qt/test_tag_search_panel.py | 37 ++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/tagstudio/qt/mixed/tag_search.py b/src/tagstudio/qt/mixed/tag_search.py index 53990c37..3a3e120b 100644 --- a/src/tagstudio/qt/mixed/tag_search.py +++ b/src/tagstudio/qt/mixed/tag_search.py @@ -304,6 +304,7 @@ class TagSearchPanel(PanelWidget): tag_widget.on_edit.disconnect() tag_widget.on_remove.disconnect() tag_widget.bg_button.clicked.disconnect() + tag_widget.search_for_tag_action.triggered.disconnect() tag_id = tag.id tag_widget.on_edit.connect(lambda t=tag: self.edit_tag(t)) diff --git a/tests/qt/test_tag_search_panel.py b/tests/qt/test_tag_search_panel.py index 9045fd8a..bc455685 100644 --- a/tests/qt/test_tag_search_panel.py +++ b/tests/qt/test_tag_search_panel.py @@ -1,12 +1,13 @@ # Copyright (C) 2025 # Licensed under the GPL-3.0 License. # Created for TagStudio: https://github.com/CyanVoxel/TagStudio - - +from PySide6.QtCore import SIGNAL from pytestqt.qtbot import QtBot from tagstudio.core.library.alchemy.library import Library from tagstudio.qt.mixed.tag_search import TagSearchPanel +from tagstudio.qt.mixed.tag_widget import TagWidget +from tagstudio.qt.ts_qt import QtDriver def test_update_tags(qtbot: QtBot, library: Library): @@ -17,3 +18,35 @@ def test_update_tags(qtbot: QtBot, library: Library): # When panel.update_tags() + + +def test_tag_widget_actions_replaced_correctly(qtbot: QtBot, qt_driver: QtDriver, library: Library): + panel = TagSearchPanel(library) + qtbot.addWidget(panel) + panel.driver = qt_driver + + # Set the widget + tags = library.tags + panel.set_tag_widget(tags[0], 0) + tag_widget: TagWidget = panel.scroll_layout.itemAt(0).widget() + + should_replace_actions = { + tag_widget: ["on_edit()", "on_remove()"], + tag_widget.bg_button: ["clicked()"], + tag_widget.search_for_tag_action: ["triggered()"], + } + + # Ensure each action has been set + ensure_one_receiver_per_action(should_replace_actions) + + # Set the widget again + panel.set_tag_widget(tags[0], 0) + + # Ensure each action has been replaced (amount of receivers is still 1) + ensure_one_receiver_per_action(should_replace_actions) + + +def ensure_one_receiver_per_action(should_replace_actions): + for action, signal_strings in should_replace_actions.items(): + for signal_str in signal_strings: + assert action.receivers(SIGNAL(signal_str)) == 1