commit 802ee8b3a94b99ed4820174626a05f62faf2fb04
parent 1d711ff52f6ef067db7d539827af52606f6e8bae
Author: Michael Camilleri <[email protected]>
Date: Fri, 13 Mar 2026 11:47:33 +0900
Prevent overly aggressive selection state loss
Prior to this commit, selection state would be lost when most
interactions occurred with a row. This commit dials that back so that
it's less aggressive. For example, when toggling the completion status
of a task row in macOS, selection state will now remain.
Co-Authored-By: Claude 4.6 Opus <[email protected]>
Diffstat:
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/Listless/Extensions/TaskListView+Logic.swift b/Listless/Extensions/TaskListView+Logic.swift
@@ -401,7 +401,6 @@ extension TaskListViewProtocol {
guard !ids.isEmpty else { return .handled }
let tasksToToggle = allTasksInDisplayOrder.filter { ids.contains($0.id) }
guard !tasksToToggle.isEmpty else { return .handled }
- fState.selectedTaskID = nil
for task in tasksToToggle {
toggleCompletion(task)
}
@@ -426,12 +425,23 @@ extension TaskListViewProtocol {
}
let ids = fState.selectedTaskIDs
guard !ids.isEmpty else { return .handled }
- let tasksToDelete = allTasksInDisplayOrder.filter { ids.contains($0.id) }
+ let displayOrder = allTasksInDisplayOrder
+ let tasksToDelete = displayOrder.filter { ids.contains($0.id) }
guard !tasksToDelete.isEmpty else { return .handled }
+
+ // Find the next task after the last selected one to move selection to.
+ let lastSelectedIndex = displayOrder.lastIndex(where: { ids.contains($0.id) })
+ let nextTask = lastSelectedIndex.flatMap { idx in
+ displayOrder.dropFirst(idx + 1).first(where: { !ids.contains($0.id) })
+ }
+
fState.selectedTaskID = nil
for task in tasksToDelete {
deleteTask(task)
}
+ if let nextTask {
+ fState.selectedTaskID = nextTask.id
+ }
return .handled
}
@@ -466,7 +476,6 @@ extension TaskListViewProtocol {
let ids = fState.selectedTaskIDs
guard !ids.isEmpty else { return }
let tasksToToggle = allTasksInDisplayOrder.filter { ids.contains($0.id) }
- fState.selectedTaskID = nil
for task in tasksToToggle {
toggleCompletion(task)
}