Use forwardingPainter to add colour to placeholder graphics

This commit is contained in:
Kgothatso Ngako
2026-04-21 03:15:32 +02:00
parent 6f8fa45685
commit ef4c5a592c
3 changed files with 78 additions and 3 deletions

View File

@@ -0,0 +1,60 @@
package ac.aux.compose.ui.composable.widgets.coil
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.DefaultAlpha
import androidx.compose.ui.graphics.drawscope.DrawScope
import androidx.compose.ui.graphics.painter.Painter
/**
* https://gist.github.com/colinrtwhite/c2966e0b8584b4cdf0a5b05786b20ae1
*/
fun forwardingPainter(
painter: Painter,
alpha: Float = DefaultAlpha,
colorFilter: ColorFilter? = null,
onDraw: DrawScope.(ForwardingDrawInfo) -> Unit = DefaultOnDraw,
): Painter = ForwardingPainter(painter, alpha, colorFilter, onDraw)
data class ForwardingDrawInfo(
val painter: Painter,
val alpha: Float,
val colorFilter: ColorFilter?,
)
private class ForwardingPainter(
private val painter: Painter,
private var alpha: Float,
private var colorFilter: ColorFilter?,
private val onDraw: DrawScope.(ForwardingDrawInfo) -> Unit,
) : Painter() {
private var info = newInfo()
override val intrinsicSize get() = painter.intrinsicSize
override fun applyAlpha(alpha: Float): Boolean {
if (alpha != DefaultAlpha) {
this.alpha = alpha
this.info = newInfo()
}
return true
}
override fun applyColorFilter(colorFilter: ColorFilter?): Boolean {
if (colorFilter != null) {
this.colorFilter = colorFilter
this.info = newInfo()
}
return true
}
override fun DrawScope.onDraw() = onDraw(info)
private fun newInfo() = ForwardingDrawInfo(painter, alpha, colorFilter)
}
private val DefaultOnDraw: DrawScope.(ForwardingDrawInfo) -> Unit = { info ->
with(info.painter) {
draw(size, info.alpha, info.colorFilter)
}
}

View File

@@ -30,6 +30,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.BiasAbsoluteAlignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
@@ -130,6 +131,7 @@ private fun TextNoteFeedItem(
horizontalArrangement = Arrangement.End,
verticalAlignment = Alignment.CenterVertically
) {
// TODO: If we don't have the name of the author being replied too we shouldn't show this..
Text(
"In reply to ",
style = MaterialTheme.typography.labelSmall
@@ -146,6 +148,7 @@ private fun TextNoteFeedItem(
)
}
}
ElevatedCard(
modifier = Modifier.padding(
horizontal = 10.dp

View File

@@ -1,6 +1,7 @@
package ac.aux.compose.ui.composable.widgets.profile
import ac.aux.compose.database.model.Profile
import ac.aux.compose.ui.composable.widgets.coil.forwardingPainter
import ac.aux.compose.ui.theme.AuxTheme
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
@@ -16,6 +17,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ColorFilter
import androidx.compose.ui.graphics.vector.rememberVectorPainter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.tooling.preview.Preview
@@ -44,9 +46,19 @@ fun ProfileAvatar(publicKey: String, profile: Profile?) {
)
} else {
// Load image...
val placeHolderGraphic = rememberVectorPainter(Icons.Default.Face5)
val fallbackGraphic = rememberVectorPainter(Icons.Default.Face5)
val errorGraphic = rememberVectorPainter(Icons.Default.FaceRetouchingOff)
val placeHolderGraphic = forwardingPainter(
painter = rememberVectorPainter(Icons.Default.Face5),
colorFilter = ColorFilter.tint(tintColor)
)
val fallbackGraphic = forwardingPainter(
painter = rememberVectorPainter(Icons.Default.Face5),
colorFilter = ColorFilter.tint(tintColor)
)
val errorGraphic = forwardingPainter(
painter = rememberVectorPainter(Icons.Default.FaceRetouchingOff),
colorFilter = ColorFilter.tint(tintColor)
)
AsyncImage(
model = profile.picture,