Swiftgram/TelegramUI/MediaNavigationAccessoryPanel.swift
2016-12-16 20:55:17 +03:00

76 lines
2.7 KiB
Swift

import Foundation
import Display
import AsyncDisplayKit
import TelegramCore
final class MediaNavigationAccessoryPanel: ASDisplayNode {
let containerNode: MediaNavigationAccessoryContainerNode
var close: (() -> Void)?
var togglePlayPause: (() -> Void)?
var previous: (() -> Void)?
var next: (() -> Void)?
var seek: ((Double) -> Void)?
init(account: Account) {
self.containerNode = MediaNavigationAccessoryContainerNode(account: account)
super.init()
self.addSubnode(self.containerNode)
containerNode.headerNode.close = { [weak self] in
if let strongSelf = self, let close = strongSelf.close {
close()
}
}
containerNode.headerNode.togglePlayPause = { [weak self] in
if let strongSelf = self, let togglePlayPause = strongSelf.togglePlayPause {
togglePlayPause()
}
}
containerNode.headerNode.previous = { [weak self] in
if let strongSelf = self, let previous = strongSelf.previous {
previous()
}
}
containerNode.headerNode.next = { [weak self] in
if let strongSelf = self, let next = strongSelf.next {
next()
}
}
containerNode.headerNode.seek = { [weak self] timestamp in
if let strongSelf = self, let seek = strongSelf.seek {
seek(timestamp)
}
}
}
func updateLayout(size: CGSize, transition: ContainedViewLayoutTransition) {
transition.updateFrame(node: self.containerNode, frame: CGRect(origin: CGPoint(), size: size))
self.containerNode.updateLayout(size: size, transition: transition)
}
func animateIn(transition: ContainedViewLayoutTransition) {
self.clipsToBounds = true
let contentPosition = self.containerNode.layer.position
transition.animatePosition(node: self.containerNode, from: CGPoint(x: contentPosition.x, y: contentPosition.y - 37.0), completion: { [weak self] _ in
self?.clipsToBounds = false
})
}
func animateOut(transition: ContainedViewLayoutTransition, completion: @escaping () -> Void) {
self.clipsToBounds = true
let contentPosition = self.containerNode.layer.position
transition.animatePosition(node: self.containerNode, to: CGPoint(x: contentPosition.x, y: contentPosition.y - 37.0), removeOnCompletion: false, completion: { [weak self] _ in
self?.clipsToBounds = false
completion()
})
}
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
return self.containerNode.hitTest(point, with: event)
}
}