MainView.kt 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package org.mjdev.desktop.main
  2. import android.annotation.SuppressLint
  3. import androidx.compose.foundation.layout.Box
  4. import androidx.compose.foundation.layout.PaddingValues
  5. import androidx.compose.foundation.layout.fillMaxHeight
  6. import androidx.compose.foundation.layout.fillMaxSize
  7. import androidx.compose.foundation.layout.size
  8. import androidx.compose.foundation.layout.wrapContentSize
  9. import androidx.compose.runtime.Composable
  10. import androidx.compose.runtime.getValue
  11. import androidx.compose.ui.Alignment
  12. import androidx.compose.ui.Modifier
  13. import androidx.compose.ui.tooling.preview.Devices
  14. import androidx.compose.ui.tooling.preview.Preview
  15. import androidx.compose.ui.unit.dp
  16. import androidx.compose.ui.unit.max
  17. import org.mjdev.desktop.components.appsmenu.AppsMenu
  18. import org.mjdev.desktop.components.appsmenu.AppsMenuState.Companion.rememberAppsMenuState
  19. import org.mjdev.desktop.components.controlcenter.ControlCenter
  20. import org.mjdev.desktop.components.desktop.Desktop
  21. import org.mjdev.desktop.components.desktoppanel.DesktopPanel
  22. import org.mjdev.desktop.components.sliding.base.VisibilityState.Companion.rememberVisibilityState
  23. import org.mjdev.desktop.components.tooltip.TooltipState
  24. import org.mjdev.desktop.components.tooltip.rememberTooltipState
  25. import org.mjdev.desktop.context.DesktopContextScope.Companion.withDesktopContext
  26. import org.mjdev.desktop.extensions.Compose.isDesign
  27. import org.mjdev.desktop.extensions.Compose.preview
  28. import org.mjdev.desktop.extensions.LaunchedEffect.runAsync
  29. import org.mjdev.desktop.extensions.MutableStateExt.rememberCalculated
  30. import org.mjdev.desktop.components.desktop.widgets.MemoryChart
  31. @SuppressLint("ComposableNaming")
  32. @Composable
  33. fun MainView() = withDesktopContext {
  34. val tooltipState: TooltipState = rememberTooltipState()
  35. val appsMenuState = rememberAppsMenuState(
  36. visible = isDesign
  37. )
  38. val controlCenterState = rememberVisibilityState(
  39. visible = isDesign
  40. )
  41. val panelState = rememberVisibilityState(
  42. visible = isDesign || !panelAutoHideEnabled,
  43. enabled = panelAutoHideEnabled,
  44. autoHideDelay = panelHideDelay
  45. )
  46. val bottomPadding by rememberCalculated(
  47. panelState.enabled, panelState.height
  48. ) {
  49. if (panelState.enabled) 0.dp
  50. else max(0.dp, panelState.height)
  51. }
  52. // val installWindowState = rememberVisibilityState()
  53. // val infoWindowState = rememberVisibilityState(false) //(api.isFirstStart || api.isDebug) // todo
  54. val onTooltip: (item: Any?) -> Unit = { item ->
  55. println("Showing tooltip : $item")
  56. tooltipState.show(item)
  57. }
  58. // todo not showing nothing
  59. Box(
  60. modifier = Modifier.fillMaxSize(),
  61. contentAlignment = Alignment.Center
  62. ) {
  63. // todo, something prevent preview
  64. if (!isDesign) {
  65. Desktop(
  66. tooltipState = tooltipState,
  67. onTooltip = onTooltip,
  68. padding = PaddingValues(
  69. bottom = bottomPadding
  70. ),
  71. widgets = {
  72. MemoryChart(
  73. modifier = Modifier
  74. .size(350.dp, 300.dp)
  75. .align(Alignment.BottomEnd)
  76. )
  77. }, onLeftMouseClick = {
  78. runAsync {
  79. panelState.hide()
  80. appsMenuState.hide()
  81. controlCenterState.hide()
  82. }
  83. }, onRightMouseClick = {
  84. // contextMenuState.show()
  85. })
  86. }
  87. DesktopPanel(panelState = panelState, onTooltip = onTooltip, onMenuIconClicked = {
  88. runAsync {
  89. appsMenuState.show()
  90. }
  91. })
  92. ControlCenter(
  93. modifier = Modifier
  94. .fillMaxHeight()
  95. .align(Alignment.TopEnd),
  96. controlCenterState = controlCenterState,
  97. onTooltip = onTooltip,
  98. )
  99. AppsMenu(
  100. modifier = Modifier
  101. .wrapContentSize()
  102. .align(Alignment.BottomStart),
  103. appsMenuState = appsMenuState,
  104. panelState = panelState,
  105. onAppClick = { app ->
  106. runAsync {
  107. app.start()
  108. appsMenuState.hide()
  109. }
  110. },
  111. onAppContextMenuClick = {},
  112. onCategoryContextMenuClick = {},
  113. onUserAvatarClick = {},
  114. onActionClick = {},
  115. onTooltip = onTooltip,
  116. )
  117. }
  118. }
  119. @Preview(device = Devices.TABLET)
  120. @Composable
  121. fun MainViewPreview() = preview {
  122. MainView()
  123. }