Reaction improvements

This commit is contained in:
Ali
2022-08-19 22:51:12 +03:00
parent 8f2a7327d7
commit ffe00ac2e1
54 changed files with 1847 additions and 462 deletions

View File

@@ -8,6 +8,7 @@ import Markdown
import AppBundle
import TextFormat
import TextNodeWithEntities
import SwiftSignalKit
private final class ContextActionsSelectionGestureRecognizer: UIPanGestureRecognizer {
var updateLocation: ((CGPoint, Bool) -> Void)?
@@ -351,6 +352,8 @@ final class InnerTextSelectionTipContainerNode: ASDisplayNode {
private let iconNode: ASImageNode
private let placeholderNode: ASDisplayNode
var tip: ContextController.Tip
private let text: String
private var arguments: TextNodeWithEntities.Arguments?
private var file: TelegramMediaFile?
@@ -362,6 +365,7 @@ final class InnerTextSelectionTipContainerNode: ASDisplayNode {
var requestDismiss: (@escaping () -> Void) -> Void = { _ in }
init(presentationData: PresentationData, tip: ContextController.Tip) {
self.tip = tip
self.presentationData = presentationData
self.highlightBackgroundNode = ASDisplayNode()
@@ -645,14 +649,19 @@ final class InnerTextSelectionTipContainerNode: ASDisplayNode {
}
final class ContextActionsContainerNode: ASDisplayNode {
private let presentationData: PresentationData
private let getController: () -> ContextControllerProtocol?
private let blurBackground: Bool
private let shadowNode: ASImageNode
private let additionalShadowNode: ASImageNode?
private let additionalActionsNode: InnerActionsContainerNode?
private let actionsNode: InnerActionsContainerNode
private let textSelectionTipNode: InnerTextSelectionTipContainerNode?
private let scrollNode: ASScrollNode
private var tip: ContextController.Tip?
private var textSelectionTipNode: InnerTextSelectionTipContainerNode?
private var textSelectionTipNodeDisposable: Disposable?
var panSelectionGestureEnabled: Bool = true {
didSet {
if self.panSelectionGestureEnabled != oldValue {
@@ -666,6 +675,8 @@ final class ContextActionsContainerNode: ASDisplayNode {
}
init(presentationData: PresentationData, items: ContextController.Items, getController: @escaping () -> ContextControllerProtocol?, actionSelected: @escaping (ContextMenuActionResult) -> Void, requestLayout: @escaping () -> Void, feedbackTap: @escaping () -> Void, blurBackground: Bool) {
self.presentationData = presentationData
self.getController = getController
self.blurBackground = blurBackground
self.shadowNode = ASImageNode()
self.shadowNode.displaysAsynchronously = false
@@ -698,15 +709,8 @@ final class ContextActionsContainerNode: ASDisplayNode {
}
self.actionsNode = InnerActionsContainerNode(presentationData: presentationData, items: itemList, getController: getController, actionSelected: actionSelected, requestLayout: requestLayout, feedbackTap: feedbackTap, blurBackground: blurBackground)
if let tip = items.tip {
let textSelectionTipNode = InnerTextSelectionTipContainerNode(presentationData: presentationData, tip: tip)
textSelectionTipNode.requestDismiss = { completion in
getController()?.dismiss(completion: completion)
}
self.textSelectionTipNode = textSelectionTipNode
} else {
self.textSelectionTipNode = nil
}
self.tip = items.tip
self.scrollNode = ASScrollNode()
self.scrollNode.canCancelAllTouchesInViews = true
@@ -722,8 +726,23 @@ final class ContextActionsContainerNode: ASDisplayNode {
self.additionalShadowNode.flatMap(self.addSubnode)
self.additionalActionsNode.flatMap(self.scrollNode.addSubnode)
self.scrollNode.addSubnode(self.actionsNode)
self.textSelectionTipNode.flatMap(self.scrollNode.addSubnode)
self.addSubnode(self.scrollNode)
if let tipSignal = items.tipSignal {
self.textSelectionTipNodeDisposable = (tipSignal
|> deliverOnMainQueue).start(next: { [weak self] tip in
guard let strongSelf = self else {
return
}
strongSelf.tip = tip
requestLayout()
})
}
}
deinit {
self.textSelectionTipNodeDisposable?.dispose()
}
func updateLayout(widthClass: ContainerViewLayoutSizeClass, constrainedWidth: CGFloat, constrainedHeight: CGFloat, transition: ContainedViewLayoutTransition) -> CGSize {
@@ -756,6 +775,29 @@ final class ContextActionsContainerNode: ASDisplayNode {
transition.updateFrame(node: self.actionsNode, frame: bounds)
if let tip = self.tip {
if let textSelectionTipNode = self.textSelectionTipNode, textSelectionTipNode.tip == tip {
} else {
if let textSelectionTipNode = self.textSelectionTipNode {
self.textSelectionTipNode = nil
textSelectionTipNode.removeFromSupernode()
}
let textSelectionTipNode = InnerTextSelectionTipContainerNode(presentationData: self.presentationData, tip: tip)
let getController = self.getController
textSelectionTipNode.requestDismiss = { completion in
getController()?.dismiss(completion: completion)
}
self.textSelectionTipNode = textSelectionTipNode
self.scrollNode.addSubnode(textSelectionTipNode)
}
} else {
if let textSelectionTipNode = self.textSelectionTipNode {
self.textSelectionTipNode = nil
textSelectionTipNode.removeFromSupernode()
}
}
if let textSelectionTipNode = self.textSelectionTipNode {
contentSize.height += 8.0
let textSelectionTipSize = textSelectionTipNode.updateLayout(widthClass: widthClass, width: actionsSize.width, transition: transition)