added number publisher

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2023-07-21 14:55:37 -05:00
parent 10e6c4dd21
commit 2498a9f3af
13 changed files with 137 additions and 163 deletions

View File

@ -9,7 +9,7 @@ import Foundation
import UIKit
import VDS
class Slider: Control, UITextFieldDelegate {
class Slider: Control {
var textField = NumericField().with { $0.translatesAutoresizingMaskIntoConstraints = false }
var range = UISlider().with { $0.translatesAutoresizingMaskIntoConstraints = false }
var maximumValue: Float = 0.0 { didSet { range.maximumValue = maximumValue }}
@ -18,7 +18,6 @@ class Slider: Control, UITextFieldDelegate {
override func setup() {
addSubview(textField)
addSubview(range)
textField.delegate = self
textField.pinTop()
textField.pinBottom()
textField.pinLeading()
@ -33,6 +32,11 @@ class Slider: Control, UITextFieldDelegate {
range.publisher(for: .valueChanged).sink { [weak self] slider in
self?.valueChanged(newValue: slider.value)
}.store(in: &subscribers)
textField.numberPublisher.sink { [weak self] number in
guard let number else { return }
self?.valueChanged(newValue: number.floatValue)
}.store(in: &subscribers)
}
override func updateView() {
@ -43,12 +47,10 @@ class Slider: Control, UITextFieldDelegate {
value = newValue
sendActions(for: .valueChanged)
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder()
if let text = textField.text, let n = NumberFormatter().number(from: text) {
valueChanged(newValue: n.floatValue)
}
return true
}
extension NSNumber {
public var cgFloatValue: CGFloat {
CGFloat(doubleValue)
}
}

View File

@ -9,6 +9,7 @@ import Foundation
import UIKit
import VDS
import VDSFormControlsTokens
import Combine
public class TextField: UITextField {
@ -76,4 +77,16 @@ public class NumericField: TextField {
super.setup()
keyboardType = .numberPad
}
public var number: NSNumber? {
guard let text, let foundNumber = NumberFormatter().number(from: text) else { return nil }
return foundNumber
}
public var numberPublisher: AnyPublisher<NSNumber?, Never> {
publisher(for: .editingChanged)
.map { _ in self.number ?? nil }
.eraseToAnyPublisher()
}
}

View File

@ -50,7 +50,7 @@ class BadgeIndicatorViewController: BaseViewController<BadgeIndicator> {
}()
var textField = TextField()
var textField = NumericField()
var leadingCharacterTextField = TextField()
var hideDotSwitch = Toggle()
var hideBorderSwitch = Toggle()
@ -88,7 +88,7 @@ class BadgeIndicatorViewController: BaseViewController<BadgeIndicator> {
dotForm.addFormRow(label: "Hide Dot", view: hideDotSwitch)
dotForm.addFormRow(label: "Dot Size", view: dotSizeTextField)
numberedForm.addFormRow(label: "Leading Character", view: leadingCharacterTextField)
numberedForm.addFormRow(label: "Text", view: textField)
numberedForm.addFormRow(label: "Number", view: textField)
numberedForm.addFormRow(label: "Max Digits", view: maxDigitsPickerSelectorView)
append(section: numberedForm)
append(section: dotForm)
@ -102,71 +102,46 @@ class BadgeIndicatorViewController: BaseViewController<BadgeIndicator> {
}.store(in: &subscribers)
textField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.number = n.intValue
}
.numberPublisher
.sink { [weak self] number in
guard let number else { return }
self?.component.number = number.intValue
}.store(in: &subscribers)
leadingCharacterTextField
.textPublisher
.sink { [weak self] text in
if !text.isEmpty {
self?.component.leadingCharacter = text
} else {
self?.component.leadingCharacter = nil
}
self?.component.leadingCharacter = text
}.store(in: &subscribers)
heightTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.height = CGFloat(truncating: n)
} else {
self?.component.height = nil
}
.numberPublisher
.sink { [weak self] number in
self?.component.height = number?.cgFloatValue
}.store(in: &subscribers)
widthTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.width = CGFloat(truncating: n)
} else {
self?.component.width = nil
}
.numberPublisher
.sink { [weak self] number in
self?.component.width = number?.cgFloatValue
}.store(in: &subscribers)
horizontalPaddingTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.horitonalPadding = CGFloat(truncating: n)
} else {
self?.component.horitonalPadding = nil
}
.numberPublisher
.sink { [weak self] number in
self?.component.horitonalPadding = number?.cgFloatValue
}.store(in: &subscribers)
verticalPaddingTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.verticalPadding = CGFloat(truncating: n)
} else {
self?.component.verticalPadding = nil
}
.numberPublisher
.sink { [weak self] number in
self?.component.verticalPadding = number?.cgFloatValue
}.store(in: &subscribers)
dotSizeTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.dotSize = CGFloat(truncating: n)
} else {
self?.component.dotSize = nil
}
.numberPublisher
.sink { [weak self] number in
self?.component.dotSize = number?.cgFloatValue
}.store(in: &subscribers)
}

