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 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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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()
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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)
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user