Convert Batch Add to Compose + Voyager
This commit is contained in:
@@ -0,0 +1,174 @@
|
||||
package exh.ui.batchadd
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.PaddingValues
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.height
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.lazy.itemsIndexed
|
||||
import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.text.KeyboardOptions
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.AlertDialog
|
||||
import androidx.compose.material3.LinearProgressIndicator
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.TextButton
|
||||
import androidx.compose.material3.TextField
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.collectAsState
|
||||
import androidx.compose.runtime.getValue
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.platform.LocalContext
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.style.TextAlign
|
||||
import androidx.compose.ui.unit.dp
|
||||
import cafe.adriel.voyager.core.model.rememberScreenModel
|
||||
import cafe.adriel.voyager.core.screen.Screen
|
||||
import cafe.adriel.voyager.navigator.LocalNavigator
|
||||
import cafe.adriel.voyager.navigator.currentOrThrow
|
||||
import eu.kanade.presentation.components.AppBar
|
||||
import eu.kanade.presentation.components.Button
|
||||
import eu.kanade.presentation.components.LazyColumn
|
||||
import eu.kanade.presentation.components.Scaffold
|
||||
import eu.kanade.presentation.util.LocalRouter
|
||||
import eu.kanade.presentation.util.padding
|
||||
import eu.kanade.presentation.util.plus
|
||||
import eu.kanade.tachiyomi.R
|
||||
|
||||
class BatchAddScreen : Screen {
|
||||
|
||||
@Composable
|
||||
override fun Content() {
|
||||
val screenModel = rememberScreenModel { BatchAddScreenModel() }
|
||||
val state by screenModel.state.collectAsState()
|
||||
val navigator = LocalNavigator.currentOrThrow
|
||||
val router = LocalRouter.currentOrThrow
|
||||
val context = LocalContext.current
|
||||
|
||||
Scaffold(
|
||||
topBar = { scrollBehavior ->
|
||||
AppBar(
|
||||
title = stringResource(R.string.batch_add),
|
||||
navigateUp = {
|
||||
when {
|
||||
navigator.canPop -> navigator.pop()
|
||||
else -> router.popCurrentController()
|
||||
}
|
||||
},
|
||||
scrollBehavior = scrollBehavior,
|
||||
)
|
||||
},
|
||||
) { paddingValues ->
|
||||
when (state.state) {
|
||||
BatchAddScreenModel.State.INPUT -> {
|
||||
Column(
|
||||
Modifier
|
||||
.padding(paddingValues)
|
||||
.verticalScroll(rememberScrollState())
|
||||
.padding(MaterialTheme.padding.medium),
|
||||
) {
|
||||
Text(text = stringResource(R.string.eh_batch_add_title), style = MaterialTheme.typography.titleLarge)
|
||||
Spacer(Modifier.height(8.dp))
|
||||
TextField(
|
||||
value = state.galleries,
|
||||
onValueChange = screenModel::updateGalleries,
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
placeholder = {
|
||||
Text(
|
||||
text = stringResource(R.string.eh_batch_add_description),
|
||||
)
|
||||
},
|
||||
keyboardOptions = KeyboardOptions(autoCorrect = false),
|
||||
textStyle = MaterialTheme.typography.bodyLarge,
|
||||
|
||||
)
|
||||
Spacer(Modifier.height(8.dp))
|
||||
Button(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
onClick = { screenModel.addGalleries(context) },
|
||||
) {
|
||||
Text(text = stringResource(R.string.eh_batch_add_button))
|
||||
}
|
||||
}
|
||||
}
|
||||
BatchAddScreenModel.State.PROGRESS -> {
|
||||
LazyColumn(
|
||||
contentPadding = paddingValues + PaddingValues(MaterialTheme.padding.medium),
|
||||
) {
|
||||
item(key = "top") {
|
||||
Column {
|
||||
Text(text = stringResource(R.string.eh_batch_add_adding_galleries), style = MaterialTheme.typography.titleLarge)
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
Row(
|
||||
Modifier.fillMaxWidth(),
|
||||
verticalAlignment = Alignment.CenterVertically,
|
||||
) {
|
||||
LinearProgressIndicator(
|
||||
progress = state.progress.toFloat() / state.progressTotal,
|
||||
Modifier
|
||||
.padding(top = 2.dp)
|
||||
.weight(1f),
|
||||
)
|
||||
Text(
|
||||
text = state.progress.toString() + "/" + state.progressTotal,
|
||||
modifier = Modifier.weight(0.15f),
|
||||
textAlign = TextAlign.Center,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
)
|
||||
}
|
||||
Spacer(modifier = Modifier.height(12.dp))
|
||||
}
|
||||
}
|
||||
itemsIndexed(
|
||||
state.events,
|
||||
key = { index, text -> index + text.hashCode() },
|
||||
) { _, text ->
|
||||
Text(
|
||||
text = text,
|
||||
style = MaterialTheme.typography.bodyMedium,
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
textAlign = TextAlign.Center,
|
||||
)
|
||||
}
|
||||
if (state.progress == state.progressTotal) {
|
||||
item(key = "finish") {
|
||||
Column {
|
||||
Spacer(modifier = Modifier.height(8.dp))
|
||||
Button(
|
||||
modifier = Modifier.fillMaxWidth(),
|
||||
onClick = screenModel::finish,
|
||||
) {
|
||||
Text(text = stringResource(R.string.eh_batch_add_finish))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val onDismissRequest = screenModel::dismissDialog
|
||||
when (state.dialog) {
|
||||
BatchAddScreenModel.Dialog.NoGalleriesSpecified -> AlertDialog(
|
||||
onDismissRequest = onDismissRequest,
|
||||
confirmButton = {
|
||||
TextButton(onClick = onDismissRequest) {
|
||||
Text(text = stringResource(android.R.string.ok))
|
||||
}
|
||||
},
|
||||
title = {
|
||||
Text(text = stringResource(R.string.batch_add_no_valid_galleries))
|
||||
},
|
||||
text = {
|
||||
Text(text = stringResource(R.string.batch_add_no_valid_galleries_message))
|
||||
},
|
||||
)
|
||||
null -> Unit
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user