package eu.kanade.presentation.components import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.widthIn import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material3.DropdownMenu import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.tachiyomi.R @Composable fun AppBarTitle( title: String?, subtitle: String? = null, ) { Column { title?.let { Text( text = it, maxLines = 1, overflow = TextOverflow.Ellipsis, ) } subtitle?.let { Text( text = it, style = MaterialTheme.typography.bodyMedium, maxLines = 1, overflow = TextOverflow.Ellipsis, ) } } } @Composable fun AppBarActions( actions: List, ) { var showMenu by remember { mutableStateOf(false) } actions.filterIsInstance().map { IconButton( onClick = it.onClick, enabled = it.enabled, ) { Icon( imageVector = it.icon, contentDescription = it.title, ) } } val overflowActions = actions.filterIsInstance() if (overflowActions.isNotEmpty()) { IconButton(onClick = { showMenu = !showMenu }) { Icon(Icons.Default.MoreVert, contentDescription = stringResource(R.string.label_more)) } DropdownMenu( modifier = Modifier.widthIn(min = 200.dp), expanded = showMenu, onDismissRequest = { showMenu = false }, ) { overflowActions.map { DropdownMenuItem( onClick = { it.onClick() showMenu = false }, text = { Text(it.title, fontWeight = FontWeight.Normal) }, ) } } } } sealed interface AppBar { sealed interface AppBarAction data class Action( val title: String, val icon: ImageVector, val onClick: () -> Unit, val enabled: Boolean = true, ) : AppBarAction data class OverflowAction( val title: String, val onClick: () -> Unit, ) : AppBarAction }