Merge branch 'feature/atomic_vds_buttonGroup' into feature/vds_batch_two

This commit is contained in:
Matt Bruce 2024-01-29 15:31:29 -06:00
commit 87a8051bbe
7 changed files with 70 additions and 26 deletions

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,48 @@ 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)
} else {
childWidth = nil
}
// 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 {
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()
}
buttons = buttonBases
}
//--------------------------------------------------
@ -66,4 +90,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
}
}

View File

@ -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
//--------------------------------------------------

View File

@ -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
}
}

View File

@ -34,7 +34,6 @@ import VDS
buttonGroup.alignment = .center
buttonGroup.rowQuantityPhone = 2
buttonGroup.rowQuantityTablet = 2
buttonGroup.childWidth = .percentage(50)
}
//--------------------------------------------------
@ -43,10 +42,6 @@ import VDS
open override func reset() {
super.reset()
primaryButton.reset()
secondaryButton.reset()
primaryButton.use = .primary
secondaryButton.use = .secondary
buttonGroup.reset()
}
@ -69,8 +64,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 +83,7 @@ import VDS
//--------------------------------------------------
// MARK: - MVMCoreViewProtocol
//--------------------------------------------------
public func updateView(_ size: CGFloat) {
setNeedsUpdate()
}

View File

@ -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

View File

@ -35,7 +35,6 @@ import VDS
buttonGroup.alignment = .center
buttonGroup.rowQuantityPhone = 2
buttonGroup.rowQuantityTablet = 2
buttonGroup.childWidth = .percentage(50)
}
//--------------------------------------------------
@ -43,8 +42,6 @@ import VDS
//--------------------------------------------------
open override func reset() {
super.reset()
leftLink.reset()
rightLink.reset()
buttonGroup.reset()
}
@ -103,6 +100,8 @@ import VDS
}
public func viewModelDidUpdate() {
buttons.removeAll()
if let model = viewModel.leftLink {
leftLink.set(with: model, delegateObject, additionalData)
buttons.append(leftLink)

View File

@ -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