From 58bd0b1429ae5313b52bba8c942f4dff003fa297 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 29 Jun 2025 13:58:24 +0800 Subject: [PATCH 1/2] Implement DefaultRule for Defaultable types --- .../OpenGraph/OpenGraphAdditions.swift | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/Sources/OpenSwiftUICore/OpenGraph/OpenGraphAdditions.swift b/Sources/OpenSwiftUICore/OpenGraph/OpenGraphAdditions.swift index 2fd41a9d0..8ee19e6c0 100644 --- a/Sources/OpenSwiftUICore/OpenGraph/OpenGraphAdditions.swift +++ b/Sources/OpenSwiftUICore/OpenGraph/OpenGraphAdditions.swift @@ -44,23 +44,21 @@ extension AsyncAttribute { package static var flags: Flags { [] } } -// MARK: - DefaultRule [WIP] +// MARK: - DefaultRule [6.5.4] package struct DefaultRule: Rule, AsyncAttribute, CustomStringConvertible where T: Defaultable { - package init() { - preconditionFailure("TODO") - } + @WeakAttribute var weakValue: T.Value? - package static var initialValue: T.Value? { - get { preconditionFailure("TODO") } - } + package init() {} + + package static var initialValue: T.Value? { T.defaultValue } package var value: T.Value { - get { preconditionFailure("TODO") } + weakValue ?? T.defaultValue } package var description: String { - get { preconditionFailure("TODO") } + "∨ \(T.Value.self)" } package typealias Value = T.Value @@ -71,7 +69,12 @@ extension Attribute { _ value: Attribute?, type: T.Type ) where Value == T.Value, T: Defaultable { - preconditionFailure("TODO") + mutateBody( + as: DefaultRule.self, + invalidating: true + ) { defaultRule in + defaultRule.$weakValue = value + } } package func invalidateValueIfNeeded() -> Bool { From adbdb444f4389aa606fe6965aae926b5ec274040 Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 29 Jun 2025 13:29:46 +0800 Subject: [PATCH 2/2] Update _GestureOutputs implementation --- .../Data/Preference/View_Indirect.swift | 11 ++-- .../Event/Gesture/Gesture.swift | 53 +++++++++++++------ .../View/Input/ViewOutputs.swift | 2 +- 3 files changed, 46 insertions(+), 20 deletions(-) diff --git a/Sources/OpenSwiftUICore/Data/Preference/View_Indirect.swift b/Sources/OpenSwiftUICore/Data/Preference/View_Indirect.swift index dc0caf799..9ae4eb759 100644 --- a/Sources/OpenSwiftUICore/Data/Preference/View_Indirect.swift +++ b/Sources/OpenSwiftUICore/Data/Preference/View_Indirect.swift @@ -30,8 +30,8 @@ extension _ViewInputs { extension _ViewOutputs { package func setIndirectDependency(_ dependency: AnyAttribute?) { preferences.setIndirectDependency(dependency) - if let target = layoutComputer?.identifier { - target.indirectDependency = dependency + if let layoutComputer { + layoutComputer.identifier.indirectDependency = dependency } } @@ -41,12 +41,15 @@ extension _ViewOutputs { let source = childOutputs.layoutComputer?.identifier { target.source = source } + if let layoutComputer, let childLayoutComputer = childOutputs.layoutComputer { + layoutComputer.identifier.source = childLayoutComputer.identifier + } } package func detachIndirectOutputs() { preferences.detachIndirectOutputs() - if let target = layoutComputer?.identifier { - target.source = .nil + if let layoutComputer { + layoutComputer.identifier.source = .nil } } } diff --git a/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift b/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift index 424a3d29f..1ec5e76b9 100644 --- a/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift +++ b/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift @@ -228,63 +228,86 @@ extension _GestureInputs: Sendable {} @available(*, unavailable) extension _GestureInputs.InheritedPhase: Sendable {} -// MARK: - GestureOutputs [6.5.4] [WIP] +// MARK: - GestureOutputs [6.5.4] /// Output (aka synthesized) attributes for gesture objects. @available(OpenSwiftUI_v1_0, *) public struct _GestureOutputs { package var phase: Attribute> + private var _debugData: OptionalAttribute + package var preferences: PreferencesOutputs package var debugData: Attribute? { - get { preconditionFailure("TODO") } - set { preconditionFailure("TODO") } + get { _debugData.attribute } + set { _debugData.attribute = newValue } } package init(phase: Attribute>) { - preconditionFailure("TODO") + self.phase = phase + self._debugData = .init() + self.preferences = .init() } package func withPhase(_ phase: Attribute>) -> _GestureOutputs { - preconditionFailure("TODO") + var outputs = _GestureOutputs(phase: phase) + outputs._debugData = _debugData + outputs.preferences = preferences + return outputs } package func overrideDefaultValues(_ childOutputs: _GestureOutputs) { - preconditionFailure("TODO") + phase.overrideDefaultValue(childOutputs.phase, type: GesturePhase.self) + if let debugData, let childDebugData = childOutputs.debugData { + debugData.overrideDefaultValue(childDebugData, type: GestureDebug.Data.self) + } + preferences.attachIndirectOutputs(to: childOutputs.preferences) } package func setIndirectDependency(_ dependency: AnyAttribute?) { - preconditionFailure("TODO") + phase.identifier.indirectDependency = dependency + if let debugData { + debugData.identifier.indirectDependency = dependency + } + preferences.setIndirectDependency(dependency) } package func attachIndirectOutputs(_ childOutputs: _GestureOutputs) { - preconditionFailure("TODO") + phase.identifier.source = childOutputs.phase.identifier + if let debugData, let childDebugData = childOutputs.debugData { + debugData.identifier.source = childDebugData.identifier + } + preferences.attachIndirectOutputs(to: childOutputs.preferences) } package func detachIndirectOutputs() { - preconditionFailure("TODO") + phase.identifier.source = .nil + if let debugData { + debugData.identifier.source = .nil + } + preferences.detachIndirectOutputs() } package subscript(anyKey key: any PreferenceKey.Type) -> AnyAttribute? { - get { preconditionFailure("TODO") } - set { preconditionFailure("TODO") } + get { preferences[anyKey: key] } + set { preferences[anyKey: key] = newValue } } package subscript(key: K.Type) -> Attribute? where K: PreferenceKey { - get { preconditionFailure("TODO") } - set { preconditionFailure("TODO") } + get { preferences[key] } + set { preferences[key] = newValue } } package mutating func appendPreference( key: K.Type, value: Attribute ) where K: PreferenceKey { - preconditionFailure("TODO") + preferences.appendPreference(key: key, value: value) } package func forEachPreference(_ body: (any PreferenceKey.Type, AnyAttribute) -> Void) { - preconditionFailure("TODO") + preferences.forEachPreference(body) } } diff --git a/Sources/OpenSwiftUICore/View/Input/ViewOutputs.swift b/Sources/OpenSwiftUICore/View/Input/ViewOutputs.swift index 999a58b14..38113a193 100644 --- a/Sources/OpenSwiftUICore/View/Input/ViewOutputs.swift +++ b/Sources/OpenSwiftUICore/View/Input/ViewOutputs.swift @@ -18,7 +18,7 @@ public struct _ViewOutputs { _layoutComputer.attribute } set { - _layoutComputer = OptionalAttribute(newValue) + _layoutComputer.attribute = newValue preferences.debugProperties.insert(.layoutComputer) } }