passepartout-apple/Passepartout-iOS/Scenes/About/CreditsViewController.swift

148 lines
4.6 KiB
Swift
Raw Normal View History

2018-11-26 15:27:15 +00:00
//
// CreditsViewController.swift
// Passepartout-iOS
//
// Created by Davide De Rosa on 11/26/18.
2019-03-09 10:44:44 +00:00
// Copyright (c) 2019 Davide De Rosa. All rights reserved.
2018-11-26 15:27:15 +00:00
//
// https://github.com/passepartoutvpn
//
// This file is part of Passepartout.
//
// Passepartout is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Passepartout is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Passepartout. If not, see <http://www.gnu.org/licenses/>.
//
import UIKit
import PassepartoutCore
2018-11-26 15:27:15 +00:00
class CreditsViewController: UITableViewController, TableModelHost {
private let licenses = AppConstants.License.all
private let notices = AppConstants.Notice.all
2019-04-13 16:42:34 +00:00
private let languages = AppConstants.Translations.authorByLanguage.keys.sorted {
return Utils.localizedLanguage($0) < Utils.localizedLanguage($1)
2019-04-13 16:42:34 +00:00
}
2018-11-26 15:27:15 +00:00
// MARK: TableModelHost
var model: TableModel<SectionType, RowType> = TableModel()
func reloadModel() {
model.add(.licenses)
model.add(.notices)
2019-04-13 16:42:34 +00:00
model.add(.translations)
2018-11-26 15:27:15 +00:00
model.setHeader(L10n.Core.Credits.Sections.Licenses.header, for: .licenses)
model.setHeader(L10n.Core.Credits.Sections.Notices.header, for: .notices)
model.setHeader(L10n.Core.Credits.Sections.Translations.header, for: .translations)
2018-11-26 15:27:15 +00:00
model.set(.license, count: licenses.count, in: .licenses)
model.set(.notice, count: notices.count, in: .notices)
2019-04-13 16:42:34 +00:00
model.set(.translation, count: languages.count, in: .translations)
2018-11-26 15:27:15 +00:00
}
// MARK: UIViewController
override func viewDidLoad() {
super.viewDidLoad()
title = L10n.Core.Credits.title
2018-11-26 15:27:15 +00:00
reloadModel()
}
2019-04-13 16:42:34 +00:00
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
guard let cell = sender as? SettingTableViewCell, let indexPath = tableView.indexPath(for: cell) else {
return false
}
return model.row(at: indexPath) != .translation
}
2018-11-26 15:27:15 +00:00
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let vc = segue.destination as? LabelViewController else {
return
}
2018-11-26 16:18:58 +00:00
guard let cell = sender as? SettingTableViewCell, let indexPath = tableView.indexPath(for: cell) else {
2018-11-26 15:27:15 +00:00
return
}
vc.title = cell.leftText
2018-11-26 16:18:58 +00:00
switch model.row(at: indexPath) {
case .license:
vc.license = licenses[indexPath.row]
2018-11-26 16:18:58 +00:00
case .notice:
vc.text = notices[indexPath.row].statement
2019-04-13 16:42:34 +00:00
default:
break
2018-11-26 16:18:58 +00:00
}
2018-11-26 15:27:15 +00:00
}
}
extension CreditsViewController {
enum SectionType: Int {
case licenses
case notices
2019-04-13 16:42:34 +00:00
case translations
2018-11-26 15:27:15 +00:00
}
enum RowType: Int {
case license
case notice
2019-04-13 16:42:34 +00:00
case translation
2018-11-26 15:27:15 +00:00
}
override func numberOfSections(in tableView: UITableView) -> Int {
return model.count
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return model.header(for: section)
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return model.count(for: section)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = Cells.setting.dequeue(from: tableView, for: indexPath)
switch model.row(at: indexPath) {
case .license:
let obj = licenses[indexPath.row]
cell.leftText = obj.name
cell.rightText = obj.type
case .notice:
let obj = notices[indexPath.row]
cell.leftText = obj.name
cell.rightText = nil
2019-04-13 16:42:34 +00:00
case .translation:
let lang = languages[indexPath.row]
guard let author = AppConstants.Translations.authorByLanguage[lang] else {
fatalError("Author not found for language \(lang)")
}
2019-04-13 16:51:54 +00:00
cell.leftText = Utils.localizedLanguage(lang)
2019-04-13 16:42:34 +00:00
cell.rightText = author
cell.accessoryType = .none
cell.isTappable = false
2018-11-26 15:27:15 +00:00
}
return cell
}
}