BrowseSourceToolbar.kt 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package eu.kanade.presentation.browse.components
  2. import androidx.compose.foundation.text.KeyboardActions
  3. import androidx.compose.foundation.text.KeyboardOptions
  4. import androidx.compose.material.icons.Icons
  5. import androidx.compose.material.icons.filled.ViewModule
  6. import androidx.compose.material.icons.outlined.Check
  7. import androidx.compose.material.icons.outlined.Help
  8. import androidx.compose.material.icons.outlined.Public
  9. import androidx.compose.material.icons.outlined.Search
  10. import androidx.compose.material3.DropdownMenuItem
  11. import androidx.compose.material3.Icon
  12. import androidx.compose.material3.Text
  13. import androidx.compose.material3.TopAppBarScrollBehavior
  14. import androidx.compose.runtime.Composable
  15. import androidx.compose.runtime.getValue
  16. import androidx.compose.runtime.mutableStateOf
  17. import androidx.compose.runtime.remember
  18. import androidx.compose.runtime.setValue
  19. import androidx.compose.ui.res.stringResource
  20. import androidx.compose.ui.text.input.ImeAction
  21. import eu.kanade.domain.library.model.LibraryDisplayMode
  22. import eu.kanade.presentation.browse.BrowseSourceState
  23. import eu.kanade.presentation.components.AppBar
  24. import eu.kanade.presentation.components.AppBarActions
  25. import eu.kanade.presentation.components.DropdownMenu
  26. import eu.kanade.presentation.components.SearchToolbar
  27. import eu.kanade.tachiyomi.R
  28. import eu.kanade.tachiyomi.source.CatalogueSource
  29. import eu.kanade.tachiyomi.source.LocalSource
  30. @Composable
  31. fun BrowseSourceToolbar(
  32. state: BrowseSourceState,
  33. source: CatalogueSource,
  34. displayMode: LibraryDisplayMode,
  35. onDisplayModeChange: (LibraryDisplayMode) -> Unit,
  36. navigateUp: () -> Unit,
  37. onWebViewClick: () -> Unit,
  38. onHelpClick: () -> Unit,
  39. onSearch: () -> Unit,
  40. scrollBehavior: TopAppBarScrollBehavior,
  41. ) {
  42. if (state.searchQuery == null) {
  43. BrowseSourceRegularToolbar(
  44. title = if (state.isUserQuery) state.currentFilter.query else source.name,
  45. isLocalSource = source is LocalSource,
  46. displayMode = displayMode,
  47. onDisplayModeChange = onDisplayModeChange,
  48. navigateUp = navigateUp,
  49. onSearchClick = { state.searchQuery = if (state.isUserQuery) state.currentFilter.query else "" },
  50. onWebViewClick = onWebViewClick,
  51. onHelpClick = onHelpClick,
  52. scrollBehavior = scrollBehavior,
  53. )
  54. } else {
  55. BrowseSourceSearchToolbar(
  56. searchQuery = state.searchQuery!!,
  57. onSearchQueryChanged = { state.searchQuery = it },
  58. navigateUp = { state.searchQuery = null },
  59. onResetClick = { state.searchQuery = "" },
  60. onSearchClick = onSearch,
  61. scrollBehavior = scrollBehavior,
  62. )
  63. }
  64. }
  65. @Composable
  66. fun BrowseSourceRegularToolbar(
  67. title: String,
  68. isLocalSource: Boolean,
  69. displayMode: LibraryDisplayMode,
  70. onDisplayModeChange: (LibraryDisplayMode) -> Unit,
  71. navigateUp: () -> Unit,
  72. onSearchClick: () -> Unit,
  73. onWebViewClick: () -> Unit,
  74. onHelpClick: () -> Unit,
  75. scrollBehavior: TopAppBarScrollBehavior,
  76. ) {
  77. AppBar(
  78. navigateUp = navigateUp,
  79. title = title,
  80. actions = {
  81. var selectingDisplayMode by remember { mutableStateOf(false) }
  82. AppBarActions(
  83. actions = listOf(
  84. AppBar.Action(
  85. title = stringResource(R.string.action_search),
  86. icon = Icons.Outlined.Search,
  87. onClick = onSearchClick,
  88. ),
  89. AppBar.Action(
  90. title = stringResource(R.string.action_display_mode),
  91. icon = Icons.Filled.ViewModule,
  92. onClick = { selectingDisplayMode = true },
  93. ),
  94. if (isLocalSource) {
  95. AppBar.Action(
  96. title = stringResource(R.string.label_help),
  97. icon = Icons.Outlined.Help,
  98. onClick = onHelpClick,
  99. )
  100. } else {
  101. AppBar.Action(
  102. title = stringResource(R.string.action_web_view),
  103. icon = Icons.Outlined.Public,
  104. onClick = onWebViewClick,
  105. )
  106. },
  107. ),
  108. )
  109. DropdownMenu(
  110. expanded = selectingDisplayMode,
  111. onDismissRequest = { selectingDisplayMode = false },
  112. ) {
  113. DropdownMenuItem(
  114. text = { Text(text = stringResource(R.string.action_display_comfortable_grid)) },
  115. onClick = { onDisplayModeChange(LibraryDisplayMode.ComfortableGrid) },
  116. trailingIcon = {
  117. if (displayMode == LibraryDisplayMode.ComfortableGrid) {
  118. Icon(
  119. imageVector = Icons.Outlined.Check,
  120. contentDescription = "",
  121. )
  122. }
  123. },
  124. )
  125. DropdownMenuItem(
  126. text = { Text(text = stringResource(R.string.action_display_grid)) },
  127. onClick = { onDisplayModeChange(LibraryDisplayMode.CompactGrid) },
  128. trailingIcon = {
  129. if (displayMode == LibraryDisplayMode.CompactGrid) {
  130. Icon(
  131. imageVector = Icons.Outlined.Check,
  132. contentDescription = "",
  133. )
  134. }
  135. },
  136. )
  137. DropdownMenuItem(
  138. text = { Text(text = stringResource(R.string.action_display_list)) },
  139. onClick = { onDisplayModeChange(LibraryDisplayMode.List) },
  140. trailingIcon = {
  141. if (displayMode == LibraryDisplayMode.List) {
  142. Icon(
  143. imageVector = Icons.Outlined.Check,
  144. contentDescription = "",
  145. )
  146. }
  147. },
  148. )
  149. }
  150. },
  151. scrollBehavior = scrollBehavior,
  152. )
  153. }
  154. @Composable
  155. fun BrowseSourceSearchToolbar(
  156. searchQuery: String,
  157. onSearchQueryChanged: (String) -> Unit,
  158. navigateUp: () -> Unit,
  159. onResetClick: () -> Unit,
  160. onSearchClick: () -> Unit,
  161. scrollBehavior: TopAppBarScrollBehavior,
  162. ) {
  163. SearchToolbar(
  164. searchQuery = searchQuery,
  165. onChangeSearchQuery = onSearchQueryChanged,
  166. keyboardOptions = KeyboardOptions(imeAction = ImeAction.Search),
  167. keyboardActions = KeyboardActions(
  168. onSearch = {
  169. onSearchClick()
  170. },
  171. ),
  172. onClickCloseSearch = navigateUp,
  173. onClickResetSearch = onResetClick,
  174. scrollBehavior = scrollBehavior,
  175. )
  176. }