You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Select several notes in a bundled notebook, choose Tags, and add or remove
tags on all of them through the existing ViewTagsDialog2 surface.
TagViewer2 becomes multi-node with three per-tag states: All (every target
has it), Partial (some do, shown italic with an "N of M" tooltip) and None.
Clicking cycles Partial/None to All and All to None, and the dialog yields
addedTags()/removedTags(). Only that delta is written, via the incremental
TagService::tagFile/untagFile primitives, so a tag left Partial and any tag
outside the list are never touched and no file's tag array is overwritten.
Persistence goes through the controller per the multi-target batch pattern:
manageTagsRequested carries a QList, NotebookExplorer2 shows ONE dialog, and
the per-id handleTagDeltaResult is looped in the view. Targets are the
current selection filtered to valid, non-folder, non-root nodes of the
clicked notebook; the same predicate greys out the action. TagPopup2 keeps
the legacy single-node save() path unchanged.
vxcore's tag primitives are not idempotent, so applyTagDelta pre-reads each
file and drops the ops that would be no-ops on it; every failure that then
comes back is genuine. Unreadable targets are excluded from the tri-state
rather than counted as untagged, since getFileInfo returns an empty object
on failure. TagModel coalesces its reload so a batch resets the tag tree
once instead of once per tag per file.
0 commit comments