listless

A simple list app for Apple platforms
Log | Files | Refs | README | LICENSE

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:
MListless/Extensions/TaskListView+Logic.swift | 15++++++++++++---
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) }