138 lines
4.5 KiB
Swift
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()
|
|
}
|
|
|
|
}
|