Antidote/Antidote/ChatGenericFileCell.swift

179 lines
6.0 KiB
Swift

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
import UIKit
import SnapKit
class ChatGenericFileCell: ChatMovableDateCell {
var loadingView: LoadingImageView!
var cancelButton: UIButton!
var retryButton: UIButton!
var progressObject: ChatProgressProtocol? {
didSet {
progressObject?.updateProgress = { [weak self] (progress: Float) -> Void in
self?.updateProgress(CGFloat(progress))
}
progressObject?.updateEta = { [weak self] (eta: CFTimeInterval, bytesPerSecond: OCTToxFileSize) -> Void in
self?.updateEta(String(timeInterval: eta))
self?.updateBytesPerSecond(bytesPerSecond)
}
}
}
var state: ChatGenericFileCellModel.State = .waitingConfirmation
var startLoadingHandle: (() -> Void)?
var cancelHandle: (() -> Void)?
var retryHandle: (() -> Void)?
var pauseOrResumeHandle: (() -> Void)?
var openHandle: (() -> Void)?
/**
This method should be called after setupWithTheme:model:
*/
func setButtonImage(_ image: UIImage) {
let square: UIImage
canBeCopied = true
if image.size.width == image.size.height {
square = image
}
else {
let side = min(image.size.width, image.size.height)
let x = (image.size.width - side) / 2
let y = (image.size.height - side) / 2
let rect = CGRect(x: x, y: y, width: side, height: side)
square = image.cropWithRect(rect)
}
loadingView.imageButton.setBackgroundImage(square, for: UIControlState())
if state == .waitingConfirmation || state == .done {
loadingView.centerImageView.image = nil
}
}
override func setupWithTheme(_ theme: Theme, model: BaseCellModel) {
super.setupWithTheme(theme, model: model)
guard let fileModel = model as? ChatGenericFileCellModel else {
assert(false, "Wrong model \(model) passed to cell \(self)")
return
}
state = fileModel.state
startLoadingHandle = fileModel.startLoadingHandle
cancelHandle = fileModel.cancelHandle
retryHandle = fileModel.retryHandle
pauseOrResumeHandle = fileModel.pauseOrResumeHandle
openHandle = fileModel.openHandle
canBeCopied = false
switch state {
case .loading:
loadingView.centerImageView.image = UIImage.templateNamed("chat-file-pause-big")
case .paused:
loadingView.centerImageView.image = UIImage.templateNamed("chat-file-play-big")
case .waitingConfirmation:
fallthrough
case .cancelled:
fallthrough
case .done:
var fileExtension: String? = nil
if let fileName = fileModel.fileName {
fileExtension = (fileName as NSString).pathExtension
}
loadingView.setImageWithUti(fileModel.fileUTI, fileExtension: fileExtension)
}
updateViewsWithState(fileModel.state, fileModel: fileModel)
loadingView.imageButton.setImage(nil, for: UIControlState())
let backgroundColor = theme.colorForType(.FileImageBackgroundActive)
let backgroundImage = UIImage.imageWithColor(backgroundColor, size: CGSize(width: 1.0, height: 1.0))
loadingView.imageButton.setBackgroundImage(backgroundImage, for: UIControlState())
loadingView.progressView.backgroundLineColor = theme.colorForType(.FileImageAcceptButtonTint).withAlphaComponent(0.3)
loadingView.progressView.lineColor = theme.colorForType(.FileImageAcceptButtonTint)
loadingView.centerImageView.tintColor = theme.colorForType(.FileImageAcceptButtonTint)
loadingView.topLabel.textColor = theme.colorForType(.FileImageCancelledText)
loadingView.bottomLabel.textColor = theme.colorForType(.FileImageCancelledText)
cancelButton.tintColor = theme.colorForType(.FileImageCancelButtonTint)
retryButton.tintColor = theme.colorForType(.FileImageCancelButtonTint)
}
override func createViews() {
super.createViews()
loadingView = LoadingImageView()
loadingView.pressedHandle = loadingViewPressed
let cancelImage = UIImage.templateNamed("chat-file-cancel")
cancelButton = UIButton()
cancelButton.setImage(cancelImage, for: UIControlState())
cancelButton.addTarget(self, action: #selector(ChatGenericFileCell.cancelButtonPressed), for: .touchUpInside)
let retryImage = UIImage.templateNamed("chat-file-retry")
retryButton = UIButton()
retryButton.setImage(retryImage, for: UIControlState())
retryButton.addTarget(self, action: #selector(ChatGenericFileCell.retryButtonPressed), for: .touchUpInside)
}
override func setEditing(_ editing: Bool, animated: Bool) {
super.setEditing(editing, animated: animated)
loadingView.isUserInteractionEnabled = !editing
cancelButton.isUserInteractionEnabled = !editing
retryButton.isUserInteractionEnabled = !editing
}
func updateProgress(_ progress: CGFloat) {
loadingView.progressView.progress = progress
}
func updateEta(_ eta: String) {
loadingView.bottomLabel.text = eta
}
func updateBytesPerSecond(_ bytesPerSecond: OCTToxFileSize) {}
@objc func cancelButtonPressed() {
cancelHandle?()
}
@objc func retryButtonPressed() {
retryHandle?()
}
/// Override in subclass
func updateViewsWithState(_ state: ChatGenericFileCellModel.State, fileModel: ChatGenericFileCellModel) {}
/// Override in subclass
func loadingViewPressed() {}
}
// ChatEditable
extension ChatGenericFileCell {
override func shouldShowMenu() -> Bool {
return true
}
override func menuTargetRect() -> CGRect {
return loadingView.frame
}
}