redid logic on the shellview selection

fixed the colours being unreadable sometimes on title bar of the shellview
luminance ratio func
forcedismissdisconnectedalert is now in handler
This commit is contained in:
neon443
2025-09-03 20:33:19 +01:00
parent a71c994103
commit 02d8757547
7 changed files with 71 additions and 56 deletions

View File

@@ -23,7 +23,6 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
var sessionID: UUID? var sessionID: UUID?
var scrollback: [String] = [] var scrollback: [String] = []
// var scrollbackSize = 0.0
@Published var title: String = "" @Published var title: String = ""
@Published var state: SSHState = .idle @Published var state: SSHState = .idle
@@ -32,6 +31,7 @@ class SSHHandler: @unchecked Sendable, ObservableObject {
} }
@Published var testSuceeded: Bool? = nil @Published var testSuceeded: Bool? = nil
@Published var forceDismissDisconnectedAlert: Bool = false
@Published var bell: Bool = false @Published var bell: Bool = false

View File

@@ -34,7 +34,7 @@ final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency Termina
applyScrollbackLength() applyScrollbackLength()
applyCursorType() applyCursorType()
getTerminal().registerOscHandler(code: 133, handler: { _ in }) getTerminal().registerOscHandler(code: 133, handler: { _ in })
getTerminal().setCursorAnimations(CursorAnimations(type: .stretchAndMove)) getTerminal().setCursorAnimations(CursorAnimations(type: .stretchAndMove, length: 0.2))
self.startFeedLoop() self.startFeedLoop()
let _ = self.becomeFirstResponder() let _ = self.becomeFirstResponder()
} }
@@ -54,11 +54,11 @@ final class SSHTerminalDelegate: TerminalView, Sendable, @preconcurrency Termina
} }
} }
override func showCursor(source: Terminal) { // override func showCursor(source: Terminal) {
super.showCursor(source: source) // super.showCursor(source: source)
super.cursorStyleChanged(source: getTerminal(), newStyle: getTerminal().options.cursorStyle) // super.cursorStyleChanged(source: getTerminal(), newStyle: getTerminal().options.cursorStyle)
print("showcursor called") // print("showcursor called")
} // }
override func hideCursor(source: Terminal) { override func hideCursor(source: Terminal) {
super.hideCursor(source: source) super.hideCursor(source: source)

View File

@@ -80,4 +80,12 @@ extension SwiftTerm.Color {
let b = Double(blue)/65535 let b = Double(blue)/65535
return (0.2126*r + 0.7152*g + 0.0722*b) return (0.2126*r + 0.7152*g + 0.0722*b)
} }
func luminanceRatio(with other: SwiftTerm.Color) -> Double {
if self.luminance > other.luminance {
return (self.luminance + 0.05) / (other.luminance + 0.05)
} else {
return (other.luminance + 0.05) / (self.luminance + 0.05)
}
}
} }

View File

