mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-06-16 05:55:20 +00:00
Various improvements
This commit is contained in:
parent
1f7685b9fb
commit
1203c589bf
@ -239,7 +239,11 @@ final class ChatListTitleView: UIView, NavigationBarTitleView, NavigationBarTitl
|
|||||||
titleContentRect.origin.x = min(titleContentRect.origin.x, clearBounds.maxX - proxyPadding - titleContentRect.width)
|
titleContentRect.origin.x = min(titleContentRect.origin.x, clearBounds.maxX - proxyPadding - titleContentRect.width)
|
||||||
|
|
||||||
let titleFrame = titleContentRect
|
let titleFrame = titleContentRect
|
||||||
transition.updateFrame(node: self.titleNode, frame: titleFrame)
|
var titleTransition = transition
|
||||||
|
if self.titleNode.frame.size != titleFrame.size {
|
||||||
|
titleTransition = .immediate
|
||||||
|
}
|
||||||
|
titleTransition.updateFrame(node: self.titleNode, frame: titleFrame)
|
||||||
|
|
||||||
let proxyFrame = CGRect(origin: CGPoint(x: clearBounds.maxX - 9.0 - self.proxyNode.bounds.width, y: floor((size.height - self.proxyNode.bounds.height) / 2.0)), size: self.proxyNode.bounds.size)
|
let proxyFrame = CGRect(origin: CGPoint(x: clearBounds.maxX - 9.0 - self.proxyNode.bounds.width, y: floor((size.height - self.proxyNode.bounds.height) / 2.0)), size: self.proxyNode.bounds.size)
|
||||||
self.proxyNode.frame = proxyFrame
|
self.proxyNode.frame = proxyFrame
|
||||||
|
@ -191,7 +191,7 @@ private let ungroupIcon = ItemListRevealOptionIcon.animation(animation: "anim_un
|
|||||||
private let readIcon = ItemListRevealOptionIcon.animation(animation: "anim_read", scale: 1.0, offset: 0.0, replaceColors: nil, flip: false)
|
private let readIcon = ItemListRevealOptionIcon.animation(animation: "anim_read", scale: 1.0, offset: 0.0, replaceColors: nil, flip: false)
|
||||||
private let unreadIcon = ItemListRevealOptionIcon.animation(animation: "anim_unread", scale: 1.0, offset: 0.0, replaceColors: [0x2194fa], flip: false)
|
private let unreadIcon = ItemListRevealOptionIcon.animation(animation: "anim_unread", scale: 1.0, offset: 0.0, replaceColors: [0x2194fa], flip: false)
|
||||||
private let archiveIcon = ItemListRevealOptionIcon.animation(animation: "anim_archive", scale: 1.0, offset: 2.0, replaceColors: [0xa9a9ad], flip: false)
|
private let archiveIcon = ItemListRevealOptionIcon.animation(animation: "anim_archive", scale: 1.0, offset: 2.0, replaceColors: [0xa9a9ad], flip: false)
|
||||||
private let unarchiveIcon = ItemListRevealOptionIcon.animation(animation: "anim_unarchive", scale: 0.486, offset: -9.0, replaceColors: [0xa9a9ad], flip: false)
|
private let unarchiveIcon = ItemListRevealOptionIcon.animation(animation: "anim_unarchive", scale: 0.642, offset: -9.0, replaceColors: [0xa9a9ad], flip: false)
|
||||||
private let hideIcon = ItemListRevealOptionIcon.animation(animation: "anim_hide", scale: 1.0, offset: 2.0, replaceColors: [0xbdbdc2], flip: false)
|
private let hideIcon = ItemListRevealOptionIcon.animation(animation: "anim_hide", scale: 1.0, offset: 2.0, replaceColors: [0xbdbdc2], flip: false)
|
||||||
private let unhideIcon = ItemListRevealOptionIcon.animation(animation: "anim_hide", scale: 1.0, offset: -20.0, replaceColors: [0xbdbdc2], flip: true)
|
private let unhideIcon = ItemListRevealOptionIcon.animation(animation: "anim_hide", scale: 1.0, offset: -20.0, replaceColors: [0xbdbdc2], flip: true)
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ final class PeerInfoGroupsInCommonPaneNode: ASDisplayNode, PeerInfoPaneNode {
|
|||||||
return self.groupsInCommonContext.state
|
return self.groupsInCommonContext.state
|
||||||
|> map { state in
|
|> map { state in
|
||||||
if let count = state.count {
|
if let count = state.count {
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_CommonGroupCount(Int32(count)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_CommonGroupCount(Int32(count)), isActivity: false, key: .groupsInCommon)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -153,13 +153,13 @@ final class PeerInfoListPaneNode: ASDisplayNode, PeerInfoPaneNode {
|
|||||||
|
|
||||||
switch tagMask {
|
switch tagMask {
|
||||||
case MessageTags.file:
|
case MessageTags.file:
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_FileCount(Int32(count)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_FileCount(Int32(count)), isActivity: false, key: .files)
|
||||||
case MessageTags.music:
|
case MessageTags.music:
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_MusicCount(Int32(count)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_MusicCount(Int32(count)), isActivity: false, key: .music)
|
||||||
case MessageTags.voiceOrInstantVideo:
|
case MessageTags.voiceOrInstantVideo:
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_VoiceMessageCount(Int32(count)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_VoiceMessageCount(Int32(count)), isActivity: false, key: .voice)
|
||||||
case MessageTags.webPage:
|
case MessageTags.webPage:
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_LinkCount(Int32(count)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_LinkCount(Int32(count)), isActivity: false, key: .links)
|
||||||
default:
|
default:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -2052,11 +2052,11 @@ final class PeerInfoVisualMediaPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScro
|
|||||||
let videoCount: Int32 = dict[.video] ?? 0
|
let videoCount: Int32 = dict[.video] ?? 0
|
||||||
|
|
||||||
if photoCount != 0 && videoCount != 0 {
|
if photoCount != 0 && videoCount != 0 {
|
||||||
return PeerInfoStatusData(text: "\(presentationData.strings.SharedMedia_PhotoCount(Int32(photoCount))), \(presentationData.strings.SharedMedia_VideoCount(Int32(videoCount)))", isActivity: false)
|
return PeerInfoStatusData(text: "\(presentationData.strings.SharedMedia_PhotoCount(Int32(photoCount))), \(presentationData.strings.SharedMedia_VideoCount(Int32(videoCount)))", isActivity: false, key: .media)
|
||||||
} else if photoCount != 0 {
|
} else if photoCount != 0 {
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_PhotoCount(Int32(photoCount)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_PhotoCount(Int32(photoCount)), isActivity: false, key: .media)
|
||||||
} else if videoCount != 0 {
|
} else if videoCount != 0 {
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_VideoCount(Int32(videoCount)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_VideoCount(Int32(videoCount)), isActivity: false, key: .media)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -2064,7 +2064,7 @@ final class PeerInfoVisualMediaPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScro
|
|||||||
let photoCount: Int32 = dict[.photo] ?? 0
|
let photoCount: Int32 = dict[.photo] ?? 0
|
||||||
|
|
||||||
if photoCount != 0 {
|
if photoCount != 0 {
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_PhotoCount(Int32(photoCount)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_PhotoCount(Int32(photoCount)), isActivity: false, key: .media)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -2072,7 +2072,7 @@ final class PeerInfoVisualMediaPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScro
|
|||||||
let videoCount: Int32 = dict[.video] ?? 0
|
let videoCount: Int32 = dict[.video] ?? 0
|
||||||
|
|
||||||
if videoCount != 0 {
|
if videoCount != 0 {
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_VideoCount(Int32(videoCount)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_VideoCount(Int32(videoCount)), isActivity: false, key: .media)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -2080,7 +2080,7 @@ final class PeerInfoVisualMediaPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScro
|
|||||||
let gifCount: Int32 = dict[.gif] ?? 0
|
let gifCount: Int32 = dict[.gif] ?? 0
|
||||||
|
|
||||||
if gifCount != 0 {
|
if gifCount != 0 {
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_GifCount(Int32(gifCount)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_GifCount(Int32(gifCount)), isActivity: false, key: .gifs)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -2088,7 +2088,7 @@ final class PeerInfoVisualMediaPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScro
|
|||||||
let fileCount: Int32 = dict[.file] ?? 0
|
let fileCount: Int32 = dict[.file] ?? 0
|
||||||
|
|
||||||
if fileCount != 0 {
|
if fileCount != 0 {
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_FileCount(Int32(fileCount)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_FileCount(Int32(fileCount)), isActivity: false, key: .files)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -2096,7 +2096,7 @@ final class PeerInfoVisualMediaPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScro
|
|||||||
let itemCount: Int32 = dict[.voiceOrInstantVideo] ?? 0
|
let itemCount: Int32 = dict[.voiceOrInstantVideo] ?? 0
|
||||||
|
|
||||||
if itemCount != 0 {
|
if itemCount != 0 {
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_VoiceMessageCount(Int32(itemCount)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_VoiceMessageCount(Int32(itemCount)), isActivity: false, key: .voice)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -2104,7 +2104,7 @@ final class PeerInfoVisualMediaPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScro
|
|||||||
let itemCount: Int32 = dict[.music] ?? 0
|
let itemCount: Int32 = dict[.music] ?? 0
|
||||||
|
|
||||||
if itemCount != 0 {
|
if itemCount != 0 {
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_MusicCount(Int32(itemCount)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_MusicCount(Int32(itemCount)), isActivity: false, key: .music)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -296,6 +296,7 @@ private func peerInfoAvailableMediaPanes(context: AccountContext, peerId: PeerId
|
|||||||
struct PeerInfoStatusData: Equatable {
|
struct PeerInfoStatusData: Equatable {
|
||||||
var text: String
|
var text: String
|
||||||
var isActivity: Bool
|
var isActivity: Bool
|
||||||
|
var key: PeerInfoPaneKey?
|
||||||
}
|
}
|
||||||
|
|
||||||
enum PeerInfoMembersData: Equatable {
|
enum PeerInfoMembersData: Equatable {
|
||||||
@ -498,7 +499,7 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
|
|||||||
if let presence = manager.currentValue {
|
if let presence = manager.currentValue {
|
||||||
let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970
|
let timestamp = CFAbsoluteTimeGetCurrent() + NSTimeIntervalSince1970
|
||||||
let (text, isActivity) = stringAndActivityForUserPresence(strings: strings, dateTimeFormat: dateTimeFormat, presence: EnginePeer.Presence(presence), relativeTo: Int32(timestamp), expanded: true)
|
let (text, isActivity) = stringAndActivityForUserPresence(strings: strings, dateTimeFormat: dateTimeFormat, presence: EnginePeer.Presence(presence), relativeTo: Int32(timestamp), expanded: true)
|
||||||
return PeerInfoStatusData(text: text, isActivity: isActivity)
|
return PeerInfoStatusData(text: text, isActivity: isActivity, key: nil)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -530,9 +531,9 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
|
|||||||
|> distinctUntilChanged).start(next: { inputData in
|
|> distinctUntilChanged).start(next: { inputData in
|
||||||
switch inputData {
|
switch inputData {
|
||||||
case .bot:
|
case .bot:
|
||||||
subscriber.putNext(PeerInfoStatusData(text: strings.Bot_GenericBotStatus, isActivity: false))
|
subscriber.putNext(PeerInfoStatusData(text: strings.Bot_GenericBotStatus, isActivity: false, key: nil))
|
||||||
case .support:
|
case .support:
|
||||||
subscriber.putNext(PeerInfoStatusData(text: strings.Bot_GenericSupportStatus, isActivity: false))
|
subscriber.putNext(PeerInfoStatusData(text: strings.Bot_GenericSupportStatus, isActivity: false, key: nil))
|
||||||
default:
|
default:
|
||||||
var presence: TelegramUserPresence?
|
var presence: TelegramUserPresence?
|
||||||
if case let .presence(value) = inputData {
|
if case let .presence(value) = inputData {
|
||||||
@ -621,12 +622,12 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
|
|||||||
let status = context.account.viewTracker.peerView(peerId, updateData: false)
|
let status = context.account.viewTracker.peerView(peerId, updateData: false)
|
||||||
|> map { peerView -> PeerInfoStatusData? in
|
|> map { peerView -> PeerInfoStatusData? in
|
||||||
guard let _ = peerView.peers[peerId] as? TelegramChannel else {
|
guard let _ = peerView.peers[peerId] as? TelegramChannel else {
|
||||||
return PeerInfoStatusData(text: strings.Channel_Status, isActivity: false)
|
return PeerInfoStatusData(text: strings.Channel_Status, isActivity: false, key: nil)
|
||||||
}
|
}
|
||||||
if let cachedChannelData = peerView.cachedData as? CachedChannelData, let memberCount = cachedChannelData.participantsSummary.memberCount, memberCount != 0 {
|
if let cachedChannelData = peerView.cachedData as? CachedChannelData, let memberCount = cachedChannelData.participantsSummary.memberCount, memberCount != 0 {
|
||||||
return PeerInfoStatusData(text: strings.Conversation_StatusSubscribers(memberCount), isActivity: false)
|
return PeerInfoStatusData(text: strings.Conversation_StatusSubscribers(memberCount), isActivity: false, key: nil)
|
||||||
} else {
|
} else {
|
||||||
return PeerInfoStatusData(text: strings.Channel_Status, isActivity: false)
|
return PeerInfoStatusData(text: strings.Channel_Status, isActivity: false, key: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|> distinctUntilChanged
|
|> distinctUntilChanged
|
||||||
@ -747,9 +748,9 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
|
|||||||
|
|
||||||
string.append("\(strings.Conversation_StatusMembers(Int32(memberCount))), ")
|
string.append("\(strings.Conversation_StatusMembers(Int32(memberCount))), ")
|
||||||
string.append(strings.Conversation_StatusOnline(Int32(onlineMemberCount)))
|
string.append(strings.Conversation_StatusOnline(Int32(onlineMemberCount)))
|
||||||
return PeerInfoStatusData(text: string, isActivity: false)
|
return PeerInfoStatusData(text: string, isActivity: false, key: nil)
|
||||||
} else if memberCount > 0 {
|
} else if memberCount > 0 {
|
||||||
return PeerInfoStatusData(text: strings.Conversation_StatusMembers(Int32(memberCount)), isActivity: false)
|
return PeerInfoStatusData(text: strings.Conversation_StatusMembers(Int32(memberCount)), isActivity: false, key: nil)
|
||||||
}
|
}
|
||||||
} else if let group = peerView.peers[groupId] as? TelegramGroup, let cachedGroupData = peerView.cachedData as? CachedGroupData {
|
} else if let group = peerView.peers[groupId] as? TelegramGroup, let cachedGroupData = peerView.cachedData as? CachedGroupData {
|
||||||
var onlineCount = 0
|
var onlineCount = 0
|
||||||
@ -772,13 +773,13 @@ func peerInfoScreenData(context: AccountContext, peerId: PeerId, strings: Presen
|
|||||||
|
|
||||||
string.append("\(strings.Conversation_StatusMembers(Int32(group.participantCount))), ")
|
string.append("\(strings.Conversation_StatusMembers(Int32(group.participantCount))), ")
|
||||||
string.append(strings.Conversation_StatusOnline(Int32(onlineCount)))
|
string.append(strings.Conversation_StatusOnline(Int32(onlineCount)))
|
||||||
return PeerInfoStatusData(text: string, isActivity: false)
|
return PeerInfoStatusData(text: string, isActivity: false, key: nil)
|
||||||
} else {
|
} else {
|
||||||
return PeerInfoStatusData(text: strings.Conversation_StatusMembers(Int32(group.participantCount)), isActivity: false)
|
return PeerInfoStatusData(text: strings.Conversation_StatusMembers(Int32(group.participantCount)), isActivity: false, key: nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return PeerInfoStatusData(text: strings.Group_Status, isActivity: false)
|
return PeerInfoStatusData(text: strings.Group_Status, isActivity: false, key: nil)
|
||||||
}
|
}
|
||||||
|> distinctUntilChanged
|
|> distinctUntilChanged
|
||||||
|
|
||||||
|
@ -2233,12 +2233,16 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
self.avatarListNode.listContainerNode.updateEntryIsHidden(entry: entry)
|
self.avatarListNode.listContainerNode.updateEntryIsHidden(entry: entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
var initializedCredibilityIcon = false
|
private var initializedCredibilityIcon = false
|
||||||
func update(width: CGFloat, containerHeight: CGFloat, containerInset: CGFloat, statusBarHeight: CGFloat, navigationHeight: CGFloat, isModalOverlay: Bool, isMediaOnly: Bool, contentOffset: CGFloat, paneContainerY: CGFloat, presentationData: PresentationData, peer: Peer?, cachedData: CachedPeerData?, notificationSettings: TelegramPeerNotificationSettings?, statusData: PeerInfoStatusData?, panelStatusData: PeerInfoStatusData?, isSecretChat: Bool, isContact: Bool, isSettings: Bool, state: PeerInfoState, transition: ContainedViewLayoutTransition, additive: Bool) -> CGFloat {
|
private var currentPanelStatusData: PeerInfoStatusData?
|
||||||
|
func update(width: CGFloat, containerHeight: CGFloat, containerInset: CGFloat, statusBarHeight: CGFloat, navigationHeight: CGFloat, isModalOverlay: Bool, isMediaOnly: Bool, contentOffset: CGFloat, paneContainerY: CGFloat, presentationData: PresentationData, peer: Peer?, cachedData: CachedPeerData?, notificationSettings: TelegramPeerNotificationSettings?, statusData: PeerInfoStatusData?, panelStatusData: (PeerInfoStatusData?, PeerInfoStatusData?, CGFloat?), isSecretChat: Bool, isContact: Bool, isSettings: Bool, state: PeerInfoState, transition: ContainedViewLayoutTransition, additive: Bool) -> CGFloat {
|
||||||
self.state = state
|
self.state = state
|
||||||
self.peer = peer
|
self.peer = peer
|
||||||
self.avatarListNode.listContainerNode.peer = peer
|
self.avatarListNode.listContainerNode.peer = peer
|
||||||
|
|
||||||
|
let previousPanelStatusData = self.currentPanelStatusData
|
||||||
|
self.currentPanelStatusData = panelStatusData.0
|
||||||
|
|
||||||
let avatarSize: CGFloat = isModalOverlay ? 200.0 : 100.0
|
let avatarSize: CGFloat = isModalOverlay ? 200.0 : 100.0
|
||||||
self.avatarSize = avatarSize
|
self.avatarSize = avatarSize
|
||||||
|
|
||||||
@ -2388,13 +2392,9 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
title = " "
|
title = " "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// if self.isSettings {
|
|
||||||
titleString = NSAttributedString(string: title, font: Font.medium(29.0), textColor: presentationData.theme.list.itemPrimaryTextColor)
|
titleString = NSAttributedString(string: title, font: Font.medium(29.0), textColor: presentationData.theme.list.itemPrimaryTextColor)
|
||||||
smallTitleString = NSAttributedString(string: title, font: Font.semibold(28.0), textColor: .white)
|
smallTitleString = NSAttributedString(string: title, font: Font.semibold(28.0), textColor: .white)
|
||||||
// } else {
|
|
||||||
// titleString = NSAttributedString(string: title, font: Font.semibold(24.0), textColor: presentationData.theme.list.itemPrimaryTextColor)
|
|
||||||
// smallTitleString = titleString
|
|
||||||
// }
|
|
||||||
if self.isSettings, let user = peer as? TelegramUser {
|
if self.isSettings, let user = peer as? TelegramUser {
|
||||||
var subtitle = formatPhoneNumber(user.phone ?? "")
|
var subtitle = formatPhoneNumber(user.phone ?? "")
|
||||||
|
|
||||||
@ -2415,7 +2415,8 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
subtitleString = NSAttributedString(string: statusData.text, font: Font.regular(17.0), textColor: subtitleColor)
|
subtitleString = NSAttributedString(string: statusData.text, font: Font.regular(17.0), textColor: subtitleColor)
|
||||||
usernameString = NSAttributedString(string: "", font: Font.regular(15.0), textColor: presentationData.theme.list.itemSecondaryTextColor)
|
usernameString = NSAttributedString(string: "", font: Font.regular(15.0), textColor: presentationData.theme.list.itemSecondaryTextColor)
|
||||||
|
|
||||||
if let panelStatusData = panelStatusData {
|
let (maybePanelStatusData, _, _) = panelStatusData
|
||||||
|
if let panelStatusData = maybePanelStatusData {
|
||||||
let subtitleColor: UIColor
|
let subtitleColor: UIColor
|
||||||
if panelStatusData.isActivity {
|
if panelStatusData.isActivity {
|
||||||
subtitleColor = presentationData.theme.list.itemAccentColor
|
subtitleColor = presentationData.theme.list.itemAccentColor
|
||||||
@ -2453,7 +2454,23 @@ final class PeerInfoHeaderNode: ASDisplayNode {
|
|||||||
TitleNodeStateExpanded: MultiScaleTextState(attributedText: smallSubtitleString, constrainedSize: titleConstrainedSize)
|
TitleNodeStateExpanded: MultiScaleTextState(attributedText: smallSubtitleString, constrainedSize: titleConstrainedSize)
|
||||||
], mainState: TitleNodeStateRegular)
|
], mainState: TitleNodeStateRegular)
|
||||||
self.subtitleNode.accessibilityLabel = subtitleString.string
|
self.subtitleNode.accessibilityLabel = subtitleString.string
|
||||||
|
|
||||||
|
if let previousPanelStatusData = previousPanelStatusData, let currentPanelStatusData = panelStatusData.0, let previousPanelStatusDataKey = previousPanelStatusData.key, let currentPanelStatusDataKey = currentPanelStatusData.key, previousPanelStatusDataKey != currentPanelStatusDataKey {
|
||||||
|
if let snapshotView = self.panelSubtitleNode.view.snapshotContentTree() {
|
||||||
|
let direction: CGFloat = previousPanelStatusDataKey.rawValue > currentPanelStatusDataKey.rawValue ? 1.0 : -1.0
|
||||||
|
|
||||||
|
self.panelSubtitleNode.view.superview?.addSubview(snapshotView)
|
||||||
|
snapshotView.frame = self.panelSubtitleNode.frame
|
||||||
|
snapshotView.layer.animatePosition(from: CGPoint(), to: CGPoint(x: 100.0 * direction, y: 0.0), duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring, removeOnCompletion: false, additive: true, completion: { [weak snapshotView] _ in
|
||||||
|
snapshotView?.removeFromSuperview()
|
||||||
|
})
|
||||||
|
snapshotView.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.3, removeOnCompletion: false)
|
||||||
|
|
||||||
|
self.panelSubtitleNode.layer.animatePosition(from: CGPoint(x: 100.0 * direction * -1.0, y: 0.0), to: CGPoint(), duration: 0.4, timingFunction: kCAMediaTimingFunctionSpring, additive: true)
|
||||||
|
self.panelSubtitleNode.layer.animateAlpha(from: 0.0, to: 1.0, duration: 0.3)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let panelSubtitleNodeLayout = self.panelSubtitleNode.updateLayout(states: [
|
let panelSubtitleNodeLayout = self.panelSubtitleNode.updateLayout(states: [
|
||||||
TitleNodeStateRegular: MultiScaleTextState(attributedText: panelSubtitleString ?? subtitleString, constrainedSize: titleConstrainedSize),
|
TitleNodeStateRegular: MultiScaleTextState(attributedText: panelSubtitleString ?? subtitleString, constrainedSize: titleConstrainedSize),
|
||||||
TitleNodeStateExpanded: MultiScaleTextState(attributedText: panelSubtitleString ?? subtitleString, constrainedSize: titleConstrainedSize)
|
TitleNodeStateExpanded: MultiScaleTextState(attributedText: panelSubtitleString ?? subtitleString, constrainedSize: titleConstrainedSize)
|
||||||
|
@ -52,7 +52,8 @@ final class PeerInfoPaneWrapper {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum PeerInfoPaneKey {
|
enum PeerInfoPaneKey: Int32 {
|
||||||
|
case members
|
||||||
case media
|
case media
|
||||||
case files
|
case files
|
||||||
case links
|
case links
|
||||||
@ -60,7 +61,6 @@ enum PeerInfoPaneKey {
|
|||||||
case music
|
case music
|
||||||
case gifs
|
case gifs
|
||||||
case groupsInCommon
|
case groupsInCommon
|
||||||
case members
|
|
||||||
}
|
}
|
||||||
|
|
||||||
final class PeerInfoPaneTabsContainerPaneNode: ASDisplayNode {
|
final class PeerInfoPaneTabsContainerPaneNode: ASDisplayNode {
|
||||||
@ -479,8 +479,11 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, UIGestureRecognizerDelegat
|
|||||||
}
|
}
|
||||||
|
|
||||||
private let currentPaneStatusPromise = Promise<PeerInfoStatusData?>(nil)
|
private let currentPaneStatusPromise = Promise<PeerInfoStatusData?>(nil)
|
||||||
var currentPaneStatus: Signal<PeerInfoStatusData?, NoError> {
|
private let nextPaneStatusPromise = Promise<PeerInfoStatusData?>(nil)
|
||||||
return self.currentPaneStatusPromise.get()
|
private let paneTransitionPromise = ValuePromise<CGFloat?>(nil)
|
||||||
|
|
||||||
|
var currentPaneStatus: Signal<(PeerInfoStatusData?, PeerInfoStatusData?, CGFloat?), NoError> {
|
||||||
|
return combineLatest(queue: Queue.mainQueue(), self.currentPaneStatusPromise.get(), self.nextPaneStatusPromise.get(), self.paneTransitionPromise.get())
|
||||||
}
|
}
|
||||||
|
|
||||||
private var currentPanes: [PeerInfoPaneKey: PeerInfoPaneWrapper] = [:]
|
private var currentPanes: [PeerInfoPaneKey: PeerInfoPaneWrapper] = [:]
|
||||||
@ -549,6 +552,8 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, UIGestureRecognizerDelegat
|
|||||||
strongSelf.currentPaneUpdated?(true)
|
strongSelf.currentPaneUpdated?(true)
|
||||||
|
|
||||||
strongSelf.currentPaneStatusPromise.set(strongSelf.currentPane?.node.status ?? .single(nil))
|
strongSelf.currentPaneStatusPromise.set(strongSelf.currentPane?.node.status ?? .single(nil))
|
||||||
|
strongSelf.nextPaneStatusPromise.set(.single(nil))
|
||||||
|
strongSelf.paneTransitionPromise.set(nil)
|
||||||
}
|
}
|
||||||
} else if strongSelf.pendingSwitchToPaneKey != key {
|
} else if strongSelf.pendingSwitchToPaneKey != key {
|
||||||
strongSelf.pendingSwitchToPaneKey = key
|
strongSelf.pendingSwitchToPaneKey = key
|
||||||
@ -624,7 +629,13 @@ final class PeerInfoPaneContainerNode: ASDisplayNode, UIGestureRecognizerDelegat
|
|||||||
transitionFraction = max(0.0, transitionFraction)
|
transitionFraction = max(0.0, transitionFraction)
|
||||||
}
|
}
|
||||||
self.transitionFraction = transitionFraction
|
self.transitionFraction = transitionFraction
|
||||||
|
|
||||||
|
// let nextKey = availablePanes[updatedIndex]
|
||||||
|
// print(transitionFraction)
|
||||||
|
self.paneTransitionPromise.set(transitionFraction)
|
||||||
|
|
||||||
self.update(size: size, sideInset: sideInset, bottomInset: bottomInset, visibleHeight: visibleHeight, expansionFraction: expansionFraction, presentationData: presentationData, data: data, transition: .immediate)
|
self.update(size: size, sideInset: sideInset, bottomInset: bottomInset, visibleHeight: visibleHeight, expansionFraction: expansionFraction, presentationData: presentationData, data: data, transition: .immediate)
|
||||||
|
self.currentPaneUpdated?(false)
|
||||||
}
|
}
|
||||||
case .cancelled, .ended:
|
case .cancelled, .ended:
|
||||||
if let (size, sideInset, bottomInset, visibleHeight, expansionFraction, presentationData, data) = self.currentParams, let availablePanes = data?.availablePanes, availablePanes.count > 1, let currentPaneKey = self.currentPaneKey, let currentIndex = availablePanes.firstIndex(of: currentPaneKey) {
|
if let (size, sideInset, bottomInset, visibleHeight, expansionFraction, presentationData, data) = self.currentParams, let availablePanes = data?.availablePanes, availablePanes.count > 1, let currentPaneKey = self.currentPaneKey, let currentIndex = availablePanes.firstIndex(of: currentPaneKey) {
|
||||||
|
@ -1565,8 +1565,8 @@ final class PeerInfoScreenNode: ViewControllerTracingNode, UIScrollViewDelegate
|
|||||||
private var ignoreScrolling: Bool = false
|
private var ignoreScrolling: Bool = false
|
||||||
private var hapticFeedback: HapticFeedback?
|
private var hapticFeedback: HapticFeedback?
|
||||||
|
|
||||||
private var customStatusData: PeerInfoStatusData?
|
private var customStatusData: (PeerInfoStatusData?, PeerInfoStatusData?, CGFloat?)
|
||||||
private let customStatusPromise = Promise<PeerInfoStatusData?>(nil)
|
private let customStatusPromise = Promise<(PeerInfoStatusData?, PeerInfoStatusData?, CGFloat?)>((nil, nil, nil))
|
||||||
private var customStatusDisposable: Disposable?
|
private var customStatusDisposable: Disposable?
|
||||||
|
|
||||||
private var refreshMessageTagStatsDisposable: Disposable?
|
private var refreshMessageTagStatsDisposable: Disposable?
|
||||||
@ -8279,7 +8279,7 @@ private final class PeerInfoNavigationTransitionNode: ASDisplayNode, CustomNavig
|
|||||||
}
|
}
|
||||||
let headerInset = sectionInset
|
let headerInset = sectionInset
|
||||||
|
|
||||||
topHeight = self.headerNode.update(width: layout.size.width, containerHeight: layout.size.height, containerInset: headerInset, statusBarHeight: layout.statusBarHeight ?? 0.0, navigationHeight: topNavigationBar.bounds.height, isModalOverlay: layout.isModalOverlay, isMediaOnly: false, contentOffset: 0.0, paneContainerY: 0.0, presentationData: self.presentationData, peer: self.screenNode.data?.peer, cachedData: self.screenNode.data?.cachedData, notificationSettings: self.screenNode.data?.notificationSettings, statusData: self.screenNode.data?.status, panelStatusData: nil, isSecretChat: self.screenNode.peerId.namespace == Namespaces.Peer.SecretChat, isContact: self.screenNode.data?.isContact ?? false, isSettings: self.screenNode.isSettings, state: self.screenNode.state, transition: transition, additive: false)
|
topHeight = self.headerNode.update(width: layout.size.width, containerHeight: layout.size.height, containerInset: headerInset, statusBarHeight: layout.statusBarHeight ?? 0.0, navigationHeight: topNavigationBar.bounds.height, isModalOverlay: layout.isModalOverlay, isMediaOnly: false, contentOffset: 0.0, paneContainerY: 0.0, presentationData: self.presentationData, peer: self.screenNode.data?.peer, cachedData: self.screenNode.data?.cachedData, notificationSettings: self.screenNode.data?.notificationSettings, statusData: self.screenNode.data?.status, panelStatusData: (nil, nil, nil), isSecretChat: self.screenNode.peerId.namespace == Namespaces.Peer.SecretChat, isContact: self.screenNode.data?.isContact ?? false, isSettings: self.screenNode.isSettings, state: self.screenNode.state, transition: transition, additive: false)
|
||||||
}
|
}
|
||||||
|
|
||||||
let titleScale = (fraction * previousTitleNode.bounds.height + (1.0 - fraction) * self.headerNode.titleNodeRawContainer.bounds.height) / previousTitleNode.bounds.height
|
let titleScale = (fraction * previousTitleNode.bounds.height + (1.0 - fraction) * self.headerNode.titleNodeRawContainer.bounds.height) / previousTitleNode.bounds.height
|
||||||
|
@ -889,7 +889,7 @@ final class PeerInfoGifPaneNode: ASDisplayNode, PeerInfoPaneNode, UIScrollViewDe
|
|||||||
|
|
||||||
switch contentType {
|
switch contentType {
|
||||||
case .gifs:
|
case .gifs:
|
||||||
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_GifCount(Int32(count)), isActivity: false)
|
return PeerInfoStatusData(text: presentationData.strings.SharedMedia_GifCount(Int32(count)), isActivity: false, key: .gifs)
|
||||||
default:
|
default:
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user