mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-12-23 06:35:51 +00:00
Update API
This commit is contained in:
@@ -7,6 +7,7 @@ import TelegramCore
|
||||
import SyncCore
|
||||
import TelegramPresentationData
|
||||
import LocalizedPeerData
|
||||
import TelegramStringFormatting
|
||||
|
||||
private enum ChatReportPeerTitleButton: Equatable {
|
||||
case block
|
||||
@@ -179,6 +180,102 @@ private final class ChatInfoTitlePanelInviteInfoNode: ASDisplayNode {
|
||||
}
|
||||
}
|
||||
|
||||
private final class ChatInfoTitlePanelPeerNearbyInfoNode: ASDisplayNode {
|
||||
private var theme: PresentationTheme?
|
||||
|
||||
private let labelNode: ImmediateTextNode
|
||||
private let filledBackgroundNode: LinkHighlightingNode
|
||||
|
||||
init(openPeer: @escaping () -> Void) {
|
||||
self.labelNode = ImmediateTextNode()
|
||||
self.labelNode.maximumNumberOfLines = 1
|
||||
self.labelNode.textAlignment = .center
|
||||
|
||||
self.filledBackgroundNode = LinkHighlightingNode(color: .clear)
|
||||
|
||||
super.init()
|
||||
|
||||
self.addSubnode(self.filledBackgroundNode)
|
||||
self.addSubnode(self.labelNode)
|
||||
|
||||
self.labelNode.highlightAttributeAction = { attributes in
|
||||
for (key, _) in attributes {
|
||||
if key.rawValue == "_Link" {
|
||||
return key
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
self.labelNode.tapAttributeAction = { attributes, _ in
|
||||
for (key, _) in attributes {
|
||||
if key.rawValue == "_Link" {
|
||||
openPeer()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func update(width: CGFloat, theme: PresentationTheme, strings: PresentationStrings, wallpaper: TelegramWallpaper, chatPeer: Peer, distance: Int32, transition: ContainedViewLayoutTransition) -> CGFloat {
|
||||
let primaryTextColor = serviceMessageColorComponents(theme: theme, wallpaper: wallpaper).primaryText
|
||||
|
||||
if self.theme !== theme {
|
||||
self.theme = theme
|
||||
|
||||
self.labelNode.linkHighlightColor = primaryTextColor.withAlphaComponent(0.3)
|
||||
}
|
||||
|
||||
let topInset: CGFloat = 6.0
|
||||
let bottomInset: CGFloat = 6.0
|
||||
let sideInset: CGFloat = 16.0
|
||||
|
||||
let stringAndRanges = strings.Conversation_PeerNearbyDistance(chatPeer.compactDisplayTitle, shortStringForDistance(strings: strings, distance: distance))
|
||||
|
||||
let attributedString = NSMutableAttributedString(string: stringAndRanges.0, font: Font.regular(13.0), textColor: primaryTextColor)
|
||||
|
||||
let boldAttributes = [NSAttributedString.Key.font: Font.semibold(13.0), NSAttributedString.Key(rawValue: "_Link"): true as NSNumber]
|
||||
for (_, range) in stringAndRanges.1 {
|
||||
attributedString.addAttributes(boldAttributes, range: range)
|
||||
}
|
||||
|
||||
self.labelNode.attributedText = attributedString
|
||||
let labelLayout = self.labelNode.updateLayoutFullInfo(CGSize(width: width - sideInset * 2.0, height: CGFloat.greatestFiniteMagnitude))
|
||||
|
||||
var labelRects = labelLayout.linesRects()
|
||||
if labelRects.count > 1 {
|
||||
let sortedIndices = (0 ..< labelRects.count).sorted(by: { labelRects[$0].width > labelRects[$1].width })
|
||||
for i in 0 ..< sortedIndices.count {
|
||||
let index = sortedIndices[i]
|
||||
for j in -1 ... 1 {
|
||||
if j != 0 && index + j >= 0 && index + j < sortedIndices.count {
|
||||
if abs(labelRects[index + j].width - labelRects[index].width) < 40.0 {
|
||||
labelRects[index + j].size.width = max(labelRects[index + j].width, labelRects[index].width)
|
||||
labelRects[index].size.width = labelRects[index + j].size.width
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
for i in 0 ..< labelRects.count {
|
||||
labelRects[i] = labelRects[i].insetBy(dx: -6.0, dy: floor((labelRects[i].height - 20.0) / 2.0))
|
||||
labelRects[i].size.height = 20.0
|
||||
labelRects[i].origin.x = floor((labelLayout.size.width - labelRects[i].width) / 2.0)
|
||||
}
|
||||
|
||||
let backgroundLayout = self.filledBackgroundNode.asyncLayout()
|
||||
let serviceColor = serviceMessageColorComponents(theme: theme, wallpaper: wallpaper)
|
||||
let backgroundApply = backgroundLayout(serviceColor.fill, labelRects, 10.0, 10.0, 0.0)
|
||||
backgroundApply()
|
||||
|
||||
let backgroundSize = CGSize(width: labelLayout.size.width + 8.0 + 8.0, height: labelLayout.size.height + 4.0)
|
||||
|
||||
let labelFrame = CGRect(origin: CGPoint(x: floor((width - labelLayout.size.width) / 2.0), y: topInset + floorToScreenPixels((backgroundSize.height - labelLayout.size.height) / 2.0) - 1.0), size: labelLayout.size)
|
||||
self.labelNode.frame = labelFrame
|
||||
self.filledBackgroundNode.frame = labelFrame.offsetBy(dx: 0.0, dy: -11.0)
|
||||
|
||||
return topInset + backgroundSize.height + bottomInset
|
||||
}
|
||||
}
|
||||
|
||||
final class ChatReportPeerTitlePanelNode: ChatTitleAccessoryPanelNode {
|
||||
private let backgroundNode: ASDisplayNode
|
||||
private let separatorNode: ASDisplayNode
|
||||
@@ -189,6 +286,7 @@ final class ChatReportPeerTitlePanelNode: ChatTitleAccessoryPanelNode {
|
||||
private var theme: PresentationTheme?
|
||||
|
||||
private var inviteInfoNode: ChatInfoTitlePanelInviteInfoNode?
|
||||
private var peerNearbyInfoNode: ChatInfoTitlePanelPeerNearbyInfoNode?
|
||||
|
||||
override init() {
|
||||
self.backgroundNode = ASDisplayNode()
|
||||
@@ -333,6 +431,34 @@ final class ChatReportPeerTitlePanelNode: ChatTitleAccessoryPanelNode {
|
||||
})
|
||||
}
|
||||
|
||||
if let chatPeer = chatPeer, let distance = interfaceState.contactStatus?.peerStatusSettings?.geoDistance {
|
||||
var peerNearbyInfoTransition = transition
|
||||
let peerNearbyInfoNode: ChatInfoTitlePanelPeerNearbyInfoNode
|
||||
if let current = self.peerNearbyInfoNode {
|
||||
peerNearbyInfoNode = current
|
||||
} else {
|
||||
peerNearbyInfoTransition = .immediate
|
||||
peerNearbyInfoNode = ChatInfoTitlePanelPeerNearbyInfoNode(openPeer: { [weak self] in
|
||||
self?.interfaceInteraction?.navigateToProfile(chatPeer.id)
|
||||
})
|
||||
self.addSubnode(peerNearbyInfoNode)
|
||||
self.peerNearbyInfoNode = peerNearbyInfoNode
|
||||
peerNearbyInfoNode.alpha = 0.0
|
||||
transition.updateAlpha(node: peerNearbyInfoNode, alpha: 1.0)
|
||||
}
|
||||
|
||||
if let peerNearbyInfoNode = self.peerNearbyInfoNode {
|
||||
let peerNearbyHeight = peerNearbyInfoNode.update(width: width, theme: interfaceState.theme, strings: interfaceState.strings, wallpaper: interfaceState.chatWallpaper, chatPeer: chatPeer, distance: distance, transition: peerNearbyInfoTransition)
|
||||
peerNearbyInfoTransition.updateFrame(node: peerNearbyInfoNode, frame: CGRect(origin: CGPoint(x: 0.0, y: panelHeight), size: CGSize(width: width, height: peerNearbyHeight)))
|
||||
panelHeight += peerNearbyHeight
|
||||
}
|
||||
} else if let peerNearbyInfoNode = self.peerNearbyInfoNode {
|
||||
self.peerNearbyInfoNode = nil
|
||||
transition.updateAlpha(node: peerNearbyInfoNode, alpha: 0.0, completion: { [weak peerNearbyInfoNode] _ in
|
||||
peerNearbyInfoNode?.removeFromSupernode()
|
||||
})
|
||||
}
|
||||
|
||||
return panelHeight
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user