From bebf08d085c60e339201f03891591f00a321e275 Mon Sep 17 00:00:00 2001 From: neon443 <69979447+neon443@users.noreply.github.com> Date: Sun, 24 Aug 2025 16:36:21 +0100 Subject: [PATCH] ok scrap miniterminal i did some custom ui to represent cursors --- ShhShell/Views/Settings/SettingsView.swift | 72 +++++++++++++++++++--- 1 file changed, 63 insertions(+), 9 deletions(-) diff --git a/ShhShell/Views/Settings/SettingsView.swift b/ShhShell/Views/Settings/SettingsView.swift index cb241bc..34174a1 100644 --- a/ShhShell/Views/Settings/SettingsView.swift +++ b/ShhShell/Views/Settings/SettingsView.swift @@ -12,7 +12,25 @@ struct SettingsView: View { @ObservedObject var hostsManager: HostsManager @ObservedObject var keyManager: KeyManager - var body: some View { + @State private var blinkCursor: Bool = false + @State var blinkTimer: Timer? + + func startBlinkingIfNeeded() { + if hostsManager.settings.cursorType.blink { + blinkTimer?.invalidate() + blinkTimer = nil + blinkTimer = Timer(timeInterval: 0.75, repeats: true) { timer in + Task { @MainActor in + blinkCursor.toggle() + } + } + RunLoop.main.add(blinkTimer!, forMode: .common) + } else { + blinkTimer?.invalidate() + } + } + + var body: some View { ZStack { hostsManager.selectedTheme.background.suiColor.opacity(0.7) .ignoresSafeArea(.all) @@ -31,6 +49,48 @@ struct SettingsView: View { step: 100 ) } + } + + Section("Cursor") { + ZStack(alignment: .leading) { + HStack(spacing: 0) { + Text("neon443") + .font(.largeTitle).monospaced() + .foregroundStyle(.terminalGreen) + Text(" ~ ") + .font(.largeTitle).monospaced() + .foregroundStyle(.blue) + Text(">") + .font(.largeTitle).monospaced() + .foregroundStyle(.blue) + } + Group { + switch hostsManager.settings.cursorType.cursorShape { + case .block: + Rectangle() + .frame(width: 20, height: 40) + case .bar: + Rectangle() + .frame(width: 4, height: 40) + case .underline: + Rectangle() + .frame(width: 25, height: 4) + .padding(.top, 36) + } + } + .padding(.leading, 248) + .onChange(of: hostsManager.settings.cursorType.blink) { _ in + startBlinkingIfNeeded() + } + .onAppear() { + startBlinkingIfNeeded() + } + .opacity(blinkCursor ? 0.5 : 1) + .animation( + Animation.easeInOut(duration: 1), + value: blinkCursor + ) + } Picker("Blink", selection: $hostsManager.settings.cursorType.blink) { Text("Blink").tag(true) @@ -38,19 +98,13 @@ struct SettingsView: View { } .pickerStyle(.segmented) - HStack { - ForEach(CursorShape.allCases, id: \.self) { type in - MiniTerminalController(text: .constant("asdjf"), cursorType: $hostsManager.settings.cursorType) - .frame(width: 100, height: 100) - } - } - - Picker("Cursor", selection: $hostsManager.settings.cursorType.cursorShape) { + Picker("", selection: $hostsManager.settings.cursorType.cursorShape) { ForEach(CursorShape.allCases, id: \.self) { type in Text(type.description).tag(type) } } .pickerStyle(.inline) + .labelsHidden() } Toggle("location persistence", systemImage: "location.fill", isOn: $hostsManager.settings.locationPersist)