diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookItem.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookItem.kt index 064047b88..3bdeb0c58 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookItem.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookItem.kt @@ -35,7 +35,8 @@ import io.legado.app.R import io.legado.app.data.entities.BookGroup import io.legado.app.ui.config.bookshelfConfig.BookshelfConfig import io.legado.app.ui.widget.components.cover.BookCover -import io.legado.app.ui.widget.components.cover.BookCoverWithProgress +import io.legado.app.ui.widget.components.cover.BookshelfCover +import io.legado.app.ui.widget.components.cover.Cover import io.legado.app.utils.toTimeAgo /** @@ -207,68 +208,75 @@ fun BookGroupCover( .clip(RoundedCornerShape(4.dp)) .background(MaterialTheme.colorScheme.surfaceContainer) ) { - Column(modifier = Modifier.fillMaxSize()) { - Row(modifier = Modifier.weight(1f)) { - Box( - modifier = Modifier - .weight(1f) - .fillMaxHeight() - .padding(1.dp) - ) { - books.getOrNull(0)?.let { - BookCover( - name = it.name, - author = it.author, - path = it.getDisplayCover(), - modifier = Modifier.fillMaxSize() - ) + if (!coverPath.isNullOrBlank()) { + Cover( + path = coverPath, + modifier = Modifier.fillMaxSize() + ) + } else { + Column(modifier = Modifier.fillMaxSize()) { + Row(modifier = Modifier.weight(1f)) { + Box( + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .padding(1.dp) + ) { + books.getOrNull(0)?.let { + BookCover( + name = it.name, + author = it.author, + path = it.getDisplayCover(), + modifier = Modifier.fillMaxSize() + ) + } + } + Box( + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .padding(1.dp) + ) { + books.getOrNull(1)?.let { + BookCover( + name = it.name, + author = it.author, + path = it.getDisplayCover(), + modifier = Modifier.fillMaxSize() + ) + } } } - Box( - modifier = Modifier - .weight(1f) - .fillMaxHeight() - .padding(1.dp) - ) { - books.getOrNull(1)?.let { - BookCover( - name = it.name, - author = it.author, - path = it.getDisplayCover(), - modifier = Modifier.fillMaxSize() - ) + Row(modifier = Modifier.weight(1f)) { + Box( + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .padding(1.dp) + ) { + books.getOrNull(2)?.let { + BookCover( + name = it.name, + author = it.author, + path = it.getDisplayCover(), + modifier = Modifier.fillMaxSize() + ) + } } - } - } - Row(modifier = Modifier.weight(1f)) { - Box( - modifier = Modifier - .weight(1f) - .fillMaxHeight() - .padding(1.dp) - ) { - books.getOrNull(2)?.let { - BookCover( - name = it.name, - author = it.author, - path = it.getDisplayCover(), - modifier = Modifier.fillMaxSize() - ) - } - } - Box( - modifier = Modifier - .weight(1f) - .fillMaxHeight() - .padding(1.dp) - ) { - books.getOrNull(3)?.let { - BookCover( - name = it.name, - author = it.author, - path = it.getDisplayCover(), - modifier = Modifier.fillMaxSize() - ) + Box( + modifier = Modifier + .weight(1f) + .fillMaxHeight() + .padding(1.dp) + ) { + books.getOrNull(3)?.let { + BookCover( + name = it.name, + author = it.author, + path = it.getDisplayCover(), + modifier = Modifier.fillMaxSize() + ) + } } } } @@ -357,7 +365,7 @@ fun BookItem( gridStyle = gridStyle, isCompact = isCompact, cover = { modifier -> - BookCoverWithProgress( + BookshelfCover( name = book.name, author = book.author, path = book.getDisplayCover(), diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookShelfItem.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookShelfItem.kt index 4d9a3054e..a588eb524 100644 --- a/app/src/main/java/io/legado/app/ui/main/bookshelf/BookShelfItem.kt +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/BookShelfItem.kt @@ -2,7 +2,6 @@ package io.legado.app.ui.main.bookshelf import androidx.compose.runtime.Stable import io.legado.app.constant.BookType -import io.legado.app.data.entities.Book import kotlin.math.max @Stable @@ -36,24 +35,3 @@ data class BookShelfItem( fun getUnreadChapterNum() = max(totalChapterNum - durChapterIndex - 1, 0) } - -fun Book.toBookShelfItem(): BookShelfItem { - return BookShelfItem( - bookUrl = bookUrl, - name = name, - author = author, - coverUrl = coverUrl, - customCoverUrl = customCoverUrl, - durChapterTitle = durChapterTitle, - durChapterTime = durChapterTime, - durChapterPos = durChapterPos, - latestChapterTitle = latestChapterTitle, - latestChapterTime = latestChapterTime, - totalChapterNum = totalChapterNum, - durChapterIndex = durChapterIndex, - type = type, - group = group, - order = order, - canUpdate = canUpdate - ) -} diff --git a/app/src/main/java/io/legado/app/ui/widget/components/cover/BookCover.kt b/app/src/main/java/io/legado/app/ui/widget/components/cover/BookCover.kt index 89b5c4956..4d3f75ff7 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/cover/BookCover.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/cover/BookCover.kt @@ -9,14 +9,15 @@ import android.text.TextUtils import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.isSystemInDarkTheme -import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Update +import androidx.compose.material.icons.filled.Book +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect @@ -34,12 +35,12 @@ import androidx.compose.ui.graphics.nativeCanvas import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import androidx.core.graphics.withSave import coil.compose.AsyncImage import coil.request.ImageRequest import io.legado.app.ui.config.coverConfig.CoverConfig -import io.legado.app.ui.widget.components.card.TextCard import org.koin.compose.koinInject import io.legado.app.model.BookCover as BookCoverModel @@ -49,8 +50,6 @@ fun BookCover( author: String?, path: String?, modifier: Modifier = Modifier.width(64.dp), - badgeText: String? = null, - showBadgeDot: Boolean = false, sourceOrigin: String? = null, onLoadFinish: (() -> Unit)? = null, ignoreUseDefaultCover: Boolean = false @@ -79,7 +78,7 @@ fun BookCover( isOnlineCoverLoaded = false } - Box( + BoxWithConstraints( modifier = modifier .aspectRatio(5f / 7f) .then( @@ -94,6 +93,11 @@ fun BookCover( } else Modifier ) ) { + val density = LocalDensity.current + val iconSizeDp = with(density) { + (minOf(maxWidth, maxHeight).toPx() / 3f).toDp() + } + if (hasCustomDefault) { AsyncImage( model = ImageRequest.Builder(context) @@ -134,6 +138,17 @@ fun BookCover( } } + if (!hasCustomDefault && !isOnlineCoverLoaded) { + Icon( + Icons.Default.Book, + contentDescription = null, + tint = MaterialTheme.colorScheme.secondary, + modifier = Modifier + .size(iconSizeDp) + .align(Alignment.Center) + ) + } + if (!isOnlineCoverLoaded) { CoverTextOverlay( name = name, @@ -142,20 +157,6 @@ fun BookCover( ) } - if (!badgeText.isNullOrEmpty()) { - TextCard( - text = badgeText, - icon = if (showBadgeDot) Icons.Default.Update else null, - modifier = Modifier - .align(Alignment.TopEnd) - .padding(2.dp), - backgroundColor = MaterialTheme.colorScheme.secondaryContainer, - contentColor = MaterialTheme.colorScheme.onSecondaryContainer, - cornerRadius = 4.dp, - horizontalPadding = 4.dp, - verticalPadding = 0.dp - ) - } } } diff --git a/app/src/main/java/io/legado/app/ui/widget/components/cover/BookCoverWithProgress.kt b/app/src/main/java/io/legado/app/ui/widget/components/cover/BookshelfCover.kt similarity index 67% rename from app/src/main/java/io/legado/app/ui/widget/components/cover/BookCoverWithProgress.kt rename to app/src/main/java/io/legado/app/ui/widget/components/cover/BookshelfCover.kt index 50ce7adcb..ed6817b86 100644 --- a/app/src/main/java/io/legado/app/ui/widget/components/cover/BookCoverWithProgress.kt +++ b/app/src/main/java/io/legado/app/ui/widget/components/cover/BookshelfCover.kt @@ -4,6 +4,8 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Update import androidx.compose.material3.LinearProgressIndicator import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable @@ -11,9 +13,10 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.StrokeCap import androidx.compose.ui.unit.dp +import io.legado.app.ui.widget.components.card.TextCard @Composable -fun BookCoverWithProgress( +fun BookshelfCover( name: String?, author: String?, path: String?, @@ -30,12 +33,25 @@ fun BookCoverWithProgress( author = author, path = path, modifier = Modifier.fillMaxWidth(), - badgeText = badgeText, - showBadgeDot = showBadgeDot, sourceOrigin = sourceOrigin, onLoadFinish = onLoadFinish ) + if (!badgeText.isNullOrEmpty()) { + TextCard( + text = badgeText, + icon = if (showBadgeDot) Icons.Default.Update else null, + modifier = Modifier + .align(Alignment.TopEnd) + .padding(2.dp), + backgroundColor = MaterialTheme.colorScheme.secondaryContainer, + contentColor = MaterialTheme.colorScheme.onSecondaryContainer, + cornerRadius = 4.dp, + horizontalPadding = 4.dp, + verticalPadding = 0.dp + ) + } + if (isUpdating) { LinearProgressIndicator( modifier = Modifier diff --git a/app/version.properties b/app/version.properties index 355571f4c..85d146e4d 100644 --- a/app/version.properties +++ b/app/version.properties @@ -1,5 +1,5 @@ VERSION_MAJOR=3 VERSION_MINOR=26 VERSION_PATCH=8 -VERSION_SUFFIX=1 +VERSION_SUFFIX=0 # 1 = Pre, 0 = Release \ No newline at end of file