aboutsummaryrefslogtreecommitdiff
path: root/integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideImage.kt
diff options
context:
space:
mode:
Diffstat (limited to 'integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideImage.kt')
-rw-r--r--integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideImage.kt49
1 files changed, 34 insertions, 15 deletions
diff --git a/integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideImage.kt b/integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideImage.kt
index c963961f..e88d4094 100644
--- a/integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideImage.kt
+++ b/integration/compose/src/main/java/com/bumptech/glide/integration/compose/GlideImage.kt
@@ -145,6 +145,8 @@ public fun GlideImage(
alpha,
colorFilter,
transition,
+ loadingPlaceholder = loading?.maybePainter(),
+ errorPlaceholder = failure?.maybePainter(),
)
)
}
@@ -167,13 +169,10 @@ public interface GlideSubcompositionScope {
@ExperimentalGlideComposeApi
internal class GlideSubcompositionScopeImpl(
- private val drawable: Drawable?,
+ maybePainter: Painter?,
override val state: RequestState
) : GlideSubcompositionScope {
-
- override val painter: Painter
- get() = drawable?.toPainter() ?: ColorPainter(Color.Transparent)
-
+ override val painter: Painter = maybePainter ?: ColorPainter(Color.Transparent)
}
/**
@@ -266,7 +265,7 @@ public fun GlideSubcomposition(
remember(model, requestManager, requestBuilderTransform) {
mutableStateOf(RequestState.Loading)
}
- val drawable: MutableState<Drawable?> = remember(model, requestManager, requestBuilderTransform) {
+ val painter: MutableState<Painter?> = remember(model, requestManager, requestBuilderTransform) {
mutableStateOf(null)
}
@@ -274,11 +273,11 @@ public fun GlideSubcomposition(
remember(model, requestManager, requestBuilderTransform) {
StateTrackingListener(
requestState,
- drawable
+ painter
)
}
- val scope = GlideSubcompositionScopeImpl(drawable.value, requestState.value)
+ val scope = GlideSubcompositionScopeImpl(painter.value, requestState.value)
Box(
modifier
@@ -295,12 +294,12 @@ public fun GlideSubcomposition(
@ExperimentalGlideComposeApi
private class StateTrackingListener(
val state: MutableState<RequestState>,
- val drawable: MutableState<Drawable?>
+ val painter: MutableState<Painter?>
) : RequestListener {
- override fun onStateChanged(model: Any?, drawable: Drawable?, requestState: RequestState) {
+ override fun onStateChanged(model: Any?, painter: Painter?, requestState: RequestState) {
state.value = requestState
- this.drawable.value = drawable
+ this.painter.value = painter
}
}
@@ -311,15 +310,18 @@ private fun PreviewResourceOrDrawable(
contentDescription: String?,
modifier: Modifier,
) {
- val drawable =
+ val painter =
when (loading) {
- is Placeholder.OfDrawable -> loading.drawable
- is Placeholder.OfResourceId -> LocalContext.current.getDrawable(loading.resourceId)
+ is Placeholder.OfDrawable -> loading.drawable.toPainter()
+ is Placeholder.OfResourceId ->
+ LocalContext.current.getDrawable(loading.resourceId).toPainter()
+
+ is Placeholder.OfPainter -> loading.painter
is Placeholder.OfComposable ->
throw IllegalArgumentException("Composables should go through the production codepath")
}
Image(
- painter = remember(drawable) { drawable.toPainter() },
+ painter = painter,
modifier = modifier,
contentDescription = contentDescription,
)
@@ -349,6 +351,14 @@ public fun placeholder(@DrawableRes resourceId: Int): Placeholder =
Placeholder.OfResourceId(resourceId)
/**
+ * Used to specify a [Painter] to use in conjunction with [GlideImage]'s `loading` or `failure`
+ * parameters.
+ */
+@ExperimentalGlideComposeApi
+public fun placeholder(painter: Painter?): Placeholder =
+ Placeholder.OfPainter(painter ?: ColorPainter(Color.Transparent))
+
+/**
* Used to specify a [Composable] function to use in conjunction with [GlideImage]'s `loading` or
* `failure` parameter.
*
@@ -380,6 +390,8 @@ public fun placeholder(composable: @Composable () -> Unit): Placeholder =
public sealed class Placeholder {
internal class OfDrawable(internal val drawable: Drawable?) : Placeholder()
internal class OfResourceId(@DrawableRes internal val resourceId: Int) : Placeholder()
+
+ internal class OfPainter(internal val painter: Painter) : Placeholder()
internal class OfComposable(internal val composable: @Composable () -> Unit) : Placeholder()
internal fun isResourceOrDrawable() =
@@ -387,6 +399,7 @@ public sealed class Placeholder {
is OfDrawable -> true
is OfResourceId -> true
is OfComposable -> false
+ is OfPainter -> false
}
internal fun maybeComposable(): (@Composable () -> Unit)? =
@@ -395,6 +408,12 @@ public sealed class Placeholder {
else -> null
}
+ internal fun maybePainter() =
+ when (this) {
+ is OfPainter -> this.painter
+ else -> null
+ }
+
internal fun <T> apply(
resource: (Int) -> RequestBuilder<T>,
drawable: (Drawable?) -> RequestBuilder<T>