From fbcf881535f52485df119a37bbc0351694f87f2b Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 13:16:37 -0600 Subject: [PATCH] added nameForReuse check refactored buttons to either create or set Signed-off-by: Matt Bruce --- .../Atomic/Atoms/Buttons/ButtonGroup.swift | 57 ++++++++++++++++--- 1 file changed, 48 insertions(+), 9 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift index 53c0a476..9e33ac7a 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift @@ -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 + } }