From 1b1846dc6332040468d5aad1e50f5ee131fba8e0 Mon Sep 17 00:00:00 2001 From: Isaac <> Date: Tue, 11 Jun 2024 17:54:13 +0400 Subject: [PATCH] Draw effects on top of the keyboard --- .../ChatMessageAnimatedStickerItemNode.swift | 2 +- .../Sources/ChatMessageItemView.swift | 2 +- .../Sources/ChatMessageTransitionNode.swift | 2 +- .../Sources/ChatMessageTransitionNode.swift | 23 +++++++++++++++---- 4 files changed, 22 insertions(+), 7 deletions(-) diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageAnimatedStickerItemNode/Sources/ChatMessageAnimatedStickerItemNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageAnimatedStickerItemNode/Sources/ChatMessageAnimatedStickerItemNode.swift index 4288683308..19f3a9c4fa 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageAnimatedStickerItemNode/Sources/ChatMessageAnimatedStickerItemNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageAnimatedStickerItemNode/Sources/ChatMessageAnimatedStickerItemNode.swift @@ -2034,7 +2034,7 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView { additionalAnimationNode.transform = CATransform3DMakeScale(-1.0, 1.0, 1.0) } - let decorationNode = transitionNode.add(decorationView: additionalAnimationNode.view, itemNode: self) + let decorationNode = transitionNode.add(decorationView: additionalAnimationNode.view, itemNode: self, aboveEverything: true) additionalAnimationNode.completed = { [weak self, weak decorationNode, weak transitionNode] _ in guard let decorationNode = decorationNode else { return diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift b/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift index 4dfd11293e..dd9121a8cd 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageItemView/Sources/ChatMessageItemView.swift @@ -1007,7 +1007,7 @@ open class ChatMessageItemView: ListViewItemNode, ChatMessageItemNodeProtocol { additionalAnimationNode.transform = CATransform3DMakeScale(-1.0, 1.0, 1.0) } - let decorationNode = transitionNode.add(decorationView: additionalAnimationNode.view, itemNode: self) + let decorationNode = transitionNode.add(decorationView: additionalAnimationNode.view, itemNode: self, aboveEverything: true) additionalAnimationNode.completed = { [weak self, weak decorationNode, weak transitionNode] _ in guard let decorationNode = decorationNode else { return diff --git a/submodules/TelegramUI/Components/Chat/ChatMessageTransitionNode/Sources/ChatMessageTransitionNode.swift b/submodules/TelegramUI/Components/Chat/ChatMessageTransitionNode/Sources/ChatMessageTransitionNode.swift index 762d64392b..b8a5565050 100644 --- a/submodules/TelegramUI/Components/Chat/ChatMessageTransitionNode/Sources/ChatMessageTransitionNode.swift +++ b/submodules/TelegramUI/Components/Chat/ChatMessageTransitionNode/Sources/ChatMessageTransitionNode.swift @@ -10,6 +10,6 @@ public protocol ChatMessageTransitionNodeDecorationItemNode: ASDisplayNode { public protocol ChatMessageTransitionNode: AnyObject { typealias DecorationItemNode = ChatMessageTransitionNodeDecorationItemNode - func add(decorationView: UIView, itemNode: ChatMessageItemNodeProtocol) -> DecorationItemNode + func add(decorationView: UIView, itemNode: ChatMessageItemNodeProtocol, aboveEverything: Bool) -> DecorationItemNode func remove(decorationNode: DecorationItemNode) } diff --git a/submodules/TelegramUI/Sources/ChatMessageTransitionNode.swift b/submodules/TelegramUI/Sources/ChatMessageTransitionNode.swift index d663073285..20419a65a7 100644 --- a/submodules/TelegramUI/Sources/ChatMessageTransitionNode.swift +++ b/submodules/TelegramUI/Sources/ChatMessageTransitionNode.swift @@ -243,6 +243,8 @@ public final class ChatMessageTransitionNodeImpl: ASDisplayNode, ChatMessageTran final class DecorationItemNodeImpl: ASDisplayNode, ChatMessageTransitionNode.DecorationItemNode { let itemNode: ChatMessageItemNodeProtocol let contentView: UIView + var globalPortalSourceView: PortalSourceView? + let aboveEverything: Bool private let getContentAreaInScreenSpace: () -> CGRect private let scrollingContainer: ASDisplayNode @@ -251,9 +253,10 @@ public final class ChatMessageTransitionNodeImpl: ASDisplayNode, ChatMessageTran fileprivate weak var overlayController: OverlayTransitionContainerController? - init(itemNode: ChatMessageItemNodeProtocol, contentView: UIView, getContentAreaInScreenSpace: @escaping () -> CGRect) { + init(itemNode: ChatMessageItemNodeProtocol, contentView: UIView, aboveEverything: Bool, getContentAreaInScreenSpace: @escaping () -> CGRect) { self.itemNode = itemNode self.contentView = contentView + self.aboveEverything = aboveEverything self.getContentAreaInScreenSpace = getContentAreaInScreenSpace self.clippingNode = ASDisplayNode() @@ -267,7 +270,16 @@ public final class ChatMessageTransitionNodeImpl: ASDisplayNode, ChatMessageTran self.addSubnode(self.clippingNode) self.clippingNode.addSubnode(self.scrollingContainer) self.scrollingContainer.addSubnode(self.containerNode) - self.containerNode.view.addSubview(self.contentView) + + if aboveEverything { + let globalPortalSourceView = PortalSourceView() + globalPortalSourceView.needsGlobalPortal = true + self.globalPortalSourceView = globalPortalSourceView + globalPortalSourceView.addSubview(self.contentView) + self.containerNode.view.addSubview(globalPortalSourceView) + } else { + self.containerNode.view.addSubview(self.contentView) + } } func updateLayout(size: CGSize) { @@ -275,6 +287,9 @@ public final class ChatMessageTransitionNodeImpl: ASDisplayNode, ChatMessageTran let absoluteRect = self.itemNode.view.convert(self.itemNode.view.bounds, to: self.itemNode.supernode?.supernode?.view) self.containerNode.frame = absoluteRect + if let globalPortalSourceView = self.globalPortalSourceView { + globalPortalSourceView.frame = CGRect(origin: CGPoint(), size: size) + } } func addExternalOffset(offset: CGFloat, transition: ContainedViewLayoutTransition) { @@ -962,8 +977,8 @@ public final class ChatMessageTransitionNodeImpl: ASDisplayNode, ChatMessageTran self.listNode.setCurrentSendAnimationCorrelationIds(correlationIds) } - public func add(decorationView: UIView, itemNode: ChatMessageItemNodeProtocol) -> DecorationItemNode { - let decorationItemNode = DecorationItemNodeImpl(itemNode: itemNode, contentView: decorationView, getContentAreaInScreenSpace: self.getContentAreaInScreenSpace) + public func add(decorationView: UIView, itemNode: ChatMessageItemNodeProtocol, aboveEverything: Bool) -> DecorationItemNode { + let decorationItemNode = DecorationItemNodeImpl(itemNode: itemNode, contentView: decorationView, aboveEverything: aboveEverything, getContentAreaInScreenSpace: self.getContentAreaInScreenSpace) decorationItemNode.updateLayout(size: self.bounds.size) self.decorationItemNodes.append(decorationItemNode)