done context menu, and fix controllers in wsa
This commit is contained in:
@@ -4,6 +4,7 @@ import android.content.Intent
|
||||
import android.os.Bundle
|
||||
import androidx.activity.ComponentActivity
|
||||
import androidx.activity.compose.setContent
|
||||
import cafe.adriel.voyager.navigator.bottomSheet.BottomSheetNavigator
|
||||
import com.megboyzz.devmenu.ui.components.MainScaffold
|
||||
|
||||
class MainActivity : ComponentActivity() {
|
||||
@@ -30,6 +31,11 @@ class MainActivity : ComponentActivity() {
|
||||
}
|
||||
|
||||
setContent {
|
||||
|
||||
BottomSheetNavigator {
|
||||
|
||||
}
|
||||
|
||||
MainScaffold(
|
||||
onSettingsClick = { /*TODO*/ },
|
||||
onSearchValueChanged = {},
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.megboyzz.devmenu.ui.components
|
||||
|
||||
import androidx.compose.animation.core.tween
|
||||
import androidx.compose.animation.expandIn
|
||||
|
||||
import androidx.compose.animation.shrinkOut
|
||||
|
||||
import androidx.compose.ui.Alignment
|
||||
|
||||
val enter = expandIn(
|
||||
expandFrom = Alignment.CenterStart,
|
||||
animationSpec = tween(250)
|
||||
)
|
||||
|
||||
val exit = shrinkOut(
|
||||
shrinkTowards = Alignment.CenterStart,
|
||||
animationSpec = tween(250)
|
||||
)
|
||||
@@ -1,26 +1,20 @@
|
||||
package com.megboyzz.devmenu.ui.components
|
||||
|
||||
import androidx.compose.animation.AnimatedVisibility
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.BoxScope
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.ColumnScope
|
||||
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
|
||||
import androidx.compose.foundation.layout.wrapContentHeight
|
||||
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
|
||||
@@ -33,7 +27,6 @@ import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.draw.shadow
|
||||
import androidx.compose.ui.graphics.Color
|
||||
import androidx.compose.ui.graphics.painter.Painter
|
||||
import androidx.compose.ui.graphics.vector.rememberVectorPainter
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.megboyzz.devmenu.R
|
||||
@@ -68,7 +61,7 @@ fun CoreMenuPosition(
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.spacedBy(16.dp),
|
||||
horizontalArrangement = Arrangement.spacedBy(20.dp),
|
||||
) {
|
||||
Image(
|
||||
painter = icon,
|
||||
@@ -87,11 +80,11 @@ fun FsElementInContextMenu(
|
||||
|
||||
Row(
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
horizontalArrangement = Arrangement.spacedBy(12.dp)
|
||||
horizontalArrangement = Arrangement.spacedBy(20.dp)
|
||||
) {
|
||||
|
||||
val modifier = Modifier
|
||||
.size(32.dp)
|
||||
.size(36.dp)
|
||||
.clip(RoundedCornerShape(10.dp))
|
||||
.shadow(elevation = 6.dp)
|
||||
|
||||
@@ -108,55 +101,92 @@ fun FileContextMenu(
|
||||
name: String,
|
||||
type: ElementType,
|
||||
onRemoveElement: () -> Unit,
|
||||
onUpdateType: (ElementType) -> Unit
|
||||
onUpdateType: (ElementType) -> ElementType?
|
||||
) {
|
||||
|
||||
var innerType by remember { mutableStateOf(type) }
|
||||
var isMain by remember { mutableStateOf(true) }
|
||||
|
||||
|
||||
CoreFileContextMenu {
|
||||
Column(verticalArrangement = Arrangement.spacedBy(20.dp)) {
|
||||
FsElementInContextMenu(name = name, type = type)
|
||||
Divider()
|
||||
if (isMain) {
|
||||
FsElementInContextMenu(name = name, type = type)
|
||||
Divider()
|
||||
AnimatedBoxForContextMenuContent(isVisible = isMain){
|
||||
AnimatedBoxForContextMenuContent(isVisible = innerType == ElementType.isFile) {
|
||||
ClickableMenuPosition(
|
||||
name = "Заменить",
|
||||
icon = R.drawable.star.asPainter(),
|
||||
onClick = {
|
||||
innerType = ElementType.isReplaced
|
||||
onUpdateType(innerType)
|
||||
innerType = onUpdateType(ElementType.isReplaced) ?: ElementType.isReplaced
|
||||
}
|
||||
)
|
||||
ClickableMenuPosition(
|
||||
name = "Скрыть для игры",
|
||||
icon = R.drawable.hide.asPainter(),
|
||||
onClick = {
|
||||
innerType = ElementType.isHidden
|
||||
|
||||
innerType = onUpdateType(ElementType.isHidden) ?: ElementType.isHidden
|
||||
}
|
||||
)
|
||||
}
|
||||
AnimatedBoxForContextMenuContent(isVisible = 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 }
|
||||
name = "Показать игре",
|
||||
icon = R.drawable.unhide.asPainter(),
|
||||
onClick = {
|
||||
innerType = onUpdateType(ElementType.isFile) ?: ElementType.isFile
|
||||
}
|
||||
)
|
||||
}
|
||||
AnimatedBoxForContextMenuContent(isVisible = innerType == ElementType.isReplaced) {
|
||||
ClickableMenuPosition(
|
||||
name = "Воостановить",
|
||||
icon = R.drawable.star.asPainter(),
|
||||
onClick = {
|
||||
innerType = onUpdateType(ElementType.isFile) ?: ElementType.isFile
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
ClickableMenuPosition(
|
||||
name = "Свойства",
|
||||
icon = R.drawable.info.asPainter(),
|
||||
onClick = {}
|
||||
)
|
||||
ClickableMenuPosition(
|
||||
name = "Удалить",
|
||||
icon = R.drawable.trash.asPainter(),
|
||||
onClick = { isMain = !isMain }
|
||||
)
|
||||
}
|
||||
|
||||
AnimatedBoxForContextMenuContent(isVisible = !isMain) {
|
||||
ClickableMenuPosition(
|
||||
name = "Удалить",
|
||||
icon = R.drawable.trash.asPainter(),
|
||||
withEnd = false
|
||||
)
|
||||
RemoveFileButtonsGroup(
|
||||
onDelete = onRemoveElement,
|
||||
onCancel = { isMain = !isMain }
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun AnimatedBoxForContextMenuContent(
|
||||
isVisible: Boolean,
|
||||
content: @Composable ColumnScope.() -> Unit
|
||||
) {
|
||||
AnimatedVisibility(
|
||||
visible = isVisible,
|
||||
enter = enter,
|
||||
exit = exit
|
||||
) {
|
||||
Column(
|
||||
verticalArrangement = Arrangement.spacedBy(12.dp),
|
||||
content = content
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -174,31 +204,6 @@ fun RemoveFileButtonsGroup(
|
||||
}
|
||||
}
|
||||
|
||||
@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(
|
||||
@@ -206,38 +211,46 @@ fun RemoveButton(
|
||||
modifier: Modifier = Modifier,
|
||||
onClick: () -> Unit
|
||||
) {
|
||||
Row() {
|
||||
Button(
|
||||
onClick = onClick,
|
||||
shape = RoundedCornerShape(10.dp),
|
||||
modifier = modifier
|
||||
) {
|
||||
Text(text = text)
|
||||
}
|
||||
Button(
|
||||
onClick = onClick,
|
||||
shape = RoundedCornerShape(10.dp),
|
||||
modifier = modifier
|
||||
) {
|
||||
Text(text = text)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun CoreFileContextMenu(
|
||||
content: @Composable BoxScope.() -> Unit
|
||||
content: @Composable () -> Unit
|
||||
) {
|
||||
|
||||
val shape = RoundedCornerShape(topStart = 10.dp, topEnd = 10.dp)
|
||||
|
||||
Box(
|
||||
modifier = Modifier
|
||||
.wrapContentHeight()
|
||||
.fillMaxWidth()
|
||||
//TODO отвязать от цвета
|
||||
.background(Color.White)
|
||||
.clip(RoundedCornerShape(10.dp)),
|
||||
.clip(shape)
|
||||
.background(Color.White),
|
||||
contentAlignment = Alignment.TopCenter
|
||||
) {
|
||||
|
||||
Image(
|
||||
painter = R.drawable.clip.asPainter(),
|
||||
contentDescription = null,
|
||||
modifier = Modifier.padding(top = 8.dp)
|
||||
)
|
||||
Box(
|
||||
modifier = Modifier.padding(
|
||||
horizontal = 32.dp,
|
||||
vertical = 24.dp
|
||||
horizontal = 28.dp,
|
||||
vertical = 32.dp
|
||||
),
|
||||
content = content
|
||||
)
|
||||
){
|
||||
Column(verticalArrangement = Arrangement.spacedBy(20.dp)) {
|
||||
content()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -250,7 +263,7 @@ fun ClicablePreview() {
|
||||
name = "my_file.txt",
|
||||
type = ElementType.isFile,
|
||||
onRemoveElement = {},
|
||||
onUpdateType = {}
|
||||
onUpdateType = {null}
|
||||
)
|
||||
|
||||
}
|
||||
@@ -44,10 +44,10 @@ fun FsElementIcon(
|
||||
) {
|
||||
|
||||
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()
|
||||
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)
|
||||
|
||||
Reference in New Issue
Block a user