diff --git a/ShhShell/Host/HostsManager.swift b/ShhShell/Host/HostsManager.swift index f1774b7..d4c111d 100644 --- a/ShhShell/Host/HostsManager.swift +++ b/ShhShell/Host/HostsManager.swift @@ -25,12 +25,14 @@ class HostsManager: ObservableObject, @unchecked Sendable { @Published var snippets: [Snippet] = [] @Published var history: [History] = [] + @Published var settings: AppSettings = AppSettings() var tint: SwiftUI.Color { selectedTheme.ansi[selectedAnsi].suiColor } init(previews: Bool = false) { + loadSettings() loadHosts() exportHosts() loadThemes() @@ -45,6 +47,17 @@ class HostsManager: ObservableObject, @unchecked Sendable { } } + func loadSettings() { + guard let data = userDefaults.data(forKey: "settings") else { return } + guard let decoded = try? JSONDecoder().decode(AppSettings.self, from: data) else { return } + self.settings = decoded + } + + func saveSettings() { + guard let encoded = try? JSONEncoder().encode(settings) else { return } + userDefaults.set(encoded, forKey: "settings") + } + func loadHistory() { guard let data = userDefaults.data(forKey: "history") else { return } guard let decoded = try? JSONDecoder().decode([History].self, from: data) else { return } diff --git a/ShhShell/Settings/AppSettings.swift b/ShhShell/Settings/AppSettings.swift index a65d4ce..fd665a0 100644 --- a/ShhShell/Settings/AppSettings.swift +++ b/ShhShell/Settings/AppSettings.swift @@ -9,7 +9,7 @@ import Foundation import SwiftUI struct AppSettings: Codable, Sendable { - var scrollback: Int = 1_000 + var scrollback: CGFloat = 1_000 var cursorStyle: CursorStyle = .block var locationPersist: Bool = false var bellSound: Bool = false diff --git a/ShhShell/Views/Settings/SettingsView.swift b/ShhShell/Views/Settings/SettingsView.swift index 31973bf..7afbd2f 100644 --- a/ShhShell/Views/Settings/SettingsView.swift +++ b/ShhShell/Views/Settings/SettingsView.swift @@ -17,40 +17,48 @@ struct SettingsView: View { .ignoresSafeArea(.all) List { Section("Terminal") { - Label("Scrollback", systemImage: "scroll") - HStack { - Slider(value: .constant(0), in: 1_000...50_000, step: 1_000) - Text("hi") + VStack(alignment: .leading) { + HStack { + Label("Scrollback", systemImage: "scroll") + Spacer() + Text("\(Int(hostsManager.settings.scrollback))") + .contentTransition(.numericText()) + } + Slider( + value: $hostsManager.settings.scrollback, + in: 1_000...50_000, + step: 1_000.0 + ) } - Picker("Cursor", selection: .constant(CursorStyle.bar)) { + Picker("Cursor", selection: $hostsManager.settings.cursorStyle) { ForEach(CursorStyle.allCases, id: \.self) { type in Text("\(type)").tag(type) } } - - - + .pickerStyle(.inline) } - Toggle("location persistence", isOn: .constant(false)) - Toggle("bell sound", isOn: .constant(false)) - Toggle("bell haptic", isOn: .constant(false)) + Toggle("location persistence", systemImage: "location.fill", isOn: $hostsManager.settings.locationPersist) - Toggle("keep screen awake", isOn: .constant(false)) + Toggle("bell sound", systemImage: "bell.and.waves.left.and.right", isOn: $hostsManager.settings.bellSound) + Toggle("bell haptic",systemImage: "iphone.homebutton.radiowaves.left.and.right", isOn: $hostsManager.settings.bellHaptic) - Picker("terminal filter", selection: .constant(TerminalFilter.crt)) { + Toggle("keep screen awake", systemImage: "cup.and.saucer.fill", isOn: $hostsManager.settings.caffeinate) + + Picker("terminal filter", selection: $hostsManager.settings.filter) { ForEach(TerminalFilter.allCases, id: \.self) { filter in Text("\(filter)").tag(filter) } } - Picker("appicon", selection: .constant(AppIcon.regular)) { + Picker("appicon", selection: $hostsManager.settings.appIcon) { ForEach(AppIcon.allCases, id: \.self) { icon in Text("\(icon)").tag(icon) icon.image } - }.pickerStyle(.menu) + } + .pickerStyle(.inline) } .listStyle(.sidebar) .scrollContentBackground(.hidden)