Skip to content

Commit

Permalink
Start using LayoutAwareModifierNode and onPlaced again (#372)
Browse files Browse the repository at this point in the history
This was removed in #349 for performance reasons, but correctness is
more important.

I'm hoping that this fixes #367 and #371
  • Loading branch information
chrisbanes authored Oct 26, 2024
1 parent 2dcdcc5 commit 7b1a955
Show file tree
Hide file tree
Showing 9 changed files with 67 additions and 11 deletions.
4 changes: 2 additions & 2 deletions haze/api/api.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ package dev.chrisbanes.haze {
method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier hazeChild(androidx.compose.ui.Modifier, dev.chrisbanes.haze.HazeState state, optional dev.chrisbanes.haze.HazeStyle style, optional kotlin.jvm.functions.Function1<? super dev.chrisbanes.haze.HazeChildScope,kotlin.Unit>? block);
}

@dev.chrisbanes.haze.ExperimentalHazeApi public final class HazeChildNode extends androidx.compose.ui.Modifier.Node implements androidx.compose.ui.node.CompositionLocalConsumerModifierNode androidx.compose.ui.node.DrawModifierNode androidx.compose.ui.node.GlobalPositionAwareModifierNode dev.chrisbanes.haze.HazeChildScope androidx.compose.ui.node.ObserverModifierNode {
@dev.chrisbanes.haze.ExperimentalHazeApi public final class HazeChildNode extends androidx.compose.ui.Modifier.Node implements androidx.compose.ui.node.CompositionLocalConsumerModifierNode androidx.compose.ui.node.DrawModifierNode androidx.compose.ui.node.GlobalPositionAwareModifierNode dev.chrisbanes.haze.HazeChildScope androidx.compose.ui.node.LayoutAwareModifierNode androidx.compose.ui.node.ObserverModifierNode {
ctor public HazeChildNode(dev.chrisbanes.haze.HazeState state, optional dev.chrisbanes.haze.HazeStyle style, optional kotlin.jvm.functions.Function1<? super dev.chrisbanes.haze.HazeChildScope,kotlin.Unit>? block);
method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
method public float getAlpha();
Expand Down Expand Up @@ -96,7 +96,7 @@ package dev.chrisbanes.haze {
method @androidx.compose.runtime.Stable public static androidx.compose.ui.Modifier haze(androidx.compose.ui.Modifier, dev.chrisbanes.haze.HazeState state);
}

@dev.chrisbanes.haze.ExperimentalHazeApi public final class HazeNode extends androidx.compose.ui.Modifier.Node implements androidx.compose.ui.node.CompositionLocalConsumerModifierNode androidx.compose.ui.node.DrawModifierNode androidx.compose.ui.node.GlobalPositionAwareModifierNode {
@dev.chrisbanes.haze.ExperimentalHazeApi public final class HazeNode extends androidx.compose.ui.Modifier.Node implements androidx.compose.ui.node.CompositionLocalConsumerModifierNode androidx.compose.ui.node.DrawModifierNode androidx.compose.ui.node.GlobalPositionAwareModifierNode androidx.compose.ui.node.LayoutAwareModifierNode {
ctor public HazeNode(dev.chrisbanes.haze.HazeState state);
method public void draw(androidx.compose.ui.graphics.drawscope.ContentDrawScope);
method public dev.chrisbanes.haze.HazeState getState();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,12 @@
package dev.chrisbanes.haze

import android.util.Log
import androidx.compose.runtime.snapshots.Snapshot

internal actual fun log(tag: String, message: () -> String) {
if (LOG_ENABLED) {
Log.d(tag, message())
Snapshot.withoutReadObservation {
Log.d(tag, message())
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ internal actual fun HazeChildNode.createRenderEffect(
): RenderEffect? {
if (Build.VERSION.SDK_INT < 31) return null

log("HazeChildNode") {
log(HazeChildNode.TAG) {
"createRenderEffect. " +
"blurRadiusPx=$blurRadiusPx, " +
"noiseFactor=$noiseFactor, " +
Expand Down
25 changes: 24 additions & 1 deletion haze/src/commonMain/kotlin/dev/chrisbanes/haze/HazeChildNode.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import androidx.compose.ui.layout.positionInWindow
import androidx.compose.ui.node.CompositionLocalConsumerModifierNode
import androidx.compose.ui.node.DrawModifierNode
import androidx.compose.ui.node.GlobalPositionAwareModifierNode
import androidx.compose.ui.node.LayoutAwareModifierNode
import androidx.compose.ui.node.ObserverModifierNode
import androidx.compose.ui.node.currentValueOf
import androidx.compose.ui.node.invalidateDraw
Expand All @@ -53,6 +54,7 @@ class HazeChildNode(
var block: (HazeChildScope.() -> Unit)? = null,
) : Modifier.Node(),
CompositionLocalConsumerModifierNode,
LayoutAwareModifierNode,
GlobalPositionAwareModifierNode,
ObserverModifierNode,
DrawModifierNode,
Expand Down Expand Up @@ -217,7 +219,28 @@ class HazeChildNode(
}

override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
log(TAG) { "onGloballyPositioned: positionInWindow=${coordinates.positionInWindow()}" }
onPlaced(coordinates)

log(TAG) {
"onGloballyPositioned: " +
"positionInWindow=${coordinates.positionInWindow()}, " +
"positionInContent=$positionInContent, " +
"size=$size"
}
}

override fun onPlaced(coordinates: LayoutCoordinates) {
onPositioned(coordinates)

log(TAG) {
"onPlaced: " +
"positionInWindow=${coordinates.positionInWindow()}, " +
"positionInContent=$positionInContent, " +
"size=$size"
}
}

private fun onPositioned(coordinates: LayoutCoordinates) {
positionInContent = coordinates.positionInWindow() +
calculateWindowOffset() - state.positionOnScreen
size = coordinates.size.toSize()
Expand Down
23 changes: 21 additions & 2 deletions haze/src/commonMain/kotlin/dev/chrisbanes/haze/HazeNode.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import androidx.compose.ui.layout.positionInWindow
import androidx.compose.ui.node.CompositionLocalConsumerModifierNode
import androidx.compose.ui.node.DrawModifierNode
import androidx.compose.ui.node.GlobalPositionAwareModifierNode
import androidx.compose.ui.node.LayoutAwareModifierNode
import androidx.compose.ui.node.currentValueOf
import androidx.compose.ui.platform.LocalGraphicsContext
import androidx.compose.ui.unit.Dp
Expand All @@ -33,12 +34,30 @@ class HazeNode(
) : Modifier.Node(),
CompositionLocalConsumerModifierNode,
GlobalPositionAwareModifierNode,
LayoutAwareModifierNode,
DrawModifierNode {

override fun onGloballyPositioned(coordinates: LayoutCoordinates) {
log("HazeNode") {
"onPlaced: positionInWindow=${coordinates.positionInWindow()}"
onPlaced(coordinates)

log(TAG) {
"onGloballyPositioned: " +
"positionInWindow=${coordinates.positionInWindow()}, " +
"positionInContent=${state.positionOnScreen}"
}
}

override fun onPlaced(coordinates: LayoutCoordinates) {
onPositioned(coordinates)

log(TAG) {
"onPlaced: " +
"positionInWindow=${coordinates.positionInWindow()}, " +
"positionInContent=${state.positionOnScreen}"
}
}

private fun onPositioned(coordinates: LayoutCoordinates) {
state.positionOnScreen = coordinates.positionInWindow() + calculateWindowOffset()
}

Expand Down
5 changes: 4 additions & 1 deletion haze/src/iosMain/kotlin/dev/chrisbanes/haze/Log.ios.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,13 @@

package dev.chrisbanes.haze

import androidx.compose.runtime.snapshots.Snapshot
import platform.Foundation.NSLog

internal actual fun log(tag: String, message: () -> String) {
if (LOG_ENABLED) {
NSLog("[%s] %s", tag, message())
Snapshot.withoutReadObservation {
NSLog("[%s] %s", tag, message())
}
}
}
6 changes: 5 additions & 1 deletion haze/src/jsMain/kotlin/dev/chrisbanes/haze/Log.js.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@

package dev.chrisbanes.haze

import androidx.compose.runtime.snapshots.Snapshot

internal actual fun log(tag: String, message: () -> String) {
if (LOG_ENABLED) {
println("[$tag] ${message()}")
Snapshot.withoutReadObservation {
println("[$tag] ${message()}")
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ internal actual fun HazeChildNode.createRenderEffect(
mask: Brush?,
progressive: Brush?,
): RenderEffect? {
log("HazeChildNode") {
log(HazeChildNode.TAG) {
"createRenderEffect. " +
"blurRadiusPx=$blurRadiusPx, " +
"noiseFactor=$noiseFactor, " +
Expand Down
6 changes: 5 additions & 1 deletion haze/src/wasmJsMain/kotlin/dev/chrisbanes/haze/Log.wasmJs.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@

package dev.chrisbanes.haze

import androidx.compose.runtime.snapshots.Snapshot

internal actual fun log(tag: String, message: () -> String) {
if (LOG_ENABLED) {
println("[$tag] ${message()}")
Snapshot.withoutReadObservation {
println("[$tag] ${message()}")
}
}
}

0 comments on commit 7b1a955

Please sign in to comment.