Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,10 @@ data class SubjectInfo(
@Stable
val SubjectInfo.nameCnOrName get() = nameCn.takeIf { it.isNotBlank() } ?: name

@Stable
val SubjectInfo.fullDisplayName: String
get() = if (nameCn.isNotBlank() && name.isNotBlank() && nameCn != name) "$nameCn / $name" else displayName

fun SubjectInfo.toNavPlaceholder(): SubjectDetailPlaceholder {
return SubjectDetailPlaceholder(subjectId, name, nameCn, imageLarge)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@
<string name="settings_mediasource_export">导出配置</string>
<string name="settings_mediasource_copied_to_clipboard">已复制到剪贴板</string>
<string name="settings_mediasource_export_failed">目前无法导出,请稍后再试</string>
<string name="subject_title_copied">番名已复制到剪贴板</string>

<string name="settings_mediasource_export_single">导出单个配置 (仅限开发者)</string>

<!-- RefreshIndicatedHeadlineRow -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@
<string name="settings_mediasource_export">導出配置</string>
<string name="settings_mediasource_copied_to_clipboard">已複製到剪貼板</string>
<string name="settings_mediasource_export_failed">目前無法導出,請稍後再試</string>
<string name="subject_title_copied">番名已複製到剪貼板</string>

<string name="settings_mediasource_export_single">導出單個配置 (僅限開發者)</string>

<!-- RefreshIndicatedHeadlineRow -->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,8 @@
<string name="settings_mediasource_export">匯出配置</string>
<string name="settings_mediasource_copied_to_clipboard">已複製到剪貼簿</string>
<string name="settings_mediasource_export_failed">目前無法匯出,請稍後再試</string>
<string name="subject_title_copied">番名已複製到剪貼簿</string>

<string name="settings_mediasource_export_single">匯出單個配置 (僅限開發者)</string>

<!-- RefreshIndicatedHeadlineRow -->
Expand Down
2 changes: 2 additions & 0 deletions app/shared/app-lang/src/androidMain/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,8 @@
<string name="settings_mediasource_export">Export configuration</string>
<string name="settings_mediasource_copied_to_clipboard">Copied to clipboard</string>
<string name="settings_mediasource_export_failed">Unable to export now, please try again later</string>
<string name="subject_title_copied">Title copied to clipboard</string>

<string name="settings_mediasource_export_single">Export a single configuration (developer only)</string>
<string name="settings_mediasource_refresh">Refresh</string>
<string name="settings_mediasource_unauthorized">Unauthorized</string>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ package me.him188.ani.app.ui.subject.details
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.tween
import androidx.compose.foundation.background
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
Expand Down Expand Up @@ -69,8 +70,10 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalUriHandler
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.unit.dp
import androidx.lifecycle.compose.collectAsStateWithLifecycle
Expand All @@ -84,6 +87,7 @@ import me.him188.ani.app.data.models.subject.SubjectCollectionStats
import me.him188.ani.app.data.models.subject.SubjectInfo
import me.him188.ani.app.data.models.subject.SubjectProgressInfo
import me.him188.ani.app.data.models.subject.Tag
import me.him188.ani.app.data.models.subject.fullDisplayName
import me.him188.ani.app.domain.episode.SetEpisodeCollectionTypeRequest
import me.him188.ani.app.domain.foundation.LoadError
import me.him188.ani.app.navigation.LocalNavigator
Expand Down Expand Up @@ -114,6 +118,8 @@ import me.him188.ani.app.ui.foundation.theme.MaterialThemeFromImage
import me.him188.ani.app.ui.foundation.toComposeImageBitmap
import me.him188.ani.app.ui.foundation.widgets.LocalToaster
import me.him188.ani.app.ui.foundation.widgets.showLoadError
import me.him188.ani.app.ui.lang.Lang
import me.him188.ani.app.ui.lang.subject_title_copied
import me.him188.ani.app.ui.rating.EditableRating
import me.him188.ani.app.ui.rating.EditableRatingState
import me.him188.ani.app.ui.richtext.RichTextDefaults
Expand All @@ -136,6 +142,7 @@ import me.him188.ani.app.ui.user.SelfInfoUiState
import me.him188.ani.datasources.api.PackedDate
import me.him188.ani.datasources.api.topic.toggleCollected
import me.him188.ani.utils.platform.isMobile
import org.jetbrains.compose.resources.stringResource

// region screen

Expand Down Expand Up @@ -552,10 +559,26 @@ fun SubjectDetailsLayout(
AniAnimatedVisibility(connectedScrollState.isScrolledTop) {
TopAppBar(
title = {
val clipboard = LocalClipboardManager.current
val toaster = LocalToaster.current
val copied = stringResource(Lang.subject_title_copied)
val fullName = info?.fullDisplayName.orEmpty()
val copy = {
if (fullName.isNotBlank()) {
clipboard.setText(AnnotatedString(fullName))
toaster.toast(copied)
}
}
Text(
info?.displayName ?: "",
maxLines = 1,
overflow = TextOverflow.Ellipsis,
modifier = Modifier.combinedClickable(
onClick = copy,
onLongClick = copy,
onLongClickLabel = "复制",
onClickLabel = "复制",
),
)
},
navigationIcon = navigationIcon,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@

package me.him188.ani.app.ui.subject.details.components

import androidx.compose.foundation.clickable
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.BoxScope
Expand Down Expand Up @@ -39,14 +39,21 @@ import androidx.compose.ui.draw.clip
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.painter.ColorPainter
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.LocalClipboardManager
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.dp
import coil3.compose.AsyncImagePainter
import me.him188.ani.app.data.models.subject.SubjectInfo
import me.him188.ani.app.data.models.subject.fullDisplayName
import me.him188.ani.app.platform.currentAniBuildConfig
import me.him188.ani.app.ui.foundation.AsyncImage
import me.him188.ani.app.ui.foundation.layout.currentWindowAdaptiveInfo1
import me.him188.ani.app.ui.foundation.layout.isWidthAtLeastMedium
import me.him188.ani.app.ui.foundation.layout.paddingIfNotEmpty
import me.him188.ani.app.ui.foundation.widgets.LocalToaster
import me.him188.ani.app.ui.lang.Lang
import me.him188.ani.app.ui.lang.subject_title_copied
import org.jetbrains.compose.resources.stringResource

const val COVER_WIDTH_TO_HEIGHT_RATIO = 849 / 1200f

Expand All @@ -66,6 +73,7 @@ internal fun SubjectDetailsHeader(
if (currentWindowAdaptiveInfo1().isWidthAtLeastMedium) {
SubjectDetailsHeaderWide(
coverImageUrl = coverImageUrl,
info = info,
title = {
Text(
info?.displayName ?: "",
Expand All @@ -90,6 +98,7 @@ internal fun SubjectDetailsHeader(
} else {
SubjectDetailsHeaderCompact(
coverImageUrl = coverImageUrl,
info = info,
title = { Text(info?.displayName ?: "") },
subtitle = { Text(info?.name ?: "") },
seasonTags = { seasonTags() },
Expand All @@ -108,6 +117,7 @@ internal fun SubjectDetailsHeader(
@Composable
fun SubjectDetailsHeaderCompact(
coverImageUrl: String?,
info: SubjectInfo?,
title: @Composable () -> Unit,
subtitle: @Composable () -> Unit,
seasonTags: @Composable () -> Unit,
Expand Down Expand Up @@ -143,8 +153,19 @@ fun SubjectDetailsHeaderCompact(
Modifier.fillMaxWidth(), // required by Rating
verticalArrangement = Arrangement.spacedBy(12.dp),
) {
val clipboard = LocalClipboardManager.current
val toaster = LocalToaster.current
val copied = stringResource(Lang.subject_title_copied)
val fullName = info?.fullDisplayName.orEmpty()
val copy = {
if (fullName.isNotBlank()) {
clipboard.setText(AnnotatedString(fullName))
toaster.toast(copied)
}
}

var showSubtitle by remember { mutableStateOf(false) }
Box(Modifier.clickable { showSubtitle = !showSubtitle }) {
Box(Modifier.combinedClickable(onClick = copy, onLongClick = { showSubtitle = !showSubtitle })) {
ProvideTextStyle(MaterialTheme.typography.titleLarge) {
if (showSubtitle) {
subtitle()
Expand Down Expand Up @@ -192,6 +213,7 @@ fun SubjectDetailsHeaderCompact(
@Composable
fun SubjectDetailsHeaderWide(
coverImageUrl: String?,
info: SubjectInfo?,
title: @Composable () -> Unit,
seasonTags: @Composable RowScope.() -> Unit,
collectionData: @Composable () -> Unit,
Expand Down Expand Up @@ -230,7 +252,18 @@ fun SubjectDetailsHeaderWide(
Modifier.weight(1f, fill = true),
verticalArrangement = Arrangement.spacedBy(12.dp),
) {
Box(Modifier) {
val clipboard = LocalClipboardManager.current
val toaster = LocalToaster.current
val copied = stringResource(Lang.subject_title_copied)
val fullName = info?.fullDisplayName.orEmpty()
val copy = {
if (fullName.isNotBlank()) {
clipboard.setText(AnnotatedString(fullName))
toaster.toast(copied)
}
}

Box(Modifier.combinedClickable(onClick = copy, onLongClick = { })) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

有 selection container 不能同时提供 onClick,会冲突

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Wide 在安卓大屏也会使用,此时 onClick 不合适

ProvideTextStyle(MaterialTheme.typography.titleLarge) {
SelectionContainer {
title()
Expand Down
Loading