From a3f1687e54ef64ed2afb9b45a18ea3b2b2b71bdc Mon Sep 17 00:00:00 2001 From: Chris Li Date: Thu, 12 Jan 2017 13:41:54 -0500 Subject: [PATCH] Basic for bookmarks --- .../Bookmark/BookmarkBooksController.swift | 71 +++++++ .../Bookmark/BookmarkSplitController.swift | 36 ++++ Kiwix-iOS/Controller/Main/Buttons.swift | 2 + Kiwix-iOS/Controller/Main/Controllers.swift | 19 +- Kiwix-iOS/Controller/Main/MainDelegates.swift | 6 +- Kiwix-iOS/Storyboard/Bookmark.storyboard | 201 +++++++++++++++++- Kiwix.xcodeproj/project.pbxproj | 12 +- Kiwix/CoreData/Classes/Book.swift | 11 +- 8 files changed, 325 insertions(+), 33 deletions(-) create mode 100644 Kiwix-iOS/Controller/Bookmark/BookmarkBooksController.swift create mode 100644 Kiwix-iOS/Controller/Bookmark/BookmarkSplitController.swift diff --git a/Kiwix-iOS/Controller/Bookmark/BookmarkBooksController.swift b/Kiwix-iOS/Controller/Bookmark/BookmarkBooksController.swift new file mode 100644 index 00000000..97e27a53 --- /dev/null +++ b/Kiwix-iOS/Controller/Bookmark/BookmarkBooksController.swift @@ -0,0 +1,71 @@ +// +// BookmarkBooksController.swift +// Kiwix +// +// Created by Chris Li on 1/11/17. +// Copyright © 2017 Chris Li. All rights reserved. +// + +import UIKit +import CoreData + +class BookmarkBooksController: CoreDataTableBaseController, UITableViewDelegate, UITableViewDataSource { + override func viewDidLoad() { + super.viewDidLoad() + title = "Bookmarks" + } + + + @IBAction func dismiss(_ sender: UIBarButtonItem) { + dismiss(animated: true, completion: nil) + } + + // MARK: - TableView Data Source + + func numberOfSections(in tableView: UITableView) -> Int { + return fetchedResultController.sections?.count ?? 0 + } + + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + guard let sectionInfo = fetchedResultController.sections?[section] else {return 0} + return sectionInfo.numberOfObjects + } + + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) + configureCell(cell, atIndexPath: indexPath) + return cell + } + + override func configureCell(_ cell: UITableViewCell, atIndexPath indexPath: IndexPath) { + guard let cell = cell as? BasicBookCell else {return} + let book = fetchedResultController.object(at: indexPath) + + cell.titleLabel.text = book.title + cell.hasPic = book.hasPic + cell.favIcon.image = UIImage(data: book.favIcon ?? Data()) + cell.subtitleLabel.text = book.detailedDescription + cell.accessoryType = splitViewController?.traitCollection.horizontalSizeClass == .compact ? .disclosureIndicator : .none + } + + func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { + guard let stateRaw = fetchedResultController.sections?[section].name, let stateInt = Int(stateRaw) else {return nil} + return BookState(rawValue: stateInt)?.description + } + + // MARK: - Fetched Results Controller + + let managedObjectContext = AppDelegate.persistentContainer.viewContext + lazy var fetchedResultController: NSFetchedResultsController = { + let fetchRequest = Book.fetchRequest() + let stateDescriptor = NSSortDescriptor(key: "stateRaw", ascending: true) + let titleDescriptor = NSSortDescriptor(key: "title", ascending: true) + fetchRequest.sortDescriptors = [stateDescriptor, titleDescriptor] + fetchRequest.predicate = NSPredicate(format: "stateRaw >= 2") + let fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: "stateRaw", cacheName: "BookmarkBooksFRC" + Bundle.buildVersion) + fetchedResultsController.delegate = self + try? fetchedResultsController.performFetch() + return fetchedResultsController as! NSFetchedResultsController + }() + +} diff --git a/Kiwix-iOS/Controller/Bookmark/BookmarkSplitController.swift b/Kiwix-iOS/Controller/Bookmark/BookmarkSplitController.swift new file mode 100644 index 00000000..5c7ba1c0 --- /dev/null +++ b/Kiwix-iOS/Controller/Bookmark/BookmarkSplitController.swift @@ -0,0 +1,36 @@ +// +// BookmarkSplitController.swift +// Kiwix +// +// Created by Chris Li on 1/12/17. +// Copyright © 2017 Chris Li. All rights reserved. +// + +import UIKit + +class BookmarkSplitController: UISplitViewController, UISplitViewControllerDelegate { + + override func viewDidLoad() { + super.viewDidLoad() + + preferredDisplayMode = .allVisible + minimumPrimaryColumnWidth = 320.0 + delegate = self + } + + override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) { + guard traitCollection != previousTraitCollection else {return} + let controller: CoreDataTableBaseController? = { + let nav = viewControllers.first as? UINavigationController + return nav?.topViewController as? CoreDataTableBaseController + }() + controller?.tableView.indexPathsForVisibleRows?.forEach({ (indexPath) in + guard let cell = controller?.tableView.cellForRow(at: indexPath) else {return} + controller?.configureCell(cell, atIndexPath: indexPath) + }) + } + + func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool { + return true + } +} diff --git a/Kiwix-iOS/Controller/Main/Buttons.swift b/Kiwix-iOS/Controller/Main/Buttons.swift index eed1ea90..73b3d6c7 100644 --- a/Kiwix-iOS/Controller/Main/Buttons.swift +++ b/Kiwix-iOS/Controller/Main/Buttons.swift @@ -34,6 +34,8 @@ class Buttons: LPTBarButtonItemDelegate { delegate?.didTapForwardButton() case toc: delegate?.didTapTOCButton() + case bookmark: + delegate?.didTapBookmarkButton() case library: delegate?.didTapLibraryButton() default: diff --git a/Kiwix-iOS/Controller/Main/Controllers.swift b/Kiwix-iOS/Controller/Main/Controllers.swift index 258d6530..49c2286d 100644 --- a/Kiwix-iOS/Controller/Main/Controllers.swift +++ b/Kiwix-iOS/Controller/Main/Controllers.swift @@ -19,23 +19,8 @@ class Controllers { } // MARK: - Bookmark -// -// private var bookmark: UINavigationController? -// -// class var bookmark: UINavigationController { -// let controller = Controllers.shared.bookmark ?? UIStoryboard(name: "Bookmark", bundle: nil).instantiateInitialViewController() as! UINavigationController -// Controllers.shared.bookmark = controller -// return controller -// } -// -// private var bookmarkHUD: BookmarkHUD? -// -// class var bookmarkHUD: BookmarkHUD { -// let controller = Controllers.shared.bookmarkHUD ?? UIStoryboard(name: "Bookmark", bundle: nil).instantiateViewController(withIdentifier: "BookmarkHUD") as! BookmarkHUD -// Controllers.shared.bookmarkHUD = controller -// return controller -// } - + + private(set) lazy var bookmark = UIStoryboard(name: "Bookmark", bundle: nil).instantiateInitialViewController() as! UISplitViewController private(set) lazy var bookmarkHUD = UIStoryboard(name: "Bookmark", bundle: nil).instantiateViewController(withIdentifier: "BookmarkHUD") as! BookmarkHUD // MARK: - Library diff --git a/Kiwix-iOS/Controller/Main/MainDelegates.swift b/Kiwix-iOS/Controller/Main/MainDelegates.swift index b473a683..18ba50d9 100644 --- a/Kiwix-iOS/Controller/Main/MainDelegates.swift +++ b/Kiwix-iOS/Controller/Main/MainDelegates.swift @@ -323,9 +323,9 @@ extension MainController { extension MainController: UIViewControllerTransitioningDelegate { func showBookmarkController() { -// let controller = Controllers.bookmark -// controller.modalPresentationStyle = .formSheet -// present(controller, animated: true, completion: nil) + let controller = controllers.bookmark + controller.modalPresentationStyle = .fullScreen + present(controller, animated: true, completion: nil) } func showBookmarkHUD() { diff --git a/Kiwix-iOS/Storyboard/Bookmark.storyboard b/Kiwix-iOS/Storyboard/Bookmark.storyboard index 20f99689..ac99dd4e 100644 --- a/Kiwix-iOS/Storyboard/Bookmark.storyboard +++ b/Kiwix-iOS/Storyboard/Bookmark.storyboard @@ -1,11 +1,11 @@ - + - + @@ -22,10 +22,10 @@ - + - + - + - + diff --git a/Kiwix.xcodeproj/project.pbxproj b/Kiwix.xcodeproj/project.pbxproj index cd569751..7b502a30 100644 --- a/Kiwix.xcodeproj/project.pbxproj +++ b/Kiwix.xcodeproj/project.pbxproj @@ -65,6 +65,8 @@ 975227D01D022814001D1DDE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 975227CF1D022814001D1DDE /* LaunchScreen.storyboard */; }; 9757C74A1E10660B008A9469 /* DownloadManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9757C7491E10660B008A9469 /* DownloadManager.swift */; }; 9757C74C1E106958008A9469 /* BackgroundDownload.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9757C74B1E106958008A9469 /* BackgroundDownload.swift */; }; + 97599AA21E26D3B000BA15EF /* BookmarkBooksController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97599AA11E26D3B000BA15EF /* BookmarkBooksController.swift */; }; + 97599AE01E28031A00BA15EF /* BookmarkSplitController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97599ADF1E28031A00BA15EF /* BookmarkSplitController.swift */; }; 975B90FE1CEB909100D13906 /* iOSExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 975B90FD1CEB909100D13906 /* iOSExtensions.swift */; }; 9764CBD11D806AD800072D6A /* RefreshLibControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9764CBD01D806AD800072D6A /* RefreshLibControl.swift */; }; 9764F5931D830EF200E0B1C4 /* liblzma.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 9764F5921D830EF200E0B1C4 /* liblzma.tbd */; }; @@ -222,6 +224,8 @@ 975227CF1D022814001D1DDE /* LaunchScreen.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = LaunchScreen.storyboard; path = "Kiwix-iOS/Storyboard/LaunchScreen.storyboard"; sourceTree = SOURCE_ROOT; }; 9757C7491E10660B008A9469 /* DownloadManager.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DownloadManager.swift; sourceTree = ""; }; 9757C74B1E106958008A9469 /* BackgroundDownload.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BackgroundDownload.swift; sourceTree = ""; }; + 97599AA11E26D3B000BA15EF /* BookmarkBooksController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarkBooksController.swift; sourceTree = ""; }; + 97599ADF1E28031A00BA15EF /* BookmarkSplitController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarkSplitController.swift; sourceTree = ""; }; 975B90FD1CEB909100D13906 /* iOSExtensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = iOSExtensions.swift; path = "Kiwix-iOS/iOSExtensions.swift"; sourceTree = SOURCE_ROOT; }; 9763275D1D64FE0F0034F120 /* BookDetailController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookDetailController.swift; sourceTree = ""; }; 9764CBD01D806AD800072D6A /* RefreshLibControl.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshLibControl.swift; sourceTree = ""; }; @@ -531,6 +535,8 @@ 9749A1B21C430653000F2D1E /* Bookmark */ = { isa = PBXGroup; children = ( + 97599ADF1E28031A00BA15EF /* BookmarkSplitController.swift */, + 97599AA11E26D3B000BA15EF /* BookmarkBooksController.swift */, 97C5BD4A1D9AF4B5009692CF /* BookmarkController.swift */, 97219DBC1D383A00009FDFF1 /* BookmarkHUD.swift */, ); @@ -1120,6 +1126,7 @@ 970E7F741D9DB0FC00741290 /* 1.8.xcmappingmodel in Sources */, 973207A01DD1983D00EDD3DC /* DownloadTasksController.swift in Sources */, 977A458C1E14EA140089C596 /* Cloud.swift in Sources */, + 97599AA21E26D3B000BA15EF /* BookmarkBooksController.swift in Sources */, 97D0E9931DDA487E0029530E /* SearchBaseController.swift in Sources */, 97A1FD321D6F723D00A80EE2 /* resourceTools.cpp in Sources */, 97A1FD451D6F728200A80EE2 /* StringTools.swift in Sources */, @@ -1142,6 +1149,7 @@ 97A1FD191D6F71CE00A80EE2 /* ZimMultiReader.swift in Sources */, 97A1FD261D6F71E200A80EE2 /* ZimReader.mm in Sources */, 97A1FD1C1D6F71D800A80EE2 /* KiwixURLProtocol.swift in Sources */, + 97599AE01E28031A00BA15EF /* BookmarkSplitController.swift in Sources */, 97C2C26A1DDCC58500A9CC64 /* ArticleOperation.swift in Sources */, 973A5C991DEBC54800C7804C /* CloudKit.swift in Sources */, 973208261DD21E9C00EDD3DC /* CoreDataContainer.swift in Sources */, @@ -1326,7 +1334,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = DA0AB5D61F19BE37BD0AFA0A /* Pods-Kiwix-iOS.debug.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; @@ -1363,7 +1371,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = 5B9300794E7F4EFE5B3E8F19 /* Pods-Kiwix-iOS.release.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; diff --git a/Kiwix/CoreData/Classes/Book.swift b/Kiwix/CoreData/Classes/Book.swift index 7f0f3529..4c33126e 100644 --- a/Kiwix/CoreData/Classes/Book.swift +++ b/Kiwix/CoreData/Classes/Book.swift @@ -241,8 +241,17 @@ class Book: NSManagedObject { } } -enum BookState: Int { +enum BookState: Int, CustomStringConvertible { case cloud, downloading, local, retained + + var description: String { + switch self { + case .cloud: return "Cloud" + case .downloading: return "Downloading" + case .local: return "Local" + case .retained: return "Retained" + } + } }