/
PopoverViewController.swift
157 lines (111 loc) · 4.78 KB
/
PopoverViewController.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
//
// PopoverViewController.swift
// Boop
//
// Created by Ivan on 1/27/19.
// Copyright © 2019 OKatBest. All rights reserved.
//
import Cocoa
import SavannaKit
class PopoverViewController: NSViewController {
@IBOutlet weak var overlayView: OverlayView!
@IBOutlet weak var popoverView: PopoverView!
@IBOutlet weak var searchField: SearchField!
@IBOutlet weak var editorView: SyntaxTextView!
@IBOutlet weak var statusView: StatusView!
@IBOutlet weak var scriptManager: ScriptManager!
@IBOutlet weak var tableView: ScriptTableView!
@IBOutlet weak var tableHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var tableViewController: ScriptsTableViewController!
@IBOutlet weak var appDelegate: AppDelegate!
var enabled = false // Closed by default
override func viewDidLoad() {
super.viewDidLoad()
setupKeyHandlers()
}
func setupKeyHandlers() {
var keyHandler: (_: NSEvent) -> NSEvent?
keyHandler = {
(_ theEvent: NSEvent) -> NSEvent in
var didSomething = false
// Key codes:
// 125 is down arrow
// 126 is up
// 53 is escape
// 36 is enter
if theEvent.keyCode == 53 && self.enabled { // ESCAPE
// Let's dismiss the popover
self.hide()
didSomething = true
}
if theEvent.keyCode == 36 && self.enabled { // ENTER
guard let script = self.tableViewController.selectedScript else {
return theEvent // Return event to beep
}
// Let's dismiss the popover
self.hide()
// Run the script afterwards in case we need to show a status
self.scriptManager.runScript(script, into: self.editorView)
didSomething = true
}
let window = self.view.window
if window?.firstResponder is NSTextView &&
(window?.firstResponder as! NSTextView).delegate is SearchField &&
theEvent.keyCode == 125 { // DOWN
// Why -1? I don't know, and I don't even care.
let indexSet = IndexSet(integer: -1)
self.tableView.selectRowIndexes(indexSet, byExtendingSelection: false)
window?.makeFirstResponder(self.tableView)
}
// Oh hey look now somehow it's 0.
if window?.firstResponder is NSTableView &&
self.tableView.selectedRow == 0 &&
theEvent.keyCode == 126 { // UP
window?.makeFirstResponder(self.searchField)
// This doesn't work for some reason.
self.searchField.moveToEndOfLine(nil)
}
guard didSomething else {
return theEvent
}
// Return an empty event to avoid the funk sound
return NSEvent()
}
// Creates an object we do not own, but must keep track
// of it so that it can be "removed" when we're done
NSEvent.addLocalMonitorForEvents(matching: .keyDown, handler: keyHandler)
}
func show() {
overlayView.show()
popoverView.show()
// FIXME: Use localized strings
statusView.setStatus(.help("Select your action"))
self.searchField.stringValue = ""
self.tableHeightConstraint.constant = 0
self.view.window?.makeFirstResponder(self.searchField)
self.enabled = true
appDelegate.setPopover(isOpen: true)
}
func hide() {
overlayView.hide()
popoverView.hide()
statusView.setStatus(.normal)
self.view.window?.makeFirstResponder(self.editorView.contentTextView)
self.enabled = false
self.tableHeightConstraint.animator().constant = 0
appDelegate.setPopover(isOpen: false)
}
func runScriptAgain() {
self.scriptManager.runScriptAgain(editor: self.editorView)
}
}
extension PopoverViewController: NSTextFieldDelegate {
func controlTextDidChange(_ obj: Notification) {
guard (obj.object as? SearchField) == searchField else {
return
}
let results = scriptManager.search(searchField.stringValue)
tableViewController.results = results
self.tableHeightConstraint.constant = CGFloat(47 * min(5, results.count))
}
}