passepartout-apple/Passepartout-iOS/Global/Theme.swift

204 lines
5.5 KiB
Swift
Raw Normal View History

2018-10-11 07:13:19 +00:00
//
// Theme.swift
// Passepartout-iOS
//
// Created by Davide De Rosa on 6/14/18.
2020-01-11 08:27:22 +00:00
// Copyright (c) 2020 Davide De Rosa. All rights reserved.
2018-10-11 07:13:19 +00:00
//
2018-11-03 21:33:30 +00:00
// https://github.com/passepartoutvpn
2018-10-11 07:13:19 +00:00
//
// 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 MessageUI
2019-04-06 21:58:19 +00:00
import StoreKit
import PassepartoutCore
2018-10-11 07:13:19 +00:00
struct Theme {
struct Palette {
var primaryBackground = UIColor(rgb: 0x515d71, alpha: 1.0)
2018-10-11 07:13:19 +00:00
var accent1 = UIColor(rgb: 0xd69c68, alpha: 1.0)
2018-10-11 07:13:19 +00:00
2019-09-02 17:51:21 +00:00
var primaryText: UIColor = {
guard #available(iOS 13, *) else {
return .darkText
}
return .label
}()
2018-10-11 07:13:19 +00:00
var primaryLightText: UIColor = .white
2018-10-11 07:13:19 +00:00
2019-09-02 17:51:21 +00:00
var secondaryText: UIColor = {
guard #available(iOS 13, *) else {
return .gray
}
return .secondaryLabel
}()
2018-10-11 07:13:19 +00:00
var on: UIColor {
return accent1
2018-10-11 07:13:19 +00:00
}
var indeterminate: UIColor {
return secondaryText
2018-10-11 07:13:19 +00:00
}
var off: UIColor {
return secondaryText
2018-10-11 07:13:19 +00:00
}
// var action = UIColor(red: 214.0 / 255.0, green: 156.0 / 255.0, blue: 104.0 / 255.0, alpha: 1.0)
var action: UIColor {
return accent1
2018-10-11 07:13:19 +00:00
}
var accessory: UIColor {
return accent1.withAlphaComponent(0.7)
2018-10-14 22:12:37 +00:00
}
var destructive = UIColor(red: 0.8, green: 0.27, blue: 0.2, alpha: 1.0)
2018-10-11 07:13:19 +00:00
}
static let current = Theme()
var palette: Palette
var modalPresentationStyle: UIModalPresentationStyle
2018-10-11 07:13:19 +00:00
private init() {
palette = Palette()
modalPresentationStyle = .formSheet
2018-10-11 07:13:19 +00:00
}
}
extension Theme {
func applyAppearance() {
let bar = UINavigationBar.appearance()
bar.barTintColor = palette.primaryBackground
bar.tintColor = palette.primaryLightText
bar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: palette.primaryLightText]
2018-10-11 07:13:19 +00:00
bar.largeTitleTextAttributes = bar.titleTextAttributes
let toolbar = UIToolbar.appearance()
toolbar.barTintColor = palette.primaryBackground
toolbar.tintColor = palette.primaryLightText
2018-10-11 07:13:19 +00:00
let toggle = UISwitch.appearance()
toggle.onTintColor = palette.accessory
2019-04-08 19:10:28 +00:00
let activity = UIActivityIndicatorView.appearance()
activity.color = palette.accessory
2018-10-11 07:13:19 +00:00
}
}
2019-11-19 22:20:22 +00:00
extension UIViewController {
func applyModalPresentation(_ theme: Theme) {
modalPresentationStyle = theme.modalPresentationStyle
}
}
//extension UIView {
// func applyPrimaryBackground(_ theme: Theme) {
// backgroundColor = theme.palette.primaryBackground
// }
//}
2018-10-11 07:13:19 +00:00
extension UILabel {
func apply(_ theme: Theme) {
2019-11-20 18:17:34 +00:00
font = .preferredFont(forTextStyle: .body)
textColor = theme.palette.primaryText
2018-10-11 07:13:19 +00:00
}
func applyLight(_ theme: Theme) {
2019-11-20 18:17:34 +00:00
font = .preferredFont(forTextStyle: .body)
textColor = theme.palette.primaryLightText
2018-10-11 07:13:19 +00:00
}
func applyAccent(_ theme: Theme) {
2019-11-20 18:17:34 +00:00
font = .preferredFont(forTextStyle: .body)
textColor = theme.palette.accent1
}
2019-11-20 19:00:51 +00:00
func applySecondarySize(_ theme: Theme) {
font = .preferredFont(forTextStyle: .callout)
}
2018-10-11 07:13:19 +00:00
}
extension UITextField {
func applyProfileId(_ theme: Theme) {
placeholder = L10n.Core.Global.Host.TitleInput.placeholder
clearButtonMode = .always
keyboardType = .asciiCapable
returnKeyType = .done
autocapitalizationType = .none
autocorrectionType = .no
}
}
extension UIActivityIndicatorView {
func applyAccent(_ theme: Theme) {
color = theme.palette.accent1
}
}
2019-11-21 14:01:39 +00:00
extension UIBarButtonItem {
func apply(_ theme: Theme) {
tintColor = nil
}
func applyAccent(_ theme: Theme) {
tintColor = theme.palette.accent1
}
}
2019-11-21 14:08:05 +00:00
extension UIContextualAction {
func applyNormal(_ theme: Theme) {
backgroundColor = theme.palette.primaryBackground
}
}
2018-10-11 07:13:19 +00:00
// XXX: status bar is broken
extension MFMailComposeViewController {
func apply(_ theme: Theme) {
modalPresentationStyle = theme.modalPresentationStyle
2018-10-11 07:13:19 +00:00
let bar = navigationBar
bar.barTintColor = theme.palette.primaryBackground
bar.tintColor = theme.palette.primaryLightText
bar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: theme.palette.primaryLightText]
2018-10-11 07:13:19 +00:00
bar.largeTitleTextAttributes = bar.titleTextAttributes
}
}
// FIXME: load from index JSON
extension Infrastructure.Metadata {
2019-11-30 10:04:16 +00:00
var logo: UIImage? {
let bundle = Bundle(for: AppDelegate.self)
guard let image = AssetImageTypeAlias(named: name, in: bundle, compatibleWith: nil) else {
2019-11-30 10:04:16 +00:00
return Asset.Providers.placeholder.image
}
return image
2019-04-05 09:59:39 +00:00
}
}
2019-04-25 18:40:50 +00:00
extension PoolGroup {
var logo: UIImage? {
2019-04-05 09:59:39 +00:00
return ImageAsset(name: country.lowercased()).image
}
}