1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-12-01 11:49:58 +00:00
CLK/OSBindings/Mac/Clock Signal/Documents/MachineController.swift
Thomas Harte 6d98349be1 Fully invests in options controllers, distinct from the views.
Per MVC, I should have been doing something closer to this from day one.
2021-07-13 19:04:24 -04:00

102 lines
3.1 KiB
Swift

//
// MachineController.swift
// Clock Signal
//
// Created by Thomas Harte on 02/10/2016.
// Copyright 2016 Thomas Harte. All rights reserved.
//
import Cocoa
class MachineController: NSObject {
var machine: CSMachine!
// MARK: IBActions
final func prefixedUserDefaultsKey(_ key: String) -> String {
return "\(self.machine.userDefaultsPrefix).\(key)"
}
// MARK: Fast Loading
var fastLoadingUserDefaultsKey: String {
return prefixedUserDefaultsKey("fastLoading")
}
@IBOutlet var fastLoadingButton: NSButton?
@IBAction func setFastLoading(_ sender: NSButton!) {
let useFastLoadingHack = sender.state == .on
machine.useFastLoadingHack = useFastLoadingHack
UserDefaults.standard.set(useFastLoadingHack, forKey: fastLoadingUserDefaultsKey)
}
// MARK: Quick Boot
var bootQuicklyUserDefaultsKey: String {
return prefixedUserDefaultsKey("bootQuickly")
}
@IBOutlet var fastBootingButton: NSButton?
@IBAction func setFastBooting(_ sender: NSButton!) {
let useQuickBootingHack = sender.state == .on
machine.useQuickBootingHack = useQuickBootingHack
UserDefaults.standard.set(useQuickBootingHack, forKey: bootQuicklyUserDefaultsKey)
}
// MARK: Display-Type Selection
fileprivate func signalForTag(tag: Int) -> CSMachineVideoSignal {
switch tag {
case 1: return .composite
case 2: return .sVideo
case 3: return .monochromeComposite
default: break
}
return .RGB
}
var displayTypeUserDefaultsKey: String {
return prefixedUserDefaultsKey("displayType")
}
@IBOutlet var displayTypeButton: NSPopUpButton?
@IBAction func setDisplayType(_ sender: NSPopUpButton!) {
if let selectedItem = sender.selectedItem {
machine.videoSignal = signalForTag(tag: selectedItem.tag)
UserDefaults.standard.set(selectedItem.tag, forKey: self.displayTypeUserDefaultsKey)
}
}
// MARK: Restoring user defaults
func establishStoredOptions() {
let standardUserDefaults = UserDefaults.standard
standardUserDefaults.register(defaults: [
fastLoadingUserDefaultsKey: true,
bootQuicklyUserDefaultsKey: true,
displayTypeUserDefaultsKey: 0
])
if let fastLoadingButton = self.fastLoadingButton {
let useFastLoadingHack = standardUserDefaults.bool(forKey: self.fastLoadingUserDefaultsKey)
machine.useFastLoadingHack = useFastLoadingHack
fastLoadingButton.state = useFastLoadingHack ? .on : .off
}
if let fastBootingButton = self.fastBootingButton {
let bootQuickly = standardUserDefaults.bool(forKey: self.bootQuicklyUserDefaultsKey)
machine.useQuickBootingHack = bootQuickly
fastBootingButton.state = bootQuickly ? .on : .off
}
if let displayTypeButton = self.displayTypeButton {
// Enable or disable options as per machine support.
var titlesToRemove: [String] = []
for item in displayTypeButton.itemArray {
if !machine.supportsVideoSignal(signalForTag(tag: item.tag)) {
titlesToRemove.append(item.title)
}
}
for title in titlesToRemove {
displayTypeButton.removeItem(withTitle: title)
}
let displayType = standardUserDefaults.integer(forKey: self.displayTypeUserDefaultsKey)
displayTypeButton.selectItem(withTag: displayType)
setDisplayType(displayTypeButton)
}
}
}