IceCubesApp/IceCubesApp/App/Tabs/Settings/DisplaySettingsView.swift

113 lines
4.1 KiB
Swift
Raw Normal View History

2023-01-06 16:14:34 +00:00
import DesignSystem
2023-01-22 05:38:30 +00:00
import Env
2023-01-17 10:36:01 +00:00
import Models
2023-01-06 16:14:34 +00:00
import Status
2023-01-17 10:36:01 +00:00
import SwiftUI
2023-01-06 16:14:34 +00:00
struct DisplaySettingsView: View {
typealias FontState = Theme.FontState
2023-01-22 15:59:56 +00:00
@Environment(\.colorScheme) private var colorScheme
2023-01-06 16:14:34 +00:00
@EnvironmentObject private var theme: Theme
2023-01-17 20:08:05 +00:00
@EnvironmentObject private var userPreferences: UserPreferences
@State private var isFontSelectorPresented = false
2023-01-17 10:36:01 +00:00
2023-01-06 16:14:34 +00:00
var body: some View {
Form {
Section {
Toggle("settings.display.theme.systemColor", isOn: $theme.followSystemColorScheme)
2023-01-06 16:14:34 +00:00
themeSelectorButton
Group {
ColorPicker("settings.display.theme.tint", selection: $theme.tintColor)
ColorPicker("settings.display.theme.background", selection: $theme.primaryBackgroundColor)
ColorPicker("settings.display.theme.secondary-background", selection: $theme.secondaryBackgroundColor)
}
.disabled(theme.followSystemColorScheme)
.opacity(theme.followSystemColorScheme ? 0.5 : 1.0)
} header: {
Text("settings.display.section.theme")
} footer: {
if theme.followSystemColorScheme {
Text("settings.display.section.theme.footer")
}
2023-01-06 16:14:34 +00:00
}
.listRowBackground(theme.primaryBackgroundColor)
2023-01-17 10:36:01 +00:00
Section("settings.display.section.display") {
Picker("settings.display.font", selection: .init(get: {
userPreferences.chosenFontData != nil ? FontState.custom : FontState.system
}, set: { newValue in
switch newValue {
case .system:
userPreferences.chosenFont = nil
case .custom:
isFontSelectorPresented = true
}
})) {
ForEach(FontState.allCases, id: \.rawValue) { fontState in
Text(fontState.title).tag(fontState)
}
}
.navigationDestination(isPresented: $isFontSelectorPresented, destination: { FontPicker() })
Picker("settings.display.avatar.position", selection: $theme.avatarPosition) {
2023-01-06 16:14:34 +00:00
ForEach(Theme.AvatarPosition.allCases, id: \.rawValue) { position in
Text(position.description).tag(position)
}
}
Picker("settings.display.avatar.shape", selection: $theme.avatarShape) {
2023-01-06 16:14:34 +00:00
ForEach(Theme.AvatarShape.allCases, id: \.rawValue) { shape in
Text(shape.description).tag(shape)
}
}
Picker("settings.display.status.action-buttons", selection: $theme.statusActionsDisplay) {
2023-01-06 16:14:34 +00:00
ForEach(Theme.StatusActionsDisplay.allCases, id: \.rawValue) { buttonStyle in
Text(buttonStyle.description).tag(buttonStyle)
}
}
2023-01-17 10:36:01 +00:00
Picker("settings.display.status.media-style", selection: $theme.statusDisplayStyle) {
2023-01-07 16:44:25 +00:00
ForEach(Theme.StatusDisplayStyle.allCases, id: \.rawValue) { buttonStyle in
Text(buttonStyle.description).tag(buttonStyle)
}
}
2023-01-17 20:08:05 +00:00
if ProcessInfo.processInfo.isiOSAppOnMac {
VStack {
2023-01-22 05:38:30 +00:00
Slider(value: $userPreferences.fontSizeScale, in: 0.5 ... 1.5, step: 0.1)
2023-01-17 20:08:05 +00:00
Text("Font scaling: \(String(format: "%.1f", userPreferences.fontSizeScale))")
.font(.scaledBody)
}
}
Toggle("settings.display.translate-button", isOn: $userPreferences.showTranslateButton)
2023-01-06 16:14:34 +00:00
}
.listRowBackground(theme.primaryBackgroundColor)
2023-01-17 10:36:01 +00:00
2023-01-06 16:14:34 +00:00
Section {
Button {
2023-01-22 15:59:56 +00:00
theme.followSystemColorScheme = true
theme.selectedSet = colorScheme == .dark ? .iceCubeDark : .iceCubeLight
2023-01-06 16:14:34 +00:00
theme.avatarShape = .rounded
theme.avatarPosition = .top
theme.statusActionsDisplay = .full
} label: {
Text("settings.display.restore")
2023-01-06 16:14:34 +00:00
}
}
.listRowBackground(theme.primaryBackgroundColor)
}
.navigationTitle("settings.display.navigation-title")
2023-01-06 16:14:34 +00:00
.scrollContentBackground(.hidden)
.background(theme.secondaryBackgroundColor)
}
2023-01-17 10:36:01 +00:00
2023-01-06 16:14:34 +00:00
private var themeSelectorButton: some View {
NavigationLink(destination: ThemePreviewView()) {
HStack {
Text("settings.display.section.theme")
2023-01-06 16:14:34 +00:00
Spacer()
Text(theme.selectedSet.rawValue)
}
}
}
}