added nameForReuse check

refactored buttons to either create or set

Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
Matt Bruce 2024-01-29 13:16:37 -06:00
parent 315a96470b
commit fbcf881535

View File

@ -18,6 +18,7 @@ import VDS
open var viewModel: ButtonGroupModel!
open var delegateObject: MVMCoreUIDelegateObject?
open var additionalData: [AnyHashable : Any]?
open var previousModel: ButtonGroupModel?
//--------------------------------------------------
// MARK: - MoleculeViewProtocol
@ -31,25 +32,45 @@ import VDS
return PillButton.estimatedHeight(with: buttonModel, delegateObject)
}
public func viewModelDidUpdate() {
var buttonBases = [ButtonBase]()
viewModel.buttons.forEach { buttonModel in
if let buttonBaseType = try? ModelRegistry.getHandler(buttonModel) as? MoleculeViewProtocol.Type,
let button = buttonBaseType.init(model: buttonModel, delegateObject, additionalData) as? VDS.ButtonBase {
buttonBases.append(button)
}
}
public func viewModelDidUpdate() {
surface = viewModel.surface
isEnabled = viewModel.enabled
alignment = viewModel.alignment
rowQuantityPhone = viewModel.rowQuantityPhone
rowQuantityTablet = viewModel.rowQuantityTablet
if let childWidthValue = viewModel.childWidthValue {
childWidth = .value(childWidthValue)
} else if let childWidthPercentage = viewModel.childWidthPercentage {
childWidth = .percentage(childWidthPercentage)
}
buttons = buttonBases
// create / set the moleculeViews
if (previousModel == nil) || Self.nameForReuse(with: previousModel!, delegateObject) != Self.nameForReuse(with: viewModel, delegateObject) {
var buttonBases = [ButtonBase]()
viewModel.buttons.forEach { buttonModel in
do {
let buttonBaseType = try ModelRegistry.getHandler(buttonModel) as! MoleculeViewProtocol.Type
let button = buttonBaseType.init(model: buttonModel, delegateObject, additionalData) as! VDS.ButtonBase
buttonBases.append(button)
} catch {
if let errorObject = MVMCoreErrorObject.createErrorObject(for: error, location: #function) {
MVMCoreLoggingHandler.shared()?.addError(toLog: errorObject)
}
}
}
buttons = buttonBases
} else {
// only set the molecule views
for (index, buttonBase) in buttons.enumerated() {
if let button = buttonBase as? MoleculeViewProtocol, index < viewModel.buttons.count {
button.set(with: viewModel.buttons[index], delegateObject, additionalData)
}
}
// force redraw
setNeedsUpdate()
}
}
//--------------------------------------------------
@ -66,4 +87,22 @@ import VDS
public func updateView(_ size: CGFloat) {
setNeedsUpdate()
}
public static func nameForReuse(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> String? {
// This will aggregate names of molecules to make an id.
guard let model = model as? ButtonGroupModel else {
return "buttonGroup<>"
}
var name = "buttonGroup<"
for case let item in model.buttons {
if let moleculeClass = ModelRegistry.getMoleculeClass(item),
let nameForReuse = moleculeClass.nameForReuse(with: item, delegateObject) {
name.append(nameForReuse + ",")
} else {
name.append(item.moleculeName + ",")
}
}
name.append(">")
return name
}
}