Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 7 additions & 16 deletions Sources/OpenSwiftUICore/Data/Preference/PreferencesInputs.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,23 +42,14 @@ package struct PreferencesInputs {
}

package func makeIndirectOutputs() -> PreferencesOutputs {
struct AddPreference: PreferenceKeyVisitor {
var outputs: PreferencesOutputs

mutating func visit<K>(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<K>(_ 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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
274 changes: 1 addition & 273 deletions Sources/OpenSwiftUICore/Event/Gesture/Gesture.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -103,272 +100,3 @@ extension Gesture where Value == Body.Value {
return Body.makeDebuggableGesture(gesture: body, inputs: inputs)
}
}

// MARK: - GestureInputs [6.5.4] [WIP]

/// 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<UInt32>

@_spi(ForOpenSwiftUIOnly)
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<GesturePhase<Void>> {
get { preconditionFailure("TODO") }
}

package var options: _GestureInputs.Options

package var platformInputs: PlatformGestureInputs

package init(
_ inputs: _ViewInputs,
viewSubgraph: Subgraph,
events: Attribute<[EventID : any EventType]>,
time: Attribute<Time>,
resetSeed: Attribute<UInt32>,
inheritedPhase: Attribute<_GestureInputs.InheritedPhase>,
gesturePreferenceKeys: Attribute<PreferenceKeys>
) {

preconditionFailure("TODO")
}

package mutating func mergeViewInputs(
_ other: _ViewInputs,
viewSubgraph: Subgraph
) {
preconditionFailure("TODO")
}

package func animatedPosition() -> Attribute<ViewOrigin> {
viewSubgraph.apply {
viewInputs.animatedPosition()
}
}

package func intern<T>(
_ value: T,
id: GraphHost.ConstantID
) -> Attribute<T> {
GraphHost.currentHost.intern(value, id: id)
}

package func makeIndirectOutputs<Value>() -> _GestureOutputs<Value> {
preconditionFailure("TODO")
}

package func makeDefaultOutputs<Value>() -> _GestureOutputs<Value> {
preconditionFailure("TODO")
}
}

extension _GestureInputs {
package struct Options: OptionSet {
package let rawValue: UInt32

@inlinable
package init(rawValue: UInt32) {
self.rawValue = rawValue
}

@inlinable
package static var preconvertedEventLocations: _GestureInputs.Options {
.init(rawValue: 1 << 0)
}

@inlinable
package static var allowsIncompleteEventSequences: _GestureInputs.Options {
.init(rawValue: 1 << 1)
}

@inlinable
package static var skipCombiners: _GestureInputs.Options {
.init(rawValue: 1 << 2)
}

@inlinable
package static var includeDebugOutput: _GestureInputs.Options {
.init(rawValue: 1 << 3)
}

@inlinable
package static var gestureGraph: _GestureInputs.Options {
.init(rawValue: 1 << 4)
}
}
}

@available(*, unavailable)
extension _GestureInputs: Sendable {}

@available(*, unavailable)
extension _GestureInputs.InheritedPhase: Sendable {}

// MARK: - GestureOutputs [6.5.4]

/// Output (aka synthesized) attributes for gesture objects.
@available(OpenSwiftUI_v1_0, *)
public struct _GestureOutputs<Value> {
package var phase: Attribute<GesturePhase<Value>>

private var _debugData: OptionalAttribute<GestureDebug.Data>

package var preferences: PreferencesOutputs

package var debugData: Attribute<GestureDebug.Data>? {
get { _debugData.attribute }
set { _debugData.attribute = newValue }
}

package init(phase: Attribute<GesturePhase<Value>>) {
self.phase = phase
self._debugData = .init()
self.preferences = .init()
}

package func withPhase<T>(_ phase: Attribute<GesturePhase<T>>) -> _GestureOutputs<T> {
var outputs = _GestureOutputs<T>(phase: phase)
outputs._debugData = _debugData
outputs.preferences = preferences
return outputs
}

package func overrideDefaultValues(_ childOutputs: _GestureOutputs<Value>) {
phase.overrideDefaultValue(childOutputs.phase, type: GesturePhase<Value>.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?) {
phase.identifier.indirectDependency = dependency
if let debugData {
debugData.identifier.indirectDependency = dependency
}
preferences.setIndirectDependency(dependency)
}

package func attachIndirectOutputs(_ childOutputs: _GestureOutputs<Value>) {
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() {
phase.identifier.source = .nil
if let debugData {
debugData.identifier.source = .nil
}
preferences.detachIndirectOutputs()
}

package subscript(anyKey key: any PreferenceKey.Type) -> AnyAttribute? {
get { preferences[anyKey: key] }
set { preferences[anyKey: key] = newValue }
}

package subscript<K>(key: K.Type) -> Attribute<K.Value>? where K: PreferenceKey {
get { preferences[key] }
set { preferences[key] = newValue }
}

package mutating func appendPreference<K>(
key: K.Type,
value: Attribute<K.Value>
) where K: PreferenceKey {
preferences.appendPreference(key: key, value: value)
}

package func forEachPreference(_ body: (any PreferenceKey.Type, AnyAttribute) -> Void) {
preferences.forEachPreference(body)
}
}

// MARK: - GestureCategory [6.5.4]

@_spi(ForOpenSwiftUIOnly)
@available(OpenSwiftUI_v6_0, *)
public struct GestureCategory: OptionSet {
public let rawValue: Int

public init(rawValue: Int) {
self.rawValue = rawValue
}

package static let magnify: GestureCategory = .init(rawValue: 1 << 0)

package static let rotate: GestureCategory = .init(rawValue: 1 << 1)

package static let drag: GestureCategory = .init(rawValue: 1 << 2)

package static let select: GestureCategory = .init(rawValue: 1 << 3)

package static let longPress: GestureCategory = .init(rawValue: 1 << 4)

package struct Key: PreferenceKey {
package static let _includesRemovedValues: Bool = true

package static let defaultValue: GestureCategory = .defaultValue

package static func reduce(
value: inout GestureCategory.Key.Value,
nextValue: () -> GestureCategory.Key.Value
) {
value = GestureCategory(rawValue: value.rawValue | nextValue().rawValue)
}
}
}

@available(*, unavailable)
extension GestureCategory: Sendable {}

// MARK: - GestureDescriptor [6.5.4]

package struct GestureDescriptor: TupleDescriptor {
package static var typeCache: [ObjectIdentifier: TupleTypeDescription<GestureDescriptor>] = [:]

package static var descriptor: UnsafeRawPointer {
_OpenSwiftUI_gestureProtocolDescriptor()
}
}

// MARK: - GestureModifierDescriptor [6.5.4]

package struct GestureModifierDescriptor: TupleDescriptor {
package static var typeCache: [ObjectIdentifier: TupleTypeDescription<GestureModifierDescriptor>] = [:]

package static var descriptor: UnsafeRawPointer {
_OpenSwiftUI_gestureModifierProtocolDescriptor()
}
}

// MARK: - PlatformGestureInputs [6.5.4]

package struct PlatformGestureInputs {}
43 changes: 43 additions & 0 deletions Sources/OpenSwiftUICore/Event/Gesture/GestureCategory.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
//
// GestureCategory.swift
// OpenSwiftUICore
//
// Status: Complete

// MARK: - GestureCategory [6.5.4]

@_spi(ForOpenSwiftUIOnly)
@available(OpenSwiftUI_v6_0, *)
public struct GestureCategory: OptionSet {
public let rawValue: Int

public init(rawValue: Int) {
self.rawValue = rawValue
}

package static let magnify: GestureCategory = .init(rawValue: 1 << 0)

package static let rotate: GestureCategory = .init(rawValue: 1 << 1)

package static let drag: GestureCategory = .init(rawValue: 1 << 2)

package static let select: GestureCategory = .init(rawValue: 1 << 3)

package static let longPress: GestureCategory = .init(rawValue: 1 << 4)

package struct Key: PreferenceKey {
package static let _includesRemovedValues: Bool = true

package static let defaultValue: GestureCategory = .defaultValue

package static func reduce(
value: inout GestureCategory.Key.Value,
nextValue: () -> GestureCategory.Key.Value
) {
value = GestureCategory(rawValue: value.rawValue | nextValue().rawValue)
}
}
}

@available(*, unavailable)
extension GestureCategory: Sendable {}
27 changes: 27 additions & 0 deletions Sources/OpenSwiftUICore/Event/Gesture/GestureDescriptor.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// GestureDescriptor.swift
// OpenSwiftUICore
//
// Status: Complete

import OpenSwiftUI_SPI

// MARK: - GestureDescriptor [6.5.4]

package struct GestureDescriptor: TupleDescriptor {
package static var typeCache: [ObjectIdentifier: TupleTypeDescription<GestureDescriptor>] = [:]

package static var descriptor: UnsafeRawPointer {
_OpenSwiftUI_gestureProtocolDescriptor()
}
}

// MARK: - GestureModifierDescriptor [6.5.4]

package struct GestureModifierDescriptor: TupleDescriptor {
package static var typeCache: [ObjectIdentifier: TupleTypeDescription<GestureModifierDescriptor>] = [:]

package static var descriptor: UnsafeRawPointer {
_OpenSwiftUI_gestureModifierProtocolDescriptor()
}
}
Loading