diff --git a/hyperplane/items_page.py b/hyperplane/items_page.py index 2f297a2..cd095c9 100644 --- a/hyperplane/items_page.py +++ b/hyperplane/items_page.py @@ -111,7 +111,8 @@ def __init__( text_drop_target.connect("drop", self.__drop_text) self.grid_view.add_controller(text_drop_target) - shared.postmaster.connect("tags-changed", self.__tags_changed) + shared.postmaster.connect("tags-removed", self.__tags_changed, False) + shared.postmaster.connect("tags-added", self.__tags_changed, True) shared.postmaster.connect("toggle-hidden", self.__toggle_hidden) self.file_attrs = ",".join( @@ -359,10 +360,11 @@ def __bind(self, _factory: Gtk.SignalListItemFactory, item: Gtk.ListItem) -> Non def __unbind(self, _factory: Gtk.SignalListItemFactory, item: Gtk.ListItem) -> None: item.get_child().unbind() - def __tags_changed(self, *_args: Any) -> None: - # There may be a way to check whether I actually need to reload here - # But it may actually be slower - self.reload() + def __tags_changed(self, _obj: GObject.Object, added: bool) -> None: + # TODO: I could do less/more strict with adding/removing tags separately + self.item_filter.changed( + Gtk.FilterChange.MORE_STRICT if added else Gtk.FilterChange.LESS_STRICT + ) def __toggle_hidden(self, *_args: Any) -> None: if shared.show_hidden: diff --git a/hyperplane/postmaster_general.py b/hyperplane/postmaster_general.py index f25cbdd..47cbcf6 100644 --- a/hyperplane/postmaster_general.py +++ b/hyperplane/postmaster_general.py @@ -38,6 +38,26 @@ def zoom(self, zoom_level: int) -> None: def toggle_hidden(self) -> None: """Emitted when the visibility of hidden files changes.""" + @GObject.Signal(name="tags-added") + def tags_added(self) -> None: + """ + Emitted whenever items have been removed from the list of tags. + + You can connect to this instead of `tags-changed` for performance + reasons in an object like a filter or if you don't care about removed items. + """ + self.emit("tags-changed") + + @GObject.Signal(name="tags-removed") + def tags_removed(self) -> None: + """ + Emitted whenever items have been removed from the list of tags. + + You can connect to this instead of `tags-changed` for performance + reasons in an object like a filter or if you don't care about added items. + """ + self.emit("tags-changed") + @GObject.Signal(name="tags-changed") def tags_changed(self) -> None: """ @@ -45,6 +65,9 @@ def tags_changed(self) -> None: All objects that keep an internal list of tags should connect to it and update their list accordingly. + + You can connect to `tags-removed` and `tags-added` if you need more specificity + like when updating a filter. """ @GObject.Signal(name="tag-location-created") diff --git a/hyperplane/utils/tags.py b/hyperplane/utils/tags.py index d25f61e..dc68f6e 100644 --- a/hyperplane/utils/tags.py +++ b/hyperplane/utils/tags.py @@ -46,6 +46,7 @@ def add_tags(*tags: str) -> None: for tag in tags: shared.tags.append(tag) update_tags() + shared.postmaster.emit("tags-added") def remove_tags(*tags: str) -> None: @@ -54,12 +55,12 @@ def remove_tags(*tags: str) -> None: if tag in shared.tags: shared.tags.remove(tag) update_tags() + shared.postmaster.emit("tags-removed") def update_tags() -> None: """Updates the list of tags.""" (shared.home / ".hyperplane").write_text("\n".join(shared.tags), encoding="utf-8") - shared.postmaster.emit("tags-changed") def move_tag(tag: str, up: bool) -> None: