// // SelectorBase.swift // VDS // // Created by Matt Bruce on 6/5/23. // import Foundation import Combine import VDSColorTokens import VDSFormControlsTokens public protocol SelectorControlable: Control, Changeable { var showError: Bool { get set } var size: CGSize { get set } var backgroundColorConfiguration: ControlColorConfiguration { get set } var borderColorConfiguration: ControlColorConfiguration { get set } var selectorColorConfiguration: ControlColorConfiguration { get set } } open class SelectorBase: Control, SelectorControlable { public var onChangeSubscriber: AnyCancellable? { willSet { if let onChangeSubscriber { onChangeSubscriber.cancel() } } } open var size = CGSize(width: 20, height: 20) { didSet { setNeedsUpdate() }} var _showError: Bool = false open var showError: Bool { get { _showError } set { if !isSelected && _showError != newValue { _showError = newValue setNeedsUpdate() } } } open override var state: UIControl.State { get { var state = super.state if showError { state.insert(.error) } else { state.remove(.error) } return state } } open var backgroundColorConfiguration = ControlColorConfiguration() { didSet { setNeedsUpdate() }} open var borderColorConfiguration = ControlColorConfiguration() { didSet { setNeedsUpdate() }} open var selectorColorConfiguration = ControlColorConfiguration() { didSet { setNeedsUpdate() }} private var selectorView = View() //-------------------------------------------------- // MARK: - Constraints //-------------------------------------------------- internal var shapeLayer: CAShapeLayer? open override func initialSetup() { super.initialSetup() onClick = { control in control.toggle() } } open override func setup() { super.setup() isAccessibilityElement = true accessibilityTraits = .button } open override var intrinsicContentSize: CGSize { size } open func toggle() { } open override func updateView() { super.updateView() setNeedsLayout() layoutIfNeeded() } open override func updateAccessibility() { super.updateAccessibility() accessibilityValue = isSelected ? "1" : "0" } }