Skip to content

Commit 6b4be40

Browse files
fix MorhpLayout overlay dimension size
MorphLayout's overlay was growing beyond its maximum constraints. Passed constraints from MorphSubcomposeLayout to constraint with it
1 parent 4f84daf commit 6b4be40

File tree

4 files changed

+39
-25
lines changed

4 files changed

+39
-25
lines changed

image/src/main/java/com/smarttoolfactory/image/transform/MorphLayout.kt

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,7 @@ import androidx.compose.ui.geometry.Offset
1010
import androidx.compose.ui.geometry.Rect
1111
import androidx.compose.ui.geometry.Size
1212
import androidx.compose.ui.platform.LocalDensity
13-
import androidx.compose.ui.unit.Dp
14-
import androidx.compose.ui.unit.DpSize
15-
import androidx.compose.ui.unit.IntSize
16-
import androidx.compose.ui.unit.dp
13+
import androidx.compose.ui.unit.*
1714

1815
/**
1916
* Composable that changes dimensions of its content from handles, translates its position
@@ -24,7 +21,7 @@ import androidx.compose.ui.unit.dp
2421
* set a **Size** modifier because [MorphSubcomposeLayout] measures with unbounded constraints
2522
* and size of this composable is changed. If you set a fixed size, size won't be calculated
2623
* accurately.
27-
* @param enabled flag for enabling morph operations and boroder and handle display
24+
* @param enabled flag for enabling morph operations and border and handle display
2825
* @param handleRadius radius of circular handles to implement morphing operations
2926
* @param handlePlacement determines how handles should be placed. They can be placed at corners
3027
* ot center of each side or both.
@@ -60,7 +57,7 @@ fun MorphLayout(
6057
content()
6158
}
6259
},
63-
dependentContent = { intSize: IntSize ->
60+
dependentContent = { intSize: IntSize, constraints: Constraints ->
6461

6562
val dpSize = with(LocalDensity.current) {
6663
val rawWidth = intSize.width.toDp()
@@ -72,6 +69,7 @@ fun MorphLayout(
7269
handleRadius = handleRadius,
7370
enabled = enabled,
7471
dpSize = dpSize,
72+
constraints = constraints,
7573
handlePlacement = handlePlacement,
7674
onDown = onDown,
7775
onMove = onMove,
@@ -87,16 +85,17 @@ private fun MorphLayout(
8785
enabled: Boolean = true,
8886
handleRadius: Dp,
8987
dpSize: DpSize,
88+
constraints: Constraints,
9089
handlePlacement: HandlePlacement,
9190
onDown: () -> Unit = {},
9291
onMove: (DpSize) -> Unit = {},
9392
onUp: () -> Unit = {},
9493
content: @Composable () -> Unit
9594
) {
9695

96+
val density = LocalDensity.current
9797
val touchRegionRadius: Float
9898
val minDimension: Float
99-
val size: Size
10099

101100
val initialSize = remember {
102101
DpSize(
@@ -109,14 +108,18 @@ private fun MorphLayout(
109108
mutableStateOf(initialSize)
110109
}
111110

112-
with(LocalDensity.current) {
111+
with(density) {
113112
touchRegionRadius = handleRadius.toPx()
114-
minDimension = (touchRegionRadius * if (handlePlacement == HandlePlacement.Corner) 4 else 6)
115-
size = updatedSize.toSize()
113+
minDimension =
114+
(touchRegionRadius * if (handlePlacement == HandlePlacement.Corner) 4 else 6)
116115
}
117116

118117
val rectDraw = remember(updatedSize) {
119-
Rect(offset = Offset.Zero, size = size)
118+
with(density) {
119+
val width = updatedSize.width.toPx().coerceAtMost(constraints.maxWidth.toFloat())
120+
val height = updatedSize.height.toPx().coerceAtMost(constraints.maxHeight.toFloat())
121+
Rect(offset = Offset.Zero, size = Size(width, height))
122+
}
120123
}
121124

122125
val editModifier = Modifier
@@ -125,6 +128,7 @@ private fun MorphLayout(
125128
initialSize = initialSize,
126129
touchRegionRadius = touchRegionRadius,
127130
minDimension = minDimension,
131+
constraints = constraints,
128132
handlePlacement = handlePlacement,
129133
onDown = onDown,
130134
onMove = { dpSizeChange: DpSize ->

image/src/main/java/com/smarttoolfactory/image/transform/MorphModifier.kt

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ import androidx.compose.ui.geometry.Rect
1212
import androidx.compose.ui.graphics.graphicsLayer
1313
import androidx.compose.ui.input.pointer.positionChange
1414
import androidx.compose.ui.platform.LocalDensity
15+
import androidx.compose.ui.unit.Constraints
1516
import androidx.compose.ui.unit.Density
17+
import androidx.compose.ui.unit.Dp
1618
import androidx.compose.ui.unit.DpSize
1719
import com.smarttoolfactory.gesture.pointerMotionEvents
1820

@@ -21,15 +23,23 @@ internal fun Modifier.morph(
2123
initialSize: DpSize,
2224
touchRegionRadius: Float,
2325
minDimension: Float,
26+
constraints: Constraints,
2427
handlePlacement: HandlePlacement,
25-
onDown: ()->Unit,
28+
onDown: () -> Unit,
2629
onMove: (DpSize) -> Unit,
27-
onUp: () ->Unit
30+
onUp: () -> Unit
2831
) = composed(
2932
factory = {
3033

3134
val density = LocalDensity.current
3235

36+
val maxWidth: Dp
37+
val maxHeight: Dp
38+
39+
with(density) {
40+
maxWidth = constraints.maxWidth.toDp()
41+
maxHeight = constraints.maxHeight.toDp()
42+
}
3343
var updatedSize by remember {
3444
mutableStateOf(initialSize)
3545
}
@@ -76,8 +86,11 @@ internal fun Modifier.morph(
7686
minDimension,
7787
transform,
7888
onUpdate = { dpSize, transformChange ->
79-
updatedSize = dpSize
80-
onMove(dpSize)
89+
updatedSize = DpSize(
90+
dpSize.width.coerceAtMost(maxWidth),
91+
dpSize.height.coerceAtMost(maxHeight)
92+
)
93+
onMove(updatedSize)
8194
transform = transformChange
8295
}
8396
)

image/src/main/java/com/smarttoolfactory/image/transform/MorphSubcomposeLayout.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.compose.ui.layout.Placeable
77
import androidx.compose.ui.layout.SubcomposeLayout
88
import androidx.compose.ui.layout.SubcomposeMeasureScope
99
import androidx.compose.ui.platform.LocalDensity
10+
import androidx.compose.ui.unit.Constraints
1011
import androidx.compose.ui.unit.Dp
1112
import androidx.compose.ui.unit.IntSize
1213
import androidx.compose.ui.unit.dp
@@ -31,7 +32,7 @@ internal fun MorphSubcomposeLayout(
3132
handleRadius: Dp = 15.dp,
3233
updatePhysicalSize:Boolean =false,
3334
mainContent: @Composable () -> Unit,
34-
dependentContent: @Composable (IntSize) -> Unit
35+
dependentContent: @Composable (IntSize, Constraints) -> Unit
3536
) {
3637

3738
val handleRadiusInPx = with(LocalDensity.current) {
@@ -62,7 +63,7 @@ internal fun MorphSubcomposeLayout(
6263
val maxSize = IntSize(maxWidth, maxHeight)
6364

6465
val dependentPlaceables = subcompose(SlotsEnum.Dependent) {
65-
dependentContent(maxSize)
66+
dependentContent(maxSize, constraints)
6667
}.map {
6768
it.measure(constraints)
6869
}

image/src/main/java/com/smarttoolfactory/image/transform/TranformLayout.kt

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@ import androidx.compose.ui.geometry.Rect
99
import androidx.compose.ui.geometry.Size
1010
import androidx.compose.ui.graphics.graphicsLayer
1111
import androidx.compose.ui.platform.LocalDensity
12-
import androidx.compose.ui.unit.Dp
13-
import androidx.compose.ui.unit.DpSize
14-
import androidx.compose.ui.unit.IntSize
15-
import androidx.compose.ui.unit.dp
12+
import androidx.compose.ui.unit.*
1613
import kotlin.math.abs
14+
import kotlin.ranges.coerceAtLeast
1715

1816
/**
1917
* Composable that changes scale of its content from handles, translates its position
@@ -58,15 +56,14 @@ fun TransformLayout(
5856
content()
5957
}
6058
},
61-
dependentContent = { intSize: IntSize ->
59+
dependentContent = { intSize: IntSize, constraints: Constraints ->
6260

6361
val dpSize = with(LocalDensity.current) {
6462
val rawWidth = intSize.width.toDp()
6563
val rawHeight = intSize.height.toDp()
6664
DpSize(rawWidth, rawHeight)
6765
}
6866

69-
println("Dependent size: $intSize")
7067
TransformLayout(
7168
enabled = enabled,
7269
handleRadius = handleRadius,
@@ -119,8 +116,7 @@ private fun TransformLayout(
119116
// transform
120117
// )
121118
// }
122-
123-
119+
124120
var rectDraw by remember {
125121
mutableStateOf(
126122
Rect(

0 commit comments

Comments
 (0)