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
4 changes: 2 additions & 2 deletions Package.resolved

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -684,7 +684,8 @@ extension _UIHostingView: ViewRendererHost {
}

package func rootTransform() -> ViewTransform {
preconditionFailure("TODO")
openSwiftUIUnimplementedWarning()
return ViewTransform()
}

public func preferencesDidChange() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

package import OpenGraphShims

// MARK: - PreferenceTransformModifier [6.4.41] [WIP]
// MARK: - PreferenceTransformModifier [6.4.41]

@available(OpenSwiftUI_v1_0, *)
@frozen
Expand Down Expand Up @@ -52,29 +52,114 @@ extension View {
}
}

// MARK: - PreferencesOutputs + makePreferenceTransformer [6.0.87]

extension PreferencesOutputs {
package mutating func makePreferenceTransformer<K>(
inputs: PreferencesInputs,
key _: K.Type,
key: K.Type,
transform: @autoclosure () -> Attribute<(inout K.Value) -> Void>
) where K: PreferenceKey {
openSwiftUIUnimplementedWarning()
let contains = inputs.contains(K.self)
let transformValue: Attribute<(inout K.Value) -> Void>!
if contains {
transformValue = transform()
let transform = PreferenceTransform<K>(
transform: transformValue,
childValue: OptionalAttribute(self[key])
)
self[key] = Attribute(transform)
} else {
transformValue = nil
}
guard K._isReadableByHost, inputs.contains(HostPreferencesKey.self) else {
return
}
let hostTransform = HostPreferencesTransform<K>(
transform: transformValue ?? transform(),
keys: inputs.hostKeys,
childValues: OptionalAttribute(self[HostPreferencesKey.self]),
keyRequested: false,
wasEmpty: false,
delta: 0,
nodeId: HostPreferencesKey.makeNodeId()
)
self[HostPreferencesKey.self] = Attribute(hostTransform)
}
}

// TODO
private struct PreferenceTransform<K> where K: PreferenceKey {
// MARK: - PreferenceTransform [6.0.87]

private struct PreferenceTransform<K>: Rule, AsyncAttribute, CustomStringConvertible where K: PreferenceKey {
@Attribute var transform: (inout K.Value) -> Void
@OptionalAttribute var childValue: K.Value?

var value: K.Value {
var value = childValue ?? K.defaultValue
$transform.syncMainIfReferences { transform in
// TODO: Observation support
transform(&value)
}
return value
}

var description: String {
"Transform: \(K.readableName)"
}
}

// TODO
private struct HostPreferencesTransform<K> where K: PreferenceKey {
// MARK: - HostPreferencesTransform [6.0.87]

private struct HostPreferencesTransform<K>: StatefulRule, AsyncAttribute, CustomStringConvertible where K: PreferenceKey {
@Attribute var transform: (inout K.Value) -> Void
@Attribute var keys: Attribute<PreferenceKeys>
@OptionalAttribute var childValues: PreferenceValues?
@Attribute var keys: PreferenceKeys
// FIXME: [6.4.41]
// @OptionalAttribute var childValues: PreferenceValues?
@OptionalAttribute var childValues: PreferenceList?
var keyRequested: Bool
var wasEmpty: Bool
var delta: UInt32
let nodeId: UInt32

typealias Value = PreferenceList

mutating func updateValue() {
var values: PreferenceList
let valuesChanged: Bool
if let childValues = $childValues {
(values, valuesChanged) = childValues.changedValue()
wasEmpty = false
} else {
(values, valuesChanged) = (PreferenceList(), !wasEmpty)
wasEmpty = true
}
var requiresUpdate = valuesChanged
let (keys, keysChanged) = $keys.changedValue()

let keyContains = keysChanged ? keys.contains(K.self) : false
if keyRequested != keyContains {
keyRequested = keyContains
requiresUpdate = true
}
if keyRequested {
let anyInputsChanged = [_keys.identifier, _childValues.base.identifier].anyInputsChanged
if anyInputsChanged {
delta &+= 1
requiresUpdate = true
}
if anyInputsChanged || requiresUpdate {
$transform.syncMainIfReferences { transform in
let transformValue = PreferenceList.Value(value: transform, seed: VersionSeed(nodeId: nodeId, viewSeed: delta))
values.modifyValue(for: K.self, transform: transformValue)
}
}
}
if requiresUpdate || !hasValue {
value = values
}
}

var description: String {
"HostTransform: \(K.readableName)"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,11 @@ package struct PreferencesInputs {

@inlinable
package func contains<K>(_ key: K.Type, includeHostPreferences: Bool) -> Bool where K: PreferenceKey {
let result = keys.contains(key)
let result = contains(key)
guard !result, includeHostPreferences else {
return result
}
guard K._isReadableByHost else {
return false
}
return keys.contains(_AnyPreferenceKey<HostPreferencesKey>.self)
return K._isReadableByHost && contains(HostPreferencesKey.self)
}

package func makeIndirectOutputs() -> PreferencesOutputs {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,4 +173,10 @@ extension Rule where Self: Hashable {
preconditionFailure("#39")
}
}

extension [AnyAttribute] {
package var anyInputsChanged: Bool {
false
}
}
#endif