123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- package eu.kanade.presentation.components
- import androidx.compose.animation.animateContentSize
- import androidx.compose.foundation.layout.Box
- import androidx.compose.foundation.layout.Column
- import androidx.compose.foundation.layout.ColumnScope
- import androidx.compose.foundation.layout.Row
- import androidx.compose.foundation.layout.wrapContentSize
- import androidx.compose.foundation.pager.PagerState
- import androidx.compose.foundation.pager.rememberPagerState
- import androidx.compose.material.icons.Icons
- import androidx.compose.material.icons.filled.MoreVert
- import androidx.compose.material3.HorizontalDivider
- import androidx.compose.material3.Icon
- import androidx.compose.material3.IconButton
- import androidx.compose.material3.MaterialTheme
- import androidx.compose.material3.PrimaryTabRow
- import androidx.compose.material3.Tab
- import androidx.compose.runtime.Composable
- import androidx.compose.runtime.getValue
- import androidx.compose.runtime.mutableStateOf
- import androidx.compose.runtime.remember
- import androidx.compose.runtime.rememberCoroutineScope
- import androidx.compose.runtime.setValue
- import androidx.compose.ui.Alignment
- import androidx.compose.ui.Modifier
- import androidx.compose.ui.res.stringResource
- import androidx.compose.ui.unit.dp
- import androidx.compose.ui.util.fastForEachIndexed
- import eu.kanade.tachiyomi.R
- import kotlinx.coroutines.launch
- import tachiyomi.presentation.core.components.HorizontalPager
- import tachiyomi.presentation.core.components.material.TabIndicator
- import tachiyomi.presentation.core.components.material.TabText
- object TabbedDialogPaddings {
- val Horizontal = 24.dp
- val Vertical = 8.dp
- }
- @Composable
- fun TabbedDialog(
- modifier: Modifier = Modifier,
- onDismissRequest: () -> Unit,
- tabTitles: List<String>,
- tabOverflowMenuContent: (@Composable ColumnScope.(() -> Unit) -> Unit)? = null,
- pagerState: PagerState = rememberPagerState { tabTitles.size },
- content: @Composable (Int) -> Unit,
- ) {
- AdaptiveSheet(
- modifier = modifier,
- onDismissRequest = onDismissRequest,
- ) {
- val scope = rememberCoroutineScope()
- Column {
- Row {
- PrimaryTabRow(
- modifier = Modifier.weight(1f),
- selectedTabIndex = pagerState.currentPage,
- indicator = { TabIndicator(it[pagerState.currentPage], pagerState.currentPageOffsetFraction) },
- divider = {},
- ) {
- tabTitles.fastForEachIndexed { index, tab ->
- Tab(
- selected = pagerState.currentPage == index,
- onClick = { scope.launch { pagerState.animateScrollToPage(index) } },
- text = { TabText(text = tab) },
- unselectedContentColor = MaterialTheme.colorScheme.onSurface,
- )
- }
- }
- tabOverflowMenuContent?.let { MoreMenu(it) }
- }
- HorizontalDivider()
- HorizontalPager(
- modifier = Modifier.animateContentSize(),
- state = pagerState,
- verticalAlignment = Alignment.Top,
- ) { page ->
- content(page)
- }
- }
- }
- }
- @Composable
- private fun MoreMenu(
- content: @Composable ColumnScope.(() -> Unit) -> Unit,
- ) {
- var expanded by remember { mutableStateOf(false) }
- Box(modifier = Modifier.wrapContentSize(Alignment.TopStart)) {
- IconButton(onClick = { expanded = true }) {
- Icon(
- imageVector = Icons.Default.MoreVert,
- contentDescription = stringResource(R.string.label_more),
- )
- }
- DropdownMenu(
- expanded = expanded,
- onDismissRequest = { expanded = false },
- ) {
- content { expanded = false }
- }
- }
- }
|