mirror of
https://github.com/StikDebug/StikDebug.git
synced 2026-10-16 04:20:30 +00:00
custom theme and system theme
This commit is contained in:
parent
420eb6cfb6
commit
87e49b9b88
3 changed files with 95 additions and 24 deletions
|
|
@ -19,18 +19,25 @@ extension Color {
|
|||
}
|
||||
|
||||
init?(hex: String) {
|
||||
let r, g, b: CGFloat
|
||||
let start = hex.index(hex.startIndex, offsetBy: 1)
|
||||
let hexColor = String(hex[start...])
|
||||
|
||||
if hexColor.count == 6, let hexNumber = Int(hexColor, radix: 16) {
|
||||
r = CGFloat((hexNumber & 0xff0000) >> 16) / 255
|
||||
g = CGFloat((hexNumber & 0x00ff00) >> 8) / 255
|
||||
b = CGFloat(hexNumber & 0x0000ff) / 255
|
||||
self.init(red: r, green: g, blue: b)
|
||||
return
|
||||
if hex.isEmpty || hex.count < 2 {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
let r, g, b: CGFloat
|
||||
|
||||
if hex.hasPrefix("#") && hex.count >= 7 {
|
||||
let start = hex.index(hex.startIndex, offsetBy: 1)
|
||||
let hexColor = String(hex[start...])
|
||||
|
||||
if hexColor.count == 6, let hexNumber = Int(hexColor, radix: 16) {
|
||||
r = CGFloat((hexNumber & 0xff0000) >> 16) / 255
|
||||
g = CGFloat((hexNumber & 0x00ff00) >> 8) / 255
|
||||
b = CGFloat(hexNumber & 0x0000ff) / 255
|
||||
self.init(red: r, green: g, blue: b)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,9 +17,10 @@ extension UIDocumentPickerViewController {
|
|||
struct HomeView: View {
|
||||
|
||||
@AppStorage("username") private var username = "User"
|
||||
@AppStorage("customBackgroundColor") private var customBackgroundColorHex: String = Color.primaryBackground.toHex() ?? "#000000"
|
||||
@AppStorage("customBackgroundColor") private var customBackgroundColorHex: String = ""
|
||||
@AppStorage("autoQuitAfterEnablingJIT") private var doAutoQuitAfterEnablingJIT = false
|
||||
@State private var selectedBackgroundColor: Color = Color(hex: UserDefaults.standard.string(forKey: "customBackgroundColor") ?? "#000000") ?? Color.primaryBackground
|
||||
@State private var selectedBackgroundColor: Color = Color(hex: UserDefaults.standard.string(forKey: "customBackgroundColor") ?? "") ?? .clear
|
||||
@Environment(\.colorScheme) private var colorScheme
|
||||
let timer = Timer.publish(every: 1, on: .main, in: .common).autoconnect()
|
||||
@AppStorage("bundleID") private var bundleID: String = ""
|
||||
@State private var isProcessing = false
|
||||
|
|
@ -38,7 +39,11 @@ struct HomeView: View {
|
|||
|
||||
var body: some View {
|
||||
ZStack {
|
||||
selectedBackgroundColor.edgesIgnoringSafeArea(.all)
|
||||
// Use the background color or default to appearance-based color if not set
|
||||
(selectedBackgroundColor == .clear ?
|
||||
(colorScheme == .dark ? Color.black : Color.white) :
|
||||
selectedBackgroundColor)
|
||||
.edgesIgnoringSafeArea(.all)
|
||||
|
||||
VStack(spacing: 25) {
|
||||
Spacer()
|
||||
|
|
@ -145,6 +150,11 @@ struct HomeView: View {
|
|||
}
|
||||
.onAppear {
|
||||
checkPairingFileExists()
|
||||
// Don't initialize specific color value when empty - empty means "use system theme"
|
||||
// This was causing the toggle to turn off when returning to settings
|
||||
|
||||
// Initialize background color
|
||||
refreshBackground()
|
||||
}
|
||||
.onReceive(timer) { _ in
|
||||
refreshBackground()
|
||||
|
|
@ -258,7 +268,11 @@ struct HomeView: View {
|
|||
}
|
||||
|
||||
private func refreshBackground() {
|
||||
selectedBackgroundColor = Color(hex: customBackgroundColorHex) ?? Color.primaryBackground
|
||||
if customBackgroundColorHex.isEmpty {
|
||||
selectedBackgroundColor = colorScheme == .dark ? Color.black : Color.white
|
||||
} else {
|
||||
selectedBackgroundColor = Color(hex: customBackgroundColorHex) ?? (colorScheme == .dark ? Color.black : Color.white)
|
||||
}
|
||||
}
|
||||
|
||||
private func startJITInBackground(with bundleID: String) {
|
||||
|
|
|
|||
|
|
@ -8,12 +8,13 @@ import UniformTypeIdentifiers
|
|||
|
||||
struct SettingsView: View {
|
||||
@AppStorage("username") private var username = "User"
|
||||
@AppStorage("customBackgroundColor") private var customBackgroundColorHex: String = Color.primaryBackground.toHex() ?? "#000000"
|
||||
@AppStorage("customBackgroundColor") private var customBackgroundColorHex: String = ""
|
||||
@AppStorage("selectedAppIcon") private var selectedAppIcon: String = "AppIcon"
|
||||
@AppStorage("autoQuitAfterEnablingJIT") private var doAutoQuitAfterEnablingJIT = false
|
||||
@State private var isShowingPairingFilePicker = false
|
||||
@Environment(\.colorScheme) private var colorScheme
|
||||
|
||||
@State private var selectedBackgroundColor: Color = Color.primaryBackground
|
||||
@State private var selectedBackgroundColor: Color = .clear
|
||||
@State private var showIconPopover = false
|
||||
@State private var showPairingFileMessage = false
|
||||
@State private var pairingFileIsValid = false
|
||||
|
|
@ -98,15 +99,59 @@ struct SettingsView: View {
|
|||
.foregroundColor(.primary)
|
||||
.padding(.bottom, 4)
|
||||
|
||||
ColorPicker("Background Color", selection: $selectedBackgroundColor)
|
||||
.onChange(of: selectedBackgroundColor) { newColor in
|
||||
saveCustomBackgroundColor(newColor)
|
||||
// Theme selector with segmented control style
|
||||
VStack(alignment: .leading, spacing: 10) {
|
||||
Text("Background Color")
|
||||
.font(.subheadline)
|
||||
.foregroundColor(.secondary)
|
||||
|
||||
// Clean segmented style picker
|
||||
Picker("Theme Mode", selection: Binding(
|
||||
get: { customBackgroundColorHex.isEmpty },
|
||||
set: { newValue in
|
||||
if newValue {
|
||||
// System theme selected
|
||||
customBackgroundColorHex = ""
|
||||
selectedBackgroundColor = colorScheme == .dark ? Color.black : Color.white
|
||||
} else if customBackgroundColorHex.isEmpty {
|
||||
// Custom color selected - initialize with current theme color
|
||||
let initialColor = colorScheme == .dark ? Color.black : Color.white
|
||||
customBackgroundColorHex = initialColor.toHex() ?? "#000000"
|
||||
selectedBackgroundColor = initialColor
|
||||
}
|
||||
}
|
||||
)) {
|
||||
Text("System").tag(true)
|
||||
Text("Custom").tag(false)
|
||||
}
|
||||
.foregroundColor(.primary)
|
||||
.padding(.vertical, 6)
|
||||
.pickerStyle(SegmentedPickerStyle())
|
||||
.padding(.vertical, 4)
|
||||
|
||||
// Show color picker only in custom mode with a nice transition
|
||||
if !customBackgroundColorHex.isEmpty {
|
||||
ColorPicker("", selection: $selectedBackgroundColor)
|
||||
.onChange(of: selectedBackgroundColor) { newColor in
|
||||
saveCustomBackgroundColor(newColor)
|
||||
}
|
||||
.labelsHidden()
|
||||
.frame(maxWidth: .infinity, alignment: .center)
|
||||
.padding(.top, 4)
|
||||
.transition(.opacity)
|
||||
}
|
||||
|
||||
// Help text
|
||||
Text(customBackgroundColorHex.isEmpty ?
|
||||
"Uses light/dark mode system colors" :
|
||||
"Select your preferred background color")
|
||||
.font(.caption)
|
||||
.foregroundColor(.secondary)
|
||||
.padding(.top, 4)
|
||||
}
|
||||
.padding(.vertical, 6)
|
||||
}
|
||||
.padding(.vertical, 20)
|
||||
.padding(.horizontal, 16)
|
||||
.animation(.easeInOut(duration: 0.2), value: customBackgroundColorHex.isEmpty)
|
||||
}
|
||||
|
||||
SettingsCard {
|
||||
|
|
@ -534,11 +579,16 @@ struct SettingsView: View {
|
|||
}
|
||||
|
||||
private func loadCustomBackgroundColor() {
|
||||
selectedBackgroundColor = Color(hex: customBackgroundColorHex) ?? Color.primaryBackground
|
||||
if customBackgroundColorHex.isEmpty {
|
||||
selectedBackgroundColor = colorScheme == .dark ? Color.black : Color.white
|
||||
} else {
|
||||
selectedBackgroundColor = Color(hex: customBackgroundColorHex) ?? (colorScheme == .dark ? Color.black : Color.white)
|
||||
}
|
||||
}
|
||||
|
||||
private func saveCustomBackgroundColor(_ color: Color) {
|
||||
customBackgroundColorHex = color.toHex() ?? "#000000"
|
||||
// Always save the custom color if we got here (since auto theme mode is disabled)
|
||||
customBackgroundColorHex = color.toHex() ?? ""
|
||||
}
|
||||
|
||||
private func changeAppIcon(to iconName: String) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue