210 lines
4.6 KiB
Swift
210 lines
4.6 KiB
Swift
//
|
|
// AppDefaults.swift
|
|
// Evergreen
|
|
//
|
|
// Created by Brent Simmons on 9/22/17.
|
|
// Copyright © 2017 Ranchero Software. All rights reserved.
|
|
//
|
|
|
|
import AppKit
|
|
|
|
enum FontSize: Int {
|
|
|
|
case small = 0
|
|
case medium = 1
|
|
case large = 2
|
|
case veryLarge = 3
|
|
}
|
|
|
|
final class AppDefaults {
|
|
|
|
static let shared = AppDefaults()
|
|
|
|
struct Key {
|
|
static let firstRunDate = "firstRunDate"
|
|
static let sidebarFontSize = "sidebarFontSize"
|
|
static let timelineFontSize = "timelineFontSize"
|
|
static let timelineSortDirection = "timelineSortDirection"
|
|
static let detailFontSize = "detailFontSize"
|
|
static let openInBrowserInBackground = "openInBrowserInBackground"
|
|
static let mainWindowWidths = "mainWindowWidths"
|
|
|
|
// Hidden prefs
|
|
static let showTitleOnMainWindow = "KafasisTitleMode"
|
|
}
|
|
|
|
private let smallestFontSizeRawValue = FontSize.small.rawValue
|
|
private let largestFontSizeRawValue = FontSize.veryLarge.rawValue
|
|
|
|
let isFirstRun: Bool
|
|
|
|
var openInBrowserInBackground: Bool {
|
|
get {
|
|
return bool(for: Key.openInBrowserInBackground)
|
|
}
|
|
set {
|
|
setBool(for: Key.openInBrowserInBackground, newValue)
|
|
}
|
|
}
|
|
|
|
var sidebarFontSize: FontSize {
|
|
get {
|
|
return fontSize(for: Key.sidebarFontSize)
|
|
}
|
|
set {
|
|
setFontSize(for: Key.sidebarFontSize, newValue)
|
|
}
|
|
}
|
|
|
|
var timelineFontSize: FontSize {
|
|
get {
|
|
return fontSize(for: Key.timelineFontSize)
|
|
}
|
|
set {
|
|
setFontSize(for: Key.timelineFontSize, newValue)
|
|
}
|
|
}
|
|
|
|
var detailFontSize: FontSize {
|
|
get {
|
|
return fontSize(for: Key.detailFontSize)
|
|
}
|
|
set {
|
|
setFontSize(for: Key.detailFontSize, newValue)
|
|
}
|
|
}
|
|
|
|
var showTitleOnMainWindow: Bool {
|
|
return bool(for: Key.showTitleOnMainWindow)
|
|
}
|
|
|
|
var timelineSortDirection: ComparisonResult {
|
|
get {
|
|
return sortDirection(for: Key.timelineSortDirection)
|
|
}
|
|
set {
|
|
setSortDirection(for: Key.timelineSortDirection, newValue)
|
|
}
|
|
}
|
|
|
|
var mainWindowWidths: [Int]? {
|
|
get {
|
|
return UserDefaults.standard.object(forKey: Key.mainWindowWidths) as? [Int]
|
|
}
|
|
set {
|
|
UserDefaults.standard.set(newValue, forKey: Key.mainWindowWidths)
|
|
}
|
|
}
|
|
|
|
private init() {
|
|
|
|
AppDefaults.registerDefaults()
|
|
|
|
let firstRunDate = UserDefaults.standard.object(forKey: Key.firstRunDate) as? Date
|
|
if firstRunDate == nil {
|
|
self.isFirstRun = true
|
|
self.firstRunDate = Date()
|
|
}
|
|
else {
|
|
self.isFirstRun = false
|
|
}
|
|
}
|
|
|
|
static func actualFontSize(for fontSize: FontSize) -> CGFloat {
|
|
|
|
switch fontSize {
|
|
case .small:
|
|
return NSFont.systemFontSize
|
|
case .medium:
|
|
return actualFontSize(for: .small) + 1.0
|
|
case .large:
|
|
return actualFontSize(for: .medium) + 4.0
|
|
case .veryLarge:
|
|
return actualFontSize(for: .large) + 8.0
|
|
}
|
|
}
|
|
}
|
|
|
|
private extension AppDefaults {
|
|
|
|
var firstRunDate: Date? {
|
|
get {
|
|
return date(for: Key.firstRunDate)
|
|
}
|
|
set {
|
|
setDate(for: Key.firstRunDate, newValue)
|
|
}
|
|
}
|
|
|
|
static func registerDefaults() {
|
|
|
|
let defaults: [String : Any] = [Key.sidebarFontSize: FontSize.medium.rawValue, Key.timelineFontSize: FontSize.medium.rawValue, Key.detailFontSize: FontSize.medium.rawValue, Key.timelineSortDirection: ComparisonResult.orderedDescending.rawValue, "NSScrollViewShouldScrollUnderTitlebar": false]
|
|
|
|
UserDefaults.standard.register(defaults: defaults)
|
|
}
|
|
|
|
func fontSize(for key: String) -> FontSize {
|
|
|
|
// Punted till after 1.0.
|
|
return .medium
|
|
|
|
// var rawFontSize = int(for: key)
|
|
// if rawFontSize < smallestFontSizeRawValue {
|
|
// rawFontSize = smallestFontSizeRawValue
|
|
// }
|
|
// if rawFontSize > largestFontSizeRawValue {
|
|
// rawFontSize = largestFontSizeRawValue
|
|
// }
|
|
// return FontSize(rawValue: rawFontSize)!
|
|
}
|
|
|
|
func setFontSize(for key: String, _ fontSize: FontSize) {
|
|
setInt(for: key, fontSize.rawValue)
|
|
}
|
|
|
|
func bool(for key: String) -> Bool {
|
|
return UserDefaults.standard.bool(forKey: key)
|
|
}
|
|
|
|
func setBool(for key: String, _ flag: Bool) {
|
|
UserDefaults.standard.set(flag, forKey: key)
|
|
}
|
|
|
|
func int(for key: String) -> Int {
|
|
return UserDefaults.standard.integer(forKey: key)
|
|
}
|
|
|
|
func setInt(for key: String, _ x: Int) {
|
|
UserDefaults.standard.set(x, forKey: key)
|
|
}
|
|
|
|
func date(for key: String) -> Date? {
|
|
return UserDefaults.standard.object(forKey: key) as? Date
|
|
}
|
|
|
|
func setDate(for key: String, _ date: Date?) {
|
|
UserDefaults.standard.set(date, forKey: key)
|
|
}
|
|
|
|
func sortDirection(for key:String) -> ComparisonResult {
|
|
|
|
let rawInt = int(for: key)
|
|
if rawInt == ComparisonResult.orderedAscending.rawValue {
|
|
return .orderedAscending
|
|
}
|
|
return .orderedDescending
|
|
}
|
|
|
|
func setSortDirection(for key: String, _ value: ComparisonResult) {
|
|
|
|
if value == .orderedAscending {
|
|
setInt(for: key, ComparisonResult.orderedAscending.rawValue)
|
|
}
|
|
else {
|
|
setInt(for: key, ComparisonResult.orderedDescending.rawValue)
|
|
}
|
|
}
|
|
}
|
|
|
|
|