mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Improve simultaneous forward and reply info display
This commit is contained in:
parent
923d66cd13
commit
3f8df7776f
@ -181,7 +181,7 @@ class ForwardPrivacyChatPreviewItemNode: ListViewItemNode {
|
|||||||
|
|
||||||
var authorNameCenter: CGFloat?
|
var authorNameCenter: CGFloat?
|
||||||
|
|
||||||
let forwardedString = item.strings.Message_ForwardedMessage("").string
|
let forwardedString = item.strings.Message_ForwardedMessageShort("").string
|
||||||
var fromString: String?
|
var fromString: String?
|
||||||
if let newlineRange = forwardedString.range(of: "\n") {
|
if let newlineRange = forwardedString.range(of: "\n") {
|
||||||
let from = forwardedString[newlineRange.upperBound...]
|
let from = forwardedString[newlineRange.upperBound...]
|
||||||
|
@ -191,14 +191,12 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
var telegramDice: TelegramMediaDice?
|
var telegramDice: TelegramMediaDice?
|
||||||
private let disposable = MetaDisposable()
|
private let disposable = MetaDisposable()
|
||||||
private let disposables = DisposableSet()
|
private let disposables = DisposableSet()
|
||||||
|
|
||||||
private var forwardInfoNode: ChatMessageForwardInfoNode?
|
|
||||||
private var forwardBackgroundNode: NavigationBackgroundNode?
|
|
||||||
|
|
||||||
private var viaBotNode: TextNode?
|
private var viaBotNode: TextNode?
|
||||||
private let dateAndStatusNode: ChatMessageDateAndStatusNode
|
private let dateAndStatusNode: ChatMessageDateAndStatusNode
|
||||||
private var replyInfoNode: ChatMessageReplyInfoNode?
|
private var replyInfoNode: ChatMessageReplyInfoNode?
|
||||||
private var replyBackgroundNode: NavigationBackgroundNode?
|
private var replyBackgroundNode: NavigationBackgroundNode?
|
||||||
|
private var forwardInfoNode: ChatMessageForwardInfoNode?
|
||||||
|
|
||||||
private var actionButtonsNode: ChatMessageActionButtonsNode?
|
private var actionButtonsNode: ChatMessageActionButtonsNode?
|
||||||
private var reactionButtonsNode: ChatMessageReactionButtonsNode?
|
private var reactionButtonsNode: ChatMessageReactionButtonsNode?
|
||||||
@ -991,11 +989,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if replyInfoApply != nil || viaBotApply != nil {
|
|
||||||
needsReplyBackground = true
|
|
||||||
}
|
|
||||||
|
|
||||||
var updatedShareButtonNode: ChatMessageShareButton?
|
var updatedShareButtonNode: ChatMessageShareButton?
|
||||||
if needsShareButton {
|
if needsShareButton {
|
||||||
if let currentShareButtonNode = currentShareButtonNode {
|
if let currentShareButtonNode = currentShareButtonNode {
|
||||||
@ -1013,7 +1007,6 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
var forwardPsaType: String?
|
var forwardPsaType: String?
|
||||||
|
|
||||||
var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)?
|
var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)?
|
||||||
var needsForwardBackground = false
|
|
||||||
|
|
||||||
if !ignoreForward, let forwardInfo = item.message.forwardInfo {
|
if !ignoreForward, let forwardInfo = item.message.forwardInfo {
|
||||||
forwardPsaType = forwardInfo.psaType
|
forwardPsaType = forwardInfo.psaType
|
||||||
@ -1038,8 +1031,10 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
}
|
}
|
||||||
let availableWidth = max(60.0, availableContentWidth + 6.0)
|
let availableWidth = max(60.0, availableContentWidth + 6.0)
|
||||||
forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude))
|
forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude))
|
||||||
|
}
|
||||||
needsForwardBackground = true
|
|
||||||
|
if replyInfoApply != nil || viaBotApply != nil || forwardInfoSizeApply != nil {
|
||||||
|
needsReplyBackground = true
|
||||||
}
|
}
|
||||||
|
|
||||||
var maxContentWidth = imageSize.width
|
var maxContentWidth = imageSize.width
|
||||||
@ -1194,22 +1189,59 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
replyBackgroundNode.removeFromSupernode()
|
replyBackgroundNode.removeFromSupernode()
|
||||||
}
|
}
|
||||||
|
|
||||||
if let (viaBotLayout, viaBotApply) = viaBotApply {
|
var messageInfoSize = CGSize()
|
||||||
|
if let (viaBotLayout, _) = viaBotApply, forwardInfoSizeApply == nil {
|
||||||
|
messageInfoSize = CGSize(width: viaBotLayout.size.width + 1.0, height: 0.0)
|
||||||
|
}
|
||||||
|
if let (forwardInfoSize, _) = forwardInfoSizeApply {
|
||||||
|
messageInfoSize = CGSize(width: max(messageInfoSize.width, forwardInfoSize.width + 2.0), height: 0.0)
|
||||||
|
}
|
||||||
|
if let (replyInfoSize, _) = replyInfoApply {
|
||||||
|
messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: 0.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let (viaBotLayout, viaBotApply) = viaBotApply, forwardInfoSizeApply == nil {
|
||||||
let viaBotNode = viaBotApply()
|
let viaBotNode = viaBotApply()
|
||||||
if strongSelf.viaBotNode == nil {
|
if strongSelf.viaBotNode == nil {
|
||||||
strongSelf.viaBotNode = viaBotNode
|
strongSelf.viaBotNode = viaBotNode
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(viaBotNode)
|
strongSelf.contextSourceNode.contentNode.addSubnode(viaBotNode)
|
||||||
}
|
}
|
||||||
let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 15.0) : (params.width - params.rightInset - viaBotLayout.size.width - layoutConstants.bubble.edgeInset - 14.0)), y: 8.0), size: viaBotLayout.size)
|
let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0), size: viaBotLayout.size)
|
||||||
viaBotNode.frame = viaBotFrame
|
viaBotNode.frame = viaBotFrame
|
||||||
if let replyBackgroundNode = strongSelf.replyBackgroundNode {
|
|
||||||
replyBackgroundNode.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 6.0, y: viaBotFrame.minY - 2.0 - UIScreenPixel), size: CGSize(width: viaBotFrame.size.width + 11.0, height: viaBotFrame.size.height + 5.0))
|
messageInfoSize = CGSize(width: messageInfoSize.width, height: viaBotLayout.size.height)
|
||||||
replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate)
|
|
||||||
}
|
|
||||||
} else if let viaBotNode = strongSelf.viaBotNode {
|
} else if let viaBotNode = strongSelf.viaBotNode {
|
||||||
viaBotNode.removeFromSupernode()
|
viaBotNode.removeFromSupernode()
|
||||||
strongSelf.viaBotNode = nil
|
strongSelf.viaBotNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply {
|
||||||
|
let forwardInfoNode = forwardInfoApply(forwardInfoSize.width)
|
||||||
|
if strongSelf.forwardInfoNode == nil {
|
||||||
|
strongSelf.forwardInfoNode = forwardInfoNode
|
||||||
|
strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode)
|
||||||
|
|
||||||
|
if animation.isAnimated {
|
||||||
|
forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 8.0)), y: 8.0 + messageInfoSize.height), size: forwardInfoSize)
|
||||||
|
forwardInfoNode.frame = forwardInfoFrame
|
||||||
|
|
||||||
|
messageInfoSize = CGSize(width: messageInfoSize.width, height: messageInfoSize.height + forwardInfoSize.height - 1.0)
|
||||||
|
} else if let forwardInfoNode = strongSelf.forwardInfoNode {
|
||||||
|
if animation.isAnimated {
|
||||||
|
if let forwardInfoNode = strongSelf.forwardInfoNode {
|
||||||
|
strongSelf.forwardInfoNode = nil
|
||||||
|
forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in
|
||||||
|
forwardInfoNode?.removeFromSupernode()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
forwardInfoNode.removeFromSupernode()
|
||||||
|
strongSelf.forwardInfoNode = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let (replyInfoSize, replyInfoApply) = replyInfoApply {
|
if let (replyInfoSize, replyInfoApply) = replyInfoApply {
|
||||||
let replyInfoNode = replyInfoApply()
|
let replyInfoNode = replyInfoApply()
|
||||||
@ -1217,31 +1249,29 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
strongSelf.replyInfoNode = replyInfoNode
|
strongSelf.replyInfoNode = replyInfoNode
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode)
|
strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode)
|
||||||
}
|
}
|
||||||
var viaBotSize = CGSize()
|
let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0 + messageInfoSize.height), size: replyInfoSize)
|
||||||
if let viaBotNode = strongSelf.viaBotNode {
|
|
||||||
viaBotSize = viaBotNode.frame.size
|
|
||||||
}
|
|
||||||
let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - max(replyInfoSize.width, viaBotSize.width) - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0 + viaBotSize.height), size: replyInfoSize)
|
|
||||||
if let viaBotNode = strongSelf.viaBotNode {
|
|
||||||
if replyInfoFrame.minX < viaBotNode.frame.minX {
|
|
||||||
viaBotNode.frame = viaBotNode.frame.offsetBy(dx: replyInfoFrame.minX - viaBotNode.frame.minX, dy: 0.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
replyInfoNode.frame = replyInfoFrame
|
replyInfoNode.frame = replyInfoFrame
|
||||||
if let replyBackgroundNode = strongSelf.replyBackgroundNode {
|
|
||||||
replyBackgroundNode.frame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0))
|
|
||||||
replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate)
|
|
||||||
}
|
|
||||||
|
|
||||||
if let _ = item.controllerInteraction.selectionState, isEmoji {
|
messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: messageInfoSize.height + replyInfoSize.height)
|
||||||
replyInfoNode.alpha = 0.0
|
|
||||||
strongSelf.replyBackgroundNode?.alpha = 0.0
|
|
||||||
}
|
|
||||||
} else if let replyInfoNode = strongSelf.replyInfoNode {
|
} else if let replyInfoNode = strongSelf.replyInfoNode {
|
||||||
replyInfoNode.removeFromSupernode()
|
replyInfoNode.removeFromSupernode()
|
||||||
strongSelf.replyInfoNode = nil
|
strongSelf.replyInfoNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if let replyBackgroundNode = strongSelf.replyBackgroundNode {
|
||||||
|
replyBackgroundNode.frame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 10.0)) - 4.0, y: 6.0), size: CGSize(width: messageInfoSize.width + 8.0, height: messageInfoSize.height + 5.0))
|
||||||
|
|
||||||
|
let cornerRadius = replyBackgroundNode.frame.height <= 22.0 ? replyBackgroundNode.frame.height / 2.0 : 8.0
|
||||||
|
replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: cornerRadius, transition: .immediate)
|
||||||
|
}
|
||||||
|
|
||||||
|
let panelsAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0
|
||||||
|
strongSelf.replyInfoNode?.alpha = panelsAlpha
|
||||||
|
strongSelf.viaBotNode?.alpha = panelsAlpha
|
||||||
|
strongSelf.forwardInfoNode?.alpha = panelsAlpha
|
||||||
|
strongSelf.replyBackgroundNode?.alpha = panelsAlpha
|
||||||
|
|
||||||
if isFailed {
|
if isFailed {
|
||||||
let deliveryFailedNode: ChatMessageDeliveryFailedNode
|
let deliveryFailedNode: ChatMessageDeliveryFailedNode
|
||||||
var isAppearing = false
|
var isAppearing = false
|
||||||
@ -1272,61 +1302,7 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
deliveryFailedNode?.removeFromSupernode()
|
deliveryFailedNode?.removeFromSupernode()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if needsForwardBackground {
|
|
||||||
if let forwardBackgroundNode = strongSelf.forwardBackgroundNode {
|
|
||||||
forwardBackgroundNode.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate)
|
|
||||||
} else {
|
|
||||||
let forwardBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper))
|
|
||||||
strongSelf.forwardBackgroundNode = forwardBackgroundNode
|
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(forwardBackgroundNode)
|
|
||||||
|
|
||||||
if animation.isAnimated {
|
|
||||||
forwardBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if let forwardBackgroundNode = strongSelf.forwardBackgroundNode {
|
|
||||||
if animation.isAnimated {
|
|
||||||
strongSelf.forwardBackgroundNode = nil
|
|
||||||
forwardBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardBackgroundNode] _ in
|
|
||||||
forwardBackgroundNode?.removeFromSupernode()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
forwardBackgroundNode.removeFromSupernode()
|
|
||||||
strongSelf.forwardBackgroundNode = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply {
|
|
||||||
let forwardInfoNode = forwardInfoApply(forwardInfoSize.width)
|
|
||||||
if strongSelf.forwardInfoNode == nil {
|
|
||||||
strongSelf.forwardInfoNode = forwardInfoNode
|
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode)
|
|
||||||
|
|
||||||
if animation.isAnimated {
|
|
||||||
forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize)
|
|
||||||
forwardInfoNode.frame = forwardInfoFrame
|
|
||||||
if let forwardBackgroundNode = strongSelf.forwardBackgroundNode {
|
|
||||||
forwardBackgroundNode.frame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0))
|
|
||||||
forwardBackgroundNode.update(size: forwardBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate)
|
|
||||||
}
|
|
||||||
} else if let forwardInfoNode = strongSelf.forwardInfoNode {
|
|
||||||
if animation.isAnimated {
|
|
||||||
if let forwardInfoNode = strongSelf.forwardInfoNode {
|
|
||||||
strongSelf.forwardInfoNode = nil
|
|
||||||
forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in
|
|
||||||
forwardInfoNode?.removeFromSupernode()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
forwardInfoNode.removeFromSupernode()
|
|
||||||
strongSelf.forwardInfoNode = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let actionButtonsSizeAndApply = actionButtonsSizeAndApply {
|
if let actionButtonsSizeAndApply = actionButtonsSizeAndApply {
|
||||||
let actionButtonsNode = actionButtonsSizeAndApply.1(animation)
|
let actionButtonsNode = actionButtonsSizeAndApply.1(animation)
|
||||||
let previousFrame = actionButtonsNode.frame
|
let previousFrame = actionButtonsNode.frame
|
||||||
@ -2057,12 +2033,18 @@ class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.2, curve: .easeInOut) : .immediate
|
let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.2, curve: .easeInOut) : .immediate
|
||||||
let replyAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0
|
let panelsAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0
|
||||||
if let replyInfoNode = self.replyInfoNode {
|
if let replyInfoNode = self.replyInfoNode {
|
||||||
transition.updateAlpha(node: replyInfoNode, alpha: replyAlpha)
|
transition.updateAlpha(node: replyInfoNode, alpha: panelsAlpha)
|
||||||
|
}
|
||||||
|
if let viaBotNode = self.viaBotNode {
|
||||||
|
transition.updateAlpha(node: viaBotNode, alpha: panelsAlpha)
|
||||||
|
}
|
||||||
|
if let forwardInfoNode = self.forwardInfoNode {
|
||||||
|
transition.updateAlpha(node: forwardInfoNode, alpha: panelsAlpha)
|
||||||
}
|
}
|
||||||
if let replyBackgroundNode = self.replyBackgroundNode {
|
if let replyBackgroundNode = self.replyBackgroundNode {
|
||||||
transition.updateAlpha(node: replyBackgroundNode, alpha: replyAlpha)
|
transition.updateAlpha(node: replyBackgroundNode, alpha: panelsAlpha)
|
||||||
}
|
}
|
||||||
|
|
||||||
if let selectionState = item.controllerInteraction.selectionState {
|
if let selectionState = item.controllerInteraction.selectionState {
|
||||||
|
@ -148,7 +148,7 @@ class ChatMessageForwardInfoNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
titleColor = incoming ? presentationData.theme.theme.chat.message.incoming.accentTextColor : presentationData.theme.theme.chat.message.outgoing.accentTextColor
|
titleColor = incoming ? presentationData.theme.theme.chat.message.incoming.accentTextColor : presentationData.theme.theme.chat.message.outgoing.accentTextColor
|
||||||
completeSourceString = strings.Message_ForwardedMessage(peerString)
|
completeSourceString = strings.Message_ForwardedMessageShort(peerString)
|
||||||
}
|
}
|
||||||
case .standalone:
|
case .standalone:
|
||||||
let serviceColor = serviceMessageColorComponents(theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper)
|
let serviceColor = serviceMessageColorComponents(theme: presentationData.theme.theme, wallpaper: presentationData.theme.wallpaper)
|
||||||
|
@ -42,12 +42,10 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
return self.apparentHeightTransition != nil
|
return self.apparentHeightTransition != nil
|
||||||
}
|
}
|
||||||
|
|
||||||
private var forwardInfoNode: ChatMessageForwardInfoNode?
|
|
||||||
private var forwardBackgroundNode: NavigationBackgroundNode?
|
|
||||||
|
|
||||||
private var viaBotNode: TextNode?
|
private var viaBotNode: TextNode?
|
||||||
private var replyInfoNode: ChatMessageReplyInfoNode?
|
private var replyInfoNode: ChatMessageReplyInfoNode?
|
||||||
private var replyBackgroundNode: NavigationBackgroundNode?
|
private var replyBackgroundNode: NavigationBackgroundNode?
|
||||||
|
private var forwardInfoNode: ChatMessageForwardInfoNode?
|
||||||
|
|
||||||
private var actionButtonsNode: ChatMessageActionButtonsNode?
|
private var actionButtonsNode: ChatMessageActionButtonsNode?
|
||||||
private var reactionButtonsNode: ChatMessageReactionButtonsNode?
|
private var reactionButtonsNode: ChatMessageReactionButtonsNode?
|
||||||
@ -259,7 +257,6 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
let currentShareButtonNode = self.shareButtonNode
|
let currentShareButtonNode = self.shareButtonNode
|
||||||
|
|
||||||
let makeForwardInfoLayout = ChatMessageForwardInfoNode.asyncLayout(self.forwardInfoNode)
|
let makeForwardInfoLayout = ChatMessageForwardInfoNode.asyncLayout(self.forwardInfoNode)
|
||||||
let currentForwardBackgroundNode = self.forwardBackgroundNode
|
|
||||||
|
|
||||||
let actionButtonsLayout = ChatMessageActionButtonsNode.asyncLayout(self.actionButtonsNode)
|
let actionButtonsLayout = ChatMessageActionButtonsNode.asyncLayout(self.actionButtonsNode)
|
||||||
let reactionButtonsLayout = ChatMessageReactionButtonsNode.asyncLayout(self.reactionButtonsNode)
|
let reactionButtonsLayout = ChatMessageReactionButtonsNode.asyncLayout(self.reactionButtonsNode)
|
||||||
@ -472,17 +469,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
replyMarkup = attribute
|
replyMarkup = attribute
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if replyInfoApply != nil || viaBotApply != nil {
|
|
||||||
if let currentReplyBackgroundNode = currentReplyBackgroundNode {
|
|
||||||
updatedReplyBackgroundNode = currentReplyBackgroundNode
|
|
||||||
} else {
|
|
||||||
updatedReplyBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper))
|
|
||||||
}
|
|
||||||
|
|
||||||
updatedReplyBackgroundNode?.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate)
|
|
||||||
}
|
|
||||||
|
|
||||||
var updatedShareButtonNode: ChatMessageShareButton?
|
var updatedShareButtonNode: ChatMessageShareButton?
|
||||||
if needsShareButton {
|
if needsShareButton {
|
||||||
if currentShareButtonNode != nil {
|
if currentShareButtonNode != nil {
|
||||||
@ -499,7 +486,6 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
var forwardAuthorSignature: String?
|
var forwardAuthorSignature: String?
|
||||||
|
|
||||||
var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)?
|
var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)?
|
||||||
var updatedForwardBackgroundNode: NavigationBackgroundNode?
|
|
||||||
|
|
||||||
if !ignoreForward, let forwardInfo = item.message.forwardInfo {
|
if !ignoreForward, let forwardInfo = item.message.forwardInfo {
|
||||||
let forwardPsaType = forwardInfo.psaType
|
let forwardPsaType = forwardInfo.psaType
|
||||||
@ -524,14 +510,16 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
}
|
}
|
||||||
let availableWidth = max(60.0, availableContentWidth - normalDisplaySize.width + 6.0)
|
let availableWidth = max(60.0, availableContentWidth - normalDisplaySize.width + 6.0)
|
||||||
forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude))
|
forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableWidth, height: CGFloat.greatestFiniteMagnitude))
|
||||||
|
}
|
||||||
if let currentForwardBackgroundNode = currentForwardBackgroundNode {
|
|
||||||
updatedForwardBackgroundNode = currentForwardBackgroundNode
|
if replyInfoApply != nil || viaBotApply != nil || forwardInfoSizeApply != nil {
|
||||||
|
if let currentReplyBackgroundNode = currentReplyBackgroundNode {
|
||||||
|
updatedReplyBackgroundNode = currentReplyBackgroundNode
|
||||||
} else {
|
} else {
|
||||||
updatedForwardBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper))
|
updatedReplyBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper))
|
||||||
}
|
}
|
||||||
|
|
||||||
updatedForwardBackgroundNode?.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate)
|
updatedReplyBackgroundNode?.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate)
|
||||||
}
|
}
|
||||||
|
|
||||||
var maxContentWidth = normalDisplaySize.width
|
var maxContentWidth = normalDisplaySize.width
|
||||||
@ -657,21 +645,59 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
strongSelf.replyBackgroundNode = nil
|
strongSelf.replyBackgroundNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if let (viaBotLayout, viaBotApply) = viaBotApply {
|
var messageInfoSize = CGSize()
|
||||||
|
if let (viaBotLayout, _) = viaBotApply, forwardInfoSizeApply == nil {
|
||||||
|
messageInfoSize = CGSize(width: viaBotLayout.size.width + 1.0, height: 0.0)
|
||||||
|
}
|
||||||
|
if let (forwardInfoSize, _) = forwardInfoSizeApply {
|
||||||
|
messageInfoSize = CGSize(width: max(messageInfoSize.width, forwardInfoSize.width + 2.0), height: 0.0)
|
||||||
|
}
|
||||||
|
if let (replyInfoSize, _) = replyInfoApply {
|
||||||
|
messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: 0.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let (viaBotLayout, viaBotApply) = viaBotApply, forwardInfoSizeApply == nil {
|
||||||
let viaBotNode = viaBotApply()
|
let viaBotNode = viaBotApply()
|
||||||
if strongSelf.viaBotNode == nil {
|
if strongSelf.viaBotNode == nil {
|
||||||
strongSelf.viaBotNode = viaBotNode
|
strongSelf.viaBotNode = viaBotNode
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(viaBotNode)
|
strongSelf.contextSourceNode.contentNode.addSubnode(viaBotNode)
|
||||||
}
|
}
|
||||||
let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - viaBotLayout.size.width - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0), size: viaBotLayout.size)
|
let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0), size: viaBotLayout.size)
|
||||||
viaBotNode.frame = viaBotFrame
|
viaBotNode.frame = viaBotFrame
|
||||||
let replyBackgroundFrame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 4.0, y: viaBotFrame.minY - 2.0), size: CGSize(width: viaBotFrame.size.width + 8.0, height: viaBotFrame.size.height + 5.0))
|
|
||||||
strongSelf.replyBackgroundNode?.frame = replyBackgroundFrame
|
messageInfoSize = CGSize(width: messageInfoSize.width, height: viaBotLayout.size.height)
|
||||||
strongSelf.replyBackgroundNode?.update(size: replyBackgroundFrame.size, cornerRadius: 8.0, transition: .immediate)
|
|
||||||
} else if let viaBotNode = strongSelf.viaBotNode {
|
} else if let viaBotNode = strongSelf.viaBotNode {
|
||||||
viaBotNode.removeFromSupernode()
|
viaBotNode.removeFromSupernode()
|
||||||
strongSelf.viaBotNode = nil
|
strongSelf.viaBotNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply {
|
||||||
|
let forwardInfoNode = forwardInfoApply(forwardInfoSize.width)
|
||||||
|
if strongSelf.forwardInfoNode == nil {
|
||||||
|
strongSelf.forwardInfoNode = forwardInfoNode
|
||||||
|
strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode)
|
||||||
|
|
||||||
|
if animation.isAnimated {
|
||||||
|
forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 8.0)), y: 8.0 + messageInfoSize.height), size: forwardInfoSize)
|
||||||
|
forwardInfoNode.frame = forwardInfoFrame
|
||||||
|
|
||||||
|
messageInfoSize = CGSize(width: messageInfoSize.width, height: messageInfoSize.height + forwardInfoSize.height - 1.0)
|
||||||
|
} else if let forwardInfoNode = strongSelf.forwardInfoNode {
|
||||||
|
if animation.isAnimated {
|
||||||
|
if let forwardInfoNode = strongSelf.forwardInfoNode {
|
||||||
|
strongSelf.forwardInfoNode = nil
|
||||||
|
forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in
|
||||||
|
forwardInfoNode?.removeFromSupernode()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
forwardInfoNode.removeFromSupernode()
|
||||||
|
strongSelf.forwardInfoNode = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let (replyInfoSize, replyInfoApply) = replyInfoApply {
|
if let (replyInfoSize, replyInfoApply) = replyInfoApply {
|
||||||
let replyInfoNode = replyInfoApply()
|
let replyInfoNode = replyInfoApply()
|
||||||
@ -679,25 +705,23 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
strongSelf.replyInfoNode = replyInfoNode
|
strongSelf.replyInfoNode = replyInfoNode
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode)
|
strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode)
|
||||||
}
|
}
|
||||||
var viaBotSize = CGSize()
|
let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0 + messageInfoSize.height), size: replyInfoSize)
|
||||||
if let viaBotNode = strongSelf.viaBotNode {
|
|
||||||
viaBotSize = viaBotNode.frame.size
|
|
||||||
}
|
|
||||||
let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - max(replyInfoSize.width, viaBotSize.width) - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0 + viaBotSize.height), size: replyInfoSize)
|
|
||||||
if let viaBotNode = strongSelf.viaBotNode {
|
|
||||||
if replyInfoFrame.minX < viaBotNode.frame.minX {
|
|
||||||
viaBotNode.frame = viaBotNode.frame.offsetBy(dx: replyInfoFrame.minX - viaBotNode.frame.minX, dy: 0.0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
replyInfoNode.frame = replyInfoFrame
|
replyInfoNode.frame = replyInfoFrame
|
||||||
let replyBackgroundFrame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0))
|
|
||||||
strongSelf.replyBackgroundNode?.frame = replyBackgroundFrame
|
messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: messageInfoSize.height + replyInfoSize.height)
|
||||||
strongSelf.replyBackgroundNode?.update(size: replyBackgroundFrame.size, cornerRadius: 8.0, transition: .immediate)
|
|
||||||
} else if let replyInfoNode = strongSelf.replyInfoNode {
|
} else if let replyInfoNode = strongSelf.replyInfoNode {
|
||||||
replyInfoNode.removeFromSupernode()
|
replyInfoNode.removeFromSupernode()
|
||||||
strongSelf.replyInfoNode = nil
|
strongSelf.replyInfoNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if let replyBackgroundNode = strongSelf.replyBackgroundNode {
|
||||||
|
replyBackgroundNode.frame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 10.0)) - 4.0, y: 6.0), size: CGSize(width: messageInfoSize.width + 8.0, height: messageInfoSize.height + 5.0))
|
||||||
|
|
||||||
|
let cornerRadius = replyBackgroundNode.frame.height <= 22.0 ? replyBackgroundNode.frame.height / 2.0 : 8.0
|
||||||
|
replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: cornerRadius, transition: .immediate)
|
||||||
|
}
|
||||||
|
|
||||||
if isFailed {
|
if isFailed {
|
||||||
let deliveryFailedNode: ChatMessageDeliveryFailedNode
|
let deliveryFailedNode: ChatMessageDeliveryFailedNode
|
||||||
var isAppearing = false
|
var isAppearing = false
|
||||||
@ -728,63 +752,7 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
deliveryFailedNode?.removeFromSupernode()
|
deliveryFailedNode?.removeFromSupernode()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if let updatedForwardBackgroundNode = updatedForwardBackgroundNode {
|
|
||||||
if strongSelf.forwardBackgroundNode == nil {
|
|
||||||
strongSelf.forwardBackgroundNode = updatedForwardBackgroundNode
|
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(updatedForwardBackgroundNode)
|
|
||||||
|
|
||||||
if animation.isAnimated {
|
|
||||||
updatedForwardBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if let forwardBackgroundNode = strongSelf.forwardBackgroundNode {
|
|
||||||
if animation.isAnimated {
|
|
||||||
strongSelf.forwardBackgroundNode = nil
|
|
||||||
forwardBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardBackgroundNode] _ in
|
|
||||||
forwardBackgroundNode?.removeFromSupernode()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
forwardBackgroundNode.removeFromSupernode()
|
|
||||||
strongSelf.forwardBackgroundNode = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply {
|
|
||||||
let forwardInfoNode = forwardInfoApply(forwardInfoSize.width)
|
|
||||||
if strongSelf.forwardInfoNode == nil {
|
|
||||||
strongSelf.forwardInfoNode = forwardInfoNode
|
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode)
|
|
||||||
forwardInfoNode.openPsa = { [weak strongSelf] type, sourceNode in
|
|
||||||
guard let strongSelf = strongSelf, let item = strongSelf.item else {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
item.controllerInteraction.displayPsa(type, sourceNode)
|
|
||||||
}
|
|
||||||
|
|
||||||
if animation.isAnimated {
|
|
||||||
forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize)
|
|
||||||
forwardInfoNode.frame = forwardInfoFrame
|
|
||||||
let forwardBackgroundFrame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0))
|
|
||||||
strongSelf.forwardBackgroundNode?.frame = forwardBackgroundFrame
|
|
||||||
strongSelf.forwardBackgroundNode?.update(size: forwardBackgroundFrame.size, cornerRadius: 8.0, transition: .immediate)
|
|
||||||
} else if let forwardInfoNode = strongSelf.forwardInfoNode {
|
|
||||||
if animation.isAnimated {
|
|
||||||
if let forwardInfoNode = strongSelf.forwardInfoNode {
|
|
||||||
strongSelf.forwardInfoNode = nil
|
|
||||||
forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in
|
|
||||||
forwardInfoNode?.removeFromSupernode()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
forwardInfoNode.removeFromSupernode()
|
|
||||||
strongSelf.forwardInfoNode = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let reactionButtonsSizeAndApply = reactionButtonsSizeAndApply {
|
if let reactionButtonsSizeAndApply = reactionButtonsSizeAndApply {
|
||||||
let reactionButtonsNode = reactionButtonsSizeAndApply.1(animation)
|
let reactionButtonsNode = reactionButtonsSizeAndApply.1(animation)
|
||||||
var reactionButtonsFrame = CGRect(origin: CGPoint(x: videoFrame.minX, y: videoFrame.maxY + 6.0), size: reactionButtonsSizeAndApply.0)
|
var reactionButtonsFrame = CGRect(origin: CGPoint(x: videoFrame.minX, y: videoFrame.maxY + 6.0), size: reactionButtonsSizeAndApply.0)
|
||||||
@ -869,9 +837,6 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
}
|
}
|
||||||
|
|
||||||
let transition = ContainedViewLayoutTransition.animated(duration: 0.2, curve: .easeInOut)
|
let transition = ContainedViewLayoutTransition.animated(duration: 0.2, curve: .easeInOut)
|
||||||
if let forwardBackgroundNode = strongSelf.forwardBackgroundNode {
|
|
||||||
transition.updateAlpha(node: forwardBackgroundNode, alpha: isPlaying ? 0.0 : 1.0)
|
|
||||||
}
|
|
||||||
if let replyBackgroundNode = strongSelf.replyBackgroundNode {
|
if let replyBackgroundNode = strongSelf.replyBackgroundNode {
|
||||||
transition.updateAlpha(node: replyBackgroundNode, alpha: isPlaying ? 0.0 : 1.0)
|
transition.updateAlpha(node: replyBackgroundNode, alpha: isPlaying ? 0.0 : 1.0)
|
||||||
}
|
}
|
||||||
@ -1312,28 +1277,28 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
shareButtonNode.frame = CGRect(origin: CGPoint(x: min(params.width - buttonSize.width - 8.0, videoFrame.maxX - 7.0), y: videoFrame.maxY - 24.0 - buttonSize.height), size: buttonSize)
|
shareButtonNode.frame = CGRect(origin: CGPoint(x: min(params.width - buttonSize.width - 8.0, videoFrame.maxX - 7.0), y: videoFrame.maxY - 24.0 - buttonSize.height), size: buttonSize)
|
||||||
}
|
}
|
||||||
|
|
||||||
if let viaBotNode = self.viaBotNode {
|
// if let viaBotNode = self.viaBotNode {
|
||||||
let viaBotLayout = viaBotNode.frame
|
// let viaBotLayout = viaBotNode.frame
|
||||||
let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - viaBotLayout.size.width - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0), size: viaBotLayout.size)
|
// let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - viaBotLayout.size.width - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0), size: viaBotLayout.size)
|
||||||
viaBotNode.frame = viaBotFrame
|
// viaBotNode.frame = viaBotFrame
|
||||||
self.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 4.0, y: viaBotFrame.minY - 2.0), size: CGSize(width: viaBotFrame.size.width + 8.0, height: viaBotFrame.size.height + 5.0))
|
// self.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 4.0, y: viaBotFrame.minY - 2.0), size: CGSize(width: viaBotFrame.size.width + 8.0, height: viaBotFrame.size.height + 5.0))
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
if let replyInfoNode = self.replyInfoNode {
|
// if let replyInfoNode = self.replyInfoNode {
|
||||||
var viaBotSize = CGSize()
|
// var viaBotSize = CGSize()
|
||||||
if let viaBotNode = self.viaBotNode {
|
// if let viaBotNode = self.viaBotNode {
|
||||||
viaBotSize = viaBotNode.frame.size
|
// viaBotSize = viaBotNode.frame.size
|
||||||
}
|
// }
|
||||||
let replyInfoSize = replyInfoNode.frame.size
|
// let replyInfoSize = replyInfoNode.frame.size
|
||||||
let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - max(replyInfoSize.width, viaBotSize.width) - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0 + viaBotSize.height), size: replyInfoSize)
|
// let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - max(replyInfoSize.width, viaBotSize.width) - layoutConstants.bubble.edgeInset - 10.0)), y: 8.0 + viaBotSize.height), size: replyInfoSize)
|
||||||
if let viaBotNode = self.viaBotNode {
|
// if let viaBotNode = self.viaBotNode {
|
||||||
if replyInfoFrame.minX < viaBotNode.frame.minX {
|
// if replyInfoFrame.minX < viaBotNode.frame.minX {
|
||||||
viaBotNode.frame = viaBotNode.frame.offsetBy(dx: replyInfoFrame.minX - viaBotNode.frame.minX, dy: 0.0)
|
// viaBotNode.frame = viaBotNode.frame.offsetBy(dx: replyInfoFrame.minX - viaBotNode.frame.minX, dy: 0.0)
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
replyInfoNode.frame = replyInfoFrame
|
// replyInfoNode.frame = replyInfoFrame
|
||||||
self.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0))
|
// self.replyBackgroundNode?.frame = CGRect(origin: CGPoint(x: replyInfoFrame.minX - 4.0, y: replyInfoFrame.minY - viaBotSize.height - 2.0), size: CGSize(width: max(replyInfoFrame.size.width, viaBotSize.width) + 8.0, height: replyInfoFrame.size.height + viaBotSize.height + 5.0))
|
||||||
}
|
// }
|
||||||
|
|
||||||
if let deliveryFailedNode = self.deliveryFailedNode {
|
if let deliveryFailedNode = self.deliveryFailedNode {
|
||||||
let deliveryFailedSize = deliveryFailedNode.frame.size
|
let deliveryFailedSize = deliveryFailedNode.frame.size
|
||||||
@ -1341,12 +1306,11 @@ class ChatMessageInstantVideoItemNode: ChatMessageItemView, UIGestureRecognizerD
|
|||||||
deliveryFailedNode.frame = deliveryFailedFrame
|
deliveryFailedNode.frame = deliveryFailedFrame
|
||||||
}
|
}
|
||||||
|
|
||||||
if let forwardInfoNode = self.forwardInfoNode {
|
// if let forwardInfoNode = self.forwardInfoNode {
|
||||||
let forwardInfoSize = forwardInfoNode.frame.size
|
// let forwardInfoSize = forwardInfoNode.frame.size
|
||||||
let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize)
|
// let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize)
|
||||||
forwardInfoNode.frame = forwardInfoFrame
|
// forwardInfoNode.frame = forwardInfoFrame
|
||||||
self.forwardBackgroundNode?.frame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0))
|
// }
|
||||||
}
|
|
||||||
|
|
||||||
if let actionButtonsNode = self.actionButtonsNode {
|
if let actionButtonsNode = self.actionButtonsNode {
|
||||||
let actionButtonsSize = actionButtonsNode.frame.size
|
let actionButtonsSize = actionButtonsNode.frame.size
|
||||||
|
@ -247,9 +247,9 @@ class ChatMessageReplyInfoNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
node.imageNode?.captureProtected = message.isCopyProtected()
|
node.imageNode?.captureProtected = message.isCopyProtected()
|
||||||
|
|
||||||
titleNode.frame = CGRect(origin: CGPoint(x: leftInset - textInsets.left, y: spacing - textInsets.top), size: titleLayout.size)
|
titleNode.frame = CGRect(origin: CGPoint(x: leftInset - textInsets.left - 2.0, y: spacing - textInsets.top + 1.0), size: titleLayout.size)
|
||||||
|
|
||||||
let textFrame = CGRect(origin: CGPoint(x: leftInset - textInsets.left, y: titleNode.frame.maxY - textInsets.bottom + spacing - textInsets.top), size: textLayout.size)
|
let textFrame = CGRect(origin: CGPoint(x: leftInset - textInsets.left - 2.0, y: titleNode.frame.maxY - textInsets.bottom + spacing - textInsets.top - 2.0), size: textLayout.size)
|
||||||
textNode.frame = textFrame
|
textNode.frame = textFrame
|
||||||
|
|
||||||
if !textLayout.spoilers.isEmpty {
|
if !textLayout.spoilers.isEmpty {
|
||||||
@ -270,7 +270,7 @@ class ChatMessageReplyInfoNode: ASDisplayNode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
node.lineNode.image = lineImage
|
node.lineNode.image = lineImage
|
||||||
node.lineNode.frame = CGRect(origin: CGPoint(x: 1.0, y: 3.0), size: CGSize(width: 2.0, height: max(0.0, size.height - 5.0)))
|
node.lineNode.frame = CGRect(origin: CGPoint(x: 1.0, y: 3.0), size: CGSize(width: 2.0, height: max(0.0, size.height - 4.0)))
|
||||||
|
|
||||||
node.contentNode.frame = CGRect(origin: CGPoint(), size: size)
|
node.contentNode.frame = CGRect(origin: CGPoint(), size: size)
|
||||||
|
|
||||||
|
@ -36,13 +36,11 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
var telegramFile: TelegramMediaFile?
|
var telegramFile: TelegramMediaFile?
|
||||||
private let fetchDisposable = MetaDisposable()
|
private let fetchDisposable = MetaDisposable()
|
||||||
|
|
||||||
private var forwardInfoNode: ChatMessageForwardInfoNode?
|
|
||||||
private var forwardBackgroundNode: NavigationBackgroundNode?
|
|
||||||
|
|
||||||
private var viaBotNode: TextNode?
|
private var viaBotNode: TextNode?
|
||||||
private let dateAndStatusNode: ChatMessageDateAndStatusNode
|
private let dateAndStatusNode: ChatMessageDateAndStatusNode
|
||||||
private var replyInfoNode: ChatMessageReplyInfoNode?
|
private var replyInfoNode: ChatMessageReplyInfoNode?
|
||||||
private var replyBackgroundNode: NavigationBackgroundNode?
|
private var replyBackgroundNode: NavigationBackgroundNode?
|
||||||
|
private var forwardInfoNode: ChatMessageForwardInfoNode?
|
||||||
|
|
||||||
private var actionButtonsNode: ChatMessageActionButtonsNode?
|
private var actionButtonsNode: ChatMessageActionButtonsNode?
|
||||||
private var reactionButtonsNode: ChatMessageReactionButtonsNode?
|
private var reactionButtonsNode: ChatMessageReactionButtonsNode?
|
||||||
@ -588,12 +586,6 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var needsReplyBackground = false
|
|
||||||
|
|
||||||
if replyInfoApply != nil || viaBotApply != nil {
|
|
||||||
needsReplyBackground = true
|
|
||||||
}
|
|
||||||
|
|
||||||
var updatedShareButtonNode: ChatMessageShareButton?
|
var updatedShareButtonNode: ChatMessageShareButton?
|
||||||
if needsShareButton {
|
if needsShareButton {
|
||||||
if let currentShareButtonNode = currentShareButtonNode {
|
if let currentShareButtonNode = currentShareButtonNode {
|
||||||
@ -611,7 +603,6 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
var forwardPsaType: String?
|
var forwardPsaType: String?
|
||||||
|
|
||||||
var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)?
|
var forwardInfoSizeApply: (CGSize, (CGFloat) -> ChatMessageForwardInfoNode)?
|
||||||
var needsForwardBackground = false
|
|
||||||
|
|
||||||
if !ignoreForward, let forwardInfo = item.message.forwardInfo {
|
if !ignoreForward, let forwardInfo = item.message.forwardInfo {
|
||||||
forwardPsaType = forwardInfo.psaType
|
forwardPsaType = forwardInfo.psaType
|
||||||
@ -636,8 +627,11 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
}
|
}
|
||||||
let availableForwardWidth = max(60.0, availableWidth + 6.0)
|
let availableForwardWidth = max(60.0, availableWidth + 6.0)
|
||||||
forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableForwardWidth, height: CGFloat.greatestFiniteMagnitude))
|
forwardInfoSizeApply = makeForwardInfoLayout(item.presentationData, item.presentationData.strings, .standalone, forwardSource, forwardAuthorSignature, forwardPsaType, CGSize(width: availableForwardWidth, height: CGFloat.greatestFiniteMagnitude))
|
||||||
|
}
|
||||||
needsForwardBackground = true
|
|
||||||
|
var needsReplyBackground = false
|
||||||
|
if replyInfoApply != nil || viaBotApply != nil || forwardInfoSizeApply != nil {
|
||||||
|
needsReplyBackground = true
|
||||||
}
|
}
|
||||||
|
|
||||||
var maxContentWidth = imageSize.width
|
var maxContentWidth = imageSize.width
|
||||||
@ -829,48 +823,89 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
strongSelf.replyBackgroundNode = nil
|
strongSelf.replyBackgroundNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
if let (_, viaBotApply) = viaBotApply, let viaBotFrame = viaBotFrame {
|
var messageInfoSize = CGSize()
|
||||||
|
if let (viaBotLayout, _) = viaBotApply, forwardInfoSizeApply == nil {
|
||||||
|
messageInfoSize = CGSize(width: viaBotLayout.size.width + 1.0, height: 0.0)
|
||||||
|
}
|
||||||
|
if let (forwardInfoSize, _) = forwardInfoSizeApply {
|
||||||
|
messageInfoSize = CGSize(width: max(messageInfoSize.width, forwardInfoSize.width + 2.0), height: 0.0)
|
||||||
|
}
|
||||||
|
if let (replyInfoSize, _) = replyInfoApply {
|
||||||
|
messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: 0.0)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let (viaBotLayout, viaBotApply) = viaBotApply, forwardInfoSizeApply == nil {
|
||||||
let viaBotNode = viaBotApply()
|
let viaBotNode = viaBotApply()
|
||||||
if strongSelf.viaBotNode == nil {
|
if strongSelf.viaBotNode == nil {
|
||||||
strongSelf.viaBotNode = viaBotNode
|
strongSelf.viaBotNode = viaBotNode
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(viaBotNode)
|
strongSelf.contextSourceNode.contentNode.addSubnode(viaBotNode)
|
||||||
}
|
}
|
||||||
|
let viaBotFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0), size: viaBotLayout.size)
|
||||||
viaBotNode.frame = viaBotFrame
|
viaBotNode.frame = viaBotFrame
|
||||||
if let replyBackgroundNode = strongSelf.replyBackgroundNode {
|
|
||||||
replyBackgroundNode.frame = CGRect(origin: CGPoint(x: viaBotFrame.minX - 6.0, y: viaBotFrame.minY - 2.0 - UIScreenPixel), size: CGSize(width: viaBotFrame.size.width + 11.0, height: viaBotFrame.size.height + 5.0))
|
messageInfoSize = CGSize(width: messageInfoSize.width, height: viaBotLayout.size.height)
|
||||||
replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate)
|
|
||||||
}
|
|
||||||
} else if let viaBotNode = strongSelf.viaBotNode {
|
} else if let viaBotNode = strongSelf.viaBotNode {
|
||||||
viaBotNode.removeFromSupernode()
|
viaBotNode.removeFromSupernode()
|
||||||
strongSelf.viaBotNode = nil
|
strongSelf.viaBotNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply {
|
||||||
|
let forwardInfoNode = forwardInfoApply(forwardInfoSize.width)
|
||||||
|
if strongSelf.forwardInfoNode == nil {
|
||||||
|
strongSelf.forwardInfoNode = forwardInfoNode
|
||||||
|
strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode)
|
||||||
|
|
||||||
|
if animation.isAnimated {
|
||||||
|
forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 8.0)), y: 8.0 + messageInfoSize.height), size: forwardInfoSize)
|
||||||
|
forwardInfoNode.frame = forwardInfoFrame
|
||||||
|
|
||||||
|
messageInfoSize = CGSize(width: messageInfoSize.width, height: messageInfoSize.height + forwardInfoSize.height - 1.0)
|
||||||
|
} else if let forwardInfoNode = strongSelf.forwardInfoNode {
|
||||||
|
if animation.isAnimated {
|
||||||
|
if let forwardInfoNode = strongSelf.forwardInfoNode {
|
||||||
|
strongSelf.forwardInfoNode = nil
|
||||||
|
forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in
|
||||||
|
forwardInfoNode?.removeFromSupernode()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
forwardInfoNode.removeFromSupernode()
|
||||||
|
strongSelf.forwardInfoNode = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let (_, replyInfoApply) = replyInfoApply, let replyInfoFrame = replyInfoFrame {
|
if let (replyInfoSize, replyInfoApply) = replyInfoApply {
|
||||||
let replyInfoNode = replyInfoApply()
|
let replyInfoNode = replyInfoApply()
|
||||||
if strongSelf.replyInfoNode == nil {
|
if strongSelf.replyInfoNode == nil {
|
||||||
strongSelf.replyInfoNode = replyInfoNode
|
strongSelf.replyInfoNode = replyInfoNode
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode)
|
strongSelf.contextSourceNode.contentNode.addSubnode(replyInfoNode)
|
||||||
}
|
}
|
||||||
|
let replyInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 11.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 9.0)), y: 8.0 + messageInfoSize.height), size: replyInfoSize)
|
||||||
replyInfoNode.frame = replyInfoFrame
|
replyInfoNode.frame = replyInfoFrame
|
||||||
if let replyBackgroundNode = strongSelf.replyBackgroundNode, let replyBackgroundFrame = replyBackgroundFrame {
|
|
||||||
replyBackgroundNode.frame = replyBackgroundFrame
|
|
||||||
replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate)
|
|
||||||
}
|
|
||||||
|
|
||||||
if isEmoji && !incoming {
|
messageInfoSize = CGSize(width: max(messageInfoSize.width, replyInfoSize.width), height: messageInfoSize.height + replyInfoSize.height)
|
||||||
if let _ = item.controllerInteraction.selectionState {
|
|
||||||
replyInfoNode.alpha = 0.0
|
|
||||||
strongSelf.replyBackgroundNode?.alpha = 0.0
|
|
||||||
} else {
|
|
||||||
replyInfoNode.alpha = 1.0
|
|
||||||
strongSelf.replyBackgroundNode?.alpha = 1.0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if let replyInfoNode = strongSelf.replyInfoNode {
|
} else if let replyInfoNode = strongSelf.replyInfoNode {
|
||||||
replyInfoNode.removeFromSupernode()
|
replyInfoNode.removeFromSupernode()
|
||||||
strongSelf.replyInfoNode = nil
|
strongSelf.replyInfoNode = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if let replyBackgroundNode = strongSelf.replyBackgroundNode {
|
||||||
|
replyBackgroundNode.frame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 10.0) : (params.width - params.rightInset - messageInfoSize.width - layoutConstants.bubble.edgeInset - 10.0)) - 4.0, y: 6.0), size: CGSize(width: messageInfoSize.width + 8.0, height: messageInfoSize.height + 5.0))
|
||||||
|
|
||||||
|
let cornerRadius = replyBackgroundNode.frame.height <= 22.0 ? replyBackgroundNode.frame.height / 2.0 : 8.0
|
||||||
|
replyBackgroundNode.update(size: replyBackgroundNode.bounds.size, cornerRadius: cornerRadius, transition: .immediate)
|
||||||
|
}
|
||||||
|
|
||||||
|
let panelsAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0
|
||||||
|
strongSelf.replyInfoNode?.alpha = panelsAlpha
|
||||||
|
strongSelf.viaBotNode?.alpha = panelsAlpha
|
||||||
|
strongSelf.forwardInfoNode?.alpha = panelsAlpha
|
||||||
|
strongSelf.replyBackgroundNode?.alpha = panelsAlpha
|
||||||
|
|
||||||
if isFailed {
|
if isFailed {
|
||||||
let deliveryFailedNode: ChatMessageDeliveryFailedNode
|
let deliveryFailedNode: ChatMessageDeliveryFailedNode
|
||||||
var isAppearing = false
|
var isAppearing = false
|
||||||
@ -901,61 +936,7 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
deliveryFailedNode?.removeFromSupernode()
|
deliveryFailedNode?.removeFromSupernode()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if needsForwardBackground {
|
|
||||||
if let forwardBackgroundNode = strongSelf.forwardBackgroundNode {
|
|
||||||
forwardBackgroundNode.updateColor(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), transition: .immediate)
|
|
||||||
} else {
|
|
||||||
let forwardBackgroundNode = NavigationBackgroundNode(color: selectDateFillStaticColor(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper), enableBlur: dateFillNeedsBlur(theme: item.presentationData.theme.theme, wallpaper: item.presentationData.theme.wallpaper))
|
|
||||||
strongSelf.forwardBackgroundNode = forwardBackgroundNode
|
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(forwardBackgroundNode)
|
|
||||||
|
|
||||||
if animation.isAnimated {
|
|
||||||
forwardBackgroundNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if let forwardBackgroundNode = strongSelf.forwardBackgroundNode {
|
|
||||||
if animation.isAnimated {
|
|
||||||
strongSelf.forwardBackgroundNode = nil
|
|
||||||
forwardBackgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardBackgroundNode] _ in
|
|
||||||
forwardBackgroundNode?.removeFromSupernode()
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
forwardBackgroundNode.removeFromSupernode()
|
|
||||||
strongSelf.forwardBackgroundNode = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let (forwardInfoSize, forwardInfoApply) = forwardInfoSizeApply {
|
|
||||||
let forwardInfoNode = forwardInfoApply(forwardInfoSize.width)
|
|
||||||
if strongSelf.forwardInfoNode == nil {
|
|
||||||
strongSelf.forwardInfoNode = forwardInfoNode
|
|
||||||
strongSelf.contextSourceNode.contentNode.addSubnode(forwardInfoNode)
|
|
||||||
|
|
||||||
if animation.isAnimated {
|
|
||||||
forwardInfoNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.2)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let forwardInfoFrame = CGRect(origin: CGPoint(x: (!incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + 12.0) : (params.width - params.rightInset - forwardInfoSize.width - layoutConstants.bubble.edgeInset - 12.0)), y: 8.0), size: forwardInfoSize)
|
|
||||||
forwardInfoNode.frame = forwardInfoFrame
|
|
||||||
if let forwardBackgroundNode = strongSelf.forwardBackgroundNode {
|
|
||||||
forwardBackgroundNode.frame = CGRect(origin: CGPoint(x: forwardInfoFrame.minX - 6.0, y: forwardInfoFrame.minY - 2.0), size: CGSize(width: forwardInfoFrame.size.width + 10.0, height: forwardInfoFrame.size.height + 4.0))
|
|
||||||
forwardBackgroundNode.update(size: forwardBackgroundNode.bounds.size, cornerRadius: 8.0, transition: .immediate)
|
|
||||||
}
|
|
||||||
} else if let forwardInfoNode = strongSelf.forwardInfoNode {
|
|
||||||
if animation.isAnimated {
|
|
||||||
if let forwardInfoNode = strongSelf.forwardInfoNode {
|
|
||||||
strongSelf.forwardInfoNode = nil
|
|
||||||
forwardInfoNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.1, removeOnCompletion: false, completion: { [weak forwardInfoNode] _ in
|
|
||||||
forwardInfoNode?.removeFromSupernode()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
forwardInfoNode.removeFromSupernode()
|
|
||||||
strongSelf.forwardInfoNode = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if let actionButtonsSizeAndApply = actionButtonsSizeAndApply {
|
if let actionButtonsSizeAndApply = actionButtonsSizeAndApply {
|
||||||
let actionButtonsNode = actionButtonsSizeAndApply.1(animation)
|
let actionButtonsNode = actionButtonsSizeAndApply.1(animation)
|
||||||
let previousFrame = actionButtonsNode.frame
|
let previousFrame = actionButtonsNode.frame
|
||||||
@ -1333,12 +1314,18 @@ class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.2, curve: .easeInOut) : .immediate
|
let transition: ContainedViewLayoutTransition = animated ? .animated(duration: 0.2, curve: .easeInOut) : .immediate
|
||||||
let replyAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0
|
let panelsAlpha: CGFloat = item.controllerInteraction.selectionState == nil ? 1.0 : 0.0
|
||||||
if let replyInfoNode = self.replyInfoNode {
|
if let replyInfoNode = self.replyInfoNode {
|
||||||
transition.updateAlpha(node: replyInfoNode, alpha: replyAlpha)
|
transition.updateAlpha(node: replyInfoNode, alpha: panelsAlpha)
|
||||||
|
}
|
||||||
|
if let viaBotNode = self.viaBotNode {
|
||||||
|
transition.updateAlpha(node: viaBotNode, alpha: panelsAlpha)
|
||||||
|
}
|
||||||
|
if let forwardInfoNode = self.forwardInfoNode {
|
||||||
|
transition.updateAlpha(node: forwardInfoNode, alpha: panelsAlpha)
|
||||||
}
|
}
|
||||||
if let replyBackgroundNode = self.replyBackgroundNode {
|
if let replyBackgroundNode = self.replyBackgroundNode {
|
||||||
transition.updateAlpha(node: replyBackgroundNode, alpha: replyAlpha)
|
transition.updateAlpha(node: replyBackgroundNode, alpha: panelsAlpha)
|
||||||
}
|
}
|
||||||
|
|
||||||
if let selectionState = item.controllerInteraction.selectionState {
|
if let selectionState = item.controllerInteraction.selectionState {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user