Use grid in tag item selector

This commit is contained in:
MM20 2023-02-22 17:04:04 +01:00
parent 270b7a35c3
commit e82fd23619
No known key found for this signature in database
GPG Key ID: 0B61A8F2DEAFA389

View File

@ -5,26 +5,30 @@ import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.offset
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.grid.GridItemSpan
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.foundation.lazy.grid.items
import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardActions
import androidx.compose.foundation.verticalScroll import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.rounded.Check
import androidx.compose.material.icons.rounded.Warning import androidx.compose.material.icons.rounded.Warning
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.Checkbox import androidx.compose.material3.Checkbox
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.OutlinedCard
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
@ -36,6 +40,7 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.pluralStringResource
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
import de.mm20.launcher2.icons.LauncherIcon import de.mm20.launcher2.icons.LauncherIcon
@ -44,6 +49,7 @@ import de.mm20.launcher2.ui.component.BottomSheetDialog
import de.mm20.launcher2.ui.component.ShapedLauncherIcon import de.mm20.launcher2.ui.component.ShapedLauncherIcon
import de.mm20.launcher2.ui.component.SmallMessage import de.mm20.launcher2.ui.component.SmallMessage
import de.mm20.launcher2.ui.ktx.toPixels import de.mm20.launcher2.ui.ktx.toPixels
import de.mm20.launcher2.ui.locals.LocalGridSettings
@Composable @Composable
fun EditTagSheet( fun EditTagSheet(
@ -112,9 +118,10 @@ fun EditTagSheet(
@Composable @Composable
fun CreateNewTagPage(viewModel: EditTagSheetVM, paddingValues: PaddingValues) { fun CreateNewTagPage(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
Column(modifier = Modifier Column(
.verticalScroll(rememberScrollState()) modifier = Modifier
.padding(paddingValues) .verticalScroll(rememberScrollState())
.padding(paddingValues)
) { ) {
OutlinedTextField( OutlinedTextField(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
@ -135,9 +142,15 @@ fun CreateNewTagPage(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
@Composable @Composable
fun PickItems(viewModel: EditTagSheetVM, paddingValues: PaddingValues) { fun PickItems(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
LazyColumn(modifier = Modifier.fillMaxWidth(), contentPadding = paddingValues) { val columns = LocalGridSettings.current.columnCount - 1
item { LazyVerticalGrid(
Text(stringResource(id = R.string.tag_select_items), modifier = Modifier.fillMaxWidth(),
columns = GridCells.Fixed(columns),
contentPadding = paddingValues,
) {
item(span = { GridItemSpan(columns) }) {
Text(
stringResource(id = R.string.tag_select_items),
style = MaterialTheme.typography.labelMedium, style = MaterialTheme.typography.labelMedium,
color = MaterialTheme.colorScheme.secondary, color = MaterialTheme.colorScheme.secondary,
modifier = Modifier.padding(bottom = 8.dp) modifier = Modifier.padding(bottom = 8.dp)
@ -154,7 +167,7 @@ fun PickItems(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
}) })
} }
item { item(span = { GridItemSpan(columns) }) {
Box( Box(
modifier = Modifier modifier = Modifier
.padding(vertical = 8.dp) .padding(vertical = 8.dp)
@ -183,31 +196,43 @@ fun ListItem(
icon: LauncherIcon?, icon: LauncherIcon?,
onTagChanged: (Boolean) -> Unit onTagChanged: (Boolean) -> Unit
) { ) {
Column(
OutlinedCard( modifier = Modifier.padding(8.dp),
modifier = Modifier horizontalAlignment = Alignment.CenterHorizontally,
.padding(vertical = 4.dp)
.fillMaxWidth(),
onClick = {
onTagChanged(!item.isTagged)
}
) { ) {
Row( Box {
modifier = Modifier.padding(8.dp), ShapedLauncherIcon(
verticalAlignment = Alignment.CenterVertically icon = { icon },
) { size = 48.dp,
ShapedLauncherIcon(icon = { icon }, size = 32.dp, modifier = Modifier.padding(4.dp)) modifier = Modifier.padding(4.dp),
Text( onClick = {
modifier = Modifier onTagChanged(!item.isTagged)
.padding(horizontal = 12.dp) }
.weight(1f),
text = item.item.label,
style = MaterialTheme.typography.labelLarge
) )
Checkbox(checked = item.isTagged, onCheckedChange = { checked -> if (item.isTagged) {
onTagChanged(checked) Surface(
}) modifier = Modifier
.size(24.dp)
.align(Alignment.BottomEnd),
color = MaterialTheme.colorScheme.primary,
shape = CircleShape,
onClick = {
onTagChanged(false)
}
) {
Icon(Icons.Rounded.Check, null, modifier = Modifier.padding(4.dp))
}
}
} }
Text(
modifier = Modifier
.padding(top = 8.dp)
.padding(horizontal = 12.dp),
text = item.item.label,
style = MaterialTheme.typography.bodySmall,
maxLines = 1,
overflow = TextOverflow.Ellipsis,
)
} }
} }
@ -215,10 +240,11 @@ fun ListItem(
@Composable @Composable
fun CustomizeTag(viewModel: EditTagSheetVM, paddingValues: PaddingValues) { fun CustomizeTag(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
val iconSize = 32.dp.toPixels() val iconSize = 32.dp.toPixels()
Column(modifier = Modifier Column(
.verticalScroll(rememberScrollState()) modifier = Modifier
.fillMaxWidth() .verticalScroll(rememberScrollState())
.padding(paddingValues) .fillMaxWidth()
.padding(paddingValues)
) { ) {
OutlinedTextField( OutlinedTextField(
modifier = Modifier.fillMaxWidth(), modifier = Modifier.fillMaxWidth(),
@ -244,7 +270,8 @@ fun CustomizeTag(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
}?.collectAsState(null) }?.collectAsState(null)
TextButton( TextButton(
modifier = Modifier modifier = Modifier
.padding(vertical = 16.dp).fillMaxWidth(), .padding(vertical = 16.dp)
.fillMaxWidth(),
onClick = { viewModel.openItemPicker() }) { onClick = { viewModel.openItemPicker() }) {
Text( Text(
modifier = Modifier.weight(1f), modifier = Modifier.weight(1f),
@ -254,10 +281,28 @@ fun CustomizeTag(viewModel: EditTagSheetVM, paddingValues: PaddingValues) {
viewModel.taggedItems.size viewModel.taggedItems.size
) )
) )
Box(modifier = Modifier.padding(start = 8.dp).width(64.dp).height(32.dp), contentAlignment = Alignment.CenterEnd) { Box(
ShapedLauncherIcon(size = 32.dp, icon = { icon1?.value }, modifier = Modifier.offset(x = -0.dp)) modifier = Modifier
ShapedLauncherIcon(size = 32.dp, icon = { icon2?.value }, modifier = Modifier.offset(x = -16.dp)) .padding(start = 8.dp)
ShapedLauncherIcon(size = 32.dp, icon = { icon3?.value }, modifier = Modifier.offset(x = -32.dp)) .width(64.dp)
.height(32.dp),
contentAlignment = Alignment.CenterEnd
) {
ShapedLauncherIcon(
size = 32.dp,
icon = { icon1?.value },
modifier = Modifier.offset(x = -0.dp)
)
ShapedLauncherIcon(
size = 32.dp,
icon = { icon2?.value },
modifier = Modifier.offset(x = -16.dp)
)
ShapedLauncherIcon(
size = 32.dp,
icon = { icon3?.value },
modifier = Modifier.offset(x = -32.dp)
)
} }
} }
AnimatedVisibility(viewModel.tagNameExists || viewModel.taggedItems.isEmpty()) { AnimatedVisibility(viewModel.tagNameExists || viewModel.taggedItems.isEmpty()) {