Extract multiplexer dialect and resumable terminal engine registries while preserving session and checkpoint compatibility. Share local-network and theme policies, add regression coverage, and update discovery actions to Cancel and Rescan with localized Telnet copy.
43 lines
1.3 KiB
Swift
43 lines
1.3 KiB
Swift
import Foundation
|
|
import TermindDomain
|
|
|
|
@Observable
|
|
public final class TerminalCustomThemeDraft: Identifiable {
|
|
public var value: TerminalCustomTheme
|
|
public private(set) var original: TerminalCustomTheme
|
|
public private(set) var isNew: Bool
|
|
public var id: UUID { value.id }
|
|
public var isDirty: Bool { value != original }
|
|
|
|
public init(_ value: TerminalCustomTheme, isNew: Bool) {
|
|
self.value = value
|
|
original = value
|
|
self.isNew = isNew
|
|
}
|
|
|
|
public func refresh(from model: TerminalSettingsModel) {
|
|
guard !isNew, !isDirty, let remote = model.themeLibrary.themes.first(where: { $0.id == id }) else { return }
|
|
original = remote
|
|
value = remote
|
|
}
|
|
|
|
public func isDeleted(in model: TerminalSettingsModel) -> Bool {
|
|
!isNew && !model.themeLibrary.themes.contains { $0.id == id }
|
|
}
|
|
|
|
public func save(in model: TerminalSettingsModel) -> Bool {
|
|
var saved = value
|
|
saved.name = saved.name.trimmingCharacters(in: .whitespacesAndNewlines)
|
|
guard model.saveCustomTheme(saved, isNew: isNew) else { return false }
|
|
value = saved
|
|
original = saved
|
|
isNew = false
|
|
return true
|
|
}
|
|
|
|
public func makeCopy(name: String) {
|
|
value = value.copy(named: name)
|
|
isNew = true
|
|
}
|
|
}
|