IceCubesApp/IceCubesApp/App/Tabs/Settings/IconSelectorView.swift

132 lines
4.5 KiB
Swift
Raw Normal View History

2022-12-29 09:39:34 +00:00
import DesignSystem
2023-01-17 10:36:01 +00:00
import SwiftUI
2022-12-04 08:50:25 +00:00
2023-09-18 19:03:52 +00:00
@MainActor
2022-12-04 08:50:25 +00:00
struct IconSelectorView: View {
2022-12-31 13:01:00 +00:00
enum Icon: Int, CaseIterable, Identifiable {
2022-12-04 08:50:25 +00:00
var id: String {
2022-12-31 13:01:00 +00:00
"\(rawValue)"
2022-12-04 08:50:25 +00:00
}
2023-01-17 10:36:01 +00:00
2022-12-31 13:01:00 +00:00
init(string: String) {
if string == Icon.primary.appIconName {
self = .primary
} else {
self = .init(rawValue: Int(String(string.replacing("AppIconAlternate", with: "")))!)!
2022-12-31 13:01:00 +00:00
}
}
2023-01-17 10:36:01 +00:00
2022-12-31 13:01:00 +00:00
case primary = 0
case alt1, alt2, alt3, alt4, alt5, alt6, alt7, alt8
case alt9, alt10, alt11, alt12, alt13, alt14
2023-01-26 17:27:27 +00:00
case alt15, alt16, alt17, alt18, alt19, alt20, alt21
2023-01-30 18:48:57 +00:00
case alt22, alt23, alt24, alt25
2023-02-01 17:53:25 +00:00
case alt26, alt27, alt28
2023-02-04 06:44:14 +00:00
case alt29, alt30, alt31, alt32
2023-02-09 11:24:24 +00:00
case alt33
2023-02-26 16:19:39 +00:00
case alt34, alt35
2023-02-28 17:52:34 +00:00
case alt36
2023-07-18 07:45:44 +00:00
case alt37
case alt38, alt39
2023-09-18 07:14:51 +00:00
case alt40, alt41, alt42
2023-12-04 19:03:41 +00:00
case alt43, alt44, alt45, alt46, alt47, alt48, alt49
2023-01-30 06:27:06 +00:00
2022-12-31 13:01:00 +00:00
var appIconName: String {
2022-12-27 20:35:41 +00:00
switch self {
2022-12-31 13:01:00 +00:00
case .primary:
2023-09-16 12:15:03 +00:00
"AppIcon"
2022-12-31 13:01:00 +00:00
default:
2023-09-16 12:15:03 +00:00
"AppIconAlternate\(rawValue)"
2022-12-27 20:35:41 +00:00
}
}
2023-01-17 10:36:01 +00:00
2022-12-31 13:01:00 +00:00
var iconName: String {
"icon\(rawValue)"
}
2022-12-04 08:50:25 +00:00
}
2023-01-17 10:36:01 +00:00
struct IconSelector: Identifiable {
var id = UUID()
let title: String
let icons: [Icon]
static let items = [
2023-02-18 06:26:48 +00:00
IconSelector(title: "settings.app.icon.official".localized, icons: [.primary, .alt1, .alt2, .alt3, .alt4, .alt5, .alt6, .alt7, .alt8,
.alt9, .alt10, .alt11, .alt12, .alt13, .alt14,
2023-12-18 07:22:59 +00:00
.alt15, .alt16, .alt17, .alt18, .alt19, .alt25,
2023-11-30 11:02:50 +00:00
.alt43, .alt44, .alt45, .alt46, .alt47]),
IconSelector(title: "\("settings.app.icon.designed-by".localized) Albert Kinng", icons: [.alt20, .alt21, .alt22, .alt23, .alt24]),
IconSelector(title: "\("settings.app.icon.designed-by".localized) Dan van Moll", icons: [.alt26, .alt27, .alt28]),
IconSelector(title: "\("settings.app.icon.designed-by".localized) Chanhwi Joo (GitHub @te6-in)", icons: [.alt29, .alt34, .alt31, .alt35, .alt30, .alt32, .alt40]),
IconSelector(title: "\("settings.app.icon.designed-by".localized) W. Kovács Ágnes (@wildgica)", icons: [.alt33]),
2023-02-28 20:33:33 +00:00
IconSelector(title: "\("settings.app.icon.designed-by".localized) Duncan Horne", icons: [.alt36]),
2023-12-04 19:03:41 +00:00
IconSelector(title: "\("settings.app.icon.designed-by".localized) BeAware@social.beaware.live", icons: [.alt37, .alt41, .alt42, .alt48, .alt49]),
IconSelector(title: "\("settings.app.icon.designed-by".localized) Simone Margio", icons: [.alt38, .alt39]),
]
}
2023-09-18 19:03:52 +00:00
@Environment(Theme.self) private var theme
2022-12-31 13:01:00 +00:00
@State private var currentIcon = UIApplication.shared.alternateIconName ?? Icon.primary.appIconName
2023-01-17 10:36:01 +00:00
2022-12-04 08:50:25 +00:00
private let columns = [GridItem(.adaptive(minimum: 125, maximum: 1024))]
2023-01-17 10:36:01 +00:00
2022-12-04 08:50:25 +00:00
var body: some View {
ScrollView {
VStack(alignment: .leading) {
ForEach(IconSelector.items) { item in
Section {
makeIconGridView(icons: item.icons)
} header: {
Text(item.title)
.font(.scaledHeadline)
}
2023-02-09 11:24:24 +00:00
}
2022-12-04 08:50:25 +00:00
}
.padding(6)
.navigationTitle("settings.app.icon.navigation-title")
2022-12-04 08:50:25 +00:00
}
2023-12-19 08:48:12 +00:00
#if !os(visionOS)
2022-12-29 09:39:34 +00:00
.background(theme.primaryBackgroundColor)
2023-12-19 08:48:12 +00:00
#endif
2022-12-04 08:50:25 +00:00
}
2023-01-30 06:27:06 +00:00
2023-01-28 07:58:36 +00:00
private func makeIconGridView(icons: [Icon]) -> some View {
LazyVGrid(columns: columns, spacing: 6) {
ForEach(icons) { icon in
Button {
currentIcon = icon.appIconName
if icon.rawValue == Icon.primary.rawValue {
UIApplication.shared.setAlternateIconName(nil)
} else {
UIApplication.shared.setAlternateIconName(icon.appIconName) { err in
guard let err else { return }
assertionFailure("\(err.localizedDescription) - Icon name: \(icon.appIconName)")
}
2023-01-28 07:58:36 +00:00
}
} label: {
ZStack(alignment: .bottomTrailing) {
Image(uiImage: .init(named: icon.iconName) ?? .init())
.resizable()
.aspectRatio(contentMode: .fit)
.frame(minHeight: 125, maxHeight: 1024)
.cornerRadius(6)
.shadow(radius: 3)
if icon.appIconName == currentIcon {
Image(systemName: "checkmark.seal.fill")
.padding(4)
.tint(.green)
}
}
}
2023-12-19 08:48:12 +00:00
.buttonStyle(.plain)
2023-01-28 07:58:36 +00:00
}
}
}
2022-12-04 08:50:25 +00:00
}
extension String {
2023-02-18 06:26:48 +00:00
var localized: String {
2023-09-16 12:15:03 +00:00
NSLocalizedString(self, comment: "")
2023-02-18 06:26:48 +00:00
}
}