GlobalSearchToolbar.kt 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. package eu.kanade.presentation.browse.components
  2. import androidx.compose.foundation.background
  3. import androidx.compose.foundation.horizontalScroll
  4. import androidx.compose.foundation.layout.Arrangement
  5. import androidx.compose.foundation.layout.Box
  6. import androidx.compose.foundation.layout.Column
  7. import androidx.compose.foundation.layout.Row
  8. import androidx.compose.foundation.layout.fillMaxWidth
  9. import androidx.compose.foundation.layout.padding
  10. import androidx.compose.foundation.layout.size
  11. import androidx.compose.foundation.rememberScrollState
  12. import androidx.compose.material.icons.Icons
  13. import androidx.compose.material.icons.outlined.DoneAll
  14. import androidx.compose.material.icons.outlined.FilterList
  15. import androidx.compose.material.icons.outlined.PushPin
  16. import androidx.compose.material3.FilterChip
  17. import androidx.compose.material3.FilterChipDefaults
  18. import androidx.compose.material3.HorizontalDivider
  19. import androidx.compose.material3.Icon
  20. import androidx.compose.material3.LinearProgressIndicator
  21. import androidx.compose.material3.MaterialTheme
  22. import androidx.compose.material3.Text
  23. import androidx.compose.material3.TopAppBarScrollBehavior
  24. import androidx.compose.material3.VerticalDivider
  25. import androidx.compose.runtime.Composable
  26. import androidx.compose.ui.Alignment
  27. import androidx.compose.ui.Modifier
  28. import androidx.compose.ui.res.stringResource
  29. import eu.kanade.presentation.components.SearchToolbar
  30. import eu.kanade.tachiyomi.R
  31. import eu.kanade.tachiyomi.ui.browse.source.globalsearch.SourceFilter
  32. import tachiyomi.presentation.core.components.material.padding
  33. @Composable
  34. fun GlobalSearchToolbar(
  35. searchQuery: String?,
  36. progress: Int,
  37. total: Int,
  38. navigateUp: () -> Unit,
  39. onChangeSearchQuery: (String?) -> Unit,
  40. onSearch: (String) -> Unit,
  41. sourceFilter: SourceFilter,
  42. onChangeSearchFilter: (SourceFilter) -> Unit,
  43. onlyShowHasResults: Boolean,
  44. onToggleResults: () -> Unit,
  45. scrollBehavior: TopAppBarScrollBehavior,
  46. ) {
  47. Column(modifier = Modifier.background(MaterialTheme.colorScheme.surface)) {
  48. Box {
  49. SearchToolbar(
  50. searchQuery = searchQuery,
  51. onChangeSearchQuery = onChangeSearchQuery,
  52. onSearch = onSearch,
  53. onClickCloseSearch = navigateUp,
  54. navigateUp = navigateUp,
  55. scrollBehavior = scrollBehavior,
  56. )
  57. if (progress in 1..<total) {
  58. LinearProgressIndicator(
  59. progress = { progress / total.toFloat() },
  60. modifier = Modifier
  61. .align(Alignment.BottomStart)
  62. .fillMaxWidth(),
  63. )
  64. }
  65. }
  66. Row(
  67. modifier = Modifier
  68. .horizontalScroll(rememberScrollState())
  69. .padding(horizontal = MaterialTheme.padding.small),
  70. horizontalArrangement = Arrangement.spacedBy(MaterialTheme.padding.small),
  71. ) {
  72. // TODO: make this UX better; it only applies when triggering a new search
  73. FilterChip(
  74. selected = sourceFilter == SourceFilter.PinnedOnly,
  75. onClick = { onChangeSearchFilter(SourceFilter.PinnedOnly) },
  76. leadingIcon = {
  77. Icon(
  78. imageVector = Icons.Outlined.PushPin,
  79. contentDescription = null,
  80. modifier = Modifier
  81. .size(FilterChipDefaults.IconSize),
  82. )
  83. },
  84. label = {
  85. Text(text = stringResource(id = R.string.pinned_sources))
  86. },
  87. )
  88. FilterChip(
  89. selected = sourceFilter == SourceFilter.All,
  90. onClick = { onChangeSearchFilter(SourceFilter.All) },
  91. leadingIcon = {
  92. Icon(
  93. imageVector = Icons.Outlined.DoneAll,
  94. contentDescription = null,
  95. modifier = Modifier
  96. .size(FilterChipDefaults.IconSize),
  97. )
  98. },
  99. label = {
  100. Text(text = stringResource(id = R.string.all))
  101. },
  102. )
  103. VerticalDivider()
  104. FilterChip(
  105. selected = onlyShowHasResults,
  106. onClick = { onToggleResults() },
  107. leadingIcon = {
  108. Icon(
  109. imageVector = Icons.Outlined.FilterList,
  110. contentDescription = null,
  111. modifier = Modifier
  112. .size(FilterChipDefaults.IconSize),
  113. )
  114. },
  115. label = {
  116. Text(text = stringResource(id = R.string.has_results))
  117. },
  118. )
  119. }
  120. HorizontalDivider()
  121. }
  122. }