|
@@ -1,6 +1,5 @@
|
|
|
package eu.kanade.presentation.manga.components
|
|
|
|
|
|
-import android.content.Context
|
|
|
import androidx.compose.animation.animateContentSize
|
|
|
import androidx.compose.animation.core.animateFloatAsState
|
|
|
import androidx.compose.animation.graphics.res.animatedVectorResource
|
|
@@ -43,6 +42,7 @@ import androidx.compose.material3.DropdownMenuItem
|
|
|
import androidx.compose.material3.Icon
|
|
|
import androidx.compose.material3.LocalContentColor
|
|
|
import androidx.compose.material3.LocalMinimumInteractiveComponentEnforcement
|
|
|
+import androidx.compose.material3.LocalTextStyle
|
|
|
import androidx.compose.material3.MaterialTheme
|
|
|
import androidx.compose.material3.ProvideTextStyle
|
|
|
import androidx.compose.material3.SuggestionChip
|
|
@@ -134,7 +134,6 @@ fun MangaInfoBox(
|
|
|
coverDataProvider = coverDataProvider,
|
|
|
onCoverClick = onCoverClick,
|
|
|
title = title,
|
|
|
- context = LocalContext.current,
|
|
|
doSearch = doSearch,
|
|
|
author = author,
|
|
|
artist = artist,
|
|
@@ -148,7 +147,6 @@ fun MangaInfoBox(
|
|
|
coverDataProvider = coverDataProvider,
|
|
|
onCoverClick = onCoverClick,
|
|
|
title = title,
|
|
|
- context = LocalContext.current,
|
|
|
doSearch = doSearch,
|
|
|
author = author,
|
|
|
artist = artist,
|
|
@@ -323,7 +321,6 @@ private fun MangaAndSourceTitlesLarge(
|
|
|
coverDataProvider: () -> Manga,
|
|
|
onCoverClick: () -> Unit,
|
|
|
title: String,
|
|
|
- context: Context,
|
|
|
doSearch: (query: String, global: Boolean) -> Unit,
|
|
|
author: String?,
|
|
|
artist: String?,
|
|
@@ -344,102 +341,16 @@ private fun MangaAndSourceTitlesLarge(
|
|
|
onClick = onCoverClick,
|
|
|
)
|
|
|
Spacer(modifier = Modifier.height(16.dp))
|
|
|
- Text(
|
|
|
- text = title.ifBlank { stringResource(R.string.unknown_title) },
|
|
|
- style = MaterialTheme.typography.titleLarge,
|
|
|
- modifier = Modifier.clickableNoIndication(
|
|
|
- onLongClick = { if (title.isNotBlank()) context.copyToClipboard(title, title) },
|
|
|
- onClick = { if (title.isNotBlank()) doSearch(title, true) },
|
|
|
- ),
|
|
|
- textAlign = TextAlign.Center,
|
|
|
- )
|
|
|
- Spacer(modifier = Modifier.height(2.dp))
|
|
|
- Text(
|
|
|
- text = author?.takeIf { it.isNotBlank() } ?: stringResource(R.string.unknown_author),
|
|
|
- style = MaterialTheme.typography.titleSmall,
|
|
|
- modifier = Modifier
|
|
|
- .secondaryItemAlpha()
|
|
|
- .padding(top = 2.dp)
|
|
|
- .clickableNoIndication(
|
|
|
- onLongClick = {
|
|
|
- if (!author.isNullOrBlank()) {
|
|
|
- context.copyToClipboard(
|
|
|
- author,
|
|
|
- author,
|
|
|
- )
|
|
|
- }
|
|
|
- },
|
|
|
- onClick = { if (!author.isNullOrBlank()) doSearch(author, true) },
|
|
|
- ),
|
|
|
+ MangaContentInfo(
|
|
|
+ title = title,
|
|
|
+ doSearch = doSearch,
|
|
|
+ author = author,
|
|
|
+ artist = artist,
|
|
|
+ status = status,
|
|
|
+ sourceName = sourceName,
|
|
|
+ isStubSource = isStubSource,
|
|
|
textAlign = TextAlign.Center,
|
|
|
)
|
|
|
- if (!artist.isNullOrBlank() && author != artist) {
|
|
|
- Text(
|
|
|
- text = artist,
|
|
|
- style = MaterialTheme.typography.titleSmall,
|
|
|
- modifier = Modifier
|
|
|
- .secondaryItemAlpha()
|
|
|
- .padding(top = 2.dp)
|
|
|
- .clickableNoIndication(
|
|
|
- onLongClick = { context.copyToClipboard(artist, artist) },
|
|
|
- onClick = { doSearch(artist, true) },
|
|
|
- ),
|
|
|
- textAlign = TextAlign.Center,
|
|
|
- )
|
|
|
- }
|
|
|
- Spacer(modifier = Modifier.height(4.dp))
|
|
|
- Row(
|
|
|
- modifier = Modifier.secondaryItemAlpha(),
|
|
|
- verticalAlignment = Alignment.CenterVertically,
|
|
|
- ) {
|
|
|
- Icon(
|
|
|
- imageVector = when (status) {
|
|
|
- SManga.ONGOING.toLong() -> Icons.Outlined.Schedule
|
|
|
- SManga.COMPLETED.toLong() -> Icons.Outlined.DoneAll
|
|
|
- SManga.LICENSED.toLong() -> Icons.Outlined.AttachMoney
|
|
|
- SManga.PUBLISHING_FINISHED.toLong() -> Icons.Outlined.Done
|
|
|
- SManga.CANCELLED.toLong() -> Icons.Outlined.Close
|
|
|
- SManga.ON_HIATUS.toLong() -> Icons.Outlined.Pause
|
|
|
- else -> Icons.Outlined.Block
|
|
|
- },
|
|
|
- contentDescription = null,
|
|
|
- modifier = Modifier
|
|
|
- .padding(end = 4.dp)
|
|
|
- .size(16.dp),
|
|
|
- )
|
|
|
- ProvideTextStyle(MaterialTheme.typography.bodyMedium) {
|
|
|
- Text(
|
|
|
- text = when (status) {
|
|
|
- SManga.ONGOING.toLong() -> stringResource(R.string.ongoing)
|
|
|
- SManga.COMPLETED.toLong() -> stringResource(R.string.completed)
|
|
|
- SManga.LICENSED.toLong() -> stringResource(R.string.licensed)
|
|
|
- SManga.PUBLISHING_FINISHED.toLong() -> stringResource(R.string.publishing_finished)
|
|
|
- SManga.CANCELLED.toLong() -> stringResource(R.string.cancelled)
|
|
|
- SManga.ON_HIATUS.toLong() -> stringResource(R.string.on_hiatus)
|
|
|
- else -> stringResource(R.string.unknown)
|
|
|
- },
|
|
|
- overflow = TextOverflow.Ellipsis,
|
|
|
- maxLines = 1,
|
|
|
- )
|
|
|
- DotSeparatorText()
|
|
|
- if (isStubSource) {
|
|
|
- Icon(
|
|
|
- imageVector = Icons.Filled.Warning,
|
|
|
- contentDescription = null,
|
|
|
- modifier = Modifier
|
|
|
- .padding(end = 4.dp)
|
|
|
- .size(16.dp),
|
|
|
- tint = MaterialTheme.colorScheme.error,
|
|
|
- )
|
|
|
- }
|
|
|
- Text(
|
|
|
- text = sourceName,
|
|
|
- modifier = Modifier.clickableNoIndication { doSearch(sourceName, false) },
|
|
|
- overflow = TextOverflow.Ellipsis,
|
|
|
- maxLines = 1,
|
|
|
- )
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -449,7 +360,6 @@ private fun MangaAndSourceTitlesSmall(
|
|
|
coverDataProvider: () -> Manga,
|
|
|
onCoverClick: () -> Unit,
|
|
|
title: String,
|
|
|
- context: Context,
|
|
|
doSearch: (query: String, global: Boolean) -> Unit,
|
|
|
author: String?,
|
|
|
artist: String?,
|
|
@@ -475,135 +385,161 @@ private fun MangaAndSourceTitlesSmall(
|
|
|
Column(
|
|
|
verticalArrangement = Arrangement.spacedBy(2.dp),
|
|
|
) {
|
|
|
- Text(
|
|
|
- text = title.ifBlank { stringResource(R.string.unknown_title) },
|
|
|
- style = MaterialTheme.typography.titleLarge,
|
|
|
- modifier = Modifier.clickableNoIndication(
|
|
|
+ MangaContentInfo(
|
|
|
+ title = title,
|
|
|
+ doSearch = doSearch,
|
|
|
+ author = author,
|
|
|
+ artist = artist,
|
|
|
+ status = status,
|
|
|
+ sourceName = sourceName,
|
|
|
+ isStubSource = isStubSource,
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+@Composable
|
|
|
+private fun MangaContentInfo(
|
|
|
+ title: String,
|
|
|
+ textAlign: TextAlign? = LocalTextStyle.current.textAlign,
|
|
|
+ doSearch: (query: String, global: Boolean) -> Unit,
|
|
|
+ author: String?,
|
|
|
+ artist: String?,
|
|
|
+ status: Long,
|
|
|
+ sourceName: String,
|
|
|
+ isStubSource: Boolean,
|
|
|
+) {
|
|
|
+ val context = LocalContext.current
|
|
|
+ Text(
|
|
|
+ text = title.ifBlank { stringResource(R.string.unknown_title) },
|
|
|
+ style = MaterialTheme.typography.titleLarge,
|
|
|
+ modifier = Modifier.clickableNoIndication(
|
|
|
+ onLongClick = {
|
|
|
+ if (title.isNotBlank()) {
|
|
|
+ context.copyToClipboard(
|
|
|
+ title,
|
|
|
+ title,
|
|
|
+ )
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onClick = { if (title.isNotBlank()) doSearch(title, true) },
|
|
|
+ ),
|
|
|
+ textAlign = textAlign,
|
|
|
+ )
|
|
|
+
|
|
|
+ Spacer(modifier = Modifier.height(2.dp))
|
|
|
+
|
|
|
+ Row(
|
|
|
+ modifier = Modifier.secondaryItemAlpha(),
|
|
|
+ horizontalArrangement = Arrangement.spacedBy(4.dp),
|
|
|
+ verticalAlignment = Alignment.CenterVertically,
|
|
|
+ ) {
|
|
|
+ Icon(
|
|
|
+ imageVector = Icons.Filled.PersonOutline,
|
|
|
+ contentDescription = null,
|
|
|
+ modifier = Modifier.size(16.dp),
|
|
|
+ )
|
|
|
+ Text(
|
|
|
+ text = author?.takeIf { it.isNotBlank() }
|
|
|
+ ?: stringResource(R.string.unknown_author),
|
|
|
+ style = MaterialTheme.typography.titleSmall,
|
|
|
+ modifier = Modifier
|
|
|
+ .clickableNoIndication(
|
|
|
onLongClick = {
|
|
|
- if (title.isNotBlank()) {
|
|
|
+ if (!author.isNullOrBlank()) {
|
|
|
context.copyToClipboard(
|
|
|
- title,
|
|
|
- title,
|
|
|
+ author,
|
|
|
+ author,
|
|
|
)
|
|
|
}
|
|
|
},
|
|
|
- onClick = { if (title.isNotBlank()) doSearch(title, true) },
|
|
|
+ onClick = { if (!author.isNullOrBlank()) doSearch(author, true) },
|
|
|
),
|
|
|
- )
|
|
|
-
|
|
|
- Spacer(modifier = Modifier.height(2.dp))
|
|
|
-
|
|
|
- Row(
|
|
|
- modifier = Modifier.secondaryItemAlpha(),
|
|
|
- horizontalArrangement = Arrangement.spacedBy(4.dp),
|
|
|
- verticalAlignment = Alignment.CenterVertically,
|
|
|
- ) {
|
|
|
- Icon(
|
|
|
- imageVector = Icons.Filled.PersonOutline,
|
|
|
- contentDescription = null,
|
|
|
- modifier = Modifier.size(16.dp),
|
|
|
- )
|
|
|
- Text(
|
|
|
- text = author?.takeIf { it.isNotBlank() }
|
|
|
- ?: stringResource(R.string.unknown_author),
|
|
|
- style = MaterialTheme.typography.titleSmall,
|
|
|
- modifier = Modifier
|
|
|
- .clickableNoIndication(
|
|
|
- onLongClick = {
|
|
|
- if (!author.isNullOrBlank()) {
|
|
|
- context.copyToClipboard(
|
|
|
- author,
|
|
|
- author,
|
|
|
- )
|
|
|
- }
|
|
|
- },
|
|
|
- onClick = { if (!author.isNullOrBlank()) doSearch(author, true) },
|
|
|
- ),
|
|
|
- )
|
|
|
- }
|
|
|
+ textAlign = textAlign,
|
|
|
+ )
|
|
|
+ }
|
|
|
|
|
|
- if (!artist.isNullOrBlank() && author != artist) {
|
|
|
- Row(
|
|
|
- modifier = Modifier.secondaryItemAlpha(),
|
|
|
- horizontalArrangement = Arrangement.spacedBy(4.dp),
|
|
|
- verticalAlignment = Alignment.CenterVertically,
|
|
|
- ) {
|
|
|
- Icon(
|
|
|
- imageVector = Icons.Filled.Brush,
|
|
|
- contentDescription = null,
|
|
|
- modifier = Modifier.size(16.dp),
|
|
|
- )
|
|
|
- Text(
|
|
|
- text = artist,
|
|
|
- style = MaterialTheme.typography.titleSmall,
|
|
|
- modifier = Modifier
|
|
|
- .clickableNoIndication(
|
|
|
- onLongClick = { context.copyToClipboard(artist, artist) },
|
|
|
- onClick = { doSearch(artist, true) },
|
|
|
- ),
|
|
|
- )
|
|
|
- }
|
|
|
- }
|
|
|
+ if (!artist.isNullOrBlank() && author != artist) {
|
|
|
+ Row(
|
|
|
+ modifier = Modifier.secondaryItemAlpha(),
|
|
|
+ horizontalArrangement = Arrangement.spacedBy(4.dp),
|
|
|
+ verticalAlignment = Alignment.CenterVertically,
|
|
|
+ ) {
|
|
|
+ Icon(
|
|
|
+ imageVector = Icons.Filled.Brush,
|
|
|
+ contentDescription = null,
|
|
|
+ modifier = Modifier.size(16.dp),
|
|
|
+ )
|
|
|
+ Text(
|
|
|
+ text = artist,
|
|
|
+ style = MaterialTheme.typography.titleSmall,
|
|
|
+ modifier = Modifier
|
|
|
+ .clickableNoIndication(
|
|
|
+ onLongClick = { context.copyToClipboard(artist, artist) },
|
|
|
+ onClick = { doSearch(artist, true) },
|
|
|
+ ),
|
|
|
+ textAlign = textAlign,
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- Spacer(modifier = Modifier.height(2.dp))
|
|
|
+ Spacer(modifier = Modifier.height(2.dp))
|
|
|
|
|
|
- Row(
|
|
|
- modifier = Modifier.secondaryItemAlpha(),
|
|
|
- verticalAlignment = Alignment.CenterVertically,
|
|
|
- ) {
|
|
|
+ Row(
|
|
|
+ modifier = Modifier.secondaryItemAlpha(),
|
|
|
+ verticalAlignment = Alignment.CenterVertically,
|
|
|
+ ) {
|
|
|
+ Icon(
|
|
|
+ imageVector = when (status) {
|
|
|
+ SManga.ONGOING.toLong() -> Icons.Outlined.Schedule
|
|
|
+ SManga.COMPLETED.toLong() -> Icons.Outlined.DoneAll
|
|
|
+ SManga.LICENSED.toLong() -> Icons.Outlined.AttachMoney
|
|
|
+ SManga.PUBLISHING_FINISHED.toLong() -> Icons.Outlined.Done
|
|
|
+ SManga.CANCELLED.toLong() -> Icons.Outlined.Close
|
|
|
+ SManga.ON_HIATUS.toLong() -> Icons.Outlined.Pause
|
|
|
+ else -> Icons.Outlined.Block
|
|
|
+ },
|
|
|
+ contentDescription = null,
|
|
|
+ modifier = Modifier
|
|
|
+ .padding(end = 4.dp)
|
|
|
+ .size(16.dp),
|
|
|
+ )
|
|
|
+ ProvideTextStyle(MaterialTheme.typography.bodyMedium) {
|
|
|
+ Text(
|
|
|
+ text = when (status) {
|
|
|
+ SManga.ONGOING.toLong() -> stringResource(R.string.ongoing)
|
|
|
+ SManga.COMPLETED.toLong() -> stringResource(R.string.completed)
|
|
|
+ SManga.LICENSED.toLong() -> stringResource(R.string.licensed)
|
|
|
+ SManga.PUBLISHING_FINISHED.toLong() -> stringResource(R.string.publishing_finished)
|
|
|
+ SManga.CANCELLED.toLong() -> stringResource(R.string.cancelled)
|
|
|
+ SManga.ON_HIATUS.toLong() -> stringResource(R.string.on_hiatus)
|
|
|
+ else -> stringResource(R.string.unknown)
|
|
|
+ },
|
|
|
+ overflow = TextOverflow.Ellipsis,
|
|
|
+ maxLines = 1,
|
|
|
+ )
|
|
|
+ DotSeparatorText()
|
|
|
+ if (isStubSource) {
|
|
|
Icon(
|
|
|
- imageVector = when (status) {
|
|
|
- SManga.ONGOING.toLong() -> Icons.Outlined.Schedule
|
|
|
- SManga.COMPLETED.toLong() -> Icons.Outlined.DoneAll
|
|
|
- SManga.LICENSED.toLong() -> Icons.Outlined.AttachMoney
|
|
|
- SManga.PUBLISHING_FINISHED.toLong() -> Icons.Outlined.Done
|
|
|
- SManga.CANCELLED.toLong() -> Icons.Outlined.Close
|
|
|
- SManga.ON_HIATUS.toLong() -> Icons.Outlined.Pause
|
|
|
- else -> Icons.Outlined.Block
|
|
|
- },
|
|
|
+ imageVector = Icons.Filled.Warning,
|
|
|
contentDescription = null,
|
|
|
modifier = Modifier
|
|
|
.padding(end = 4.dp)
|
|
|
.size(16.dp),
|
|
|
+ tint = MaterialTheme.colorScheme.error,
|
|
|
)
|
|
|
- ProvideTextStyle(MaterialTheme.typography.bodyMedium) {
|
|
|
- Text(
|
|
|
- text = when (status) {
|
|
|
- SManga.ONGOING.toLong() -> stringResource(R.string.ongoing)
|
|
|
- SManga.COMPLETED.toLong() -> stringResource(R.string.completed)
|
|
|
- SManga.LICENSED.toLong() -> stringResource(R.string.licensed)
|
|
|
- SManga.PUBLISHING_FINISHED.toLong() -> stringResource(R.string.publishing_finished)
|
|
|
- SManga.CANCELLED.toLong() -> stringResource(R.string.cancelled)
|
|
|
- SManga.ON_HIATUS.toLong() -> stringResource(R.string.on_hiatus)
|
|
|
- else -> stringResource(R.string.unknown)
|
|
|
- },
|
|
|
- overflow = TextOverflow.Ellipsis,
|
|
|
- maxLines = 1,
|
|
|
- )
|
|
|
- DotSeparatorText()
|
|
|
- if (isStubSource) {
|
|
|
- Icon(
|
|
|
- imageVector = Icons.Filled.Warning,
|
|
|
- contentDescription = null,
|
|
|
- modifier = Modifier
|
|
|
- .padding(end = 4.dp)
|
|
|
- .size(16.dp),
|
|
|
- tint = MaterialTheme.colorScheme.error,
|
|
|
- )
|
|
|
- }
|
|
|
- Text(
|
|
|
- text = sourceName,
|
|
|
- modifier = Modifier.clickableNoIndication {
|
|
|
- doSearch(
|
|
|
- sourceName,
|
|
|
- false,
|
|
|
- )
|
|
|
- },
|
|
|
- overflow = TextOverflow.Ellipsis,
|
|
|
- maxLines = 1,
|
|
|
- )
|
|
|
- }
|
|
|
}
|
|
|
+ Text(
|
|
|
+ text = sourceName,
|
|
|
+ modifier = Modifier.clickableNoIndication {
|
|
|
+ doSearch(
|
|
|
+ sourceName,
|
|
|
+ false,
|
|
|
+ )
|
|
|
+ },
|
|
|
+ overflow = TextOverflow.Ellipsis,
|
|
|
+ maxLines = 1,
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
}
|