ImageAny.kt 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package eu.mjdev.desktop.components.image
  2. import androidx.compose.runtime.Composable
  3. import androidx.compose.ui.Alignment
  4. import androidx.compose.ui.Modifier
  5. import androidx.compose.ui.graphics.ColorFilter
  6. import androidx.compose.ui.graphics.DefaultAlpha
  7. import androidx.compose.ui.graphics.FilterQuality
  8. import androidx.compose.ui.graphics.drawscope.DrawScope.Companion.DefaultFilterQuality
  9. import androidx.compose.ui.graphics.vector.ImageVector
  10. import androidx.compose.ui.layout.ContentScale
  11. import coil3.compose.AsyncImage
  12. import eu.mjdev.desktop.components.video.VideoPlayerView
  13. import eu.mjdev.desktop.extensions.Compose.asyncImageLoader
  14. import eu.mjdev.desktop.provider.DesktopProvider
  15. import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
  16. import androidx.compose.foundation.Image as ComposeImage
  17. @Suppress("FunctionName")
  18. @Composable
  19. fun ImageAny(
  20. src: Any?,
  21. api: DesktopProvider = LocalDesktop.current,
  22. contentDescription: String? = "",
  23. modifier: Modifier = Modifier,
  24. alignment: Alignment = Alignment.Center,
  25. contentScale: ContentScale = ContentScale.Fit,
  26. alpha: Float = DefaultAlpha,
  27. colorFilter: ColorFilter? = null,
  28. filterQuality: FilterQuality = DefaultFilterQuality,
  29. onLoading: () -> Unit = {},
  30. onFail: (error: Throwable) -> Unit = {}
  31. ) {
  32. val isVideo = src.toString().trim().let {
  33. it.endsWith(".gif") || it.endsWith(".mp4") || it.endsWith(".mpg")
  34. }
  35. when {
  36. isVideo -> VideoPlayerView(
  37. modifier = modifier,
  38. src = src,
  39. alignment = alignment,
  40. alpha = alpha,
  41. contentDescription = contentDescription,
  42. colorFilter = colorFilter,
  43. contentScale = contentScale
  44. )
  45. src is ImageVector -> ComposeImage(
  46. modifier = modifier,
  47. imageVector = src,
  48. alignment = alignment,
  49. alpha = alpha,
  50. contentDescription = contentDescription,
  51. colorFilter = colorFilter,
  52. contentScale = contentScale
  53. )
  54. else -> AsyncImage(
  55. modifier = modifier,
  56. model = src,
  57. contentDescription = contentDescription,
  58. contentScale = contentScale,
  59. filterQuality = filterQuality,
  60. imageLoader = api.imageLoader ?: asyncImageLoader(),
  61. onError = {
  62. onFail(it.result.throwable)
  63. },
  64. onLoading = {
  65. onLoading()
  66. },
  67. )
  68. }
  69. }