diff --git a/submodules/Display/Display/TooltipController.swift b/submodules/Display/Display/TooltipController.swift index dea4b6e599..7e9f4526c0 100644 --- a/submodules/Display/Display/TooltipController.swift +++ b/submodules/Display/Display/TooltipController.swift @@ -22,7 +22,7 @@ public enum TooltipControllerContent: Equatable { } } -private enum SourceAndRect { +public enum SourceAndRect { case node(() -> (ASDisplayNode, CGRect)?) case view(() -> (UIView, CGRect)?) @@ -42,7 +42,7 @@ private enum SourceAndRect { } public final class TooltipControllerPresentationArguments { - fileprivate let sourceAndRect: SourceAndRect + public let sourceAndRect: SourceAndRect public init(sourceNodeAndRect: @escaping () -> (ASDisplayNode, CGRect)?) { self.sourceAndRect = .node(sourceNodeAndRect) @@ -76,6 +76,7 @@ open class TooltipController: ViewController { private let timeout: Double private let dismissByTapOutside: Bool + private let dismissByTapOutsideSource: Bool private let dismissImmediatelyOnLayoutUpdate: Bool private var timeoutTimer: SwiftSignalKit.Timer? @@ -83,10 +84,11 @@ open class TooltipController: ViewController { public var dismissed: (() -> Void)? - public init(content: TooltipControllerContent, timeout: Double = 2.0, dismissByTapOutside: Bool = false, dismissImmediatelyOnLayoutUpdate: Bool = false) { + public init(content: TooltipControllerContent, timeout: Double = 2.0, dismissByTapOutside: Bool = false, dismissByTapOutsideSource: Bool = false, dismissImmediatelyOnLayoutUpdate: Bool = false) { self.content = content self.timeout = timeout self.dismissByTapOutside = dismissByTapOutside + self.dismissByTapOutsideSource = dismissByTapOutsideSource self.dismissImmediatelyOnLayoutUpdate = dismissImmediatelyOnLayoutUpdate super.init(navigationBarPresentationData: nil) @@ -103,7 +105,7 @@ open class TooltipController: ViewController { override open func loadDisplayNode() { self.displayNode = TooltipControllerNode(content: self.content, dismiss: { [weak self] in self?.dismiss() - }, dismissByTapOutside: self.dismissByTapOutside) + }, dismissByTapOutside: self.dismissByTapOutside, dismissByTapOutsideSource: self.dismissByTapOutsideSource) self.displayNodeDidLoad() } diff --git a/submodules/Display/Display/TooltipControllerNode.swift b/submodules/Display/Display/TooltipControllerNode.swift index b3a478bbb7..b9fabbc225 100644 --- a/submodules/Display/Display/TooltipControllerNode.swift +++ b/submodules/Display/Display/TooltipControllerNode.swift @@ -17,9 +17,11 @@ final class TooltipControllerNode: ASDisplayNode { var arrowOnBottom: Bool = true private var dismissedByTouchOutside = false + private var dismissByTapOutsideSource = false - init(content: TooltipControllerContent, dismiss: @escaping () -> Void, dismissByTapOutside: Bool) { + init(content: TooltipControllerContent, dismiss: @escaping () -> Void, dismissByTapOutside: Bool, dismissByTapOutsideSource: Bool) { self.dismissByTapOutside = dismissByTapOutside + self.dismissByTapOutsideSource = dismissByTapOutsideSource self.containerNode = ContextMenuContainerNode() self.containerNode.backgroundColor = UIColor(white: 0.0, alpha: 0.8) @@ -128,6 +130,11 @@ final class TooltipControllerNode: ASDisplayNode { self.dismissedByTouchOutside = true self.dismiss() } + } else if self.dismissByTapOutsideSource, let sourceRect = self.sourceRect, !sourceRect.contains(point) { + if !self.dismissedByTouchOutside { + self.dismissedByTouchOutside = true + self.dismiss() + } } return nil }