GridMenu.kt
/*
* This file is part of GNU Taler
* (C) 2024 Taler Systems S.A.
*
* GNU Taler is free software; you can redistribute it and/or modify it under the
* terms of the GNU General Public License as published by the Free Software
* Foundation; either version 3, or (at your option) any later version.
*
* GNU Taler is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
* A PARTICULAR PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* GNU Taler; see the file COPYING. If not, see <http://www.gnu.org/licenses/>
*/
package net.taler.wallet.compose
import androidx.annotation.DrawableRes
import androidx.annotation.StringRes
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.grid.GridCells
import androidx.compose.foundation.lazy.grid.LazyGridScope
import androidx.compose.foundation.lazy.grid.LazyVerticalGrid
import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.ShapeDefaults
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.draw.clip
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp
// Source: https://github.com/z-huang/InnerTune
val GridMenuItemHeight = 96.dp
@Composable
fun GridMenu(
modifier: Modifier = Modifier,
contentPadding: PaddingValues = PaddingValues(0.dp),
content: LazyGridScope.() -> Unit,
) {
LazyVerticalGrid(
columns = GridCells.Adaptive(minSize = 100.dp),
modifier = modifier,
contentPadding = contentPadding,
content = content,
)
}
fun LazyGridScope.GridMenuItem(
modifier: Modifier = Modifier,
@DrawableRes icon: Int,
@StringRes title: Int,
enabled: Boolean = true,
onClick: () -> Unit,
) = GridMenuItem(
modifier = modifier,
icon = {
Icon(
painter = painterResource(icon),
contentDescription = null,
)
},
title = title,
enabled = enabled,
onClick = onClick,
)
fun LazyGridScope.GridMenuItem(
modifier: Modifier = Modifier,
icon: @Composable BoxScope.() -> Unit,
@StringRes title: Int,
enabled: Boolean = true,
onClick: () -> Unit,
) {
item {
Column(
modifier =
modifier
.clip(ShapeDefaults.Large)
.height(GridMenuItemHeight)
.clickable(
enabled = enabled,
onClick = onClick,
).alpha(if (enabled) 1f else 0.5f)
.padding(12.dp),
) {
Box(
modifier =
Modifier
.fillMaxWidth()
.weight(1f),
contentAlignment = Alignment.Center,
content = icon,
)
Text(
text = stringResource(title),
style = MaterialTheme.typography.labelLarge,
textAlign = TextAlign.Center,
maxLines = 2,
modifier = Modifier.fillMaxWidth(),
)
}
}
}