From d8b0299362d8034ec1433c80e4ed2ffbf45f22a4 Mon Sep 17 00:00:00 2001 From: Kyle Date: Mon, 14 Sep 2026 00:26:46 +0800 Subject: [PATCH] feat(event): implement SizeGesture --- .../Event/Gesture/GestureInputs.swift | 9 ++++ .../Event/Gesture/SizeGesture.swift | 44 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 Sources/OpenSwiftUICore/Event/Gesture/SizeGesture.swift diff --git a/Sources/OpenSwiftUICore/Event/Gesture/GestureInputs.swift b/Sources/OpenSwiftUICore/Event/Gesture/GestureInputs.swift index 014fa5097..b79929da7 100644 --- a/Sources/OpenSwiftUICore/Event/Gesture/GestureInputs.swift +++ b/Sources/OpenSwiftUICore/Event/Gesture/GestureInputs.swift @@ -83,6 +83,15 @@ public struct _GestureInputs { } } + package var size: Attribute { + let defaultSize = intern(ViewSize.zero, id: .defaultValue) + return viewSubgraph.apply { + var size = IndirectAttribute(source: defaultSize) + size.source = viewInputs.size + return size.projectedValue + } + } + package var transform: Attribute { let defaultTransform = intern(ViewTransform(), id: .defaultValue) return viewSubgraph.apply { diff --git a/Sources/OpenSwiftUICore/Event/Gesture/SizeGesture.swift b/Sources/OpenSwiftUICore/Event/Gesture/SizeGesture.swift new file mode 100644 index 000000000..778365a98 --- /dev/null +++ b/Sources/OpenSwiftUICore/Event/Gesture/SizeGesture.swift @@ -0,0 +1,44 @@ +// +// SizeGesture.swift +// OpenSwiftUICore +// +// Audited for 6.5.4 +// Status: Complete +// ID: 1E238A2DD9F0A69154D5FC25E0CF7514 (SwiftUICore) + +package import Foundation +import OpenAttributeGraphShims + +// MARK: - SizeGesture + +package struct SizeGesture: PrimitiveGesture where Content: Gesture { + package typealias Value = Content.Value + + package var content: (CGSize) -> Content + + package init(_ content: @escaping (CGSize) -> Content) { + self.content = content + } + + package static func _makeGesture( + gesture: _GraphValue>, + inputs: _GestureInputs + ) -> _GestureOutputs { + let child = _GraphValue(SizeGestureChild( + gesture: gesture.value, + size: inputs.size + )) + return Content._makeGesture(gesture: child, inputs: inputs) + } +} + +// MARK: - SizeGestureChild + +private struct SizeGestureChild: Rule where Content: Gesture { + @Attribute var gesture: SizeGesture + @Attribute var size: ViewSize + + var value: Content { + gesture.content(size.value) + } +}