new funcs
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
cd327a7f78
commit
4e6d9b2f9d
@ -13,14 +13,19 @@ import Combine
|
|||||||
open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProtocol, Resettable {
|
open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProtocol, Resettable {
|
||||||
|
|
||||||
@Published public var model: ModelType
|
@Published public var model: ModelType
|
||||||
private var cancellable: AnyCancellable?
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
private var shouldUpdate: Bool = false
|
||||||
|
|
||||||
open func set(with model: ModelType) {
|
open func set(with model: ModelType) {
|
||||||
self.model = model
|
self.model = model
|
||||||
}
|
}
|
||||||
|
|
||||||
open func onStateChange(viewModel: ModelType) {
|
open func shouldUpdateView(viewModel: ModelType) -> Bool {
|
||||||
|
fatalError("Implement shouldUpdateView")
|
||||||
|
}
|
||||||
|
|
||||||
|
open func updateView(viewModel: ModelType) {
|
||||||
|
fatalError("Implement updateView")
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -58,9 +63,23 @@ open class Control<ModelType: Modelable>: UIControl, ModelHandlerable, ViewProto
|
|||||||
public func initialSetup() {
|
public func initialSetup() {
|
||||||
if !initialSetupPerformed {
|
if !initialSetupPerformed {
|
||||||
initialSetupPerformed = true
|
initialSetupPerformed = true
|
||||||
cancellable = $model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
//setup shouldUpdate
|
||||||
self?.onStateChange(viewModel: viewModel)
|
$model.sink { [weak self] viewModel in
|
||||||
}
|
guard let self = self else { return }
|
||||||
|
let s = self.shouldUpdateView(viewModel: viewModel)
|
||||||
|
print("shouldUpdate - \(Self.self): \(s)")
|
||||||
|
self.shouldUpdate = s
|
||||||
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
|
//setup viewUpdate
|
||||||
|
$model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
||||||
|
guard let self = self else { return }
|
||||||
|
if self.shouldUpdate {
|
||||||
|
self.updateView(viewModel: viewModel)
|
||||||
|
self.shouldUpdate = false
|
||||||
|
print("didUpdate - \(Self.self)")
|
||||||
|
}
|
||||||
|
}.store(in: &cancellables)
|
||||||
setup()
|
setup()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -13,16 +13,21 @@ import Combine
|
|||||||
open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, Resettable {
|
open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, Resettable {
|
||||||
|
|
||||||
@Published public var model: ModelType
|
@Published public var model: ModelType
|
||||||
private var cancellable: AnyCancellable?
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
private var shouldUpdate: Bool = false
|
||||||
|
|
||||||
open func set(with model: ModelType) {
|
open func set(with model: ModelType) {
|
||||||
self.model = model
|
self.model = model
|
||||||
}
|
}
|
||||||
|
|
||||||
open func onStateChange(viewModel: ModelType) {
|
open func shouldUpdateView(viewModel: ModelType) -> Bool {
|
||||||
|
fatalError("Implement shouldUpdateView")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open func updateView(viewModel: ModelType) {
|
||||||
|
fatalError("Implement updateView")
|
||||||
|
}
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@ -57,9 +62,24 @@ open class View<ModelType: Modelable>: UIView, ModelHandlerable, ViewProtocol, R
|
|||||||
public func initialSetup() {
|
public func initialSetup() {
|
||||||
if !initialSetupPerformed {
|
if !initialSetupPerformed {
|
||||||
initialSetupPerformed = true
|
initialSetupPerformed = true
|
||||||
cancellable = $model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
//setup shouldUpdate
|
||||||
self?.onStateChange(viewModel: viewModel)
|
$model.sink { [weak self] viewModel in
|
||||||
}
|
guard let self = self else { return }
|
||||||
|
let s = self.shouldUpdateView(viewModel: viewModel)
|
||||||
|
print("shouldUpdate - \(Self.self): \(s)")
|
||||||
|
self.shouldUpdate = s
|
||||||
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
|
//setup viewUpdate
|
||||||
|
$model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
||||||
|
guard let self = self else { return }
|
||||||
|
if self.shouldUpdate {
|
||||||
|
self.updateView(viewModel: viewModel)
|
||||||
|
self.shouldUpdate = false
|
||||||
|
print("didUpdate - \(Self.self)")
|
||||||
|
}
|
||||||
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
setup()
|
setup()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,8 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
|
|||||||
// MARK: - Combine Properties
|
// MARK: - Combine Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
@Published public var model: ModelType
|
@Published public var model: ModelType
|
||||||
private var cancellable: AnyCancellable?
|
private var cancellables = Set<AnyCancellable>()
|
||||||
|
private var shouldUpdate: Bool = false
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
@ -94,9 +95,23 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
|
|||||||
translatesAutoresizingMaskIntoConstraints = false
|
translatesAutoresizingMaskIntoConstraints = false
|
||||||
accessibilityCustomActions = []
|
accessibilityCustomActions = []
|
||||||
accessibilityTraits = .staticText
|
accessibilityTraits = .staticText
|
||||||
cancellable = $model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
|
||||||
self?.onStateChange(viewModel: viewModel)
|
//setup shouldUpdate
|
||||||
}
|
$model.sink { [weak self] viewModel in
|
||||||
|
guard let self = self else { return }
|
||||||
|
self.shouldUpdate = self.shouldUpdateView(viewModel: viewModel)
|
||||||
|
print("shouldUpdate - \(Self.self): \(self.shouldUpdate)")
|
||||||
|
}.store(in: &cancellables)
|
||||||
|
|
||||||
|
//setup viewUpdate
|
||||||
|
$model.debounce(for: .seconds(Constants.ModelStateDebounce), scheduler: RunLoop.main).sink { [weak self] viewModel in
|
||||||
|
guard let self = self else { return }
|
||||||
|
if self.shouldUpdate {
|
||||||
|
self.updateView(viewModel: viewModel)
|
||||||
|
self.shouldUpdate = false
|
||||||
|
print("didUpdate - \(Self.self)")
|
||||||
|
}
|
||||||
|
}.store(in: &cancellables)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func reset() {
|
public func reset() {
|
||||||
@ -120,7 +135,15 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
/// Follow the SwiftUI View paradigm
|
/// Follow the SwiftUI View paradigm
|
||||||
/// - Parameter viewModel: state
|
/// - Parameter viewModel: state
|
||||||
open func onStateChange(viewModel: ModelType) {
|
open func shouldUpdateView(viewModel: ModelType) -> Bool {
|
||||||
|
return viewModel.text != model.text
|
||||||
|
|| viewModel.disabled != model.disabled
|
||||||
|
|| viewModel.surface != model.surface
|
||||||
|
|| viewModel.font != model.font
|
||||||
|
|| viewModel.textPosition != model.textPosition
|
||||||
|
}
|
||||||
|
|
||||||
|
open func updateView(viewModel: ModelType) {
|
||||||
textAlignment = viewModel.textPosition.textAlignment
|
textAlignment = viewModel.textPosition.textAlignment
|
||||||
textColor = textColorConfiguration.getColor(viewModel)
|
textColor = textColorConfiguration.getColor(viewModel)
|
||||||
|
|
||||||
@ -146,7 +169,7 @@ open class LabelBase<ModelType: LabelModel>: UILabel, ModelHandlerable, Initable
|
|||||||
attribute.setAttribute(on: mutableText)
|
attribute.setAttribute(on: mutableText)
|
||||||
|
|
||||||
//see if the attribute is Actionable
|
//see if the attribute is Actionable
|
||||||
if let actionable = attribute as? LabelAttributeActionable{
|
if let actionable = attribute as? any LabelAttributeActionable{
|
||||||
//create a accessibleAction
|
//create a accessibleAction
|
||||||
let customAccessibilityAction = customAccessibilityAction(range: actionable.range)
|
let customAccessibilityAction = customAccessibilityAction(range: actionable.range)
|
||||||
|
|
||||||
|
|||||||
@ -300,7 +300,11 @@ open class SelectorBase<ModelType: SelectorModel>: Control<ModelType>, Changable
|
|||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
/// Follow the SwiftUI View paradigm
|
/// Follow the SwiftUI View paradigm
|
||||||
/// - Parameter viewModel: state
|
/// - Parameter viewModel: state
|
||||||
open override func onStateChange(viewModel: ModelType) {
|
open override func shouldUpdateView(viewModel: ModelType) -> Bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
open override func updateView(viewModel: ModelType) {
|
||||||
let enabled = !viewModel.disabled
|
let enabled = !viewModel.disabled
|
||||||
|
|
||||||
updateLabels(viewModel)
|
updateLabels(viewModel)
|
||||||
|
|||||||
@ -6,10 +6,13 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
public protocol ModelHandlerable {
|
public protocol ModelHandlerable {
|
||||||
associatedtype ModelType: Modelable
|
associatedtype ModelType: Modelable
|
||||||
var model: ModelType { get set }
|
var model: ModelType { get set }
|
||||||
|
|
||||||
init(with model: ModelType)
|
init(with model: ModelType)
|
||||||
func set(with model: ModelType)
|
func set(with model: ModelType)
|
||||||
|
func shouldUpdateView(viewModel: ModelType) -> Bool
|
||||||
|
func updateView(viewModel: ModelType)
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user