// // SelectorGroupHandlerBase.swift // VDS // // Created by Matt Bruce on 9/8/22. // import Foundation import UIKit import Combine /// Base Class used for any Grouped Form Control of a Selector Type open class SelectorGroupHandlerBase: Control, Changeable { //-------------------------------------------------- // MARK: - Public Properties //-------------------------------------------------- /// Array of the HandlerType registered public var selectorViews: [HandlerType] = [] /// The primary subscriber for onChange or the UIControl valueChanged event. public var onChangeSubscriber: AnyCancellable? { willSet { if let onChangeSubscriber { onChangeSubscriber.cancel() } } } //-------------------------------------------------- // MARK: - Overrides //-------------------------------------------------- /// Override to update the child SelectorViews disabled property for this group override public var disabled: Bool { didSet { selectorViews.forEach { handler in handler.disabled = disabled } } } /// Override to update the child SelectorViews surface property for this group override public var surface: Surface { didSet { selectorViews.forEach { handler in handler.surface = surface } } } /// Handler for the Group to override on a select event /// - Parameter selectedControl: Selected Control the user interacted open func didSelect(_ selectedControl: HandlerType) { fatalError("Must override didSelect") } /// Helper method to execute the valueChanged event public func valueChanged() { DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(100)) { [weak self] in self?.sendActions(for: .valueChanged) } } /// Override to update the child SelectorViews reset method for this group open override func reset() { super.reset() selectorViews.forEach{ $0.reset() } } open override func updateAccessibility() { super.updateAccessibility() setAccessibilityLabel(for: selectorViews) } } open class SelectorGroupSelectedHandlerBase: SelectorGroupHandlerBase{ /// Current Selected Control for this group public var selectedHandler: HandlerType? { return selectorViews.filter { $0.isSelected == true }.first } open override func updateAccessibility() { super.updateAccessibility() if let selectedHandler, let value = selectedHandler.accessibilityValue, let label = selectedHandler.accessibilityLabel { accessibilityValue = "\(label) \(value)" } else { accessibilityValue = nil } } }