// // Control.swift // VDS // // Created by Matt Bruce on 7/22/22. // import Foundation import UIKit import Combine open class Control: UIControl, ModelHandlerable, ViewProtocol, Resettable { //-------------------------------------------------- // MARK: - Combine Properties //-------------------------------------------------- @Published public var model: ModelType = ModelType() public var modelPublisher: Published.Publisher { $model } public var subscribers = Set() //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- private var initialSetupPerformed = false @Proxy(\.model.surface) open var surface: Surface @Proxy(\.model.disabled) open var disabled: Bool { didSet { self.isEnabled = !disabled } } open override var isEnabled: Bool { get { !model.disabled } set { //create local vars for clear coding let disabled = !newValue if model.disabled != disabled { model.disabled = disabled } } } //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- required public init() { super.init(frame: .zero) initialSetup() } public required init(with model: ModelType) { super.init(frame: .zero) initialSetup() set(with: model) } public override init(frame: CGRect) { super.init(frame: .zero) initialSetup() } public required init?(coder: NSCoder) { super.init(coder: coder) initialSetup() } //-------------------------------------------------- // MARK: - Setup //-------------------------------------------------- public func initialSetup() { if !initialSetupPerformed { initialSetupPerformed = true setupUpdateView() setup() } } //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- open func shouldUpdateView(viewModel: ModelType) -> Bool { fatalError("Implement shouldUpdateView") } open func updateView(viewModel: ModelType) { fatalError("Implement updateView") } open func reset() { backgroundColor = .clear } // MARK: - ViewProtocol /// Will be called only once. open func setup() { translatesAutoresizingMaskIntoConstraints = false insetsLayoutMarginsFromSafeArea = false } }