2020-03-18 01:24:15 +00:00
|
|
|
// LoadingLargeImageViewController.swift
|
|
|
|
// Tusker
|
|
|
|
//
|
|
|
|
// Created by Shadowfacts on 6/14/19.
|
|
|
|
// Copyright © 2019 Shadowfacts. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
import UIKit
|
|
|
|
import Pachyderm
|
|
|
|
|
2020-03-18 01:42:09 +00:00
|
|
|
class LoadingLargeImageViewController: UIViewController, LargeImageAnimatableViewController {
|
|
|
|
|
2020-09-12 14:48:27 +00:00
|
|
|
private var attachment: Attachment?
|
2020-03-18 01:24:15 +00:00
|
|
|
let url: URL
|
|
|
|
let cache: ImageCache
|
|
|
|
let imageDescription: String?
|
|
|
|
|
2020-09-12 14:48:27 +00:00
|
|
|
private(set) var loaded = false
|
|
|
|
private(set) var largeImageVC: LargeImageViewController?
|
|
|
|
private var loadingVC: LoadingViewController?
|
2020-03-18 01:24:15 +00:00
|
|
|
|
2020-09-12 14:48:27 +00:00
|
|
|
private var imageRequest: ImageCache.Request?
|
2020-03-18 01:24:15 +00:00
|
|
|
|
|
|
|
private var initialControlsVisible: Bool = true
|
|
|
|
var controlsVisible: Bool {
|
|
|
|
get {
|
|
|
|
return largeImageVC?.controlsVisible ?? initialControlsVisible
|
|
|
|
}
|
|
|
|
set {
|
|
|
|
if let largeImageVC = largeImageVC {
|
|
|
|
largeImageVC.setControlsVisible(newValue, animated: false)
|
|
|
|
} else {
|
|
|
|
initialControlsVisible = newValue
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2020-03-18 01:56:29 +00:00
|
|
|
var shrinkGestureEnabled = true
|
|
|
|
|
2020-03-26 03:10:48 +00:00
|
|
|
weak var animationSourceView: UIImageView?
|
2020-09-09 03:41:11 +00:00
|
|
|
var largeImageController: LargeImageViewController? { largeImageVC }
|
2020-06-18 03:33:48 +00:00
|
|
|
var animationImage: UIImage? { largeImageVC?.animationImage ?? animationSourceView?.image }
|
|
|
|
var animationGifData: Data? { largeImageVC?.animationGifData }
|
2020-03-18 01:42:09 +00:00
|
|
|
var dismissInteractionController: LargeImageInteractionController?
|
|
|
|
|
|
|
|
override var prefersStatusBarHidden: Bool {
|
|
|
|
return true
|
|
|
|
}
|
2020-09-09 03:41:11 +00:00
|
|
|
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
|
|
|
|
return .none
|
|
|
|
}
|
2020-03-18 01:24:15 +00:00
|
|
|
override var childForHomeIndicatorAutoHidden: UIViewController? {
|
|
|
|
return largeImageVC
|
|
|
|
}
|
2020-03-18 01:42:09 +00:00
|
|
|
override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
|
|
|
|
if UIDevice.current.userInterfaceIdiom == .phone {
|
|
|
|
return .allButUpsideDown
|
|
|
|
} else {
|
|
|
|
return .all
|
|
|
|
}
|
|
|
|
}
|
2020-03-18 01:24:15 +00:00
|
|
|
|
|
|
|
init(url: URL, cache: ImageCache, imageDescription: String?) {
|
|
|
|
self.url = url
|
|
|
|
self.cache = cache
|
|
|
|
self.imageDescription = imageDescription
|
|
|
|
|
|
|
|
super.init(nibName: nil, bundle: nil)
|
2020-03-18 01:42:09 +00:00
|
|
|
|
|
|
|
modalPresentationStyle = .fullScreen
|
2020-03-18 01:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
convenience init(attachment: Attachment) {
|
|
|
|
self.init(url: attachment.url, cache: .attachments, imageDescription: attachment.description)
|
2020-09-12 14:48:27 +00:00
|
|
|
self.attachment = attachment
|
2020-03-18 01:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
required init?(coder: NSCoder) {
|
|
|
|
fatalError("init(coder:) has not been implemented")
|
|
|
|
}
|
|
|
|
|
|
|
|
override func viewDidLoad() {
|
|
|
|
super.viewDidLoad()
|
|
|
|
|
|
|
|
overrideUserInterfaceStyle = .dark
|
|
|
|
view.backgroundColor = .black
|
|
|
|
|
2021-01-20 23:31:30 +00:00
|
|
|
// always load full resolution from disk for large image, in case the cache is scaled
|
|
|
|
if let entry = cache.get(url, loadOriginal: true) {
|
2021-01-17 16:45:04 +00:00
|
|
|
createLargeImage(data: entry.data, image: entry.image, url: url)
|
2020-03-18 01:24:15 +00:00
|
|
|
} else {
|
2020-09-12 14:48:27 +00:00
|
|
|
createPreview()
|
|
|
|
|
2020-03-18 01:24:15 +00:00
|
|
|
loadingVC = LoadingViewController()
|
|
|
|
embedChild(loadingVC!)
|
2021-01-20 23:31:30 +00:00
|
|
|
imageRequest = cache.get(url, loadOriginal: true) { [weak self] (data, image) in
|
2021-04-04 18:05:00 +00:00
|
|
|
guard let self = self, let image = image else { return }
|
2020-03-18 01:24:15 +00:00
|
|
|
self.imageRequest = nil
|
|
|
|
DispatchQueue.main.async {
|
|
|
|
self.loadingVC?.removeViewAndController()
|
2021-04-04 18:05:00 +00:00
|
|
|
self.createLargeImage(data: data, image: image, url: self.url)
|
2020-03-18 01:24:15 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2020-03-18 01:42:09 +00:00
|
|
|
|
2020-03-18 01:56:29 +00:00
|
|
|
if shrinkGestureEnabled {
|
|
|
|
dismissInteractionController = LargeImageInteractionController(viewController: self)
|
|
|
|
}
|
2020-03-18 01:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
override func didMove(toParent parent: UIViewController?) {
|
|
|
|
super.didMove(toParent: parent)
|
|
|
|
|
|
|
|
if parent == nil {
|
|
|
|
imageRequest?.cancel()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-01-17 16:45:04 +00:00
|
|
|
private func createLargeImage(data: Data?, image: UIImage, url: URL) {
|
2020-09-12 14:48:27 +00:00
|
|
|
guard !loaded else { return }
|
|
|
|
loaded = true
|
2020-11-01 18:59:58 +00:00
|
|
|
|
2021-01-16 20:24:15 +00:00
|
|
|
if let transformedImage = ImageGrayscalifier.convertIfNecessary(url: url, image: image) {
|
2020-11-01 18:59:58 +00:00
|
|
|
let gifData = url.pathExtension == "gif" ? data : nil
|
2021-01-16 20:24:15 +00:00
|
|
|
createLargeImage(image: transformedImage, gifData: gifData)
|
2020-11-01 18:59:58 +00:00
|
|
|
}
|
2020-09-12 14:48:27 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
private func createLargeImage(image: UIImage, gifData: Data?) {
|
2020-06-18 03:33:48 +00:00
|
|
|
let imageView = LargeImageImageContentView(image: image, gifData: gifData)
|
2020-09-12 14:48:27 +00:00
|
|
|
|
|
|
|
if let existing = largeImageVC {
|
|
|
|
existing.contentView = imageView
|
|
|
|
} else {
|
|
|
|
largeImageVC = LargeImageViewController(contentView: imageView, description: imageDescription, sourceView: animationSourceView)
|
|
|
|
largeImageVC!.initialControlsVisible = initialControlsVisible
|
|
|
|
largeImageVC!.shrinkGestureEnabled = false
|
|
|
|
embedChild(largeImageVC!)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private func createPreview() {
|
|
|
|
guard !self.loaded,
|
2020-11-01 18:59:58 +00:00
|
|
|
var image = animationSourceView?.image else { return }
|
2020-09-12 14:48:27 +00:00
|
|
|
|
2020-11-01 18:59:58 +00:00
|
|
|
if Preferences.shared.grayscaleImages,
|
|
|
|
let source = image.cgImage,
|
|
|
|
let grayscale = ImageGrayscalifier.convert(url: nil, cgImage: source) {
|
|
|
|
image = grayscale
|
|
|
|
}
|
2020-09-12 14:48:27 +00:00
|
|
|
self.createLargeImage(image: image, gifData: nil)
|
2020-03-18 01:24:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|