From 56a80ff13c59f8992c522f005a7dc64a25eaa31a Mon Sep 17 00:00:00 2001 From: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com> Date: Fri, 3 Jan 2025 01:39:06 -0800 Subject: [PATCH] fix: don't add tags to previous selections --- tagstudio/src/core/library/alchemy/library.py | 16 ++-------- .../qt/widgets/preview/field_containers.py | 31 ++++++++++++++----- tagstudio/src/qt/widgets/preview_panel.py | 9 +++--- 3 files changed, 29 insertions(+), 27 deletions(-) diff --git a/tagstudio/src/core/library/alchemy/library.py b/tagstudio/src/core/library/alchemy/library.py index e43f19e5..28dcf789 100644 --- a/tagstudio/src/core/library/alchemy/library.py +++ b/tagstudio/src/core/library/alchemy/library.py @@ -780,7 +780,7 @@ class Library: self, entry_ids: list[int] | int, field: BaseField, - content: str | datetime | set[Tag], + content: str | datetime, ): if isinstance(entry_ids, int): entry_ids = [entry_ids] @@ -840,24 +840,12 @@ class Library: field_id = field_id.name field = self.get_value_type(field_id) - field_model: TextField | DatetimeField # | TagBoxField + field_model: TextField | DatetimeField if field.type in (FieldTypeEnum.TEXT_LINE, FieldTypeEnum.TEXT_BOX): field_model = TextField( type_key=field.key, value=value or "", ) - # elif field.type == FieldTypeEnum.TAGS: - # field_model = TagBoxField( - # type_key=field.key, - # ) - # - # if value: - # assert isinstance(value, list) - # with Session(self.engine) as session: - # for tag_id in list(set(value)): - # tag = session.scalar(select(Tag).where(Tag.id == tag_id)) - # field_model.tags.add(tag) - # session.flush() elif field.type == FieldTypeEnum.DATETIME: field_model = DatetimeField( diff --git a/tagstudio/src/qt/widgets/preview/field_containers.py b/tagstudio/src/qt/widgets/preview/field_containers.py index 89b258e0..5ce97dcc 100644 --- a/tagstudio/src/qt/widgets/preview/field_containers.py +++ b/tagstudio/src/qt/widgets/preview/field_containers.py @@ -111,17 +111,16 @@ class FieldContainers(QWidget): self.selected = [self.lib.get_entry_full(entry.id)] logger.info( "[FieldContainers] Updating Selection", - entry=entry, + path=entry.path, fields=entry.fields, tags=entry.tags, ) entry_ = self.selected[0] container_len: int = len(entry_.fields) - # for index, tag in enumerate(entry_.tags): - # self.write_tag_container(index, ) - # TODO: Break up into categories container_index = 0 + + # Write tag container(s) if entry_.tags: categories = self.get_tag_categories(entry_.tags) for cat, tags in sorted(categories.items(), key=lambda kv: (kv[0] is None, kv)): @@ -130,16 +129,18 @@ class FieldContainers(QWidget): ) container_index += 1 container_len += 1 + # Write field container(s) for index, field in enumerate(entry_.fields, start=container_index): self.write_container(index, field, is_mixed=False) - # Hide leftover containers + # Hide leftover container(s) if len(self.containers) > container_len: for i, c in enumerate(self.containers): if i > (container_len - 1): c.setHidden(True) def get_tag_categories(self, tags: set[Tag]) -> dict[Tag, set[Tag | None]]: + """Get a dictionary of category tags mapped to their respective tags.""" cats: dict[Tag, set[Tag | None]] = {} cats[None] = set() @@ -151,6 +152,7 @@ class FieldContainers(QWidget): cats[p_tag] = set() logger.info("Blank Tag Categories", cats=cats) + # Add tags to any applicable categories for tag in tags: is_general = True for p_tag in list(cats.keys()): @@ -167,6 +169,7 @@ class FieldContainers(QWidget): if is_general: cats[None].add(tag) + # Remove unused categories empty: list[Tag] = [] for k, v in list(cats.items()): if not v: @@ -183,7 +186,9 @@ class FieldContainers(QWidget): def add_field_to_selected(self, field_list: list): """Add list of entry fields to one or more selected items.""" logger.info( - "[FieldContainers][add_field_to_selected]", selected=self.selected, fields=field_list + "[FieldContainers][add_field_to_selected]", + selected=[x.path for x in self.selected], + fields=field_list, ) for entry in self.selected: for field_item in field_list: @@ -194,7 +199,11 @@ class FieldContainers(QWidget): def add_tags_to_selected(self, tags: list[int]): """Add list of tags to one or more selected items.""" - logger.info("[FieldContainers][add_tags_to_selected]", selected=self.selected, tags=tags) + logger.info( + "[FieldContainers][add_tags_to_selected]", + selected=[x.path for x in self.selected], + tags=tags, + ) for entry in self.selected: self.lib.add_tags_to_entry( entry.id, @@ -377,6 +386,7 @@ class FieldContainers(QWidget): inner_widget = container.get_inner_widget() if isinstance(inner_widget, TagBoxWidget): + logger.warning("recycling") inner_widget.set_tags(tags) try: inner_widget.updated.disconnect() @@ -384,6 +394,7 @@ class FieldContainers(QWidget): logger.error("[FieldContainers] Failed to disconnect inner_container.updated") else: + logger.warning("creating new") inner_widget = TagBoxWidget( tags, "Tags", @@ -408,7 +419,11 @@ class FieldContainers(QWidget): def remove_field(self, field: BaseField): """Remove a field from all selected Entries.""" - logger.info("[FieldContainers] Removing Field", field=field, selected=self.selected) + logger.info( + "[FieldContainers] Removing Field", + field=field, + selected=[x.path for x in self.selected], + ) entry_ids = [e.id for e in self.selected] self.lib.remove_entry_field(field, entry_ids) diff --git a/tagstudio/src/qt/widgets/preview_panel.py b/tagstudio/src/qt/widgets/preview_panel.py index f651b187..3aa11ddd 100644 --- a/tagstudio/src/qt/widgets/preview_panel.py +++ b/tagstudio/src/qt/widgets/preview_panel.py @@ -5,6 +5,7 @@ import traceback import typing from pathlib import Path +from warnings import catch_warnings import structlog from PySide6.QtCore import Qt, Signal @@ -161,9 +162,8 @@ class PreviewPanel(QWidget): self.add_field_button.clicked.connect(self.add_field_modal.show) def update_add_tag_button(self, entry: Entry): - # if self.add_tag_modal.is_connected: - # self.add_tag_modal.done.disconnect() - if self.add_tag_button.is_connected: + with catch_warnings(record=True): + self.add_tag_modal.widget.tag_chosen.disconnect() self.add_tag_button.clicked.disconnect() self.add_tag_modal.widget.tag_chosen.connect( @@ -172,11 +172,10 @@ class PreviewPanel(QWidget): self.fields.update_from_entry(entry), ) ) - # self.add_tag_modal.is_connected = True self.add_tag_button.clicked.connect( lambda: ( - # self.add_tag_modal.widget.update_tags(), + self.add_tag_modal.widget.update_tags(), self.add_tag_modal.show(), ) )