import AsyncDisplayKit import Display import TelegramPresentationData final class PeerInfoScreenSelectableBackgroundNode: ASDisplayNode { private let backgroundNode: ASDisplayNode private let buttonNode: HighlightTrackingButtonNode let bringToFrontForHighlight: () -> Void var pressed: (() -> Void)? { didSet { self.buttonNode.isUserInteractionEnabled = self.pressed != nil } } init(bringToFrontForHighlight: @escaping () -> Void) { self.bringToFrontForHighlight = bringToFrontForHighlight self.backgroundNode = ASDisplayNode() self.backgroundNode.isLayerBacked = true self.backgroundNode.alpha = 0.0 self.buttonNode = HighlightTrackingButtonNode() super.init() self.addSubnode(self.backgroundNode) self.addSubnode(self.buttonNode) self.buttonNode.addTarget(self, action: #selector(self.buttonPressed), forControlEvents: .touchUpInside) self.buttonNode.highligthedChanged = { [weak self] highlighted in if let strongSelf = self { if highlighted { strongSelf.bringToFrontForHighlight() strongSelf.backgroundNode.layer.removeAnimation(forKey: "opacity") strongSelf.backgroundNode.alpha = 1.0 } else { strongSelf.backgroundNode.alpha = 0.0 strongSelf.backgroundNode.layer.animateAlpha(from: 1.0, to: 0.0, duration: 0.25) } } } } @objc private func buttonPressed() { self.pressed?() } func update(size: CGSize, theme: PresentationTheme, transition: ContainedViewLayoutTransition) { self.backgroundNode.backgroundColor = theme.list.itemHighlightedBackgroundColor transition.updateFrame(node: self.backgroundNode, frame: CGRect(origin: CGPoint(), size: size)) transition.updateFrame(node: self.buttonNode, frame: CGRect(origin: CGPoint(), size: size)) } }