115 lines
2.8 KiB
Swift
115 lines
2.8 KiB
Swift
//
|
|
// Copyright (c) 2019 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
@objc
|
|
public protocol StickerKeyboardDelegate {
|
|
func didSelectSticker(stickerInfo: StickerInfo)
|
|
}
|
|
|
|
// MARK: -
|
|
|
|
@objc
|
|
public class StickerKeyboard: UIStackView {
|
|
|
|
@objc
|
|
public weak var delegate: StickerKeyboardDelegate?
|
|
|
|
private let headerView = UIStackView()
|
|
private let stickerCollectionView = StickerPackCollectionView()
|
|
|
|
private var stickerPacks = [StickerPack]()
|
|
private var stickerPack: StickerPack? {
|
|
didSet {
|
|
AssertIsOnMainThread()
|
|
|
|
stickerCollectionView.stickerPack = stickerPack
|
|
}
|
|
}
|
|
|
|
@objc
|
|
public required init() {
|
|
super.init(frame: .zero)
|
|
|
|
createSubviews()
|
|
|
|
reloadStickers()
|
|
|
|
NotificationCenter.default.addObserver(self,
|
|
selector: #selector(stickersOrPacksDidChange),
|
|
name: StickerManager.StickersOrPacksDidChange,
|
|
object: nil)
|
|
}
|
|
|
|
// TODO: Tune this value.
|
|
private let keyboardHeight: CGFloat = 200
|
|
|
|
@objc
|
|
public override var intrinsicContentSize: CGSize {
|
|
return CGSize(width: 0, height: keyboardHeight)
|
|
}
|
|
|
|
private func createSubviews() {
|
|
axis = .vertical
|
|
layoutMargins = .zero
|
|
autoresizingMask = .flexibleHeight
|
|
alignment = .fill
|
|
|
|
addBackgroundView(withBackgroundColor: Theme.offBackgroundColor)
|
|
|
|
headerView.axis = .horizontal
|
|
addArrangedSubview(headerView)
|
|
headerView.setContentHuggingVerticalHigh()
|
|
headerView.setCompressionResistanceVerticalHigh()
|
|
headerView.autoSetDimension(.height, toSize: 44)
|
|
|
|
stickerCollectionView.stickerDelegate = self
|
|
addArrangedSubview(stickerCollectionView)
|
|
stickerCollectionView.setContentHuggingVerticalLow()
|
|
stickerCollectionView.setCompressionResistanceVerticalLow()
|
|
}
|
|
|
|
private func reloadStickers() {
|
|
stickerPacks = StickerManager.installedStickerPacks()
|
|
|
|
guard stickerPacks.count > 0 else {
|
|
stickerPack = nil
|
|
return
|
|
}
|
|
|
|
if stickerPack == nil {
|
|
stickerPack = stickerPacks.first
|
|
}
|
|
|
|
// TODO: Reload header?
|
|
}
|
|
|
|
// MARK: Events
|
|
|
|
@objc func stickersOrPacksDidChange() {
|
|
AssertIsOnMainThread()
|
|
|
|
Logger.verbose("")
|
|
|
|
reloadStickers()
|
|
}
|
|
|
|
required public init(coder: NSCoder) {
|
|
notImplemented()
|
|
}
|
|
}
|
|
|
|
// MARK: -
|
|
|
|
extension StickerKeyboard: StickerPackCollectionViewDelegate {
|
|
public func didTapSticker(stickerInfo: StickerInfo) {
|
|
AssertIsOnMainThread()
|
|
|
|
Logger.verbose("")
|
|
|
|
delegate?.didSelectSticker(stickerInfo: stickerInfo)
|
|
}
|
|
}
|