AppsMenuApp.kt 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package eu.mjdev.desktop.components.appsmenu
  2. import androidx.compose.desktop.ui.tooling.preview.Preview
  3. import androidx.compose.foundation.background
  4. import androidx.compose.foundation.layout.*
  5. import androidx.compose.material.Divider
  6. import androidx.compose.runtime.Composable
  7. import androidx.compose.runtime.remember
  8. import androidx.compose.ui.Alignment
  9. import androidx.compose.ui.Modifier
  10. import androidx.compose.ui.graphics.Color
  11. import androidx.compose.ui.text.font.FontWeight
  12. import androidx.compose.ui.unit.*
  13. import eu.mjdev.desktop.components.fonticon.FontIcon
  14. import eu.mjdev.desktop.components.text.TextAny
  15. import eu.mjdev.desktop.data.App
  16. import eu.mjdev.desktop.extensions.Compose.onLeftClick
  17. import eu.mjdev.desktop.extensions.Compose.onMousePress
  18. import eu.mjdev.desktop.extensions.Compose.onRightClick
  19. import eu.mjdev.desktop.extensions.Modifier.circleBorder
  20. import eu.mjdev.desktop.helpers.shape.DottedShape
  21. import eu.mjdev.desktop.provider.DesktopScope.Companion.withDesktopScope
  22. @Suppress("FunctionName")
  23. @Composable
  24. fun AppsMenuApp(
  25. modifier: Modifier = Modifier,
  26. app: App? = null,
  27. icon: String? = null,
  28. iconSize: DpSize = DpSize(32.dp, 32.dp),
  29. titleTextSize: TextUnit = 16.sp,
  30. commentTextSize: TextUnit = 12.sp,
  31. showDivider: Boolean = true,
  32. dividerPadding: Dp = 48.dp,
  33. dividerColor: Color = Color.Black,
  34. onContextMenuClick: () -> Unit = {},
  35. onClick: () -> Unit = {},
  36. ) = withDesktopScope {
  37. val appIconName = remember(app, icon) { app?.name ?: icon }
  38. val materialIcon = remember(appIconName) { iconSet.iconForName(appIconName) ?: "?".toInt() }
  39. Column(
  40. modifier = modifier.onMousePress {
  41. onLeftClick { onClick() }
  42. onRightClick { onContextMenuClick() }
  43. }
  44. ) {
  45. Row(
  46. verticalAlignment = Alignment.CenterVertically,
  47. ) {
  48. FontIcon(
  49. modifier = Modifier.circleBorder(1.dp, iconsTintColor),
  50. iconId = materialIcon,
  51. iconSize = iconSize,
  52. iconColor = textColor,
  53. iconBackgroundColor = backgroundColor,
  54. outerPadding = PaddingValues(2.dp),
  55. innerPadding = PaddingValues(0.dp),
  56. )
  57. Column(
  58. Modifier.padding(4.dp).fillMaxWidth()
  59. ) {
  60. TextAny(
  61. text = app?.name ?: app?.fullAppName ?: "",
  62. color = textColor,
  63. singleLine = true,
  64. fontSize = titleTextSize,
  65. fontWeight = FontWeight.Bold
  66. )
  67. TextAny(
  68. text = app?.comment ?: "-",
  69. color = textColor,
  70. singleLine = true,
  71. fontSize = commentTextSize,
  72. fontWeight = FontWeight.Bold
  73. )
  74. }
  75. }
  76. if (showDivider) {
  77. Divider(
  78. modifier = Modifier.fillMaxWidth()
  79. .padding(start = dividerPadding)
  80. .height(1.dp)
  81. .background(
  82. color = dividerColor,
  83. shape = DottedShape(5.dp)
  84. ),
  85. color = Color.Transparent
  86. )
  87. }
  88. }
  89. }
  90. @Preview
  91. @Composable
  92. fun AppsMenuAppPreview() = AppsMenuApp()