Skip to content

Commit 52c6e44

Browse files
authored
Improve text editing exp of MarkEdit.showTextBox (#979)
1 parent 8f3eb28 commit 52c6e44

File tree

3 files changed

+29
-1
lines changed

3 files changed

+29
-1
lines changed

MarkEditMac/Modules/Sources/AppKitExtensions/Foundation/NSEvent+Extension.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ public extension NSEvent.ModifierFlags {
3535

3636
// https://gist.github.com/eegrok/949034
3737
public extension UInt16 {
38+
static let kVK_ANSI_A: Self = 0x00
3839
static let kVK_ANSI_F: Self = 0x03
3940
static let kVK_ANSI_I: Self = 0x22
4041
static let kVK_Return: Self = 0x24

MarkEditMac/Sources/Editor/Controllers/EditorViewController+UI.swift

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -437,16 +437,42 @@ extension EditorViewController {
437437
}
438438

439439
func showTextBox(title: String?, placeholder: String?, defaultValue: String?) -> String? {
440+
class TextField: NSTextField {
441+
override func performKeyEquivalent(with event: NSEvent) -> Bool {
442+
// The default "selectAll" is not available here
443+
if event.deviceIndependentFlags == .command, event.keyCode == .kVK_ANSI_A {
444+
currentEditor()?.selectAll(nil)
445+
return true
446+
}
447+
448+
return super.performKeyEquivalent(with: event)
449+
}
450+
}
451+
440452
let alert = NSAlert()
441453
alert.messageText = title ?? ""
442454
alert.addButton(withTitle: Localized.General.done)
443455
alert.addButton(withTitle: Localized.General.cancel)
444456

445-
let textField = NSTextField(frame: CGRect(x: 0, y: 0, width: 256, height: 22))
457+
let textField = TextField(frame: CGRect(x: 0, y: 0, width: 256, height: 22))
446458
textField.placeholderString = placeholder
447459
textField.stringValue = defaultValue ?? ""
448460
alert.accessoryView = textField
449461

462+
textBoxInputObserver = NotificationCenter.default.addObserver(
463+
forName: NSWindow.didBecomeKeyNotification,
464+
object: nil,
465+
queue: .main
466+
) { [weak self] in
467+
if let window = $0.object as? NSWindow, window == textField.window {
468+
window.makeFirstResponder(textField)
469+
if let observer = self?.textBoxInputObserver {
470+
self?.textBoxInputObserver = nil
471+
NotificationCenter.default.removeObserver(observer)
472+
}
473+
}
474+
}
475+
450476
return alert.runModal() == .alertFirstButtonReturn ? textField.stringValue : nil
451477
}
452478

MarkEditMac/Sources/Editor/Controllers/EditorViewController.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ final class EditorViewController: NSViewController {
2121
var initialContent: String?
2222
var webBackgroundColor = AppPreferences.Window.cachedBackgroundColor?.nsColor
2323
var localEventMonitor: Any?
24+
var textBoxInputObserver: Any?
2425
var writingToolsObservation: NSKeyValueObservation?
2526
var safeAreaObservation: NSKeyValueObservation?
2627
var userDefinedMenuItems = [EditorMenuItem]()

0 commit comments

Comments
 (0)