From 66d4c573dbddb937a1fc6e9dc4b4f973d1e86e30 Mon Sep 17 00:00:00 2001 From: ikits Date: Tue, 26 Dec 2023 22:08:33 +0300 Subject: [PATCH] ui --- .../devmenu/ui/components/ContextMenu.kt | 151 ++++++++++++++---- .../megboyzz/devmenu/ui/components/Files.kt | 18 +-- .../megboyzz/devmenu/ui/components/Shared.kt | 34 +++- devmenu/src/main/res/drawable/enter.xml | 9 ++ devmenu/src/main/res/drawable/hide.xml | 9 ++ devmenu/src/main/res/drawable/info.xml | 9 ++ devmenu/src/main/res/drawable/star.xml | 9 ++ devmenu/src/main/res/drawable/trash.xml | 9 ++ devmenu/src/main/res/drawable/unhide.xml | 9 ++ 9 files changed, 206 insertions(+), 51 deletions(-) create mode 100644 devmenu/src/main/res/drawable/enter.xml create mode 100644 devmenu/src/main/res/drawable/hide.xml create mode 100644 devmenu/src/main/res/drawable/info.xml create mode 100644 devmenu/src/main/res/drawable/star.xml create mode 100644 devmenu/src/main/res/drawable/trash.xml create mode 100644 devmenu/src/main/res/drawable/unhide.xml diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/ContextMenu.kt b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/ContextMenu.kt index ec41862..444eabf 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/ContextMenu.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/ContextMenu.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size @@ -15,10 +16,17 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.KeyboardArrowRight import androidx.compose.material.icons.outlined.Star +import androidx.compose.material3.Button import androidx.compose.material3.Divider import androidx.compose.material3.Icon +import androidx.compose.material3.OutlinedTextField +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -35,18 +43,20 @@ import com.megboyzz.devmenu.ui.asPainter fun ClickableMenuPosition( name: String, icon: Painter, - onClick: () -> Unit + onClick: () -> Unit = {}, + withEnd: Boolean = true ) { Row( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween, modifier = Modifier - .clickableWithRipple(onClick = onClick) + .clickableWithRipple(onClick = onClick, enabled = withEnd) + .padding(4.dp) .fillMaxWidth() ) { CoreMenuPosition(name = name, icon = icon) - Icon(Icons.Default.KeyboardArrowRight, null) + if (withEnd) Image(painter = R.drawable.enter.asPainter(), contentDescription = null) } } @@ -80,14 +90,12 @@ fun FsElementInContextMenu( horizontalArrangement = Arrangement.spacedBy(12.dp) ) { - val modifier = Modifier.size(32.dp).shadow(elevation = 6.dp) + val modifier = Modifier + .size(32.dp) + .clip(RoundedCornerShape(10.dp)) + .shadow(elevation = 6.dp) - when(type){ - ElementType.isHidden -> { Image(painter = R.drawable.icon_hidden_file.asPainter(), contentDescription = null, modifier) } - ElementType.isFile -> { Image(painter = R.drawable.icon_file.asPainter(), contentDescription = null, modifier) } - ElementType.isDir -> { Image(painter = R.drawable.icon_folder.asPainter(), contentDescription = null, modifier) } - ElementType.isReplaced -> { Image(painter = R.drawable.icon_replaced_file.asPainter(), contentDescription = null, modifier) } - } + FsElementIcon(type, modifier) Text( text = name ) @@ -99,37 +107,112 @@ fun FsElementInContextMenu( fun FileContextMenu( name: String, type: ElementType, + onRemoveElement: () -> Unit, + onUpdateType: (ElementType) -> Unit ) { + + var innerType by remember { mutableStateOf(type) } + var isMain by remember { mutableStateOf(true) } + CoreFileContextMenu { - Column( - verticalArrangement = Arrangement.spacedBy(20.dp) - ) { + Column(verticalArrangement = Arrangement.spacedBy(20.dp)) { FsElementInContextMenu(name = name, type = type) Divider() - ClickableMenuPosition( - name = "Заменить", - icon = rememberVectorPainter(image = Icons.Outlined.Star) - ) { + if (isMain) { + ClickableMenuPosition( + name = "Заменить", + icon = R.drawable.star.asPainter(), + onClick = { + innerType = ElementType.isReplaced + onUpdateType(innerType) + } + ) + ClickableMenuPosition( + name = "Скрыть для игры", + icon = R.drawable.hide.asPainter(), + onClick = { + innerType = ElementType.isHidden + } + ) + ClickableMenuPosition( + name = "Свойства", + icon = R.drawable.info.asPainter(), + onClick = {} + ) + ClickableMenuPosition( + name = "Удалить", + icon = R.drawable.trash.asPainter(), + onClick = { isMain = !isMain } + ) + }else{ + ClickableMenuPosition( + name = "Удалить", + icon = R.drawable.trash.asPainter(), + withEnd = false + ) + RemoveFileButtonsGroup( + onDelete = onRemoveElement, + onCancel = { isMain =! isMain } + ) } - ClickableMenuPosition( - name = "Заменить", - icon = rememberVectorPainter(image = Icons.Outlined.Star) - ) { + } + } +} - } - ClickableMenuPosition( - name = "Заменить", - icon = rememberVectorPainter(image = Icons.Outlined.Star) - ) { +@Composable +fun RemoveFileButtonsGroup( + onDelete: () -> Unit, + onCancel: () -> Unit +) { + Row( + horizontalArrangement = Arrangement.spacedBy(12.dp), + ) { + val m = Modifier.weight(1f) + RemoveButton(text = "Удалить", onClick = onDelete, modifier = m) + RemoveButton(text = "Отмена", onClick = onCancel, modifier = m) + } +} - } - ClickableMenuPosition( - name = "Заменить", - icon = rememberVectorPainter(image = Icons.Outlined.Star) +@Preview +@Composable +fun TwoButtonsRow() { + Surface( + modifier = Modifier.fillMaxWidth() + ) { + Row( + modifier = Modifier.fillMaxWidth(), + ) { + Button( + onClick = { /* Действие для первой кнопки */ }, + modifier = Modifier.weight(1f) // Каждая кнопка занимает равное количество места (50%) ) { - + // Ваш текст и стиль для первой кнопки } + + Button( + onClick = { /* Действие для второй кнопки */ }, + modifier = Modifier.weight(1f) // Каждая кнопка занимает равное количество места (50%) + ) { + // Ваш текст и стиль для второй кнопки + } + } + } +} + +@Composable +fun RemoveButton( + text: String, + modifier: Modifier = Modifier, + onClick: () -> Unit +) { + Row() { + Button( + onClick = onClick, + shape = RoundedCornerShape(10.dp), + modifier = modifier + ) { + Text(text = text) } } } @@ -146,7 +229,7 @@ fun CoreFileContextMenu( .background(Color.White) .clip(RoundedCornerShape(10.dp)), contentAlignment = Alignment.TopCenter - ){ + ) { Box( modifier = Modifier.padding( @@ -165,7 +248,9 @@ fun ClicablePreview() { FileContextMenu( name = "my_file.txt", - type = ElementType.isFile + type = ElementType.isFile, + onRemoveElement = {}, + onUpdateType = {} ) } \ No newline at end of file diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Files.kt b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Files.kt index 0bba91b..a512032 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Files.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Files.kt @@ -25,13 +25,6 @@ import com.megboyzz.devmenu.R import com.megboyzz.devmenu.ui.asPainter import com.megboyzz.devmenu.ui.theme.DevMenuTheme -enum class ElementType { - isHidden, - isReplaced, - isFile, - isDir -} - @Composable fun FsElement( name: String, @@ -48,15 +41,8 @@ fun FsElement( onLongClick = onLongPressClick ) ) { - when(type){ - ElementType.isHidden -> { Image(painter = R.drawable.icon_hidden_file.asPainter(), contentDescription = null) } - ElementType.isFile -> { Image(painter = R.drawable.icon_file.asPainter(), contentDescription = null) } - ElementType.isDir -> { Image(painter = R.drawable.icon_folder.asPainter(), contentDescription = null) } - ElementType.isReplaced -> { Image(painter = R.drawable.icon_replaced_file.asPainter(), contentDescription = null) } - } - Text( - text = name - ) + FsElementIcon(type = type) + Text(text = name) } } diff --git a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Shared.kt b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Shared.kt index 7b456c1..87db82e 100644 --- a/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Shared.kt +++ b/devmenu/src/main/java/com/megboyzz/devmenu/ui/components/Shared.kt @@ -2,24 +2,54 @@ package com.megboyzz.devmenu.ui.components import android.annotation.SuppressLint import androidx.compose.foundation.ExperimentalFoundationApi +import androidx.compose.foundation.Image import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.material.ripple.rememberRipple import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.Dp +import com.megboyzz.devmenu.R +import com.megboyzz.devmenu.ui.asPainter + +enum class ElementType { + isHidden, + isReplaced, + isFile, + isDir +} @SuppressLint("ModifierFactoryUnreferencedReceiver") @OptIn(ExperimentalFoundationApi::class) @Composable fun Modifier.clickableWithRipple( onClick: () -> Unit, - onLongClick: () -> Unit = {} + onLongClick: () -> Unit = {}, + enabled: Boolean = true ): Modifier { return Modifier.combinedClickable( + enabled = enabled, interactionSource = remember { MutableInteractionSource() }, indication = rememberRipple(), onClick = onClick, onLongClick = onLongClick ) -} \ No newline at end of file +} + +@Composable +fun FsElementIcon( + type: ElementType, + modifier: Modifier = Modifier +) { + + val painter = when(type){ + ElementType.isHidden -> R.drawable.icon_hidden_file.asPainter() + ElementType.isFile -> R.drawable.icon_file.asPainter() + ElementType.isDir -> R.drawable.icon_folder.asPainter() + ElementType.isReplaced -> R.drawable.icon_replaced_file.asPainter() + } + + Image(painter = painter, contentDescription = null, modifier) +} + diff --git a/devmenu/src/main/res/drawable/enter.xml b/devmenu/src/main/res/drawable/enter.xml new file mode 100644 index 0000000..661a8ce --- /dev/null +++ b/devmenu/src/main/res/drawable/enter.xml @@ -0,0 +1,9 @@ + + + diff --git a/devmenu/src/main/res/drawable/hide.xml b/devmenu/src/main/res/drawable/hide.xml new file mode 100644 index 0000000..3ab24c5 --- /dev/null +++ b/devmenu/src/main/res/drawable/hide.xml @@ -0,0 +1,9 @@ + + + diff --git a/devmenu/src/main/res/drawable/info.xml b/devmenu/src/main/res/drawable/info.xml new file mode 100644 index 0000000..3a8fdb5 --- /dev/null +++ b/devmenu/src/main/res/drawable/info.xml @@ -0,0 +1,9 @@ + + + diff --git a/devmenu/src/main/res/drawable/star.xml b/devmenu/src/main/res/drawable/star.xml new file mode 100644 index 0000000..4c7ae31 --- /dev/null +++ b/devmenu/src/main/res/drawable/star.xml @@ -0,0 +1,9 @@ + + + diff --git a/devmenu/src/main/res/drawable/trash.xml b/devmenu/src/main/res/drawable/trash.xml new file mode 100644 index 0000000..9abc031 --- /dev/null +++ b/devmenu/src/main/res/drawable/trash.xml @@ -0,0 +1,9 @@ + + + diff --git a/devmenu/src/main/res/drawable/unhide.xml b/devmenu/src/main/res/drawable/unhide.xml new file mode 100644 index 0000000..9e7bd16 --- /dev/null +++ b/devmenu/src/main/res/drawable/unhide.xml @@ -0,0 +1,9 @@ + + +