View File

@ -74,13 +74,10 @@ class BadgeViewController: BaseViewController<Badge> {
}.store(in: &subscribers)
maxWidthTextField
.textPublisher
.sink { [weak self] text in
var float: CGFloat?
if let n = NumberFormatter().number(from: text) {
float = CGFloat(truncating: n)
}
self?.component.maxWidth = float
.numberPublisher
.sink { [weak self] number in
guard let number else { return }
self?.component.maxWidth = number.cgFloatValue
}.store(in: &subscribers)
}

View File

@ -124,11 +124,11 @@ class ButtonGroupViewController: BaseViewController<ButtonGroup> {
}
widthTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.buttonWidth = CGFloat(truncating: n)
self?.smallButtonGroup.buttonWidth = CGFloat(truncating: n)
.numberPublisher
.sink { [weak self] number in
if let number {
self?.component.buttonWidth = number.cgFloatValue
self?.smallButtonGroup.buttonWidth = number.cgFloatValue
self?.percentageTextField.text = ""
} else {
self?.component.buttonWidth = nil
@ -136,12 +136,12 @@ class ButtonGroupViewController: BaseViewController<ButtonGroup> {
}.store(in: &subscribers)
percentageTextField
.textPublisher
.sink { [weak self] text in
.numberPublisher
.sink { [weak self] number in
let rowQty = self?.component.rowQuantity ?? 0
if let n = NumberFormatter().number(from: text), n.intValue <= 100, rowQty > 0 {
self?.component.buttonPercentage = CGFloat(truncating: n)
self?.smallButtonGroup.buttonPercentage = CGFloat(truncating: n)
if let number, number.intValue <= 100, rowQty > 0 {
self?.component.buttonPercentage = number.cgFloatValue
self?.smallButtonGroup.buttonPercentage = number.cgFloatValue
self?.widthTextField.text = ""
} else {
self?.component.buttonPercentage = nil

View File

@ -92,22 +92,24 @@ class ButtonIconViewController: BaseViewController<ButtonIcon> {
fitToIcon.onChange = { [weak self] sender in
self?.component.fitToIcon = sender.isOn
}
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)
customSizeField
.numberPublisher
.sink { [weak self] number in
self?.component.customSize = number?.intValue
}.store(in: &subscribers)
centerX
.numberPublisher
.sink { [weak self] _ in
self?.updateOffset()
}.store(in: &subscribers)
centerY
.numberPublisher
.sink { [weak self] _ in
self?.updateOffset()
}.store(in: &subscribers)
}
func setupModel() {

View File

@ -59,11 +59,10 @@ class ButtonViewController: BaseViewController<Button> {
}.store(in: &subscribers)
widthTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.width = CGFloat(truncating: n)
}
.numberPublisher
.sink { [weak self] number in
guard let self, let number else { return }
self.component.width = number.cgFloatValue
}.store(in: &subscribers)
}

View File

@ -48,13 +48,11 @@ class IconViewController: BaseViewController<Icon> {
addFormRow(label: "Color", view: colorPickerSelectorView)
addFormRow(label: "Name", view: namePickerSelectorView)
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)
customSizeField
.numberPublisher
.sink { [weak self] number in
self?.component.customSize = number?.intValue
}.store(in: &subscribers)
}
func setupModel() {

View File

@ -97,10 +97,9 @@ class InputFieldViewController: BaseViewController<InputField> {
}.store(in: &subscribers)
widthTextField
.textPublisher
.sink { [weak self] width in
guard let width = Float(width) else { return }
self?.component.width = CGFloat(width)
.numberPublisher
.sink { [weak self] number in
self?.component.width = number?.cgFloatValue
}.store(in: &subscribers)
tooltipTitleTextField

View File

@ -98,21 +98,24 @@ class TabsContainerViewController: BaseViewController<TabsContainer> {
self.component.tabModels = sender.isOn ? self.getAllTabs() : self.getSomeTabs()
}
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)
widthValueTextField
.numberPublisher
.sink { [weak self] number in
if let number {
self?.component.width = .value(number.cgFloatValue)
self?.widthPercentageTextField.text = ""
}
}.store(in: &subscribers)
widthPercentageTextField
.numberPublisher
.sink { [weak self] number in
if let number {
self?.component.width = .percentage(number.cgFloatValue)
self?.widthValueTextField.text = ""
}
}.store(in: &subscribers)
}
func getTabs(texts:[String]) -> [TabsContainer.TabModel] {

View File

@ -78,12 +78,12 @@ class TextAreaViewController: BaseViewController<TextArea> {
.sink { [weak self] text in
self?.component.errorText = text
}.store(in: &subscribers)
widthTextField
.textPublisher
.sink { [weak self] width in
guard let width = Float(width) else { return }
self?.component.width = CGFloat(width)
.numberPublisher
.sink { [weak self] number in
guard let number else { return }
self?.component.width = number.cgFloatValue
}.store(in: &subscribers)
tooltipTitleTextField

View File

@ -101,23 +101,16 @@ class TileContainerViewController: BaseViewController<TileContainer> {
}
heightTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.height = CGFloat(truncating: n)
} else {
self?.component.height = nil
}
.numberPublisher
.sink { [weak self] number in
self?.component.height = number?.cgFloatValue
}.store(in: &subscribers)
widthTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.width = CGFloat(truncating: n)
}
.numberPublisher
.sink { [weak self] number in
self?.component.width = number?.cgFloatValue
}.store(in: &subscribers)
}
func setupModel() {

View File

@ -82,41 +82,34 @@ class TileletViewController: BaseViewController<Tilelet> {
}
}
widthTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.width = CGFloat(truncating: n)
}
}.store(in: &subscribers)
heightTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text) {
self?.component.height = CGFloat(truncating: n)
} else {
self?.component.height = nil
}
.numberPublisher
.sink { [weak self] number in
self?.component.height = number?.cgFloatValue
}.store(in: &subscribers)
widthTextField
.numberPublisher
.sink { [weak self] number in
self?.component.width = number?.cgFloatValue
}.store(in: &subscribers)
textWidthTextField
.textPublisher
.sink { [weak self] text in
guard let self else { return }
if let n = NumberFormatter().number(from: text), n.floatValue > 50.0 {
self.component.textWidth = CGFloat(truncating: n)
self.textPercentageTextField.text = ""
.numberPublisher
.sink { [weak self] number in
if let number = number?.cgFloatValue, number > 50.0 {
self?.component.textWidth = number
self?.textPercentageTextField.text = ""
} else {
self.component.textWidth = nil
self?.component.textWidth = nil
}
}.store(in: &subscribers)
textPercentageTextField
.textPublisher
.sink { [weak self] text in
if let n = NumberFormatter().number(from: text), n.intValue > 15 && n.intValue <= 100 {
self?.component.textPercentage = CGFloat(truncating: n)
.numberPublisher
.sink { [weak self] number in
if let number, number.intValue > 15 && number.intValue <= 100 {
self?.component.textPercentage = number.cgFloatValue
self?.textWidthTextField.text = ""
} else {
self?.component.textPercentage = nil