From cdc8b7310d8eddaa49b12a950058c9eb4ad036cd Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 12:57:32 -0600 Subject: [PATCH 01/11] added ParewntMoleculeModelProtocol Signed-off-by: Matt Bruce --- .../HorizontalCombinationViews/TwoLinkViewModel.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkViewModel.swift index c9ae177b..893d2753 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkViewModel.swift @@ -8,7 +8,7 @@ import Foundation -public class TwoLinkViewModel: MoleculeModelProtocol { +public class TwoLinkViewModel: ParentMoleculeModelProtocol { public static var identifier: String = "twoLinkView" public var id: String = UUID().uuidString @@ -16,6 +16,8 @@ public class TwoLinkViewModel: MoleculeModelProtocol { public var rightLink: LinkModel? public var leftLink: LinkModel? + public var children: [MoleculeModelProtocol] { [rightLink, leftLink].compactMap{ $0 } } + private enum CodingKeys: String, CodingKey { case id case moleculeName From f99d4e3c4df650af3a17f3a7b3dfef6b2f79f6c3 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 12:58:07 -0600 Subject: [PATCH 02/11] added fillContainer: Bool to deal with updating if the buttonGroup fills or not Signed-off-by: Matt Bruce --- .../HorizontalCombinationViews/TwoButtonViewModel.swift | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift index a7b4055c..f43f2265 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift @@ -19,10 +19,9 @@ public class TwoButtonViewModel: ParentMoleculeModelProtocol { public var backgroundColor: Color? public var primaryButton: ButtonModel? public var secondaryButton: ButtonModel? + public var fillContainer: Bool = false - public var children: [MoleculeModelProtocol] { - return [primaryButton, secondaryButton].compactMap { $0 } - } + public var children: [MoleculeModelProtocol] { [primaryButton, secondaryButton].compactMap { $0 } } //-------------------------------------------------- // MARK: - Keys From 1932fd72318a4280fd443f485cc1c333ee1afaad Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 12:58:23 -0600 Subject: [PATCH 03/11] fixed bug for removing old references in array Signed-off-by: Matt Bruce --- .../Molecules/HorizontalCombinationViews/TwoLinkView.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift index cd15066e..330563bd 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift @@ -103,6 +103,8 @@ import VDS } public func viewModelDidUpdate() { + buttons.removeAll() + if let model = viewModel.leftLink { leftLink.set(with: model, delegateObject, additionalData) buttons.append(leftLink) From d81daf1df30a2dbc39c08232baf8d4071a3ec57f Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 12:58:55 -0600 Subject: [PATCH 04/11] not resetting if the current count is correct Signed-off-by: Matt Bruce --- .../HorizontalCombinationViews/TwoButtonView.swift | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift index debd2c8d..58ac0f6e 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -34,7 +34,6 @@ import VDS buttonGroup.alignment = .center buttonGroup.rowQuantityPhone = 2 buttonGroup.rowQuantityTablet = 2 - buttonGroup.childWidth = .percentage(50) } //-------------------------------------------------- @@ -69,8 +68,12 @@ import VDS primaryButton.set(with: primaryModel, delegateObject, additionalData) buttons.append(primaryButton) } + + buttonGroup.childWidth = viewModel.fillContainer ? .percentage(100) : nil - buttonGroup.buttons = buttons + if buttons.count != buttonGroup.buttons.count { + buttonGroup.buttons = buttons + } } //-------------------------------------------------- @@ -84,6 +87,7 @@ import VDS //-------------------------------------------------- // MARK: - MVMCoreViewProtocol //-------------------------------------------------- + public func updateView(_ size: CGFloat) { setNeedsUpdate() } From 38907c7ac1781dec552322c1a72f23539fb0a53c Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 12:59:25 -0600 Subject: [PATCH 05/11] updating the model to set the TwoButtonModel to fillContainer if needed Signed-off-by: Matt Bruce --- .../Atomic/Molecules/HeadersAndFooters/FooterModel.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/HeadersAndFooters/FooterModel.swift b/MVMCoreUI/Atomic/Molecules/HeadersAndFooters/FooterModel.swift index 93e296f2..853af399 100644 --- a/MVMCoreUI/Atomic/Molecules/HeadersAndFooters/FooterModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HeadersAndFooters/FooterModel.swift @@ -29,8 +29,8 @@ if let _ = molecule as? ButtonModel { horizontalAlignment = .fill - } else if let model = molecule as? TwoButtonViewModel, - model.primaryButton == nil || model.secondaryButton == nil { + } else if let model = molecule as? TwoButtonViewModel { + model.fillContainer = true horizontalAlignment = .fill } } From 315a96470b08488aaabe6539ec829cabaf10f2fb Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 13:16:07 -0600 Subject: [PATCH 06/11] added ParentMoleculeModelProtocol Signed-off-by: Matt Bruce --- MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroupModel.swift | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroupModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroupModel.swift index 4921d0f0..505e112d 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroupModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroupModel.swift @@ -9,7 +9,8 @@ import Foundation import VDS -public class ButtonGroupModel: MoleculeModelProtocol { +public class ButtonGroupModel: ParentMoleculeModelProtocol { + //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- @@ -17,7 +18,8 @@ public class ButtonGroupModel: MoleculeModelProtocol { public static var identifier: String = "buttonGroup" public var id: String = UUID().uuidString public var backgroundColor: Color? - + public var children: [MoleculeModelProtocol] { buttons } + //-------------------------------------------------- // MARK: - VDS Properties //-------------------------------------------------- From fbcf881535f52485df119a37bbc0351694f87f2b Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 13:16:37 -0600 Subject: [PATCH 07/11] 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 + } } From 59175c45fc26bc55e41064b15b89f6bd54da1caf Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 14:16:27 -0600 Subject: [PATCH 08/11] added previousModel Signed-off-by: Matt Bruce --- MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift index 9e33ac7a..ba9f8b56 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift @@ -47,6 +47,7 @@ import VDS // create / set the moleculeViews if (previousModel == nil) || Self.nameForReuse(with: previousModel!, delegateObject) != Self.nameForReuse(with: viewModel, delegateObject) { + previousModel = viewModel var buttonBases = [ButtonBase]() viewModel.buttons.forEach { buttonModel in do { From 9db98a20784ea248a6fd18e333427837dd70aa2c Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 15:15:19 -0600 Subject: [PATCH 09/11] added else Signed-off-by: Matt Bruce --- MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift index ba9f8b56..f864e72f 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonGroup.swift @@ -43,6 +43,8 @@ import VDS childWidth = .value(childWidthValue) } else if let childWidthPercentage = viewModel.childWidthPercentage { childWidth = .percentage(childWidthPercentage) + } else { + childWidth = nil } // create / set the moleculeViews From 3f7fd100f9d26581902012eaff89970f557f3864 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 15:20:18 -0600 Subject: [PATCH 10/11] percentage doesn't matter for Links, only matters for pillbuttons Signed-off-by: Matt Bruce --- .../Molecules/HorizontalCombinationViews/TwoLinkView.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift index 330563bd..25cd07ac 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift @@ -35,7 +35,6 @@ import VDS buttonGroup.alignment = .center buttonGroup.rowQuantityPhone = 2 buttonGroup.rowQuantityTablet = 2 - buttonGroup.childWidth = .percentage(50) } //-------------------------------------------------- From 9dc77bd1ed11c35ae2e8d3c14eb0da33c35cc79b Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Mon, 29 Jan 2024 15:21:47 -0600 Subject: [PATCH 11/11] updated reset Signed-off-by: Matt Bruce --- .../Molecules/HorizontalCombinationViews/TwoButtonView.swift | 4 ---- .../Molecules/HorizontalCombinationViews/TwoLinkView.swift | 2 -- 2 files changed, 6 deletions(-) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift index 58ac0f6e..4785cfb9 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -42,10 +42,6 @@ import VDS open override func reset() { super.reset() - primaryButton.reset() - secondaryButton.reset() - primaryButton.use = .primary - secondaryButton.use = .secondary buttonGroup.reset() } diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift index 25cd07ac..32c546f9 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoLinkView.swift @@ -42,8 +42,6 @@ import VDS //-------------------------------------------------- open override func reset() { super.reset() - leftLink.reset() - rightLink.reset() buttonGroup.reset() }