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