From 9ad4ca9d7719c7db96c841a2536eff4eee7ce7cc Mon Sep 17 00:00:00 2001 From: Cuong-Tran Date: Thu, 24 Oct 2024 23:34:32 +0700 Subject: [PATCH] reuse AppBar for Manga screen --- .../kanade/presentation/manga/MangaScreen.kt | 26 +-- .../manga/components/MangaToolbar.kt | 216 ++++++++---------- 2 files changed, 108 insertions(+), 134 deletions(-) diff --git a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt index 3115d0457..50ad8d495 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/MangaScreen.kt @@ -265,14 +265,13 @@ private fun MangaScreenSmallImpl( ) } - val internalOnBackPressed = { + BackHandler(onBack = { if (isAnySelected) { onAllChapterSelected(false) } else { onBackClicked() } - } - BackHandler(onBack = internalOnBackPressed) + }) Scaffold( topBar = { @@ -285,29 +284,25 @@ private fun MangaScreenSmallImpl( val isFirstItemScrolled by remember { derivedStateOf { chapterListState.firstVisibleItemScrollOffset > 0 } } - val animatedTitleAlpha by animateFloatAsState( - if (!isFirstItemVisible) 1f else 0f, - label = "Top Bar Title", - ) val animatedBgAlpha by animateFloatAsState( if (!isFirstItemVisible || isFirstItemScrolled) 1f else 0f, label = "Top Bar Background", ) MangaToolbar( title = state.manga.title, - titleAlphaProvider = { animatedTitleAlpha }, - backgroundAlphaProvider = { animatedBgAlpha }, hasFilters = state.filterActive, - onBackClicked = internalOnBackPressed, + navigateUp = onBackClicked, onClickFilter = onFilterClicked, onClickShare = onShareClicked, onClickDownload = onDownloadActionClicked, onClickEditCategory = onEditCategoryClicked, onClickRefresh = onRefresh, onClickMigrate = onMigrateClicked, + onCancelActionMode = { onAllChapterSelected(false) }, actionModeCounter = selectedChapterCount, onSelectAll = { onAllChapterSelected(true) }, onInvertSelection = { onInvertSelection() }, + backgroundAlphaProvider = { animatedBgAlpha }, ) }, bottomBar = { @@ -515,14 +510,13 @@ fun MangaScreenLargeImpl( val chapterListState = rememberLazyListState() - val internalOnBackPressed = { + BackHandler(onBack = { if (isAnySelected) { onAllChapterSelected(false) } else { onBackClicked() } - } - BackHandler(onBack = internalOnBackPressed) + }) Scaffold( topBar = { @@ -532,19 +526,19 @@ fun MangaScreenLargeImpl( MangaToolbar( modifier = Modifier.onSizeChanged { topBarHeight = it.height }, title = state.manga.title, - titleAlphaProvider = { if (isAnySelected) 1f else 0f }, - backgroundAlphaProvider = { 1f }, hasFilters = state.filterActive, - onBackClicked = internalOnBackPressed, + navigateUp = onBackClicked, onClickFilter = onFilterButtonClicked, onClickShare = onShareClicked, onClickDownload = onDownloadActionClicked, onClickEditCategory = onEditCategoryClicked, onClickRefresh = onRefresh, onClickMigrate = onMigrateClicked, + onCancelActionMode = { onAllChapterSelected(false) }, actionModeCounter = selectedChapterCount, onSelectAll = { onAllChapterSelected(true) }, onInvertSelection = { onInvertSelection() }, + backgroundAlphaProvider = { 1f }, ) }, bottomBar = { diff --git a/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt b/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt index 4415bbf27..9d812f98e 100644 --- a/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt +++ b/app/src/main/java/eu/kanade/presentation/manga/components/MangaToolbar.kt @@ -1,31 +1,24 @@ package eu.kanade.presentation.manga.components -import androidx.compose.foundation.layout.Column import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Close import androidx.compose.material.icons.outlined.Download 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.IconButton import androidx.compose.material3.LocalContentColor import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.Text -import androidx.compose.material3.TopAppBar -import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.surfaceColorAtElevation import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf 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.text.style.TextOverflow import androidx.compose.ui.unit.dp import eu.kanade.presentation.components.AppBar import eu.kanade.presentation.components.AppBarActions import eu.kanade.presentation.components.DownloadDropdownMenu -import eu.kanade.presentation.components.UpIcon import eu.kanade.presentation.manga.DownloadAction import kotlinx.collections.immutable.persistentListOf import tachiyomi.i18n.MR @@ -35,9 +28,8 @@ import tachiyomi.presentation.core.theme.active @Composable fun MangaToolbar( title: String, - titleAlphaProvider: () -> Float, hasFilters: Boolean, - onBackClicked: () -> Unit, + navigateUp: () -> Unit, onClickFilter: () -> Unit, onClickShare: (() -> Unit)?, onClickDownload: ((DownloadAction) -> Unit)?, @@ -47,118 +39,106 @@ fun MangaToolbar( // For action mode actionModeCounter: Int, + onCancelActionMode: () -> Unit, onSelectAll: () -> Unit, onInvertSelection: () -> Unit, modifier: Modifier = Modifier, - backgroundAlphaProvider: () -> Float = titleAlphaProvider, + backgroundAlphaProvider: () -> Float, ) { - Column( - modifier = modifier, - ) { - val isActionMode = actionModeCounter > 0 - TopAppBar( - title = { - Text( - text = if (isActionMode) actionModeCounter.toString() else title, - maxLines = 1, - overflow = TextOverflow.Ellipsis, - color = LocalContentColor.current.copy(alpha = if (isActionMode) 1f else titleAlphaProvider()), - ) - }, - navigationIcon = { - IconButton(onClick = onBackClicked) { - UpIcon(navigationIcon = Icons.Outlined.Close.takeIf { isActionMode }) - } - }, - actions = { - if (isActionMode) { - AppBarActions( - persistentListOf( - AppBar.Action( - title = stringResource(MR.strings.action_select_all), - icon = Icons.Outlined.SelectAll, - onClick = onSelectAll, - ), - AppBar.Action( - title = stringResource(MR.strings.action_select_inverse), - icon = Icons.Outlined.FlipToBack, - onClick = onInvertSelection, - ), - ), - ) - } else { - var downloadExpanded by remember { mutableStateOf(false) } - if (onClickDownload != null) { - val onDismissRequest = { downloadExpanded = false } - DownloadDropdownMenu( - expanded = downloadExpanded, - onDismissRequest = onDismissRequest, - onDownloadClicked = onClickDownload, - ) - } - - val filterTint = if (hasFilters) MaterialTheme.colorScheme.active else LocalContentColor.current - AppBarActions( - actions = persistentListOf().builder() - .apply { - if (onClickDownload != null) { - add( - AppBar.Action( - title = stringResource(MR.strings.manga_download), - icon = Icons.Outlined.Download, - onClick = { downloadExpanded = !downloadExpanded }, - ), - ) - } - add( - AppBar.Action( - title = stringResource(MR.strings.action_filter), - icon = Icons.Outlined.FilterList, - iconTint = filterTint, - onClick = onClickFilter, - ), - ) - add( - AppBar.OverflowAction( - title = stringResource(MR.strings.action_webview_refresh), - onClick = onClickRefresh, - ), - ) - if (onClickEditCategory != null) { - add( - AppBar.OverflowAction( - title = stringResource(MR.strings.action_edit_categories), - onClick = onClickEditCategory, - ), - ) - } - if (onClickMigrate != null) { - add( - AppBar.OverflowAction( - title = stringResource(MR.strings.action_migrate), - onClick = onClickMigrate, - ), - ) - } - if (onClickShare != null) { - add( - AppBar.OverflowAction( - title = stringResource(MR.strings.action_share), - onClick = onClickShare, - ), - ) - } - } - .build(), - ) - } - }, - colors = TopAppBarDefaults.topAppBarColors( - containerColor = MaterialTheme.colorScheme - .surfaceColorAtElevation(3.dp) - .copy(alpha = if (isActionMode) 1f else backgroundAlphaProvider()), - ), - ) + val isActionMode by remember(actionModeCounter) { + derivedStateOf { actionModeCounter > 0 } } + AppBar( + modifier = modifier, + title = title, + navigateUp = navigateUp, + actionModeCounter = actionModeCounter, + onCancelActionMode = onCancelActionMode, + actionModeActions = { + AppBarActions( + persistentListOf( + AppBar.Action( + title = stringResource(MR.strings.action_select_all), + icon = Icons.Outlined.SelectAll, + onClick = onSelectAll, + ), + AppBar.Action( + title = stringResource(MR.strings.action_select_inverse), + icon = Icons.Outlined.FlipToBack, + onClick = onInvertSelection, + ), + ), + ) + }, + actions = { + var downloadExpanded by remember { mutableStateOf(false) } + if (onClickDownload != null) { + val onDismissRequest = { downloadExpanded = false } + DownloadDropdownMenu( + expanded = downloadExpanded, + onDismissRequest = onDismissRequest, + onDownloadClicked = onClickDownload, + ) + } + + val filterTint = if (hasFilters) MaterialTheme.colorScheme.active else LocalContentColor.current + AppBarActions( + actions = persistentListOf().builder() + .apply { + if (onClickDownload != null) { + add( + AppBar.Action( + title = stringResource(MR.strings.manga_download), + icon = Icons.Outlined.Download, + onClick = { downloadExpanded = !downloadExpanded }, + ), + ) + } + add( + AppBar.Action( + title = stringResource(MR.strings.action_filter), + icon = Icons.Outlined.FilterList, + iconTint = filterTint, + onClick = onClickFilter, + ), + ) + add( + AppBar.OverflowAction( + title = stringResource(MR.strings.action_webview_refresh), + onClick = onClickRefresh, + ), + ) + if (onClickEditCategory != null) { + add( + AppBar.OverflowAction( + title = stringResource(MR.strings.action_edit_categories), + onClick = onClickEditCategory, + ), + ) + } + if (onClickMigrate != null) { + add( + AppBar.OverflowAction( + title = stringResource(MR.strings.action_migrate), + onClick = onClickMigrate, + ), + ) + } + if (onClickShare != null) { + add( + AppBar.OverflowAction( + title = stringResource(MR.strings.action_share), + onClick = onClickShare, + ), + ) + } + } + .build(), + ) + }, + backgroundColor = MaterialTheme.colorScheme + .surfaceColorAtElevation(3.dp) + .copy(alpha = if (isActionMode) 1f else backgroundAlphaProvider()), + ) }