From 7782d2438ffca976fb52fceb1583ef2cdb2df21f Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Fri, 14 Aug 2026 10:13:56 -0700 Subject: [PATCH] ui: add unique icon for applied tags in suggest box --- REUSE.toml | 1 + .../tag_bar_search_match_greyed.png | Bin 16835 -> 17723 bytes docs/usage.md | 10 ++++++++-- src/tagstudio/qt/controllers/suggest_box.py | 9 ++++++++- .../qt/controllers/tag_suggest_box.py | 13 ++++++++++--- src/tagstudio/qt/resource_manager.pyi | 1 + src/tagstudio/qt/resources.json | 4 ++++ .../resources/qt/images/hint_tag_added.png | Bin 0 -> 2615 bytes 8 files changed, 32 insertions(+), 6 deletions(-) create mode 100644 src/tagstudio/resources/qt/images/hint_tag_added.png diff --git a/REUSE.toml b/REUSE.toml index 1d39078d..93f80ffe 100644 --- a/REUSE.toml +++ b/REUSE.toml @@ -50,6 +50,7 @@ path = [ "src/tagstudio/resources/qt/images/hint_field_add.png", "src/tagstudio/resources/qt/images/hint_field_create.png", "src/tagstudio/resources/qt/images/hint_tag_add.png", + "src/tagstudio/resources/qt/images/hint_tag_added.png", "src/tagstudio/resources/qt/images/hint_tag_create.png", ] SPDX-FileCopyrightText = "(c) github:google/material-design-icons Contributors" diff --git a/docs/assets/tag_field_bars/tag_bar_search_match_greyed.png b/docs/assets/tag_field_bars/tag_bar_search_match_greyed.png index 1921730a7b1138d491ca4b34b56eac6711ffbccb..0d1077d535d9e877e2feb176d975e8fd7ab97edb 100644 GIT binary patch delta 16591 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 delta 15792 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⁣`Si!dw<`?8{58)4L%i-H|u|Lq{Bt22EZ((uo+Z3 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 diff --git a/docs/usage.md b/docs/usage.md index 801b765e..f0200a01 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -34,7 +34,11 @@ Every step is keyboard-friendly, allowing for an efficient tagging "flow state" ![Empty File Entry](assets/tag_field_bars/add_buttons_normal.png){ width=80% }
![Empty File Entry](assets/tag_field_bars/tag_bar_empty.png){ width=80% } -
Clicking "Add Tag" or pressing Ctrl+T replaces the "Add" buttons with a tag search bar. Pressing Esc (or Enter with a blank search) will close the bar and return the "Add" buttons.
+
+ Clicking "Add Tag" or pressing Ctrl+T replaces the "Add" buttons with a tag search bar. +
+ You can close the search by pressing Enter or clicking away (with a blank search), or at any time by pressing Esc. +
@@ -64,7 +68,9 @@ Tags can be also viewed, created, edited, or deleted from the **Edit -> Manage T Pressing Enter with **one or more results** will **apply** :material-tag: the underlined tag to your selection (assuming it's not already on your selection). -Tags that are already present on your entries will be greyed out and ignored when pressing Enter. This lets you visually confirm that a tag already exists and has been applied to the selection. +Matching tags that are **already applied** :material-tag-check: to your entries will be greyed out placed at the end of the autofill results. This lets you visually confirm that a tag already exists and has been applied to the selection. Applying them again with Enter has no effect other than closing the search. + +You can navigate the list of autofill suggestions using the scroll wheel, and change the selected tag by pressing Tab or Shift+Tab to navigate right and left, respectively.
![Empty File Entry](assets/tag_field_bars/tag_bar_search_match.png){ width=80% } diff --git a/src/tagstudio/qt/controllers/suggest_box.py b/src/tagstudio/qt/controllers/suggest_box.py index c3a7c6f1..66e74e46 100644 --- a/src/tagstudio/qt/controllers/suggest_box.py +++ b/src/tagstudio/qt/controllers/suggest_box.py @@ -160,6 +160,7 @@ class SuggestBox[T](QWidget): ) else: underlined_widget.toggle_underline(is_hidden=True) + self._update_hint_icon() def _clear_search_query(self) -> None: self.layout().search_field.setText("") @@ -168,8 +169,8 @@ class SuggestBox[T](QWidget): raise NotImplementedError() def _on_search_query_changed(self, query: str) -> None: - self._update_hint_icon() self._update_items(query.strip()) + self._update_hint_icon() def _on_search_query_submitted(self, query: str, always_create: bool = False) -> None: # Focus search field if no query @@ -200,6 +201,12 @@ class SuggestBox[T](QWidget): def _is_excluded(self, item: T) -> bool: return _item_id(item) in self.excluded + def _is_selected_item_added(self) -> bool: + return bool( + len(self._search_results) > self._selection_index + and _item_id(self._search_results[self._selection_index]) in self.added + ) + def _update_hint_icon(self) -> None: raise NotImplementedError() diff --git a/src/tagstudio/qt/controllers/tag_suggest_box.py b/src/tagstudio/qt/controllers/tag_suggest_box.py index e9538d37..b14540fd 100644 --- a/src/tagstudio/qt/controllers/tag_suggest_box.py +++ b/src/tagstudio/qt/controllers/tag_suggest_box.py @@ -93,7 +93,10 @@ class TagSuggestBox(SuggestBox[Tag]): @override def _on_shift_held(self, held: bool) -> None: - if held: + # Bypass normal _update_hint_icon() behavior first + if not held and self._is_selected_item_added(): + self.set_hint_icon(self._rm.hint_tag_added) + elif held: self.set_hint_icon(self._rm.hint_tag_create) else: self._update_hint_icon() @@ -102,7 +105,11 @@ class TagSuggestBox(SuggestBox[Tag]): @override def _update_hint_icon(self) -> None: - if self.layout().search_field.text() and len(self._search_results) > 0: + results = bool(len(self._search_results) > 0) + + if results and self._is_selected_item_added(): + self.set_hint_icon(self._rm.hint_tag_added) + elif results: self.set_hint_icon(self._rm.hint_tag_add) elif self.layout().search_field.text(): self.set_hint_icon(self._rm.hint_tag_create) @@ -135,7 +142,7 @@ class TagSuggestBox(SuggestBox[Tag]): if item is None: return - # TODO: Add tabbing to different items, and use underline to indicate which will be added + # Select first item underlined_widget.toggle_underline(index != 0) # Disconnect previous callbacks diff --git a/src/tagstudio/qt/resource_manager.pyi b/src/tagstudio/qt/resource_manager.pyi index 46e6ca58..6ff32496 100644 --- a/src/tagstudio/qt/resource_manager.pyi +++ b/src/tagstudio/qt/resource_manager.pyi @@ -39,6 +39,7 @@ class ResourceManager: hint_field_add: Image.Image hint_field_create: Image.Image hint_tag_add: Image.Image + hint_tag_added: Image.Image hint_tag_create: Image.Image icon: Image.Image ignored_stat: Image.Image diff --git a/src/tagstudio/qt/resources.json b/src/tagstudio/qt/resources.json index 3fbdefba..7568ca53 100644 --- a/src/tagstudio/qt/resources.json +++ b/src/tagstudio/qt/resources.json @@ -83,6 +83,10 @@ "mode": "pil", "path": "qt/images/hint_tag_add.png" }, + "hint_tag_added": { + "mode": "pil", + "path": "qt/images/hint_tag_added.png" + }, "hint_tag_create": { "mode": "pil", "path": "qt/images/hint_tag_create.png" diff --git a/src/tagstudio/resources/qt/images/hint_tag_added.png b/src/tagstudio/resources/qt/images/hint_tag_added.png new file mode 100644 index 0000000000000000000000000000000000000000..652930c3ae2d43b13ce1ead5166662c6db784890 GIT binary patch literal 2615 zcmai0d0Z3M7M`#dL6D~stCA2vlqD0wCV3=40tiZwB?1x^LNWUd= zwIYjBD}t?{LZyWQA}Ct@p#{`ZDuRf(Jroc!_jo z0q;#Q1AmZ+%J=aUB}e+PU?%f_hl@n-Eklm@DNrHai27ble@`H1siY7X2FWE!GA`t& zfW(NEMhUepln_`6B}DncB1kMp)uj^LT>b&B{RGI6BuHf8=%#|G1Sd_7S~*Ifh$Da^ zVIC4c!}WGN2oeka38*VeNK&_UjTlDPLVn8?^%kQN+{xfO)2#g{G}8x)raGpChZg6o zA$$u3G8iE;2_H^CF?rYuIzG^k;pXJw=H^HyPS1cgje_RFe3dT;L8HhdvYR7mxucT{ zi{wFZaiO@nJCfWfB$9?%6OEn)9tYw4zj*bI#(Sa}OeQ4&mLn3GN;5RQ&BLL@X>Zz1 zfHnIYkJogW!r`h#q7tMs2``BY@idd8bknF@!bg%hGRQ}OHkeBA;qzfsP8B{xy>szo zJelZ5oK|8cB{?2K={~(U@J(r;`pErVnbHxp{}Y`wW}_+m^IrrTQG@BQ@IaD?Ys^Yo){~;7;U{sN4UMp ze*J|}N(4DNIBG+143Qm{Hq32k$-Ug(9{6b9u#fF!Ys|VJXP-SBy#;$!STIeG=a-q< zyZV)b?!`5{h-KfNq!$?Zd6w=wk`flTa{Ne+19bZJ7n2obSyNpPz5;Gq7~iSEMZ5JK zkHg~hvqqB)m?qNV%Dd(hoB`(eO6J2qGAELj|8fi-6)pcG{Xd&rkG7^AS&}HU(*-Zw z&Y|C%S4~{AX`-(E+G5}91ILLRfq9RtVe|8a*cw6et^#Kq`g8G_G+?b90A~G5{a}EC zLM#AimjwFyu#|;&4+aY7`e3t4dCZ3Y(P^=lDt`-~qkFf{Bpvplq= z5g%znzdCewS94t}&}q4-@ZKq&41q zT)d&ee&mcB=8Cs1No#7NGbLkwte4X@-k~|qc6bd{DNMe3h`aW^|CmW}_s{8u!}*pK zjC*YtmTVn#$Sw-8L?}z^V;M{7CnoY7UUsJ|VhxVzDzrMN*Sm}p^z^7HIhPQZhOb{m ztTC>RK0p8Rfmpj{q@)-#&OUGMYrq-YO~|40ura2Va~J+tvjW@OS7DmD&&takwERX3 zn@ysv#F>xH-?A*d+u+W(v((xPeE9ykFYS{s3v=14dph^6J{{Jdw8VO(`aI_|sRNH~ zJX*UX2VfV@DT{aF3iTc^UOXBF@|R6v1TD*=w-!c}^9A%5G$~+a|7=@ZUL2((9DY%$ zpXQMjo>}Q{k;@$1-jP#x-!#~`!Eo(gLh>-it|RBqJ_FP@n_Nc+&B7>qf!OHVIINy%)lK4j8lsGqi<@Zzp6EhMvb%Bt$O+#BILBX9L-7tL~dt@FKX zAk@77@NC?W*6ZdL3zl}Z^~iI3xumojiIi)bO*vPMPuleq@<;1%uSCne4L z1>00Kd`4OML)P!FIKP!;q7RI2{J7w8x4 Jdx9Rj<-frx@>Ku; literal 0 HcmV?d00001