From daa0dd8773f5bf4718183fbeab46f22703e75b2d Mon Sep 17 00:00:00 2001 From: Adrian Schoenig Date: Sun, 6 Feb 2022 17:55:00 +1100 Subject: [PATCH 1/3] Add as SwiftUI `.keyboardShortcut()` helper that takes a strongly-typed name --- Sources/KeyboardShortcuts/Shortcut.swift | 58 ++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/Sources/KeyboardShortcuts/Shortcut.swift b/Sources/KeyboardShortcuts/Shortcut.swift index 377e91d7..03b41671 100644 --- a/Sources/KeyboardShortcuts/Shortcut.swift +++ b/Sources/KeyboardShortcuts/Shortcut.swift @@ -1,6 +1,8 @@ import Cocoa import Carbon.HIToolbox +import SwiftUI + extension KeyboardShortcuts { /** A keyboard shortcut. @@ -292,3 +294,59 @@ extension KeyboardShortcuts.Shortcut: CustomStringConvertible { modifiers.description + (keyToCharacter()?.uppercased() ?? "�") } } + +// MARK: - SwiftUI Helpers + +extension KeyboardShortcuts.Shortcut { + + @available(iOS 14.0, macOS 11.0, *) + var swiftUI: SwiftUI.KeyboardShortcut { + .init(.init(keyEquivalent.first!), modifiers: modifiers.swiftUI) + } + +} + +@available(macOS 10.15, *) +extension NSEvent.ModifierFlags { + var swiftUI: SwiftUI.EventModifiers { + var modifiers: SwiftUI.EventModifiers = [] + if contains(.shift) { + modifiers.insert(.shift) + } + if contains(.command) { + modifiers.insert(.command) + } + if contains(.capsLock) { + modifiers.insert(.capsLock) + } + if contains(.function) { + modifiers.insert(.function) + } + if contains(.option) { + modifiers.insert(.option) + } + if contains(.control) { + modifiers.insert(.control) + } + return modifiers + } +} + +@available(iOS 14.0, macOS 11.0, *) +extension View { + + @ViewBuilder + /// Assigns the global keyboard shortcut to the modified control. + /// + /// Only assigns a keyboard shortcut, if one was defined (or it has a default shortcut). + /// + /// - Parameter shortcut: Strongly-typed name of the shortcut + public func keyboardShortcut(_ shortcut: KeyboardShortcuts.Name) -> some View { + if let shortcut = (shortcut.shortcut ?? shortcut.defaultShortcut)?.swiftUI { + self.keyboardShortcut(shortcut) + } else { + self + } + } + +} From 482c1795cfb39b4d9dcae5c0c9344d7130280b94 Mon Sep 17 00:00:00 2001 From: Adrian Schoenig Date: Sun, 6 Feb 2022 21:19:24 +1100 Subject: [PATCH 2/3] Fix indentation --- Sources/KeyboardShortcuts/Shortcut.swift | 86 ++++++++++++------------ 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/Sources/KeyboardShortcuts/Shortcut.swift b/Sources/KeyboardShortcuts/Shortcut.swift index 03b41671..fa9acbd1 100644 --- a/Sources/KeyboardShortcuts/Shortcut.swift +++ b/Sources/KeyboardShortcuts/Shortcut.swift @@ -298,55 +298,55 @@ extension KeyboardShortcuts.Shortcut: CustomStringConvertible { // MARK: - SwiftUI Helpers extension KeyboardShortcuts.Shortcut { - - @available(iOS 14.0, macOS 11.0, *) - var swiftUI: SwiftUI.KeyboardShortcut { - .init(.init(keyEquivalent.first!), modifiers: modifiers.swiftUI) - } - + + @available(iOS 14.0, macOS 11.0, *) + var swiftUI: SwiftUI.KeyboardShortcut { + .init(.init(keyEquivalent.first!), modifiers: modifiers.swiftUI) + } + } @available(macOS 10.15, *) extension NSEvent.ModifierFlags { - var swiftUI: SwiftUI.EventModifiers { - var modifiers: SwiftUI.EventModifiers = [] - if contains(.shift) { - modifiers.insert(.shift) - } - if contains(.command) { - modifiers.insert(.command) - } - if contains(.capsLock) { - modifiers.insert(.capsLock) - } - if contains(.function) { - modifiers.insert(.function) - } - if contains(.option) { - modifiers.insert(.option) - } - if contains(.control) { - modifiers.insert(.control) - } - return modifiers - } + var swiftUI: SwiftUI.EventModifiers { + var modifiers: SwiftUI.EventModifiers = [] + if contains(.shift) { + modifiers.insert(.shift) + } + if contains(.command) { + modifiers.insert(.command) + } + if contains(.capsLock) { + modifiers.insert(.capsLock) + } + if contains(.function) { + modifiers.insert(.function) + } + if contains(.option) { + modifiers.insert(.option) + } + if contains(.control) { + modifiers.insert(.control) + } + return modifiers + } } @available(iOS 14.0, macOS 11.0, *) extension View { - - @ViewBuilder - /// Assigns the global keyboard shortcut to the modified control. - /// - /// Only assigns a keyboard shortcut, if one was defined (or it has a default shortcut). - /// - /// - Parameter shortcut: Strongly-typed name of the shortcut - public func keyboardShortcut(_ shortcut: KeyboardShortcuts.Name) -> some View { - if let shortcut = (shortcut.shortcut ?? shortcut.defaultShortcut)?.swiftUI { - self.keyboardShortcut(shortcut) - } else { - self - } - } - + + @ViewBuilder + /// Assigns the global keyboard shortcut to the modified control. + /// + /// Only assigns a keyboard shortcut, if one was defined (or it has a default shortcut). + /// + /// - Parameter shortcut: Strongly-typed name of the shortcut + public func keyboardShortcut(_ shortcut: KeyboardShortcuts.Name) -> some View { + if let shortcut = (shortcut.shortcut ?? shortcut.defaultShortcut)?.swiftUI { + self.keyboardShortcut(shortcut) + } else { + self + } + } + } From 68e146e919cdc88c883656b01b2de90860eb6fc6 Mon Sep 17 00:00:00 2001 From: Adrian Schoenig Date: Sun, 6 Feb 2022 21:27:45 +1100 Subject: [PATCH 3/3] Remove force-unwrap --- Sources/KeyboardShortcuts/Shortcut.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Sources/KeyboardShortcuts/Shortcut.swift b/Sources/KeyboardShortcuts/Shortcut.swift index fa9acbd1..b8fe3854 100644 --- a/Sources/KeyboardShortcuts/Shortcut.swift +++ b/Sources/KeyboardShortcuts/Shortcut.swift @@ -300,8 +300,9 @@ extension KeyboardShortcuts.Shortcut: CustomStringConvertible { extension KeyboardShortcuts.Shortcut { @available(iOS 14.0, macOS 11.0, *) - var swiftUI: SwiftUI.KeyboardShortcut { - .init(.init(keyEquivalent.first!), modifiers: modifiers.swiftUI) + var swiftUI: SwiftUI.KeyboardShortcut? { + guard let key = keyEquivalent.first else { return nil } + return .init(.init(key), modifiers: modifiers.swiftUI) } }