diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoContract.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoContract.kt index a129a01cd..b9f00687c 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoContract.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoContract.kt @@ -13,10 +13,17 @@ import kotlinx.collections.immutable.persistentListOf const val READER_RESULT_DELETED = 100 +@Stable +data class HighlightedTag( + val matchedLabels: List, + val title: String?, +) + data class BookInfoUiState( val book: BookInfoBookUi? = null, val hasChapters: Boolean = false, val webFiles: List = emptyList(), + val highlightedTags: List = emptyList(), val kindLabels: List = emptyList(), val groupNames: String? = null, val hasCustomGroup: Boolean = false, diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt index 2ec654d6a..a30b3e97a 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoScreen.kt @@ -86,6 +86,7 @@ import io.legado.app.ui.widget.components.AppTextField import io.legado.app.ui.widget.components.alert.AppAlertDialog import io.legado.app.ui.widget.components.button.series.SmallTonalButton import io.legado.app.ui.widget.components.card.GlassCard +import io.legado.app.ui.widget.components.card.HighlightTagRow import io.legado.app.ui.widget.components.card.TextCard import io.legado.app.ui.widget.components.changeSource.ChangeSourceSheet import io.legado.app.ui.widget.components.icon.AppIcon @@ -205,6 +206,7 @@ private fun BookInfoScreenContent( item { BookInfoHeader( book = book, + highlightedTags = state.highlightedTags, kindLabels = state.kindLabels, groupNames = state.groupNames, onCoverClick = { onIntent(BookInfoIntent.CoverClick) }, @@ -644,6 +646,7 @@ private fun BookInfoOverflowMenu( @Composable private fun BookInfoHeader( book: BookInfoBookUi, + highlightedTags: List, kindLabels: List, groupNames: String?, onCoverClick: () -> Unit, @@ -756,6 +759,9 @@ private fun BookInfoHeader( ) } } + if (highlightedTags.isNotEmpty()) { + HighlightTagRow(tags = highlightedTags) + } if (kindLabels.isNotEmpty() || !groupNames.isNullOrBlank()) { val kindListState = rememberLazyListState() LazyRow( @@ -771,7 +777,7 @@ private fun BookInfoHeader( text = stringResource(R.string.group_s, it), textStyle = LegadoTheme.typography.labelLargeEmphasized, backgroundColor = LegadoTheme.colorScheme.surfaceContainer, - contentColor = LegadoTheme.colorScheme.onSurface, + contentColor = LegadoTheme.colorScheme.onSurfaceVariant, ) } } @@ -783,7 +789,7 @@ private fun BookInfoHeader( text = label, textStyle = LegadoTheme.typography.labelLargeEmphasized, backgroundColor = LegadoTheme.colorScheme.surfaceContainer, - contentColor = LegadoTheme.colorScheme.onSurface, + contentColor = LegadoTheme.colorScheme.onSurfaceVariant, ) } } diff --git a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt index cd995e54f..e01fd5e1d 100644 --- a/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt +++ b/app/src/main/java/io/legado/app/ui/book/info/BookInfoViewModel.kt @@ -38,6 +38,7 @@ import io.legado.app.help.book.isSameNameAuthor import io.legado.app.help.book.isWebFile import io.legado.app.help.book.removeType import io.legado.app.help.book.upKind +import io.legado.app.help.book.parseHighlightedTags import io.legado.app.help.book.updateTo import io.legado.app.help.config.LocalConfig import io.legado.app.help.coroutine.Coroutine @@ -139,6 +140,7 @@ class BookInfoViewModel( private var currentChapterList: List = emptyList() private var currentWebFiles: List = emptyList() private var currentRelatedBooks: List = emptyList() + private var currentHighlightedTags: List = emptyList() private var currentKindLabels: List = emptyList() private var currentGroupNames: String? = null private var currentHasCustomGroup = false @@ -871,15 +873,25 @@ class BookInfoViewModel( val normalizedGroupNames = groupNames.ifBlank { null } appDb.bookDao.update(book) val finalKinds = book.kind?.splitNotBlank(",", "\n").orEmpty().toList() - Triple(finalKinds, normalizedGroupNames, hasCustomGroup) + val enabledRules = appDb.highlightTagRuleDao.getEnabled() + val (highlighted, regular) = parseHighlightedTags(finalKinds, enabledRules) + HighlightMeta(highlighted, regular, normalizedGroupNames, hasCustomGroup) }.onSuccess { - currentKindLabels = it.first - currentGroupNames = it.second - currentHasCustomGroup = it.third + currentHighlightedTags = it.highlighted + currentKindLabels = it.regular + currentGroupNames = it.groupNames + currentHasCustomGroup = it.hasCustomGroup syncUiState() } } + private data class HighlightMeta( + val highlighted: List, + val regular: List, + val groupNames: String?, + val hasCustomGroup: Boolean, + ) + private fun loadChapter( book: Book, runPreUpdateJs: Boolean = true, @@ -1335,6 +1347,7 @@ class BookInfoViewModel( hasChapters = currentChapterList.isNotEmpty(), webFiles = currentWebFiles, relatedBooks = currentRelatedBooks.toImmutableList(), + highlightedTags = currentHighlightedTags, kindLabels = currentKindLabels, groupNames = currentGroupNames, hasCustomGroup = currentHasCustomGroup,