Language filter

This commit is contained in:
Chris Li 2017-01-24 11:33:03 -05:00
parent 4663c1fc69
commit 330933b60d
4 changed files with 247 additions and 66 deletions

View File

@ -49,6 +49,16 @@ class LibraryBooksController: CoreDataCollectionBaseController, UICollectionView
collectionView.collectionViewLayout.invalidateLayout()
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "showLangFilter" {
let nav = segue.destination as? UINavigationController
let controller = nav?.topViewController as? LibraryLanguageController
controller?.dismissBlock = {[unowned self] in
print("sdjk")
}
}
}
// MARK: - Refresh
private(set) var isRefreshing = false // used to control text on empty table view
@ -111,7 +121,6 @@ class LibraryBooksController: CoreDataCollectionBaseController, UICollectionView
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath) as! LibraryCollectionCell
let book = fetchedResultController.object(at: indexPath)
print(book.meta4URL)
cell.delegate = self
cell.imageView.image = UIImage(data: book.favIcon ?? Data())
cell.titleLabel.text = book.title
@ -155,7 +164,6 @@ class LibraryBooksController: CoreDataCollectionBaseController, UICollectionView
let titleDescriptor = NSSortDescriptor(key: "title", ascending: true)
fetchRequest.sortDescriptors = [langDescriptor, titleDescriptor]
fetchRequest.predicate = NSPredicate(format: "language.name != nil")
//// fetchRequest.predicate = self.onlineCompoundPredicate
let controller = NSFetchedResultsController(fetchRequest: fetchRequest,
managedObjectContext: self.managedObjectContext,
@ -165,3 +173,9 @@ class LibraryBooksController: CoreDataCollectionBaseController, UICollectionView
return controller as! NSFetchedResultsController<Book>
}()
}
extension Localized {
class Library {
}
}

View File

