Swiftgram/submodules/TelegramUI/TelegramUI/PeerInfoScreenSelectableBackgroundNode.swift

56 lines
2.0 KiB
Swift

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))
}
}