OrientationSelectDialog.kt 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package eu.kanade.presentation.reader
  2. import androidx.compose.foundation.layout.Column
  3. import androidx.compose.foundation.layout.fillMaxWidth
  4. import androidx.compose.foundation.lazy.grid.items
  5. import androidx.compose.material3.Surface
  6. import androidx.compose.runtime.Composable
  7. import androidx.compose.runtime.collectAsState
  8. import androidx.compose.runtime.getValue
  9. import androidx.compose.runtime.mutableStateOf
  10. import androidx.compose.runtime.remember
  11. import androidx.compose.runtime.setValue
  12. import androidx.compose.ui.Modifier
  13. import androidx.compose.ui.tooling.preview.PreviewLightDark
  14. import dev.icerock.moko.resources.StringResource
  15. import eu.kanade.domain.manga.model.readerOrientation
  16. import eu.kanade.presentation.components.AdaptiveSheet
  17. import eu.kanade.presentation.reader.components.ModeSelectionDialog
  18. import eu.kanade.presentation.theme.TachiyomiPreviewTheme
  19. import eu.kanade.tachiyomi.ui.reader.setting.ReaderOrientation
  20. import eu.kanade.tachiyomi.ui.reader.setting.ReaderSettingsScreenModel
  21. import tachiyomi.i18n.MR
  22. import tachiyomi.presentation.core.components.SettingsIconGrid
  23. import tachiyomi.presentation.core.components.material.IconToggleButton
  24. import tachiyomi.presentation.core.i18n.stringResource
  25. private val ReaderOrientationsWithoutDefault = ReaderOrientation.entries - ReaderOrientation.DEFAULT
  26. @Composable
  27. fun OrientationSelectDialog(
  28. onDismissRequest: () -> Unit,
  29. screenModel: ReaderSettingsScreenModel,
  30. onChange: (StringResource) -> Unit,
  31. ) {
  32. val manga by screenModel.mangaFlow.collectAsState()
  33. val orientation = remember(manga) { ReaderOrientation.fromPreference(manga?.readerOrientation?.toInt()) }
  34. AdaptiveSheet(onDismissRequest = onDismissRequest) {
  35. DialogContent(
  36. orientation = orientation,
  37. onChangeOrientation = {
  38. screenModel.onChangeOrientation(it)
  39. onChange(it.stringRes)
  40. onDismissRequest()
  41. },
  42. )
  43. }
  44. }
  45. @Composable
  46. private fun DialogContent(
  47. orientation: ReaderOrientation,
  48. onChangeOrientation: (ReaderOrientation) -> Unit,
  49. ) {
  50. var selected by remember { mutableStateOf(orientation) }
  51. ModeSelectionDialog(
  52. onUseDefault = {
  53. onChangeOrientation(
  54. ReaderOrientation.DEFAULT,
  55. )
  56. }.takeIf { orientation != ReaderOrientation.DEFAULT },
  57. onApply = { onChangeOrientation(selected) },
  58. ) {
  59. SettingsIconGrid(MR.strings.rotation_type) {
  60. items(ReaderOrientationsWithoutDefault) { mode ->
  61. IconToggleButton(
  62. checked = mode == selected,
  63. onCheckedChange = {
  64. selected = mode
  65. },
  66. modifier = Modifier.fillMaxWidth(),
  67. imageVector = mode.icon,
  68. title = stringResource(mode.stringRes),
  69. )
  70. }
  71. }
  72. }
  73. }
  74. @PreviewLightDark
  75. @Composable
  76. private fun DialogContentPreview() {
  77. TachiyomiPreviewTheme {
  78. Surface {
  79. Column {
  80. DialogContent(
  81. orientation = ReaderOrientation.DEFAULT,
  82. onChangeOrientation = {},
  83. )
  84. DialogContent(
  85. orientation = ReaderOrientation.FREE,
  86. onChangeOrientation = {},
  87. )
  88. }
  89. }
  90. }
  91. }