1
1
mirror of https://github.com/qvacua/vimr.git synced 2024-11-24 19:47:41 +03:00
vimr/VimR/GeneralPrefPane.swift

187 lines
7.5 KiB
Swift
Raw Normal View History

2016-08-14 15:29:50 +03:00
/**
* Tae Won Ha - http://taewon.de - @hataewon
* See LICENSE
*/
import Cocoa
import PureLayout
import RxSwift
struct GeneralPrefData {
let openNewWindowWhenLaunching: Bool
let openNewWindowOnReactivation: Bool
}
2016-08-14 19:59:00 +03:00
func == (left: GeneralPrefData, right: GeneralPrefData) -> Bool {
return left.openNewWindowWhenLaunching == right.openNewWindowWhenLaunching
&& left.openNewWindowOnReactivation == right.openNewWindowOnReactivation
}
func != (left: GeneralPrefData, right: GeneralPrefData) -> Bool {
return !(left == right)
}
2016-08-14 15:29:50 +03:00
class GeneralPrefPane: PrefPane {
2016-08-14 22:46:03 +03:00
private var data: GeneralPrefData {
willSet {
self.updateViews(newData: newValue)
}
didSet {
self.publish(event: self.data)
}
}
2016-08-14 16:38:41 +03:00
private let openWhenLaunchingCheckbox = NSButton(forAutoLayout: ())
private let openOnReactivationCheckbox = NSButton(forAutoLayout: ())
2016-08-14 15:29:50 +03:00
init(source: Observable<Any>, initialData: GeneralPrefData) {
2016-08-14 19:59:00 +03:00
self.data = initialData
2016-08-14 15:29:50 +03:00
super.init(source: source)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func addViews() {
2016-08-25 10:27:59 +03:00
let paneTitle = self.paneTitleTextField(title: "General")
2016-08-14 15:29:50 +03:00
2016-08-25 10:27:59 +03:00
let openUntitledWindowTitle = self.titleTextField(title: "Open Untitled Window:")
2016-08-14 16:38:41 +03:00
self.configureCheckbox(button: self.openWhenLaunchingCheckbox,
title: "On Launch",
action: #selector(GeneralPrefPane.openUntitledWindowWhenLaunchingAction(_:)))
self.configureCheckbox(button: self.openOnReactivationCheckbox,
title: "On Re-Activation",
action: #selector(GeneralPrefPane.openUntitledWindowOnReactivation(_:)))
2016-08-14 16:01:28 +03:00
2016-08-14 16:38:41 +03:00
let whenLaunching = self.openWhenLaunchingCheckbox
let onReactivation = self.openOnReactivationCheckbox
2016-08-25 10:27:59 +03:00
let cliToolTitle = self.titleTextField(title: "CLI Tool:")
let cliToolButton = NSButton(forAutoLayout: ())
cliToolButton.title = "Copy 'vimr' CLI tool..."
cliToolButton.bezelStyle = .RoundedBezelStyle
cliToolButton.bordered = true
cliToolButton.setButtonType(.MomentaryPushInButton)
cliToolButton.target = self
cliToolButton.action = #selector(GeneralPrefPane.copyCliTool(_:))
let cliToolInfo = NSTextField(forAutoLayout: ())
cliToolInfo.font = NSFont.systemFontOfSize(NSFont.smallSystemFontSize())
cliToolInfo.textColor = NSColor.grayColor()
cliToolInfo.stringValue = "Put the executable 'vimr' in your $PATH and execute 'vimr -h' for help."
cliToolInfo.backgroundColor = NSColor.clearColor()
cliToolInfo.editable = false
cliToolInfo.bordered = false
2016-08-14 16:38:41 +03:00
2016-08-25 10:27:59 +03:00
self.addSubview(paneTitle)
2016-08-14 16:01:28 +03:00
self.addSubview(openUntitledWindowTitle)
2016-08-14 16:38:41 +03:00
self.addSubview(whenLaunching)
self.addSubview(onReactivation)
2016-08-25 10:27:59 +03:00
self.addSubview(cliToolTitle)
self.addSubview(cliToolButton)
self.addSubview(cliToolInfo)
2016-08-14 16:01:28 +03:00
2016-08-14 15:29:50 +03:00
paneTitle.autoPinEdgeToSuperviewEdge(.Top, withInset: 18)
paneTitle.autoPinEdgeToSuperviewEdge(.Left, withInset: 18)
2016-08-25 10:27:59 +03:00
paneTitle.autoPinEdgeToSuperviewEdge(.Right, withInset: 18, relation: .GreaterThanOrEqual)
2016-08-14 16:01:28 +03:00
2016-08-14 16:38:41 +03:00
openUntitledWindowTitle.autoAlignAxis(.Baseline, toSameAxisOfView: whenLaunching, withOffset: 0)
2016-08-14 16:01:28 +03:00
openUntitledWindowTitle.autoPinEdgeToSuperviewEdge(.Left, withInset: 18)
2016-08-14 16:38:41 +03:00
whenLaunching.autoPinEdge(.Top, toEdge: .Bottom, ofView: paneTitle, withOffset: 18)
whenLaunching.autoPinEdge(.Left, toEdge: .Right, ofView: openUntitledWindowTitle, withOffset: 5)
2016-08-25 10:27:59 +03:00
whenLaunching.autoPinEdgeToSuperviewEdge(.Right, withInset: 18, relation: .GreaterThanOrEqual)
2016-08-14 16:38:41 +03:00
onReactivation.autoPinEdge(.Top, toEdge: .Bottom, ofView: whenLaunching, withOffset: 5)
onReactivation.autoPinEdge(.Left, toEdge: .Left, ofView: whenLaunching)
2016-08-25 10:27:59 +03:00
onReactivation.autoPinEdgeToSuperviewEdge(.Right, withInset: 18, relation: .GreaterThanOrEqual)
cliToolTitle.autoAlignAxis(.Baseline, toSameAxisOfView: cliToolButton, withOffset: 0)
cliToolTitle.autoPinEdgeToSuperviewEdge(.Left, withInset: 18, relation: .GreaterThanOrEqual)
cliToolTitle.autoPinEdge(.Right, toEdge: .Right, ofView: openUntitledWindowTitle)
cliToolButton.autoPinEdge(.Top, toEdge: .Bottom, ofView: onReactivation, withOffset: 18)
cliToolButton.autoPinEdge(.Left, toEdge: .Right, ofView: cliToolTitle, withOffset: 5)
cliToolButton.autoPinEdgeToSuperviewEdge(.Right, withInset: 18, relation: .GreaterThanOrEqual)
cliToolInfo.autoPinEdge(.Top, toEdge: .Bottom, ofView: cliToolButton, withOffset: 5)
cliToolInfo.autoPinEdge(.Left, toEdge: .Right, ofView: cliToolTitle, withOffset: 5)
cliToolInfo.autoPinEdgeToSuperviewEdge(.Right, withInset: 18, relation: .GreaterThanOrEqual)
cliToolInfo.autoPinEdgeToSuperviewEdge(.Bottom, withInset: 18)
2016-08-14 22:46:03 +03:00
self.openWhenLaunchingCheckbox.boolState = self.data.openNewWindowWhenLaunching
self.openOnReactivationCheckbox.boolState = self.data.openNewWindowOnReactivation
2016-08-14 15:29:50 +03:00
}
override func subscription(source source: Observable<Any>) -> Disposable {
return source
2016-08-14 22:46:03 +03:00
.filter { $0 is PrefData }
.map { ($0 as! PrefData).general }
2016-08-14 19:59:00 +03:00
.filter { [unowned self] data in data != self.data }
2016-08-14 22:46:03 +03:00
.subscribeNext { [unowned self] data in self.data = data }
2016-08-14 15:29:50 +03:00
}
2016-08-14 16:01:28 +03:00
2016-08-14 22:46:03 +03:00
private func updateViews(newData newData: GeneralPrefData) {
call(self.openWhenLaunchingCheckbox.boolState = newData.openNewWindowWhenLaunching,
whenNot: newData.openNewWindowWhenLaunching == self.data.openNewWindowWhenLaunching)
2016-08-14 19:59:00 +03:00
2016-08-14 22:46:03 +03:00
call(self.openOnReactivationCheckbox.boolState = newData.openNewWindowOnReactivation,
whenNot: newData.openNewWindowOnReactivation == self.data.openNewWindowOnReactivation)
2016-08-14 16:01:28 +03:00
}
}
// MARK: - Actions
extension GeneralPrefPane {
2016-08-25 10:27:59 +03:00
func copyCliTool(sender: NSButton) {
let panel = NSOpenPanel()
panel.canChooseFiles = false
panel.canChooseDirectories = true
panel.beginSheetModalForWindow(self.window!) { result in
guard result == NSFileHandlingPanelOKButton else {
return
}
guard let vimrUrl = NSBundle.mainBundle().URLForResource("vimr", withExtension: nil) else {
self.alert(title: "Something Went Wrong.",
info: "The CLI tool 'vimr' could not be found. Please re-download VimR and try again.")
return
}
guard let targetUrl = panel.URL?.URLByAppendingPathComponent("vimr") else {
self.alert(title: "Something Went Wrong.",
info: "The target directory could not be determined. Please try again with a different directory.")
return
}
do {
try NSFileManager.defaultManager().copyItemAtURL(vimrUrl, toURL: targetUrl)
} catch {
let pathInfo = targetUrl.path == nil ? "." : " to '\(targetUrl.path!)'."
self.alert(title: "Error copying 'vimr'", info: "The CLI tool 'vimr' could not be copied\(pathInfo)")
}
}
}
2016-08-14 16:01:28 +03:00
2016-08-14 16:38:41 +03:00
func openUntitledWindowWhenLaunchingAction(sender: NSButton) {
2016-08-14 22:46:03 +03:00
self.data = GeneralPrefData(openNewWindowWhenLaunching: self.openWhenLaunchingCheckbox.boolState,
2016-08-14 19:59:00 +03:00
openNewWindowOnReactivation: self.data.openNewWindowOnReactivation)
2016-08-14 16:01:28 +03:00
}
func openUntitledWindowOnReactivation(sender: NSButton) {
2016-08-14 19:59:00 +03:00
self.data = GeneralPrefData(openNewWindowWhenLaunching: self.data.openNewWindowWhenLaunching,
2016-08-14 22:46:03 +03:00
openNewWindowOnReactivation: self.openOnReactivationCheckbox.boolState)
2016-08-14 16:01:28 +03:00
}
2016-08-25 10:27:59 +03:00
private func alert(title title: String, info: String) {
let alert = NSAlert()
alert.alertStyle = .WarningAlertStyle
alert.messageText = title
alert.informativeText = info
alert.runModal()
}
2016-08-14 15:29:50 +03:00
}