diff --git a/VDSSample.xcodeproj/project.pbxproj b/VDSSample.xcodeproj/project.pbxproj index eea63d5..a4bfff5 100644 --- a/VDSSample.xcodeproj/project.pbxproj +++ b/VDSSample.xcodeproj/project.pbxproj @@ -48,6 +48,7 @@ EA5E3050294D11540082B959 /* TileContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5E304F294D11540082B959 /* TileContainerViewController.swift */; }; EA5E30552950EA6E0082B959 /* TitleLockupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5E30542950EA6E0082B959 /* TitleLockupViewController.swift */; }; EA5E305C295111050082B959 /* TileletViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5E305B295111050082B959 /* TileletViewController.swift */; }; + EA81410E2A0ED8DC004F60D2 /* ButtonIconViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA81410D2A0ED8DC004F60D2 /* ButtonIconViewController.swift */; }; EA84F76228BE4AE500D67ABC /* RadioSwatchGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA84F76128BE4AE500D67ABC /* RadioSwatchGroupViewController.swift */; }; EA89201928B56DF5006B9984 /* RadioBoxGroupViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89201828B56DF5006B9984 /* RadioBoxGroupViewController.swift */; }; EA89204628B66CE2006B9984 /* ScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89203F28B66CE2006B9984 /* ScrollViewController.swift */; }; @@ -135,6 +136,7 @@ EA5E304F294D11540082B959 /* TileContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TileContainerViewController.swift; sourceTree = ""; }; EA5E30542950EA6E0082B959 /* TitleLockupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleLockupViewController.swift; sourceTree = ""; }; EA5E305B295111050082B959 /* TileletViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TileletViewController.swift; sourceTree = ""; }; + EA81410D2A0ED8DC004F60D2 /* ButtonIconViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonIconViewController.swift; sourceTree = ""; }; EA84F76128BE4AE500D67ABC /* RadioSwatchGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioSwatchGroupViewController.swift; sourceTree = ""; }; EA89201828B56DF5006B9984 /* RadioBoxGroupViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioBoxGroupViewController.swift; sourceTree = ""; }; EA89203F28B66CE2006B9984 /* ScrollViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScrollViewController.swift; sourceTree = ""; }; @@ -288,6 +290,7 @@ EA3C3BB228996775000CA526 /* MenuViewController.swift */, EAB1D2C828AAAA1D00DAE764 /* BaseViewController.swift */, EA4DB30328DCD25B00103EE3 /* BadgeViewController.swift */, + EA81410D2A0ED8DC004F60D2 /* ButtonIconViewController.swift */, EAB5FEEE2927E28400998C17 /* ButtonGroupViewController.swift */, 5FC35BE828D5235A004EBEAC /* ButtonViewController.swift */, EA89204D28B67332006B9984 /* CheckBoxGroupViewController.swift */, @@ -485,6 +488,7 @@ EA89204E28B67332006B9984 /* CheckBoxGroupViewController.swift in Sources */, EAA5EEAD28EB6924003B3210 /* InputFieldViewController.swift in Sources */, EA985C25296E06EA00F2FF2E /* TextAreaViewController.swift in Sources */, + EA81410E2A0ED8DC004F60D2 /* ButtonIconViewController.swift in Sources */, EA985C20296DECF600F2FF2E /* IconName.swift in Sources */, EA89204928B66CE2006B9984 /* KeyboardFrameChangeListening.swift in Sources */, EA985C01296CC21C00F2FF2E /* IconViewController.swift in Sources */, diff --git a/VDSSample/ViewControllers/ButtonIconViewController.swift b/VDSSample/ViewControllers/ButtonIconViewController.swift new file mode 100644 index 0000000..9ed2b1d --- /dev/null +++ b/VDSSample/ViewControllers/ButtonIconViewController.swift @@ -0,0 +1,118 @@ +// +// ButtonIconViewController.swift +// VDSSample +// +// Created by Matt Bruce on 5/12/23. +// + +import Foundation +import UIKit +import VDS +import Combine +import VDSColorTokens + +class ButtonIconViewController: BaseViewController { + + lazy var colorPickerSelectorView = { + PickerSelectorView(title: "", + picker: self.picker, + items: VDSColor.Color.allCases) + }() + + lazy var namePickerSelectorView = { + PickerSelectorView(title: "", + picker: self.picker, + items: Icon.Name.all.sorted{ $0.rawValue < $1.rawValue }) + }() + + lazy var sizePickerSelectorView = { + PickerSelectorView(title: "", + picker: self.picker, + items: ButtonIcon.Size.allCases) + }() + + var customSizeField = TextField() + var centerX = TextField() + var centerY = TextField() + + override func allTextFields() -> [TextField]? { [customSizeField, centerX, centerY] } + + override func viewDidLoad() { + super.viewDidLoad() + addContentTopView(view: .makeWrapper(for: component)) + setupPicker() + setupModel() + } + + override func setupForm(){ + super.setupForm() + addFormRow(label: "Surface", view: surfacePickerSelectorView) + addFormRow(label: "Size", view: sizePickerSelectorView) + addFormRow(label: "Custom Size", view: customSizeField) + addFormRow(label: "Name", view: namePickerSelectorView) + addFormRow(label: "X Offset", view: centerX) + addFormRow(label: "Y Offset", view: centerY) + + customSizeField.textPublisher.sink { [weak self] value in + if let intValue = Int(value) { + self?.component.customSize = intValue + } else if value.isEmpty { + self?.component.customSize = nil + } + }.store(in: &subscribers) + + centerX.textPublisher.sink { [weak self] value in + self?.updateOffset() + }.store(in: &subscribers) + + centerY.textPublisher.sink { [weak self] value in + self?.updateOffset() + }.store(in: &subscribers) + } + + func setupModel() { + let name = Icon.Name.addToFavorite + + component.iconName = name + //setup UI + surfacePickerSelectorView.text = component.surface.rawValue + sizePickerSelectorView.text = component.size.rawValue + namePickerSelectorView.text = name.rawValue + } + + func updateOffset() { + if let x = centerX.floatValue, let y = centerY.floatValue { + component.iconOffset = .init(x: x, y: y) + } else if let x = centerX.floatValue { + component.iconOffset = .init(x: x, y: 0) + } else if let y = centerY.floatValue { + component.iconOffset = .init(x: 0, y: y) + } else { + component.iconOffset = .init(x: 0, y: 0) + } + } + + + 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 + } + + namePickerSelectorView.onPickerDidSelect = { [weak self] item in + self?.component.iconName = item + } + } +} + +extension UITextField { + public var floatValue: CGFloat? { + guard let text, let double = Double(text) else { return nil } + return CGFloat(double) + } +} diff --git a/VDSSample/ViewControllers/MenuViewController.swift b/VDSSample/ViewControllers/MenuViewController.swift index 45c1b29..7d19262 100644 --- a/VDSSample/ViewControllers/MenuViewController.swift +++ b/VDSSample/ViewControllers/MenuViewController.swift @@ -74,6 +74,7 @@ class MenuViewController: UITableViewController { MenuComponent(title: "Badge", completed: true, viewController: BadgeViewController.self), MenuComponent(title: "Button", completed: true, viewController: ButtonViewController.self), MenuComponent(title: "ButtonGroup", completed: true, viewController: ButtonGroupViewController.self), + MenuComponent(title: "ButtonIcon", completed: false, viewController: ButtonIconViewController.self), MenuComponent(title: "Checkbox", completed: true, viewController: CheckboxViewController.self), MenuComponent(title: "CheckboxGroup", completed: true, viewController: CheckboxGroupViewController.self), MenuComponent(title: "Icon", completed: true, viewController: IconViewController.self),