← All repositories

listless

A simple list app for Apple platforms

git clone https://code.inqk.net/listless.git


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)
         }