fixed themeEditor preview not updating

static var newTheme to create a new one
theme editing shows as a sheet to fix navigation bugs
mutating set on colorcodable idk if it helped
This commit is contained in:
neon443
2025-11-07 10:15:40 +00:00
parent cbe1fbad11
commit 64f1007da3
5 changed files with 64 additions and 15 deletions

View File

@@ -46,7 +46,7 @@ extension ColorCodable {
let blue = CGFloat(self.blue) let blue = CGFloat(self.blue)
return Color(UIColor(red: red, green: green, blue: blue, alpha: 1)) return Color(UIColor(red: red, green: green, blue: blue, alpha: 1))
} }
set { mutating set {
let cc = ColorCodable(color: newValue) let cc = ColorCodable(color: newValue)
self.red = cc.red self.red = cc.red
self.green = cc.green self.green = cc.green

View File

@@ -77,6 +77,12 @@ struct Theme: Hashable, Equatable, Identifiable {
static var builtinThemes: [Theme] { static var builtinThemes: [Theme] {
return ThemesBuiltin.allCases.map({ decodeLocalTheme(fileName: $0.rawValue)! }) return ThemesBuiltin.allCases.map({ decodeLocalTheme(fileName: $0.rawValue)! })
} }
static var newTheme: Theme {
var result = defaultTheme
result.id = UUID().uuidString
return result
}
} }
enum ThemesBuiltin: String, CaseIterable, Hashable, Equatable { enum ThemesBuiltin: String, CaseIterable, Hashable, Equatable {

View File

@@ -12,6 +12,9 @@ struct ThemeButton: View {
@Binding var theme: Theme @Binding var theme: Theme
@State var canModify: Bool @State var canModify: Bool
@Binding var themeToEdit: Theme
@Binding var showThemeEditor: Bool
@State private var showRenameAlert: Bool = false @State private var showRenameAlert: Bool = false
@State private var rename: String = "" @State private var rename: String = ""
@@ -79,8 +82,9 @@ struct ThemeButton: View {
.clipShape(RoundedRectangle(cornerRadius: outerR)) .clipShape(RoundedRectangle(cornerRadius: outerR))
.contextMenu { .contextMenu {
if canModify { if canModify {
NavigationLink { Button {
ThemeEditorView(hostsManager: hostsManager, theme: $theme) themeToEdit = theme
showThemeEditor = true
} label: { } label: {
Label("Edit", systemImage: "pencil") Label("Edit", systemImage: "pencil")
} }
@@ -122,7 +126,9 @@ struct ThemeButton: View {
ThemeButton( ThemeButton(
hostsManager: HostsManager(), hostsManager: HostsManager(),
theme: .constant(Theme.defaultTheme), theme: .constant(Theme.defaultTheme),
canModify: true canModify: true,
themeToEdit: .constant(Theme.defaultTheme),
showThemeEditor: .constant(false)
) )
.border(Color.red) .border(Color.red)
} }

View File

@@ -20,13 +20,34 @@ struct ThemeEditorView: View {
hostsManager.selectedTheme.background.suiColor.opacity(0.7) hostsManager.selectedTheme.background.suiColor.opacity(0.7)
.ignoresSafeArea(.all) .ignoresSafeArea(.all)
NavigationStack { NavigationStack {
ThemeButton(hostsManager: hostsManager, theme: $theme, canModify: false) ZStack {
.id(theme) RoundedRectangle(cornerRadius: 20)
.padding(.bottom) .foregroundStyle(theme.background.suiColor)
.fixedSize(horizontal: false, vertical: true) VStack {
.onChange(of: theme) { _ in Text(theme.name)
print(theme) .foregroundStyle(theme.foreground.suiColor)
.font(.headline)
.lineLimit(1)
Spacer()
VStack(spacing: 0) {
ForEach(0...1, id: \.self) { row in
HStack(spacing: 0) {
let range = row == 0 ? 0..<8 : 8..<16
ForEach(range, id: \.self) { col in
Rectangle()
.aspectRatio(1, contentMode: .fit)
.foregroundStyle(theme.ansi[col].suiColor)
}
}
}
}
.clipShape(RoundedRectangle(cornerRadius: 10))
} }
.padding(10)
}
.fixedSize(horizontal: false, vertical: true)
.background(.black)
.padding(.horizontal)
List { List {
Section("Main Colors") { Section("Main Colors") {

View File

@@ -79,7 +79,13 @@ struct ThemeManagerView: View {
} else { } else {
LazyVGrid(columns: layout, alignment: .center, spacing: 8) { LazyVGrid(columns: layout, alignment: .center, spacing: 8) {
ForEach($hostsManager.themes) { $theme in ForEach($hostsManager.themes) { $theme in
ThemeButton(hostsManager: hostsManager, theme: $theme, canModify: true) ThemeButton(
hostsManager: hostsManager,
theme: $theme,
canModify: true,
themeToEdit: $newTheme,
showThemeEditor: $showNewThemeEditor
)
} }
} }
.padding(.horizontal) .padding(.horizontal)
@@ -95,7 +101,13 @@ struct ThemeManagerView: View {
} }
LazyVGrid(columns: layout, alignment: .center, spacing: 8) { LazyVGrid(columns: layout, alignment: .center, spacing: 8) {
ForEach(Theme.builtinThemes) { theme in ForEach(Theme.builtinThemes) { theme in
ThemeButton(hostsManager: hostsManager, theme: .constant(theme), canModify: false) ThemeButton(
hostsManager: hostsManager,
theme: .constant(theme),
canModify: false,
themeToEdit: .constant(Theme.defaultTheme),
showThemeEditor: .constant(false)
)
} }
} }
.padding(.horizontal) .padding(.horizontal)
@@ -134,14 +146,18 @@ struct ThemeManagerView: View {
ToolbarItem() { ToolbarItem() {
Button() { Button() {
newTheme = Theme.defaultTheme let createdTheme = Theme.newTheme
hostsManager.themes.append(createdTheme)
newTheme = createdTheme
showNewThemeEditor = true showNewThemeEditor = true
} label: { } label: {
Label("New", systemImage: "plus") Label("New", systemImage: "plus")
} }
} }
} }
.navigationDestination(isPresented: $showNewThemeEditor) { .sheet(isPresented: $showNewThemeEditor) {
hostsManager.updateTheme(newTheme)
} content: {
ThemeEditorView(hostsManager: hostsManager, theme: $newTheme) ThemeEditorView(hostsManager: hostsManager, theme: $newTheme)
} }
} }