@ -2,22 +2,167 @@
// LibraryLanguageController.swift
// Kiwix
//
// Created by Chris Li on 1/23/17.
// Created by Chris Li on 1/24/17.
// Copyright © 2017 Chris Li. All rights reserved.
//
import UIKit
import CoreData
import DZNEmptyDataSet
class LibraryLanguageController: CoreDataTableBaseController {
class LibraryLanguageController: UITableViewController, NSFetchedResultsControllerDelegate, DZNEmptyDataSetSource, DZNEmptyDataSetDelegate {
@IBOutlet weak var langNameSegmentedControl: UISegmentedControl!
@IBAction func segmentedControlChanged(_ sender: UISegmentedControl) {
Preference.LangFilter.displayInOriginalLocale = !Preference.LangFilter.displayInOriginalLocale
tableView.reloadRows(at: tableView.indexPathsForVisibleRows ?? [IndexPath](), with: .automatic)
}
@IBAction func doneButtonTapped(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
}
private let managedObjectContext = AppDelegate.persistentContainer.viewContext
private var initialShowLanguageSet = Set<Language>()
private var showLanguages = [Language]()
private var hideLanguages = [Language]()
var dismissBlock: (() -> Void)?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
showLanguages = Language.fetch(displayed: true, context: managedObjectContext)
hideLanguages = Language.fetch(displayed: false, context: managedObjectContext)
initialShowLanguageSet = Set(showLanguages)
configureSegmentedControls()
sort()
}
@IBAction func dismissButtonTapped(_ sender: UIBarButtonItem) {
dismiss(animated: true, completion: nil)
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
dismissBlock?()
}
func configureSegmentedControls() {
langNameSegmentedControl.selectedSegmentIndex = Preference.LangFilter.displayInOriginalLocale == true ? 1 : 0
langNameSegmentedControl.setTitle((Locale.current as NSLocale).displayName(forKey: NSLocale.Key.identifier, value: Locale.preferredLangCodes[0]), forSegmentAt: 0)
langNameSegmentedControl.setTitle(Localized.Library.LanguageFilter.original, forSegmentAt: 1)
}
// MARK: - Sort
func sort() {
showLanguages = sortByCountDesc(languages: showLanguages)
hideLanguages = sortByCountDesc(languages: hideLanguages)
}
func sortByCountDesc(languages: [Language]) -> [Language] {
return languages.sorted { (language0, language1) -> Bool in
let count0 = language0.books.count
let count1 = language1.books.count
guard count0 != count1 else {
return alphabeticalAscCompare(language0: language0, language1: language1,
byOriginalLocale: Preference.LangFilter.displayInOriginalLocale)
}
return count0 > count1
}
}
private func alphabeticalAscCompare(language0: Language, language1: Language, byOriginalLocale: Bool) -> Bool {
if byOriginalLocale {
guard let name0 = language0.nameInOriginalLocale,
let name1 = language1.nameInOriginalLocale else {return false}
return name0.compare(name1) == .orderedAscending
} else {
guard let name0 = language0.nameInCurrentLocale,
let name1 = language1.nameInCurrentLocale else {return false}
return name0.compare(name1) == .orderedAscending
}
}
// MARK: - Table view data source
override func numberOfSections(in tableView: UITableView) -> Int {
return 2
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return section == 0 ? showLanguages.count : hideLanguages.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
if indexPath.section == 0 {
configureCell(cell, atIndexPath: indexPath, language: showLanguages[indexPath.row])
} else {
configureCell(cell, atIndexPath: indexPath, language: hideLanguages[indexPath.row])
}
return cell
}
func configureCell(_ cell: UITableViewCell, atIndexPath indexPath: IndexPath, language: Language) {
cell.textLabel?.text = Preference.LangFilter.displayInOriginalLocale ? language.nameInOriginalLocale : language.nameInCurrentLocale
cell.detailTextLabel?.text = language.books.count.description
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
if showLanguages.count == 0 {
return section == 0 ? "" : Localized.Library.LanguageFilter.all + " "
} else {
return section == 0 ? Localized.Library.LanguageFilter.showing : Localized.Library.LanguageFilter.hiding
}
}
// MARK: - Table view delegate
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
func animateUpdates(_ originalIndexPath: IndexPath, destinationIndexPath: IndexPath) {
tableView.beginUpdates()
tableView.deleteRows(at: [indexPath], with: .right)
tableView.insertRows(at: [destinationIndexPath], with: .right)
tableView.headerView(forSection: 0)?.textLabel?.text = self.tableView(tableView, titleForHeaderInSection: 0)
tableView.headerView(forSection: 1)?.textLabel?.text = self.tableView(tableView, titleForHeaderInSection: 1)
tableView.endUpdates()
}
if indexPath.section == 0 {
let language = showLanguages[indexPath.row]
language.isDisplayed = false
hideLanguages.append(language)
showLanguages.remove(at: indexPath.row)
hideLanguages = sortByCountDesc(languages: hideLanguages)
guard let row = hideLanguages.index(of: language) else {tableView.reloadData(); return}
let destinationIndexPath = IndexPath(row: row, section: 1)
animateUpdates(indexPath, destinationIndexPath: destinationIndexPath)
} else {
let language = hideLanguages[indexPath.row]
language.isDisplayed = true
showLanguages.append(language)
hideLanguages.remove(at: indexPath.row)
showLanguages = sortByCountDesc(languages: showLanguages)
guard let row = showLanguages.index(of: language) else {tableView.reloadData(); return}
let destinationIndexPath = IndexPath(row: row, section: 0)
animateUpdates(indexPath, destinationIndexPath: destinationIndexPath)
}
}
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 0 {
return showLanguages.count == 0 ? CGFloat.leastNormalMagnitude : 44
} else {
return 30
}
}
}
extension Localized.Library {
class LanguageFilter {
static let title = NSLocalizedString("Languages", comment: "Library, Language Filter")
static let all = NSLocalizedString("ALL", comment: "Library, Language Filter")
static let showing = NSLocalizedString("SHOWING", comment: "Library, Language Filter")
static let hiding = NSLocalizedString("HIDING", comment: "Library, Language Filter")
static let original = NSLocalizedString("Original", comment: "Library, Language Filter")
}
}

View File

@ -52,7 +52,7 @@
</collectionViewFlowLayout>
<cells>
<collectionViewCell opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" reuseIdentifier="Cell" id="Aea-Om-Uku" customClass="LibraryCollectionCell" customModule="Kiwix" customModuleProvider="target">
<rect key="frame" x="28" y="0.0" width="320" height="66"/>
<rect key="frame" x="27.5" y="0.0" width="320" height="66"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<view key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center">
<rect key="frame" x="0.0" y="0.0" width="320" height="66"/>
@ -175,7 +175,7 @@
</barButtonItem>
<barButtonItem key="rightBarButtonItem" image="LanguageFilter" id="0v8-uV-zCG">
<connections>
<segue destination="9UV-8Y-ZY2" kind="popoverPresentation" popoverAnchorBarButtonItem="0v8-uV-zCG" id="PFl-Zb-f3y">
<segue destination="yzc-l3-ioG" kind="popoverPresentation" identifier="showLangFilter" popoverAnchorBarButtonItem="0v8-uV-zCG" id="hlL-SF-vTM">
<popoverArrowDirection key="popoverArrowDirection" up="YES" down="YES" left="YES" right="YES"/>
</segue>
</connections>
@ -189,46 +189,6 @@
</objects>
<point key="canvasLocation" x="-173.59999999999999" y="-1395.6521739130435"/>
</scene>
<!--Library Language Controller-->
<scene sceneID="nQz-wd-Pht">
<objects>
<viewController id="AY1-gf-NdX" customClass="LibraryLanguageController" customModule="Kiwix" customModuleProvider="target" sceneMemberID="viewController">
<layoutGuides>
<viewControllerLayoutGuide type="top" id="Gbe-6q-AdX"/>
<viewControllerLayoutGuide type="bottom" id="8vj-R1-8rW"/>
</layoutGuides>
<view key="view" contentMode="scaleToFill" id="mon-4F-A4S">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="28D-2G-Cvf">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
</tableView>
</subviews>
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
<constraints>
<constraint firstItem="28D-2G-Cvf" firstAttribute="top" secondItem="mon-4F-A4S" secondAttribute="top" id="DJO-iO-hYh"/>
<constraint firstItem="28D-2G-Cvf" firstAttribute="leading" secondItem="mon-4F-A4S" secondAttribute="leading" id="E9e-XT-g3D"/>
<constraint firstItem="8vj-R1-8rW" firstAttribute="top" secondItem="28D-2G-Cvf" secondAttribute="bottom" id="pQ2-u7-NMz"/>
<constraint firstAttribute="trailing" secondItem="28D-2G-Cvf" secondAttribute="trailing" id="rLN-pb-zDN"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="vzE-Av-BsR">
<barButtonItem key="leftBarButtonItem" systemItem="done" id="OR7-vP-57g">
<connections>
<action selector="dismissButtonTapped:" destination="AY1-gf-NdX" id="PQe-Ul-pjG"/>
</connections>
</barButtonItem>
</navigationItem>
<connections>
<outlet property="tableView" destination="28D-2G-Cvf" id="wxf-wh-F7V"/>
</connections>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="LO6-m0-Uxj" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1712.8" y="-1396.5517241379312"/>
</scene>
<!--Tab Bar Controller-->
<scene sceneID="c2f-93-r3I">
<objects>
@ -286,22 +246,88 @@
<point key="canvasLocation" x="-1112.8" y="-740.7796101949026"/>
</scene>
<!--Navigation Controller-->
<scene sceneID="p9k-Dg-805">
<scene sceneID="009-Nq-Jlu">
<objects>
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="9UV-8Y-ZY2" sceneMemberID="viewController">
<navigationController automaticallyAdjustsScrollViewInsets="NO" id="yzc-l3-ioG" sceneMemberID="viewController">
<toolbarItems/>
<navigationBar key="navigationBar" contentMode="scaleToFill" id="R1C-h3-seO">
<navigationBar key="navigationBar" contentMode="scaleToFill" id="Wdw-pU-0LU">
<rect key="frame" x="0.0" y="0.0" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
</navigationBar>
<nil name="viewControllers"/>
<connections>
<segue destination="AY1-gf-NdX" kind="relationship" relationship="rootViewController" id="sor-RY-jDf"/>
<segue destination="YXq-FN-ov8" kind="relationship" relationship="rootViewController" id="1TZ-7g-6UX"/>
</connections>
</navigationController>
<placeholder placeholderIdentifier="IBFirstResponder" id="VM9-Mm-1VF" userLabel="First Responder" sceneMemberID="firstResponder"/>
<placeholder placeholderIdentifier="IBFirstResponder" id="HvZ-jb-XAs" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="745" y="-1396"/>
<point key="canvasLocation" x="952.79999999999995" y="-1402.8485757121441"/>
</scene>
<!--Library Language Controller-->
<scene sceneID="jB1-ec-I5Q">
<objects>
<tableViewController storyboardIdentifier="LanguageFilterController" id="YXq-FN-ov8" customClass="LibraryLanguageController" customModule="Kiwix" customModuleProvider="target" sceneMemberID="viewController">
<tableView key="view" clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="grouped" separatorStyle="default" rowHeight="44" sectionHeaderHeight="18" sectionFooterHeight="18" id="gqM-t7-QqQ">
<rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="backgroundColor" cocoaTouchSystemColor="groupTableViewBackgroundColor"/>
<prototypes>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="Cell" textLabel="dyh-6J-ZGf" detailTextLabel="d0p-hJ-zVy" style="IBUITableViewCellStyleValue1" id="PuW-jR-mYi">
<rect key="frame" x="0.0" y="56" width="375" height="44"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="PuW-jR-mYi" id="hQJ-5P-hy0">
<rect key="frame" x="0.0" y="0.0" width="375" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Title" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="dyh-6J-ZGf">
<rect key="frame" x="15" y="12" width="33.5" height="20.5"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" text="Detail" textAlignment="right" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="d0p-hJ-zVy">
<rect key="frame" x="316" y="12" width="44" height="20.5"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
</tableViewCell>
</prototypes>
<connections>
<outlet property="dataSource" destination="YXq-FN-ov8" id="hRN-3s-A7O"/>
<outlet property="delegate" destination="YXq-FN-ov8" id="D0R-dF-zb9"/>
</connections>
</tableView>
<navigationItem key="navigationItem" id="GNP-b4-wXb">
<nil key="title"/>
<barButtonItem key="leftBarButtonItem" style="done" systemItem="done" id="hYI-fs-ZEn">
<connections>
<action selector="doneButtonTapped:" destination="YXq-FN-ov8" id="ANg-X6-3dK"/>
</connections>
</barButtonItem>
<segmentedControl key="titleView" opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="left" contentVerticalAlignment="top" segmentControlStyle="plain" selectedSegmentIndex="0" id="ODt-wT-Y6T">
<rect key="frame" x="126" y="8" width="123" height="29"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
<segments>
<segment title="English"/>
<segment title="Original"/>
</segments>
<connections>
<action selector="segmentedControlChanged:" destination="YXq-FN-ov8" eventType="valueChanged" id="8hy-Cm-9U2"/>
</connections>
</segmentedControl>
</navigationItem>
<connections>
<outlet property="langNameSegmentedControl" destination="ODt-wT-Y6T" id="6A8-6v-b1K"/>
</connections>
</tableViewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="MZw-BB-s9z" userLabel="First Responder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="1871" y="-1403"/>
</scene>
</scenes>
<resources>

