Digital PCT265 defect MVAPCT-272: Adjust molecule adds and swapping.
This commit is contained in:
parent
2c71269518
commit
3a4322702c
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
public struct MoleculeInfo: Hashable {
|
public struct MoleculeInfo: Hashable, CustomDebugStringConvertible {
|
||||||
|
|
||||||
public func hash(into hasher: inout Hasher) {
|
public func hash(into hasher: inout Hasher) {
|
||||||
hasher.combine(id)
|
hasher.combine(id)
|
||||||
@ -44,6 +44,10 @@ public struct MoleculeInfo: Hashable {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public var debugDescription: String {
|
||||||
|
return "\(Self.self) \(id)"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Array where Element == MoleculeInfo {
|
extension Array where Element == MoleculeInfo {
|
||||||
@ -52,14 +56,15 @@ extension Array where Element == MoleculeInfo {
|
|||||||
filter { listItemRef in molecules.contains { $0.id == listItemRef.model.id } }
|
filter { listItemRef in molecules.contains { $0.id == listItemRef.model.id } }
|
||||||
}
|
}
|
||||||
|
|
||||||
func registerTypes(with tableView: UITableView) {
|
func registerTypes(with tableView: UITableView) -> [MoleculeInfo] {
|
||||||
forEach { tableView.register($0.cellType, forCellReuseIdentifier: $0.cellReuseId) }
|
forEach { tableView.register($0.cellType, forCellReuseIdentifier: $0.cellReuseId) }
|
||||||
|
return self
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension Array where Element == ListItemModelProtocol & MoleculeModelProtocol {
|
extension Array where Element == ListItemModelProtocol & MoleculeModelProtocol {
|
||||||
func asMoleculeInfoRef() -> [MoleculeInfo] {
|
func asMoleculeInfoRef(delegateObject: MVMCoreUIDelegateObject?) -> [MoleculeInfo] {
|
||||||
compactMap { MoleculeInfo(listItemModel: $0) }
|
compactMap { MoleculeInfo(listItemModel: $0, delegateObject: delegateObject) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -208,16 +213,8 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol
|
|||||||
// MARK: - Table View
|
// MARK: - Table View
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
open override func registerWithTable() {
|
|
||||||
super.registerWithTable()
|
|
||||||
|
|
||||||
for moleculeInfo in dataSource.snapshot().itemIdentifiers {
|
|
||||||
tableView?.register(moleculeInfo.cellType, forCellReuseIdentifier: moleculeInfo.cellReuseId)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
open func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
open func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
|
||||||
return (dataSource.itemIdentifier(for: indexPath)?.model as? GoneableProtocol)?.gone == true ? 0 : UITableView.automaticDimension
|
return dataSource.itemIdentifier(for: indexPath)?.model.gone == true ? 0 : UITableView.automaticDimension
|
||||||
}
|
}
|
||||||
|
|
||||||
open func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
|
open func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
|
||||||
@ -227,28 +224,6 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol
|
|||||||
|
|
||||||
return estimatedHeight
|
return estimatedHeight
|
||||||
}
|
}
|
||||||
|
|
||||||
// open override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
|
|
||||||
// debugLog("Number of rows: \(moleculesInfo?.count ?? 0)")
|
|
||||||
// return moleculesInfo?.count ?? 0
|
|
||||||
// }
|
|
||||||
|
|
||||||
// open override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
|
|
||||||
//
|
|
||||||
// guard let moleculeInfo = getMoleculeInfo(for: indexPath),
|
|
||||||
// let cell = tableView.dequeueReusableCell(withIdentifier: moleculeInfo.identifier)
|
|
||||||
// else { return UITableViewCell() }
|
|
||||||
// cell.isHidden = (getMoleculeInfo(for: indexPath)?.molecule as? GoneableProtocol)?.gone == true
|
|
||||||
// (cell as? MoleculeViewProtocol)?.reset()
|
|
||||||
// (cell as? MoleculeListCellProtocol)?.setLines(with: templateModel?.line, delegateObject: delegateObjectIVar, additionalData: nil, indexPath: indexPath)
|
|
||||||
// if let moleculeView = cell as? MoleculeViewProtocol {
|
|
||||||
// updateMoleculeView(moleculeView, from: moleculeInfo.molecule)
|
|
||||||
// }
|
|
||||||
// (cell as? MVMCoreViewProtocol)?.updateView(tableView.bounds.width)
|
|
||||||
// // Neded to fix an apple defect where the cell is not the correct size on certain devices for certain cells
|
|
||||||
// cell.setNeedsLayout()
|
|
||||||
// return cell
|
|
||||||
// }
|
|
||||||
|
|
||||||
open func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
|
open func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
|
||||||
(cell as? MoleculeListCellProtocol)?.willDisplay()
|
(cell as? MoleculeListCellProtocol)?.willDisplay()
|
||||||
@ -327,10 +302,11 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol
|
|||||||
|
|
||||||
var snapshot = dataSource.snapshot()
|
var snapshot = dataSource.snapshot()
|
||||||
let updatedListItems: [MoleculeInfo] = snapshot.itemIdentifiers.compactMap { listItemRef -> MoleculeInfo? in
|
let updatedListItems: [MoleculeInfo] = snapshot.itemIdentifiers.compactMap { listItemRef -> MoleculeInfo? in
|
||||||
var listItemRef = listItemRef
|
|
||||||
guard let matchedMolecule = listItemRef.contains(oneOf: molecules) else { return nil }
|
guard let matchedMolecule = listItemRef.contains(oneOf: molecules) else { return nil }
|
||||||
if let matchedMolecule = matchedMolecule as? (ListItemModelProtocol & MoleculeModelProtocol), listItemRef.doesMatch(matchedMolecule) {
|
if let matchedMolecule = matchedMolecule as? (ListItemModelProtocol & MoleculeModelProtocol), listItemRef.doesMatch(matchedMolecule) {
|
||||||
|
var listItemRef = listItemRef
|
||||||
listItemRef.model = matchedMolecule // Replace the top level molecule if it changed.
|
listItemRef.model = matchedMolecule // Replace the top level molecule if it changed.
|
||||||
|
return listItemRef
|
||||||
}
|
}
|
||||||
return listItemRef
|
return listItemRef
|
||||||
}
|
}
|
||||||
@ -367,38 +343,13 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol
|
|||||||
// MARK: - Convenience
|
// MARK: - Convenience
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
|
|
||||||
/// Returns the (identifier, class) of the molecule for the indexPath.
|
|
||||||
// func getMoleculeInfo(for indexPath: IndexPath) -> MoleculeInfo? {
|
|
||||||
// moleculesInfo?[safe: indexPath.row]
|
|
||||||
// }
|
|
||||||
|
|
||||||
/// Sets up the molecule list and ensures no errors loading all content.
|
|
||||||
// func getMoleculeInfoList() -> [MoleculeInfo]? {
|
|
||||||
//
|
|
||||||
// var moleculeList: [MoleculeInfo] = []
|
|
||||||
//
|
|
||||||
// if let molecules = templateModel?.molecules {
|
|
||||||
// for molecule in molecules {
|
|
||||||
// if let info = MoleculeInfo(with: molecule) {
|
|
||||||
// moleculeList.append(info)
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return moleculeList.count > 0 ? moleculeList : nil
|
|
||||||
// }
|
|
||||||
|
|
||||||
/// Sets up the header, footer, molecule list and ensures no errors loading all content.
|
/// Sets up the header, footer, molecule list and ensures no errors loading all content.
|
||||||
func setup() {
|
func setup() {
|
||||||
guard let listItems = templateModel?.molecules?.compactMap({ MoleculeInfo(listItemModel: $0, delegateObject: delegateObject() as? MVMCoreUIDelegateObject)}) else {
|
guard let listItems = templateModel?.molecules?.asMoleculeInfoRef(delegateObject: delegateObjectIVar).registerTypes(with: tableView) else { return }
|
||||||
debugLog("There is no data to display.")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
var initialDataSnapshot = ListDataSnapshot()
|
var initialDataSnapshot = ListDataSnapshot()
|
||||||
initialDataSnapshot.appendSections([0])
|
initialDataSnapshot.appendSections([0])
|
||||||
initialDataSnapshot.appendItems(listItems)
|
initialDataSnapshot.appendItems(listItems)
|
||||||
dataSource.apply(initialDataSnapshot)
|
dataSource.apply(initialDataSnapshot, animatingDifferences: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Adds modules from requiredModules() to the MVMCoreViewControllerMapping.requiredModules map.
|
/// Adds modules from requiredModules() to the MVMCoreViewControllerMapping.requiredModules map.
|
||||||
@ -448,7 +399,7 @@ extension MoleculeListTemplate: MoleculeListProtocol {
|
|||||||
/// Convenience function that removes the passed molecule
|
/// Convenience function that removes the passed molecule
|
||||||
public func removeMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], animation: UITableView.RowAnimation?) {
|
public func removeMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], animation: UITableView.RowAnimation?) {
|
||||||
var snapshot = dataSource.snapshot()
|
var snapshot = dataSource.snapshot()
|
||||||
snapshot.deleteItems(molecules.asMoleculeInfoRef())
|
snapshot.deleteItems(molecules.asMoleculeInfoRef(delegateObject: delegateObjectIVar))
|
||||||
dataSource.apply(snapshot, animatingDifferences: true) {
|
dataSource.apply(snapshot, animatingDifferences: true) {
|
||||||
self.updateViewConstraints()
|
self.updateViewConstraints()
|
||||||
self.view.setNeedsLayout()
|
self.view.setNeedsLayout()
|
||||||
@ -456,20 +407,30 @@ extension MoleculeListTemplate: MoleculeListProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func addMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], indexPath: IndexPath, animation: UITableView.RowAnimation?) {
|
public func addMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], indexPath: IndexPath, animation: UITableView.RowAnimation?) {
|
||||||
|
let additionalMoleculesRef = molecules.asMoleculeInfoRef(delegateObject: delegateObjectIVar).registerTypes(with: tableView)
|
||||||
var snapshot = dataSource.snapshot()
|
var snapshot = dataSource.snapshot()
|
||||||
guard let listItemRef = snapshot.itemIdentifiers[safe: indexPath.row] else { return }
|
debugLog("[ADD] State before: \(snapshot.itemIdentifiers)")
|
||||||
snapshot.insertItems(molecules.asMoleculeInfoRef(), afterItem: listItemRef)
|
if let targetMoleculeRef = snapshot.itemIdentifiers[safe: indexPath.row] {
|
||||||
dataSource.apply(snapshot, animatingDifferences: true) {
|
snapshot.insertItems(additionalMoleculesRef, beforeItem: targetMoleculeRef)
|
||||||
|
debugLog("[ADD] Applying: \(snapshot.itemIdentifiers)")
|
||||||
|
} else {
|
||||||
|
snapshot.appendItems(additionalMoleculesRef)
|
||||||
|
debugLog("[ADD] Applying: \(snapshot.itemIdentifiers)")
|
||||||
|
}
|
||||||
|
dataSource.apply(snapshot, animatingDifferences: false) {
|
||||||
self.updateViewConstraints()
|
self.updateViewConstraints()
|
||||||
self.view.setNeedsLayout()
|
self.view.setNeedsLayout()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public func addMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], after molecule: (ListItemModelProtocol & MoleculeModelProtocol), animation: UITableView.RowAnimation?) {
|
public func addMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], after molecule: (ListItemModelProtocol & MoleculeModelProtocol), animation: UITableView.RowAnimation?) {
|
||||||
guard let listMoleculeRef = MoleculeInfo(listItemModel: molecule) else { return }
|
guard let targetMoleculeRef = MoleculeInfo(listItemModel: molecule) else { return }
|
||||||
|
let additionalMoleculesRef = molecules.asMoleculeInfoRef(delegateObject: delegateObjectIVar).registerTypes(with: tableView)
|
||||||
var snapshot = dataSource.snapshot()
|
var snapshot = dataSource.snapshot()
|
||||||
snapshot.insertItems(molecules.asMoleculeInfoRef(), afterItem: listMoleculeRef)
|
debugLog("[ADD] State before: \(snapshot.itemIdentifiers)")
|
||||||
dataSource.apply(snapshot, animatingDifferences: true) {
|
snapshot.insertItems(additionalMoleculesRef, afterItem: targetMoleculeRef)
|
||||||
|
debugLog("[ADD] Applying: \(snapshot.itemIdentifiers)")
|
||||||
|
dataSource.apply(snapshot, animatingDifferences: false) {
|
||||||
self.updateViewConstraints()
|
self.updateViewConstraints()
|
||||||
self.view.setNeedsLayout()
|
self.view.setNeedsLayout()
|
||||||
}
|
}
|
||||||
@ -478,27 +439,29 @@ extension MoleculeListTemplate: MoleculeListProtocol {
|
|||||||
public func swapMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], with replacements: [ListItemModelProtocol & MoleculeModelProtocol], at indexPath: IndexPath, animation: UITableView.RowAnimation?) {
|
public func swapMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], with replacements: [ListItemModelProtocol & MoleculeModelProtocol], at indexPath: IndexPath, animation: UITableView.RowAnimation?) {
|
||||||
swapMolecules(molecules, with: replacements, after: dataSource.snapshot().itemIdentifiers[safe: indexPath.row] as? (ListItemModelProtocol & MoleculeModelProtocol), animation: animation)
|
swapMolecules(molecules, with: replacements, after: dataSource.snapshot().itemIdentifiers[safe: indexPath.row] as? (ListItemModelProtocol & MoleculeModelProtocol), animation: animation)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func swapMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], with replacements: [ListItemModelProtocol & MoleculeModelProtocol], after targetMolecule: (ListItemModelProtocol & MoleculeModelProtocol)?, animation: UITableView.RowAnimation?) {
|
public func swapMolecules(_ molecules: [ListItemModelProtocol & MoleculeModelProtocol], with replacements: [ListItemModelProtocol & MoleculeModelProtocol], after targetMolecule: (ListItemModelProtocol & MoleculeModelProtocol)?, animation: UITableView.RowAnimation?) {
|
||||||
|
|
||||||
guard let tableView else { return }
|
guard let tableView else { return }
|
||||||
|
|
||||||
let removingRefs = molecules.asMoleculeInfoRef()
|
|
||||||
|
|
||||||
var snapshot = dataSource.snapshot()
|
var snapshot = dataSource.snapshot()
|
||||||
|
|
||||||
let replacementRefs = molecules.asMoleculeInfoRef()
|
debugLog("[SWAP] State before: \(snapshot.itemIdentifiers)")
|
||||||
replacementRefs.registerTypes(with: tableView)
|
|
||||||
|
|
||||||
if let targetMolecule, let targetRef = MoleculeInfo(listItemModel: targetMolecule) {
|
|
||||||
snapshot.insertItems(replacementRefs, afterItem: targetRef)
|
|
||||||
} else if let targetRef = removingRefs.first {
|
|
||||||
snapshot.insertItems(replacementRefs, beforeItem: targetRef)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
let removingRefs = molecules.asMoleculeInfoRef(delegateObject: delegateObjectIVar)
|
||||||
snapshot.deleteItems(removingRefs)
|
snapshot.deleteItems(removingRefs)
|
||||||
|
|
||||||
dataSource.apply(snapshot) {
|
debugLog("[SWAP] State after delete: \(snapshot.itemIdentifiers)")
|
||||||
|
|
||||||
|
if let targetMolecule, let targetRef = MoleculeInfo(listItemModel: targetMolecule) {
|
||||||
|
let replacementRefs = molecules.asMoleculeInfoRef(delegateObject: delegateObjectIVar).registerTypes(with: tableView)
|
||||||
|
snapshot.insertItems(replacementRefs, afterItem: targetRef)
|
||||||
|
}
|
||||||
|
|
||||||
|
debugLog("[SWAP] Applying: \(snapshot.itemIdentifiers)")
|
||||||
|
dataSource.defaultRowAnimation = animation ?? .automatic
|
||||||
|
dataSource.apply(snapshot ) {
|
||||||
|
self.dataSource.defaultRowAnimation = .automatic
|
||||||
self.updateViewConstraints()
|
self.updateViewConstraints()
|
||||||
self.view.setNeedsLayout()
|
self.view.setNeedsLayout()
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user