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
Original file line number Diff line number Diff line change
Expand Up @@ -321,78 +321,25 @@ extension NSHostingView: ViewRendererHost {
// TODO
}

package func updateScrollableContainerSize() {
package func updateContainerSize() {
// TODO
}

package func renderDisplayList(
_ list: DisplayList,
asynchronously: Bool,
time: Time,
nextTime: Time,
targetTimestamp: Time?,
version: DisplayList.Version,
maxVersion: DisplayList.Version
) -> Time {
func render() -> Time {
let scale = window?.screen?.backingScaleFactor ?? 1
let environment = DisplayList.ViewRenderer.Environment(contentsScale: scale, opaqueBackground: isOpaque)
#if canImport(SwiftUI, _underlyingVersion: 6.0.87) && _OPENSWIFTUI_SWIFTUI_RENDER

return renderer.swiftUI_render(
rootView: self,
from: list,
time: time,
nextTime: nextTime,
version: version,
maxVersion: maxVersion,
environment: environment
)

#else
return renderer.render(
rootView: self,
from: list,
time: time,
nextTime: nextTime,
version: version,
maxVersion: maxVersion,
environment: environment
)
#endif
}

if asynchronously {
if let renderedTime = renderer.renderAsync(
to: list,
time: time,
nextTime: nextTime,
targetTimestamp: targetTimestamp,
version: version,
maxVersion: maxVersion
) {
return renderedTime
} else {
var renderedTime = nextTime
Update.syncMain {
renderedTime = render()
}
return renderedTime
}
} else {
var renderedTime = nextTime
Update.syncMain {
renderedTime = render()
}
return renderedTime
}
}

package func updateRootView() {
let rootView = makeRootView()
viewGraph.setRootView(rootView)
}

package func `as`<T>(_ type: T.Type) -> T? {
if ViewGraphRenderDelegate.self == T.self {
return unsafeBitCast(self as any ViewGraphRenderDelegate, to: T.self)
} else if DisplayList.ViewRenderer.self == T.self {
return unsafeBitCast(renderer, to: T.self)
} else {
return nil
}
}

package func requestUpdate(after: Double) {
// TODO
setNeedsUpdate()
Expand Down Expand Up @@ -424,4 +371,21 @@ extension NSHostingView/*: TestHost*/ {
}
}
}

// FIXME
extension NSHostingView: ViewGraphRenderDelegate {
package var renderingRootView: AnyObject {
self
}

package func updateRenderContext(_ context: inout ViewGraphRenderContext) {
context.contentsScale = window?.backingScaleFactor ?? 1.0
}

package func withMainThreadRender(wasAsync: Bool, _ body: () -> Time) -> Time {
// TODO
return body()
}
}

#endif
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ extension _UIHostingView {
guard safeAreaRegions != oldSafeAreaRegions else {
return
}
invalidateProperties([.safeArea, .scrollableContainerSize])
invalidateProperties([.safeArea, .containerSize])
}

func updateBackgroundColor() {
Expand Down Expand Up @@ -465,6 +465,21 @@ extension _UIHostingView {
}
}

extension _UIHostingView: ViewGraphDelegate {
package func `as`<T>(_ type: T.Type) -> T? {
guard let value = base.as(type) else {
// TODO
return nil
}
return value
}

package func requestUpdate(after: Double) {
// TODO
requestImmediateUpdate()
}
}

