From d748ae26884de27119da2030eb689759abc28069 Mon Sep 17 00:00:00 2001 From: Kaede Akino Date: Sat, 29 Aug 2026 03:29:22 +0800 Subject: [PATCH] Add snippet package selection --- Termind/Features/Hosts/HostsPageView.swift | 2 +- .../Features/Snippets/SnippetsPageView.swift | 17 +++++++++++++++++ TermindTests/ContextPanelSelectionTests.swift | 12 ++++++++++++ 3 files changed, 30 insertions(+), 1 deletion(-) diff --git a/Termind/Features/Hosts/HostsPageView.swift b/Termind/Features/Hosts/HostsPageView.swift index 5ee5b0b4..23ce868c 100644 --- a/Termind/Features/Hosts/HostsPageView.swift +++ b/Termind/Features/Hosts/HostsPageView.swift @@ -333,7 +333,7 @@ struct HostsPageView: ManagedCardPage { private func setHostSelection(_ ids: Set) { let valid = ids.intersection(Set(app.hostLibrary.hosts.map(\.id))) - if !valid.isEmpty { state.selectedGroupID = nil } + state.selectedGroupID = nil let ordered = visibleHosts.filter { valid.contains($0.id) }.map { ContextPanelDetailID.host($0.id) } window.setDetailSelection(ordered, for: .hosts) } diff --git a/Termind/Features/Snippets/SnippetsPageView.swift b/Termind/Features/Snippets/SnippetsPageView.swift index 02fe9ef6..6f9cd149 100644 --- a/Termind/Features/Snippets/SnippetsPageView.swift +++ b/Termind/Features/Snippets/SnippetsPageView.swift @@ -32,6 +32,7 @@ final class SnippetsPageState { } var query = "" + var selectedPackageID: SnippetPackage.ID? var confirmation: ConfirmationRoute? } @@ -167,6 +168,8 @@ struct SnippetsPageView: ManagedCardPage { ) }, isCollapsed: !package.isExpanded, + select: { selectPackage(package.id) }, + isSelected: state.selectedPackageID == package.id, isDropTarget: isDropTarget ) .contextMenu { @@ -284,11 +287,17 @@ struct SnippetsPageView: ManagedCardPage { private func setSelection(_ ids: Set) { let valid = ids.intersection(Set(app.snippets.snippets.map(\.id))) + state.selectedPackageID = nil let ordered = visibleSnippets.filter { valid.contains($0.id) } .map { ContextPanelDetailID.snippet($0.id) } window.setDetailSelection(ordered, for: .snippets) } + private func selectPackage(_ id: SnippetPackage.ID) { + window.clearDetailSelection(for: .snippets) + state.selectedPackageID = id + } + private func saveSnippet(_ snippet: Snippet) { app.snippets.upsert(snippet) window.selectDetail(.snippet(snippet.id), on: .snippets) @@ -307,8 +316,16 @@ struct SnippetsPageView: ManagedCardPage { } private func deletePackage(_ package: SnippetPackage, keepSnippets: Bool) { + let deletedPackageIDs = Set( + [package.id] + app.snippets.descendantSnippetPackages(of: package.id).map(\.id) + ) app.snippets.delete(snippetPackageID: package.id, keepSnippets: keepSnippets) state.confirmation = nil + if let selectedPackageID = state.selectedPackageID, + deletedPackageIDs.contains(selectedPackageID) + { + state.selectedPackageID = nil + } window.pruneDetailSelections(in: app.snippets) } diff --git a/TermindTests/ContextPanelSelectionTests.swift b/TermindTests/ContextPanelSelectionTests.swift index 17f13c86..3620f424 100644 --- a/TermindTests/ContextPanelSelectionTests.swift +++ b/TermindTests/ContextPanelSelectionTests.swift @@ -70,6 +70,18 @@ struct ContextPanelSelectionTests { #expect(second.selectedGroupID == nil) } + @Test + func snippetFeatureStateOwnsPackageSelection() { + let first = SnippetsPageState() + let second = SnippetsPageState() + let package = UUID() + + first.selectedPackageID = package + + #expect(first.selectedPackageID == package) + #expect(second.selectedPackageID == nil) + } + @Test func hostAttachedContentOverridesRememberedManagerSelection() { let pageHostID = UUID()