ContextMenu.kt 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package eu.mjdev.desktop.components.menu
  2. import androidx.compose.foundation.background
  3. import androidx.compose.foundation.shape.RoundedCornerShape
  4. import androidx.compose.material.CursorDropdownMenu
  5. import androidx.compose.material.DropdownMenuItem
  6. import androidx.compose.material.Text
  7. import androidx.compose.runtime.Composable
  8. import androidx.compose.runtime.MutableState
  9. import androidx.compose.runtime.key
  10. import androidx.compose.runtime.mutableStateOf
  11. import androidx.compose.ui.Modifier
  12. import androidx.compose.ui.graphics.Color
  13. import androidx.compose.ui.unit.dp
  14. import eu.mjdev.desktop.extensions.Compose.SuperDarkGray
  15. // todo
  16. @Composable
  17. fun ContextMenu(
  18. backgroundColor: Color = Color.SuperDarkGray,
  19. textColor: Color = Color.White,
  20. contextMenuState: ContextMenuState,
  21. onShow: () -> Unit = {},
  22. onHide: () -> Unit = {},
  23. onMenuItemClick: (item: String) -> Unit = {}
  24. ) = listOf(
  25. contextMenuState.menuRenderCount,
  26. contextMenuState.menuRenderCount.value - 1
  27. ).forEach { renderId ->
  28. val isActive = renderId == contextMenuState.menuRenderCount
  29. key(renderId) {
  30. CursorDropdownMenu(
  31. modifier = Modifier.background(color = backgroundColor, shape = RoundedCornerShape(16.dp)),
  32. expanded = contextMenuState.menuExpanded.value && isActive,
  33. onDismissRequest = {
  34. if (isActive) {
  35. contextMenuState.menuRenderCount.value += 1
  36. contextMenuState.menuExpanded.value = false
  37. }
  38. },
  39. ) {
  40. contextMenuState.items.forEach { item ->
  41. DropdownMenuItem(
  42. content = {
  43. Text(
  44. text = item,
  45. color = textColor
  46. )
  47. },
  48. onClick = {
  49. onMenuItemClick(item)
  50. contextMenuState.hide()
  51. }
  52. )
  53. }
  54. }
  55. }
  56. }
  57. class ContextMenuState(
  58. val menuExpanded: MutableState<Boolean> = mutableStateOf(false),
  59. val menuRenderCount: MutableState<Int> = mutableStateOf(0),
  60. val items: List<String> = listOf<String>()
  61. ) {
  62. fun show() {
  63. menuExpanded.value = true
  64. }
  65. fun hide() {
  66. menuExpanded.value = false
  67. }
  68. companion object {
  69. @Composable
  70. fun rememberContextMenuState(vararg items: String) =
  71. ContextMenuState(
  72. items = items.asList()
  73. )
  74. }
  75. }