This commit is contained in:
2023-12-26 22:08:33 +03:00
parent 34ce33f4a3
commit 66d4c573db
9 changed files with 206 additions and 51 deletions
@@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size 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.Icons
import androidx.compose.material.icons.filled.KeyboardArrowRight import androidx.compose.material.icons.filled.KeyboardArrowRight
import androidx.compose.material.icons.outlined.Star import androidx.compose.material.icons.outlined.Star
import androidx.compose.material3.Button
import androidx.compose.material3.Divider import androidx.compose.material3.Divider
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable 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.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.clip
@@ -35,18 +43,20 @@ import com.megboyzz.devmenu.ui.asPainter
fun ClickableMenuPosition( fun ClickableMenuPosition(
name: String, name: String,
icon: Painter, icon: Painter,
onClick: () -> Unit onClick: () -> Unit = {},
withEnd: Boolean = true
) { ) {
Row( Row(
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceBetween, horizontalArrangement = Arrangement.SpaceBetween,
modifier = Modifier modifier = Modifier
.clickableWithRipple(onClick = onClick) .clickableWithRipple(onClick = onClick, enabled = withEnd)
.padding(4.dp)
.fillMaxWidth() .fillMaxWidth()
) { ) {
CoreMenuPosition(name = name, icon = icon) 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) 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){ FsElementIcon(type, modifier)
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) }
}
Text( Text(
text = name text = name
) )
@@ -99,41 +107,116 @@ fun FsElementInContextMenu(
fun FileContextMenu( fun FileContextMenu(
name: String, name: String,
type: ElementType, type: ElementType,
onRemoveElement: () -> Unit,
onUpdateType: (ElementType) -> Unit
) { ) {
var innerType by remember { mutableStateOf(type) }
var isMain by remember { mutableStateOf(true) }
CoreFileContextMenu { CoreFileContextMenu {
Column( Column(verticalArrangement = Arrangement.spacedBy(20.dp)) {
verticalArrangement = Arrangement.spacedBy(20.dp)
) {
FsElementInContextMenu(name = name, type = type) FsElementInContextMenu(name = name, type = type)
Divider() Divider()
if (isMain) {
ClickableMenuPosition( ClickableMenuPosition(
name = "Заменить", name = "Заменить",
icon = rememberVectorPainter(image = Icons.Outlined.Star) icon = R.drawable.star.asPainter(),
) { onClick = {
innerType = ElementType.isReplaced
onUpdateType(innerType)
} }
)
ClickableMenuPosition( ClickableMenuPosition(
name = "Заменить", name = "Скрыть для игры",
icon = rememberVectorPainter(image = Icons.Outlined.Star) icon = R.drawable.hide.asPainter(),
) { onClick = {
innerType = ElementType.isHidden
} }
)
ClickableMenuPosition( ClickableMenuPosition(
name = "Заменить", name = "Свойства",
icon = rememberVectorPainter(image = Icons.Outlined.Star) icon = R.drawable.info.asPainter(),
) { onClick = {}
)
}
ClickableMenuPosition( ClickableMenuPosition(
name = "Заменить", name = "Удалить",
icon = rememberVectorPainter(image = Icons.Outlined.Star) icon = R.drawable.trash.asPainter(),
) { onClick = { isMain = !isMain }
)
}else{
ClickableMenuPosition(
name = "Удалить",
icon = R.drawable.trash.asPainter(),
withEnd = false
)
RemoveFileButtonsGroup(
onDelete = onRemoveElement,
onCancel = { isMain =! isMain }
)
} }
} }
} }
} }
@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)
}
}
@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)
}
}
}
@Composable @Composable
fun CoreFileContextMenu( fun CoreFileContextMenu(
content: @Composable BoxScope.() -> Unit content: @Composable BoxScope.() -> Unit
@@ -146,7 +229,7 @@ fun CoreFileContextMenu(
.background(Color.White) .background(Color.White)
.clip(RoundedCornerShape(10.dp)), .clip(RoundedCornerShape(10.dp)),
contentAlignment = Alignment.TopCenter contentAlignment = Alignment.TopCenter
){ ) {
Box( Box(
modifier = Modifier.padding( modifier = Modifier.padding(
@@ -165,7 +248,9 @@ fun ClicablePreview() {
FileContextMenu( FileContextMenu(
name = "my_file.txt", name = "my_file.txt",
type = ElementType.isFile type = ElementType.isFile,
onRemoveElement = {},
onUpdateType = {}
) )
} }
@@ -25,13 +25,6 @@ import com.megboyzz.devmenu.R
import com.megboyzz.devmenu.ui.asPainter import com.megboyzz.devmenu.ui.asPainter
import com.megboyzz.devmenu.ui.theme.DevMenuTheme import com.megboyzz.devmenu.ui.theme.DevMenuTheme
enum class ElementType {
isHidden,
isReplaced,
isFile,
isDir
}
@Composable @Composable
fun FsElement( fun FsElement(
name: String, name: String,
@@ -48,15 +41,8 @@ fun FsElement(
onLongClick = onLongPressClick onLongClick = onLongPressClick
) )
) { ) {
when(type){ FsElementIcon(type = type)
ElementType.isHidden -> { Image(painter = R.drawable.icon_hidden_file.asPainter(), contentDescription = null) } Text(text = name)
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
)
} }
} }
@@ -2,24 +2,54 @@ package com.megboyzz.devmenu.ui.components
import android.annotation.SuppressLint import android.annotation.SuppressLint
import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.combinedClickable import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.material.ripple.rememberRipple import androidx.compose.material.ripple.rememberRipple
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Modifier 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") @SuppressLint("ModifierFactoryUnreferencedReceiver")
@OptIn(ExperimentalFoundationApi::class) @OptIn(ExperimentalFoundationApi::class)
@Composable @Composable
fun Modifier.clickableWithRipple( fun Modifier.clickableWithRipple(
onClick: () -> Unit, onClick: () -> Unit,
onLongClick: () -> Unit = {} onLongClick: () -> Unit = {},
enabled: Boolean = true
): Modifier { ): Modifier {
return Modifier.combinedClickable( return Modifier.combinedClickable(
enabled = enabled,
interactionSource = remember { MutableInteractionSource() }, interactionSource = remember { MutableInteractionSource() },
indication = rememberRipple(), indication = rememberRipple(),
onClick = onClick, onClick = onClick,
onLongClick = onLongClick onLongClick = onLongClick
) )
} }
@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)
}
+9
View File
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="12dp"
android:height="12dp"
android:viewportWidth="12"
android:viewportHeight="12">
<path
android:pathData="M3.45,10.613C3.358,10.512 3.311,10.396 3.306,10.262C3.302,10.129 3.35,10.012 3.45,9.913L7.388,5.975L3.45,2.038C3.358,1.946 3.311,1.831 3.306,1.694C3.302,1.556 3.35,1.438 3.45,1.338C3.542,1.238 3.656,1.185 3.794,1.181C3.931,1.177 4.05,1.225 4.15,1.325L8.538,5.713C8.579,5.754 8.608,5.796 8.625,5.838C8.642,5.879 8.65,5.925 8.65,5.975C8.65,6.025 8.642,6.071 8.625,6.113C8.608,6.154 8.579,6.196 8.538,6.238L4.15,10.625C4.058,10.717 3.944,10.762 3.806,10.762C3.669,10.762 3.55,10.712 3.45,10.613Z"
android:fillColor="#1B3D54"/>
</vector>
+9
View File
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M16.1,13.3L14.65,11.85C14.8,11.067 14.575,10.333 13.975,9.65C13.375,8.967 12.6,8.7 11.65,8.85L10.2,7.4C10.483,7.267 10.771,7.167 11.063,7.1C11.354,7.033 11.667,7 12,7C13.25,7 14.313,7.437 15.188,8.312C16.063,9.187 16.5,10.25 16.5,11.5C16.5,11.833 16.467,12.146 16.4,12.438C16.333,12.729 16.233,13.017 16.1,13.3ZM19.3,16.45L17.85,15.05C18.483,14.567 19.046,14.038 19.538,13.462C20.029,12.887 20.45,12.233 20.8,11.5C19.967,9.817 18.771,8.479 17.212,7.487C15.654,6.496 13.917,6 12,6C11.517,6 11.042,6.033 10.575,6.1C10.108,6.167 9.65,6.267 9.2,6.4L7.65,4.85C8.333,4.567 9.033,4.354 9.75,4.212C10.467,4.071 11.217,4 12,4C14.517,4 16.758,4.696 18.725,6.087C20.692,7.479 22.117,9.283 23,11.5C22.617,12.483 22.112,13.396 21.487,14.238C20.862,15.079 20.133,15.817 19.3,16.45ZM19.8,22.6L15.6,18.45C15.017,18.633 14.429,18.771 13.837,18.862C13.246,18.954 12.633,19 12,19C9.483,19 7.242,18.304 5.275,16.913C3.308,15.521 1.883,13.717 1,11.5C1.35,10.617 1.792,9.796 2.325,9.037C2.858,8.279 3.467,7.6 4.15,7L1.4,4.2L2.8,2.8L21.2,21.2L19.8,22.6ZM5.55,8.4C5.067,8.833 4.625,9.308 4.225,9.825C3.825,10.342 3.483,10.9 3.2,11.5C4.033,13.183 5.229,14.521 6.787,15.512C8.346,16.504 10.083,17 12,17C12.333,17 12.658,16.979 12.975,16.938C13.292,16.896 13.617,16.85 13.95,16.8L13.05,15.85C12.867,15.9 12.692,15.938 12.525,15.962C12.358,15.988 12.183,16 12,16C10.75,16 9.688,15.563 8.813,14.688C7.938,13.813 7.5,12.75 7.5,11.5C7.5,11.317 7.512,11.142 7.537,10.975C7.563,10.808 7.6,10.633 7.65,10.45L5.55,8.4Z"
android:fillColor="#1B3D54"/>
</vector>
+9
View File
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M11,17H13V11H11V17ZM12,9C12.283,9 12.521,8.904 12.712,8.712C12.904,8.521 13,8.283 13,8C13,7.717 12.904,7.479 12.712,7.287C12.521,7.096 12.283,7 12,7C11.717,7 11.479,7.096 11.288,7.287C11.096,7.479 11,7.717 11,8C11,8.283 11.096,8.521 11.288,8.712C11.479,8.904 11.717,9 12,9ZM12,22C10.617,22 9.317,21.737 8.1,21.212C6.883,20.688 5.825,19.975 4.925,19.075C4.025,18.175 3.313,17.117 2.787,15.9C2.263,14.683 2,13.383 2,12C2,10.617 2.263,9.317 2.787,8.1C3.313,6.883 4.025,5.825 4.925,4.925C5.825,4.025 6.883,3.313 8.1,2.787C9.317,2.263 10.617,2 12,2C13.383,2 14.683,2.263 15.9,2.787C17.117,3.313 18.175,4.025 19.075,4.925C19.975,5.825 20.688,6.883 21.212,8.1C21.737,9.317 22,10.617 22,12C22,13.383 21.737,14.683 21.212,15.9C20.688,17.117 19.975,18.175 19.075,19.075C18.175,19.975 17.117,20.688 15.9,21.212C14.683,21.737 13.383,22 12,22ZM12,20C14.233,20 16.125,19.225 17.675,17.675C19.225,16.125 20,14.233 20,12C20,9.767 19.225,7.875 17.675,6.325C16.125,4.775 14.233,4 12,4C9.767,4 7.875,4.775 6.325,6.325C4.775,7.875 4,9.767 4,12C4,14.233 4.775,16.125 6.325,17.675C7.875,19.225 9.767,20 12,20Z"
android:fillColor="#1B3D54"/>
</vector>
+9
View File
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M7.324,18.818L11.999,16.018L16.674,18.85L15.437,13.55L19.55,9.996L14.125,9.519L11.999,4.533L9.873,9.487L4.447,9.965L8.561,13.531L7.324,18.818ZM11.999,17.681L6.641,20.9C6.505,20.973 6.367,21.006 6.227,20.999C6.086,20.993 5.959,20.949 5.844,20.869C5.73,20.789 5.644,20.683 5.587,20.552C5.529,20.421 5.522,20.275 5.563,20.115L6.973,14.052L2.259,9.957C2.131,9.851 2.052,9.73 2.02,9.592C1.989,9.455 1.994,9.319 2.036,9.184C2.07,9.057 2.142,8.95 2.253,8.863C2.363,8.776 2.499,8.727 2.661,8.714L8.897,8.167L11.323,2.431C11.391,2.292 11.487,2.185 11.61,2.111C11.734,2.037 11.863,2 11.999,2C12.134,2 12.264,2.037 12.387,2.111C12.511,2.185 12.606,2.292 12.674,2.431L15.1,8.167L21.337,8.714C21.498,8.727 21.634,8.776 21.745,8.863C21.855,8.95 21.932,9.057 21.974,9.184C22.007,9.319 22.009,9.455 21.977,9.592C21.946,9.73 21.866,9.851 21.739,9.957L17.025,14.052L18.446,20.115C18.48,20.275 18.468,20.421 18.411,20.552C18.354,20.683 18.268,20.789 18.153,20.869C18.039,20.949 17.911,20.993 17.771,20.999C17.63,21.006 17.492,20.973 17.357,20.9L11.999,17.681Z"
android:fillColor="#1B3D54"/>
</vector>
+9
View File
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M7,21C6.45,21 5.979,20.804 5.588,20.413C5.196,20.021 5,19.55 5,19V6H4V4H9V3H15V4H20V6H19V19C19,19.55 18.804,20.021 18.413,20.413C18.021,20.804 17.55,21 17,21H7ZM17,6H7V19H17V6ZM9,17H11V8H9V17ZM13,17H15V8H13V17Z"
android:fillColor="#1B3D54"/>
</vector>
+9
View File
@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:pathData="M12,16C13.25,16 14.313,15.563 15.188,14.688C16.063,13.813 16.5,12.75 16.5,11.5C16.5,10.25 16.063,9.188 15.188,8.313C14.313,7.438 13.25,7 12,7C10.75,7 9.688,7.438 8.813,8.313C7.938,9.188 7.5,10.25 7.5,11.5C7.5,12.75 7.938,13.813 8.813,14.688C9.688,15.563 10.75,16 12,16ZM12,14.2C11.25,14.2 10.613,13.938 10.087,13.413C9.563,12.887 9.3,12.25 9.3,11.5C9.3,10.75 9.563,10.113 10.087,9.587C10.613,9.063 11.25,8.8 12,8.8C12.75,8.8 13.387,9.063 13.913,9.587C14.438,10.113 14.7,10.75 14.7,11.5C14.7,12.25 14.438,12.887 13.913,13.413C13.387,13.938 12.75,14.2 12,14.2ZM12,19C9.567,19 7.35,18.321 5.35,16.962C3.35,15.604 1.9,13.783 1,11.5C1.9,9.217 3.35,7.396 5.35,6.037C7.35,4.679 9.567,4 12,4C14.433,4 16.65,4.679 18.65,6.037C20.65,7.396 22.1,9.217 23,11.5C22.1,13.783 20.65,15.604 18.65,16.962C16.65,18.321 14.433,19 12,19ZM12,17C13.883,17 15.613,16.504 17.188,15.512C18.763,14.521 19.967,13.183 20.8,11.5C19.967,9.817 18.763,8.479 17.188,7.488C15.613,6.496 13.883,6 12,6C10.117,6 8.387,6.496 6.813,7.488C5.238,8.479 4.033,9.817 3.2,11.5C4.033,13.183 5.238,14.521 6.813,15.512C8.387,16.504 10.117,17 12,17Z"
android:fillColor="#1B3D54"/>
</vector>