[WIP] MetalEngine

This commit is contained in:
Ali
2023-11-11 00:43:25 +04:00
parent 5976d495b0
commit 88a0fd7a81
10 changed files with 162 additions and 43 deletions

View File

@@ -31,6 +31,7 @@ import ChatMessageItemImpl
import ChatMessageItemView
import ChatMessageTransitionNode
import ChatControllerInteraction
import DustEffect
struct ChatTopVisibleMessageRange: Equatable {
var lowerBound: MessageIndex
@@ -699,6 +700,8 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
private var toLang: String?
private var dustEffectLayer: DustEffectLayer?
public init(context: AccountContext, updatedPresentationData: (initial: PresentationData, signal: Signal<PresentationData, NoError>), chatLocation: ChatLocation, chatLocationContextHolder: Atomic<ChatLocationContextHolder?>, tagMask: MessageTags?, source: ChatHistoryListSource = .default, subject: ChatControllerSubject?, controllerInteraction: ChatControllerInteraction, selectedMessages: Signal<Set<MessageId>?, NoError>, mode: ChatHistoryListMode = .bubbles, messageTransitionNode: @escaping () -> ChatMessageTransitionNodeImpl? = { nil }) {
var tagMask = tagMask
if case .pinnedMessages = subject {
@@ -3195,6 +3198,50 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
}
}
if let currentDeleteAnimationCorrelationIds = strongSelf.currentDeleteAnimationCorrelationIds {
var foundItemNodes: [ChatMessageItemView] = []
strongSelf.forEachRemovedItemNode { itemNode in
if let itemNode = itemNode as? ChatMessageItemView, let item = itemNode.item {
for (message, _) in item.content {
if currentDeleteAnimationCorrelationIds.contains(message.id) {
foundItemNodes.append(itemNode)
}
}
}
}
if !foundItemNodes.isEmpty {
strongSelf.currentDeleteAnimationCorrelationIds = nil
if strongSelf.context.sharedContext.immediateExperimentalUISettings.dustEffect {
if strongSelf.dustEffectLayer == nil {
let dustEffectLayer = DustEffectLayer()
dustEffectLayer.position = strongSelf.bounds.center
dustEffectLayer.bounds = CGRect(origin: CGPoint(), size: strongSelf.bounds.size)
strongSelf.dustEffectLayer = dustEffectLayer
dustEffectLayer.zPosition = 10.0
dustEffectLayer.transform = CATransform3DMakeRotation(CGFloat(Double.pi), 0.0, 0.0, 1.0)
strongSelf.layer.addSublayer(dustEffectLayer)
dustEffectLayer.becameEmpty = { [weak strongSelf] in
guard let strongSelf else {
return
}
strongSelf.dustEffectLayer?.removeFromSuperlayer()
strongSelf.dustEffectLayer = nil
}
}
if let dustEffectLayer = strongSelf.dustEffectLayer {
for itemNode in foundItemNodes {
guard let (image, subFrame) = itemNode.makeContentSnapshot() else {
continue
}
let itemFrame = itemNode.layer.convert(subFrame, to: dustEffectLayer)
dustEffectLayer.addItem(frame: itemFrame, image: image)
itemNode.isHidden = true
}
}
}
}
}
if !newIncomingReactions.isEmpty {
let messageIds = Array(newIncomingReactions.keys)
@@ -3872,6 +3919,11 @@ public final class ChatHistoryListNode: ListView, ChatHistoryNode {
func setCurrentSendAnimationCorrelationIds(_ value: Set<Int64>?) {
self.currentSendAnimationCorrelationIds = value
}
private var currentDeleteAnimationCorrelationIds: Set<MessageId>?
func setCurrentDeleteAnimationCorrelationIds(_ value: Set<MessageId>?) {
self.currentDeleteAnimationCorrelationIds = value
}
var animationCorrelationMessagesFound: (([Int64: ChatMessageItemView]) -> Void)?