From f19f32682f30cfd79e8235f17d21531720cc296a Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Sat, 28 Jun 2025 16:06:11 +0100 Subject: [PATCH] added selecting and applying themes added selectTheme to set the selectedtheme index added isthemeselected to check if a theme is selected applytheme takes an index now ui needs work lol - cant select default, and selction doesnt save between sessions --- ShhShell/Host/HostsManager.swift | 14 ++++++++++++++ ShhShell/Views/Hosts/ConnectionView.swift | 2 +- ShhShell/Views/Hosts/HostsView.swift | 2 +- ShhShell/Views/Terminal/SSHTerminalDelegate.swift | 12 ++++++++++-- ShhShell/Views/Terminal/ShellView.swift | 8 ++++++-- ShhShell/Views/Terminal/TerminalController.swift | 7 ++++++- ShhShell/Views/Themes/ThemeManagerView.swift | 4 ++++ 7 files changed, 42 insertions(+), 7 deletions(-) diff --git a/ShhShell/Host/HostsManager.swift b/ShhShell/Host/HostsManager.swift index 682fd9d..7851a07 100644 --- a/ShhShell/Host/HostsManager.swift +++ b/ShhShell/Host/HostsManager.swift @@ -14,6 +14,7 @@ class HostsManager: ObservableObject, @unchecked Sendable { @Published var hosts: [Host] = [] @Published var themes: [Theme] = [] + @Published var selectedThemeIndex: Int = -1 init() { loadHosts() @@ -48,6 +49,19 @@ class HostsManager: ObservableObject, @unchecked Sendable { task.resume() } + func selectTheme(_ selectedTheme: Theme) { + guard let index = themes.firstIndex(where: { $0 == selectedTheme }) else { + withAnimation { selectedThemeIndex = -1 } + return + } + withAnimation { selectedThemeIndex = index } + } + + func isThemeSelected(_ themeInQuestion: Theme) -> Bool { + guard let index = themes.firstIndex(where: { $0 == themeInQuestion }) else { return false } + return index == selectedThemeIndex + } + func renameTheme(_ theme: Theme?, to newName: String) { guard let theme else { return } guard theme.name != newName else { return } diff --git a/ShhShell/Views/Hosts/ConnectionView.swift b/ShhShell/Views/Hosts/ConnectionView.swift index ed3fe36..6fec5df 100644 --- a/ShhShell/Views/Hosts/ConnectionView.swift +++ b/ShhShell/Views/Hosts/ConnectionView.swift @@ -185,7 +185,7 @@ struct ConnectionView: View { } .onAppear { if shellView == nil { - shellView = ShellView(handler: handler) + shellView = ShellView(handler: handler, hostsManager: hostsManager) } } .onAppear { diff --git a/ShhShell/Views/Hosts/HostsView.swift b/ShhShell/Views/Hosts/HostsView.swift index f1e79dd..cfa2438 100644 --- a/ShhShell/Views/Hosts/HostsView.swift +++ b/ShhShell/Views/Hosts/HostsView.swift @@ -21,7 +21,7 @@ struct HostsView: View { NavigationLink() { ForEach(hostsManager.hosts) { host in let miniHandler = SSHHandler(host: host) - TerminalController(handler: miniHandler) + TerminalController(handler: miniHandler, hostsManager: hostsManager) .onAppear { miniHandler.go() } } } label: { diff --git a/ShhShell/Views/Terminal/SSHTerminalDelegate.swift b/ShhShell/Views/Terminal/SSHTerminalDelegate.swift index d5b92a9..2fab01e 100644 --- a/ShhShell/Views/Terminal/SSHTerminalDelegate.swift +++ b/ShhShell/Views/Terminal/SSHTerminalDelegate.swift @@ -12,10 +12,14 @@ import SwiftTerm @MainActor final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency TerminalViewDelegate { var handler: SSHHandler? + var hostsManager: HostsManager? - public convenience init(frame: CGRect, handler: SSHHandler) { + public convenience init(frame: CGRect, handler: SSHHandler, hostsManager: HostsManager) { self.init(frame: frame) self.handler = handler + self.hostsManager = hostsManager + + applyTheme(index: hostsManager.selectedThemeIndex) DispatchQueue.main.async { Task { @@ -48,7 +52,11 @@ final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency Termina } } - func applyTheme(_ theme: Theme) { + func applyTheme(index themeIndex: Int) { + guard themeIndex != -1 else { return } + guard let hostsManager = hostsManager else { return } + + let theme = hostsManager.themes[themeIndex] getTerminal().installPalette(colors: theme.ansi) getTerminal().foregroundColor = theme.foreground getTerminal().backgroundColor = theme.background diff --git a/ShhShell/Views/Terminal/ShellView.swift b/ShhShell/Views/Terminal/ShellView.swift index 1ff1353..3cdff3a 100644 --- a/ShhShell/Views/Terminal/ShellView.swift +++ b/ShhShell/Views/Terminal/ShellView.swift @@ -9,13 +9,14 @@ import SwiftUI struct ShellView: View { @ObservedObject var handler: SSHHandler + @ObservedObject var hostsManager: HostsManager @Environment(\.dismiss) var dismiss var body: some View { NavigationStack { ZStack { - TerminalController(handler: handler) + TerminalController(handler: handler, hostsManager: hostsManager) .onAppear { TerminalController.TerminalViewContainer.shared?.restoreScrollback() } @@ -61,5 +62,8 @@ struct ShellView: View { } #Preview { - ShellView(handler: SSHHandler(host: Host.debug)) + ShellView( + handler: SSHHandler(host: Host.debug), + hostsManager: HostsManager() + ) } diff --git a/ShhShell/Views/Terminal/TerminalController.swift b/ShhShell/Views/Terminal/TerminalController.swift index db137c2..11a2ee2 100644 --- a/ShhShell/Views/Terminal/TerminalController.swift +++ b/ShhShell/Views/Terminal/TerminalController.swift @@ -12,6 +12,7 @@ import SwiftTerm struct TerminalController: UIViewRepresentable { @ObservedObject var handler: SSHHandler + @ObservedObject var hostsManager: HostsManager final class TerminalViewContainer { @MainActor static var shared: SSHTerminalDelegate? @@ -22,7 +23,11 @@ struct TerminalController: UIViewRepresentable { return existing } - let tv = SSHTerminalDelegate(frame: CGRect(origin: CGPoint(x: 0, y: 0), size: .zero), handler: handler) + let tv = SSHTerminalDelegate( + frame: CGRect(origin: CGPoint(x: 0, y: 0), size: .zero), + handler: handler, + hostsManager: hostsManager + ) tv.translatesAutoresizingMaskIntoConstraints = false tv.autoresizingMask = [.flexibleWidth, .flexibleHeight] diff --git a/ShhShell/Views/Themes/ThemeManagerView.swift b/ShhShell/Views/Themes/ThemeManagerView.swift index 58bd9c4..caae6dc 100644 --- a/ShhShell/Views/Themes/ThemeManagerView.swift +++ b/ShhShell/Views/Themes/ThemeManagerView.swift @@ -31,6 +31,10 @@ struct ThemeManagerView: View { LazyHGrid(rows: [grid, grid], alignment: .center, spacing: 8) { ForEach(hostsManager.themes) { theme in ThemePreview(theme: theme) + .scaleEffect(hostsManager.isThemeSelected(theme) ? 1.2 : 1) + .onTapGesture { + hostsManager.selectTheme(theme) + } .contextMenu { Button() { themeToRename = theme