done context menu, and fix controllers in wsa

This commit is contained in:
2023-12-28 00:12:03 +03:00
parent 66d4c573db
commit 9a26865269
9 changed files with 238 additions and 202 deletions
+5
View File
@@ -71,6 +71,11 @@ dependencies {
debugImplementation(libs.ui.tooling)
debugImplementation(libs.ui.test.manifest)
implementation(libs.voyager.navigator)
implementation(libs.voyager.bottomSheetNavigator)
implementation(libs.voyager.transitions)
implementation(libs.voyager.screenModel)
implementation(libs.dagger)
kapt(libs.dagger.compiler)
implementation(libs.room)
@@ -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)