mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-10-31 14:27:57 +01:00 
			
		
		
		
	Reuse AppBar in manga screen (#1367)
				
					
				
			Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
This commit is contained in:
		| @@ -87,7 +87,7 @@ fun MangaScreen( | ||||
|     isTabletUi: Boolean, | ||||
|     chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, | ||||
|     chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, | ||||
|     onBackClicked: () -> Unit, | ||||
|     navigateUp: () -> Unit, | ||||
|     onChapterClicked: (Chapter) -> Unit, | ||||
|     onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, | ||||
|     onAddToLibraryClicked: () -> Unit, | ||||
| @@ -141,7 +141,7 @@ fun MangaScreen( | ||||
|             nextUpdate = nextUpdate, | ||||
|             chapterSwipeStartAction = chapterSwipeStartAction, | ||||
|             chapterSwipeEndAction = chapterSwipeEndAction, | ||||
|             onBackClicked = onBackClicked, | ||||
|             navigateUp = navigateUp, | ||||
|             onChapterClicked = onChapterClicked, | ||||
|             onDownloadChapter = onDownloadChapter, | ||||
|             onAddToLibraryClicked = onAddToLibraryClicked, | ||||
| @@ -176,7 +176,7 @@ fun MangaScreen( | ||||
|             chapterSwipeStartAction = chapterSwipeStartAction, | ||||
|             chapterSwipeEndAction = chapterSwipeEndAction, | ||||
|             nextUpdate = nextUpdate, | ||||
|             onBackClicked = onBackClicked, | ||||
|             navigateUp = navigateUp, | ||||
|             onChapterClicked = onChapterClicked, | ||||
|             onDownloadChapter = onDownloadChapter, | ||||
|             onAddToLibraryClicked = onAddToLibraryClicked, | ||||
| @@ -214,7 +214,7 @@ private fun MangaScreenSmallImpl( | ||||
|     nextUpdate: Instant?, | ||||
|     chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, | ||||
|     chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, | ||||
|     onBackClicked: () -> Unit, | ||||
|     navigateUp: () -> Unit, | ||||
|     onChapterClicked: (Chapter) -> Unit, | ||||
|     onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, | ||||
|     onAddToLibraryClicked: () -> Unit, | ||||
| @@ -265,14 +265,13 @@ private fun MangaScreenSmallImpl( | ||||
|         ) | ||||
|     } | ||||
|  | ||||
|     val internalOnBackPressed = { | ||||
|     BackHandler(onBack = { | ||||
|         if (isAnySelected) { | ||||
|             onAllChapterSelected(false) | ||||
|         } else { | ||||
|             onBackClicked() | ||||
|             navigateUp() | ||||
|         } | ||||
|     } | ||||
|     BackHandler(onBack = internalOnBackPressed) | ||||
|     }) | ||||
|  | ||||
|     Scaffold( | ||||
|         topBar = { | ||||
| @@ -285,20 +284,18 @@ private fun MangaScreenSmallImpl( | ||||
|             val isFirstItemScrolled by remember { | ||||
|                 derivedStateOf { chapterListState.firstVisibleItemScrollOffset > 0 } | ||||
|             } | ||||
|             val animatedTitleAlpha by animateFloatAsState( | ||||
|             val titleAlpha by animateFloatAsState( | ||||
|                 if (!isFirstItemVisible) 1f else 0f, | ||||
|                 label = "Top Bar Title", | ||||
|             ) | ||||
|             val animatedBgAlpha by animateFloatAsState( | ||||
|             val backgroundAlpha 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 = navigateUp, | ||||
|                 onClickFilter = onFilterClicked, | ||||
|                 onClickShare = onShareClicked, | ||||
|                 onClickDownload = onDownloadActionClicked, | ||||
| @@ -306,8 +303,11 @@ private fun MangaScreenSmallImpl( | ||||
|                 onClickRefresh = onRefresh, | ||||
|                 onClickMigrate = onMigrateClicked, | ||||
|                 actionModeCounter = selectedChapterCount, | ||||
|                 onCancelActionMode = { onAllChapterSelected(false) }, | ||||
|                 onSelectAll = { onAllChapterSelected(true) }, | ||||
|                 onInvertSelection = { onInvertSelection() }, | ||||
|                 titleAlphaProvider = { titleAlpha }, | ||||
|                 backgroundAlphaProvider = { backgroundAlpha }, | ||||
|             ) | ||||
|         }, | ||||
|         bottomBar = { | ||||
| @@ -458,7 +458,7 @@ fun MangaScreenLargeImpl( | ||||
|     nextUpdate: Instant?, | ||||
|     chapterSwipeStartAction: LibraryPreferences.ChapterSwipeAction, | ||||
|     chapterSwipeEndAction: LibraryPreferences.ChapterSwipeAction, | ||||
|     onBackClicked: () -> Unit, | ||||
|     navigateUp: () -> Unit, | ||||
|     onChapterClicked: (Chapter) -> Unit, | ||||
|     onDownloadChapter: ((List<ChapterList.Item>, ChapterDownloadAction) -> Unit)?, | ||||
|     onAddToLibraryClicked: () -> Unit, | ||||
| @@ -515,14 +515,13 @@ fun MangaScreenLargeImpl( | ||||
|  | ||||
|     val chapterListState = rememberLazyListState() | ||||
|  | ||||
|     val internalOnBackPressed = { | ||||
|     BackHandler(onBack = { | ||||
|         if (isAnySelected) { | ||||
|             onAllChapterSelected(false) | ||||
|         } else { | ||||
|             onBackClicked() | ||||
|             navigateUp() | ||||
|         } | ||||
|     } | ||||
|     BackHandler(onBack = internalOnBackPressed) | ||||
|     }) | ||||
|  | ||||
|     Scaffold( | ||||
|         topBar = { | ||||
| @@ -532,19 +531,20 @@ 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 = navigateUp, | ||||
|                 onClickFilter = onFilterButtonClicked, | ||||
|                 onClickShare = onShareClicked, | ||||
|                 onClickDownload = onDownloadActionClicked, | ||||
|                 onClickEditCategory = onEditCategoryClicked, | ||||
|                 onClickRefresh = onRefresh, | ||||
|                 onClickMigrate = onMigrateClicked, | ||||
|                 onCancelActionMode = { onAllChapterSelected(false) }, | ||||
|                 actionModeCounter = selectedChapterCount, | ||||
|                 onSelectAll = { onAllChapterSelected(true) }, | ||||
|                 onInvertSelection = { onInvertSelection() }, | ||||
|                 titleAlphaProvider = { 1f }, | ||||
|                 backgroundAlphaProvider = { 1f }, | ||||
|             ) | ||||
|         }, | ||||
|         bottomBar = { | ||||
|   | ||||
| @@ -1,18 +1,12 @@ | ||||
| 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.getValue | ||||
| @@ -20,12 +14,12 @@ 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.draw.alpha | ||||
| import androidx.compose.ui.unit.dp | ||||
| import eu.kanade.presentation.components.AppBar | ||||
| import eu.kanade.presentation.components.AppBarActions | ||||
| import eu.kanade.presentation.components.AppBarTitle | ||||
| 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 +29,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 +40,111 @@ fun MangaToolbar( | ||||
|  | ||||
|     // For action mode | ||||
|     actionModeCounter: Int, | ||||
|     onCancelActionMode: () -> Unit, | ||||
|     onSelectAll: () -> Unit, | ||||
|     onInvertSelection: () -> Unit, | ||||
|  | ||||
|     titleAlphaProvider: () -> Float, | ||||
|     backgroundAlphaProvider: () -> Float, | ||||
|     modifier: Modifier = Modifier, | ||||
|     backgroundAlphaProvider: () -> Float = titleAlphaProvider, | ||||
| ) { | ||||
|     Column( | ||||
|     val isActionMode = actionModeCounter > 0 | ||||
|     AppBar( | ||||
|         titleContent = { | ||||
|             if (isActionMode) { | ||||
|                 AppBarTitle(actionModeCounter.toString()) | ||||
|             } else { | ||||
|                 AppBarTitle(title, modifier = Modifier.alpha(titleAlphaProvider())) | ||||
|             } | ||||
|         }, | ||||
|         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()), | ||||
|         backgroundColor = MaterialTheme.colorScheme | ||||
|             .surfaceColorAtElevation(3.dp) | ||||
|             .copy(alpha = if (isActionMode) 1f else backgroundAlphaProvider()), | ||||
|         navigateUp = navigateUp, | ||||
|         actions = { | ||||
|             var downloadExpanded by remember { mutableStateOf(false) } | ||||
|             if (onClickDownload != null) { | ||||
|                 val onDismissRequest = { downloadExpanded = false } | ||||
|                 DownloadDropdownMenu( | ||||
|                     expanded = downloadExpanded, | ||||
|                     onDismissRequest = onDismissRequest, | ||||
|                     onDownloadClicked = onClickDownload, | ||||
|                 ) | ||||
|             }, | ||||
|             navigationIcon = { | ||||
|                 IconButton(onClick = onBackClicked) { | ||||
|                     UpIcon(navigationIcon = Icons.Outlined.Close.takeIf { isActionMode }) | ||||
|                 } | ||||
|             }, | ||||
|             actions = { | ||||
|                 if (isActionMode) { | ||||
|                     AppBarActions( | ||||
|                         persistentListOf( | ||||
|             } | ||||
|  | ||||
|             val filterTint = if (hasFilters) MaterialTheme.colorScheme.active else LocalContentColor.current | ||||
|             AppBarActions( | ||||
|                 actions = persistentListOf<AppBar.AppBarAction>().builder().apply { | ||||
|                     if (isActionMode) { | ||||
|                         add( | ||||
|                             AppBar.Action( | ||||
|                                 title = stringResource(MR.strings.action_select_all), | ||||
|                                 icon = Icons.Outlined.SelectAll, | ||||
|                                 onClick = onSelectAll, | ||||
|                             ), | ||||
|                         ) | ||||
|                         add( | ||||
|                             AppBar.Action( | ||||
|                                 title = stringResource(MR.strings.action_select_inverse), | ||||
|                                 icon = Icons.Outlined.FlipToBack, | ||||
|                                 onClick = onInvertSelection, | ||||
|                             ), | ||||
|                         ), | ||||
|                     ) | ||||
|                 } else { | ||||
|                     var downloadExpanded by remember { mutableStateOf(false) } | ||||
|                         ) | ||||
|                         return@apply | ||||
|                     } | ||||
|                     if (onClickDownload != null) { | ||||
|                         val onDismissRequest = { downloadExpanded = false } | ||||
|                         DownloadDropdownMenu( | ||||
|                             expanded = downloadExpanded, | ||||
|                             onDismissRequest = onDismissRequest, | ||||
|                             onDownloadClicked = onClickDownload, | ||||
|                         add( | ||||
|                             AppBar.Action( | ||||
|                                 title = stringResource(MR.strings.manga_download), | ||||
|                                 icon = Icons.Outlined.Download, | ||||
|                                 onClick = { downloadExpanded = !downloadExpanded }, | ||||
|                             ), | ||||
|                         ) | ||||
|                     } | ||||
|  | ||||
|                     val filterTint = if (hasFilters) MaterialTheme.colorScheme.active else LocalContentColor.current | ||||
|                     AppBarActions( | ||||
|                         actions = persistentListOf<AppBar.AppBarAction>().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(), | ||||
|                     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, | ||||
|                             ), | ||||
|                         ) | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             colors = TopAppBarDefaults.topAppBarColors( | ||||
|                 containerColor = MaterialTheme.colorScheme | ||||
|                     .surfaceColorAtElevation(3.dp) | ||||
|                     .copy(alpha = if (isActionMode) 1f else backgroundAlphaProvider()), | ||||
|             ), | ||||
|         ) | ||||
|     } | ||||
|                     .build(), | ||||
|             ) | ||||
|         }, | ||||
|         isActionMode = isActionMode, | ||||
|         onCancelActionMode = onCancelActionMode, | ||||
|     ) | ||||
| } | ||||
|   | ||||
| @@ -121,7 +121,7 @@ class MangaScreen( | ||||
|             isTabletUi = isTabletUi(), | ||||
|             chapterSwipeStartAction = screenModel.chapterSwipeStartAction, | ||||
|             chapterSwipeEndAction = screenModel.chapterSwipeEndAction, | ||||
|             onBackClicked = navigator::pop, | ||||
|             navigateUp = navigator::pop, | ||||
|             onChapterClicked = { openChapter(context, it) }, | ||||
|             onDownloadChapter = screenModel::runChapterDownloadActions.takeIf { !successState.source.isLocalOrStub() }, | ||||
|             onAddToLibraryClicked = { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user