1
1
//
2
2
// ViewTrait.swift
3
- // OpenSwiftUI
3
+ // OpenSwiftUICore
4
4
//
5
5
// Audited for iOS 18.0
6
- // Status: Blocked by ViewList
6
+ // Status: Complete
7
7
// ID: 9929B476764059557433A108298EE66F (SwiftUI)
8
8
// ID: 48526BA25CDCBF890FA91D018A5421B4 (SwiftUICore)
9
9
10
- // TODO: Update path and fix the ViewList issue and the TODO
11
-
12
10
import OpenGraphShims
13
11
14
12
// MARK: - ViewTraitKey
@@ -23,11 +21,11 @@ public protocol _ViewTraitKey {
23
21
static var defaultValue : Value { get }
24
22
}
25
23
26
- // MARK: - _TraitWritingModifier [TODO]
24
+ // MARK: - _TraitWritingModifier
27
25
28
26
/// A view content adapter that associates a trait with its base content.
29
27
@frozen
30
- public struct _TraitWritingModifier < Trait> : PrimitiveViewModifier where Trait : _ViewTraitKey {
28
+ public struct _TraitWritingModifier < Trait> : PrimitiveViewModifier where Trait: _ViewTraitKey {
31
29
public let value : Trait . Value
32
30
33
31
@inlinable
@@ -40,23 +38,47 @@ public struct _TraitWritingModifier<Trait>: PrimitiveViewModifier where Trait :
40
38
inputs: _ViewInputs ,
41
39
body: @escaping ( _Graph , _ViewInputs ) -> _ViewOutputs
42
40
) -> _ViewOutputs {
43
- preconditionFailure ( " TODO " )
41
+ if Trait . self == LayoutPriorityTraitKey . self {
42
+ LayoutPriorityLayout . makeViewImpl (
43
+ modifier: modifier. unsafeCast ( ) ,
44
+ inputs: inputs,
45
+ body: body
46
+ )
47
+ } else {
48
+ body ( _Graph ( ) , inputs)
49
+ }
44
50
}
51
+
45
52
nonisolated public static func _makeViewList(
46
53
modifier: _GraphValue < Self > ,
47
54
inputs: _ViewListInputs ,
48
55
body: @escaping ( _Graph , _ViewListInputs ) -> _ViewListOutputs
49
56
) -> _ViewListOutputs {
50
- preconditionFailure ( " TODO " )
51
- }
52
-
53
- nonisolated public static func _viewListCount( inputs: _ViewListCountInputs , body: ( _ViewListCountInputs ) -> Int ? ) -> Int ? {
54
- preconditionFailure ( " TODO " )
57
+ var inputs = inputs
58
+ if Trait . self == LayoutPriorityTraitKey . self,
59
+ !inputs. options. contains ( . layoutPriorityIsTrait) {
60
+ let attribute = modifier. value. unsafeBitCast ( to: _TraitWritingModifier< LayoutPriorityTraitKey> . self )
61
+ var outputs = body ( _Graph ( ) , inputs)
62
+ outputs. multiModifier ( _GraphValue ( attribute) , inputs: inputs)
63
+ return outputs
64
+ } else {
65
+ let addTrait = AddTrait ( modifier: modifier. value, traits: OptionalAttribute ( inputs. traits) )
66
+ let attribute = Attribute ( addTrait)
67
+ inputs. addTraitKey ( Trait . self)
68
+ inputs. traits = attribute
69
+ return body ( _Graph ( ) , inputs)
70
+ }
55
71
}
56
72
57
- private struct AddTrait {
73
+ private struct AddTrait : Rule {
58
74
@Attribute var modifier : _TraitWritingModifier
59
75
@OptionalAttribute var traits : ViewTraitCollection ?
76
+
77
+ var value : ViewTraitCollection {
78
+ var traits = traits ?? ViewTraitCollection ( )
79
+ traits [ Trait . self] = modifier. value
80
+ return traits
81
+ }
60
82
}
61
83
}
62
84
@@ -67,16 +89,17 @@ extension View {
67
89
/// Associate a trait `value` for the given `key` for this view content.
68
90
@inlinable
69
91
nonisolated public func _trait< K> ( _ key: K . Type , _ value: K . Value ) -> some View where K: _ViewTraitKey {
70
- return modifier ( _TraitWritingModifier < K > ( value: value) )
92
+ modifier ( _TraitWritingModifier < K > ( value: value) )
71
93
}
72
94
}
73
95
74
- // MARK: - _ConditionalTraitWritingModifier [TODO]
96
+ // MARK: - _ConditionalTraitWritingModifier
75
97
76
98
/// Conditionally writes a trait.
77
99
@frozen
78
100
public struct _ConditionalTraitWritingModifier < Trait> : PrimitiveViewModifier where Trait : _ViewTraitKey {
79
101
public var value : Trait . Value
102
+
80
103
public var isEnabled : Bool
81
104
82
105
@_alwaysEmitIntoClient
@@ -90,26 +113,56 @@ public struct _ConditionalTraitWritingModifier<Trait>: PrimitiveViewModifier whe
90
113
inputs: _ViewInputs ,
91
114
body: @escaping ( _Graph , _ViewInputs ) -> _ViewOutputs
92
115
) -> _ViewOutputs {
93
- preconditionFailure ( " TODO " )
116
+ _TraitWritingModifier< Trait> . _makeView(
117
+ modifier: _GraphValue ( . init( identifier: . nil ) ) ,
118
+ inputs: inputs,
119
+ body: body
120
+ )
94
121
}
122
+
95
123
nonisolated public static func _makeViewList(
96
124
modifier: _GraphValue < Self > ,
97
125
inputs: _ViewListInputs ,
98
126
body: @escaping ( _Graph , _ViewListInputs ) -> _ViewListOutputs
99
127
) -> _ViewListOutputs {
100
- preconditionFailure ( " TODO " )
128
+ var inputs = inputs
129
+ if Trait . self == LayoutPriorityTraitKey . self,
130
+ !inputs. options. contains ( . layoutPriorityIsTrait) {
131
+ let attribute = modifier. value. unsafeBitCast ( to: _TraitWritingModifier< LayoutPriorityTraitKey> . self )
132
+ var outputs = body ( _Graph ( ) , inputs)
133
+ outputs. multiModifier ( _GraphValue ( attribute) , inputs: inputs)
134
+ return outputs
135
+ } else {
136
+ let addTrait = ConditionalAddTrait ( modifier: modifier. value, traits: OptionalAttribute ( inputs. traits) )
137
+ let attribute = Attribute ( addTrait)
138
+ inputs. addTraitKey ( Trait . self)
139
+ inputs. traits = attribute
140
+ return body ( _Graph ( ) , inputs)
141
+ }
101
142
}
102
143
103
- nonisolated public static func _viewListCount( inputs: _ViewListCountInputs , body: ( _ViewListCountInputs ) -> Int ? ) -> Int ? {
104
- preconditionFailure ( " TODO " )
144
+ private struct ConditionalAddTrait : Rule {
145
+ @Attribute var modifier : _ConditionalTraitWritingModifier
146
+ @OptionalAttribute var traits : ViewTraitCollection ?
147
+
148
+ var value : ViewTraitCollection {
149
+ var traits = traits ?? ViewTraitCollection ( )
150
+ if modifier. isEnabled {
151
+ traits [ Trait . self] = modifier. value
152
+ }
153
+ return traits
154
+ }
105
155
}
106
156
}
107
157
108
158
@available ( * , unavailable)
109
159
extension _ConditionalTraitWritingModifier : Sendable { }
110
160
111
161
extension View {
162
+ /// Conditionally writes a trait.
112
163
@_alwaysEmitIntoClient
164
+ @MainActor
165
+ @preconcurrency
113
166
public func _trait< K> ( _ key: K . Type = K . self, _ value: K . Value , isEnabled: Bool ) -> some View where K: _ViewTraitKey {
114
167
modifier ( _ConditionalTraitWritingModifier < K > (
115
168
value: value,
@@ -118,15 +171,49 @@ extension View {
118
171
}
119
172
}
120
173
121
- // MARK: - TraitTransformerModifier [TODO]
174
+ // MARK: - TraitTransformerModifier
122
175
123
- struct TraitTransformerModifier {
124
-
176
+ struct TraitTransformerModifier < Trait> : PrimitiveViewModifier where Trait: _ViewTraitKey {
177
+ var transform : ( inout Trait . Value ) -> Void
178
+
179
+ nonisolated public static func _makeView(
180
+ modifier: _GraphValue < Self > ,
181
+ inputs: _ViewInputs ,
182
+ body: @escaping ( _Graph , _ViewInputs ) -> _ViewOutputs
183
+ ) -> _ViewOutputs {
184
+ body ( _Graph ( ) , inputs)
185
+ }
186
+
187
+ nonisolated public static func _makeViewList(
188
+ modifier: _GraphValue < Self > ,
189
+ inputs: _ViewListInputs ,
190
+ body: @escaping ( _Graph , _ViewListInputs ) -> _ViewListOutputs
191
+ ) -> _ViewListOutputs {
192
+ var inputs = inputs
193
+ let trait = TransformTrait ( modifier: modifier. value, traits: OptionalAttribute ( inputs. traits) )
194
+ let attribute = Attribute ( trait)
195
+ inputs. traits = attribute
196
+ return body ( _Graph ( ) , inputs)
197
+ }
198
+
199
+ private struct TransformTrait : Rule {
200
+ @Attribute var modifier : TraitTransformerModifier
201
+ @OptionalAttribute var traits : ViewTraitCollection ?
202
+
203
+ var value : ViewTraitCollection {
204
+ var traits = traits ?? ViewTraitCollection ( )
205
+ let transform = modifier. transform
206
+ var value = traits. value ( for: Trait . self)
207
+ transform ( & value)
208
+ traits [ Trait . self] = value
209
+ return traits
210
+ }
211
+ }
125
212
}
126
213
127
214
extension View {
128
215
package func transformTrait< K> ( _ key: K . Type = K . self, transform: @escaping ( inout K . Value ) -> Void ) -> some View where K: _ViewTraitKey {
129
- preconditionFailure ( " TODO " )
216
+ modifier ( TraitTransformerModifier < K > ( transform : transform ) )
130
217
}
131
218
}
132
219
0 commit comments