46 lines
1.4 KiB
Swift
46 lines
1.4 KiB
Swift
// SPDX-FileCopyrightText: 2026 Kaede Akino
|
|
// SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
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
|
|
}
|
|
}
|