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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -28,9 +28,8 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.style.TextOverflow
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.IncognitoModeBanner
import eu.kanade.presentation.manga.DownloadAction
import eu.kanade.tachiyomi.R
@ -247,11 +246,6 @@ fun MangaAppBar(
),
)
if (downloadedOnlyMode) {
DownloadedOnlyModeBanner()
}
if (incognitoMode) {
IncognitoModeBanner()
}
AppStateBanners(downloadedOnlyMode, incognitoMode)
}
}

View File

@ -1,5 +1,6 @@
package eu.kanade.presentation.more.settings.database
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import eu.kanade.presentation.components.Scaffold
@ -17,6 +18,7 @@ fun ClearDatabaseScreen(
navigateUp: () -> Unit,
) {
val context = LocalContext.current
val lazyListState = rememberLazyListState()
Scaffold(
topBar = { scrollBehavior ->
ClearDatabaseToolbar(
@ -30,6 +32,7 @@ fun ClearDatabaseScreen(
floatingActionButton = {
ClearDatabaseFloatingActionButton(
isVisible = presenter.selection.isNotEmpty(),
lazyListState = lazyListState,
onClickDelete = {
presenter.dialog = ClearDatabasePresenter.Dialog.Delete(presenter.selection)
},
@ -39,6 +42,7 @@ fun ClearDatabaseScreen(
ClearDatabaseContent(
state = presenter,
contentPadding = paddingValues,
lazyListState = lazyListState,
onClickSelection = { 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.asPaddingValues
import androidx.compose.foundation.layout.navigationBars
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items
import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
@ -19,12 +20,14 @@ import eu.kanade.tachiyomi.R
fun ClearDatabaseContent(
state: ClearDatabaseState,
contentPadding: PaddingValues,
lazyListState: LazyListState,
onClickSelection: (Source) -> Unit,
) {
Crossfade(targetState = state.isEmpty.not()) { _state ->
when (_state) {
true -> FastScrollLazyColumn(
contentPadding = contentPadding + WindowInsets.navigationBars.asPaddingValues(),
state = lazyListState,
) {
items(state.items) { sourceWithCount ->
ClearDatabaseItem(

View File

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

View File

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