FolderIcon.kt 3.4 KB

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