From 3bbbb050836e5fd43b587cd434ad1b6675e3b0db Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Tue, 17 Mar 2020 21:24:15 -0400 Subject: [PATCH] Rename AttachmentsViewController to LoadingLargeImageViewController and make non-specific to attachments --- Tusker.xcodeproj/project.pbxproj | 8 +- .../AttachmentViewController.swift | 32 +++--- .../GalleryViewController.swift | 8 +- .../LoadingLargeImageViewController.swift | 97 +++++++++++++++++++ 4 files changed, 125 insertions(+), 20 deletions(-) create mode 100644 Tusker/Screens/Large Image/LoadingLargeImageViewController.swift diff --git a/Tusker.xcodeproj/project.pbxproj b/Tusker.xcodeproj/project.pbxproj index 6ca4175d..d7233401 100644 --- a/Tusker.xcodeproj/project.pbxproj +++ b/Tusker.xcodeproj/project.pbxproj @@ -7,7 +7,7 @@ objects = { /* Begin PBXBuildFile section */ - 0411610022B442870030A9B7 /* AttachmentViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041160FE22B442870030A9B7 /* AttachmentViewController.swift */; }; + 0411610022B442870030A9B7 /* LoadingLargeImageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 041160FE22B442870030A9B7 /* LoadingLargeImageViewController.swift */; }; 0427033822B30F5F000D31B6 /* BehaviorPrefsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0427033722B30F5F000D31B6 /* BehaviorPrefsView.swift */; }; 0427033A22B31269000D31B6 /* AdvancedPrefsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0427033922B31269000D31B6 /* AdvancedPrefsView.swift */; }; 0427037C22B316B9000D31B6 /* SilentActionPrefs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0427037B22B316B9000D31B6 /* SilentActionPrefs.swift */; }; @@ -288,7 +288,7 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - 041160FE22B442870030A9B7 /* AttachmentViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AttachmentViewController.swift; sourceTree = ""; }; + 041160FE22B442870030A9B7 /* LoadingLargeImageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingLargeImageViewController.swift; sourceTree = ""; }; 0427033722B30F5F000D31B6 /* BehaviorPrefsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BehaviorPrefsView.swift; sourceTree = ""; }; 0427033922B31269000D31B6 /* AdvancedPrefsView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AdvancedPrefsView.swift; sourceTree = ""; }; 0427037B22B316B9000D31B6 /* SilentActionPrefs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SilentActionPrefs.swift; sourceTree = ""; }; @@ -570,7 +570,6 @@ isa = PBXGroup; children = ( 04D14BAE22B34A2800642648 /* GalleryViewController.swift */, - 041160FE22B442870030A9B7 /* AttachmentViewController.swift */, ); path = "Attachment Gallery"; sourceTree = ""; @@ -879,6 +878,7 @@ D646C954213B364600269FB5 /* Transitions */, D6289E83217B795D0003D1D7 /* LargeImageViewController.xib */, D6C94D862139E62700CB5196 /* LargeImageViewController.swift */, + 041160FE22B442870030A9B7 /* LoadingLargeImageViewController.swift */, ); path = "Large Image"; sourceTree = ""; @@ -1614,7 +1614,7 @@ D6C7D27D22B6EBF800071952 /* AttachmentsContainerView.swift in Sources */, D620483823D38190008A63EF /* StatusContentTextView.swift in Sources */, D6F953F021251A2900CF0F2B /* MastodonController.swift in Sources */, - 0411610022B442870030A9B7 /* AttachmentViewController.swift in Sources */, + 0411610022B442870030A9B7 /* LoadingLargeImageViewController.swift in Sources */, D611C2CF232DC61100C86A49 /* HashtagTableViewCell.swift in Sources */, D627944F23A9C99800D38C68 /* EditListAccountsViewController.swift in Sources */, D6945C3423AC6431005C403C /* AddSavedHashtagViewController.swift in Sources */, diff --git a/Tusker/Screens/Attachment Gallery/AttachmentViewController.swift b/Tusker/Screens/Attachment Gallery/AttachmentViewController.swift index 807dd4db..f61c3c5e 100644 --- a/Tusker/Screens/Attachment Gallery/AttachmentViewController.swift +++ b/Tusker/Screens/Attachment Gallery/AttachmentViewController.swift @@ -8,14 +8,16 @@ import UIKit import Pachyderm -class AttachmentViewController: UIViewController { - - let attachment: Attachment +class PendingLargeImageViewController: UIViewController { + let url: URL + let cache: ImageCache + let imageDescription: String? + var largeImageVC: LargeImageViewController? var loadingVC: LoadingViewController? - var attachmentRequest: ImageCache.Request? + var imageRequest: ImageCache.Request? private var initialControlsVisible: Bool = true var controlsVisible: Bool { @@ -35,12 +37,18 @@ class AttachmentViewController: UIViewController { return largeImageVC } - init(attachment: Attachment) { - self.attachment = attachment + init(url: URL, cache: ImageCache, imageDescription: String?) { + self.url = url + self.cache = cache + self.imageDescription = imageDescription super.init(nibName: nil, bundle: nil) } + convenience init(attachment: Attachment) { + self.init(url: attachment.url, cache: .attachments, imageDescription: attachment.description) + } + required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @@ -51,14 +59,14 @@ class AttachmentViewController: UIViewController { overrideUserInterfaceStyle = .dark view.backgroundColor = .black - if let data = ImageCache.attachments.get(attachment.url) { + if let data = cache.get(url) { createLargeImage(data: data) } else { loadingVC = LoadingViewController() embedChild(loadingVC!) - attachmentRequest = ImageCache.attachments.get(attachment.url) { [weak self] (data) in + imageRequest = cache.get(url) { [weak self] (data) in guard let self = self else { return } - self.attachmentRequest = nil + self.imageRequest = nil DispatchQueue.main.async { self.loadingVC?.removeViewAndController() self.createLargeImage(data: data!) @@ -71,16 +79,16 @@ class AttachmentViewController: UIViewController { super.didMove(toParent: parent) if parent == nil { - attachmentRequest?.cancel() + imageRequest?.cancel() } } func createLargeImage(data: Data) { guard let image = UIImage(data: data) else { return } - largeImageVC = LargeImageViewController(image: image, description: attachment.description, sourceInfo: nil) + largeImageVC = LargeImageViewController(image: image, description: imageDescription, sourceInfo: nil) largeImageVC!.initialControlsVisible = initialControlsVisible largeImageVC!.shrinkGestureEnabled = false - if attachment.url.pathExtension == "gif" { + if url.pathExtension == "gif" { largeImageVC!.gifData = data } embedChild(largeImageVC!) diff --git a/Tusker/Screens/Attachment Gallery/GalleryViewController.swift b/Tusker/Screens/Attachment Gallery/GalleryViewController.swift index 29cb5c60..ff203f03 100644 --- a/Tusker/Screens/Attachment Gallery/GalleryViewController.swift +++ b/Tusker/Screens/Attachment Gallery/GalleryViewController.swift @@ -31,7 +31,7 @@ class GalleryViewController: UIPageViewController, UIPageViewControllerDataSourc if let sourceImage = sourcesInfo[currentIndex]?.image { return sourceImage } else { - return (pages[currentIndex] as? AttachmentViewController)?.largeImageVC?.image + return (pages[currentIndex] as? LoadingLargeImageViewController)?.largeImageVC?.image } } var animationGifData: Data? { @@ -67,7 +67,7 @@ class GalleryViewController: UIPageViewController, UIPageViewControllerDataSourc self.pages = attachments.map { switch $0.kind { case .image: - return AttachmentViewController(attachment: $0) + return LoadingLargeImageViewController(attachment: $0) case .video, .audio: let vc = AVPlayerViewController() vc.player = AVPlayer(url: $0.url) @@ -133,8 +133,8 @@ class GalleryViewController: UIPageViewController, UIPageViewControllerDataSourc // MARK: - Page View Controller Delegate func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { - if let pending = pendingViewControllers.first as? AttachmentViewController, - let current = viewControllers!.first as? AttachmentViewController { + if let pending = pendingViewControllers.first as? LoadingLargeImageViewController, + let current = viewControllers!.first as? LoadingLargeImageViewController { pending.controlsVisible = current.controlsVisible } diff --git a/Tusker/Screens/Large Image/LoadingLargeImageViewController.swift b/Tusker/Screens/Large Image/LoadingLargeImageViewController.swift new file mode 100644 index 00000000..35b90d2f --- /dev/null +++ b/Tusker/Screens/Large Image/LoadingLargeImageViewController.swift @@ -0,0 +1,97 @@ +// LoadingLargeImageViewController.swift +// Tusker +// +// Created by Shadowfacts on 6/14/19. +// Copyright © 2019 Shadowfacts. All rights reserved. +// + +import UIKit +import Pachyderm + +class LoadingLargeImageViewController: UIViewController { + + let url: URL + let cache: ImageCache + let imageDescription: String? + + var largeImageVC: LargeImageViewController? + var loadingVC: LoadingViewController? + + var imageRequest: ImageCache.Request? + + 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 + } + } + } + + override var childForHomeIndicatorAutoHidden: UIViewController? { + return largeImageVC + } + + init(url: URL, cache: ImageCache, imageDescription: String?) { + self.url = url + self.cache = cache + self.imageDescription = imageDescription + + super.init(nibName: nil, bundle: nil) + } + + convenience init(attachment: Attachment) { + self.init(url: attachment.url, cache: .attachments, imageDescription: attachment.description) + } + + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } + + override func viewDidLoad() { + super.viewDidLoad() + + overrideUserInterfaceStyle = .dark + view.backgroundColor = .black + + if let data = cache.get(url) { + createLargeImage(data: data) + } else { + loadingVC = LoadingViewController() + embedChild(loadingVC!) + imageRequest = cache.get(url) { [weak self] (data) in + guard let self = self else { return } + self.imageRequest = nil + DispatchQueue.main.async { + self.loadingVC?.removeViewAndController() + self.createLargeImage(data: data!) + } + } + } + } + + override func didMove(toParent parent: UIViewController?) { + super.didMove(toParent: parent) + + if parent == nil { + imageRequest?.cancel() + } + } + + func createLargeImage(data: Data) { + guard let image = UIImage(data: data) else { return } + largeImageVC = LargeImageViewController(image: image, description: imageDescription, sourceInfo: nil) + largeImageVC!.initialControlsVisible = initialControlsVisible + largeImageVC!.shrinkGestureEnabled = false + if url.pathExtension == "gif" { + largeImageVC!.gifData = data + } + embedChild(largeImageVC!) + } + +}