Skip to content

Commit fa10788

Browse files
authored
feat: Make putRevealable() and removeRevealable() public (#24)
1 parent 5872d3b commit fa10788

File tree

6 files changed

+74
-68
lines changed

6 files changed

+74
-68
lines changed

reveal-core/src/main/kotlin/com/svenjacobs/reveal/Reveal.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public fun Reveal(
125125
detectTapGestures(
126126
onPress = { offset ->
127127
rev?.key?.let(
128-
if (rev?.revealArea?.contains(offset) == true) {
128+
if (rev?.area?.contains(offset) == true) {
129129
onRevealableClick
130130
} else {
131131
onOverlayClick
@@ -149,15 +149,15 @@ public fun Reveal(
149149
}
150150
}
151151

152-
private fun InternalRevealable.toActual(
152+
private fun Revealable.toActual(
153153
containerPositionInRoot: Offset,
154154
density: Density,
155155
layoutDirection: LayoutDirection,
156156
): ActualRevealable = ActualRevealable(
157157
key = key,
158158
shape = shape,
159159
padding = padding,
160-
revealArea = getRevealArea(
160+
area = computeArea(
161161
containerPositionInRoot = containerPositionInRoot,
162162
density = density,
163163
layoutDirection = layoutDirection,

reveal-core/src/main/kotlin/com/svenjacobs/reveal/RevealScope.kt

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,9 @@ import androidx.compose.runtime.Immutable
66
import androidx.compose.ui.Modifier
77
import androidx.compose.ui.composed
88
import androidx.compose.ui.layout.onGloballyPositioned
9+
import androidx.compose.ui.layout.positionInRoot
910
import androidx.compose.ui.unit.dp
11+
import androidx.compose.ui.unit.toSize
1012

1113
/**
1214
* Scope inside [Reveal]'s contents which provides [revealable] modifier.
@@ -48,10 +50,15 @@ internal class RevealScopeInstance(
4850
Modifier
4951
.onGloballyPositioned { layoutCoordinates ->
5052
revealState.putRevealable(
51-
key = key,
52-
shape = shape,
53-
padding = padding,
54-
layoutCoordinates = layoutCoordinates,
53+
Revealable(
54+
key = key,
55+
shape = shape,
56+
padding = padding,
57+
layout = Revealable.Layout(
58+
offset = layoutCoordinates.positionInRoot(),
59+
size = layoutCoordinates.size.toSize(),
60+
),
61+
),
5562
)
5663
}
5764
.composed {

reveal-core/src/main/kotlin/com/svenjacobs/reveal/RevealState.kt

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.svenjacobs.reveal
22

3-
import androidx.compose.foundation.layout.PaddingValues
43
import androidx.compose.runtime.Composable
54
import androidx.compose.runtime.Stable
65
import androidx.compose.runtime.getValue
@@ -11,24 +10,23 @@ import androidx.compose.runtime.saveable.autoSaver
1110
import androidx.compose.runtime.saveable.listSaver
1211
import androidx.compose.runtime.saveable.rememberSaveable
1312
import androidx.compose.runtime.setValue
14-
import androidx.compose.ui.layout.LayoutCoordinates
1513
import kotlinx.coroutines.sync.Mutex
1614
import kotlinx.coroutines.sync.withLock
1715

1816
@Stable
1917
@Suppress("MemberVisibilityCanBePrivate")
2018
public class RevealState internal constructor(
2119
visible: Boolean = false,
22-
private val restoreRevealableKey: Key? = null,
20+
private val restoreCurrentRevealableKey: Key? = null,
2321
) {
2422

2523
private val mutex = Mutex()
2624
private var didRestoreCurrentRevealable = false
2725
private var visible by mutableStateOf(visible)
28-
private val revealables = mutableStateMapOf<Key, InternalRevealable>()
29-
internal var currentRevealable by mutableStateOf<InternalRevealable?>(null)
26+
private val revealables = mutableStateMapOf<Key, Revealable>()
27+
internal var currentRevealable by mutableStateOf<Revealable?>(null)
3028
private set
31-
internal var previousRevealable by mutableStateOf<InternalRevealable?>(null)
29+
internal var previousRevealable by mutableStateOf<Revealable?>(null)
3230
private set
3331

3432
/**
@@ -95,31 +93,31 @@ public class RevealState internal constructor(
9593
previousRevealable = null
9694
}
9795

98-
internal fun putRevealable(
99-
key: Key,
100-
shape: RevealShape,
101-
padding: PaddingValues,
102-
layoutCoordinates: LayoutCoordinates,
103-
) {
104-
val revealable = InternalRevealableInstance(
105-
key = key,
106-
shape = shape,
107-
padding = padding,
108-
layoutCoordinates = layoutCoordinates,
109-
)
110-
111-
revealables[key] = revealable
96+
/**
97+
* Adds a [Revealable] to this state.
98+
*
99+
* Usually this should not be called manually but revealables registered via the
100+
* [RevealScope.revealable] modifier. Only use this function when for instance you want to
101+
* reveal legacy Android views.
102+
*
103+
* @see RevealScope.revealable
104+
*/
105+
public fun putRevealable(revealable: Revealable) {
106+
revealables[revealable.key] = revealable
112107

113-
if (!didRestoreCurrentRevealable && restoreRevealableKey == key) {
108+
if (!didRestoreCurrentRevealable && restoreCurrentRevealableKey == revealable.key) {
114109
currentRevealable = revealable
115110
didRestoreCurrentRevealable = true
116111
}
117112
}
118113

119114
/**
120-
* Is called from [RevealScope.revealable] when the composable is disposed.
115+
* Removes a [Revealable] from this state.
116+
*
117+
* Usually this must not be called manually. The [RevealScope.revealable] modifier takes care
118+
* of removing revealables when the composable is disposed.
121119
*/
122-
internal fun removeRevealable(key: Key) {
120+
public fun removeRevealable(key: Key) {
123121
revealables.remove(key)
124122

125123
// Hide effect if the current revealable left the composition.
@@ -145,7 +143,9 @@ public class RevealState internal constructor(
145143
restore = {
146144
RevealState(
147145
visible = it[0] as Boolean,
148-
restoreRevealableKey = it[1]?.let { keySaveable -> keySaver.restore(keySaveable) },
146+
restoreCurrentRevealableKey = it[1]?.let { keySaveable ->
147+
keySaver.restore(keySaveable)
148+
},
149149
)
150150
},
151151
)

reveal-core/src/main/kotlin/com/svenjacobs/reveal/Revealable.kt

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -4,40 +4,31 @@ import androidx.compose.foundation.layout.PaddingValues
44
import androidx.compose.runtime.Immutable
55
import androidx.compose.ui.geometry.Offset
66
import androidx.compose.ui.geometry.Rect
7-
import androidx.compose.ui.layout.LayoutCoordinates
8-
import androidx.compose.ui.layout.positionInRoot
7+
import androidx.compose.ui.geometry.Size
98
import androidx.compose.ui.unit.Density
109
import androidx.compose.ui.unit.LayoutDirection
1110

12-
public interface Revealable {
13-
public val key: Key
14-
public val shape: RevealShape
15-
public val padding: PaddingValues
16-
}
17-
1811
@Immutable
19-
public class ActualRevealable(
20-
override val key: Key,
21-
override val shape: RevealShape,
22-
override val padding: PaddingValues,
23-
public val revealArea: Rect,
24-
) : Revealable
12+
public data class Revealable(
13+
val key: Key,
14+
val shape: RevealShape,
15+
val padding: PaddingValues,
16+
val layout: Layout,
17+
) {
2518

26-
internal interface InternalRevealable : Revealable {
27-
val layoutCoordinates: LayoutCoordinates
28-
}
29-
30-
@Immutable
31-
internal class InternalRevealableInstance(
32-
override val key: Key,
33-
override val shape: RevealShape,
34-
override val padding: PaddingValues,
35-
override val layoutCoordinates: LayoutCoordinates,
36-
) : InternalRevealable {
19+
/**
20+
* @param offset Offset in pixels of revealable to root composable
21+
* @param size Size in pixels of revealable
22+
*/
23+
@Immutable
24+
public data class Layout(
25+
val offset: Offset,
26+
val size: Size,
27+
)
3728

3829
override fun equals(other: Any?): Boolean {
3930
if (this === other) return true
40-
if (other !is InternalRevealableInstance) return false
31+
if (other !is Revealable) return false
4132

4233
if (key != other.key) return false
4334

@@ -47,23 +38,31 @@ internal class InternalRevealableInstance(
4738
override fun hashCode(): Int = key.hashCode()
4839
}
4940

41+
@Immutable
42+
public data class ActualRevealable(
43+
val key: Key,
44+
val shape: RevealShape,
45+
val padding: PaddingValues,
46+
val area: Rect,
47+
)
48+
5049
/**
5150
* Returns [Rect] in pixels of the reveal area including padding for this [Revealable].
5251
*/
53-
internal fun InternalRevealable.getRevealArea(
52+
internal fun Revealable.computeArea(
5453
containerPositionInRoot: Offset,
5554
density: Density,
5655
layoutDirection: LayoutDirection,
5756
): Rect {
58-
val pos = layoutCoordinates.positionInRoot() - containerPositionInRoot
57+
val pos = layout.offset - containerPositionInRoot
5958
return with(density) {
6059
val rect = Rect(
6160
left = pos.x - padding.calculateLeftPadding(layoutDirection).toPx(),
6261
top = pos.y - padding.calculateTopPadding().toPx(),
63-
right = pos.x + padding.calculateRightPadding(layoutDirection)
64-
.toPx() + layoutCoordinates.size.width.toFloat(),
65-
bottom = pos.y + padding.calculateBottomPadding()
66-
.toPx() + layoutCoordinates.size.height.toFloat(),
62+
right = pos.x + padding.calculateRightPadding(layoutDirection).toPx() +
63+
layout.size.width,
64+
bottom = pos.y + padding.calculateBottomPadding().toPx() +
65+
layout.size.height,
6766
)
6867

6968
if (shape == RevealShape.Circle) {

reveal-core/src/main/kotlin/com/svenjacobs/reveal/effect/dim/DimRevealOverlayEffect.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ private class DimItemHolder(
105105
.alpha(contentAlpha.value),
106106
content = {
107107
RevealOverlayScopeInstance(
108-
revealableRect = revealable.revealArea.toIntRect(),
108+
revealableRect = revealable.area.toIntRect(),
109109
).content(revealable.key)
110110
},
111111
)

reveal-core/src/main/kotlin/com/svenjacobs/reveal/effect/internal/Graphics.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,17 @@ internal fun ActualRevealable.createShapePath(
1313
): Path = shape
1414
.clip(
1515
size = Size(
16-
width = revealArea.width,
17-
height = revealArea.height,
16+
width = area.width,
17+
height = area.height,
1818
),
1919
density = density,
2020
layoutDirection = layoutDirection,
2121
)
2222
.apply {
2323
translate(
2424
Offset(
25-
x = revealArea.left,
26-
y = revealArea.top,
25+
x = area.left,
26+
y = area.top,
2727
),
2828
)
2929
}

0 commit comments

Comments
 (0)