PhotoRank/PhotoRank/Asset Comparison/AssetComparisonViewControll...

138 lines
4.5 KiB
Swift

//
// AssetComparisonViewController.swift
// PhotoRank
//
// Created by Shadowfacts on 8/3/19.
// Copyright © 2019 Shadowfacts. All rights reserved.
//
import UIKit
import Photos
class AssetComparisonViewController: UIViewController {
let allAssets: [PHAsset]
var assetScores = [String: Int]()
let assetPairs: [[PHAsset]]
var currentPairIndex: Int = 0 {
didSet {
currentAssetPair = assetPairs[currentPairIndex]
currentlySelected = 0
}
}
var currentlySelected: Int = 0 {
didSet {
largeImage.image = currentImagePair[currentlySelected]
}
}
var currentAssetPair: [PHAsset]! {
didSet {
loadImages()
}
}
var currentImagePair: [UIImage?] = [nil, nil] {
didSet {
largeImage.image = currentImagePair[currentlySelected]
}
}
let largeImage = LargeImageViewController()
@IBOutlet var imageContainerView: UIView!
init(assets: [PHAsset]) {
guard assets.count >= 2 else { fatalError("AssetComparisonViewController requires at least 2 assets") }
self.allAssets = assets
self.assetPairs = assets.allPairs()
self.currentAssetPair = assetPairs.first!
super.init(nibName: "AssetComparisonViewController", bundle: .main)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
largeImage.view.translatesAutoresizingMaskIntoConstraints = false
imageContainerView.addSubview(largeImage.view)
NSLayoutConstraint.activate([
largeImage.view.leadingAnchor.constraint(equalTo: imageContainerView.leadingAnchor),
largeImage.view.topAnchor.constraint(equalTo: imageContainerView.topAnchor),
imageContainerView.trailingAnchor.constraint(equalTo: largeImage.view.trailingAnchor),
imageContainerView.bottomAnchor.constraint(equalTo: largeImage.view.bottomAnchor),
])
addChild(largeImage)
toolbarItems = [
UIBarButtonItem(title: "Skip", style: .plain, target: self, action: #selector(moveToNextPair)),
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
UIBarButtonItem(title: "Switch", style: .plain, target: self, action: #selector(switchButtonPressed)),
UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil),
UIBarButtonItem(title: "Pick", style: .plain, target: self, action: #selector(pickButtonPressed))
]
loadImages()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController!.isToolbarHidden = false
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController!.isToolbarHidden = true
}
func loadImages() {
self.currentlySelected = 0
self.currentImagePair = [nil, nil]
PhotosHelper.requestFullSizeImage(for: currentAssetPair[0]) { (image) in
DispatchQueue.main.async {
self.currentImagePair = [image, self.currentImagePair[1]]
}
}
PhotosHelper.requestFullSizeImage(for: currentAssetPair[1]) { (image) in
DispatchQueue.main.async {
self.currentImagePair = [self.currentImagePair[0], image]
}
}
}
@objc func switchButtonPressed() {
currentlySelected = currentlySelected == 0 ? 1 : 0
}
@objc func moveToNextPair() {
if currentPairIndex == assetPairs.count - 1 {
print("finished: \(assetScores)")
// sorts assets by score in descending order
let sorted = allAssets
.map { ($0, assetScores[$0.localIdentifier] ?? 0) }
.sorted { (first, second) -> Bool in
return first.1 > second.1
}
let rankings = RankingsTableViewController(rankings: sorted)
show(rankings, sender: nil)
} else {
currentPairIndex += 1
}
}
@objc func pickButtonPressed() {
let identifier = currentAssetPair[currentlySelected].localIdentifier
let current = assetScores[identifier] ?? 0
assetScores[identifier] = current + 1
moveToNextPair()
}
}