Settings window is no longer a popover.
This commit is contained in:
@@ -6,9 +6,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
||||
let fileManager = FileManager.default
|
||||
|
||||
let window = PopoverPanel(viewController: SearchViewController())
|
||||
let settingsWindow =
|
||||
MenulessWindow(viewController: SettingsViewController())
|
||||
let aboutWindow = MenulessWindow(viewController: AboutViewController())
|
||||
|
||||
func applicationDidFinishLaunching(_ notification: Notification) {
|
||||
settingsWindow.title = "Settings"
|
||||
aboutWindow.level = .statusBar
|
||||
|
||||
PathManager.shared.updateIndex()
|
||||
@@ -16,8 +19,8 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
||||
window.delegate = self
|
||||
|
||||
// NOTE: Here we check wether the program was launched by the
|
||||
// system (e.g. launch-at-login). If it was not, then display
|
||||
// the window.
|
||||
// system (e.g. launch-at-login). If it was not, then display the
|
||||
// window.
|
||||
if let event = NSAppleEventManager.shared().currentAppleEvent,
|
||||
!(event.eventID == kAEOpenApplication &&
|
||||
event.paramDescriptor(forKeyword: keyAEPropData)?
|
||||
@@ -70,8 +73,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
||||
func applicationShouldHandleReopen(_ sender: NSApplication,
|
||||
hasVisibleWindows: Bool) -> Bool {
|
||||
if !window.isKeyWindow {
|
||||
if !settingsWindow.isVisible {
|
||||
window.makeKeyAndOrderFront(nil)
|
||||
}
|
||||
}
|
||||
|
||||
return true
|
||||
}
|
||||
@@ -99,8 +104,12 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSWindowDelegate {
|
||||
aboutWindow.makeKeyAndOrderFront(nil)
|
||||
}
|
||||
|
||||
// NOTE: This function act like a callback is triggered by DirMonitor
|
||||
// when file system events occur.
|
||||
public func showSettingsWindow() {
|
||||
settingsWindow.makeKeyAndOrderFront(nil)
|
||||
}
|
||||
|
||||
// NOTE: This function act like a callback and is triggered by
|
||||
// DirMonitor when file system events occur.
|
||||
public func fsEventTriggered(_ path: String, _ flags: Int) {
|
||||
if containsFlags(key: kFSEventStreamEventFlagItemCreated, in: flags) ||
|
||||
containsFlags(key: kFSEventStreamEventFlagItemRemoved, in: flags) ||
|
||||
|
||||
@@ -13,8 +13,8 @@ final class PathManager {
|
||||
private var dirMonitor: DirMonitor?
|
||||
|
||||
// NOTE: These are default paths where MacOS's default programs are
|
||||
// stored. This list should be updated if something changes in
|
||||
// newer MacOS version.
|
||||
// stored. This list should be updated if something changes in newer
|
||||
// MacOS versions.
|
||||
static let defaultPaths = [
|
||||
"/Applications",
|
||||
"/System/Applications",
|
||||
@@ -102,8 +102,8 @@ final class PathManager {
|
||||
}
|
||||
|
||||
// PERF: Optimize some more. Do not rebuild the entire array, instead
|
||||
// remove or add only needed programs. Thereby, limiting the
|
||||
// amount of allocations.
|
||||
// remove or add only needed programs. Thereby, limiting the amount of
|
||||
// allocations.
|
||||
public func rebuildIndex(at path: String) {
|
||||
paths[path] = []
|
||||
paths[path] = indexDirs(at: path, deepness: 2)
|
||||
@@ -141,7 +141,7 @@ final class PathManager {
|
||||
refreshFilesystemWatchers()
|
||||
}
|
||||
|
||||
// Touch paths to load them into CPUs cache.
|
||||
// Touch paths to load them into CPU's cache for performance.
|
||||
public func touchPaths() {
|
||||
for path in paths {
|
||||
_ = path
|
||||
|
||||
@@ -9,8 +9,7 @@ fileprivate let windowCornerRadius = 15.0
|
||||
fileprivate let maxItems = 20
|
||||
|
||||
class SearchViewController: NSViewController, NSTextFieldDelegate,
|
||||
NSPopoverDelegate, NSTableViewDataSource,
|
||||
NSTableViewDelegate
|
||||
NSTableViewDataSource, NSTableViewDelegate
|
||||
{
|
||||
private var keyboardEvents: EventMonitor?
|
||||
|
||||
@@ -20,13 +19,6 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
|
||||
|
||||
private var programsTableViewSelection = 0
|
||||
|
||||
private var settingsPopover: NSPopover = {
|
||||
let popover = NSPopover()
|
||||
popover.contentViewController = SettingsViewController()
|
||||
popover.behavior = .transient
|
||||
return popover
|
||||
}()
|
||||
|
||||
private var shadowView: ShadowView = {
|
||||
let view = ShadowView()
|
||||
view.translatesAutoresizingMaskIntoConstraints = false
|
||||
@@ -301,7 +293,6 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
|
||||
return event
|
||||
}
|
||||
|
||||
settingsPopover.delegate = self
|
||||
searchInput.delegate = self
|
||||
|
||||
tableScrollView.documentView = programsTableView
|
||||
@@ -364,8 +355,7 @@ class SearchViewController: NSViewController, NSTextFieldDelegate,
|
||||
|
||||
@objc
|
||||
func openSettings() {
|
||||
settingsPopover.show(relativeTo: settingsButton.bounds,
|
||||
of: settingsButton, preferredEdge: .maxY)
|
||||
delegate.showSettingsWindow()
|
||||
}
|
||||
|
||||
@objc
|
||||
|
||||
@@ -2,11 +2,15 @@ import AppKit
|
||||
import Carbon
|
||||
import ServiceManagement
|
||||
|
||||
// TODO: Rework the paths table and selection. Right now, it is very
|
||||
// disfunctional and error-prone.
|
||||
class SettingsViewController: NSViewController,
|
||||
NSTextFieldDelegate, KeyDetectorButtonDelegate,
|
||||
NSTableViewDataSource, NSTableViewDelegate,
|
||||
PathsTableCellViewDelegate
|
||||
{
|
||||
private var keyboardEvents: EventMonitor?
|
||||
|
||||
private var recording = false
|
||||
|
||||
// NOTE: This is the default shortcut. If you were to change it, don't
|
||||
@@ -346,6 +350,20 @@ class SettingsViewController: NSViewController,
|
||||
launchAtLoginToggle.target = self
|
||||
launchAtLoginToggle.action = #selector(affectLaunchAtLogin(_:))
|
||||
|
||||
keyboardEvents = LocalEventMonitor(mask: [.keyDown])
|
||||
{ [weak self] event in
|
||||
let key = event.keyCode
|
||||
let modifiers = event.modifierFlags.rawValue
|
||||
|
||||
if modsContains(keys: OSCmd, in: modifiers) &&
|
||||
key == kVK_ANSI_Q || modsContainsNone(in: modifiers)
|
||||
{
|
||||
NSApplication.shared.terminate(self)
|
||||
}
|
||||
|
||||
return event
|
||||
}
|
||||
|
||||
addSubviews()
|
||||
setConstraints()
|
||||
}
|
||||
@@ -372,11 +390,18 @@ class SettingsViewController: NSViewController,
|
||||
|
||||
override func viewDidAppear() {
|
||||
super.viewDidAppear()
|
||||
|
||||
keyboardEvents?.start()
|
||||
|
||||
NSApp.setActivationPolicy(.regular)
|
||||
self.view.window?.center()
|
||||
}
|
||||
|
||||
override func viewWillDisappear() {
|
||||
super.viewWillDisappear()
|
||||
|
||||
keyboardEvents?.stop()
|
||||
|
||||
HotKeyManager.shared.registerHotKey(key: keyCode,
|
||||
modifiers: modifiers)
|
||||
|
||||
@@ -399,6 +424,12 @@ class SettingsViewController: NSViewController,
|
||||
PathManager.shared.savePaths()
|
||||
}
|
||||
|
||||
override func viewDidDisappear() {
|
||||
super.viewDidDisappear()
|
||||
|
||||
NSApp.setActivationPolicy(.accessory)
|
||||
}
|
||||
|
||||
override func loadView() {
|
||||
self.view = NSView()
|
||||
}
|
||||
@@ -578,9 +609,9 @@ class SettingsViewController: NSViewController,
|
||||
makeIfNecessary: false) as? PathsTableCellView
|
||||
{
|
||||
if isDirectory(text) {
|
||||
cell.titleField.textColor = NSColor.green
|
||||
cell.titleField.textColor = NSColor.systemGreen
|
||||
} else {
|
||||
cell.titleField.textColor = NSColor.red
|
||||
cell.titleField.textColor = NSColor.systemRed
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -599,7 +630,7 @@ class SettingsViewController: NSViewController,
|
||||
}
|
||||
|
||||
// WARN:
|
||||
// FIX: THere is a bug where the program crashes when adding a new
|
||||
// FIX: There is a bug where the program crashes when adding a new
|
||||
// path. This happens because the settings popup is closed before
|
||||
// displaying the selection modal, as a result the new path item
|
||||
// is cleared (well, b/c it's empty) and the path gets set into
|
||||
|
||||
Reference in New Issue
Block a user