From 999841511c95f0b39181a16d4a330ed8ab383fdd Mon Sep 17 00:00:00 2001 From: Him188 Date: Sun, 30 Jun 2024 21:43:07 +0100 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AE=BE=E7=BD=AE=E5=9C=A8?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=95=B0=E6=8D=AE=E6=BA=90=E5=90=8E=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=85=B3=E9=97=AD=E6=95=B0=E6=8D=AE=E6=BA=90=E5=BC=B9?= =?UTF-8?q?=E7=AA=97,=20close=20#161?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/data/models/VideoScaffoldConfig.kt | 4 ++++ .../ui/settings/tabs/app/AppSettingsTab.kt | 9 ++++++++ .../subject/episode/details/EpisodeDetails.kt | 21 +++++++++++++++++-- .../details/EpisodePlayMediaSelector.kt | 6 ++++++ 4 files changed, 38 insertions(+), 2 deletions(-) diff --git a/app/shared/src/commonMain/kotlin/data/models/VideoScaffoldConfig.kt b/app/shared/src/commonMain/kotlin/data/models/VideoScaffoldConfig.kt index 86fcf33fb3..8edae9e2ab 100644 --- a/app/shared/src/commonMain/kotlin/data/models/VideoScaffoldConfig.kt +++ b/app/shared/src/commonMain/kotlin/data/models/VideoScaffoldConfig.kt @@ -40,6 +40,10 @@ data class VideoScaffoldConfig( * 在观看到 90% 进度后, 自动标记看过 */ val autoMarkDone: Boolean = true, + /** + * 在点击选择剧集后, 立即隐藏 media selector + */ + val hideSelectorOnSelect: Boolean = false, @Suppress("PropertyName") @Transient val _placeholder: Int = 0, ) { companion object { diff --git a/app/shared/src/commonMain/kotlin/ui/settings/tabs/app/AppSettingsTab.kt b/app/shared/src/commonMain/kotlin/ui/settings/tabs/app/AppSettingsTab.kt index fcfc1926ca..2a2f9977fb 100644 --- a/app/shared/src/commonMain/kotlin/ui/settings/tabs/app/AppSettingsTab.kt +++ b/app/shared/src/commonMain/kotlin/ui/settings/tabs/app/AppSettingsTab.kt @@ -411,6 +411,15 @@ private fun SettingsScope.PlayerGroup( title = { Text("观看 90% 后自动标记为看过") }, Modifier.placeholder(vm.uiSettings.loading), ) + HorizontalDividerItem() + SwitchItem( + checked = config.hideSelectorOnSelect, + onCheckedChange = { + vm.videoScaffoldConfig.update(config.copy(hideSelectorOnSelect = it)) + }, + title = { Text("选择数据源后自动关闭弹窗") }, + Modifier.placeholder(vm.uiSettings.loading), + ) } } diff --git a/app/shared/src/commonMain/kotlin/ui/subject/episode/details/EpisodeDetails.kt b/app/shared/src/commonMain/kotlin/ui/subject/episode/details/EpisodeDetails.kt index 5e5f67fe58..5863018ed5 100644 --- a/app/shared/src/commonMain/kotlin/ui/subject/episode/details/EpisodeDetails.kt +++ b/app/shared/src/commonMain/kotlin/ui/subject/episode/details/EpisodeDetails.kt @@ -25,12 +25,14 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.Stable import androidx.compose.runtime.getValue import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import kotlinx.coroutines.launch import me.him188.ani.app.platform.currentPlatform import me.him188.ani.app.platform.isDesktop import me.him188.ani.app.tools.rememberBackgroundMonoTasker @@ -100,14 +102,29 @@ fun EpisodeDetails( } if (viewModel.mediaSelectorVisible) { + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = currentPlatform.isDesktop()) + val uiScope = rememberCoroutineScope() ModalBottomSheet( onDismissRequest = { viewModel.mediaSelectorVisible = false }, - sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = currentPlatform.isDesktop()), + sheetState = sheetState, ) { EpisodePlayMediaSelector( mediaSelector = viewModel.mediaSelectorPresentation, sourceResults = viewModel.mediaSourceResultsPresentation, - onDismissRequest = { viewModel.mediaSelectorVisible = false }, + onDismissRequest = { + uiScope.launch { + sheetState.hide() + viewModel.mediaSelectorVisible = false + } + }, + onSelected = { + if (viewModel.videoScaffoldConfig.hideSelectorOnSelect) { + uiScope.launch { + sheetState.hide() + viewModel.mediaSelectorVisible = false + } + } + }, modifier = Modifier.fillMaxHeight(), // 防止添加筛选后数量变少导致 bottom sheet 高度变化 ) } diff --git a/app/shared/src/commonMain/kotlin/ui/subject/episode/details/EpisodePlayMediaSelector.kt b/app/shared/src/commonMain/kotlin/ui/subject/episode/details/EpisodePlayMediaSelector.kt index 8bcf8cc9d3..3de8a1170b 100644 --- a/app/shared/src/commonMain/kotlin/ui/subject/episode/details/EpisodePlayMediaSelector.kt +++ b/app/shared/src/commonMain/kotlin/ui/subject/episode/details/EpisodePlayMediaSelector.kt @@ -12,6 +12,7 @@ import me.him188.ani.app.ui.subject.episode.mediaFetch.MediaSelectorPresentation import me.him188.ani.app.ui.subject.episode.mediaFetch.MediaSelectorView import me.him188.ani.app.ui.subject.episode.mediaFetch.MediaSourceResultsPresentation import me.him188.ani.app.ui.subject.episode.mediaFetch.MediaSourceResultsView +import me.him188.ani.datasources.api.Media /** * 播放视频时的选择数据源 @@ -22,6 +23,7 @@ fun EpisodePlayMediaSelector( sourceResults: MediaSourceResultsPresentation, onDismissRequest: () -> Unit, modifier: Modifier = Modifier, + onSelected: (Media) -> Unit = {}, ) { MediaSelectorView( mediaSelector, @@ -36,6 +38,10 @@ fun EpisodePlayMediaSelector( Text("取消") } }, + onClickItem = { + mediaSelector.select(it) + onSelected(it) + }, itemProgressBar = {}, ) } \ No newline at end of file