Files
TUIkit/Sources/TUIkitView/Environment/ObjectEnvironmentModifier.swift
phranck 5ad97132b8 Feat: Add @Observable support with Observation framework
- Replace custom Observable protocol and @Published with Apple's @Observable macro
- Add withObservationTracking in renderToBuffer for automatic per-property dependency tracking
- Add type-based @Environment(Type.self) and .environment(object) for observable objects
- Add ObjectEnvironmentModifier for injecting observable objects into the environment
- Add needsCacheClear flag to AppState for thread-safe cache invalidation
- Add cross-platform test script (scripts/test-linux.sh) for Docker-based Linux verification
- Add DemoAppHeader with system info display (OS, version, architecture)
- Consolidate Example App: extract ImageDemoHelpers, KeyboardHelpSection, ValueDisplayRow
- Add pre-push verification rule to CLAUDE.md
- Verified on both macOS and Linux (swift:6.0 container), 1155 tests passing
2026-02-15 23:49:34 +01:00

54 lines
1.6 KiB
Swift
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 🖥 TUIKit Terminal UI Kit for Swift
// ObjectEnvironmentModifier.swift
//
// Created by LAYERED.work
// License: MIT
import Observation
import TUIkitCore
// MARK: - Object Environment Modifier
/// A modifier that injects an observable object into the environment by type.
///
/// The object is stored by its type, enabling retrieval via
/// `@Environment(MyModel.self)`. Only one object per type can be
/// stored at each level of the view hierarchy; inner modifiers
/// override outer ones for the same type.
///
/// This is framework infrastructure. Use the `.environment(_:)` modifier
/// on `View` instead.
public struct ObjectEnvironmentModifier<Content: View, T: Observable>: View {
/// The content view.
public let content: Content
/// The observable object to inject.
public let object: T
/// Creates a new object environment modifier.
///
/// - Parameters:
/// - content: The child view tree.
/// - object: The observable object to make available.
public init(content: Content, object: T) {
self.content = content
self.object = object
}
/// Not used during rendering. ``Renderable`` conformance takes priority.
public var body: some View {
content
}
}
// MARK: - Renderable
extension ObjectEnvironmentModifier: Renderable {
public func renderToBuffer(context: RenderContext) -> FrameBuffer {
var modifiedEnvironment = context.environment
modifiedEnvironment[observable: T.self] = object
let modifiedContext = context.withEnvironment(modifiedEnvironment)
return TUIkitView.renderToBuffer(content, context: modifiedContext)
}
}