Release v0.2
This commit is contained in:
45
Sources/IHatePDFs/ReturnKeyCommitMonitor.swift
Normal file
45
Sources/IHatePDFs/ReturnKeyCommitMonitor.swift
Normal file
@@ -0,0 +1,45 @@
|
||||
import AppKit
|
||||
import SwiftUI
|
||||
|
||||
extension View {
|
||||
func commitOnPlainReturn(_ action: @escaping () -> Void) -> some View {
|
||||
modifier(ReturnKeyCommitMonitor(action: action))
|
||||
}
|
||||
}
|
||||
|
||||
private struct ReturnKeyCommitMonitor: ViewModifier {
|
||||
let action: () -> Void
|
||||
@State private var monitor: Any?
|
||||
|
||||
func body(content: Content) -> some View {
|
||||
content
|
||||
.onAppear {
|
||||
installMonitor()
|
||||
}
|
||||
.onDisappear {
|
||||
removeMonitor()
|
||||
}
|
||||
}
|
||||
|
||||
private func installMonitor() {
|
||||
removeMonitor()
|
||||
monitor = NSEvent.addLocalMonitorForEvents(matching: .keyDown) { event in
|
||||
guard isPlainReturn(event) else { return event }
|
||||
action()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
private func removeMonitor() {
|
||||
guard let monitor else { return }
|
||||
NSEvent.removeMonitor(monitor)
|
||||
self.monitor = nil
|
||||
}
|
||||
|
||||
private func isPlainReturn(_ event: NSEvent) -> Bool {
|
||||
guard event.keyCode == 36 || event.keyCode == 76 else { return false }
|
||||
|
||||
let multilineModifiers: NSEvent.ModifierFlags = [.shift, .option, .command, .control]
|
||||
return event.modifierFlags.intersection(multilineModifiers).isEmpty
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user