@@ -36,7 +36,7 @@ struct SessionView: View {
.fullScreenCover(isPresented: $shellPresented) { .fullScreenCover(isPresented: $shellPresented) {
//instancing handler here cos its non optional //instancing handler here cos its non optional
ShellTabView( ShellTabView(
handler: SSHHandler(host: Host.blank, keyManager: keyManager), handler: nil,
hostsManager: hostsManager, hostsManager: hostsManager,
selectedID: key selectedID: key
) )

View File

@@ -6,16 +6,17 @@
// //
import SwiftUI import SwiftUI
import SwiftTerm
struct ShellTabView: View { struct ShellTabView: View {
@State var handler: SSHHandler @State var handler: SSHHandler?
@ObservedObject var hostsManager: HostsManager @ObservedObject var hostsManager: HostsManager
@ObservedObject var container = TerminalViewContainer.shared @ObservedObject var container = TerminalViewContainer.shared
@State var selectedID: UUID? @State var selectedID: UUID?
var selectedHandler: SSHHandler { var selectedHandler: SSHHandler {
guard let selectedID, let contained = container.sessions[selectedID] else { guard let selectedID, let contained = container.sessions[selectedID] else {
return handler return handler!
} }
return contained.handler return contained.handler
} }
@@ -24,26 +25,25 @@ struct ShellTabView: View {
@Environment(\.dismiss) var dismiss @Environment(\.dismiss) var dismiss
var foreground: Color { var foreground: SwiftUI.Color {
let selectedTheme = hostsManager.selectedTheme let selectedTheme = hostsManager.selectedTheme
let foreground = selectedTheme.foreground let fg = selectedTheme.foreground
let background = selectedTheme.background let bg = selectedTheme.background
let ansi = selectedTheme.ansi[hostsManager.selectedAnsi]
var result: SwiftTerm.Color
if selectedTheme.ansi[hostsManager.selectedAnsi].luminance > 0.5 { if fg.luminanceRatio(with: ansi) > bg.luminanceRatio(with: ansi) {
if foreground.luminance > 0.5 { result = fg
return background.suiColor
} else {
return foreground.suiColor
}
} else { } else {
if foreground.luminance > 0.5 { result = bg
return foreground.suiColor
} else {
return background.suiColor
}
} }
guard result.luminanceRatio(with: ansi) > 4.5 else {
return ansi.luminance > 0.5 ? .black : .white
}
return result.suiColor
} }
var background: Color { hostsManager.selectedTheme.background.suiColor } var background: SwiftUI.Color { hostsManager.selectedTheme.background.suiColor }
var body: some View { var body: some View {
ZStack { ZStack {
@@ -84,6 +84,19 @@ struct ShellTabView: View {
} }
} }
Spacer() Spacer()
if selectedHandler.state != .shellOpen {
Button() {
withAnimation { selectedHandler.forceDismissDisconnectedAlert = false }
} label: {
Image(systemName: "wifi.exclamationmark")
.resizable().scaledToFit()
.frame(width: 20, height: 20)
}
.foregroundStyle(foreground)
.id(selectedID)
}
Button() { Button() {
showSnippetPicker.toggle() showSnippetPicker.toggle()
} label: { } label: {
@@ -124,7 +137,7 @@ struct ShellTabView: View {
let oneTabWidth: CGFloat = max(100, (UIScreen.main.bounds.width)/CGFloat(container.sessionIDs.count)) let oneTabWidth: CGFloat = max(100, (UIScreen.main.bounds.width)/CGFloat(container.sessionIDs.count))
HStack(spacing: 0) { HStack(spacing: 0) {
ForEach(container.sessionIDs, id: \.self) { id in ForEach(container.sessionIDs, id: \.self) { id in
let selected: Bool = selectedID == id || (selectedID == nil && handler.sessionID == id) let selected: Bool = id == selectedHandler.sessionID ?? UUID()
let thisHandler: SSHHandler = container.sessions[id]!.handler let thisHandler: SSHHandler = container.sessions[id]!.handler
ZStack { ZStack {
Rectangle() Rectangle()
@@ -162,32 +175,28 @@ struct ShellTabView: View {
} }
//the acc terminal lol //the acc terminal lol
if let selectedID, // Group {
let session = container.sessions[selectedID] { // if selectedID != nil {
ShellView( ShellView(
handler: session.handler, handler: selectedHandler,
hostsManager: hostsManager hostsManager: hostsManager
) )
.onAppear { // }
UIApplication.shared.isIdleTimerDisabled = hostsManager.settings.caffeinate // }
if hostsManager.settings.locationPersist { .onAppear {
Backgrounder.shared.startBgTracking() UIApplication.shared.isIdleTimerDisabled = hostsManager.settings.caffeinate
} if hostsManager.settings.locationPersist {
Backgrounder.shared.startBgTracking()
} }
.onDisappear {
UIApplication.shared.isIdleTimerDisabled = false
if container.sessions.isEmpty {
Backgrounder.shared.stopBgTracking()
}
}
.id(selectedID)
.transition(.opacity)
} else {
ShellView(
handler: handler,
hostsManager: hostsManager
)
} }
.onDisappear {
UIApplication.shared.isIdleTimerDisabled = false
if container.sessions.isEmpty {
Backgrounder.shared.stopBgTracking()
}
}
.id(selectedID)
.transition(.opacity)
} }
} }
} }

View File

@@ -13,8 +13,6 @@ struct ShellView: View {
@ObservedObject var hostsManager: HostsManager @ObservedObject var hostsManager: HostsManager
@ObservedObject var container = TerminalViewContainer.shared @ObservedObject var container = TerminalViewContainer.shared
@State private var forceDismissDisconnectAlert: Bool = false
@Environment(\.dismiss) var dismiss @Environment(\.dismiss) var dismiss
var body: some View { var body: some View {
@@ -36,7 +34,7 @@ struct ShellView: View {
} }
} }
.onAppear { .onAppear {
forceDismissDisconnectAlert = false withAnimation { handler.forceDismissDisconnectedAlert = false }
} }
Group { Group {
@@ -61,7 +59,7 @@ struct ShellView: View {
} }
} }
if handler.state != .shellOpen && !forceDismissDisconnectAlert { if handler.state != .shellOpen && !handler.forceDismissDisconnectedAlert {
ZStack { ZStack {
RoundedRectangle(cornerRadius: 25) RoundedRectangle(cornerRadius: 25)
.fill(hostsManager.selectedTheme.foreground.suiColor) .fill(hostsManager.selectedTheme.foreground.suiColor)
@@ -89,7 +87,7 @@ struct ShellView: View {
.clipShape(RoundedRectangle(cornerRadius: 15)) .clipShape(RoundedRectangle(cornerRadius: 15))
} }
Button { Button {
forceDismissDisconnectAlert = true withAnimation { handler.forceDismissDisconnectedAlert = true }
} label: { } label: {
Text("Cancel") Text("Cancel")
.foregroundStyle(hostsManager.selectedTheme.background.suiColor) .foregroundStyle(hostsManager.selectedTheme.background.suiColor)