ReaderAppBars.kt 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. package eu.kanade.presentation.reader.appbars
  2. import androidx.compose.animation.AnimatedVisibility
  3. import androidx.compose.animation.core.tween
  4. import androidx.compose.animation.slideInVertically
  5. import androidx.compose.animation.slideOutVertically
  6. import androidx.compose.foundation.clickable
  7. import androidx.compose.foundation.isSystemInDarkTheme
  8. import androidx.compose.foundation.layout.Arrangement
  9. import androidx.compose.foundation.layout.Column
  10. import androidx.compose.foundation.layout.Spacer
  11. import androidx.compose.foundation.layout.fillMaxHeight
  12. import androidx.compose.foundation.layout.systemBarsPadding
  13. import androidx.compose.material.icons.Icons
  14. import androidx.compose.material.icons.outlined.Bookmark
  15. import androidx.compose.material.icons.outlined.BookmarkBorder
  16. import androidx.compose.material3.MaterialTheme
  17. import androidx.compose.material3.surfaceColorAtElevation
  18. import androidx.compose.runtime.Composable
  19. import androidx.compose.ui.Modifier
  20. import androidx.compose.ui.res.stringResource
  21. import androidx.compose.ui.unit.IntOffset
  22. import androidx.compose.ui.unit.dp
  23. import eu.kanade.presentation.components.AppBar
  24. import eu.kanade.presentation.components.AppBarActions
  25. import eu.kanade.tachiyomi.R
  26. import eu.kanade.tachiyomi.ui.reader.setting.OrientationType
  27. import eu.kanade.tachiyomi.ui.reader.setting.ReadingModeType
  28. import eu.kanade.tachiyomi.ui.reader.viewer.Viewer
  29. import eu.kanade.tachiyomi.ui.reader.viewer.pager.R2LPagerViewer
  30. private val animationSpec = tween<IntOffset>(200)
  31. @Composable
  32. fun ReaderAppBars(
  33. visible: Boolean,
  34. fullscreen: Boolean,
  35. mangaTitle: String?,
  36. chapterTitle: String?,
  37. navigateUp: () -> Unit,
  38. onClickTopAppBar: () -> Unit,
  39. bookmarked: Boolean,
  40. onToggleBookmarked: () -> Unit,
  41. onOpenInWebView: (() -> Unit)?,
  42. onShare: (() -> Unit)?,
  43. viewer: Viewer?,
  44. onNextChapter: () -> Unit,
  45. enabledNext: Boolean,
  46. onPreviousChapter: () -> Unit,
  47. enabledPrevious: Boolean,
  48. currentPage: Int,
  49. totalPages: Int,
  50. onSliderValueChange: (Int) -> Unit,
  51. readingMode: ReadingModeType,
  52. onClickReadingMode: () -> Unit,
  53. orientationMode: OrientationType,
  54. onClickOrientationMode: () -> Unit,
  55. cropEnabled: Boolean,
  56. onClickCropBorder: () -> Unit,
  57. onClickSettings: () -> Unit,
  58. ) {
  59. val isRtl = viewer is R2LPagerViewer
  60. val backgroundColor = MaterialTheme.colorScheme
  61. .surfaceColorAtElevation(3.dp)
  62. .copy(alpha = if (isSystemInDarkTheme()) 0.9f else 0.95f)
  63. val modifierWithInsetsPadding = if (fullscreen) {
  64. Modifier.systemBarsPadding()
  65. } else {
  66. Modifier
  67. }
  68. Column(
  69. modifier = Modifier.fillMaxHeight(),
  70. verticalArrangement = Arrangement.SpaceBetween,
  71. ) {
  72. AnimatedVisibility(
  73. visible = visible,
  74. enter = slideInVertically(
  75. initialOffsetY = { -it },
  76. animationSpec = animationSpec,
  77. ),
  78. exit = slideOutVertically(
  79. targetOffsetY = { -it },
  80. animationSpec = animationSpec,
  81. ),
  82. ) {
  83. AppBar(
  84. modifier = modifierWithInsetsPadding
  85. .clickable(onClick = onClickTopAppBar),
  86. backgroundColor = backgroundColor,
  87. title = mangaTitle,
  88. subtitle = chapterTitle,
  89. navigateUp = navigateUp,
  90. actions = {
  91. AppBarActions(
  92. listOfNotNull(
  93. AppBar.Action(
  94. title = stringResource(if (bookmarked) R.string.action_remove_bookmark else R.string.action_bookmark),
  95. icon = if (bookmarked) Icons.Outlined.Bookmark else Icons.Outlined.BookmarkBorder,
  96. onClick = onToggleBookmarked,
  97. ),
  98. onOpenInWebView?.let {
  99. AppBar.OverflowAction(
  100. title = stringResource(R.string.action_open_in_web_view),
  101. onClick = it,
  102. )
  103. },
  104. onShare?.let {
  105. AppBar.OverflowAction(
  106. title = stringResource(R.string.action_share),
  107. onClick = it,
  108. )
  109. },
  110. ),
  111. )
  112. },
  113. )
  114. }
  115. Spacer(modifier = Modifier.weight(1f))
  116. AnimatedVisibility(
  117. visible = visible,
  118. enter = slideInVertically(
  119. initialOffsetY = { it },
  120. animationSpec = animationSpec,
  121. ),
  122. exit = slideOutVertically(
  123. targetOffsetY = { it },
  124. animationSpec = animationSpec,
  125. ),
  126. ) {
  127. Column(
  128. modifier = modifierWithInsetsPadding,
  129. verticalArrangement = Arrangement.spacedBy(8.dp),
  130. ) {
  131. ChapterNavigator(
  132. isRtl = isRtl,
  133. onNextChapter = onNextChapter,
  134. enabledNext = enabledNext,
  135. onPreviousChapter = onPreviousChapter,
  136. enabledPrevious = enabledPrevious,
  137. currentPage = currentPage,
  138. totalPages = totalPages,
  139. onSliderValueChange = onSliderValueChange,
  140. )
  141. BottomReaderBar(
  142. backgroundColor = backgroundColor,
  143. readingMode = readingMode,
  144. onClickReadingMode = onClickReadingMode,
  145. orientationMode = orientationMode,
  146. onClickOrientationMode = onClickOrientationMode,
  147. cropEnabled = cropEnabled,
  148. onClickCropBorder = onClickCropBorder,
  149. onClickSettings = onClickSettings,
  150. )
  151. }
  152. }
  153. }
  154. }