mirror of https://github.com/oxen-io/session-ios
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.8 KiB
Swift
152 lines
4.8 KiB
Swift
//
|
|
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
|
|
//
|
|
|
|
import UIKit
|
|
import SessionUIKit
|
|
|
|
public enum PhotoGridItemType {
|
|
case photo, animated, video
|
|
}
|
|
|
|
public protocol PhotoGridItem: AnyObject {
|
|
var type: PhotoGridItemType { get }
|
|
|
|
func asyncThumbnail(completion: @escaping (UIImage?) -> Void)
|
|
}
|
|
|
|
public class PhotoGridViewCell: UICollectionViewCell {
|
|
|
|
static let reuseIdentifier = "PhotoGridViewCell"
|
|
|
|
public let imageView: UIImageView
|
|
|
|
private let contentTypeBadgeView: UIImageView
|
|
private let selectedBadgeView: UIImageView
|
|
|
|
private let highlightedView: UIView
|
|
private let selectedView: UIView
|
|
|
|
var item: PhotoGridItem?
|
|
|
|
private static let videoBadgeImage = #imageLiteral(resourceName: "ic_gallery_badge_video")
|
|
private static let animatedBadgeImage = #imageLiteral(resourceName: "ic_gallery_badge_gif")
|
|
private static let selectedBadgeImage = #imageLiteral(resourceName: "selected_blue_circle")
|
|
|
|
public var loadingColor = Colors.unimportant
|
|
|
|
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) {
|
|
self.imageView = UIImageView()
|
|
imageView.contentMode = .scaleAspectFill
|
|
|
|
self.contentTypeBadgeView = UIImageView()
|
|
contentTypeBadgeView.isHidden = true
|
|
|
|
self.selectedBadgeView = UIImageView()
|
|
selectedBadgeView.image = PhotoGridViewCell.selectedBadgeImage
|
|
selectedBadgeView.isHidden = true
|
|
|
|
self.highlightedView = UIView()
|
|
highlightedView.alpha = 0.2
|
|
highlightedView.backgroundColor = Colors.cellSelected
|
|
highlightedView.isHidden = true
|
|
|
|
self.selectedView = UIView()
|
|
selectedView.alpha = 0.3
|
|
selectedView.backgroundColor = Colors.cellSelected
|
|
selectedView.isHidden = true
|
|
|
|
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)
|
|
|
|
imageView.autoPinEdgesToSuperviewEdges()
|
|
highlightedView.autoPinEdgesToSuperviewEdges()
|
|
selectedView.autoPinEdgesToSuperviewEdges()
|
|
|
|
// Note assets were rendered to match exactly. We don't want to re-size with
|
|
// content mode lest they become less legible.
|
|
let kContentTypeBadgeSize = CGSize(width: 18, height: 12)
|
|
contentTypeBadgeView.autoPinEdge(toSuperviewEdge: .leading, withInset: 3)
|
|
contentTypeBadgeView.autoPinEdge(toSuperviewEdge: .bottom, withInset: 3)
|
|
contentTypeBadgeView.autoSetDimensions(to: kContentTypeBadgeSize)
|
|
|
|
let kSelectedBadgeSize = CGSize(width: 31, height: 31)
|
|
selectedBadgeView.autoPinEdge(toSuperviewEdge: .trailing, withInset: 0)
|
|
selectedBadgeView.autoPinEdge(toSuperviewEdge: .bottom, withInset: 0)
|
|
selectedBadgeView.autoSetDimensions(to: kSelectedBadgeSize)
|
|
}
|
|
|
|
@available(*, unavailable, message: "Unimplemented")
|
|
required public init?(coder aDecoder: NSCoder) {
|
|
notImplemented()
|
|
}
|
|
|
|
var image: UIImage? {
|
|
get { return imageView.image }
|
|
set {
|
|
imageView.image = newValue
|
|
imageView.backgroundColor = newValue == nil ? loadingColor : .clear
|
|
}
|
|
}
|
|
|
|
var contentTypeBadgeImage: UIImage? {
|
|
get { return contentTypeBadgeView.image }
|
|
set {
|
|
contentTypeBadgeView.image = newValue
|
|
contentTypeBadgeView.isHidden = newValue == nil
|
|
}
|
|
}
|
|
|
|
public func configure(item: PhotoGridItem) {
|
|
self.item = item
|
|
|
|
item.asyncThumbnail { [weak self] image in
|
|
guard let currentItem = self?.item else { return }
|
|
guard currentItem === item else { return }
|
|
|
|
if image == nil {
|
|
Logger.debug("image == nil")
|
|
}
|
|
|
|
self?.image = image
|
|
}
|
|
|
|
switch item.type {
|
|
case .video: self.contentTypeBadgeImage = PhotoGridViewCell.videoBadgeImage
|
|
case .animated: self.contentTypeBadgeImage = PhotoGridViewCell.animatedBadgeImage
|
|
case .photo: self.contentTypeBadgeImage = nil
|
|
}
|
|
}
|
|
|
|
override public func prepareForReuse() {
|
|
super.prepareForReuse()
|
|
|
|
self.item = nil
|
|
self.imageView.image = nil
|
|
self.contentTypeBadgeView.isHidden = true
|
|
self.highlightedView.isHidden = true
|
|
self.selectedView.isHidden = true
|
|
self.selectedBadgeView.isHidden = true
|
|
}
|
|
}
|