Kaynağa Gözat

context menu

milan jurkulák 2 yıl önce
ebeveyn
işleme
81db9592ad

+ 75 - 0
src/main/kotlin/eu/mjdev/desktop/components/menu/ContextMenu.kt

@@ -0,0 +1,75 @@
+package eu.mjdev.desktop.components.menu
+
+import androidx.compose.foundation.background
+import androidx.compose.material.CursorDropdownMenu
+import androidx.compose.material.DropdownMenuItem
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.MutableState
+import androidx.compose.runtime.key
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import eu.mjdev.desktop.extensions.Compose.SuperDarkGray
+
+@Composable
+fun ContextMenu(
+    backgroundColor: Color = Color.SuperDarkGray,
+    textColor: Color = Color.White,
+    contextMenuState: ContextMenuState,
+    onMenuItemClick: (item: String) -> Unit = {}
+) = listOf(
+    contextMenuState.menuRenderCount,
+    contextMenuState.menuRenderCount.value - 1
+).forEach { renderId ->
+    val isActive = renderId == contextMenuState.menuRenderCount
+    key(renderId) {
+        CursorDropdownMenu(
+            modifier = Modifier.background(backgroundColor),
+            expanded = contextMenuState.menuExpanded.value && isActive,
+            onDismissRequest = {
+                if (isActive) {
+                    contextMenuState.menuRenderCount.value += 1
+                    contextMenuState.menuExpanded.value = false
+                }
+            },
+        ) {
+            contextMenuState.items.forEach { item ->
+                DropdownMenuItem(
+                    content = {
+                        Text(
+                            text = item,
+                            color = textColor
+                        )
+                    },
+                    onClick = {
+                        onMenuItemClick(item)
+                        contextMenuState.hide()
+                    }
+                )
+            }
+        }
+    }
+}
+
+class ContextMenuState(
+    val menuExpanded: MutableState<Boolean> = mutableStateOf(false),
+    val menuRenderCount: MutableState<Int> = mutableStateOf(0),
+    val items: List<String> = listOf<String>()
+) {
+    fun show() {
+        menuExpanded.value = true
+    }
+
+    fun hide() {
+        menuExpanded.value = false
+    }
+
+    companion object {
+        @Composable
+        fun rememberContextMenuState(vararg items: String) =
+            ContextMenuState(
+                items = items.asList()
+            )
+    }
+}

+ 1 - 1
src/main/kotlin/eu/mjdev/desktop/provider/data/Theme.kt

@@ -90,7 +90,7 @@ class Theme(
             controlCenterIconSize = DpSize(32.dp, 32.dp),
             controlCenterBackgroundAlpha = 0.8f,
 
-            backgroundRotationDelay = 10000
+            backgroundRotationDelay = 60000
         )
     }
 }

+ 22 - 8
src/main/kotlin/eu/mjdev/desktop/windows/MainWindow.kt

@@ -1,22 +1,26 @@
 package eu.mjdev.desktop.windows
 
 import androidx.compose.desktop.ui.tooling.preview.Preview
+import androidx.compose.foundation.ExperimentalFoundationApi
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.Box
 import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.mouseClickable
 import androidx.compose.runtime.Composable
-import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.Modifier
-import androidx.compose.ui.input.pointer.PointerEventType
-import androidx.compose.ui.input.pointer.onPointerEvent
+import androidx.compose.ui.input.pointer.isSecondaryPressed
+import eu.mjdev.dadb.helpers.log
 import eu.mjdev.desktop.components.background.BackgroundImage
+import eu.mjdev.desktop.components.menu.ContextMenu
+import eu.mjdev.desktop.components.menu.ContextMenuState
+import eu.mjdev.desktop.components.menu.ContextMenuState.Companion.rememberContextMenuState
 import eu.mjdev.desktop.components.slidemenu.VisibilityState
 import eu.mjdev.desktop.helpers.Palette
 import eu.mjdev.desktop.helpers.Palette.Companion.rememberPalette
 import eu.mjdev.desktop.provider.DesktopProvider
 import eu.mjdev.desktop.provider.DesktopProvider.Companion.LocalDesktop
 
-@OptIn(ExperimentalComposeUiApi::class)
+@OptIn(ExperimentalFoundationApi::class)
 @Suppress("FunctionName")
 @Preview
 @Composable
@@ -26,6 +30,8 @@ fun MainWindow(
     menuState: VisibilityState,
     api: DesktopProvider = LocalDesktop.current,
     palette: Palette = rememberPalette(api.currentUser.theme.backgroundColor),
+    onDesktopMenuShow: () -> Unit = {},
+    contextMenuState: ContextMenuState = rememberContextMenuState("item1", "item2"),
     content: @Composable () -> Unit = {}
 ) = FullScreenWindow {
     Box(
@@ -36,10 +42,14 @@ fun MainWindow(
         BackgroundImage(
             modifier = Modifier
                 .fillMaxSize()
-                .onPointerEvent(PointerEventType.Press) {
-                    panelState.hide()
-                    menuState.hide()
-                    controlCenterState.hide()
+                .mouseClickable {
+                    if (buttons.isSecondaryPressed) {
+                        contextMenuState.show()
+                    } else {
+                        panelState.hide()
+                        menuState.hide()
+                        controlCenterState.hide()
+                    }
                 },
             backgroundColor = api.currentUser.theme.backgroundColor,
             backgrounds = api.appsProvider.backgrounds + api.currentUser.config.desktopBackgroundUrls,
@@ -55,6 +65,10 @@ fun MainWindow(
 //        )
         content()
     }
+    ContextMenu(
+        contextMenuState = contextMenuState,
+        onMenuItemClick = { item -> log { "Context menu : $item" } }
+    )
 //    launchedEffect {
 //        runCatching {
 //            Notification("Hello!", "I just wanted to say hello :)").apply {