Swiftgram/TelegramUI/TelegramController.swift
2016-12-06 12:12:43 +03:00

77 lines
3.2 KiB
Swift

import Foundation
import Display
import TelegramCore
import SwiftSignalKit
public class TelegramController: ViewController {
private let account: Account
private var mediaStatusDisposable: Disposable?
private var playlistState: AudioPlaylistState?
private var mediaAccessoryPanel: MediaNavigationAccessoryPanel?
override public var navigationHeight: CGFloat {
var height = super.navigationHeight
if let mediaAccessoryPanel = self.mediaAccessoryPanel {
height += 36.0
}
return height
}
init(account: Account) {
self.account = account
super.init(navigationBar: NavigationBar())
if let applicationContext = account.applicationContext as? TelegramApplicationContext {
self.mediaStatusDisposable = (applicationContext.mediaManager.playlistPlayerState
|> deliverOnMainQueue).start(next: { [weak self] playlistState in
if let strongSelf = self, strongSelf.playlistState != playlistState {
strongSelf.playlistState = playlistState
strongSelf.requestLayout(transition: .animated(duration: 0.4, curve: .spring))
}
})
}
}
deinit {
self.mediaStatusDisposable?.dispose()
}
required public init(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
public override func containerLayoutUpdated(_ layout: ContainerViewLayout, transition: ContainedViewLayoutTransition) {
super.containerLayoutUpdated(layout, transition: transition)
if let playlistState = playlistState {
let panelFrame = CGRect(origin: CGPoint(x: 0.0, y: self.navigationBar.frame.maxY), size: CGSize(width: layout.size.width, height: 36.0))
if let mediaAccessoryPanel = self.mediaAccessoryPanel {
transition.updateFrame(node: mediaAccessoryPanel, frame: panelFrame)
mediaAccessoryPanel.updateLayout(size: panelFrame.size, transition: transition)
} else {
let mediaAccessoryPanel = MediaNavigationAccessoryPanel()
mediaAccessoryPanel.close = { [weak self] in
if let strongSelf = self {
if let applicationContext = strongSelf.account.applicationContext as? TelegramApplicationContext {
applicationContext.mediaManager.setPlaylistPlayer(nil)
}
}
}
mediaAccessoryPanel.frame = panelFrame
self.displayNode.insertSubnode(mediaAccessoryPanel, belowSubnode: self.navigationBar)
self.mediaAccessoryPanel = mediaAccessoryPanel
mediaAccessoryPanel.updateLayout(size: panelFrame.size, transition: .immediate)
mediaAccessoryPanel.animateIn(transition: transition)
}
} else if let mediaAccessoryPanel = self.mediaAccessoryPanel {
self.mediaAccessoryPanel = nil
mediaAccessoryPanel.animateOut(transition: transition, completion: { [weak mediaAccessoryPanel] in
mediaAccessoryPanel?.removeFromSupernode()
})
}
}
}