Add snippet package selection

This commit is contained in:
Kaede Akino committed 2026-08-29 03:29:22 +08:00
1 parent b1a4d9cc69
commit d748ae2688
3 files changed
+30 -1

No files matched your search

+1 -1
View File
@@ -333,7 +333,7 @@ struct HostsPageView: ManagedCardPage {
private func setHostSelection(_ ids: Set<Host.ID>) {
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)
}
@@ -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<Snippet.ID>) {
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)
}
@@ -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()