138 lines
4.3 KiB
Swift
138 lines
4.3 KiB
Swift
//
|
|
// FileListViewController.swift
|
|
// FileBrowser
|
|
//
|
|
// Created by Roy Marmelstein on 12/02/2016.
|
|
// Copyright © 2016 Roy Marmelstein. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
class FileListViewController: UIViewController {
|
|
|
|
// TableView
|
|
@IBOutlet weak var tableView: UITableView!
|
|
let collation = UILocalizedIndexedCollation.current()
|
|
|
|
/// Data
|
|
var didSelectFile: ((FBFile) -> ())?
|
|
var files = [FBFile]()
|
|
var initialPath: URL?
|
|
let parser = FileParser.sharedInstance
|
|
let previewManager = PreviewManager()
|
|
var sections: [[FBFile]] = []
|
|
var allowEditing: Bool = false
|
|
|
|
// Search controller
|
|
var filteredFiles = [FBFile]()
|
|
let searchController: UISearchController = {
|
|
let searchController = UISearchController(searchResultsController: nil)
|
|
searchController.searchBar.searchBarStyle = .minimal
|
|
searchController.searchBar.backgroundColor = UIColor.white
|
|
searchController.dimsBackgroundDuringPresentation = false
|
|
return searchController
|
|
}()
|
|
|
|
|
|
//MARK: Lifecycle
|
|
convenience init (initialPath: URL) {
|
|
self.init(initialPath: initialPath, showCancelButton: true)
|
|
}
|
|
|
|
convenience init (initialPath: URL, showCancelButton: Bool) {
|
|
self.init(nibName: "FileBrowser", bundle: Bundle(for: FileListViewController.self))
|
|
self.edgesForExtendedLayout = UIRectEdge()
|
|
|
|
// Set initial path
|
|
self.initialPath = initialPath
|
|
self.title = initialPath.lastPathComponent
|
|
|
|
// Set search controller delegates
|
|
searchController.searchResultsUpdater = self
|
|
searchController.searchBar.delegate = self
|
|
searchController.delegate = self
|
|
|
|
if showCancelButton {
|
|
// Add dismiss button
|
|
let dismissButton = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(FileListViewController.dismiss(button:)))
|
|
self.navigationItem.rightBarButtonItem = dismissButton
|
|
}
|
|
}
|
|
|
|
deinit{
|
|
if #available(iOS 9.0, *) {
|
|
searchController.loadViewIfNeeded()
|
|
} else {
|
|
searchController.loadView()
|
|
}
|
|
}
|
|
|
|
func prepareData() {
|
|
// Prepare data
|
|
if let initialPath = initialPath {
|
|
files = parser.filesForDirectory(initialPath)
|
|
indexFiles()
|
|
}
|
|
}
|
|
|
|
//MARK: UIViewController
|
|
|
|
override func viewDidLoad() {
|
|
|
|
prepareData()
|
|
|
|
// Set search bar
|
|
tableView.tableHeaderView = searchController.searchBar
|
|
|
|
// Register for 3D touch
|
|
self.registerFor3DTouch()
|
|
}
|
|
|
|
override func viewWillAppear(_ animated: Bool) {
|
|
super.viewWillAppear(animated)
|
|
|
|
// Scroll to hide search bar
|
|
self.tableView.contentOffset = CGPoint(x: 0, y: searchController.searchBar.frame.size.height)
|
|
|
|
// Make sure navigation bar is visible
|
|
self.navigationController?.isNavigationBarHidden = false
|
|
}
|
|
|
|
@objc func dismiss(button: UIBarButtonItem = UIBarButtonItem()) {
|
|
self.dismiss(animated: true, completion: nil)
|
|
}
|
|
|
|
//MARK: Data
|
|
|
|
func indexFiles() {
|
|
let selector: Selector = #selector(getter: FBFile.displayName)
|
|
sections = Array(repeating: [], count: collation.sectionTitles.count)
|
|
if let sortedObjects = collation.sortedArray(from: files, collationStringSelector: selector) as? [FBFile]{
|
|
for object in sortedObjects {
|
|
let sectionNumber = collation.section(for: object, collationStringSelector: selector)
|
|
sections[sectionNumber].append(object)
|
|
}
|
|
}
|
|
}
|
|
|
|
func fileForIndexPath(_ indexPath: IndexPath) -> FBFile {
|
|
var file: FBFile
|
|
if searchController.isActive {
|
|
file = filteredFiles[(indexPath as NSIndexPath).row]
|
|
}
|
|
else {
|
|
file = sections[(indexPath as NSIndexPath).section][(indexPath as NSIndexPath).row]
|
|
}
|
|
return file
|
|
}
|
|
|
|
func filterContentForSearchText(_ searchText: String) {
|
|
filteredFiles = files.filter({ (file: FBFile) -> Bool in
|
|
return file.displayName.lowercased().contains(searchText.lowercased())
|
|
})
|
|
tableView.reloadData()
|
|
}
|
|
|
|
}
|
|
|