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, 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 } } } }