diff --git a/submodules/Display/Display/NavigationController.swift b/submodules/Display/Display/NavigationController.swift index 96670d5cbd..9a06d87e4c 100644 --- a/submodules/Display/Display/NavigationController.swift +++ b/submodules/Display/Display/NavigationController.swift @@ -490,9 +490,9 @@ open class NavigationController: UINavigationController, ContainableController, controller.navigationBar?.previousItem = .item(viewControllers[i - 1].navigationItem) } if i < self._viewControllers.count - 1 { - controller.navigationCustomData = (viewControllers[i + 1] as? ViewController)?.customData + controller.updateNavigationCustomData((viewControllers[i + 1] as? ViewController)?.customData, progress: 1.0, transition: transition) } else { - controller.navigationCustomData = nil + controller.updateNavigationCustomData(nil, progress: 1.0, transition: transition) } } viewControllers[i].navigation_setNavigationController(self) @@ -840,13 +840,27 @@ open class NavigationController: UINavigationController, ContainableController, bottomController.displayNode.recursivelyEnsureDisplaySynchronously(true) } - let navigationTransitionCoordinator = NavigationTransitionCoordinator(transition: .Pop, container: self.controllerView.containerView, topView: topView, topNavigationBar: (topController as? ViewController)?.navigationBar, bottomView: bottomView, bottomNavigationBar: (bottomController as? ViewController)?.navigationBar) + let navigationTransitionCoordinator = NavigationTransitionCoordinator(transition: .Pop, container: self.controllerView.containerView, topView: topView, topNavigationBar: (topController as? ViewController)?.navigationBar, bottomView: bottomView, bottomNavigationBar: (bottomController as? ViewController)?.navigationBar, didUpdateProgress: { [weak self] progress in + if let strongSelf = self { + for i in 0 ..< strongSelf._viewControllers.count { + if let controller = strongSelf._viewControllers[i].controller as? ViewController { + if i < strongSelf._viewControllers.count - 1 { + controller.updateNavigationCustomData((strongSelf.viewControllers[i + 1] as? ViewController)?.customData, progress: 1.0 - progress, transition: .immediate) + } else { + controller.updateNavigationCustomData(nil, progress: 1.0 - progress, transition: .immediate) + } + } + } + } + }) self.navigationTransitionCoordinator = navigationTransitionCoordinator } case UIGestureRecognizerState.changed: if let navigationTransitionCoordinator = self.navigationTransitionCoordinator, !navigationTransitionCoordinator.animatingCompletion { let translation = recognizer.translation(in: self.view).x - navigationTransitionCoordinator.progress = max(0.0, min(1.0, translation / self.view.frame.width)) + let progress = max(0.0, min(1.0, translation / self.view.frame.width)) + navigationTransitionCoordinator.progress = progress + } case UIGestureRecognizerState.ended: if let navigationTransitionCoordinator = self.navigationTransitionCoordinator, !navigationTransitionCoordinator.animatingCompletion { diff --git a/submodules/Display/Display/NavigationTransitionCoordinator.swift b/submodules/Display/Display/NavigationTransitionCoordinator.swift index 809f669aec..0b6bfd5321 100644 --- a/submodules/Display/Display/NavigationTransitionCoordinator.swift +++ b/submodules/Display/Display/NavigationTransitionCoordinator.swift @@ -39,10 +39,11 @@ class NavigationTransitionCoordinator { private(set) var animatingCompletion = false private var currentCompletion: (() -> Void)? - - init(transition: NavigationTransition, container: UIView, topView: UIView, topNavigationBar: NavigationBar?, bottomView: UIView, bottomNavigationBar: NavigationBar?) { + private var didUpdateProgress:((CGFloat)->Void)? + init(transition: NavigationTransition, container: UIView, topView: UIView, topNavigationBar: NavigationBar?, bottomView: UIView, bottomNavigationBar: NavigationBar?, didUpdateProgress: ((CGFloat) -> Void)? = nil) { self.transition = transition self.container = container + self.didUpdateProgress = didUpdateProgress self.topView = topView switch transition { case .Push: @@ -109,6 +110,8 @@ class NavigationTransitionCoordinator { self.bottomView.frame = CGRect(origin: CGPoint(x: ((position - 1.0) * containerSize.width * 0.3), y: 0.0), size: containerSize) self.updateNavigationBarTransition() + + self.didUpdateProgress?(self.progress) } func updateNavigationBarTransition() { diff --git a/submodules/Display/Display/TabBarController.swift b/submodules/Display/Display/TabBarController.swift index 698cf8f93c..1fe3f04a1f 100644 --- a/submodules/Display/Display/TabBarController.swift +++ b/submodules/Display/Display/TabBarController.swift @@ -73,14 +73,13 @@ open class TabBarController: ViewController { } } - open override var navigationCustomData: Any? { - didSet { - for controller in controllers { - controller.navigationCustomData = navigationCustomData - } + open override func updateNavigationCustomData(_ data: Any?, progress: CGFloat, transition: ContainedViewLayoutTransition) { + for controller in controllers { + controller.updateNavigationCustomData(data, progress: progress, transition: transition) } } + public private(set) var controllers: [ViewController] = [] private let _ready = Promise() diff --git a/submodules/Display/Display/ViewController.swift b/submodules/Display/Display/ViewController.swift index 76159a21fe..9f3c415f7a 100644 --- a/submodules/Display/Display/ViewController.swift +++ b/submodules/Display/Display/ViewController.swift @@ -206,7 +206,10 @@ open class ViewControllerPresentationArguments { public var scrollToTopWithTabBar: (() -> Void)? public var longTapWithTabBar: (() -> Void)? - open var navigationCustomData: Any? + open func updateNavigationCustomData(_ data: Any?, progress: CGFloat, transition: ContainedViewLayoutTransition) { + + } + open var customData: Any? { get { return nil diff --git a/submodules/TelegramUI/TelegramUI/ChatListController.swift b/submodules/TelegramUI/TelegramUI/ChatListController.swift index a12ba47557..63e706762e 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListController.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListController.swift @@ -96,12 +96,11 @@ public class ChatListController: TelegramController, UIViewControllerPreviewingD private var searchContentNode: NavigationBarSearchContentNode? - public override var navigationCustomData: Any? { - didSet { - self.chatListDisplayNode.chatListNode.updateSelectedChatLocation(self.navigationCustomData as? ChatLocation, progress: 1, transition: .immediate) - } + public override func updateNavigationCustomData(_ data: Any?, progress: CGFloat, transition: ContainedViewLayoutTransition) { + self.chatListDisplayNode.chatListNode.updateSelectedChatLocation(data as? ChatLocation, progress: progress, transition: transition) } + public init(context: AccountContext, groupId: PeerGroupId, controlsHistoryPreload: Bool, hideNetworkActivityStatus: Bool = false) { self.context = context self.controlsHistoryPreload = controlsHistoryPreload @@ -1121,11 +1120,13 @@ public class ChatListController: TelegramController, UIViewControllerPreviewingD editItem.accessibilityLabel = self.presentationData.strings.Common_Done if case .root = self.groupId { self.navigationItem.leftBarButtonItem = editItem + (self.navigationController as? NavigationController)?.updateMasterDetailsBlackout(.details, transition: .animated(duration: 0.5, curve: .spring)) } else { self.navigationItem.rightBarButtonItem = editItem + (self.navigationController as? NavigationController)?.updateMasterDetailsBlackout(.master, transition: .animated(duration: 0.5, curve: .spring)) } self.searchContentNode?.setIsEnabled(false, animated: true) - (self.navigationController as? NavigationController)?.updateMasterDetailsBlackout(.details, transition: .animated(duration: 0.5, curve: .spring)) + self.chatListDisplayNode.chatListNode.updateState { state in var state = state state.editing = true diff --git a/submodules/TelegramUI/TelegramUI/ChatListItem.swift b/submodules/TelegramUI/TelegramUI/ChatListItem.swift index b9e5e2f23a..be6581698f 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListItem.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListItem.swift @@ -519,6 +519,7 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { func updateIsHighlighted(transition: ContainedViewLayoutTransition) { + let highlightProgress: CGFloat = self.item?.interaction.highlightedChatLocation?.progress ?? 1.0 if reallyHighlighted { if self.highlightedBackgroundNode.supernode == nil { @@ -526,14 +527,14 @@ class ChatListItemNode: ItemListRevealOptionsItemNode { self.highlightedBackgroundNode.alpha = 0.0 } self.highlightedBackgroundNode.layer.removeAllAnimations() - transition.updateAlpha(layer: self.highlightedBackgroundNode.layer, alpha: 1.0) + transition.updateAlpha(layer: self.highlightedBackgroundNode.layer, alpha: highlightProgress) if let item = self.item { self.onlineNode.setImage(PresentationResourcesChatList.recentStatusOnlineIcon(item.presentationData.theme, state: .highlighted)) } } else { if self.highlightedBackgroundNode.supernode != nil { - transition.updateAlpha(layer: self.highlightedBackgroundNode.layer, alpha: 0.0, completion: { [weak self] completed in + transition.updateAlpha(layer: self.highlightedBackgroundNode.layer, alpha: highlightProgress, completion: { [weak self] completed in if let strongSelf = self { if completed { strongSelf.highlightedBackgroundNode.removeFromSupernode() diff --git a/submodules/TelegramUI/TelegramUI/ChatListNode.swift b/submodules/TelegramUI/TelegramUI/ChatListNode.swift index f5cd776c5b..a97065055d 100644 --- a/submodules/TelegramUI/TelegramUI/ChatListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ChatListNode.swift @@ -1427,7 +1427,7 @@ final class ChatListNode: ListView { } if let chatLocation = chatLocation { - interaction.highlightedChatLocation = ChatListHighlightedLocation(location: chatLocation, progress: 1.0) + interaction.highlightedChatLocation = ChatListHighlightedLocation(location: chatLocation, progress: progress) } else { interaction.highlightedChatLocation = nil } diff --git a/submodules/TelegramUI/TelegramUI/ContactListNode.swift b/submodules/TelegramUI/TelegramUI/ContactListNode.swift index d5f0235e41..d0f63593a6 100644 --- a/submodules/TelegramUI/TelegramUI/ContactListNode.swift +++ b/submodules/TelegramUI/TelegramUI/ContactListNode.swift @@ -99,6 +99,7 @@ private enum ContactListNodeEntryId: Hashable { final class ContactItemHighlighting { var chatLocation: ChatLocation? + var progress: CGFloat = 1.0 init(chatLocation: ChatLocation? = nil) { self.chatLocation = chatLocation } @@ -1343,6 +1344,7 @@ final class ContactListNode: ASDisplayNode { func updateSelectedChatLocation(_ chatLocation: ChatLocation?, progress: CGFloat, transition: ContainedViewLayoutTransition) { self.interaction?.itemHighlighting.chatLocation = chatLocation + self.interaction?.itemHighlighting.progress = progress self.listNode.forEachItemNode { itemNode in if let itemNode = itemNode as? ContactsPeerItemNode { diff --git a/submodules/TelegramUI/TelegramUI/ContactsController.swift b/submodules/TelegramUI/TelegramUI/ContactsController.swift index 3d1ef9b025..f3fad07011 100644 --- a/submodules/TelegramUI/TelegramUI/ContactsController.swift +++ b/submodules/TelegramUI/TelegramUI/ContactsController.swift @@ -77,12 +77,12 @@ public class ContactsController: ViewController { var switchToChatsController: (() -> Void)? - public override var navigationCustomData: Any? { - didSet { - self.contactsNode.contactListNode.updateSelectedChatLocation(self.navigationCustomData as? ChatLocation, progress: 1, transition: .immediate) - } + + public override func updateNavigationCustomData(_ data: Any?, progress: CGFloat, transition: ContainedViewLayoutTransition) { + self.contactsNode.contactListNode.updateSelectedChatLocation(data as? ChatLocation, progress: progress, transition: transition) } + public init(context: AccountContext) { self.context = context diff --git a/submodules/TelegramUI/TelegramUI/ContactsPeerItem.swift b/submodules/TelegramUI/TelegramUI/ContactsPeerItem.swift index a8b238adeb..7790aa3ff8 100644 --- a/submodules/TelegramUI/TelegramUI/ContactsPeerItem.swift +++ b/submodules/TelegramUI/TelegramUI/ContactsPeerItem.swift @@ -401,6 +401,7 @@ class ContactsPeerItemNode: ItemListRevealOptionsItemNode { func updateIsHighlighted(transition: ContainedViewLayoutTransition) { var reallyHighlighted = self.isHighlighted + var highlightProgress: CGFloat = self.item?.itemHighlighting?.progress ?? 1.0 if let item = self.item { switch item.peer { case let .peer(_, chatPeer): @@ -420,10 +421,10 @@ class ContactsPeerItemNode: ItemListRevealOptionsItemNode { self.highlightedBackgroundNode.alpha = 0.0 } self.highlightedBackgroundNode.layer.removeAllAnimations() - transition.updateAlpha(layer: self.highlightedBackgroundNode.layer, alpha: 1.0) + transition.updateAlpha(layer: self.highlightedBackgroundNode.layer, alpha: highlightProgress) } else { if self.highlightedBackgroundNode.supernode != nil { - transition.updateAlpha(layer: self.highlightedBackgroundNode.layer, alpha: 0.0, completion: { [weak self] completed in + transition.updateAlpha(layer: self.highlightedBackgroundNode.layer, alpha: highlightProgress, completion: { [weak self] completed in if let strongSelf = self { if completed { strongSelf.highlightedBackgroundNode.removeFromSupernode()