FolderIcon.kt 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package eu.mjdev.desktop.components.file
  2. import androidx.compose.desktop.ui.tooling.preview.Preview
  3. import androidx.compose.foundation.layout.*
  4. import androidx.compose.runtime.Composable
  5. import androidx.compose.runtime.remember
  6. import androidx.compose.ui.Modifier
  7. import androidx.compose.ui.text.font.FontWeight
  8. import androidx.compose.ui.text.style.TextAlign
  9. import androidx.compose.ui.text.style.TextOverflow.Companion.Ellipsis
  10. import androidx.compose.ui.unit.DpSize
  11. import androidx.compose.ui.unit.dp
  12. import eu.mjdev.desktop.components.draggable.DraggableView
  13. import eu.mjdev.desktop.components.fonticon.FontIcon
  14. import eu.mjdev.desktop.components.text.TextWithShadow
  15. import eu.mjdev.desktop.extensions.ColorUtils.alpha
  16. import eu.mjdev.desktop.extensions.Compose.preview
  17. import eu.mjdev.desktop.extensions.Custom.plus
  18. import eu.mjdev.desktop.extensions.Modifier.circleBorder
  19. import eu.mjdev.desktop.provider.DesktopScope.Companion.withDesktopScope
  20. import java.io.File
  21. @Suppress("FunctionName", "UNNECESSARY_SAFE_CALL")
  22. @Composable
  23. fun FolderIcon(
  24. path: File = File("/"),
  25. customName: String? = null,
  26. dragEnabled: Boolean = true,
  27. iconSize: DpSize = DpSize(128.dp, 128.dp),
  28. modifier: Modifier = Modifier,
  29. onDragStart: () -> Unit = {},
  30. onDragEnd: () -> Unit = {},
  31. onContextMenuClick: () -> Unit = {},
  32. onClick: () -> Unit = {},
  33. ) = withDesktopScope {
  34. val iconName = remember(path) {
  35. when {
  36. path.absolutePath?.contentEquals("/") == true -> "root"
  37. path.absolutePath?.contentEquals("~") == true -> "home"
  38. else -> path.extension.ifEmpty { "folder" }
  39. }
  40. } // todo from mime type
  41. val iconId: Int = remember(path) { iconSet.iconForName(iconName) ?: "?".toInt() }
  42. val computedSize = remember(path) { iconSize + 2.dp }
  43. DraggableView(
  44. modifier = modifier,
  45. dragEnabled = dragEnabled,
  46. onClick = onClick,
  47. onContextMenuClick = onContextMenuClick,
  48. onDragStart = onDragStart,
  49. onDragEnd = onDragEnd
  50. ) {
  51. Column(
  52. modifier = Modifier.wrapContentSize()
  53. ) {
  54. Box(
  55. modifier = Modifier.size(computedSize)
  56. .circleBorder(2.dp, textColor)
  57. ) {
  58. FontIcon(
  59. iconId = iconId,
  60. iconSize = iconSize,
  61. iconColor = textColor,
  62. iconBackgroundColor = iconsTintColor.alpha(0.4f),
  63. outerPadding = PaddingValues(8.dp),
  64. innerPadding = PaddingValues(8.dp),
  65. onClick = onClick,
  66. onRightClick = onContextMenuClick
  67. )
  68. }
  69. TextWithShadow(
  70. modifier = Modifier.width(computedSize.width)
  71. .padding(start = 4.dp),
  72. text = (customName ?: path.name).orEmpty().ifEmpty { iconName },
  73. color = textColor,
  74. fontWeight = FontWeight.Bold,
  75. overflow = Ellipsis,
  76. minLines = 2,
  77. maxLines = 2,
  78. textAlign = TextAlign.Center
  79. )
  80. }
  81. }
  82. }
  83. @Preview
  84. @Composable
  85. fun FolderIconPreview() = preview {
  86. FolderIcon()
  87. }