MainView.kt 5.3 KB

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