mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Minor tweaks to download custom dialog
- Allow large decrements (just goes to 0) - Use Material3 text field for proper theming - Move dialog composable to presentation package
This commit is contained in:
		@@ -9,7 +9,7 @@ import eu.kanade.tachiyomi.R
 | 
			
		||||
val Category.visualName: String
 | 
			
		||||
    @Composable
 | 
			
		||||
    get() = when {
 | 
			
		||||
        isSystemCategory -> stringResource(id = R.string.label_default)
 | 
			
		||||
        isSystemCategory -> stringResource(R.string.label_default)
 | 
			
		||||
        else -> name
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -110,7 +110,7 @@ fun AppBar(
 | 
			
		||||
                    IconButton(onClick = onCancelActionMode) {
 | 
			
		||||
                        Icon(
 | 
			
		||||
                            imageVector = Icons.Default.Close,
 | 
			
		||||
                            contentDescription = stringResource(id = R.string.action_cancel),
 | 
			
		||||
                            contentDescription = stringResource(R.string.action_cancel),
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                } else {
 | 
			
		||||
 
 | 
			
		||||
@@ -39,14 +39,14 @@ fun ChangeCategoryDialog(
 | 
			
		||||
                        onEditCategories()
 | 
			
		||||
                    },
 | 
			
		||||
                ) {
 | 
			
		||||
                    Text(text = stringResource(id = R.string.action_edit_categories))
 | 
			
		||||
                    Text(text = stringResource(R.string.action_edit_categories))
 | 
			
		||||
                }
 | 
			
		||||
            },
 | 
			
		||||
            title = {
 | 
			
		||||
                Text(text = stringResource(id = R.string.action_move_category))
 | 
			
		||||
                Text(text = stringResource(R.string.action_move_category))
 | 
			
		||||
            },
 | 
			
		||||
            text = {
 | 
			
		||||
                Text(text = stringResource(id = R.string.information_empty_category_dialog))
 | 
			
		||||
                Text(text = stringResource(R.string.information_empty_category_dialog))
 | 
			
		||||
            },
 | 
			
		||||
        )
 | 
			
		||||
        return
 | 
			
		||||
@@ -60,11 +60,11 @@ fun ChangeCategoryDialog(
 | 
			
		||||
                    onDismissRequest()
 | 
			
		||||
                    onEditCategories()
 | 
			
		||||
                },) {
 | 
			
		||||
                    Text(text = stringResource(id = R.string.action_edit))
 | 
			
		||||
                    Text(text = stringResource(R.string.action_edit))
 | 
			
		||||
                }
 | 
			
		||||
                Spacer(modifier = Modifier.weight(1f))
 | 
			
		||||
                TextButton(onClick = onDismissRequest) {
 | 
			
		||||
                    Text(text = stringResource(id = android.R.string.cancel))
 | 
			
		||||
                    Text(text = stringResource(android.R.string.cancel))
 | 
			
		||||
                }
 | 
			
		||||
                TextButton(
 | 
			
		||||
                    onClick = {
 | 
			
		||||
@@ -75,12 +75,12 @@ fun ChangeCategoryDialog(
 | 
			
		||||
                        )
 | 
			
		||||
                    },
 | 
			
		||||
                ) {
 | 
			
		||||
                    Text(text = stringResource(id = R.string.action_add))
 | 
			
		||||
                    Text(text = stringResource(R.string.action_add))
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        title = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.action_move_category))
 | 
			
		||||
            Text(text = stringResource(R.string.action_move_category))
 | 
			
		||||
        },
 | 
			
		||||
        text = {
 | 
			
		||||
            Column {
 | 
			
		||||
 
 | 
			
		||||
@@ -36,7 +36,7 @@ fun DeleteLibraryMangaDialog(
 | 
			
		||||
        onDismissRequest = onDismissRequest,
 | 
			
		||||
        dismissButton = {
 | 
			
		||||
            TextButton(onClick = onDismissRequest) {
 | 
			
		||||
                Text(text = stringResource(id = android.R.string.cancel))
 | 
			
		||||
                Text(text = stringResource(android.R.string.cancel))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        confirmButton = {
 | 
			
		||||
@@ -49,11 +49,11 @@ fun DeleteLibraryMangaDialog(
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            ) {
 | 
			
		||||
                Text(text = stringResource(id = android.R.string.ok))
 | 
			
		||||
                Text(text = stringResource(android.R.string.ok))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        title = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.action_remove))
 | 
			
		||||
            Text(text = stringResource(R.string.action_remove))
 | 
			
		||||
        },
 | 
			
		||||
        text = {
 | 
			
		||||
            Column {
 | 
			
		||||
@@ -69,7 +69,7 @@ fun DeleteLibraryMangaDialog(
 | 
			
		||||
                                list = mutableList.toList()
 | 
			
		||||
                            },
 | 
			
		||||
                        )
 | 
			
		||||
                        Text(text = stringResource(id = state.value))
 | 
			
		||||
                        Text(text = stringResource(state.value))
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -62,7 +62,7 @@ fun HistoryRegularToolbar(
 | 
			
		||||
    scrollBehavior: TopAppBarScrollBehavior,
 | 
			
		||||
) {
 | 
			
		||||
    AppBar(
 | 
			
		||||
        title = stringResource(id = R.string.history),
 | 
			
		||||
        title = stringResource(R.string.history),
 | 
			
		||||
        actions = {
 | 
			
		||||
            IconButton(onClick = onClickSearch) {
 | 
			
		||||
                Icon(Icons.Outlined.Search, contentDescription = stringResource(R.string.action_search))
 | 
			
		||||
@@ -105,7 +105,7 @@ fun HistorySearchToolbar(
 | 
			
		||||
        actions = {
 | 
			
		||||
            AnimatedVisibility(visible = searchQuery.isNotEmpty()) {
 | 
			
		||||
                IconButton(onClick = onClickResetSearch) {
 | 
			
		||||
                    Icon(Icons.Outlined.Close, contentDescription = stringResource(id = R.string.action_reset))
 | 
			
		||||
                    Icon(Icons.Outlined.Close, contentDescription = stringResource(R.string.action_reset))
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 
 | 
			
		||||
@@ -193,7 +193,7 @@ fun LibrarySearchToolbar(
 | 
			
		||||
        actions = {
 | 
			
		||||
            AnimatedVisibility(visible = searchQuery.isNotEmpty()) {
 | 
			
		||||
                IconButton(onClick = onClickResetSearch) {
 | 
			
		||||
                    Icon(Icons.Outlined.Close, contentDescription = stringResource(id = R.string.action_reset))
 | 
			
		||||
                    Icon(Icons.Outlined.Close, contentDescription = stringResource(R.string.action_reset))
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
package eu.kanade.tachiyomi.ui.manga.chapter
 | 
			
		||||
package eu.kanade.presentation.manga.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.layout.Row
 | 
			
		||||
import androidx.compose.foundation.text.BasicTextField
 | 
			
		||||
import androidx.compose.foundation.text.KeyboardOptions
 | 
			
		||||
import androidx.compose.material.icons.Icons
 | 
			
		||||
import androidx.compose.material.icons.outlined.ChevronLeft
 | 
			
		||||
@@ -11,6 +10,8 @@ import androidx.compose.material.icons.outlined.KeyboardDoubleArrowRight
 | 
			
		||||
import androidx.compose.material3.AlertDialog
 | 
			
		||||
import androidx.compose.material3.Icon
 | 
			
		||||
import androidx.compose.material3.IconButton
 | 
			
		||||
import androidx.compose.material3.LocalTextStyle
 | 
			
		||||
import androidx.compose.material3.OutlinedTextField
 | 
			
		||||
import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.material3.TextButton
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
@@ -19,8 +20,10 @@ import androidx.compose.runtime.mutableStateOf
 | 
			
		||||
import androidx.compose.runtime.remember
 | 
			
		||||
import androidx.compose.runtime.setValue
 | 
			
		||||
import androidx.compose.ui.Alignment
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import androidx.compose.ui.text.input.KeyboardType
 | 
			
		||||
import androidx.compose.ui.text.style.TextAlign
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
@@ -34,7 +37,7 @@ fun DownloadCustomAmountDialog(
 | 
			
		||||
        onDismissRequest = onDismissRequest,
 | 
			
		||||
        dismissButton = {
 | 
			
		||||
            TextButton(onClick = onDismissRequest) {
 | 
			
		||||
                Text(text = stringResource(id = android.R.string.cancel))
 | 
			
		||||
                Text(text = stringResource(android.R.string.cancel))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        confirmButton = {
 | 
			
		||||
@@ -44,11 +47,11 @@ fun DownloadCustomAmountDialog(
 | 
			
		||||
                    onConfirm(amount.coerceIn(0, maxAmount))
 | 
			
		||||
                },
 | 
			
		||||
            ) {
 | 
			
		||||
                Text(text = stringResource(id = android.R.string.ok))
 | 
			
		||||
                Text(text = stringResource(R.string.action_download))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        title = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.custom_download))
 | 
			
		||||
            Text(text = stringResource(R.string.custom_download))
 | 
			
		||||
        },
 | 
			
		||||
        text = {
 | 
			
		||||
            val onChangeAmount: (Int) -> Unit = { amount = (amount + it).coerceIn(0, maxAmount) }
 | 
			
		||||
@@ -57,7 +60,7 @@ fun DownloadCustomAmountDialog(
 | 
			
		||||
            ) {
 | 
			
		||||
                IconButton(
 | 
			
		||||
                    onClick = { onChangeAmount(-10) },
 | 
			
		||||
                    enabled = amount > 10,
 | 
			
		||||
                    enabled = amount > 0,
 | 
			
		||||
                ) {
 | 
			
		||||
                    Icon(imageVector = Icons.Outlined.KeyboardDoubleArrowLeft, contentDescription = "")
 | 
			
		||||
                }
 | 
			
		||||
@@ -67,10 +70,12 @@ fun DownloadCustomAmountDialog(
 | 
			
		||||
                ) {
 | 
			
		||||
                    Icon(imageVector = Icons.Outlined.ChevronLeft, contentDescription = "")
 | 
			
		||||
                }
 | 
			
		||||
                BasicTextField(
 | 
			
		||||
                OutlinedTextField(
 | 
			
		||||
                    modifier = Modifier.weight(1f),
 | 
			
		||||
                    value = amount.toString(),
 | 
			
		||||
                    onValueChange = { onChangeAmount(it.toIntOrNull() ?: 0) },
 | 
			
		||||
                    keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number),
 | 
			
		||||
                    textStyle = LocalTextStyle.current.copy(textAlign = TextAlign.Center),
 | 
			
		||||
                )
 | 
			
		||||
                IconButton(
 | 
			
		||||
                    onClick = { onChangeAmount(1) },
 | 
			
		||||
 
 | 
			
		||||
@@ -0,0 +1,57 @@
 | 
			
		||||
package eu.kanade.presentation.manga.components
 | 
			
		||||
 | 
			
		||||
import androidx.compose.foundation.layout.Row
 | 
			
		||||
import androidx.compose.foundation.layout.Spacer
 | 
			
		||||
import androidx.compose.material3.AlertDialog
 | 
			
		||||
import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.material3.TextButton
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.Source
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun DuplicateMangaDialog(
 | 
			
		||||
    onDismissRequest: () -> Unit,
 | 
			
		||||
    onConfirm: () -> Unit,
 | 
			
		||||
    onOpenManga: () -> Unit,
 | 
			
		||||
    duplicateFrom: Source,
 | 
			
		||||
) {
 | 
			
		||||
    AlertDialog(
 | 
			
		||||
        onDismissRequest = onDismissRequest,
 | 
			
		||||
        confirmButton = {
 | 
			
		||||
            Row {
 | 
			
		||||
                TextButton(onClick = {
 | 
			
		||||
                    onDismissRequest()
 | 
			
		||||
                    onOpenManga()
 | 
			
		||||
                },) {
 | 
			
		||||
                    Text(text = stringResource(R.string.action_show_manga))
 | 
			
		||||
                }
 | 
			
		||||
                Spacer(modifier = Modifier.weight(1f))
 | 
			
		||||
                TextButton(onClick = onDismissRequest) {
 | 
			
		||||
                    Text(text = stringResource(android.R.string.cancel))
 | 
			
		||||
                }
 | 
			
		||||
                TextButton(
 | 
			
		||||
                    onClick = {
 | 
			
		||||
                        onDismissRequest()
 | 
			
		||||
                        onConfirm()
 | 
			
		||||
                    },
 | 
			
		||||
                ) {
 | 
			
		||||
                    Text(text = stringResource(R.string.action_add))
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        title = {
 | 
			
		||||
            Text(text = stringResource(R.string.are_you_sure))
 | 
			
		||||
        },
 | 
			
		||||
        text = {
 | 
			
		||||
            Text(
 | 
			
		||||
                text = stringResource(
 | 
			
		||||
                    id = R.string.confirm_manga_add_duplicate,
 | 
			
		||||
                    duplicateFrom.name,
 | 
			
		||||
                ),
 | 
			
		||||
            )
 | 
			
		||||
        },
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
@@ -16,7 +16,7 @@ fun DeleteChaptersDialog(
 | 
			
		||||
        onDismissRequest = onDismissRequest,
 | 
			
		||||
        dismissButton = {
 | 
			
		||||
            TextButton(onClick = onDismissRequest) {
 | 
			
		||||
                Text(text = stringResource(id = android.R.string.cancel))
 | 
			
		||||
                Text(text = stringResource(android.R.string.cancel))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        confirmButton = {
 | 
			
		||||
@@ -26,14 +26,14 @@ fun DeleteChaptersDialog(
 | 
			
		||||
                    onConfirm()
 | 
			
		||||
                },
 | 
			
		||||
            ) {
 | 
			
		||||
                Text(text = stringResource(id = android.R.string.ok))
 | 
			
		||||
                Text(text = stringResource(android.R.string.ok))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        title = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.are_you_sure))
 | 
			
		||||
            Text(text = stringResource(R.string.are_you_sure))
 | 
			
		||||
        },
 | 
			
		||||
        text = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.confirm_delete_chapters))
 | 
			
		||||
            Text(text = stringResource(R.string.confirm_delete_chapters))
 | 
			
		||||
        },
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,7 +35,7 @@ fun ClearDatabaseContent(
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            false -> EmptyScreen(message = stringResource(id = R.string.database_clean))
 | 
			
		||||
            false -> EmptyScreen(message = stringResource(R.string.database_clean))
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -16,16 +16,16 @@ fun ClearDatabaseDeleteDialog(
 | 
			
		||||
        onDismissRequest = onDismissRequest,
 | 
			
		||||
        confirmButton = {
 | 
			
		||||
            TextButton(onClick = onDelete) {
 | 
			
		||||
                Text(text = stringResource(id = android.R.string.ok))
 | 
			
		||||
                Text(text = stringResource(android.R.string.ok))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        dismissButton = {
 | 
			
		||||
            TextButton(onClick = onDismissRequest) {
 | 
			
		||||
                Text(text = stringResource(id = android.R.string.cancel))
 | 
			
		||||
                Text(text = stringResource(android.R.string.cancel))
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        text = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.clear_database_confirmation))
 | 
			
		||||
            Text(text = stringResource(R.string.clear_database_confirmation))
 | 
			
		||||
        },
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -27,7 +27,7 @@ fun ClearDatabaseFloatingActionButton(
 | 
			
		||||
        ExtendedFloatingActionButton(
 | 
			
		||||
            modifier = Modifier.navigationBarsPadding(),
 | 
			
		||||
            text = {
 | 
			
		||||
                Text(text = stringResource(id = R.string.action_delete))
 | 
			
		||||
                Text(text = stringResource(R.string.action_delete))
 | 
			
		||||
            },
 | 
			
		||||
            icon = {
 | 
			
		||||
                Icon(Icons.Outlined.Delete, contentDescription = "")
 | 
			
		||||
 
 | 
			
		||||
@@ -43,7 +43,7 @@ fun ClearDatabaseItem(
 | 
			
		||||
                text = source.visualName,
 | 
			
		||||
                style = MaterialTheme.typography.bodyMedium,
 | 
			
		||||
            )
 | 
			
		||||
            Text(text = stringResource(id = R.string.clear_database_source_item_count, count))
 | 
			
		||||
            Text(text = stringResource(R.string.clear_database_source_item_count, count))
 | 
			
		||||
        }
 | 
			
		||||
        Checkbox(
 | 
			
		||||
            checked = isSelected,
 | 
			
		||||
 
 | 
			
		||||
@@ -18,19 +18,19 @@ fun ClearDatabaseToolbar(
 | 
			
		||||
    onClickInvertSelection: () -> Unit,
 | 
			
		||||
) {
 | 
			
		||||
    AppBar(
 | 
			
		||||
        title = stringResource(id = R.string.pref_clear_database),
 | 
			
		||||
        title = stringResource(R.string.pref_clear_database),
 | 
			
		||||
        navigateUp = navigateUp,
 | 
			
		||||
        actions = {
 | 
			
		||||
            if (state.isEmpty.not()) {
 | 
			
		||||
                AppBarActions(
 | 
			
		||||
                    actions = listOf(
 | 
			
		||||
                        AppBar.Action(
 | 
			
		||||
                            title = stringResource(id = R.string.action_select_all),
 | 
			
		||||
                            title = stringResource(R.string.action_select_all),
 | 
			
		||||
                            icon = Icons.Outlined.SelectAll,
 | 
			
		||||
                            onClick = onClickSelectAll,
 | 
			
		||||
                        ),
 | 
			
		||||
                        AppBar.Action(
 | 
			
		||||
                            title = stringResource(id = R.string.action_select_all),
 | 
			
		||||
                            title = stringResource(R.string.action_select_all),
 | 
			
		||||
                            icon = Icons.Outlined.FlipToBack,
 | 
			
		||||
                            onClick = onClickInvertSelection,
 | 
			
		||||
                        ),
 | 
			
		||||
 
 | 
			
		||||
@@ -92,7 +92,7 @@ class UpdatesGridGlanceWidget : GlanceAppWidget() {
 | 
			
		||||
            contentAlignment = Alignment.Center,
 | 
			
		||||
        ) {
 | 
			
		||||
            Text(
 | 
			
		||||
                text = stringResource(id = R.string.appwidget_unavailable_locked),
 | 
			
		||||
                text = stringResource(R.string.appwidget_unavailable_locked),
 | 
			
		||||
                style = TextStyle(
 | 
			
		||||
                    color = ColorProvider(R.color.appwidget_on_secondary_container),
 | 
			
		||||
                    fontSize = 12.sp,
 | 
			
		||||
@@ -114,7 +114,7 @@ class UpdatesGridGlanceWidget : GlanceAppWidget() {
 | 
			
		||||
            if (inData == null) {
 | 
			
		||||
                CircularProgressIndicator()
 | 
			
		||||
            } else if (inData.isEmpty()) {
 | 
			
		||||
                Text(text = stringResource(id = R.string.information_no_recent))
 | 
			
		||||
                Text(text = stringResource(R.string.information_no_recent))
 | 
			
		||||
            } else {
 | 
			
		||||
                (0 until rowCount).forEach { i ->
 | 
			
		||||
                    val coverRow = (0 until columnCount).mapNotNull { j ->
 | 
			
		||||
 
 | 
			
		||||
@@ -641,7 +641,7 @@ class LibraryPresenter(
 | 
			
		||||
    fun getToolbarTitle(): androidx.compose.runtime.State<LibraryToolbarTitle> {
 | 
			
		||||
        val category = categories.getOrNull(activeCategory)
 | 
			
		||||
 | 
			
		||||
        val defaultTitle = stringResource(id = R.string.label_library)
 | 
			
		||||
        val defaultTitle = stringResource(R.string.label_library)
 | 
			
		||||
        val categoryName = category?.visualName ?: defaultTitle
 | 
			
		||||
 | 
			
		||||
        val default = remember { LibraryToolbarTitle(defaultTitle) }
 | 
			
		||||
 
 | 
			
		||||
@@ -2,19 +2,10 @@ package eu.kanade.tachiyomi.ui.manga
 | 
			
		||||
 | 
			
		||||
import android.app.Dialog
 | 
			
		||||
import android.os.Bundle
 | 
			
		||||
import androidx.compose.foundation.layout.Row
 | 
			
		||||
import androidx.compose.foundation.layout.Spacer
 | 
			
		||||
import androidx.compose.material3.AlertDialog
 | 
			
		||||
import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.material3.TextButton
 | 
			
		||||
import androidx.compose.runtime.Composable
 | 
			
		||||
import androidx.compose.ui.Modifier
 | 
			
		||||
import androidx.compose.ui.res.stringResource
 | 
			
		||||
import com.bluelinelabs.conductor.Controller
 | 
			
		||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
 | 
			
		||||
import eu.kanade.domain.manga.model.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.source.Source
 | 
			
		||||
import eu.kanade.tachiyomi.source.SourceManager
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.DialogController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.base.controller.pushController
 | 
			
		||||
@@ -55,48 +46,3 @@ class AddDuplicateMangaDialog(bundle: Bundle? = null) : DialogController(bundle)
 | 
			
		||||
            .create()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@Composable
 | 
			
		||||
fun DuplicateDialog(
 | 
			
		||||
    onDismissRequest: () -> Unit,
 | 
			
		||||
    onConfirm: () -> Unit,
 | 
			
		||||
    onOpenManga: () -> Unit,
 | 
			
		||||
    duplicateFrom: Source,
 | 
			
		||||
) {
 | 
			
		||||
    AlertDialog(
 | 
			
		||||
        onDismissRequest = onDismissRequest,
 | 
			
		||||
        confirmButton = {
 | 
			
		||||
            Row {
 | 
			
		||||
                TextButton(onClick = {
 | 
			
		||||
                    onDismissRequest()
 | 
			
		||||
                    onOpenManga()
 | 
			
		||||
                },) {
 | 
			
		||||
                    Text(text = stringResource(id = R.string.action_show_manga))
 | 
			
		||||
                }
 | 
			
		||||
                Spacer(modifier = Modifier.weight(1f))
 | 
			
		||||
                TextButton(onClick = onDismissRequest) {
 | 
			
		||||
                    Text(text = stringResource(id = android.R.string.cancel))
 | 
			
		||||
                }
 | 
			
		||||
                TextButton(
 | 
			
		||||
                    onClick = {
 | 
			
		||||
                        onDismissRequest()
 | 
			
		||||
                        onConfirm()
 | 
			
		||||
                    },
 | 
			
		||||
                ) {
 | 
			
		||||
                    Text(text = stringResource(id = R.string.action_add))
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        },
 | 
			
		||||
        title = {
 | 
			
		||||
            Text(text = stringResource(id = R.string.are_you_sure))
 | 
			
		||||
        },
 | 
			
		||||
        text = {
 | 
			
		||||
            Text(
 | 
			
		||||
                text = stringResource(
 | 
			
		||||
                    id = R.string.confirm_manga_add_duplicate,
 | 
			
		||||
                    duplicateFrom.name,
 | 
			
		||||
                ),
 | 
			
		||||
            )
 | 
			
		||||
        },
 | 
			
		||||
    )
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -26,6 +26,8 @@ import eu.kanade.presentation.components.LoadingScreen
 | 
			
		||||
import eu.kanade.presentation.manga.DownloadAction
 | 
			
		||||
import eu.kanade.presentation.manga.MangaScreen
 | 
			
		||||
import eu.kanade.presentation.manga.components.DeleteChaptersDialog
 | 
			
		||||
import eu.kanade.presentation.manga.components.DownloadCustomAmountDialog
 | 
			
		||||
import eu.kanade.presentation.manga.components.DuplicateMangaDialog
 | 
			
		||||
import eu.kanade.presentation.util.calculateWindowWidthSizeClass
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.DownloadService
 | 
			
		||||
@@ -46,7 +48,6 @@ import eu.kanade.tachiyomi.ui.library.LibraryController
 | 
			
		||||
import eu.kanade.tachiyomi.ui.main.MainActivity
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.MangaPresenter.Dialog
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.chapter.ChaptersSettingsSheet
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.chapter.DownloadCustomAmountDialog
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.info.MangaFullCoverDialog
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.track.TrackItem
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.track.TrackSearchDialog
 | 
			
		||||
@@ -105,6 +106,12 @@ class MangaController : FullComposeController<MangaPresenter> {
 | 
			
		||||
    @Composable
 | 
			
		||||
    override fun ComposeContent() {
 | 
			
		||||
        val state by presenter.state.collectAsState()
 | 
			
		||||
 | 
			
		||||
        if (state is MangaScreenState.Loading) {
 | 
			
		||||
            LoadingScreen()
 | 
			
		||||
            return
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        val dialog by derivedStateOf {
 | 
			
		||||
            when (val state = state) {
 | 
			
		||||
                MangaScreenState.Loading -> null
 | 
			
		||||
@@ -112,93 +119,88 @@ class MangaController : FullComposeController<MangaPresenter> {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (state is MangaScreenState.Success) {
 | 
			
		||||
            val successState = state as MangaScreenState.Success
 | 
			
		||||
            val isHttpSource = remember { successState.source is HttpSource }
 | 
			
		||||
        val successState = state as MangaScreenState.Success
 | 
			
		||||
        val isHttpSource = remember { successState.source is HttpSource }
 | 
			
		||||
        val scope = rememberCoroutineScope()
 | 
			
		||||
 | 
			
		||||
            val scope = rememberCoroutineScope()
 | 
			
		||||
        MangaScreen(
 | 
			
		||||
            state = successState,
 | 
			
		||||
            snackbarHostState = snackbarHostState,
 | 
			
		||||
            windowWidthSizeClass = calculateWindowWidthSizeClass(),
 | 
			
		||||
            onBackClicked = router::popCurrentController,
 | 
			
		||||
            onChapterClicked = this::openChapter,
 | 
			
		||||
            onDownloadChapter = this::onDownloadChapters.takeIf { !successState.source.isLocalOrStub() },
 | 
			
		||||
            onAddToLibraryClicked = this::onFavoriteClick,
 | 
			
		||||
            onWebViewClicked = this::openMangaInWebView.takeIf { isHttpSource },
 | 
			
		||||
            onTrackingClicked = trackSheet::show.takeIf { successState.trackingAvailable },
 | 
			
		||||
            onTagClicked = this::performGenreSearch,
 | 
			
		||||
            onFilterButtonClicked = settingsSheet::show,
 | 
			
		||||
            onRefresh = presenter::fetchAllFromSource,
 | 
			
		||||
            onContinueReading = this::continueReading,
 | 
			
		||||
            onSearch = this::performSearch,
 | 
			
		||||
            onCoverClicked = this::openCoverDialog,
 | 
			
		||||
            onShareClicked = this::shareManga.takeIf { isHttpSource },
 | 
			
		||||
            onDownloadActionClicked = this::runDownloadChapterAction.takeIf { !successState.source.isLocalOrStub() },
 | 
			
		||||
            onEditCategoryClicked = presenter::promptChangeCategories.takeIf { successState.manga.favorite },
 | 
			
		||||
            onMigrateClicked = this::migrateManga.takeIf { successState.manga.favorite },
 | 
			
		||||
            onMultiBookmarkClicked = presenter::bookmarkChapters,
 | 
			
		||||
            onMultiMarkAsReadClicked = presenter::markChaptersRead,
 | 
			
		||||
            onMarkPreviousAsReadClicked = presenter::markPreviousChapterRead,
 | 
			
		||||
            onMultiDeleteClicked = presenter::showDeleteChapterDialog,
 | 
			
		||||
            onChapterSelected = presenter::toggleSelection,
 | 
			
		||||
            onAllChapterSelected = presenter::toggleAllSelection,
 | 
			
		||||
            onInvertSelection = presenter::invertSelection,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
            MangaScreen(
 | 
			
		||||
                state = successState,
 | 
			
		||||
                snackbarHostState = snackbarHostState,
 | 
			
		||||
                windowWidthSizeClass = calculateWindowWidthSizeClass(),
 | 
			
		||||
                onBackClicked = router::popCurrentController,
 | 
			
		||||
                onChapterClicked = this::openChapter,
 | 
			
		||||
                onDownloadChapter = this::onDownloadChapters.takeIf { !successState.source.isLocalOrStub() },
 | 
			
		||||
                onAddToLibraryClicked = this::onFavoriteClick,
 | 
			
		||||
                onWebViewClicked = this::openMangaInWebView.takeIf { isHttpSource },
 | 
			
		||||
                onTrackingClicked = trackSheet::show.takeIf { successState.trackingAvailable },
 | 
			
		||||
                onTagClicked = this::performGenreSearch,
 | 
			
		||||
                onFilterButtonClicked = settingsSheet::show,
 | 
			
		||||
                onRefresh = presenter::fetchAllFromSource,
 | 
			
		||||
                onContinueReading = this::continueReading,
 | 
			
		||||
                onSearch = this::performSearch,
 | 
			
		||||
                onCoverClicked = this::openCoverDialog,
 | 
			
		||||
                onShareClicked = this::shareManga.takeIf { isHttpSource },
 | 
			
		||||
                onDownloadActionClicked = this::runDownloadChapterAction.takeIf { !successState.source.isLocalOrStub() },
 | 
			
		||||
                onEditCategoryClicked = presenter::promptChangeCategories.takeIf { successState.manga.favorite },
 | 
			
		||||
                onMigrateClicked = this::migrateManga.takeIf { successState.manga.favorite },
 | 
			
		||||
                onMultiBookmarkClicked = presenter::bookmarkChapters,
 | 
			
		||||
                onMultiMarkAsReadClicked = presenter::markChaptersRead,
 | 
			
		||||
                onMarkPreviousAsReadClicked = presenter::markPreviousChapterRead,
 | 
			
		||||
                onMultiDeleteClicked = presenter::showDeleteChapterDialog,
 | 
			
		||||
                onChapterSelected = presenter::toggleSelection,
 | 
			
		||||
                onAllChapterSelected = presenter::toggleAllSelection,
 | 
			
		||||
                onInvertSelection = presenter::invertSelection,
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
            val onDismissRequest = { presenter.dismissDialog() }
 | 
			
		||||
            when (val dialog = dialog) {
 | 
			
		||||
                is Dialog.ChangeCategory -> {
 | 
			
		||||
                    ChangeCategoryDialog(
 | 
			
		||||
                        initialSelection = dialog.initialSelection,
 | 
			
		||||
                        onDismissRequest = onDismissRequest,
 | 
			
		||||
                        onEditCategories = {
 | 
			
		||||
                            router.pushController(CategoryController())
 | 
			
		||||
                        },
 | 
			
		||||
                        onConfirm = { include, _ ->
 | 
			
		||||
                            presenter.moveMangaToCategoriesAndAddToLibrary(dialog.manga, include)
 | 
			
		||||
                        },
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                is Dialog.DeleteChapters -> {
 | 
			
		||||
                    DeleteChaptersDialog(
 | 
			
		||||
                        onDismissRequest = onDismissRequest,
 | 
			
		||||
                        onConfirm = {
 | 
			
		||||
                            deleteChapters(dialog.chapters)
 | 
			
		||||
                        },
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                is Dialog.DownloadCustomAmount -> {
 | 
			
		||||
                    DownloadCustomAmountDialog(
 | 
			
		||||
                        maxAmount = dialog.max,
 | 
			
		||||
                        onDismissRequest = onDismissRequest,
 | 
			
		||||
                        onConfirm = { amount ->
 | 
			
		||||
                            val chaptersToDownload = presenter.getUnreadChaptersSorted().take(amount)
 | 
			
		||||
                            if (chaptersToDownload.isNotEmpty()) {
 | 
			
		||||
                                scope.launch { downloadChapters(chaptersToDownload) }
 | 
			
		||||
                            }
 | 
			
		||||
                        },
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                is Dialog.DuplicateManga -> {
 | 
			
		||||
                    DuplicateDialog(
 | 
			
		||||
                        onDismissRequest = onDismissRequest,
 | 
			
		||||
                        onConfirm = {
 | 
			
		||||
                            presenter.toggleFavorite(
 | 
			
		||||
                                onRemoved = {},
 | 
			
		||||
                                onAdded = {},
 | 
			
		||||
                                checkDuplicate = false,
 | 
			
		||||
                            )
 | 
			
		||||
                        },
 | 
			
		||||
                        onOpenManga = { router.pushController(MangaController(dialog.duplicate.id)) },
 | 
			
		||||
                        duplicateFrom = presenter.getSourceOrStub(dialog.duplicate),
 | 
			
		||||
                    )
 | 
			
		||||
                }
 | 
			
		||||
                null -> {}
 | 
			
		||||
        val onDismissRequest = { presenter.dismissDialog() }
 | 
			
		||||
        when (val dialog = dialog) {
 | 
			
		||||
            is Dialog.ChangeCategory -> {
 | 
			
		||||
                ChangeCategoryDialog(
 | 
			
		||||
                    initialSelection = dialog.initialSelection,
 | 
			
		||||
                    onDismissRequest = onDismissRequest,
 | 
			
		||||
                    onEditCategories = {
 | 
			
		||||
                        router.pushController(CategoryController())
 | 
			
		||||
                    },
 | 
			
		||||
                    onConfirm = { include, _ ->
 | 
			
		||||
                        presenter.moveMangaToCategoriesAndAddToLibrary(dialog.manga, include)
 | 
			
		||||
                    },
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            LoadingScreen()
 | 
			
		||||
            is Dialog.DeleteChapters -> {
 | 
			
		||||
                DeleteChaptersDialog(
 | 
			
		||||
                    onDismissRequest = onDismissRequest,
 | 
			
		||||
                    onConfirm = {
 | 
			
		||||
                        deleteChapters(dialog.chapters)
 | 
			
		||||
                    },
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
            is Dialog.DownloadCustomAmount -> {
 | 
			
		||||
                DownloadCustomAmountDialog(
 | 
			
		||||
                    maxAmount = dialog.max,
 | 
			
		||||
                    onDismissRequest = onDismissRequest,
 | 
			
		||||
                    onConfirm = { amount ->
 | 
			
		||||
                        val chaptersToDownload = presenter.getUnreadChaptersSorted().take(amount)
 | 
			
		||||
                        if (chaptersToDownload.isNotEmpty()) {
 | 
			
		||||
                            scope.launch { downloadChapters(chaptersToDownload) }
 | 
			
		||||
                        }
 | 
			
		||||
                    },
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
            is Dialog.DuplicateManga -> {
 | 
			
		||||
                DuplicateMangaDialog(
 | 
			
		||||
                    onDismissRequest = onDismissRequest,
 | 
			
		||||
                    onConfirm = {
 | 
			
		||||
                        presenter.toggleFavorite(
 | 
			
		||||
                            onRemoved = {},
 | 
			
		||||
                            onAdded = {},
 | 
			
		||||
                            checkDuplicate = false,
 | 
			
		||||
                        )
 | 
			
		||||
                    },
 | 
			
		||||
                    onOpenManga = { router.pushController(MangaController(dialog.duplicate.id)) },
 | 
			
		||||
                    duplicateFrom = presenter.getSourceOrStub(dialog.duplicate),
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
            null -> {}
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@@ -427,7 +429,7 @@ class MangaController : FullComposeController<MangaPresenter> {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fun deleteChapters(chapters: List<DomainChapter>) {
 | 
			
		||||
    private fun deleteChapters(chapters: List<DomainChapter>) {
 | 
			
		||||
        if (chapters.isEmpty()) return
 | 
			
		||||
        presenter.deleteChapters(chapters)
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user