2 // KenzoDockStatus.swift
5 // Created by Hori,Masaki on 2017/01/22.
6 // Copyright © 2017年 Hori,Masaki. All rights reserved.
11 private enum DockState: Int {
19 final class KenzoDockStatus: NSObject {
21 private let number: Int
22 private let controller: NSArrayController
23 private var isTasking = false
24 private var didNotify = false
25 private var realTime: TimeInterval = 0.0 {
27 didSet { time = realTime as NSNumber }
30 @objc dynamic var time: NSNumber?
31 @objc dynamic var state: NSNumber? {
33 didSet { updateState() }
35 @objc dynamic var completeTime: NSNumber?
39 guard case 1...4 = number else { return nil }
42 controller = NSArrayController()
46 controller.managedObjectContext = ServerDataStore.default.context
47 controller.entityName = KenzoDock.entityName
48 controller.fetchPredicate = NSPredicate(format: "id = %ld", number)
49 controller.automaticallyRearrangesObjects = true
52 bind(NSBindingName(#keyPath(state)), to: controller, withKeyPath: "selection.state")
53 bind(NSBindingName(#keyPath(completeTime)), to: controller, withKeyPath: "selection.complete_time")
56 private func updateState() {
58 guard let state = state as? Int,
59 let s = DockState(rawValue: state) else {
61 print("unknown State")
66 case .empty, .notOpen:
70 case .hasShip, .completed:
82 guard let completeTime = completeTime as? Int else {
88 let compTime = TimeInterval(Int(completeTime / 1_000))
89 let diff = compTime - Date().timeIntervalSince1970
91 realTime = diff < 0 ? 0 : diff
93 if didNotify { return }
94 if diff > 0 { return }
96 let notification = NSUserNotification()
97 let format = NSLocalizedString("It Will Finish Build at No.%@.", comment: "It Will Finish Build at No.%@.")
98 notification.title = String(format: format, number as NSNumber)
99 notification.informativeText = notification.title
101 if UserDefaults.standard[.playFinishKenzoSound] {
103 notification.soundName = NSUserNotificationDefaultSoundName
106 NSUserNotificationCenter.default.deliver(notification)