Signal-iOS/SignalMessaging/ViewControllers/Stickers/StickerKeyboard.swift
2019-04-26 12:15:11 -04:00

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