#if os(macOS) import AppKit import SwiftUI public struct SheetsEditorCommands: Commands { @FocusedValue(\.sheetEditor) private var editor public init() {} private var available: Bool { editor?.model.page != nil } private var writable: Bool { guard let model = editor?.model else { return false } return model.mayWrite && !model.busy && !model.hasUnconfirmedChanges } private func route(_ selector: Selector, grid: (SheetModel) -> Void) { if NSApp.keyWindow?.firstResponder is NSTextView { NSApp.sendAction(selector, to: nil, from: nil) } else if let model = editor?.model, model.gridFocused { grid(model) } else { NSApp.sendAction(selector, to: nil, from: nil) } } public var body: some Commands { CommandGroup(replacing: .undoRedo) { Button(sheetsMacString("Undo")) { route(Selector(("undo:"))) { model in Task { await model.command("/undo") } } }.keyboardShortcut("z") Button(sheetsMacString("Redo")) { NSApp.sendAction(Selector(("redo:")), to: nil, from: nil) }.keyboardShortcut("z", modifiers: [.command, .shift]) } CommandGroup(replacing: .pasteboard) { Button(sheetsMacString("Cut")) { route(#selector(NSText.cut(_:))) { model in guard model.mayWrite, !model.busy, !model.hasUnconfirmedChanges else { return } model.copy(); Task { await model.clear() } } }.keyboardShortcut("x") Button(sheetsMacString("Copy")) { route(#selector(NSText.copy(_:))) { $0.copy() } }.keyboardShortcut("c") Button(sheetsMacString("Paste")) { route(#selector(NSText.paste(_:))) { model in Task { await model.paste() } } }.keyboardShortcut("v") Button(sheetsMacString("Select all")) { route(#selector(NSText.selectAll(_:))) { model in model.rangeText = "A1:" + Coordinate(r: model.rows - 1, c: model.cols - 1).ref model.selectRange() } }.keyboardShortcut("a") } CommandGroup(after: .pasteboard) { Button(sheetsMacString("Clear contents")) { if let model = editor?.model { Task { await model.clear() } } }.disabled(!writable) Button(sheetsMacString("Fill down")) { if let model = editor?.model { Task { await model.fill(down: true) } } }.keyboardShortcut("d").disabled(!writable) Button(sheetsMacString("Fill right")) { if let model = editor?.model { Task { await model.fill(down: false) } } }.disabled(!writable) } CommandMenu(sheetsMacString("Format")) { if let model = editor?.model { SheetFormatMenu(model: model) Button(sheetsMacString("Row and column sizes…")) { editor?.panel.wrappedValue = "Sizes" }.disabled(!writable) Button(sheetsMacString("Fit column to contents")) { Task { await model.fitColumn(model.selection.start.c) } }.disabled(!writable) } } CommandMenu(sheetsMacString("Insert")) { ForEach(["SUM", "AVERAGE", "COUNT", "MIN", "MAX"], id: \.self) { name in Button(name) { if let model = editor?.model { Task { await model.insertFunction(name) } } }.disabled(!writable) } } CommandMenu(sheetsMacString("Sheet")) { Button(sheetsMacString("Sort and filter…")) { editor?.panel.wrappedValue = "Data" }.disabled(!available) Button(sheetsMacString("Comments…")) { editor?.panel.wrappedValue = "Comments" }.disabled(!available) Button(sheetsMacString("Refresh")) { if let model = editor?.model { Task { await model.refresh() } } }.disabled(!available) } } } #endif