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

View File

@ -9,6 +9,7 @@ import Foundation
import UIKit import UIKit
import VDS import VDS
import VDSFormControlsTokens import VDSFormControlsTokens
import Combine
public class TextField: UITextField { public class TextField: UITextField {
@ -76,4 +77,16 @@ public class NumericField: TextField {
super.setup() super.setup()
keyboardType = .numberPad 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 leadingCharacterTextField = TextField()
var hideDotSwitch = Toggle() var hideDotSwitch = Toggle()
var hideBorderSwitch = Toggle() var hideBorderSwitch = Toggle()
@ -88,7 +88,7 @@ class BadgeIndicatorViewController: BaseViewController<BadgeIndicator> {
dotForm.addFormRow(label: "Hide Dot", view: hideDotSwitch) dotForm.addFormRow(label: "Hide Dot", view: hideDotSwitch)
dotForm.addFormRow(label: "Dot Size", view: dotSizeTextField) dotForm.addFormRow(label: "Dot Size", view: dotSizeTextField)
numberedForm.addFormRow(label: "Leading Character", view: leadingCharacterTextField) 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) numberedForm.addFormRow(label: "Max Digits", view: maxDigitsPickerSelectorView)
append(section: numberedForm) append(section: numberedForm)
append(section: dotForm) append(section: dotForm)
@ -102,71 +102,46 @@ class BadgeIndicatorViewController: BaseViewController<BadgeIndicator> {
}.store(in: &subscribers) }.store(in: &subscribers)
textField textField
.textPublisher .numberPublisher
.sink { [weak self] text in .sink { [weak self] number in
if let n = NumberFormatter().number(from: text) { guard let number else { return }
self?.component.number = n.intValue self?.component.number = number.intValue
}
}.store(in: &subscribers) }.store(in: &subscribers)
leadingCharacterTextField leadingCharacterTextField
.textPublisher .textPublisher
.sink { [weak self] text in .sink { [weak self] text in
if !text.isEmpty { self?.component.leadingCharacter = text
self?.component.leadingCharacter = text
} else {
self?.component.leadingCharacter = nil
}
}.store(in: &subscribers) }.store(in: &subscribers)
heightTextField heightTextField
.textPublisher .numberPublisher
.sink { [weak self] text in .sink { [weak self] number in
if let n = NumberFormatter().number(from: text) { self?.component.height = number?.cgFloatValue
self?.component.height = CGFloat(truncating: n)
} else {
self?.component.height = nil
}
}.store(in: &subscribers) }.store(in: &subscribers)
widthTextField widthTextField
.textPublisher .numberPublisher
.sink { [weak self] text in .sink { [weak self] number in
if let n = NumberFormatter().number(from: text) { self?.component.width = number?.cgFloatValue
self?.component.width = CGFloat(truncating: n)
} else {
self?.component.width = nil
}
}.store(in: &subscribers) }.store(in: &subscribers)
horizontalPaddingTextField horizontalPaddingTextField
.textPublisher .numberPublisher
.sink { [weak self] text in .sink { [weak self] number in
if let n = NumberFormatter().number(from: text) { self?.component.horitonalPadding = number?.cgFloatValue
self?.component.horitonalPadding = CGFloat(truncating: n)
} else {
self?.component.horitonalPadding = nil
}
}.store(in: &subscribers) }.store(in: &subscribers)
verticalPaddingTextField verticalPaddingTextField
.textPublisher .numberPublisher
.sink { [weak self] text in .sink { [weak self] number in
if let n = NumberFormatter().number(from: text) { self?.component.verticalPadding = number?.cgFloatValue
self?.component.verticalPadding = CGFloat(truncating: n)
} else {
self?.component.verticalPadding = nil
}
}.store(in: &subscribers) }.store(in: &subscribers)
dotSizeTextField dotSizeTextField
.textPublisher .numberPublisher
.sink { [weak self] text in .sink { [weak self] number in
if let n = NumberFormatter().number(from: text) { self?.component.dotSize = number?.cgFloatValue
self?.component.dotSize = CGFloat(truncating: n)
} else {
self?.component.dotSize = nil
}
}.store(in: &subscribers) }.store(in: &subscribers)
} }

View File

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

View File

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

View File

@ -93,21 +93,23 @@ class ButtonIconViewController: BaseViewController<ButtonIcon> {
self?.component.fitToIcon = sender.isOn self?.component.fitToIcon = sender.isOn
} }
customSizeField.textPublisher.sink { [weak self] value in customSizeField
if let intValue = Int(value) { .numberPublisher
self?.component.customSize = intValue .sink { [weak self] number in
} else if value.isEmpty { self?.component.customSize = number?.intValue
self?.component.customSize = nil }.store(in: &subscribers)
}
}.store(in: &subscribers)
centerX.textPublisher.sink { [weak self] value in centerX
self?.updateOffset() .numberPublisher
}.store(in: &subscribers) .sink { [weak self] _ in
self?.updateOffset()
}.store(in: &subscribers)
centerY.textPublisher.sink { [weak self] value in centerY
self?.updateOffset() .numberPublisher
}.store(in: &subscribers) .sink { [weak self] _ in
self?.updateOffset()
}.store(in: &subscribers)
} }
func setupModel() { func setupModel() {

View File

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

View File

@ -48,13 +48,11 @@ class IconViewController: BaseViewController<Icon> {
addFormRow(label: "Color", view: colorPickerSelectorView) addFormRow(label: "Color", view: colorPickerSelectorView)
addFormRow(label: "Name", view: namePickerSelectorView) addFormRow(label: "Name", view: namePickerSelectorView)
customSizeField.textPublisher.sink { [weak self] value in customSizeField
if let intValue = Int(value) { .numberPublisher
self?.component.customSize = intValue .sink { [weak self] number in
} else if value.isEmpty { self?.component.customSize = number?.intValue
self?.component.customSize = nil }.store(in: &subscribers)
}
}.store(in: &subscribers)
} }
func setupModel() { func setupModel() {

View File

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

View File

@ -98,20 +98,23 @@ class TabsContainerViewController: BaseViewController<TabsContainer> {
self.component.tabModels = sender.isOn ? self.getAllTabs() : self.getSomeTabs() self.component.tabModels = sender.isOn ? self.getAllTabs() : self.getSomeTabs()
} }
widthValueTextField.textPublisher.sink { [weak self] text in widthValueTextField
if let value = Double(text) { .numberPublisher
self?.component.width = .value(value) .sink { [weak self] number in
self?.widthPercentageTextField.text = "" if let number {
self?.component.width = .value(number.cgFloatValue)
self?.widthPercentageTextField.text = ""
}
}.store(in: &subscribers)
} widthPercentageTextField
}.store(in: &subscribers) .numberPublisher
.sink { [weak self] number in
widthPercentageTextField.textPublisher.sink { [weak self] text in if let number {
if let value = Double(text) { self?.component.width = .percentage(number.cgFloatValue)
self?.component.width = .percentage(value) self?.widthValueTextField.text = ""
self?.widthValueTextField.text = "" }
} }.store(in: &subscribers)
}.store(in: &subscribers)
} }

View File

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

View File

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

View File

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