mirror of
https://github.com/lux-tel/session-ios.git
synced 2026-10-30 20:38:32 +00:00
154 lines
5.2 KiB
Swift
154 lines
5.2 KiB
Swift
//
|
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import SessionUIKit
|
|
import SessionUtilitiesKit
|
|
|
|
public protocol PhotoGridItem: AnyObject {
|
|
var isVideo: Bool { get }
|
|
var source: ImageDataManager.DataSource { get }
|
|
}
|
|
|
|
public class PhotoGridViewCell: UICollectionViewCell {
|
|
private static let badgeSize: CGSize = CGSize(width: 32, height: 32)
|
|
public let imageView: SessionImageView = {
|
|
let result: SessionImageView = SessionImageView()
|
|
result.contentMode = .scaleAspectFill
|
|
|
|
return result
|
|
}()
|
|
|
|
private let contentTypeBadgeView: UIImageView = {
|
|
let result: UIImageView = UIImageView()
|
|
result.image = UIImage(named: "ic_gallery_badge_video")
|
|
result.isHidden = true
|
|
|
|
return result
|
|
}()
|
|
|
|
private let selectedBadgeView: UIImageView = {
|
|
let result: UIImageView = UIImageView()
|
|
result.image = UIImage(systemName: "checkmark.circle.fill")?.withRenderingMode(.alwaysTemplate)
|
|
result.themeTintColor = .primary
|
|
result.themeBorderColor = .textPrimary
|
|
result.themeBackgroundColor = .textPrimary
|
|
result.isHidden = true
|
|
result.layer.cornerRadius = (PhotoGridViewCell.badgeSize.width / 2)
|
|
|
|
return result
|
|
}()
|
|
|
|
private let highlightedView: UIView = {
|
|
let result: UIView = UIView()
|
|
result.alpha = 0.2
|
|
result.themeBackgroundColor = .black
|
|
result.isHidden = true
|
|
|
|
return result
|
|
}()
|
|
|
|
private let selectedView: UIView = {
|
|
let result: UIView = UIView()
|
|
result.alpha = 0.3
|
|
result.themeBackgroundColor = .black
|
|
result.isHidden = true
|
|
|
|
return result
|
|
}()
|
|
|
|
private let activityIndictor: UIActivityIndicatorView = {
|
|
let result: UIActivityIndicatorView = UIActivityIndicatorView(style: .medium)
|
|
result.startAnimating()
|
|
result.hidesWhenStopped = true
|
|
|
|
return result
|
|
}()
|
|
|
|
var item: PhotoGridItem?
|
|
|
|
private static let selectedBadgeImage = UIImage(systemName: "checkmark.circle.fill")
|
|
|
|
override public var isSelected: Bool {
|
|
didSet {
|
|
self.selectedBadgeView.isHidden = !self.isSelected
|
|
self.selectedView.isHidden = !self.isSelected
|
|
}
|
|
}
|
|
|
|
override public var isHighlighted: Bool {
|
|
didSet {
|
|
self.highlightedView.isHidden = !self.isHighlighted
|
|
}
|
|
}
|
|
|
|
override init(frame: CGRect) {
|
|
super.init(frame: frame)
|
|
|
|
self.clipsToBounds = true
|
|
|
|
self.contentView.addSubview(imageView)
|
|
self.contentView.addSubview(contentTypeBadgeView)
|
|
self.contentView.addSubview(highlightedView)
|
|
self.contentView.addSubview(selectedView)
|
|
self.contentView.addSubview(selectedBadgeView)
|
|
self.contentView.addSubview(activityIndictor)
|
|
|
|
imageView.pin(to: contentView)
|
|
highlightedView.pin(to: contentView)
|
|
selectedView.pin(to: contentView)
|
|
|
|
// Note assets were rendered to match exactly. We don't want to re-size with
|
|
// content mode lest they become less legible.
|
|
contentTypeBadgeView.pin(.leading, to: .leading, of: contentView, withInset: 3)
|
|
contentTypeBadgeView.pin(.bottom, to: .bottom, of: contentView, withInset: -3)
|
|
contentTypeBadgeView.set(.width, to: 18)
|
|
contentTypeBadgeView.set(.height, to: 12)
|
|
|
|
selectedBadgeView.pin(.trailing, to: .trailing, of: contentView, withInset: -Values.verySmallSpacing)
|
|
selectedBadgeView.pin(.bottom, to: .bottom, of: contentView, withInset: -Values.verySmallSpacing)
|
|
selectedBadgeView.set(.width, to: PhotoGridViewCell.badgeSize.width)
|
|
selectedBadgeView.set(.height, to: PhotoGridViewCell.badgeSize.height)
|
|
|
|
activityIndictor.center(in: self.contentView)
|
|
}
|
|
|
|
@available(*, unavailable, message: "Unimplemented")
|
|
required public init?(coder aDecoder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
public func configure(item: PhotoGridItem, using dependencies: Dependencies) {
|
|
self.item = item
|
|
imageView.setDataManager(dependencies[singleton: .imageDataManager])
|
|
imageView.themeBackgroundColor = .backgroundSecondary
|
|
imageView.loadImage(item.source) { [weak imageView, weak activityIndictor] buffer in
|
|
activityIndictor?.stopAnimating()
|
|
|
|
if buffer == nil {
|
|
imageView?.image = UIImage(named: "media_invalid")?.withRenderingMode(.alwaysTemplate)
|
|
imageView?.themeTintColor = .textPrimary
|
|
imageView?.themeBackgroundColor = .backgroundSecondary
|
|
imageView?.contentMode = .center
|
|
}
|
|
else {
|
|
imageView?.themeBackgroundColor = .clear
|
|
imageView?.contentMode = .scaleAspectFill
|
|
}
|
|
}
|
|
|
|
contentTypeBadgeView.isHidden = !item.isVideo
|
|
}
|
|
|
|
override public func prepareForReuse() {
|
|
super.prepareForReuse()
|
|
|
|
self.item = nil
|
|
self.contentTypeBadgeView.isHidden = true
|
|
self.highlightedView.isHidden = true
|
|
self.selectedView.isHidden = true
|
|
self.selectedBadgeView.isHidden = true
|
|
}
|
|
}
|