extension _UIHostingView: ViewRendererHost {
package var renderingPhase: ViewRenderingPhase {
get { base.renderingPhase }
Expand Down Expand Up @@ -497,87 +512,14 @@ extension _UIHostingView: ViewRendererHost {
}
}

package func updateScrollableContainerSize() {
package func updateContainerSize() {
// _openSwiftUIUnimplementedFailure()
}

package func renderDisplayList(
_ list: DisplayList,
asynchronously: Bool,
time: Time,
nextTime: Time,
targetTimestamp: Time?,
version: DisplayList.Version,
maxVersion: DisplayList.Version
) -> Time {
func render() -> Time {
let scale = window?.screen.scale ?? 1
let environment = DisplayList.ViewRenderer.Environment(contentsScale: scale)
#if canImport(SwiftUI, _underlyingVersion: 6.0.87) && _OPENSWIFTUI_SWIFTUI_RENDER
return renderer.swiftUI_render(
rootView: self,
from: list,
time: time,
nextTime: nextTime,
version: version,
maxVersion: maxVersion,
environment: environment
)
#else
return renderer.render(
rootView: self,
from: list,
time: time,
nextTime: nextTime,
version: version,
maxVersion: maxVersion,
environment: environment
)
#endif
}

if asynchronously {
if let renderedTime = renderer.renderAsync(
to: list,
time: time,
nextTime: nextTime,
targetTimestamp: targetTimestamp,
version: version,
maxVersion: maxVersion
) {
return renderedTime
} else {
var renderedTime = nextTime
Update.syncMain {
renderedTime = render()
}
return renderedTime
}
} else {
if Self.areAnimationsEnabled, shouldDisableUIKitAnimations {
var renderedTime = nextTime // FIXME
Self.performWithoutAnimation {
renderedTime = render()
}
base.allowUIKitAnimationsForNextUpdate = false
return renderedTime
} else {
let renderedTime = render()
base.allowUIKitAnimationsForNextUpdate = false
return renderedTime
}
}
}

package func updateRootView() {
let rootView = makeRootView()
viewGraph.setRootView(rootView)
}

package func requestUpdate(after: Double) {
// TODO
requestImmediateUpdate()
}

func requestImmediateUpdate() {
// FIXME
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ package class UIHostingViewBase {

package var updateTimer: Timer?

package var canAdvanceTimeAutomatically: Bool = false
package var canAdvanceTimeAutomatically: Bool = true

package var pendingPreferencesUpdate: Bool = false

Expand Down Expand Up @@ -160,7 +160,7 @@ package class UIHostingViewBase {

package func `as`<T>(_ type: T.Type) -> T? {
if ViewGraphRenderDelegate.self == T.self {
return unsafeBitCast(self, to: T.self)
return unsafeBitCast(self as any ViewGraphRenderDelegate, to: T.self)
} else if DisplayList.ViewRenderer.self == T.self {
return unsafeBitCast(renderer, to: T.self)
} else {
Expand Down Expand Up @@ -432,7 +432,7 @@ package class UIHostingViewBase {
package func layoutSubviews() {
guard let host,
let uiView,
let window = uiView.window,
uiView.window != nil,
canAdvanceTimeAutomatically
else {
return
Expand Down
7 changes: 5 additions & 2 deletions Sources/OpenSwiftUICore/Graph/GraphHost.swift
Original file line number Diff line number Diff line change
Expand Up @@ -196,9 +196,12 @@ open class GraphHost: CustomReflectable {
return graph.counter(for: ._6) != 0
}

package final func setNeedsUpdate(mayDeferUpdate: Bool) {
package final func setNeedsUpdate(mayDeferUpdate: Bool, values: ViewRendererHostProperties) {
self.mayDeferUpdate = self.mayDeferUpdate && mayDeferUpdate
data.graph?.setNeedsUpdate()
if let graph = data.graph {
// TODO: Trace
graph.setNeedsUpdate()
}
}

// MARK: - GraphHost.ConstantID
Expand Down
19 changes: 4 additions & 15 deletions Sources/OpenSwiftUICore/View/Graph/EmptyViewRendererHost.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
// EmptyViewRendererHost.swift
// OpenSwiftUICore
//
// Audited for iOS 18.0
// Audited for 6.5.4
// Status: Complete

final package class EmptyViewRendererHost: ViewRendererHost {
Expand All @@ -20,6 +20,7 @@ final package class EmptyViewRendererHost: ViewRendererHost {
Update.begin()
viewGraph = ViewGraph(rootViewType: EmptyView.self, requestedOutputs: [])
viewGraph.setEnvironment(environment)
viewGraph.setRootView(EmptyView())
initializeViewGraph()
Update.end()
}
Expand All @@ -34,19 +35,7 @@ final package class EmptyViewRendererHost: ViewRendererHost {

package func updateSafeArea() {}

package func updateScrollableContainerSize() {}

package func renderDisplayList(
_ list: DisplayList,
asynchronously: Bool,
time: Time,
nextTime: Time,
targetTimestamp: Time?,
version: DisplayList.Version,
maxVersion: DisplayList.Version
) -> Time {
.infinity
}

package func updateContainerSize() {}

package func forEachIdentifiedView(body: (_IdentifiedViewProxy) -> Void) {}
}
38 changes: 28 additions & 10 deletions Sources/OpenSwiftUICore/View/Graph/ViewGraph.swift
Original file line number Diff line number Diff line change
Expand Up @@ -67,12 +67,12 @@ package final class ViewGraph: GraphHost {
@OptionalAttribute var scrollableContainerSize: ViewSize?

@Attribute var gestureTime: Time
// @Attribute var gestureEvents: [EventID : EventType]
// @Attribute var inheritedPhase: _GestureInputs.InheritedPhase
@Attribute var gestureEvents: [EventID : EventType]
@Attribute var inheritedPhase: _GestureInputs.InheritedPhase
@Attribute var gestureResetSeed: UInt32
// @OptionalAttribute var rootPhase: GesturePhase<Void>?
// @OptionalAttribute package var gestureDebug: GestureDebug.Data?
// @OptionalAttribute package var gestureCategory: GestureCategory?
@OptionalAttribute var rootPhase: GesturePhase<Void>?
@OptionalAttribute package var gestureDebug: GestureDebug.Data?
@OptionalAttribute package var gestureCategory: GestureCategory?
@Attribute package var gesturePreferenceKeys: PreferenceKeys
var eventSubgraph: Subgraph?

Expand Down Expand Up @@ -155,8 +155,8 @@ package final class ViewGraph: GraphHost {
_safeAreaInsets = Attribute(value: _SafeAreaInsetsModifier(elements: [.init(regions: .container, insets: .zero)]))
_defaultLayoutComputer = Attribute(value: .defaultValue)
_gestureTime = Attribute(value: .zero)
// _gestureEvents
// _inheritedPhase
_gestureEvents = Attribute(value: [:])
_inheritedPhase = Attribute(value: .defaultValue)
_gestureResetSeed = Attribute(value: .zero)
_gesturePreferenceKeys = Attribute(value: .init())
_rootGeometry = Attribute(RootGeometry(
Expand Down Expand Up @@ -314,9 +314,7 @@ package final class ViewGraph: GraphHost {

extension ViewGraph {
package func setRootView<Root>(_ view: Root) where Root: View {
@Attribute(identifier: rootView)
var rootView: Root
rootView = view
rootView.unsafeCast(to: Root.self).value = view
}

package func setSize(_ size: ViewSize) {
Expand Down Expand Up @@ -518,7 +516,27 @@ extension ViewGraph {
}
}

extension ViewGraph {
package var responderNode: ResponderNode? {
_openSwiftUIUnimplementedFailure()
}

package func setInheritedPhase(_ phase: _GestureInputs.InheritedPhase) {
_openSwiftUIUnimplementedFailure()
}

package func sendEvents(
_ events: [EventID: any EventType],
rootNode: ResponderNode,
at time: Time
) -> GesturePhase<Void> {
_openSwiftUIUnimplementedFailure()
}

package func resetEvents() {
_openSwiftUIUnimplementedFailure()
}
}

// MARK: - RootGeometry

Expand Down
2 changes: 1 addition & 1 deletion Sources/OpenSwiftUICore/View/Graph/ViewGraphRender.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

package import Foundation

package protocol ViewGraphRenderDelegate {
package protocol ViewGraphRenderDelegate: AnyObject {
var renderingRootView: AnyObject { get }
func updateRenderContext(_ context: inout ViewGraphRenderContext)
func withMainThreadRender(wasAsync: Bool, _ body: () -> Time) -> Time
Expand Down
Loading
Loading