123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- package eu.kanade.presentation.library.components
- import androidx.compose.foundation.isSystemInDarkTheme
- import androidx.compose.foundation.layout.Row
- import androidx.compose.material.icons.Icons
- import androidx.compose.material.icons.outlined.FilterList
- import androidx.compose.material.icons.outlined.FlipToBack
- import androidx.compose.material.icons.outlined.SelectAll
- import androidx.compose.material3.DropdownMenuItem
- import androidx.compose.material3.Icon
- import androidx.compose.material3.IconButton
- import androidx.compose.material3.LocalContentColor
- import androidx.compose.material3.MaterialTheme
- import androidx.compose.material3.Text
- import androidx.compose.material3.TopAppBarScrollBehavior
- import androidx.compose.runtime.Composable
- import androidx.compose.runtime.Immutable
- import androidx.compose.ui.Alignment
- import androidx.compose.ui.Modifier
- import androidx.compose.ui.res.stringResource
- import androidx.compose.ui.text.style.TextOverflow
- import androidx.compose.ui.unit.sp
- import eu.kanade.presentation.components.AppBar
- import eu.kanade.presentation.components.OverflowMenu
- import eu.kanade.presentation.components.SearchToolbar
- import eu.kanade.tachiyomi.R
- import tachiyomi.presentation.core.components.Pill
- import tachiyomi.presentation.core.theme.active
- @Composable
- fun LibraryToolbar(
- hasActiveFilters: Boolean,
- selectedCount: Int,
- title: LibraryToolbarTitle,
- onClickUnselectAll: () -> Unit,
- onClickSelectAll: () -> Unit,
- onClickInvertSelection: () -> Unit,
- onClickFilter: () -> Unit,
- onClickRefresh: () -> Unit,
- onClickGlobalUpdate: () -> Unit,
- onClickOpenRandomManga: () -> Unit,
- searchQuery: String?,
- onSearchQueryChange: (String?) -> Unit,
- scrollBehavior: TopAppBarScrollBehavior?,
- ) = when {
- selectedCount > 0 -> LibrarySelectionToolbar(
- selectedCount = selectedCount,
- onClickUnselectAll = onClickUnselectAll,
- onClickSelectAll = onClickSelectAll,
- onClickInvertSelection = onClickInvertSelection,
- )
- else -> LibraryRegularToolbar(
- title = title,
- hasFilters = hasActiveFilters,
- searchQuery = searchQuery,
- onSearchQueryChange = onSearchQueryChange,
- onClickFilter = onClickFilter,
- onClickRefresh = onClickRefresh,
- onClickGlobalUpdate = onClickGlobalUpdate,
- onClickOpenRandomManga = onClickOpenRandomManga,
- scrollBehavior = scrollBehavior,
- )
- }
- @Composable
- fun LibraryRegularToolbar(
- title: LibraryToolbarTitle,
- hasFilters: Boolean,
- searchQuery: String?,
- onSearchQueryChange: (String?) -> Unit,
- onClickFilter: () -> Unit,
- onClickRefresh: () -> Unit,
- onClickGlobalUpdate: () -> Unit,
- onClickOpenRandomManga: () -> Unit,
- scrollBehavior: TopAppBarScrollBehavior?,
- ) {
- val pillAlpha = if (isSystemInDarkTheme()) 0.12f else 0.08f
- SearchToolbar(
- titleContent = {
- Row(verticalAlignment = Alignment.CenterVertically) {
- Text(
- text = title.text,
- maxLines = 1,
- modifier = Modifier.weight(1f, false),
- overflow = TextOverflow.Ellipsis,
- )
- if (title.numberOfManga != null) {
- Pill(
- text = "${title.numberOfManga}",
- color = MaterialTheme.colorScheme.onBackground.copy(alpha = pillAlpha),
- fontSize = 14.sp,
- )
- }
- }
- },
- searchQuery = searchQuery,
- onChangeSearchQuery = onSearchQueryChange,
- actions = {
- val filterTint = if (hasFilters) MaterialTheme.colorScheme.active else LocalContentColor.current
- IconButton(onClick = onClickFilter) {
- Icon(Icons.Outlined.FilterList, contentDescription = stringResource(R.string.action_filter), tint = filterTint)
- }
- OverflowMenu { closeMenu ->
- DropdownMenuItem(
- text = { Text(text = stringResource(R.string.pref_category_library_update)) },
- onClick = {
- onClickGlobalUpdate()
- closeMenu()
- },
- )
- DropdownMenuItem(
- text = { Text(text = stringResource(R.string.action_update_category)) },
- onClick = {
- onClickRefresh()
- closeMenu()
- },
- )
- DropdownMenuItem(
- text = { Text(text = stringResource(R.string.action_open_random_manga)) },
- onClick = {
- onClickOpenRandomManga()
- closeMenu()
- },
- )
- }
- },
- scrollBehavior = scrollBehavior,
- )
- }
- @Composable
- fun LibrarySelectionToolbar(
- selectedCount: Int,
- onClickUnselectAll: () -> Unit,
- onClickSelectAll: () -> Unit,
- onClickInvertSelection: () -> Unit,
- ) {
- AppBar(
- titleContent = { Text(text = "$selectedCount") },
- actions = {
- IconButton(onClick = onClickSelectAll) {
- Icon(Icons.Outlined.SelectAll, contentDescription = stringResource(R.string.action_select_all))
- }
- IconButton(onClick = onClickInvertSelection) {
- Icon(Icons.Outlined.FlipToBack, contentDescription = stringResource(R.string.action_select_inverse))
- }
- },
- isActionMode = true,
- onCancelActionMode = onClickUnselectAll,
- )
- }
- @Immutable
- data class LibraryToolbarTitle(
- val text: String,
- val numberOfManga: Int? = null,
- )
|