diff --git a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt
index 1cfdead82..87f41cbfd 100644
--- a/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt
+++ b/app/src/main/java/eu/kanade/presentation/library/LibrarySettingsDialog.kt
@@ -34,6 +34,7 @@ import tachiyomi.domain.library.model.LibrarySort
import tachiyomi.domain.library.model.sort
import tachiyomi.domain.library.service.LibraryPreferences
import tachiyomi.i18n.MR
+import tachiyomi.i18n.kmk.KMR
import tachiyomi.i18n.sy.SYMR
import tachiyomi.presentation.core.components.CheckboxItem
import tachiyomi.presentation.core.components.HeadingItem
@@ -311,6 +312,12 @@ private fun ColumnScope.DisplayPage(
label = stringResource(MR.strings.action_display_language_badge),
pref = screenModel.libraryPreferences.languageBadge(),
)
+ // KMK -->
+ CheckboxItem(
+ label = stringResource(KMR.strings.action_display_source_badge),
+ pref = screenModel.libraryPreferences.sourceBadge(),
+ )
+ // KMK <--
CheckboxItem(
label = stringResource(MR.strings.action_display_show_continue_reading_button),
pref = screenModel.libraryPreferences.showContinueReadingButton(),
diff --git a/app/src/main/java/eu/kanade/presentation/library/components/LibraryBadges.kt b/app/src/main/java/eu/kanade/presentation/library/components/LibraryBadges.kt
index 5d0222cf4..d540d7560 100644
--- a/app/src/main/java/eu/kanade/presentation/library/components/LibraryBadges.kt
+++ b/app/src/main/java/eu/kanade/presentation/library/components/LibraryBadges.kt
@@ -1,13 +1,23 @@
package eu.kanade.presentation.library.components
import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.height
import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Warning
import androidx.compose.material.icons.outlined.Folder
+import androidx.compose.material.icons.outlined.Language
+import androidx.compose.material.icons.outlined.LocalLibrary
import androidx.compose.material3.MaterialTheme
import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.scale
import androidx.compose.ui.tooling.preview.PreviewLightDark
+import androidx.compose.ui.unit.dp
+import eu.kanade.domain.source.model.icon
import eu.kanade.presentation.theme.TachiyomiPreviewTheme
+import tachiyomi.domain.source.model.Source
import tachiyomi.presentation.core.components.Badge
+import tachiyomi.source.local.isLocal
@Composable
internal fun DownloadsBadge(count: Long) {
@@ -34,7 +44,7 @@ internal fun LanguageBadge(
) {
if (isLocal) {
Badge(
- imageVector = Icons.Outlined.Folder,
+ imageVector = Icons.Outlined.Language,
color = MaterialTheme.colorScheme.tertiary,
iconColor = MaterialTheme.colorScheme.onTertiary,
)
@@ -47,6 +57,46 @@ internal fun LanguageBadge(
}
}
+// KMK -->
+@Composable
+fun SourceIconBadge(
+ source: Source?,
+) {
+ if (source == null) return
+ val icon = source.icon
+
+ when {
+ source.isStub && icon == null -> {
+ Badge(
+ imageVector = Icons.Filled.Warning,
+ iconColor = MaterialTheme.colorScheme.error,
+ )
+ }
+ icon != null -> {
+ Badge(
+ imageBitmap = icon,
+ modifier = Modifier.scale(1.3f).height(18.dp),
+ )
+ }
+ source.isLocal() -> {
+ Badge(
+ imageVector = Icons.Outlined.Folder,
+ color = MaterialTheme.colorScheme.tertiary,
+ iconColor = MaterialTheme.colorScheme.onTertiary,
+ )
+ }
+ else -> {
+ // Default source icon (if source doesn't have an icon)
+ Badge(
+ imageVector = Icons.Outlined.LocalLibrary,
+ color = MaterialTheme.colorScheme.tertiary,
+ iconColor = MaterialTheme.colorScheme.onTertiary,
+ )
+ }
+ }
+}
+// KMK <--
+
@PreviewLightDark
@Composable
private fun BadgePreview() {
diff --git a/app/src/main/java/eu/kanade/presentation/library/components/LibraryComfortableGrid.kt b/app/src/main/java/eu/kanade/presentation/library/components/LibraryComfortableGrid.kt
index dd209ce40..3a1bb0c12 100644
--- a/app/src/main/java/eu/kanade/presentation/library/components/LibraryComfortableGrid.kt
+++ b/app/src/main/java/eu/kanade/presentation/library/components/LibraryComfortableGrid.kt
@@ -53,6 +53,9 @@ internal fun LibraryComfortableGrid(
isLocal = libraryItem.isLocal,
sourceLanguage = libraryItem.sourceLanguage,
)
+ // KMK -->
+ SourceIconBadge(source = libraryItem.source)
+ // KMK <--
},
onLongClick = { onLongClick(libraryItem.libraryManga) },
onClick = { onClick(libraryItem.libraryManga) },
diff --git a/app/src/main/java/eu/kanade/presentation/library/components/LibraryCompactGrid.kt b/app/src/main/java/eu/kanade/presentation/library/components/LibraryCompactGrid.kt
index 23cd51cfe..5d695c4ec 100644
--- a/app/src/main/java/eu/kanade/presentation/library/components/LibraryCompactGrid.kt
+++ b/app/src/main/java/eu/kanade/presentation/library/components/LibraryCompactGrid.kt
@@ -54,6 +54,9 @@ internal fun LibraryCompactGrid(
isLocal = libraryItem.isLocal,
sourceLanguage = libraryItem.sourceLanguage,
)
+ // KMK -->
+ SourceIconBadge(source = libraryItem.source)
+ // KMK <--
},
onLongClick = { onLongClick(libraryItem.libraryManga) },
onClick = { onClick(libraryItem.libraryManga) },
diff --git a/app/src/main/java/eu/kanade/presentation/library/components/LibraryList.kt b/app/src/main/java/eu/kanade/presentation/library/components/LibraryList.kt
index 4f20f0274..bad89ccc7 100644
--- a/app/src/main/java/eu/kanade/presentation/library/components/LibraryList.kt
+++ b/app/src/main/java/eu/kanade/presentation/library/components/LibraryList.kt
@@ -61,6 +61,9 @@ internal fun LibraryList(
isLocal = libraryItem.isLocal,
sourceLanguage = libraryItem.sourceLanguage,
)
+ // KMK -->
+ SourceIconBadge(source = libraryItem.source)
+ // KMK <--
},
onLongClick = { onLongClick(libraryItem.libraryManga) },
onClick = { onClick(libraryItem.libraryManga) },
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt
index 47e7b7621..50fedf81f 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryItem.kt
@@ -2,6 +2,7 @@ package eu.kanade.tachiyomi.ui.library
import eu.kanade.tachiyomi.source.getNameForMangaInfo
import tachiyomi.domain.library.model.LibraryManga
+import tachiyomi.domain.source.model.Source
import tachiyomi.domain.source.service.SourceManager
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
@@ -12,6 +13,9 @@ data class LibraryItem(
val unreadCount: Long = -1,
val isLocal: Boolean = false,
val sourceLanguage: String = "",
+ // KMK -->
+ val source: Source? = null,
+ // KMK <--
private val sourceManager: SourceManager = Injekt.get(),
) {
/**
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
index ce29fa5b8..a91c13a8c 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryScreenModel.kt
@@ -107,6 +107,7 @@ import tachiyomi.domain.manga.model.CustomMangaInfo
import tachiyomi.domain.manga.model.Manga
import tachiyomi.domain.manga.model.MangaUpdate
import tachiyomi.domain.manga.model.applyFilter
+import tachiyomi.domain.source.model.StubSource
import tachiyomi.domain.source.service.SourceManager
import tachiyomi.domain.track.interactor.GetTracks
import tachiyomi.domain.track.interactor.GetTracksPerManga
@@ -118,6 +119,7 @@ import tachiyomi.source.local.isLocal
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.util.Collections
+import tachiyomi.domain.source.model.Source as DomainSource
/**
* Typealias for the library manga, using the category as keys, and list of manga as values.
@@ -498,6 +500,9 @@ class LibraryScreenModel(
// SY -->
libraryPreferences.filterLewd().changes(),
// SY <--
+ // KMK -->
+ libraryPreferences.sourceBadge().changes(),
+ // KMK <--
) {
ItemPreferences(
downloadBadge = it[0] as Boolean,
@@ -514,6 +519,9 @@ class LibraryScreenModel(
// SY -->
filterLewd = it[11] as TriState,
// SY <--
+ // KMK -->
+ sourceBadge = it[12] as Boolean,
+ // KMK <--
)
}
}
@@ -530,6 +538,9 @@ class LibraryScreenModel(
libraryMangaList
.map { libraryManga ->
// Display mode based on user preference: take it from global library setting or category
+ // KMK -->
+ val source = sourceManager.getOrStub(libraryManga.manga.source)
+ // KMK <--
LibraryItem(
libraryManga,
downloadCount = if (prefs.downloadBadge) {
@@ -548,10 +559,23 @@ class LibraryScreenModel(
unreadCount = libraryManga.unreadCount,
isLocal = if (prefs.localBadge) libraryManga.manga.isLocal() else false,
sourceLanguage = if (prefs.languageBadge) {
- sourceManager.getOrStub(libraryManga.manga.source).lang
+ source.lang
} else {
""
},
+ // KMK -->
+ source = if (prefs.sourceBadge) {
+ DomainSource(
+ source.id,
+ source.lang,
+ source.name,
+ supportsLatest = false,
+ isStub = source is StubSource
+ )
+ } else {
+ null
+ },
+ // KMK <--
)
}
.groupBy { it.libraryManga.category }
@@ -1312,6 +1336,9 @@ class LibraryScreenModel(
val downloadBadge: Boolean,
val localBadge: Boolean,
val languageBadge: Boolean,
+ // KMK -->
+ val sourceBadge: Boolean,
+ // KMK <--
val skipOutsideReleasePeriod: Boolean,
val globalFilterDownloaded: Boolean,
diff --git a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt
index dcb5d7f74..934fb35ce 100644
--- a/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt
+++ b/domain/src/main/java/tachiyomi/domain/library/service/LibraryPreferences.kt
@@ -127,7 +127,11 @@ class LibraryPreferences(
fun localBadge() = preferenceStore.getBoolean("display_local_badge", true)
- fun languageBadge() = preferenceStore.getBoolean("display_language_badge", false)
+ fun languageBadge() = preferenceStore.getBoolean("display_language_badge", true)
+
+ // KMK -->
+ fun sourceBadge() = preferenceStore.getBoolean("display_source_badge", true)
+ // KMK <--
fun newShowUpdatesCount() = preferenceStore.getBoolean("library_show_updates_count", true)
fun newUpdatesCount() = preferenceStore.getInt(Preference.appStateKey("library_unseen_updates_count"), 0)
diff --git a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml
index f4c04d2af..73ec2ccc4 100644
--- a/i18n-kmk/src/commonMain/moko-resources/base/strings.xml
+++ b/i18n-kmk/src/commonMain/moko-resources/base/strings.xml
@@ -40,6 +40,7 @@
Show updating progress banner
+ Source icon
Unofficial
diff --git a/presentation-core/src/main/java/tachiyomi/presentation/core/components/Badges.kt b/presentation-core/src/main/java/tachiyomi/presentation/core/components/Badges.kt
index 448ee64e2..16f98d7a7 100644
--- a/presentation-core/src/main/java/tachiyomi/presentation/core/components/Badges.kt
+++ b/presentation-core/src/main/java/tachiyomi/presentation/core/components/Badges.kt
@@ -1,8 +1,11 @@
package tachiyomi.presentation.core.components
+import androidx.compose.foundation.Image
import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.RowScope
+import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.text.InlineTextContent
import androidx.compose.foundation.text.appendInlineContent
@@ -10,9 +13,12 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ColorFilter
+import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.vector.ImageVector
@@ -29,7 +35,12 @@ fun BadgeGroup(
shape: Shape = MaterialTheme.shapes.extraSmall,
content: @Composable RowScope.() -> Unit,
) {
- Row(modifier = modifier.clip(shape)) {
+ Row(
+ modifier = modifier.clip(shape)
+ // KMK -->
+ .height(18.dp),
+ // KMK <--
+ ) {
content()
}
}
@@ -99,3 +110,28 @@ fun Badge(
style = MaterialTheme.typography.bodySmall,
)
}
+
+// KMK -->
+@Composable
+fun Badge(
+ imageBitmap: ImageBitmap,
+ modifier: Modifier = Modifier,
+ color: Color = MaterialTheme.colorScheme.secondary,
+ tint: Color? = null,
+ shape: Shape = RectangleShape,
+) {
+ Box(
+ contentAlignment = Alignment.Center,
+ modifier = Modifier
+ .clip(shape)
+ .background(color),
+ ) {
+ Image(
+ bitmap = imageBitmap,
+ colorFilter = tint?.let { ColorFilter.tint(it) },
+ contentDescription = null,
+ modifier = modifier,
+ )
+ }
+}
+// KMK <--