// // TabsViewController.swift // VDSSample // // Created by Matt Bruce on 5/18/23. // import Foundation import UIKit import VDS import Combine import VDSColorTokens class TabsViewController: BaseViewController { var disabledSwitch = Toggle() var borderlineSwitch = Toggle() var fillContainerSwitch = Toggle() var sampleSwitch = Toggle() var widthValueTextField = NumericField() var widthPercentageTextField = NumericField() var verticalOrientationFormStackView: UIStackView = { return UIStackView().with { $0.translatesAutoresizingMaskIntoConstraints = false $0.alignment = .fill $0.distribution = .fillProportionally $0.axis = .vertical $0.spacing = 10 $0.isHidden = true } }() var horizontalOrientationFormStackView: UIStackView = { return UIStackView().with { $0.translatesAutoresizingMaskIntoConstraints = false $0.alignment = .fill $0.distribution = .fillProportionally $0.axis = .vertical $0.spacing = 10 } }() override func allTextFields() -> [TextField]? { [widthValueTextField, widthPercentageTextField] } lazy var orientationPickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: Tabs.Orientation.allCases) }() lazy var indicatorPositionPickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: Tabs.IndicatorPosition.allCases) }() lazy var sizePickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: Tabs.Size.allCases) }() lazy var overflowPickerSelectorView = { PickerSelectorView(title: "", picker: self.picker, items: Tabs.Overflow.allCases) }() override func viewDidLoad() { super.viewDidLoad() addContentTopView(view: component) setupPicker() setupModel() } override func setupForm(){ super.setupForm() addFormRow(label: "Large Sample", view: .makeWrapper(for: sampleSwitch)) addFormRow(label: "Disabled", view: .makeWrapper(for: disabledSwitch)) addFormRow(label: "Show Borderline", view: .makeWrapper(for: borderlineSwitch)) addFormRow(label: "Surface", view: surfacePickerSelectorView) addFormRow(label: "Size", view: sizePickerSelectorView) if UIDevice.isIPad { addFormRow(label: "Orientation", view: orientationPickerSelectorView) //only in vertical mode addFormRow(label: "% Width (0.25 -> 1.0)", view: widthPercentageTextField, stackView: verticalOrientationFormStackView) addFormRow(label: "# Width", view: widthValueTextField, stackView: verticalOrientationFormStackView) } //only in horizontal mode addFormRow(label: "Fill Container", view: .makeWrapper(for: fillContainerSwitch), stackView: horizontalOrientationFormStackView) addFormRow(label: "Indicator Position", view: indicatorPositionPickerSelectorView, stackView: horizontalOrientationFormStackView) addFormRow(label: "Overflow", view: overflowPickerSelectorView, stackView: horizontalOrientationFormStackView) formStackView.addArrangedSubview(verticalOrientationFormStackView) formStackView.addArrangedSubview(horizontalOrientationFormStackView) disabledSwitch.onChange = { [weak self] sender in self?.component.disabled = sender.isOn } borderlineSwitch.onChange = { [weak self] sender in self?.component.borderLine = sender.isOn } fillContainerSwitch.onChange = { [weak self] sender in self?.component.fillContainer = sender.isOn } sampleSwitch.onChange = { [weak self] sender in guard let self else { return } self.component.selectedIndex = 0 self.component.tabModels = sender.isOn ? self.allTabs : self.some } widthValueTextField.textPublisher.sink { [weak self] text in if let value = Double(text) { self?.component.width = .value(value) self?.widthPercentageTextField.text = "" } }.store(in: &subscribers) widthPercentageTextField.textPublisher.sink { [weak self] text in if let value = Double(text) { self?.component.width = .percentage(value) self?.widthValueTextField.text = "" } }.store(in: &subscribers) } var allTabs: [TabModel] = [ TabModel(text: "All"), TabModel(text: "Work Devices"), TabModel(text: "Customer Service"), TabModel(text: "Help") ] var some: [TabModel] = [ TabModel(text: "All"), TabModel(text: "Work Devices") ] func setupModel() { //set to the large sample component.tabModels = allTabs component.selectedIndex = 3 //setup UI surfacePickerSelectorView.text = component.surface.rawValue sizePickerSelectorView.text = component.size.rawValue orientationPickerSelectorView.text = component.orientation.rawValue indicatorPositionPickerSelectorView.text = component.indicatorPosition.rawValue overflowPickerSelectorView.text = component.overflow.rawValue disabledSwitch.isOn = component.disabled borderlineSwitch.isOn = component.borderLine fillContainerSwitch.isOn = component.fillContainer sampleSwitch.isOn = true updateWidth() } func setupPicker(){ surfacePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.surface = item self?.contentTopView.backgroundColor = item.color } sizePickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.size = item } orientationPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.orientation = item self?.verticalOrientationFormStackView.isHidden = item == .horizontal self?.horizontalOrientationFormStackView.isHidden = item == .vertical } indicatorPositionPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.indicatorPosition = item } overflowPickerSelectorView.onPickerDidSelect = { [weak self] item in self?.component.overflow = item } } func updateWidth() { switch component.width { case .percentage(let percentage): widthPercentageTextField.text = "\(percentage)" case .value(let value): widthValueTextField.text = "\(value)" widthPercentageTextField.text = "" @unknown default: print("") } } }