mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-03 23:58:55 +01:00 
			
		
		
		
	Tweak categories view
- Remove Compose top app bar behaviour since it's kind of jank -- we'll probably just remove the scrolling behaviour everywhere - Tap title to rename - Focus in textfield when opening dialogs
This commit is contained in:
		@@ -3,13 +3,9 @@ package eu.kanade.presentation.category
 | 
			
		||||
import androidx.compose.foundation.layout.PaddingValues
 | 
			
		||||
import androidx.compose.foundation.layout.statusBarsPadding
 | 
			
		||||
import androidx.compose.foundation.lazy.rememberLazyListState
 | 
			
		||||
import androidx.compose.material3.TopAppBarDefaults
 | 
			
		||||
import androidx.compose.material3.rememberTopAppBarScrollState
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.runtime.LaunchedEffect
 | 
			
		||||
import androidx.compose.runtime.getValue
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.input.nestedscroll.nestedScroll
 | 
			
		||||
import androidx.compose.ui.platform.LocalContext
 | 
			
		||||
import eu.kanade.presentation.category.components.CategoryContent
 | 
			
		||||
import eu.kanade.presentation.category.components.CategoryCreateDialog
 | 
			
		||||
@@ -35,15 +31,10 @@ fun CategoryScreen(
 | 
			
		||||
    navigateUp: () -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    val lazyListState = rememberLazyListState()
 | 
			
		||||
    val topAppBarScrollState = rememberTopAppBarScrollState()
 | 
			
		||||
    val topAppBarScrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior(topAppBarScrollState)
 | 
			
		||||
    Scaffold(
 | 
			
		||||
        modifier = Modifier
 | 
			
		||||
            .statusBarsPadding()
 | 
			
		||||
            .nestedScroll(topAppBarScrollBehavior.nestedScrollConnection),
 | 
			
		||||
        modifier = Modifier.statusBarsPadding(),
 | 
			
		||||
        topBar = {
 | 
			
		||||
            CategoryTopAppBar(
 | 
			
		||||
                topAppBarScrollBehavior = topAppBarScrollBehavior,
 | 
			
		||||
                navigateUp = navigateUp,
 | 
			
		||||
            )
 | 
			
		||||
        },
 | 
			
		||||
 
 | 
			
		||||
@@ -4,12 +4,17 @@ import androidx.compose.material3.AlertDialog
 | 
			
		||||
import androidx.compose.material3.OutlinedTextField
 | 
			
		||||
import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.runtime.LaunchedEffect
 | 
			
		||||
import androidx.compose.runtime.mutableStateOf
 | 
			
		||||
import androidx.compose.runtime.remember
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.focus.FocusRequester
 | 
			
		||||
import androidx.compose.ui.focus.focusRequester
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import eu.kanade.domain.category.model.Category
 | 
			
		||||
import eu.kanade.presentation.components.TextButton
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import kotlinx.coroutines.delay
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun CategoryCreateDialog(
 | 
			
		||||
@@ -17,6 +22,8 @@ fun CategoryCreateDialog(
 | 
			
		||||
    onCreate: (String) -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    val (name, onNameChange) = remember { mutableStateOf("") }
 | 
			
		||||
    val focusRequester = remember { FocusRequester() }
 | 
			
		||||
 | 
			
		||||
    AlertDialog(
 | 
			
		||||
        onDismissRequest = onDismissRequest,
 | 
			
		||||
        confirmButton = {
 | 
			
		||||
@@ -24,27 +31,35 @@ fun CategoryCreateDialog(
 | 
			
		||||
                onCreate(name)
 | 
			
		||||
                onDismissRequest()
 | 
			
		||||
            },) {
 | 
			
		||||
                Text(text = stringResource(id = R.string.action_add))
 | 
			
		||||
                Text(text = stringResource(R.string.action_add))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        dismissButton = {
 | 
			
		||||
            TextButton(onClick = onDismissRequest) {
 | 
			
		||||
                Text(text = stringResource(id = R.string.action_cancel))
 | 
			
		||||
                Text(text = stringResource(R.string.action_cancel))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        title = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.action_add_category))
 | 
			
		||||
            Text(text = stringResource(R.string.action_add_category))
 | 
			
		||||
        },
 | 
			
		||||
        text = {
 | 
			
		||||
            OutlinedTextField(
 | 
			
		||||
                modifier = Modifier
 | 
			
		||||
                    .focusRequester(focusRequester),
 | 
			
		||||
                value = name,
 | 
			
		||||
                onValueChange = onNameChange,
 | 
			
		||||
                label = {
 | 
			
		||||
                    Text(text = stringResource(id = R.string.name))
 | 
			
		||||
                    Text(text = stringResource(R.string.name))
 | 
			
		||||
                },
 | 
			
		||||
            )
 | 
			
		||||
        },
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    LaunchedEffect(focusRequester) {
 | 
			
		||||
        // TODO: https://issuetracker.google.com/issues/204502668
 | 
			
		||||
        delay(100)
 | 
			
		||||
        focusRequester.requestFocus()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
@@ -54,6 +69,8 @@ fun CategoryRenameDialog(
 | 
			
		||||
    category: Category,
 | 
			
		||||
) {
 | 
			
		||||
    val (name, onNameChange) = remember { mutableStateOf(category.name) }
 | 
			
		||||
    val focusRequester = remember { FocusRequester.Default }
 | 
			
		||||
 | 
			
		||||
    AlertDialog(
 | 
			
		||||
        onDismissRequest = onDismissRequest,
 | 
			
		||||
        confirmButton = {
 | 
			
		||||
@@ -61,27 +78,35 @@ fun CategoryRenameDialog(
 | 
			
		||||
                onRename(name)
 | 
			
		||||
                onDismissRequest()
 | 
			
		||||
            },) {
 | 
			
		||||
                Text(text = stringResource(id = android.R.string.ok))
 | 
			
		||||
                Text(text = stringResource(android.R.string.ok))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        dismissButton = {
 | 
			
		||||
            TextButton(onClick = onDismissRequest) {
 | 
			
		||||
                Text(text = stringResource(id = R.string.action_cancel))
 | 
			
		||||
                Text(text = stringResource(R.string.action_cancel))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        title = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.action_rename_category))
 | 
			
		||||
            Text(text = stringResource(R.string.action_rename_category))
 | 
			
		||||
        },
 | 
			
		||||
        text = {
 | 
			
		||||
            OutlinedTextField(
 | 
			
		||||
                modifier = Modifier
 | 
			
		||||
                    .focusRequester(focusRequester),
 | 
			
		||||
                value = name,
 | 
			
		||||
                onValueChange = onNameChange,
 | 
			
		||||
                label = {
 | 
			
		||||
                    Text(text = stringResource(id = R.string.name))
 | 
			
		||||
                    Text(text = stringResource(R.string.name))
 | 
			
		||||
                },
 | 
			
		||||
            )
 | 
			
		||||
        },
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    LaunchedEffect(focusRequester) {
 | 
			
		||||
        // TODO: https://issuetracker.google.com/issues/204502668
 | 
			
		||||
        delay(100)
 | 
			
		||||
        focusRequester.requestFocus()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
 
 | 
			
		||||
@@ -20,7 +20,7 @@ fun CategoryFloatingActionButton(
 | 
			
		||||
    onCreate: () -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    ExtendedFloatingActionButton(
 | 
			
		||||
        text = { Text(text = stringResource(id = R.string.action_add)) },
 | 
			
		||||
        text = { Text(text = stringResource(R.string.action_add)) },
 | 
			
		||||
        icon = { Icon(imageVector = Icons.Outlined.Add, contentDescription = "") },
 | 
			
		||||
        onClick = onCreate,
 | 
			
		||||
        modifier = Modifier
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,9 @@
 | 
			
		||||
package eu.kanade.presentation.category.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.clickable
 | 
			
		||||
import androidx.compose.foundation.layout.Row
 | 
			
		||||
import androidx.compose.foundation.layout.Spacer
 | 
			
		||||
import androidx.compose.foundation.layout.fillMaxWidth
 | 
			
		||||
import androidx.compose.foundation.layout.padding
 | 
			
		||||
import androidx.compose.material.icons.Icons
 | 
			
		||||
import androidx.compose.material.icons.outlined.ArrowDropDown
 | 
			
		||||
@@ -35,11 +37,17 @@ fun CategoryListItem(
 | 
			
		||||
    ) {
 | 
			
		||||
        Row(
 | 
			
		||||
            modifier = Modifier
 | 
			
		||||
                .fillMaxWidth()
 | 
			
		||||
                .clickable { onRename() }
 | 
			
		||||
                .padding(start = horizontalPadding, top = horizontalPadding, end = horizontalPadding),
 | 
			
		||||
            verticalAlignment = Alignment.CenterVertically,
 | 
			
		||||
        ) {
 | 
			
		||||
            Icon(imageVector = Icons.Outlined.Label, contentDescription = "")
 | 
			
		||||
            Text(text = category.name, modifier = Modifier.padding(start = horizontalPadding))
 | 
			
		||||
            Text(
 | 
			
		||||
                text = category.name,
 | 
			
		||||
                modifier = Modifier
 | 
			
		||||
                    .padding(start = horizontalPadding),
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
        Row {
 | 
			
		||||
            IconButton(
 | 
			
		||||
 
 | 
			
		||||
@@ -6,14 +6,12 @@ import androidx.compose.material3.Icon
 | 
			
		||||
import androidx.compose.material3.IconButton
 | 
			
		||||
import androidx.compose.material3.SmallTopAppBar
 | 
			
		||||
import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.material3.TopAppBarScrollBehavior
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun CategoryTopAppBar(
 | 
			
		||||
    topAppBarScrollBehavior: TopAppBarScrollBehavior,
 | 
			
		||||
    navigateUp: () -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    SmallTopAppBar(
 | 
			
		||||
@@ -26,8 +24,7 @@ fun CategoryTopAppBar(
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        title = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.action_edit_categories))
 | 
			
		||||
            Text(text = stringResource(R.string.action_edit_categories))
 | 
			
		||||
        },
 | 
			
		||||
        scrollBehavior = topAppBarScrollBehavior,
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -57,7 +57,7 @@ fun LibraryGridCover(
 | 
			
		||||
        ) {
 | 
			
		||||
            if (isLocal) {
 | 
			
		||||
                Badge(
 | 
			
		||||
                    text = stringResource(id = R.string.local_source_badge),
 | 
			
		||||
                    text = stringResource(R.string.local_source_badge),
 | 
			
		||||
                    color = MaterialTheme.colorScheme.tertiary,
 | 
			
		||||
                    textColor = MaterialTheme.colorScheme.onTertiary,
 | 
			
		||||
                )
 | 
			
		||||
 
 | 
			
		||||
@@ -103,7 +103,7 @@ fun LibraryListItem(
 | 
			
		||||
            }
 | 
			
		||||
            if (item.isLocal) {
 | 
			
		||||
                Badge(
 | 
			
		||||
                    text = stringResource(id = R.string.local_source_badge),
 | 
			
		||||
                    text = stringResource(R.string.local_source_badge),
 | 
			
		||||
                    color = MaterialTheme.colorScheme.tertiary,
 | 
			
		||||
                    textColor = MaterialTheme.colorScheme.onTertiary,
 | 
			
		||||
                )
 | 
			
		||||
 
 | 
			
		||||
@@ -215,7 +215,7 @@ fun ExpandableMangaDescription(
 | 
			
		||||
            mutableStateOf(defaultExpandState)
 | 
			
		||||
        }
 | 
			
		||||
        val desc =
 | 
			
		||||
            description.takeIf { !it.isNullOrBlank() } ?: stringResource(id = R.string.description_placeholder)
 | 
			
		||||
            description.takeIf { !it.isNullOrBlank() } ?: stringResource(R.string.description_placeholder)
 | 
			
		||||
        val trimmedDescription = remember(desc) {
 | 
			
		||||
            desc
 | 
			
		||||
                .replace(whitespaceLineRegex, "\n")
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user