added number publisher
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
10e6c4dd21
commit
2498a9f3af
@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@ -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()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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)
|
||||
|
||||
}
|
||||
|
||||
@ -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)
|
||||
}
|
||||
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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)
|
||||
|
||||
}
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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] {
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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() {
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
Reference in New Issue
Block a user