← All repositories

listless

A simple list app for Apple platforms

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


commit f9fad530327ed21946a13c6a8604ace30c0f40e1
parent 6f3fb4de51ee5d8019d508c61a5eb72dddf596fa
Author: Michael Camilleri <[email protected]>
Date:   Thu,  5 Mar 2026 05:25:45 +0900

Toggle between 'Mark as Complete' and 'Mark as Incomplete'

The menu overlay that appears in iPadOS should switch between showing
'Mark as Complete' and 'Mark as Incomplete' depending on the state of
the task.

Co-Authored-By: Claude 4.6 Opus <[email protected]>

Diffstat

MListlessMac/Views/TaskListView.swift | 8++------
MListlessiOS/Helpers/AppCommands.swift | 3+++
MListlessiOS/Helpers/KeyCommandBridge.swift | 7+++++++
MListlessiOS/Views/TaskListView.swift | 4++++

4 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/ListlessMac/Views/TaskListView.swift b/ListlessMac/Views/TaskListView.swift

@@ -86,12 +86,8 @@ struct TaskListView: View, TaskListViewProtocol {
     }
 
     var markCompletedMenuTitle: String {
-        guard let currentID = selectedTaskID,
-              let task = allTasksInDisplayOrder.first(where: { $0.id == currentID }),
-              task.isCompleted else {
-            return "Mark as Complete"
-        }
-        return "Mark as Incomplete"
+        completedTasks.contains(where: { $0.id == selectedTaskID })
+            ? "Mark as Incomplete" : "Mark as Complete"
     }
 
     var canMoveSelectionUp: Bool {

diff --git a/ListlessiOS/Helpers/AppCommands.swift b/ListlessiOS/Helpers/AppCommands.swift

@@ -23,6 +23,9 @@ final class IOSMenuCoordinator {
     var canMoveUp = false
     var canMoveDown = false
     var canMarkCompleted = false
+
+    // Dynamic title — read by KeyCaptureView in validate(_:).
+    var markCompletedTitle: String = "Mark as Complete"
 }
 
 // MARK: - Menu Selectors

diff --git a/ListlessiOS/Helpers/KeyCommandBridge.swift b/ListlessiOS/Helpers/KeyCommandBridge.swift

@@ -134,5 +134,12 @@ struct KeyCommandBridge: UIViewRepresentable {
                 return super.canPerformAction(action, withSender: sender)
             }
         }
+
+        override func validate(_ command: UICommand) {
+            super.validate(command)
+            if command.action == IOSMenuSelectors.markCompleted {
+                command.title = IOSMenuCoordinator.shared.markCompletedTitle
+            }
+        }
     }
 }

diff --git a/ListlessiOS/Views/TaskListView.swift b/ListlessiOS/Views/TaskListView.swift

@@ -139,6 +139,7 @@ struct TaskListView: View, TaskListViewProtocol {
         let selectedTaskID: UUID?
         let isScrollViewFocused: Bool
         let activeTaskCount: Int
+        let completedTaskCount: Int
         let selectedIndex: Int?
     }
 
@@ -147,6 +148,7 @@ struct TaskListView: View, TaskListViewProtocol {
             selectedTaskID: selectedTaskID,
             isScrollViewFocused: focusedField == .scrollView,
             activeTaskCount: activeTasks.count,
+            completedTaskCount: completedTasks.count,
             selectedIndex: selectedIndex
         )
     }
@@ -163,6 +165,8 @@ struct TaskListView: View, TaskListViewProtocol {
         coord.canMoveUp = canMoveSelectionUp
         coord.canMoveDown = canMoveSelectionDown
         coord.canMarkCompleted = selectedTaskID != nil && inNavMode
+        coord.markCompletedTitle = completedTasks.contains(where: { $0.id == selectedTaskID })
+            ? "Mark as Incomplete" : "Mark as Complete"
     }
 
     var vStackSpacing: CGFloat { 12 }