2018-01-21 04:06:07 +01:00
|
|
|
//
|
|
|
|
// InspectorWindowController.swift
|
|
|
|
// Evergreen
|
|
|
|
//
|
|
|
|
// Created by Brent Simmons on 1/20/18.
|
|
|
|
// Copyright © 2018 Ranchero Software. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import AppKit
|
|
|
|
|
2018-01-21 07:36:17 +01:00
|
|
|
protocol Inspector: class {
|
2018-01-21 06:48:27 +01:00
|
|
|
|
2018-01-21 07:36:17 +01:00
|
|
|
var objects: [Any]? { get set }
|
|
|
|
var isFallbackInspector: Bool { get } // Can handle nothing-to-inspect or unexpected type of objects.
|
2018-01-21 06:48:27 +01:00
|
|
|
|
2018-01-21 07:36:17 +01:00
|
|
|
func canInspect(_ objects: [Any]) -> Bool
|
|
|
|
|
|
|
|
func willEndInspectingObjects() // Called on the current inspector right before objects is about to change.
|
2018-01-21 06:48:27 +01:00
|
|
|
}
|
|
|
|
|
2018-01-21 04:06:07 +01:00
|
|
|
final class InspectorWindowController: NSWindowController {
|
|
|
|
|
2018-01-21 07:36:17 +01:00
|
|
|
private var inspectors: [Inspector]!
|
|
|
|
|
|
|
|
private var currentInspector: Inspector! {
|
|
|
|
didSet {
|
|
|
|
if let oldInspector = oldValue {
|
|
|
|
oldInspector.willEndInspectingObjects()
|
|
|
|
}
|
|
|
|
currentInspector.objects = objects
|
|
|
|
for inspector in inspectors {
|
|
|
|
if inspector !== currentInspector {
|
|
|
|
inspector.objects = nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
show(currentInspector)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var objects: [Any]? {
|
|
|
|
didSet {
|
|
|
|
currentInspector = inspector(for: objects)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
var isOpen: Bool {
|
2018-01-21 04:06:07 +01:00
|
|
|
get {
|
|
|
|
return isWindowLoaded && window!.isVisible
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-21 07:36:17 +01:00
|
|
|
override func windowDidLoad() {
|
|
|
|
|
|
|
|
let storyboard = NSStoryboard(name: NSStoryboard.Name(rawValue: "Inspector"), bundle: nil)
|
|
|
|
let feedInspector = inspector("Feed", storyboard)
|
|
|
|
let folderInspector = inspector("Folder", storyboard)
|
|
|
|
let builtinSmartFeedInspector = inspector("BuiltinSmartFeed", storyboard)
|
|
|
|
let nothingInspector = inspector("Nothing", storyboard)
|
|
|
|
inspectors = [feedInspector, folderInspector, builtinSmartFeedInspector, nothingInspector]
|
|
|
|
}
|
|
|
|
|
|
|
|
func inspector(for objects: [Any]?) -> Inspector {
|
|
|
|
|
|
|
|
var fallbackInspector: Inspector? = nil
|
|
|
|
|
|
|
|
for inspector in inspectors {
|
|
|
|
if inspector.isFallbackInspector {
|
|
|
|
fallbackInspector = inspector
|
|
|
|
}
|
|
|
|
else if let objects = objects, inspector.canInspect(objects) {
|
|
|
|
return inspector
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return fallbackInspector!
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private extension InspectorWindowController {
|
|
|
|
|
|
|
|
func inspector(_ identifier: String, _ storyboard: NSStoryboard) -> Inspector {
|
|
|
|
|
|
|
|
return storyboard.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: identifier)) as! Inspector
|
|
|
|
}
|
|
|
|
|
|
|
|
func show(_ inspector: Inspector) {
|
2018-01-21 06:48:27 +01:00
|
|
|
|
2018-01-21 07:36:17 +01:00
|
|
|
// TODO
|
2018-01-21 06:48:27 +01:00
|
|
|
}
|
2018-01-21 04:06:07 +01:00
|
|
|
}
|