← All repositories

listless

A simple list app for Apple platforms

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


ListlessiOS/Helpers/AppCommands.swift (2437B)

1import UIKit
2
3// MARK: - Menu Coordinator
4
5/// Bridges SwiftUI view state to UIKit menu items, mirroring the macOS
6/// `MenuCoordinator` pattern. `ItemListView.updateMenuCoordinator()` keeps
7/// actions and enabled flags current; `KeyCaptureView` dispatches actions
8/// and validates commands via the responder chain.
9@MainActor
10final class IOSMenuCoordinator {
11    static let shared = IOSMenuCoordinator()
12    private init() {}
13
14    // Actions — set by ItemListView on each relevant state change.
15    var newItem: (() -> Void)?
16    var deleteItem: (() -> Void)?
17    var moveUp: (() -> Void)?
18    var moveDown: (() -> Void)?
19    var markCompleted: (() -> Void)?
20    var navigatePageUp: (() -> Void)?
21    var navigatePageDown: (() -> Void)?
22    var navigateToFirst: (() -> Void)?
23    var navigateToLast: (() -> Void)?
24
25    // Enabled state — read by KeyCaptureView in validate(_:).
26    var canDelete = false
27    var canMoveUp = false
28    var canMoveDown = false
29    var canMarkCompleted = false
30
31    // Dynamic title — read by KeyCaptureView in validate(_:).
32    var markCompletedTitle: String = "Mark as Complete"
33}
34
35// MARK: - Menu Selectors
36
37/// Selectors for menu item actions routed through the responder chain.
38/// `KeyCaptureView` (first responder) implements these as `@objc` methods.
39enum IOSMenuSelectors {
40    static let newItem = #selector(IOSMenuActions.handleNewItem)
41    static let deleteItem = #selector(IOSMenuActions.handleDeleteItem)
42    static let moveUp = #selector(IOSMenuActions.handleMoveUp)
43    static let moveDown = #selector(IOSMenuActions.handleMoveDown)
44    static let markCompleted = #selector(IOSMenuActions.handleMarkCompleted)
45    static let navigatePageUp = #selector(IOSMenuActions.handleNavigatePageUp)
46    static let navigatePageDown = #selector(IOSMenuActions.handleNavigatePageDown)
47    static let navigateToFirst = #selector(IOSMenuActions.handleNavigateToFirst)
48    static let navigateToLast = #selector(IOSMenuActions.handleNavigateToLast)
49}
50
51/// Protocol declaring the `@objc` action methods so selectors can be
52/// referenced at compile time. `KeyCaptureView` conforms to this.
53@MainActor @objc protocol IOSMenuActions {
54    func handleNewItem()
55    func handleDeleteItem()
56    func handleMoveUp()
57    func handleMoveDown()
58    func handleMarkCompleted()
59    func handleNavigatePageUp()
60    func handleNavigatePageDown()
61    func handleNavigateToFirst()
62    func handleNavigateToLast()
63}