Minor cleanup/fixes

- Add FAB collapsing in clear database screen (fixes #7935)
- Don't allow multiline category names to be entered
- Consolidate Downloaded Only / Incognito Mode banner components
- Fix see-through migrate screen sticky header

(cherry picked from commit 83871fc013d6ab8b44d64cf8ff3ce2ef27d61946)

# Conflicts:
#	app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt
#	app/src/main/java/eu/kanade/presentation/category/components/CategoryDialogs.kt
This commit is contained in:
arkon 2022-09-18 16:08:50 -04:00 committed by Jobobby04
parent f40477cf6e
commit 6c3183af8d
17 changed files with 70 additions and 72 deletions

View File

@ -42,10 +42,9 @@ import eu.kanade.presentation.browse.components.BrowseSourceCompactGrid
import eu.kanade.presentation.browse.components.BrowseSourceEHentaiList import eu.kanade.presentation.browse.components.BrowseSourceEHentaiList
import eu.kanade.presentation.browse.components.BrowseSourceList import eu.kanade.presentation.browse.components.BrowseSourceList
import eu.kanade.presentation.browse.components.BrowseSourceToolbar import eu.kanade.presentation.browse.components.BrowseSourceToolbar
import eu.kanade.presentation.components.DownloadedOnlyModeBanner import eu.kanade.presentation.components.AppStateBanners
import eu.kanade.presentation.components.EmptyScreen import eu.kanade.presentation.components.EmptyScreen
import eu.kanade.presentation.components.ExtendedFloatingActionButton import eu.kanade.presentation.components.ExtendedFloatingActionButton
import eu.kanade.presentation.components.IncognitoModeBanner
import eu.kanade.presentation.components.LoadingScreen import eu.kanade.presentation.components.LoadingScreen
import eu.kanade.presentation.components.Scaffold import eu.kanade.presentation.components.Scaffold
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
@ -100,12 +99,8 @@ fun BrowseSourceScreen(
// SY <-- // SY <--
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
) )
if (downloadedOnlyMode) {
DownloadedOnlyModeBanner() AppStateBanners(downloadedOnlyMode, incognitoMode)
}
if (incognitoMode) {
IncognitoModeBanner()
}
} }
}, },
floatingActionButton = { floatingActionButton = {
@ -159,7 +154,7 @@ fun BrowseSourceScreen(
) )
}, },
label = { label = {
Text(text = stringResource(id = R.string.popular)) Text(text = stringResource(R.string.popular))
}, },
) )
if (presenter.source?.supportsLatest == true) { if (presenter.source?.supportsLatest == true) {
@ -178,7 +173,7 @@ fun BrowseSourceScreen(
) )
}, },
label = { label = {
Text(text = stringResource(id = R.string.latest)) Text(text = stringResource(R.string.latest))
}, },
) )
} }
@ -198,9 +193,9 @@ fun BrowseSourceScreen(
// SY --> // SY -->
Text( Text(
text = if (presenter.filters.isNotEmpty()) { text = if (presenter.filters.isNotEmpty()) {
stringResource(id = R.string.action_filter) stringResource(R.string.action_filter)
} else { } else {
stringResource(id = R.string.action_search) stringResource(R.string.action_search)
}, },
) )
// SY <-- // SY <--
@ -225,9 +220,9 @@ fun BrowseSourceFloatingActionButton(
text = { text = {
Text( Text(
text = if (isVisible) { text = if (isVisible) {
stringResource(id = R.string.action_filter) stringResource(R.string.action_filter)
} else { } else {
stringResource(id = R.string.saved_searches) stringResource(R.string.saved_searches)
}, },
) )
}, },

View File

@ -1,5 +1,6 @@
package eu.kanade.presentation.browse package eu.kanade.presentation.browse
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
@ -95,7 +96,7 @@ fun MigrateSourceList(
stickyHeader(key = "header") { stickyHeader(key = "header") {
Row( Row(
modifier = Modifier modifier = Modifier
.animateItemPlacement() .background(MaterialTheme.colorScheme.background)
.padding(start = horizontalPadding), .padding(start = horizontalPadding),
verticalAlignment = Alignment.CenterVertically, verticalAlignment = Alignment.CenterVertically,
) { ) {
@ -120,14 +121,9 @@ fun MigrateSourceList(
} }
} }
item(key = "title") {
}
items( items(
items = list, items = list,
key = { (source, _) -> key = { (source, _) -> source.id },
source.id
},
) { (source, count) -> ) { (source, count) ->
MigrateSourceItem( MigrateSourceItem(
modifier = Modifier.animateItemPlacement(), modifier = Modifier.animateItemPlacement(),

View File

@ -118,7 +118,7 @@ fun BrowseSourceComfortableGridItem(
}, },
badgesStart = { badgesStart = {
if (manga.favorite) { if (manga.favorite) {
Badge(text = stringResource(id = R.string.in_library)) Badge(text = stringResource(R.string.in_library))
} }
}, },
// SY --> // SY -->

View File

@ -129,7 +129,7 @@ fun BrowseSourceCompactGridItem(
}, },
badgesStart = { badgesStart = {
if (manga.favorite) { if (manga.favorite) {
Badge(text = stringResource(id = R.string.in_library)) Badge(text = stringResource(R.string.in_library))
} }
}, },
// SY --> // SY -->

View File

@ -16,7 +16,7 @@ fun RemoveMangaDialog(
onDismissRequest = onDismissRequest, onDismissRequest = onDismissRequest,
dismissButton = { dismissButton = {
TextButton(onClick = onDismissRequest) { TextButton(onClick = onDismissRequest) {
Text(text = stringResource(id = android.R.string.cancel)) Text(text = stringResource(android.R.string.cancel))
} }
}, },
confirmButton = { confirmButton = {
@ -26,11 +26,11 @@ fun RemoveMangaDialog(
onConfirm() onConfirm()
}, },
) { ) {
Text(text = stringResource(id = R.string.action_remove)) Text(text = stringResource(R.string.action_remove))
} }
}, },
title = { title = {
Text(text = stringResource(id = R.string.are_you_sure)) Text(text = stringResource(R.string.are_you_sure))
}, },
text = { text = {
Text(text = stringResource(R.string.remove_manga)) Text(text = stringResource(R.string.remove_manga))

View File

@ -106,7 +106,7 @@ fun BrowseSourceListItem(
onLongClick = onLongClick, onLongClick = onLongClick,
badges = { badges = {
if (manga.favorite) { if (manga.favorite) {
Badge(text = stringResource(id = R.string.in_library)) Badge(text = stringResource(R.string.in_library))
} }
if (metadata is MangaDexSearchMetadata) { if (metadata is MangaDexSearchMetadata) {
metadata.followStatus?.let { followStatus -> metadata.followStatus?.let { followStatus ->

View File

@ -101,26 +101,26 @@ fun BrowseSourceRegularToolbar(
AppBarActions( AppBarActions(
actions = listOfNotNull( actions = listOfNotNull(
AppBar.Action( AppBar.Action(
title = stringResource(id = R.string.action_search), title = stringResource(R.string.action_search),
icon = Icons.Outlined.Search, icon = Icons.Outlined.Search,
onClick = onSearchClick, onClick = onSearchClick,
), ),
// SY --> // SY -->
AppBar.Action( AppBar.Action(
title = stringResource(id = R.string.action_display_mode), title = stringResource(R.string.action_display_mode),
icon = Icons.Filled.ViewModule, icon = Icons.Filled.ViewModule,
onClick = { selectingDisplayMode = true }, onClick = { selectingDisplayMode = true },
).takeIf { displayMode != null }, ).takeIf { displayMode != null },
// SY <-- // SY <--
if (isLocalSource) { if (isLocalSource) {
AppBar.Action( AppBar.Action(
title = stringResource(id = R.string.label_help), title = stringResource(R.string.label_help),
icon = Icons.Outlined.Help, icon = Icons.Outlined.Help,
onClick = onHelpClick, onClick = onHelpClick,
) )
} else { } else {
AppBar.Action( AppBar.Action(
title = stringResource(id = R.string.action_web_view), title = stringResource(R.string.action_web_view),
icon = Icons.Outlined.Public, icon = Icons.Outlined.Public,
onClick = onWebViewClick, onClick = onWebViewClick,
) )
@ -143,7 +143,7 @@ fun BrowseSourceRegularToolbar(
onDismissRequest = { selectingDisplayMode = false }, onDismissRequest = { selectingDisplayMode = false },
) { ) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_display_comfortable_grid)) }, text = { Text(text = stringResource(R.string.action_display_comfortable_grid)) },
onClick = { onDisplayModeChange(LibraryDisplayMode.ComfortableGrid) }, onClick = { onDisplayModeChange(LibraryDisplayMode.ComfortableGrid) },
trailingIcon = { trailingIcon = {
if (displayMode == LibraryDisplayMode.ComfortableGrid) { if (displayMode == LibraryDisplayMode.ComfortableGrid) {
@ -155,7 +155,7 @@ fun BrowseSourceRegularToolbar(
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_display_grid)) }, text = { Text(text = stringResource(R.string.action_display_grid)) },
onClick = { onDisplayModeChange(LibraryDisplayMode.CompactGrid) }, onClick = { onDisplayModeChange(LibraryDisplayMode.CompactGrid) },
trailingIcon = { trailingIcon = {
if (displayMode == LibraryDisplayMode.CompactGrid) { if (displayMode == LibraryDisplayMode.CompactGrid) {
@ -167,7 +167,7 @@ fun BrowseSourceRegularToolbar(
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_display_list)) }, text = { Text(text = stringResource(R.string.action_display_list)) },
onClick = { onDisplayModeChange(LibraryDisplayMode.List) }, onClick = { onDisplayModeChange(LibraryDisplayMode.List) },
trailingIcon = { trailingIcon = {
if (displayMode == LibraryDisplayMode.List) { if (displayMode == LibraryDisplayMode.List) {

View File

@ -61,6 +61,7 @@ fun CategoryCreateDialog(
label = { label = {
Text(text = stringResource(R.string.name)) Text(text = stringResource(R.string.name))
}, },
singleLine = true,
) )
// SY --> // SY -->
} }
@ -110,6 +111,7 @@ fun CategoryRenameDialog(
label = { label = {
Text(text = stringResource(R.string.name)) Text(text = stringResource(R.string.name))
}, },
singleLine = true,
) )
}, },
) )

View File

@ -144,12 +144,7 @@ fun AppBar(
scrollBehavior = scrollBehavior, scrollBehavior = scrollBehavior,
) )
if (downloadedOnlyMode) { AppStateBanners(downloadedOnlyMode, incognitoMode)
DownloadedOnlyModeBanner()
}
if (incognitoMode) {
IncognitoModeBanner()
}
} }
} }

View File

@ -1,6 +1,7 @@
package eu.kanade.presentation.components package eu.kanade.presentation.components
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.ColumnScope
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@ -13,7 +14,20 @@ import androidx.compose.ui.unit.dp
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
@Composable @Composable
fun DownloadedOnlyModeBanner() { fun ColumnScope.AppStateBanners(
downloadedOnlyMode: Boolean,
incognitoMode: Boolean,
) {
if (downloadedOnlyMode) {
DownloadedOnlyModeBanner()
}
if (incognitoMode) {
IncognitoModeBanner()
}
}
@Composable
private fun DownloadedOnlyModeBanner() {
Text( Text(
text = stringResource(R.string.label_downloaded_only), text = stringResource(R.string.label_downloaded_only),
modifier = Modifier modifier = Modifier
@ -27,7 +41,7 @@ fun DownloadedOnlyModeBanner() {
} }
@Composable @Composable
fun IncognitoModeBanner() { private fun IncognitoModeBanner() {
Text( Text(
text = stringResource(R.string.pref_incognito_mode), text = stringResource(R.string.pref_incognito_mode),
modifier = Modifier modifier = Modifier

View File

@ -76,12 +76,7 @@ fun TabbedScreen(
} }
} }
if (downloadedOnlyMode) { AppStateBanners(downloadedOnlyMode, incognitoMode)
DownloadedOnlyModeBanner()
}
if (incognitoMode) {
IncognitoModeBanner()
}
HorizontalPager( HorizontalPager(
count = tabs.size, count = tabs.size,

View File

@ -13,8 +13,7 @@ import androidx.compose.ui.unit.dp
import com.google.accompanist.pager.PagerState import com.google.accompanist.pager.PagerState
import eu.kanade.domain.category.model.Category import eu.kanade.domain.category.model.Category
import eu.kanade.presentation.category.visualName import eu.kanade.presentation.category.visualName
import eu.kanade.presentation.components.DownloadedOnlyModeBanner import eu.kanade.presentation.components.AppStateBanners
import eu.kanade.presentation.components.IncognitoModeBanner
import eu.kanade.presentation.components.TabIndicator import eu.kanade.presentation.components.TabIndicator
import eu.kanade.presentation.components.TabText import eu.kanade.presentation.components.TabText
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@ -60,11 +59,7 @@ fun LibraryTabs(
) )
} }
} }
if (isDownloadOnly) {
DownloadedOnlyModeBanner() AppStateBanners(isDownloadOnly, isIncognitoMode)
}
if (isIncognitoMode) {
IncognitoModeBanner()
}
} }
} }

View File

@ -28,9 +28,8 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import eu.kanade.presentation.components.DownloadedOnlyModeBanner import eu.kanade.presentation.components.AppStateBanners
import eu.kanade.presentation.components.DropdownMenu import eu.kanade.presentation.components.DropdownMenu
import eu.kanade.presentation.components.IncognitoModeBanner
import eu.kanade.presentation.manga.DownloadAction import eu.kanade.presentation.manga.DownloadAction
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
@ -247,11 +246,6 @@ fun MangaAppBar(
), ),
) )
if (downloadedOnlyMode) { AppStateBanners(downloadedOnlyMode, incognitoMode)
DownloadedOnlyModeBanner()
}
if (incognitoMode) {
IncognitoModeBanner()
}
} }
} }

View File

@ -1,5 +1,6 @@
package eu.kanade.presentation.more.settings.database package eu.kanade.presentation.more.settings.database
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalContext
import eu.kanade.presentation.components.Scaffold import eu.kanade.presentation.components.Scaffold
@ -17,6 +18,7 @@ fun ClearDatabaseScreen(
navigateUp: () -> Unit, navigateUp: () -> Unit,
) { ) {
val context = LocalContext.current val context = LocalContext.current
val lazyListState = rememberLazyListState()
Scaffold( Scaffold(
topBar = { scrollBehavior -> topBar = { scrollBehavior ->
ClearDatabaseToolbar( ClearDatabaseToolbar(
@ -30,6 +32,7 @@ fun ClearDatabaseScreen(
floatingActionButton = { floatingActionButton = {
ClearDatabaseFloatingActionButton( ClearDatabaseFloatingActionButton(
isVisible = presenter.selection.isNotEmpty(), isVisible = presenter.selection.isNotEmpty(),
lazyListState = lazyListState,
onClickDelete = { onClickDelete = {
presenter.dialog = ClearDatabasePresenter.Dialog.Delete(presenter.selection) presenter.dialog = ClearDatabasePresenter.Dialog.Delete(presenter.selection)
}, },
@ -39,6 +42,7 @@ fun ClearDatabaseScreen(
ClearDatabaseContent( ClearDatabaseContent(
state = presenter, state = presenter,
contentPadding = paddingValues, contentPadding = paddingValues,
lazyListState = lazyListState,
onClickSelection = { source -> onClickSelection = { source ->
presenter.toggleSelection(source) presenter.toggleSelection(source)
}, },

View File

@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.WindowInsets
import androidx.compose.foundation.layout.asPaddingValues import androidx.compose.foundation.layout.asPaddingValues
import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
@ -19,12 +20,14 @@ import eu.kanade.tachiyomi.R
fun ClearDatabaseContent( fun ClearDatabaseContent(
state: ClearDatabaseState, state: ClearDatabaseState,
contentPadding: PaddingValues, contentPadding: PaddingValues,
lazyListState: LazyListState,
onClickSelection: (Source) -> Unit, onClickSelection: (Source) -> Unit,
) { ) {
Crossfade(targetState = state.isEmpty.not()) { _state -> Crossfade(targetState = state.isEmpty.not()) { _state ->
when (_state) { when (_state) {
true -> FastScrollLazyColumn( true -> FastScrollLazyColumn(
contentPadding = contentPadding + WindowInsets.navigationBars.asPaddingValues(), contentPadding = contentPadding + WindowInsets.navigationBars.asPaddingValues(),
state = lazyListState,
) { ) {
items(state.items) { sourceWithCount -> items(state.items) { sourceWithCount ->
ClearDatabaseItem( ClearDatabaseItem(

View File

@ -4,6 +4,7 @@ import androidx.compose.animation.AnimatedVisibility
import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.Delete import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material3.Icon import androidx.compose.material3.Icon
@ -12,11 +13,14 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import eu.kanade.presentation.components.ExtendedFloatingActionButton import eu.kanade.presentation.components.ExtendedFloatingActionButton
import eu.kanade.presentation.util.isScrolledToEnd
import eu.kanade.presentation.util.isScrollingUp
import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.R
@Composable @Composable
fun ClearDatabaseFloatingActionButton( fun ClearDatabaseFloatingActionButton(
isVisible: Boolean, isVisible: Boolean,
lazyListState: LazyListState,
onClickDelete: () -> Unit, onClickDelete: () -> Unit,
) { ) {
AnimatedVisibility( AnimatedVisibility(
@ -33,6 +37,7 @@ fun ClearDatabaseFloatingActionButton(
Icon(Icons.Outlined.Delete, contentDescription = "") Icon(Icons.Outlined.Delete, contentDescription = "")
}, },
onClick = onClickDelete, onClick = onClickDelete,
expanded = lazyListState.isScrollingUp() || lazyListState.isScrolledToEnd(),
) )
} }
} }

View File

@ -174,20 +174,20 @@ class DownloadController :
onDismissRequest = { onExpanded(false) }, onDismissRequest = { onExpanded(false) },
) { ) {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_reorganize_by)) }, text = { Text(text = stringResource(R.string.action_reorganize_by)) },
children = { children = {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_order_by_upload_date)) }, text = { Text(text = stringResource(R.string.action_order_by_upload_date)) },
children = { children = {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_newest)) }, text = { Text(text = stringResource(R.string.action_newest)) },
onClick = { onClick = {
reorderQueue({ it.download.chapter.date_upload }, true) reorderQueue({ it.download.chapter.date_upload }, true)
onExpanded(false) onExpanded(false)
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_oldest)) }, text = { Text(text = stringResource(R.string.action_oldest)) },
onClick = { onClick = {
reorderQueue({ it.download.chapter.date_upload }, false) reorderQueue({ it.download.chapter.date_upload }, false)
onExpanded(false) onExpanded(false)
@ -196,17 +196,17 @@ class DownloadController :
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_order_by_chapter_number)) }, text = { Text(text = stringResource(R.string.action_order_by_chapter_number)) },
children = { children = {
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_asc)) }, text = { Text(text = stringResource(R.string.action_asc)) },
onClick = { onClick = {
reorderQueue({ it.download.chapter.chapter_number }, false) reorderQueue({ it.download.chapter.chapter_number }, false)
onExpanded(false) onExpanded(false)
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_desc)) }, text = { Text(text = stringResource(R.string.action_desc)) },
onClick = { onClick = {
reorderQueue({ it.download.chapter.chapter_number }, true) reorderQueue({ it.download.chapter.chapter_number }, true)
onExpanded(false) onExpanded(false)
@ -217,7 +217,7 @@ class DownloadController :
}, },
) )
DropdownMenuItem( DropdownMenuItem(
text = { Text(text = stringResource(id = R.string.action_cancel_all)) }, text = { Text(text = stringResource(R.string.action_cancel_all)) },
onClick = { onClick = {
presenter.clearQueue(context) presenter.clearQueue(context)
onExpanded(false) onExpanded(false)