Fix gradient background animation

This commit is contained in:
Ali
2021-06-11 01:28:48 +04:00
parent dd768dfdeb
commit d0d06bc650
14 changed files with 240 additions and 35 deletions

View File

@@ -7,14 +7,60 @@ import Display
import MergeLists
import AccountContext
func preparedChatHistoryViewTransition(from fromView: ChatHistoryView?, to toView: ChatHistoryView, reason: ChatHistoryViewTransitionReason, reverse: Bool, chatLocation: ChatLocation, controllerInteraction: ChatControllerInteraction, scrollPosition: ChatHistoryViewScrollPosition?, initialData: InitialMessageHistoryData?, keyboardButtonsMessage: Message?, cachedData: CachedPeerData?, cachedDataMessages: [MessageId: Message]?, readStateData: [PeerId: ChatHistoryCombinedInitialReadStateData]?, flashIndicators: Bool, updatedMessageSelection: Bool) -> ChatHistoryViewTransition {
let mergeResult: (deleteIndices: [Int], indicesAndItems: [(Int, ChatHistoryEntry, Int?)], updateIndices: [(Int, ChatHistoryEntry, Int)])
func preparedChatHistoryViewTransition(from fromView: ChatHistoryView?, to toView: ChatHistoryView, reason: ChatHistoryViewTransitionReason, reverse: Bool, chatLocation: ChatLocation, controllerInteraction: ChatControllerInteraction, scrollPosition: ChatHistoryViewScrollPosition?, initialData: InitialMessageHistoryData?, keyboardButtonsMessage: Message?, cachedData: CachedPeerData?, cachedDataMessages: [MessageId: Message]?, readStateData: [PeerId: ChatHistoryCombinedInitialReadStateData]?, flashIndicators: Bool, updatedMessageSelection: Bool, messageTransitionNode: ChatMessageTransitionNode?) -> ChatHistoryViewTransition {
var mergeResult: (deleteIndices: [Int], indicesAndItems: [(Int, ChatHistoryEntry, Int?)], updateIndices: [(Int, ChatHistoryEntry, Int)])
let allUpdated = fromView?.associatedData != toView.associatedData
if reverse {
mergeResult = mergeListsStableWithUpdatesReversed(leftList: fromView?.filteredEntries ?? [], rightList: toView.filteredEntries, allUpdated: allUpdated)
} else {
mergeResult = mergeListsStableWithUpdates(leftList: fromView?.filteredEntries ?? [], rightList: toView.filteredEntries, allUpdated: allUpdated)
}
if let messageTransitionNode = messageTransitionNode, messageTransitionNode.hasOngoingTransitions, let previousEntries = fromView?.filteredEntries {
for i in 0 ..< mergeResult.updateIndices.count {
switch mergeResult.updateIndices[i].1 {
case let .MessageEntry(message, presentationData, flag, monthLocation, messageSelection, entryAttributes):
if messageTransitionNode.isAnimatingMessage(stableId: message.stableId) {
var updatedMessage = message
mediaLoop: for media in message.media {
if let webpage = media as? TelegramMediaWebpage, case .Loaded = webpage.content {
var filterMedia = false
switch previousEntries[mergeResult.updateIndices[i].2] {
case let .MessageEntry(previousMessage, _, _, _, _, _):
if previousMessage.media.contains(where: { value in
if let value = value as? TelegramMediaWebpage, case .Loaded = value.content {
return true
} else {
return false
}
}) {
if messageTransitionNode.hasScheduledUpdateMessageAfterAnimationCompleted(stableId: message.stableId) {
filterMedia = true
}
} else {
filterMedia = true
}
default:
break
}
if filterMedia {
updatedMessage = message.withUpdatedMedia(message.media.filter {
$0 !== media
})
messageTransitionNode.scheduleUpdateMessageAfterAnimationCompleted(stableId: message.stableId)
}
break mediaLoop
}
}
mergeResult.updateIndices[i].1 = .MessageEntry(updatedMessage, presentationData, flag, monthLocation, messageSelection, entryAttributes)
}
default:
break
}
}
}
var adjustedDeleteIndices: [ListViewDeleteItem] = []
let previousCount: Int