mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-07-25 20:50:47 +00:00
Various improvements
This commit is contained in:
parent
4513f7d2e4
commit
119db20d25
@ -53,6 +53,7 @@ swift_library(
|
|||||||
"//submodules/TelegramUI/Components/Chat/ManagedDiceAnimationNode",
|
"//submodules/TelegramUI/Components/Chat/ManagedDiceAnimationNode",
|
||||||
"//submodules/TelegramUI/Components/Chat/MessageHaptics",
|
"//submodules/TelegramUI/Components/Chat/MessageHaptics",
|
||||||
"//submodules/TelegramUI/Components/Chat/ChatMessageTransitionNode",
|
"//submodules/TelegramUI/Components/Chat/ChatMessageTransitionNode",
|
||||||
|
"//submodules/TelegramUI/Components/Chat/ChatMessageSuggestedPostInfoNode",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
@ -46,6 +46,7 @@ import ChatMessageReactionsFooterContentNode
|
|||||||
import ManagedDiceAnimationNode
|
import ManagedDiceAnimationNode
|
||||||
import MessageHaptics
|
import MessageHaptics
|
||||||
import ChatMessageTransitionNode
|
import ChatMessageTransitionNode
|
||||||
|
import ChatMessageSuggestedPostInfoNode
|
||||||
|
|
||||||
private let nameFont = Font.medium(14.0)
|
private let nameFont = Font.medium(14.0)
|
||||||
private let inlineBotPrefixFont = Font.regular(14.0)
|
private let inlineBotPrefixFont = Font.regular(14.0)
|
||||||
@ -143,6 +144,8 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
private var fetchEffectDisposable: Disposable?
|
private var fetchEffectDisposable: Disposable?
|
||||||
|
|
||||||
|
private var suggestedPostInfoNode: ChatMessageSuggestedPostInfoNode?
|
||||||
|
|
||||||
required public init(rotated: Bool) {
|
required public init(rotated: Bool) {
|
||||||
self.contextSourceNode = ContextExtractedContentContainingNode()
|
self.contextSourceNode = ContextExtractedContentContainingNode()
|
||||||
self.containerNode = ContextControllerSourceNode()
|
self.containerNode = ContextControllerSourceNode()
|
||||||
@ -823,6 +826,8 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
let textLayout = TextNodeWithEntities.asyncLayout(self.textNode)
|
let textLayout = TextNodeWithEntities.asyncLayout(self.textNode)
|
||||||
|
|
||||||
|
let makeSuggestedPostInfoNodeLayout: ChatMessageSuggestedPostInfoNode.AsyncLayout = ChatMessageSuggestedPostInfoNode.asyncLayout(self.suggestedPostInfoNode)
|
||||||
|
|
||||||
func continueAsyncLayout(_ weakSelf: Weak<ChatMessageAnimatedStickerItemNode>, _ item: ChatMessageItem, _ params: ListViewItemLayoutParams, _ mergedTop: ChatMessageMerge, _ mergedBottom: ChatMessageMerge, _ dateHeaderAtBottom: ChatMessageHeaderSpec) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation, ListViewItemApply, Bool) -> Void) {
|
func continueAsyncLayout(_ weakSelf: Weak<ChatMessageAnimatedStickerItemNode>, _ item: ChatMessageItem, _ params: ListViewItemLayoutParams, _ mergedTop: ChatMessageMerge, _ mergedBottom: ChatMessageMerge, _ dateHeaderAtBottom: ChatMessageHeaderSpec) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation, ListViewItemApply, Bool) -> Void) {
|
||||||
let accessibilityData = ChatMessageAccessibilityData(item: item, isSelected: nil)
|
let accessibilityData = ChatMessageAccessibilityData(item: item, isSelected: nil)
|
||||||
let layoutConstants = chatMessageItemLayoutConstants(layoutConstants, params: params, presentationData: item.presentationData)
|
let layoutConstants = chatMessageItemLayoutConstants(layoutConstants, params: params, presentationData: item.presentationData)
|
||||||
@ -1030,7 +1035,7 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
var innerImageSize = imageSize
|
var innerImageSize = imageSize
|
||||||
imageSize = CGSize(width: imageSize.width + imageInset * 2.0, height: imageSize.height + imageInset * 2.0)
|
imageSize = CGSize(width: imageSize.width + imageInset * 2.0, height: imageSize.height + imageInset * 2.0)
|
||||||
let imageFrame = CGRect(origin: CGPoint(x: 0.0 + (incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + avatarInset + layoutConstants.bubble.contentInsets.left) : (params.width - params.rightInset - imageSize.width - layoutConstants.bubble.edgeInset - layoutConstants.bubble.contentInsets.left - deliveryFailedInset - imageHorizontalOffset)), y: imageVerticalInset + imageTopPadding), size: CGSize(width: imageSize.width, height: imageSize.height))
|
var imageFrame = CGRect(origin: CGPoint(x: 0.0 + (incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + avatarInset + layoutConstants.bubble.contentInsets.left) : (params.width - params.rightInset - imageSize.width - layoutConstants.bubble.edgeInset - layoutConstants.bubble.contentInsets.left - deliveryFailedInset - imageHorizontalOffset)), y: imageVerticalInset + imageTopPadding), size: CGSize(width: imageSize.width, height: imageSize.height))
|
||||||
if isEmoji {
|
if isEmoji {
|
||||||
innerImageSize = imageSize
|
innerImageSize = imageSize
|
||||||
}
|
}
|
||||||
@ -1287,6 +1292,42 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
let (minWidth, buttonsLayout) = actionButtonsLayout(item.context, item.presentationData.theme, item.presentationData.chatBubbleCorners, item.presentationData.strings, item.controllerInteraction.presentationContext.backgroundNode, replyMarkup, [:], item.message, maxContentWidth)
|
let (minWidth, buttonsLayout) = actionButtonsLayout(item.context, item.presentationData.theme, item.presentationData.chatBubbleCorners, item.presentationData.strings, item.controllerInteraction.presentationContext.backgroundNode, replyMarkup, [:], item.message, maxContentWidth)
|
||||||
maxContentWidth = max(maxContentWidth, minWidth)
|
maxContentWidth = max(maxContentWidth, minWidth)
|
||||||
actionButtonsFinalize = buttonsLayout
|
actionButtonsFinalize = buttonsLayout
|
||||||
|
} else if incoming, let attribute = item.message.attributes.first(where: { $0 is SuggestedPostMessageAttribute }) as? SuggestedPostMessageAttribute, attribute.state == nil {
|
||||||
|
//TODO:localize
|
||||||
|
var buttonDeclineValue: UInt8 = 0
|
||||||
|
let buttonDecline = MemoryBuffer(data: Data(bytes: &buttonDeclineValue, count: 1))
|
||||||
|
var buttonApproveValue: UInt8 = 1
|
||||||
|
let buttonApprove = MemoryBuffer(data: Data(bytes: &buttonApproveValue, count: 1))
|
||||||
|
var buttonSuggestChangesValue: UInt8 = 2
|
||||||
|
let buttonSuggestChanges = MemoryBuffer(data: Data(bytes: &buttonSuggestChangesValue, count: 1))
|
||||||
|
|
||||||
|
let customIcons: [MemoryBuffer: ChatMessageActionButtonsNode.CustomIcon] = [
|
||||||
|
buttonDecline: .suggestedPostReject,
|
||||||
|
buttonApprove: .suggestedPostApprove,
|
||||||
|
buttonSuggestChanges: .suggestedPostEdit
|
||||||
|
]
|
||||||
|
|
||||||
|
let (minWidth, buttonsLayout) = actionButtonsLayout(
|
||||||
|
item.context,
|
||||||
|
item.presentationData.theme,
|
||||||
|
item.presentationData.chatBubbleCorners,
|
||||||
|
item.presentationData.strings,
|
||||||
|
item.controllerInteraction.presentationContext.backgroundNode,
|
||||||
|
ReplyMarkupMessageAttribute(
|
||||||
|
rows: [
|
||||||
|
ReplyMarkupRow(buttons: [
|
||||||
|
ReplyMarkupButton(title: "Decline", titleWhenForwarded: nil, action: .callback(requiresPassword: false, data: buttonDecline)),
|
||||||
|
ReplyMarkupButton(title: "Approve", titleWhenForwarded: nil, action: .callback(requiresPassword: false, data: buttonApprove))
|
||||||
|
]),
|
||||||
|
ReplyMarkupRow(buttons: [
|
||||||
|
ReplyMarkupButton(title: "Suggest Changes", titleWhenForwarded: nil, action: .callback(requiresPassword: false, data: buttonSuggestChanges))
|
||||||
|
])
|
||||||
|
],
|
||||||
|
flags: [],
|
||||||
|
placeholder: nil
|
||||||
|
), customIcons, item.message, maxContentWidth)
|
||||||
|
maxContentWidth = max(maxContentWidth, minWidth)
|
||||||
|
actionButtonsFinalize = buttonsLayout
|
||||||
}
|
}
|
||||||
|
|
||||||
var actionButtonsSizeAndApply: (CGSize, (ListViewItemUpdateAnimation) -> ChatMessageActionButtonsNode)?
|
var actionButtonsSizeAndApply: (CGSize, (ListViewItemUpdateAnimation) -> ChatMessageActionButtonsNode)?
|
||||||
@ -1336,6 +1377,22 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
layoutSize.height += 4.0 + reactionButtonsSizeAndApply.0.height
|
layoutSize.height += 4.0 + reactionButtonsSizeAndApply.0.height
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let baseWidth = params.width - params.leftInset - params.rightInset
|
||||||
|
var suggestedPostInfoNodeLayout: (CGSize, () -> ChatMessageSuggestedPostInfoNode)?
|
||||||
|
for attribute in item.message.attributes {
|
||||||
|
if let _ = attribute as? SuggestedPostMessageAttribute {
|
||||||
|
let suggestedPostInfoNodeLayoutValue = makeSuggestedPostInfoNodeLayout(item, baseWidth)
|
||||||
|
suggestedPostInfoNodeLayout = suggestedPostInfoNodeLayoutValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var additionalTopHeight: CGFloat = 0.0
|
||||||
|
if let suggestedPostInfoNodeLayout {
|
||||||
|
additionalTopHeight += 4.0 + suggestedPostInfoNodeLayout.0.height + 8.0
|
||||||
|
}
|
||||||
|
layoutSize.height += additionalTopHeight
|
||||||
|
imageFrame.origin.y += additionalTopHeight
|
||||||
|
|
||||||
var headersOffset: CGFloat = 0.0
|
var headersOffset: CGFloat = 0.0
|
||||||
if let (threadInfoSize, _) = threadInfoApply {
|
if let (threadInfoSize, _) = threadInfoApply {
|
||||||
headersOffset += threadInfoSize.height + 10.0
|
headersOffset += threadInfoSize.height + 10.0
|
||||||
@ -1390,6 +1447,20 @@ public class ChatMessageAnimatedStickerItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
strongSelf.updateAttachedDateHeader(hasDate: dateHeaderAtBottom.hasDate, hasPeer: dateHeaderAtBottom.hasTopic)
|
strongSelf.updateAttachedDateHeader(hasDate: dateHeaderAtBottom.hasDate, hasPeer: dateHeaderAtBottom.hasTopic)
|
||||||
|
|
||||||
|
if let (suggestedPostInfoSize, suggestedPostInfoApply) = suggestedPostInfoNodeLayout {
|
||||||
|
let suggestedPostInfoNode = suggestedPostInfoApply()
|
||||||
|
if suggestedPostInfoNode !== strongSelf.suggestedPostInfoNode {
|
||||||
|
strongSelf.suggestedPostInfoNode?.removeFromSupernode()
|
||||||
|
strongSelf.suggestedPostInfoNode = suggestedPostInfoNode
|
||||||
|
strongSelf.addSubnode(suggestedPostInfoNode)
|
||||||
|
}
|
||||||
|
let suggestedPostInfoFrame = CGRect(origin: CGPoint(x: floor((params.width - suggestedPostInfoSize.width) * 0.5), y: 4.0), size: suggestedPostInfoSize)
|
||||||
|
suggestedPostInfoNode.frame = suggestedPostInfoFrame
|
||||||
|
} else if let suggestedPostInfoNode = strongSelf.suggestedPostInfoNode {
|
||||||
|
strongSelf.suggestedPostInfoNode = nil
|
||||||
|
suggestedPostInfoNode.removeFromSupernode()
|
||||||
|
}
|
||||||
|
|
||||||
strongSelf.messageAccessibilityArea.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
strongSelf.messageAccessibilityArea.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
||||||
strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
||||||
strongSelf.contextSourceNode.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
strongSelf.contextSourceNode.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
||||||
|
@ -2805,7 +2805,7 @@ public class ChatMessageBubbleItemNode: ChatMessageItemView, ChatMessagePreviewI
|
|||||||
actionButtonsFinalize = buttonsLayout
|
actionButtonsFinalize = buttonsLayout
|
||||||
|
|
||||||
lastNodeTopPosition = .None(.Both)
|
lastNodeTopPosition = .None(.Both)
|
||||||
} else if incoming, /*let channel = item.message.peers[item.message.id.peerId] as? TelegramChannel, channel.isMonoForum, let linkedMonoforumId = channel.linkedMonoforumId, let mainChannel = item.message.peers[linkedMonoforumId] as? TelegramChannel, mainChannel.hasPermission(.manageDirect),*/ let attribute = item.message.attributes.first(where: { $0 is SuggestedPostMessageAttribute }) as? SuggestedPostMessageAttribute, attribute.state == nil {
|
} else if incoming, let attribute = item.message.attributes.first(where: { $0 is SuggestedPostMessageAttribute }) as? SuggestedPostMessageAttribute, attribute.state == nil {
|
||||||
//TODO:localize
|
//TODO:localize
|
||||||
var buttonDeclineValue: UInt8 = 0
|
var buttonDeclineValue: UInt8 = 0
|
||||||
let buttonDecline = MemoryBuffer(data: Data(bytes: &buttonDeclineValue, count: 1))
|
let buttonDecline = MemoryBuffer(data: Data(bytes: &buttonDeclineValue, count: 1))
|
||||||
|
@ -38,6 +38,7 @@ swift_library(
|
|||||||
"//submodules/TelegramUI/Components/Chat/ChatMessageActionButtonsNode",
|
"//submodules/TelegramUI/Components/Chat/ChatMessageActionButtonsNode",
|
||||||
"//submodules/TelegramUI/Components/Chat/ChatMessageReactionsFooterContentNode",
|
"//submodules/TelegramUI/Components/Chat/ChatMessageReactionsFooterContentNode",
|
||||||
"//submodules/TelegramUI/Components/Chat/ChatSwipeToReplyRecognizer",
|
"//submodules/TelegramUI/Components/Chat/ChatSwipeToReplyRecognizer",
|
||||||
|
"//submodules/TelegramUI/Components/Chat/ChatMessageSuggestedPostInfoNode",
|
||||||
],
|
],
|
||||||
visibility = [
|
visibility = [
|
||||||
"//visibility:public",
|
"//visibility:public",
|
||||||
|
@ -28,6 +28,7 @@ import ChatMessageThreadInfoNode
|
|||||||
import ChatMessageActionButtonsNode
|
import ChatMessageActionButtonsNode
|
||||||
import ChatMessageReactionsFooterContentNode
|
import ChatMessageReactionsFooterContentNode
|
||||||
import ChatSwipeToReplyRecognizer
|
import ChatSwipeToReplyRecognizer
|
||||||
|
import ChatMessageSuggestedPostInfoNode
|
||||||
|
|
||||||
private let nameFont = Font.medium(14.0)
|
private let nameFont = Font.medium(14.0)
|
||||||
private let inlineBotPrefixFont = Font.regular(14.0)
|
private let inlineBotPrefixFont = Font.regular(14.0)
|
||||||
@ -51,6 +52,8 @@ public class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
public var telegramFile: TelegramMediaFile?
|
public var telegramFile: TelegramMediaFile?
|
||||||
private let fetchDisposable = MetaDisposable()
|
private let fetchDisposable = MetaDisposable()
|
||||||
|
|
||||||
|
private var suggestedPostInfoNode: ChatMessageSuggestedPostInfoNode?
|
||||||
|
|
||||||
private var viaBotNode: TextNode?
|
private var viaBotNode: TextNode?
|
||||||
private let dateAndStatusNode: ChatMessageDateAndStatusNode
|
private let dateAndStatusNode: ChatMessageDateAndStatusNode
|
||||||
private var threadInfoNode: ChatMessageThreadInfoNode?
|
private var threadInfoNode: ChatMessageThreadInfoNode?
|
||||||
@ -435,6 +438,8 @@ public class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
let currentShareButtonNode = self.shareButtonNode
|
let currentShareButtonNode = self.shareButtonNode
|
||||||
let currentForwardInfo = self.appliedForwardInfo
|
let currentForwardInfo = self.appliedForwardInfo
|
||||||
|
|
||||||
|
let makeSuggestedPostInfoNodeLayout: ChatMessageSuggestedPostInfoNode.AsyncLayout = ChatMessageSuggestedPostInfoNode.asyncLayout(self.suggestedPostInfoNode)
|
||||||
|
|
||||||
func continueAsyncLayout(_ weakSelf: Weak<ChatMessageStickerItemNode>, _ item: ChatMessageItem, _ params: ListViewItemLayoutParams, _ mergedTop: ChatMessageMerge, _ mergedBottom: ChatMessageMerge, _ dateHeaderAtBottom: ChatMessageHeaderSpec) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation, ListViewItemApply, Bool) -> Void) {
|
func continueAsyncLayout(_ weakSelf: Weak<ChatMessageStickerItemNode>, _ item: ChatMessageItem, _ params: ListViewItemLayoutParams, _ mergedTop: ChatMessageMerge, _ mergedBottom: ChatMessageMerge, _ dateHeaderAtBottom: ChatMessageHeaderSpec) -> (ListViewItemNodeLayout, (ListViewItemUpdateAnimation, ListViewItemApply, Bool) -> Void) {
|
||||||
let accessibilityData = ChatMessageAccessibilityData(item: item, isSelected: nil)
|
let accessibilityData = ChatMessageAccessibilityData(item: item, isSelected: nil)
|
||||||
|
|
||||||
@ -591,7 +596,7 @@ public class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
|
|
||||||
let innerImageInset: CGFloat = 10.0
|
let innerImageInset: CGFloat = 10.0
|
||||||
let innerImageSize = CGSize(width: imageSize.width + innerImageInset * 2.0, height: imageSize.height + innerImageInset * 2.0)
|
let innerImageSize = CGSize(width: imageSize.width + innerImageInset * 2.0, height: imageSize.height + innerImageInset * 2.0)
|
||||||
let imageFrame = CGRect(origin: CGPoint(x: 0.0 + (incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + avatarInset + layoutConstants.bubble.contentInsets.left) : (params.width - params.rightInset - innerImageSize.width - layoutConstants.bubble.edgeInset - layoutConstants.bubble.contentInsets.left - deliveryFailedInset)), y: -innerImageInset), size: innerImageSize)
|
var imageFrame = CGRect(origin: CGPoint(x: 0.0 + (incoming ? (params.leftInset + layoutConstants.bubble.edgeInset + avatarInset + layoutConstants.bubble.contentInsets.left) : (params.width - params.rightInset - innerImageSize.width - layoutConstants.bubble.edgeInset - layoutConstants.bubble.contentInsets.left - deliveryFailedInset)), y: -innerImageInset), size: innerImageSize)
|
||||||
|
|
||||||
let arguments = TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(top: innerImageInset, left: innerImageInset, bottom: innerImageInset, right: innerImageInset))
|
let arguments = TransformImageArguments(corners: ImageCorners(), imageSize: imageSize, boundingSize: imageSize, intrinsicInsets: UIEdgeInsets(top: innerImageInset, left: innerImageInset, bottom: innerImageInset, right: innerImageInset))
|
||||||
|
|
||||||
@ -848,6 +853,42 @@ public class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
let (minWidth, buttonsLayout) = actionButtonsLayout(item.context, item.presentationData.theme, item.presentationData.chatBubbleCorners, item.presentationData.strings, item.controllerInteraction.presentationContext.backgroundNode, replyMarkup, [:], item.message, maxContentWidth)
|
let (minWidth, buttonsLayout) = actionButtonsLayout(item.context, item.presentationData.theme, item.presentationData.chatBubbleCorners, item.presentationData.strings, item.controllerInteraction.presentationContext.backgroundNode, replyMarkup, [:], item.message, maxContentWidth)
|
||||||
maxContentWidth = max(maxContentWidth, minWidth)
|
maxContentWidth = max(maxContentWidth, minWidth)
|
||||||
actionButtonsFinalize = buttonsLayout
|
actionButtonsFinalize = buttonsLayout
|
||||||
|
} else if incoming, let attribute = item.message.attributes.first(where: { $0 is SuggestedPostMessageAttribute }) as? SuggestedPostMessageAttribute, attribute.state == nil {
|
||||||
|
//TODO:localize
|
||||||
|
var buttonDeclineValue: UInt8 = 0
|
||||||
|
let buttonDecline = MemoryBuffer(data: Data(bytes: &buttonDeclineValue, count: 1))
|
||||||
|
var buttonApproveValue: UInt8 = 1
|
||||||
|
let buttonApprove = MemoryBuffer(data: Data(bytes: &buttonApproveValue, count: 1))
|
||||||
|
var buttonSuggestChangesValue: UInt8 = 2
|
||||||
|
let buttonSuggestChanges = MemoryBuffer(data: Data(bytes: &buttonSuggestChangesValue, count: 1))
|
||||||
|
|
||||||
|
let customIcons: [MemoryBuffer: ChatMessageActionButtonsNode.CustomIcon] = [
|
||||||
|
buttonDecline: .suggestedPostReject,
|
||||||
|
buttonApprove: .suggestedPostApprove,
|
||||||
|
buttonSuggestChanges: .suggestedPostEdit
|
||||||
|
]
|
||||||
|
|
||||||
|
let (minWidth, buttonsLayout) = actionButtonsLayout(
|
||||||
|
item.context,
|
||||||
|
item.presentationData.theme,
|
||||||
|
item.presentationData.chatBubbleCorners,
|
||||||
|
item.presentationData.strings,
|
||||||
|
item.controllerInteraction.presentationContext.backgroundNode,
|
||||||
|
ReplyMarkupMessageAttribute(
|
||||||
|
rows: [
|
||||||
|
ReplyMarkupRow(buttons: [
|
||||||
|
ReplyMarkupButton(title: "Decline", titleWhenForwarded: nil, action: .callback(requiresPassword: false, data: buttonDecline)),
|
||||||
|
ReplyMarkupButton(title: "Approve", titleWhenForwarded: nil, action: .callback(requiresPassword: false, data: buttonApprove))
|
||||||
|
]),
|
||||||
|
ReplyMarkupRow(buttons: [
|
||||||
|
ReplyMarkupButton(title: "Suggest Changes", titleWhenForwarded: nil, action: .callback(requiresPassword: false, data: buttonSuggestChanges))
|
||||||
|
])
|
||||||
|
],
|
||||||
|
flags: [],
|
||||||
|
placeholder: nil
|
||||||
|
), customIcons, item.message, maxContentWidth)
|
||||||
|
maxContentWidth = max(maxContentWidth, minWidth)
|
||||||
|
actionButtonsFinalize = buttonsLayout
|
||||||
}
|
}
|
||||||
|
|
||||||
var actionButtonsSizeAndApply: (CGSize, (ListViewItemUpdateAnimation) -> ChatMessageActionButtonsNode)?
|
var actionButtonsSizeAndApply: (CGSize, (ListViewItemUpdateAnimation) -> ChatMessageActionButtonsNode)?
|
||||||
@ -901,6 +942,22 @@ public class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
layoutSize.height += actionButtonsSizeAndApply.0.height
|
layoutSize.height += actionButtonsSizeAndApply.0.height
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let baseWidth = params.width - params.leftInset - params.rightInset
|
||||||
|
var suggestedPostInfoNodeLayout: (CGSize, () -> ChatMessageSuggestedPostInfoNode)?
|
||||||
|
for attribute in item.message.attributes {
|
||||||
|
if let _ = attribute as? SuggestedPostMessageAttribute {
|
||||||
|
let suggestedPostInfoNodeLayoutValue = makeSuggestedPostInfoNodeLayout(item, baseWidth)
|
||||||
|
suggestedPostInfoNodeLayout = suggestedPostInfoNodeLayoutValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var additionalTopHeight: CGFloat = 0.0
|
||||||
|
if let suggestedPostInfoNodeLayout {
|
||||||
|
additionalTopHeight += 4.0 + suggestedPostInfoNodeLayout.0.height + 8.0
|
||||||
|
}
|
||||||
|
layoutSize.height += additionalTopHeight
|
||||||
|
imageFrame.origin.y += additionalTopHeight
|
||||||
|
|
||||||
var updatedImageFrame = imageFrame.offsetBy(dx: 0.0, dy: floor((contentHeight - imageSize.height) / 2.0))
|
var updatedImageFrame = imageFrame.offsetBy(dx: 0.0, dy: floor((contentHeight - imageSize.height) / 2.0))
|
||||||
|
|
||||||
var dateOffset = CGPoint(x: dateAndStatusSize.width + 4.0, y: dateAndStatusSize.height + 16.0)
|
var dateOffset = CGPoint(x: dateAndStatusSize.width + 4.0, y: dateAndStatusSize.height + 16.0)
|
||||||
@ -1002,6 +1059,20 @@ public class ChatMessageStickerItemNode: ChatMessageItemView {
|
|||||||
animation.animator.updateFrame(layer: strongSelf.placeholderNode.layer, frame: placeholderFrame, completion: nil)
|
animation.animator.updateFrame(layer: strongSelf.placeholderNode.layer, frame: placeholderFrame, completion: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if let (suggestedPostInfoSize, suggestedPostInfoApply) = suggestedPostInfoNodeLayout {
|
||||||
|
let suggestedPostInfoNode = suggestedPostInfoApply()
|
||||||
|
if suggestedPostInfoNode !== strongSelf.suggestedPostInfoNode {
|
||||||
|
strongSelf.suggestedPostInfoNode?.removeFromSupernode()
|
||||||
|
strongSelf.suggestedPostInfoNode = suggestedPostInfoNode
|
||||||
|
strongSelf.addSubnode(suggestedPostInfoNode)
|
||||||
|
}
|
||||||
|
let suggestedPostInfoFrame = CGRect(origin: CGPoint(x: floor((params.width - suggestedPostInfoSize.width) * 0.5), y: 4.0), size: suggestedPostInfoSize)
|
||||||
|
suggestedPostInfoNode.frame = suggestedPostInfoFrame
|
||||||
|
} else if let suggestedPostInfoNode = strongSelf.suggestedPostInfoNode {
|
||||||
|
strongSelf.suggestedPostInfoNode = nil
|
||||||
|
suggestedPostInfoNode.removeFromSupernode()
|
||||||
|
}
|
||||||
|
|
||||||
strongSelf.messageAccessibilityArea.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
strongSelf.messageAccessibilityArea.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
||||||
strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
strongSelf.containerNode.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
||||||
strongSelf.contextSourceNode.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
strongSelf.contextSourceNode.frame = CGRect(origin: CGPoint(), size: layoutSize)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user