listless

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

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 }