From fbbf214bdbfd295dbb7181eac100032755020c3b Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 29 Jun 2025 14:39:24 +0800 Subject: [PATCH 1/2] Update GestureInputs --- .../Data/Preference/PreferencesInputs.swift | 23 ++++------ .../Data/Preference/View_Indirect.swift | 2 +- .../Event/Gesture/Gesture.swift | 42 +++++++++++++++---- .../Event/Responder/ResponderNode.swift | 2 +- 4 files changed, 44 insertions(+), 25 deletions(-) diff --git a/Sources/OpenSwiftUICore/Data/Preference/PreferencesInputs.swift b/Sources/OpenSwiftUICore/Data/Preference/PreferencesInputs.swift index 4708b996a..3db33e40c 100644 --- a/Sources/OpenSwiftUICore/Data/Preference/PreferencesInputs.swift +++ b/Sources/OpenSwiftUICore/Data/Preference/PreferencesInputs.swift @@ -42,23 +42,14 @@ package struct PreferencesInputs { } package func makeIndirectOutputs() -> PreferencesOutputs { - struct AddPreference: PreferenceKeyVisitor { - var outputs: PreferencesOutputs - - mutating func visit(key: K.Type) where K: PreferenceKey { - let source = ViewGraph.current.intern(K.defaultValue, for: K.self, id: .preferenceKeyDefault) - - @IndirectAttribute(source: source) - var indirect: K.Value - - outputs.appendPreference(key: K.self, value: $indirect) - } - } - - var visitor = AddPreference(outputs: PreferencesOutputs()) + var outputs = PreferencesOutputs() for key in keys { - key.visitKey(&visitor) + func project(_ key: K.Type) where K: PreferenceKey { + let source = ViewGraph.current.intern(key.defaultValue, id: .preferenceKeyDefault) + outputs.appendPreference(key: key, value: IndirectAttribute(source: source).projectedValue) + } + project(key) } - return visitor.outputs + return outputs } } diff --git a/Sources/OpenSwiftUICore/Data/Preference/View_Indirect.swift b/Sources/OpenSwiftUICore/Data/Preference/View_Indirect.swift index 9ae4eb759..b1229e0d6 100644 --- a/Sources/OpenSwiftUICore/Data/Preference/View_Indirect.swift +++ b/Sources/OpenSwiftUICore/Data/Preference/View_Indirect.swift @@ -12,7 +12,7 @@ import OpenGraphShims #endif extension _ViewInputs { - func makeIndirectOutputs() -> _ViewOutputs { + package func makeIndirectOutputs() -> _ViewOutputs { let indirectPreferenceOutputs = preferences.makeIndirectOutputs() var outputs = _ViewOutputs() outputs.preferences = indirectPreferenceOutputs diff --git a/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift b/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift index 1ec5e76b9..0ba8481c1 100644 --- a/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift +++ b/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift @@ -104,7 +104,7 @@ extension Gesture where Value == Body.Value { } } -// MARK: - GestureInputs [6.5.4] [WIP] +// MARK: - GestureInputs [6.5.4] /// Input (aka inherited) attributes for gesture objects. @available(OpenSwiftUI_v1_0, *) @@ -120,6 +120,7 @@ public struct _GestureInputs { package var resetSeed: Attribute @_spi(ForOpenSwiftUIOnly) + @available(OpenSwiftUI_v6_0, *) public struct InheritedPhase: OptionSet, Defaultable { public let rawValue: Int @@ -137,7 +138,7 @@ public struct _GestureInputs { package var inheritedPhase: Attribute<_GestureInputs.InheritedPhase> package var failedPhase: Attribute> { - get { preconditionFailure("TODO") } + intern(.failed, id: .failedValue) } package var options: _GestureInputs.Options @@ -153,15 +154,24 @@ public struct _GestureInputs { inheritedPhase: Attribute<_GestureInputs.InheritedPhase>, gesturePreferenceKeys: Attribute ) { - - preconditionFailure("TODO") + self.viewInputs = inputs + self.viewInputs.time = time + self.viewSubgraph = viewSubgraph + self.preferences = .init(hostKeys: gesturePreferenceKeys) + self.events = events + self.resetSeed = resetSeed + self.inheritedPhase = inheritedPhase + self.options = [] + self.platformInputs = .init() } package mutating func mergeViewInputs( _ other: _ViewInputs, viewSubgraph: Subgraph ) { - preconditionFailure("TODO") + self.viewInputs = other + self.viewInputs.copyCaches() + self.viewSubgraph = viewSubgraph } package func animatedPosition() -> Attribute { @@ -178,11 +188,29 @@ public struct _GestureInputs { } package func makeIndirectOutputs() -> _GestureOutputs { - preconditionFailure("TODO") + let phase: Attribute> = intern(.defaultValue, id: .defaultValue) + var outputs = _GestureOutputs(phase: IndirectAttribute(source: phase).projectedValue) + if options.contains(.includeDebugOutput) { + let debugData: Attribute = intern(.defaultValue, id: .defaultValue) + outputs.debugData = IndirectAttribute(source: debugData).projectedValue + } + outputs.preferences = preferences.makeIndirectOutputs() + return outputs } package func makeDefaultOutputs() -> _GestureOutputs { - preconditionFailure("TODO") + let phase = Attribute(DefaultRule>()) + var outputs = _GestureOutputs(phase: phase) + if options.contains(.includeDebugOutput) { + let debugData = Attribute(DefaultRule()) + outputs.debugData = debugData + } + outputs.preferences = preferences.makeIndirectOutputs() + return outputs + } + + package mutating func copyCaches() { + viewInputs.copyCaches() } } diff --git a/Sources/OpenSwiftUICore/Event/Responder/ResponderNode.swift b/Sources/OpenSwiftUICore/Event/Responder/ResponderNode.swift index 0bad20fcb..be0d5f187 100644 --- a/Sources/OpenSwiftUICore/Event/Responder/ResponderNode.swift +++ b/Sources/OpenSwiftUICore/Event/Responder/ResponderNode.swift @@ -25,7 +25,7 @@ open class ResponderNode { } open func makeGesture(inputs: _GestureInputs) -> _GestureOutputs { - _GestureOutputs(phase: inputs.intern(.failed, id: .failedValue)) + _GestureOutputs(phase: inputs.failedPhase) } open func resetGesture() {} From e8921759fe7eead86b32f184dbf671c2021507cc Mon Sep 17 00:00:00 2001 From: Kyle Date: Sun, 29 Jun 2025 14:46:37 +0800 Subject: [PATCH 2/2] Split Gesture file into separate files --- .../Event/Gesture/Gesture.swift | 302 +----------------- .../Event/Gesture/GestureCategory.swift | 43 +++ .../Event/Gesture/GestureDescriptor.swift | 27 ++ .../Event/Gesture/GestureInputs.swift | 159 +++++++++ .../Event/Gesture/GestureOutputs.swift | 90 ++++++ .../Event/Gesture/PlatformGestureInputs.swift | 9 + 6 files changed, 329 insertions(+), 301 deletions(-) create mode 100644 Sources/OpenSwiftUICore/Event/Gesture/GestureCategory.swift create mode 100644 Sources/OpenSwiftUICore/Event/Gesture/GestureDescriptor.swift create mode 100644 Sources/OpenSwiftUICore/Event/Gesture/GestureInputs.swift create mode 100644 Sources/OpenSwiftUICore/Event/Gesture/GestureOutputs.swift create mode 100644 Sources/OpenSwiftUICore/Event/Gesture/PlatformGestureInputs.swift diff --git a/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift b/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift index 0ba8481c1..f23bed73c 100644 --- a/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift +++ b/Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift @@ -2,12 +2,9 @@ // Gesture.swift // OpenSwiftUICore // -// Status: WIP +// Status: Complete // ID: 5DF390A778F4D193C5F92C06542566B0 (SwiftUICore) -package import OpenGraphShims -import OpenSwiftUI_SPI - // MARK: - Gesture [6.5.4] /// An instance that matches a sequence of events to a gesture, and returns a @@ -103,300 +100,3 @@ extension Gesture where Value == Body.Value { return Body.makeDebuggableGesture(gesture: body, inputs: inputs) } } - -// MARK: - GestureInputs [6.5.4] - -/// Input (aka inherited) attributes for gesture objects. -@available(OpenSwiftUI_v1_0, *) -public struct _GestureInputs { - package var viewInputs: _ViewInputs - - package var viewSubgraph: Subgraph - - package var preferences: PreferencesInputs - - package var events: Attribute<[EventID : any EventType]> - - package var resetSeed: Attribute - - @_spi(ForOpenSwiftUIOnly) - @available(OpenSwiftUI_v6_0, *) - public struct InheritedPhase: OptionSet, Defaultable { - public let rawValue: Int - - public init(rawValue: Int) { - self.rawValue = rawValue - } - - package static let failed: _GestureInputs.InheritedPhase = .init(rawValue: 1 << 0) - - package static let active: _GestureInputs.InheritedPhase = .init(rawValue: 1 << 1) - - package static let defaultValue: _GestureInputs.InheritedPhase = .failed - } - - package var inheritedPhase: Attribute<_GestureInputs.InheritedPhase> - - package var failedPhase: Attribute> { - intern(.failed, id: .failedValue) - } - - package var options: _GestureInputs.Options - - package var platformInputs: PlatformGestureInputs - - package init( - _ inputs: _ViewInputs, - viewSubgraph: Subgraph, - events: Attribute<[EventID : any EventType]>, - time: Attribute