From 1ffffad18104da7a32011eacc0aabdae6181a379 Mon Sep 17 00:00:00 2001 From: Chris Li Date: Fri, 13 Jan 2017 14:51:59 -0500 Subject: [PATCH] commit --- .../Bookmark/BookmarkArticleController.swift | 52 +++ .../Bookmark/BookmarkBooksController.swift | 2 +- .../BookmarkCollectionController.swift | 74 ++++- Kiwix-iOS/Controller/Main/MainDelegates.swift | 15 +- Kiwix-iOS/Storyboard/Bookmark.storyboard | 313 +++++++----------- Kiwix-iOS/View/Cells.swift | 13 + Kiwix.xcodeproj/project.pbxproj | 4 + .../xcdebugger/Breakpoints_v2.xcbkptlist | 18 + 8 files changed, 282 insertions(+), 209 deletions(-) create mode 100644 Kiwix-iOS/Controller/Bookmark/BookmarkArticleController.swift diff --git a/Kiwix-iOS/Controller/Bookmark/BookmarkArticleController.swift b/Kiwix-iOS/Controller/Bookmark/BookmarkArticleController.swift new file mode 100644 index 00000000..99eae382 --- /dev/null +++ b/Kiwix-iOS/Controller/Bookmark/BookmarkArticleController.swift @@ -0,0 +1,52 @@ +// +// BookmarkArticleController.swift +// Kiwix +// +// Created by Chris Li on 1/13/17. +// Copyright © 2017 Chris Li. All rights reserved. +// + +import UIKit +import CoreData + +class BookmarkArticleController: CoreDataTableBaseController, UITableViewDelegate, UITableViewDataSource { + + var book: Book? { + didSet { + title = book?.title ?? "All" + } + } + + override func viewDidLoad() { + super.viewDidLoad() + } + + // 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 + } + +} diff --git a/Kiwix-iOS/Controller/Bookmark/BookmarkBooksController.swift b/Kiwix-iOS/Controller/Bookmark/BookmarkBooksController.swift index 9568de7e..fdc0d594 100644 --- a/Kiwix-iOS/Controller/Bookmark/BookmarkBooksController.swift +++ b/Kiwix-iOS/Controller/Bookmark/BookmarkBooksController.swift @@ -18,7 +18,7 @@ class BookmarkBooksController: CoreDataTableBaseController, UITableViewDelegate, override func prepare(for segue: UIStoryboardSegue, sender: Any?) { guard segue.identifier == "showBookmarks", let navController = segue.destination as? UINavigationController, - let controller = navController.topViewController as? BookmarkCollectionController else {return} + let controller = navController.topViewController as? BookmarkArticleController else {return} guard let cell = sender as? UITableViewCell, let indexPath = tableView.indexPath(for: cell) else {return} controller.book = fetchedResultController.object(at: indexPath) diff --git a/Kiwix-iOS/Controller/Bookmark/BookmarkCollectionController.swift b/Kiwix-iOS/Controller/Bookmark/BookmarkCollectionController.swift index 253d45f2..82e92a64 100644 --- a/Kiwix-iOS/Controller/Bookmark/BookmarkCollectionController.swift +++ b/Kiwix-iOS/Controller/Bookmark/BookmarkCollectionController.swift @@ -7,26 +7,78 @@ // import UIKit +import CoreData -class BookmarkCollectionController: UIViewController { +class BookmarkCollectionController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout,NSFetchedResultsControllerDelegate { - @IBOutlet weak var colectionView: UICollectionView! + private(set) var itemWidth: CGFloat = 0 + private(set) var shouldReloadCollectionView = false + @IBOutlet weak var collectionView: UICollectionView! var book: Book? { didSet { - if let book = book { - title = book.title - } else { - title = "All" - } - + title = book?.title ?? "All" } } override func viewDidLoad() { super.viewDidLoad() - - // Do any additional setup after loading the view. + collectionView.alwaysBounceVertical = true } - + + override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { +// let itemsPerRow = ((size.width - 10) / 200).rounded() + let itemsPerRow: CGFloat = 2.0 + print("\(itemsPerRow), \(size.width)") + + itemWidth = floor((size.width - (itemsPerRow + 1) * 20) / itemsPerRow) + collectionView.collectionViewLayout.invalidateLayout() + } + + // MARK: - UICollectionView Data Source + + func numberOfSections(in collectionView: UICollectionView) -> Int { + return fetchedResultController.sections?.count ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return fetchedResultController.sections?[section].numberOfObjects ?? 0 + } + + func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! BookmarkCollectionCell + let article = fetchedResultController.object(at: indexPath) + cell.titleLabel.text = article.title + cell.snippetLabel.text = article.snippet +// cell.thumbImageView.image + return cell + } + + // MARK: - UICollectionViewDelegateFlowLayout + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { + print(itemWidth) + return CGSize(width: itemWidth, height: itemWidth) + } + + func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { + return UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) + } + + // MARK: - NSFetchedResultsControllerDelegate + + var blockOperations: [BlockOperation] = [] + let managedObjectContext = AppDelegate.persistentContainer.viewContext + lazy var fetchedResultController: NSFetchedResultsController
= { + let fetchRequest = Article.fetchRequest() + let titleDescriptor = NSSortDescriptor(key: "title", ascending: true) + fetchRequest.sortDescriptors = [titleDescriptor] + if let book = self.book {fetchRequest.predicate = NSPredicate(format: "book == %@", book)} + + let cacheName = ["BookmarkFRC", self.book?.title ?? "All", Bundle.buildVersion].joined(separator: "_") + let controller = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: self.managedObjectContext, sectionNameKeyPath: nil, cacheName: cacheName) +// controller.delegate = self + try? controller.performFetch() + return controller as! NSFetchedResultsController
+ }() } diff --git a/Kiwix-iOS/Controller/Main/MainDelegates.swift b/Kiwix-iOS/Controller/Main/MainDelegates.swift index 18ba50d9..d2c8233e 100644 --- a/Kiwix-iOS/Controller/Main/MainDelegates.swift +++ b/Kiwix-iOS/Controller/Main/MainDelegates.swift @@ -190,7 +190,7 @@ extension MainController: ButtonDelegates { } func didLongPressBookmarkButton() { - func indexBookmark(article: Article) { + func indexCoreSpotlight(article: Article) { if article.isBookmarked { CSSearchableIndex.default().indexSearchableItems([article.searchableItem], completionHandler: nil) } else { @@ -199,21 +199,20 @@ extension MainController: ButtonDelegates { } } + let context = AppDelegate.persistentContainer.viewContext guard let url = webView.request?.url, - let article = Article.fetch(url: url, context: AppDelegate.persistentContainer.viewContext) else {return} + let article = Article.fetch(url: url, context: context) else {return} article.isBookmarked = !article.isBookmarked - if AppDelegate.persistentContainer.viewContext.hasChanges { - try? AppDelegate.persistentContainer.viewContext.save() - } + if context.hasChanges {try? context.save()} showBookmarkHUD() controllers.bookmarkHUD.bookmarkAdded = article.isBookmarked buttons.bookmark.isHighlighted = article.isBookmarked - indexBookmark(article: article) - let operation = BookmarkSyncOperation(articleURL: url) - GlobalQueue.shared.add(operation: operation) + indexCoreSpotlight(article: article) +// let operation = BookmarkSyncOperation(articleURL: url) +// GlobalQueue.shared.add(operation: operation) } } diff --git a/Kiwix-iOS/Storyboard/Bookmark.storyboard b/Kiwix-iOS/Storyboard/Bookmark.storyboard index 4d3301d0..e66677fc 100644 --- a/Kiwix-iOS/Storyboard/Bookmark.storyboard +++ b/Kiwix-iOS/Storyboard/Bookmark.storyboard @@ -12,200 +12,153 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - - + + - + - + - - - + + + - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -240,10 +193,10 @@ - + - + - - - - - - - - - - - - - - - - - + @@ -498,7 +433,7 @@ - + diff --git a/Kiwix-iOS/View/Cells.swift b/Kiwix-iOS/View/Cells.swift index 4ad5a5f1..945c94b6 100644 --- a/Kiwix-iOS/View/Cells.swift +++ b/Kiwix-iOS/View/Cells.swift @@ -93,6 +93,17 @@ class CheckMarkBookCell: BasicBookCell { // MARK: - Article Cell +class BookmarkCollectionCell: UICollectionViewCell { + override func awakeFromNib() { + thumbImageView.layer.cornerRadius = 4.0 + thumbImageView.clipsToBounds = true + } + + @IBOutlet weak var thumbImageView: UIImageView! + @IBOutlet weak var titleLabel: UILabel! + @IBOutlet weak var snippetLabel: UILabel! +} + class ArticleCell: FavIconAndPicIndicatorCell { @IBOutlet weak var titleLabel: UILabel! } @@ -101,6 +112,8 @@ class ArticleSnippetCell: ArticleCell { @IBOutlet weak var snippetLabel: UILabel! } + + // MARK: - last time refactor // MARK: - Bookmark Cell diff --git a/Kiwix.xcodeproj/project.pbxproj b/Kiwix.xcodeproj/project.pbxproj index 83a36bd1..5f9084b3 100644 --- a/Kiwix.xcodeproj/project.pbxproj +++ b/Kiwix.xcodeproj/project.pbxproj @@ -9,6 +9,7 @@ /* Begin PBXBuildFile section */ 7356F9FACBB84380CFC8F68F /* Pods_Kiwix_iOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EC884ACBBA260AF741C4C4FE /* Pods_Kiwix_iOS.framework */; }; 970A2A221DD562CB0078BB7C /* BookOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970A2A211DD562CB0078BB7C /* BookOperations.swift */; }; + 970A83971E29615C005EC950 /* BookmarkArticleController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970A83961E29615C005EC950 /* BookmarkArticleController.swift */; }; 970E7F741D9DB0FC00741290 /* 1.8.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = 970E7F731D9DB0FC00741290 /* 1.8.xcmappingmodel */; }; 970E7F771D9DBEA900741290 /* SettingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970E7F761D9DBEA900741290 /* SettingController.swift */; }; 970E7F7B1DA0069600741290 /* FontSizeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970E7F7A1DA0069600741290 /* FontSizeController.swift */; }; @@ -165,6 +166,7 @@ 970722A91D6B4D1700A45620 /* LanguageFilterController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LanguageFilterController.swift; sourceTree = ""; }; 970912551D7F452C00BBD5A1 /* 1.8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = 1.8.xcdatamodel; sourceTree = ""; }; 970A2A211DD562CB0078BB7C /* BookOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookOperations.swift; sourceTree = ""; }; + 970A83961E29615C005EC950 /* BookmarkArticleController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookmarkArticleController.swift; sourceTree = ""; }; 970E7F731D9DB0FC00741290 /* 1.8.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; name = 1.8.xcmappingmodel; path = Kiwix/CoreData/Migration/1.8.xcmappingmodel; sourceTree = SOURCE_ROOT; }; 970E7F761D9DBEA900741290 /* SettingController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingController.swift; sourceTree = ""; }; 970E7F781DA003FA00741290 /* WebViewControllerOld.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WebViewControllerOld.swift; sourceTree = ""; }; @@ -539,6 +541,7 @@ children = ( 97599ADF1E28031A00BA15EF /* BookmarkSplitController.swift */, 97599AA11E26D3B000BA15EF /* BookmarkBooksController.swift */, + 970A83961E29615C005EC950 /* BookmarkArticleController.swift */, 97599AE11E28193D00BA15EF /* BookmarkCollectionController.swift */, 97C5BD4A1D9AF4B5009692CF /* BookmarkController.swift */, 97219DBC1D383A00009FDFF1 /* BookmarkHUD.swift */, @@ -1142,6 +1145,7 @@ 9764CBD11D806AD800072D6A /* RefreshLibControl.swift in Sources */, 97C601DE1D7F342100362D4F /* HTMLHeading.swift in Sources */, 975B90FE1CEB909100D13906 /* iOSExtensions.swift in Sources */, + 970A83971E29615C005EC950 /* BookmarkArticleController.swift in Sources */, 971A10521D022D9D007FC62C /* AppDelegate.swift in Sources */, 9764F5991D833F2B00E0B1C4 /* KiwixURL.swift in Sources */, 97A127CC1D777CF100FB204D /* SearchResultController.swift in Sources */, diff --git a/Kiwix.xcworkspace/xcuserdata/chrisli.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/Kiwix.xcworkspace/xcuserdata/chrisli.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index ed9a9b4d..5c68e554 100644 --- a/Kiwix.xcworkspace/xcuserdata/chrisli.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/Kiwix.xcworkspace/xcuserdata/chrisli.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -2,4 +2,22 @@ + + + + + +