View File

@ -11,7 +11,6 @@
9705D5941E368189005292AC /* Library.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9705D5931E368189005292AC /* Library.storyboard */; };
9705D5961E368712005292AC /* LibraryBooksController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9705D5951E368712005292AC /* LibraryBooksController.swift */; };
9705D5981E368933005292AC /* CoreDataCollectionBaseController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9705D5971E368933005292AC /* CoreDataCollectionBaseController.swift */; };
9705D59A1E36B876005292AC /* LibraryLanguageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9705D5991E36B876005292AC /* LibraryLanguageController.swift */; };
970A2A221DD562CB0078BB7C /* BookOperations.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970A2A211DD562CB0078BB7C /* BookOperations.swift */; };
970E7F741D9DB0FC00741290 /* 1.8.xcmappingmodel in Sources */ = {isa = PBXBuildFile; fileRef = 970E7F731D9DB0FC00741290 /* 1.8.xcmappingmodel */; };
970E7F831DA0305000741290 /* WelcomeController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 970E7F7F1DA0305000741290 /* WelcomeController.swift */; };
@ -36,6 +35,7 @@
973208271DD2238B00EDD3DC /* Queue.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97D6811C1D6F70AC00E5FA99 /* Queue.swift */; };
973208291DD223DB00EDD3DC /* RefreshLibrary.swift in Sources */ = {isa = PBXBuildFile; fileRef = 973208281DD223DB00EDD3DC /* RefreshLibrary.swift */; };
9734E54E1D289D060061C39B /* Welcome.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 9734E54D1D289D060061C39B /* Welcome.storyboard */; };
9737F6211E379D0700961020 /* LibraryLanguageController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9737F6201E379D0700961020 /* LibraryLanguageController.swift */; };
973A5C921DEA3F5600C7804C /* CoreDataTableBaseController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 973A5C911DEA3F5600C7804C /* CoreDataTableBaseController.swift */; };
973A5C951DEA6DD000C7804C /* URLResponseCache.swift in Sources */ = {isa = PBXBuildFile; fileRef = 973A5C931DEA6CA900C7804C /* URLResponseCache.swift */; };
973A5C991DEBC54800C7804C /* CloudKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 973A5C981DEBC54800C7804C /* CloudKit.swift */; };
@ -96,7 +96,6 @@
97BC0FBF1DD90A65004BBAD1 /* JSInjection.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BC0FBD1DD90A65004BBAD1 /* JSInjection.swift */; };
97BC0FC01DD90A65004BBAD1 /* MainController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BC0FBE1DD90A65004BBAD1 /* MainController.swift */; };
97BC0FC21DD92B62004BBAD1 /* Buttons.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97BC0FC11DD92B62004BBAD1 /* Buttons.swift */; };
97C005D61D64B3B0004352E8 /* Library--old.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C005D51D64B3B0004352E8 /* Library--old.storyboard */; };
97C2C26A1DDCC58500A9CC64 /* ArticleOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9764CBD21D8083AA00072D6A /* ArticleOperation.swift */; };
97C601DC1D7F15C400362D4F /* Bookmark.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 97C601DB1D7F15C400362D4F /* Bookmark.storyboard */; };
97C601DE1D7F342100362D4F /* HTMLHeading.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C601DD1D7F342100362D4F /* HTMLHeading.swift */; };
@ -163,7 +162,6 @@
9705D5931E368189005292AC /* Library.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Library.storyboard; sourceTree = "<group>"; };
9705D5951E368712005292AC /* LibraryBooksController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryBooksController.swift; sourceTree = "<group>"; };
9705D5971E368933005292AC /* CoreDataCollectionBaseController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataCollectionBaseController.swift; sourceTree = "<group>"; };
9705D5991E36B876005292AC /* LibraryLanguageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryLanguageController.swift; sourceTree = "<group>"; };
970912551D7F452C00BBD5A1 /* 1.8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = 1.8.xcdatamodel; sourceTree = "<group>"; };
970A2A211DD562CB0078BB7C /* BookOperations.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BookOperations.swift; sourceTree = "<group>"; };
970E7F731D9DB0FC00741290 /* 1.8.xcmappingmodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcmappingmodel; name = 1.8.xcmappingmodel; path = Kiwix/CoreData/Migration/1.8.xcmappingmodel; sourceTree = SOURCE_ROOT; };
@ -191,6 +189,7 @@
973208251DD21E9C00EDD3DC /* CoreDataContainer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataContainer.swift; sourceTree = "<group>"; };
973208281DD223DB00EDD3DC /* RefreshLibrary.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshLibrary.swift; sourceTree = "<group>"; };
9734E54D1D289D060061C39B /* Welcome.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = Welcome.storyboard; path = "Kiwix-iOS/Storyboard/Welcome.storyboard"; sourceTree = SOURCE_ROOT; };
9737F6201E379D0700961020 /* LibraryLanguageController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LibraryLanguageController.swift; sourceTree = "<group>"; };
973A5C911DEA3F5600C7804C /* CoreDataTableBaseController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataTableBaseController.swift; sourceTree = "<group>"; };
973A5C931DEA6CA900C7804C /* URLResponseCache.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = URLResponseCache.swift; sourceTree = "<group>"; };
973A5C981DEBC54800C7804C /* CloudKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CloudKit.swift; sourceTree = "<group>"; };
@ -265,7 +264,6 @@
97BC0FBD1DD90A65004BBAD1 /* JSInjection.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = JSInjection.swift; sourceTree = "<group>"; };
97BC0FBE1DD90A65004BBAD1 /* MainController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainController.swift; sourceTree = "<group>"; };
97BC0FC11DD92B62004BBAD1 /* Buttons.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Buttons.swift; sourceTree = "<group>"; };
97C005D51D64B3B0004352E8 /* Library--old.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = "Library--old.storyboard"; path = "Kiwix-iOS/Storyboard/Library--old.storyboard"; sourceTree = SOURCE_ROOT; };
97C601DB1D7F15C400362D4F /* Bookmark.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Bookmark.storyboard; sourceTree = "<group>"; };
97C601DD1D7F342100362D4F /* HTMLHeading.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HTMLHeading.swift; sourceTree = "<group>"; };
97D0E9921DDA487E0029530E /* SearchBaseController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchBaseController.swift; sourceTree = "<group>"; };
@ -625,7 +623,6 @@
975227CA1D0227E8001D1DDE /* Main.storyboard */,
97C601DB1D7F15C400362D4F /* Bookmark.storyboard */,
9705D5931E368189005292AC /* Library.storyboard */,
97C005D51D64B3B0004352E8 /* Library--old.storyboard */,
97F03CE11D2440470040D26E /* Search.storyboard */,
976C1DCF1E3000B6005EDEC4 /* Setting.storyboard */,
9734E54D1D289D060061C39B /* Welcome.storyboard */,
@ -728,7 +725,7 @@
isa = PBXGroup;
children = (
9705D5951E368712005292AC /* LibraryBooksController.swift */,
9705D5991E36B876005292AC /* LibraryLanguageController.swift */,
9737F6201E379D0700961020 /* LibraryLanguageController.swift */,
);
path = Library;
sourceTree = "<group>";
@ -979,7 +976,6 @@
975227CD1D0227E8001D1DDE /* Main.storyboard in Resources */,
976C1DD01E3000B6005EDEC4 /* Setting.storyboard in Resources */,
971A10801D022F74007FC62C /* Pic_I.png in Resources */,
97C005D61D64B3B0004352E8 /* Library--old.storyboard in Resources */,
971A107F1D022F74007FC62C /* ImportBookLearnMore.html in Resources */,
971A107E1D022F74007FC62C /* DownloaderLearnMore.html in Resources */,
);
@ -1102,7 +1098,7 @@
9705D5961E368712005292AC /* LibraryBooksController.swift in Sources */,
97D681391D6F711A00E5FA99 /* DownloadTask.swift in Sources */,
977B954D1DD4C40400F6F62B /* ScanLocalBook.swift in Sources */,
9705D59A1E36B876005292AC /* LibraryLanguageController.swift in Sources */,
9737F6211E379D0700961020 /* LibraryLanguageController.swift in Sources */,
97D681321D6F70EC00E5FA99 /* MigrationPolicy.swift in Sources */,
976C1DCB1E2FD5FC005EDEC4 /* TableOfContentsController.swift in Sources */,
976C1DD81E327328005EDEC4 /* FontSizeController.swift in Sources */,