Merge branch 'master' of gitlab.com:peter-iakovlev/telegram-ios

This commit is contained in:
Ilya Laktyushin
2020-02-18 22:15:58 +04:00
65 changed files with 6223 additions and 4424 deletions

View File

@@ -246,16 +246,27 @@ public final class GalleryPagerNode: ASDisplayNode, UIScrollViewDelegate, UIGest
}
public func replaceItems(_ items: [GalleryItem], centralItemIndex: Int?, keepFirst: Bool = false) {
var items = items
if keepFirst && !self.items.isEmpty && !items.isEmpty {
items[0] = self.items[0]
}
var updateItems: [GalleryPagerUpdateItem] = []
let deleteItems: [Int] = []
var deleteItems: [Int] = []
var insertItems: [GalleryPagerInsertItem] = []
for i in 0 ..< items.count {
if i == 0 && keepFirst {
updateItems.append(GalleryPagerUpdateItem(index: 0, previousIndex: 0, item: items[i]))
} else {
insertItems.append(GalleryPagerInsertItem(index: i, item: items[i], previousIndex: nil))
var previousIndexById: [AnyHashable: Int] = [:]
var validIds = Set(items.map { $0.id })
for i in 0 ..< self.items.count {
previousIndexById[self.items[i].id] = i
if !validIds.contains(self.items[i].id) {
deleteItems.append(i)
}
}
for i in 0 ..< items.count {
insertItems.append(GalleryPagerInsertItem(index: i, item: items[i], previousIndex: previousIndexById[items[i].id]))
}
self.transaction(GalleryPagerTransaction(deleteItems: deleteItems, insertItems: insertItems, updateItems: updateItems, focusOnItem: centralItemIndex))
}
@@ -263,6 +274,7 @@ public final class GalleryPagerNode: ASDisplayNode, UIScrollViewDelegate, UIGest
for updatedItem in transaction.updateItems {
self.items[updatedItem.previousIndex] = updatedItem.item
if let itemNode = self.visibleItemNode(at: updatedItem.previousIndex) {
//print("update visible node at \(updatedItem.previousIndex)")
updatedItem.item.updateNode(node: itemNode)
}
}
@@ -274,55 +286,52 @@ public final class GalleryPagerNode: ASDisplayNode, UIScrollViewDelegate, UIGest
self.items.remove(at: deleteItemIndex)
for i in 0 ..< self.itemNodes.count {
if self.itemNodes[i].index == deleteItemIndex {
//print("delete visible node at \(deleteItemIndex)")
self.removeVisibleItemNode(internalIndex: i)
break
}
}
}
for itemNode in self.itemNodes {
var indexOffset = 0
for deleteIndex in deleteItems {
if deleteIndex < itemNode.index {
indexOffset += 1
} else {
break
}
}
itemNode.index = itemNode.index - indexOffset
}
let insertItems = transaction.insertItems.sorted(by: { $0.index < $1.index })
if self.items.count == 0 && !insertItems.isEmpty {
if insertItems[0].index != 0 {
fatalError("transaction: invalid insert into empty list")
}
if transaction.updateItems.isEmpty && !insertItems.isEmpty {
self.items.removeAll()
}
for insertedItem in insertItems {
self.items.insert(insertedItem.item, at: insertedItem.index)
self.items.append(insertedItem.item)
//self.items.insert(insertedItem.item, at: insertedItem.index)
}
let sortedInsertItems = transaction.insertItems.sorted(by: { $0.index < $1.index })
let visibleIndices: [Int] = self.itemNodes.map { $0.index }
var remapIndices: [Int: Int] = [:]
for i in 0 ..< insertItems.count {
if let previousIndex = insertItems[i].previousIndex, visibleIndices.contains(previousIndex) {
remapIndices[previousIndex] = i
}
}
for itemNode in self.itemNodes {
var indexOffset = 0
for insertedItem in sortedInsertItems {
if insertedItem.index <= itemNode.index + indexOffset {
indexOffset += 1
}
if let remappedIndex = remapIndices[itemNode.index] {
//print("remap visible node \(itemNode.index) -> \(remappedIndex)")
itemNode.index = remappedIndex
}
itemNode.index = itemNode.index + indexOffset
}
self.itemNodes.sort(by: { $0.index < $1.index })
//print("visible indices before update \(self.itemNodes.map { $0.index })")
self.invalidatedItems = true
if let focusOnItem = transaction.focusOnItem {
self.centralItemIndex = focusOnItem
}
self.updateItemNodes(transition: .immediate)
//print("visible indices after update \(self.itemNodes.map { $0.index })")
}
else if let focusOnItem = transaction.focusOnItem {
self.ignoreCentralItemIndexUpdate = true