From af2058e980e3e13b2ef39793d972495794863209 Mon Sep 17 00:00:00 2001 From: Nier4ever <20170127nwl@gmail.com> Date: Sat, 21 Sep 2024 09:56:22 +0800 Subject: [PATCH 1/4] implement WindowDragArea --- app/desktop/src/main/kotlin/AniDesktop.kt | 1 + .../interaction/WindowDragArea.android.kt | 17 ++++++++++++++ .../foundation/interaction/WindowDragArea.kt | 17 ++++++++++++++ .../kotlin/platform/PlatformWindow.desktop.kt | 2 ++ .../foundation/PreviewFoundation.desktop.kt | 10 ++++++++- .../interaction/WindowDragArea.desktop.kt | 22 +++++++++++++++++++ .../interaction/WindowDragArea.ios.kt | 17 ++++++++++++++ 7 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt create mode 100644 app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt create mode 100644 app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt create mode 100644 app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt diff --git a/app/desktop/src/main/kotlin/AniDesktop.kt b/app/desktop/src/main/kotlin/AniDesktop.kt index d8eb11f6db..5de6785578 100644 --- a/app/desktop/src/main/kotlin/AniDesktop.kt +++ b/app/desktop/src/main/kotlin/AniDesktop.kt @@ -275,6 +275,7 @@ object AniDesktop { LocalPlatformWindow provides remember(window.windowHandle) { PlatformWindow( windowHandle = window.windowHandle, + windowScope = this, ) }, LocalOnBackPressedDispatcherOwner provides backPressedDispatcherOwner, diff --git a/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt b/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt new file mode 100644 index 0000000000..0639b9a81b --- /dev/null +++ b/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2024 OpenAni and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license, which can be found at the following link. + * + * https://github.com/open-ani/ani/blob/main/LICENSE + */ + +package me.him188.ani.app.ui.foundation.interaction + +import androidx.compose.runtime.Composable + +@Composable +actual fun WindowDragArea(content: @Composable () -> Unit) { + content() +} diff --git a/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt b/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt new file mode 100644 index 0000000000..b6527bcdbc --- /dev/null +++ b/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2024 OpenAni and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license, which can be found at the following link. + * + * https://github.com/open-ani/ani/blob/main/LICENSE + */ + +package me.him188.ani.app.ui.foundation.interaction + +import androidx.compose.runtime.Composable + +@Composable +expect fun WindowDragArea( + content: @Composable () -> Unit +) diff --git a/app/shared/ui-foundation/src/desktopMain/kotlin/platform/PlatformWindow.desktop.kt b/app/shared/ui-foundation/src/desktopMain/kotlin/platform/PlatformWindow.desktop.kt index 44e700e4df..8bf67d8699 100644 --- a/app/shared/ui-foundation/src/desktopMain/kotlin/platform/PlatformWindow.desktop.kt +++ b/app/shared/ui-foundation/src/desktopMain/kotlin/platform/PlatformWindow.desktop.kt @@ -4,9 +4,11 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.geometry.Rect +import androidx.compose.ui.window.WindowScope actual open class PlatformWindow( val windowHandle: Long, + val windowScope: WindowScope ) { internal var savedWindowState: SavedWindowState? = null diff --git a/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/PreviewFoundation.desktop.kt b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/PreviewFoundation.desktop.kt index 6c07d47906..538c3039ed 100644 --- a/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/PreviewFoundation.desktop.kt +++ b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/PreviewFoundation.desktop.kt @@ -12,8 +12,10 @@ package me.him188.ani.app.ui.foundation import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember +import androidx.compose.ui.awt.ComposeWindow import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp +import androidx.compose.ui.window.FrameWindowScope import androidx.compose.ui.window.WindowState import me.him188.ani.app.platform.DesktopContext import me.him188.ani.app.platform.ExtraWindowProperties @@ -38,7 +40,13 @@ internal actual inline fun ProvidePlatformCompositionLocalsForPreview(crossinlin ) }, LocalPlatformWindow provides remember { - PlatformWindow(0L) + PlatformWindow( + 0L, + object : FrameWindowScope { + override val window: ComposeWindow + get() = TODO("Not yet implemented") + }, + ) }, ) { content() diff --git a/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt new file mode 100644 index 0000000000..090550c042 --- /dev/null +++ b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt @@ -0,0 +1,22 @@ +/* + * Copyright (C) 2024 OpenAni and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license, which can be found at the following link. + * + * https://github.com/open-ani/ani/blob/main/LICENSE + */ + +package me.him188.ani.app.ui.foundation.interaction + +import androidx.compose.foundation.window.WindowDraggableArea +import androidx.compose.runtime.Composable +import me.him188.ani.app.ui.foundation.layout.LocalPlatformWindow + +@Composable +actual fun WindowDragArea(content: @Composable () -> Unit) { + val windowScope = LocalPlatformWindow.current.windowScope + windowScope.WindowDraggableArea { + content() + } +} diff --git a/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt b/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt new file mode 100644 index 0000000000..0639b9a81b --- /dev/null +++ b/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt @@ -0,0 +1,17 @@ +/* + * Copyright (C) 2024 OpenAni and contributors. + * + * 此源代码的使用受 GNU AFFERO GENERAL PUBLIC LICENSE version 3 许可证的约束, 可以在以下链接找到该许可证. + * Use of this source code is governed by the GNU AGPLv3 license, which can be found at the following link. + * + * https://github.com/open-ani/ani/blob/main/LICENSE + */ + +package me.him188.ani.app.ui.foundation.interaction + +import androidx.compose.runtime.Composable + +@Composable +actual fun WindowDragArea(content: @Composable () -> Unit) { + content() +} From 251880f1bd25c42e249949f74ea2d66d8d95d3a3 Mon Sep 17 00:00:00 2001 From: Nier4ever <20170127nwl@gmail.com> Date: Sat, 21 Sep 2024 10:18:58 +0800 Subject: [PATCH 2/4] apply WindowDragArea --- .../kotlin/ui/cache/CacheManagementPage.kt | 23 +++--- .../ui/cache/details/CacheGroupDetailsPage.kt | 25 +++--- .../ui/subject/cache/SubjectCacheScene.kt | 23 +++--- .../ui/subject/collection/CollectionPage.kt | 65 ++++++++-------- .../ui/subject/details/SubjectDetailsPage.kt | 45 ++++++----- .../kotlin/ui/settings/SettingsPage.kt | 23 +++--- .../mediasource/rss/EditRssMediaSource.kt | 49 ++++++------ .../media/torrent/peer/PeerFilterSettings.kt | 77 ++++++++++--------- 8 files changed, 179 insertions(+), 151 deletions(-) diff --git a/app/shared/src/commonMain/kotlin/ui/cache/CacheManagementPage.kt b/app/shared/src/commonMain/kotlin/ui/cache/CacheManagementPage.kt index 7192052a21..de9f8e2c70 100644 --- a/app/shared/src/commonMain/kotlin/ui/cache/CacheManagementPage.kt +++ b/app/shared/src/commonMain/kotlin/ui/cache/CacheManagementPage.kt @@ -68,6 +68,7 @@ import me.him188.ani.app.ui.cache.components.CacheGroupState import me.him188.ani.app.ui.cache.components.CacheManagementOverallStats import me.him188.ani.app.ui.foundation.AbstractViewModel import me.him188.ani.app.ui.foundation.ifThen +import me.him188.ani.app.ui.foundation.interaction.WindowDragArea import me.him188.ani.app.ui.foundation.produceState import me.him188.ani.app.ui.foundation.stateOf import me.him188.ani.app.ui.foundation.theme.AniThemeDefaults @@ -264,16 +265,18 @@ fun CacheManagementPage( Scaffold( modifier, topBar = { - TopAppBar( - title = { Text("缓存管理") }, - navigationIcon = { - if (showBack) { - TopAppBarGoBackButton() - } - }, - colors = appBarColors, - windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), - ) + WindowDragArea { + TopAppBar( + title = { Text("缓存管理") }, + navigationIcon = { + if (showBack) { + TopAppBarGoBackButton() + } + }, + colors = appBarColors, + windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), + ) + } }, contentWindowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom), ) { paddingValues -> diff --git a/app/shared/src/commonMain/kotlin/ui/cache/details/CacheGroupDetailsPage.kt b/app/shared/src/commonMain/kotlin/ui/cache/details/CacheGroupDetailsPage.kt index 1a72a0cfcc..5e4b5b5420 100644 --- a/app/shared/src/commonMain/kotlin/ui/cache/details/CacheGroupDetailsPage.kt +++ b/app/shared/src/commonMain/kotlin/ui/cache/details/CacheGroupDetailsPage.kt @@ -14,8 +14,6 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.only import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.widthIn -import androidx.compose.foundation.rememberScrollState -import androidx.compose.foundation.verticalScroll import androidx.compose.material3.BottomSheetDefaults import androidx.compose.material3.ListItemDefaults import androidx.compose.material3.Scaffold @@ -36,6 +34,7 @@ import kotlinx.coroutines.flow.map import me.him188.ani.app.data.source.media.cache.MediaCacheManager import me.him188.ani.app.data.source.media.fetch.MediaSourceManager import me.him188.ani.app.ui.foundation.AbstractViewModel +import me.him188.ani.app.ui.foundation.interaction.WindowDragArea import me.him188.ani.app.ui.foundation.theme.AniThemeDefaults import me.him188.ani.app.ui.foundation.widgets.TopAppBarGoBackButton import me.him188.ani.datasources.api.Media @@ -97,16 +96,18 @@ fun MediaCacheDetailsPage( Scaffold( modifier = modifier, topBar = { - TopAppBar( - title = { Text("详情") }, - navigationIcon = { - if (allowBack) { - TopAppBarGoBackButton() - } - }, - colors = AniThemeDefaults.topAppBarColors(), - windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), - ) + WindowDragArea { + TopAppBar( + title = { Text("详情") }, + navigationIcon = { + if (allowBack) { + TopAppBarGoBackButton() + } + }, + colors = AniThemeDefaults.topAppBarColors(), + windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), + ) + } }, contentWindowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom), ) { paddingValues -> diff --git a/app/shared/src/commonMain/kotlin/ui/subject/cache/SubjectCacheScene.kt b/app/shared/src/commonMain/kotlin/ui/subject/cache/SubjectCacheScene.kt index 278378bf78..754d950020 100644 --- a/app/shared/src/commonMain/kotlin/ui/subject/cache/SubjectCacheScene.kt +++ b/app/shared/src/commonMain/kotlin/ui/subject/cache/SubjectCacheScene.kt @@ -49,6 +49,7 @@ import me.him188.ani.app.data.source.media.selector.eventHandling import me.him188.ani.app.navigation.LocalNavigator import me.him188.ani.app.ui.external.placeholder.placeholder import me.him188.ani.app.ui.foundation.AbstractViewModel +import me.him188.ani.app.ui.foundation.interaction.WindowDragArea import me.him188.ani.app.ui.foundation.launchInBackground import me.him188.ani.app.ui.foundation.produceState import me.him188.ani.app.ui.foundation.stateOf @@ -277,16 +278,18 @@ fun SubjectCachePageScaffold( Scaffold( modifier, topBar = { - TopAppBar( - title = { - title() - }, - navigationIcon = { - TopAppBarGoBackButton() - }, - colors = appBarColors, - windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), - ) + WindowDragArea { + TopAppBar( + title = { + title() + }, + navigationIcon = { + TopAppBarGoBackButton() + }, + colors = appBarColors, + windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), + ) + } }, contentWindowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom), ) { paddingValues -> diff --git a/app/shared/src/commonMain/kotlin/ui/subject/collection/CollectionPage.kt b/app/shared/src/commonMain/kotlin/ui/subject/collection/CollectionPage.kt index 42a9764662..2b24275c11 100644 --- a/app/shared/src/commonMain/kotlin/ui/subject/collection/CollectionPage.kt +++ b/app/shared/src/commonMain/kotlin/ui/subject/collection/CollectionPage.kt @@ -66,6 +66,7 @@ import me.him188.ani.app.data.source.session.AuthState import me.him188.ani.app.navigation.LocalNavigator import me.him188.ani.app.tools.rememberUiMonoTasker import me.him188.ani.app.ui.foundation.LocalPlatform +import me.him188.ani.app.ui.foundation.interaction.WindowDragArea import me.him188.ani.app.ui.foundation.pagerTabIndicatorOffset import me.him188.ani.app.ui.foundation.theme.AniThemeDefaults import me.him188.ani.app.ui.foundation.widgets.PullToRefreshBox @@ -121,43 +122,45 @@ fun CollectionPane( topBar = { val topAppBarColors = AniThemeDefaults.topAppBarColors() Column(modifier = Modifier.fillMaxWidth()) { - TopAppBar( - title = { Text("我的追番") }, - modifier = Modifier, - actions = { - if (!showSessionErrorInList) { - SessionTipsIcon(vm.authState) - } + WindowDragArea { + TopAppBar( + title = { Text("我的追番") }, + modifier = Modifier, + actions = { + if (!showSessionErrorInList) { + SessionTipsIcon(vm.authState) + } - if (showCacheButton) { - TextButtonUpdateLogo() + if (showCacheButton) { + TextButtonUpdateLogo() - IconButton(onClickCaches) { - Icon(Icons.Rounded.Download, "缓存管理") + IconButton(onClickCaches) { + Icon(Icons.Rounded.Download, "缓存管理") + } } - } - if (LocalPlatform.current.isDesktop()) { - // PC 无法下拉刷新 - val refreshTasker = rememberUiMonoTasker() - IconButton( - { - val type = COLLECTION_TABS_SORTED[pagerState.currentPage] - val collection = vm.collectionsByType(type) - if (!refreshTasker.isRunning) { - refreshTasker.launch { - collection.subjectCollectionColumnState.manualRefresh() + if (LocalPlatform.current.isDesktop()) { + // PC 无法下拉刷新 + val refreshTasker = rememberUiMonoTasker() + IconButton( + { + val type = COLLECTION_TABS_SORTED[pagerState.currentPage] + val collection = vm.collectionsByType(type) + if (!refreshTasker.isRunning) { + refreshTasker.launch { + collection.subjectCollectionColumnState.manualRefresh() + } } - } - }, - ) { - Icon(Icons.Rounded.Refresh, null) + }, + ) { + Icon(Icons.Rounded.Refresh, null) + } } - } - }, - colors = topAppBarColors, - windowInsets = windowInsets.only(WindowInsetsSides.Top), - ) + }, + colors = topAppBarColors, + windowInsets = windowInsets.only(WindowInsetsSides.Top), + ) + } ScrollableTabRow( selectedTabIndex = pagerState.currentPage, diff --git a/app/shared/src/commonMain/kotlin/ui/subject/details/SubjectDetailsPage.kt b/app/shared/src/commonMain/kotlin/ui/subject/details/SubjectDetailsPage.kt index 9f41fcc221..8d36827b92 100644 --- a/app/shared/src/commonMain/kotlin/ui/subject/details/SubjectDetailsPage.kt +++ b/app/shared/src/commonMain/kotlin/ui/subject/details/SubjectDetailsPage.kt @@ -70,6 +70,7 @@ import me.him188.ani.app.platform.LocalContext import me.him188.ani.app.ui.foundation.ImageViewer import me.him188.ani.app.ui.foundation.LocalPlatform import me.him188.ani.app.ui.foundation.ifThen +import me.him188.ani.app.ui.foundation.interaction.WindowDragArea import me.him188.ani.app.ui.foundation.interaction.nestedScrollWorkaround import me.him188.ani.app.ui.foundation.layout.ConnectedScrollState import me.him188.ani.app.ui.foundation.layout.PaddingValuesSides @@ -245,33 +246,41 @@ fun SubjectDetailsPage( Scaffold( topBar = { if (showTopBar) { - Box { - // 透明背景的, 总是显示 - TopAppBar( - title = {}, - navigationIcon = { TopAppBarGoBackButton() }, - actions = { - IconButton(onClickOpenExternal) { - Icon(Icons.AutoMirrored.Outlined.OpenInNew, null) - } - }, - colors = AniThemeDefaults.topAppBarColors().copy(containerColor = Color.Transparent), - windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), - ) - - // 有背景, 仅在滚动一段距离后使用 - AnimatedVisibility(connectedScrollState.isScrolledTop, enter = fadeIn(), exit = fadeOut()) { + WindowDragArea { + Box { + // 透明背景的, 总是显示 TopAppBar( - title = { Text(state.info.displayName, maxLines = 1, overflow = TextOverflow.Ellipsis) }, + title = {}, navigationIcon = { TopAppBarGoBackButton() }, actions = { IconButton(onClickOpenExternal) { Icon(Icons.AutoMirrored.Outlined.OpenInNew, null) } }, - colors = AniThemeDefaults.topAppBarColors(), + colors = AniThemeDefaults.topAppBarColors().copy(containerColor = Color.Transparent), windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), ) + + // 有背景, 仅在滚动一段距离后使用 + AnimatedVisibility(connectedScrollState.isScrolledTop, enter = fadeIn(), exit = fadeOut()) { + TopAppBar( + title = { + Text( + state.info.displayName, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + }, + navigationIcon = { TopAppBarGoBackButton() }, + actions = { + IconButton(onClickOpenExternal) { + Icon(Icons.AutoMirrored.Outlined.OpenInNew, null) + } + }, + colors = AniThemeDefaults.topAppBarColors(), + windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), + ) + } } } } diff --git a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/SettingsPage.kt b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/SettingsPage.kt index f55f904cfc..5728befcf5 100644 --- a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/SettingsPage.kt +++ b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/SettingsPage.kt @@ -44,6 +44,7 @@ import kotlinx.coroutines.launch import me.him188.ani.app.navigation.AniNavigator import me.him188.ani.app.navigation.OverrideNavigation import me.him188.ani.app.ui.foundation.LocalPlatform +import me.him188.ani.app.ui.foundation.interaction.WindowDragArea import me.him188.ani.app.ui.foundation.layout.cardVerticalPadding import me.him188.ani.app.ui.foundation.pagerTabIndicatorOffset import me.him188.ani.app.ui.foundation.theme.AniThemeDefaults @@ -82,16 +83,18 @@ fun SettingsPage( Scaffold( modifier, topBar = { - TopAppBar( - title = { Text("设置") }, - navigationIcon = { - if (showBack) { - TopAppBarGoBackButton() - } - }, - colors = appBarColors, - windowInsets = contentWindowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), - ) + WindowDragArea { + TopAppBar( + title = { Text("设置") }, + navigationIcon = { + if (showBack) { + TopAppBarGoBackButton() + } + }, + colors = appBarColors, + windowInsets = contentWindowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), + ) + } }, contentWindowInsets = contentWindowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom), ) { topBarPaddings -> diff --git a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/mediasource/rss/EditRssMediaSource.kt b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/mediasource/rss/EditRssMediaSource.kt index 8ec53c4ac6..cf13d1299d 100644 --- a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/mediasource/rss/EditRssMediaSource.kt +++ b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/mediasource/rss/EditRssMediaSource.kt @@ -39,6 +39,7 @@ import androidx.window.core.layout.WindowWidthSizeClass import me.him188.ani.app.data.source.media.source.RssMediaSource import me.him188.ani.app.data.source.media.source.RssMediaSourceArguments import me.him188.ani.app.data.source.media.source.RssSearchConfig +import me.him188.ani.app.ui.foundation.interaction.WindowDragArea import me.him188.ani.app.ui.foundation.layout.AnimatedPane1 import me.him188.ani.app.ui.foundation.layout.PaddingValuesSides import me.him188.ani.app.ui.foundation.layout.ThreePaneScaffoldValueConverter.ExtraPaneForNestedDetails @@ -137,31 +138,33 @@ fun EditRssMediaSourcePage( modifier .fillMaxSize(), topBar = { - TopAppBar( - title = { - AnimatedContent( - navigator.currentDestination?.pane, - transitionSpec = AniThemeDefaults.standardAnimatedContentTransition, - ) { - when (it) { - ListDetailPaneScaffoldRole.List -> Text(state.displayName) - ListDetailPaneScaffoldRole.Detail -> Text("测试数据源") - ListDetailPaneScaffoldRole.Extra -> Text("详情") - else -> Text(state.displayName) + WindowDragArea { + TopAppBar( + title = { + AnimatedContent( + navigator.currentDestination?.pane, + transitionSpec = AniThemeDefaults.standardAnimatedContentTransition, + ) { + when (it) { + ListDetailPaneScaffoldRole.List -> Text(state.displayName) + ListDetailPaneScaffoldRole.Detail -> Text("测试数据源") + ListDetailPaneScaffoldRole.Extra -> Text("详情") + else -> Text(state.displayName) + } } - } - }, - navigationIcon = { TopAppBarGoBackButton() }, - colors = AniThemeDefaults.topAppBarColors(), - windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), - actions = { - if (navigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail] == PaneAdaptedValue.Hidden) { - TextButton({ navigator.navigateTo(ListDetailPaneScaffoldRole.Detail) }) { - Text("测试") + }, + navigationIcon = { TopAppBarGoBackButton() }, + colors = AniThemeDefaults.topAppBarColors(), + windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), + actions = { + if (navigator.scaffoldValue[ListDetailPaneScaffoldRole.Detail] == PaneAdaptedValue.Hidden) { + TextButton({ navigator.navigateTo(ListDetailPaneScaffoldRole.Detail) }) { + Text("测试") + } } - } - }, - ) + }, + ) + } }, contentWindowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom), ) { paddingValues -> diff --git a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/tabs/media/torrent/peer/PeerFilterSettings.kt b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/tabs/media/torrent/peer/PeerFilterSettings.kt index dbbb6039e0..5671f702cc 100644 --- a/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/tabs/media/torrent/peer/PeerFilterSettings.kt +++ b/app/shared/ui-settings/src/commonMain/kotlin/ui/settings/tabs/media/torrent/peer/PeerFilterSettings.kt @@ -35,6 +35,7 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import me.him188.ani.app.ui.foundation.IconButton +import me.him188.ani.app.ui.foundation.interaction.WindowDragArea import me.him188.ani.app.ui.foundation.layout.AnimatedPane1 import me.him188.ani.app.ui.foundation.navigation.BackHandler import me.him188.ani.app.ui.foundation.widgets.TopAppBarGoBackButton @@ -75,46 +76,48 @@ fun PeerFilterSettingsPage( Scaffold( modifier = modifier.fillMaxSize(), topBar = { - TopAppBar( - title = { - if (inIpBlockListPane) { - if (state.searchingBlockedIp) { - val searchQuery by state.searchBlockedIpQuery.collectAsStateWithLifecycle("") - TextField( - value = searchQuery, - onValueChange = { state.setSearchBlockIpQuery(it) }, - keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), - keyboardActions = KeyboardActions(onDone = { keyboard?.hide() }), - colors = TextFieldDefaults.colors( - unfocusedContainerColor = Color.Transparent, - focusedContainerColor = Color.Transparent, - focusedIndicatorColor = Color.Transparent, - unfocusedIndicatorColor = Color.Transparent - ), - modifier = Modifier.fillMaxSize().focusRequester(focusRequester) - ) - SideEffect { focusRequester.requestFocus() } + WindowDragArea { + TopAppBar( + title = { + if (inIpBlockListPane) { + if (state.searchingBlockedIp) { + val searchQuery by state.searchBlockedIpQuery.collectAsStateWithLifecycle("") + TextField( + value = searchQuery, + onValueChange = { state.setSearchBlockIpQuery(it) }, + keyboardOptions = KeyboardOptions(imeAction = ImeAction.Done), + keyboardActions = KeyboardActions(onDone = { keyboard?.hide() }), + colors = TextFieldDefaults.colors( + unfocusedContainerColor = Color.Transparent, + focusedContainerColor = Color.Transparent, + focusedIndicatorColor = Color.Transparent, + unfocusedIndicatorColor = Color.Transparent, + ), + modifier = Modifier.fillMaxSize().focusRequester(focusRequester), + ) + SideEffect { focusRequester.requestFocus() } + } else { + if (!isDualPane) { + Text("管理 IP 黑名单") + } else { + Text("Peer 过滤和屏蔽设置") + } + } } else { - if (!isDualPane) { - Text("管理 IP 黑名单") - } else { - Text("Peer 过滤和屏蔽设置") - } + Text("Peer 过滤和屏蔽设置") } - } else { - Text("Peer 过滤和屏蔽设置") - } - }, - navigationIcon = { TopAppBarGoBackButton() }, - windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), - actions = { - if (inIpBlockListPane && !state.searchingBlockedIp) { - IconButton({ state.startSearchBlockedIp() }) { - Icon(Icons.Default.Search, contentDescription = "搜索黑名单 IP 地址") + }, + navigationIcon = { TopAppBarGoBackButton() }, + windowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Top), + actions = { + if (inIpBlockListPane && !state.searchingBlockedIp) { + IconButton({ state.startSearchBlockedIp() }) { + Icon(Icons.Default.Search, contentDescription = "搜索黑名单 IP 地址") + } } - } - }, - ) + }, + ) + } }, contentWindowInsets = windowInsets.only(WindowInsetsSides.Horizontal + WindowInsetsSides.Bottom), ) { paddingValues -> From e77f1c9b23d6c1a5337e03c8f4a30c936df58167 Mon Sep 17 00:00:00 2001 From: Nier4ever <20170127nwl@gmail.com> Date: Sat, 21 Sep 2024 19:57:26 +0800 Subject: [PATCH 3/4] optimize something --- .../foundation/interaction/WindowDragArea.android.kt | 2 +- .../kotlin/ui/foundation/interaction/WindowDragArea.kt | 4 ++-- .../kotlin/platform/PlatformWindow.desktop.kt | 2 +- .../kotlin/ui/foundation/PreviewFoundation.desktop.kt | 10 +--------- .../foundation/interaction/WindowDragArea.desktop.kt | 10 ++++++---- .../ui/foundation/interaction/WindowDragArea.ios.kt | 2 +- 6 files changed, 12 insertions(+), 18 deletions(-) diff --git a/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt b/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt index 0639b9a81b..918f57611c 100644 --- a/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt +++ b/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt @@ -12,6 +12,6 @@ package me.him188.ani.app.ui.foundation.interaction import androidx.compose.runtime.Composable @Composable -actual fun WindowDragArea(content: @Composable () -> Unit) { +actual inline fun WindowDragArea(crossinline content: @Composable () -> Unit) { content() } diff --git a/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt b/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt index b6527bcdbc..67c9e0e0b0 100644 --- a/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt +++ b/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt @@ -12,6 +12,6 @@ package me.him188.ani.app.ui.foundation.interaction import androidx.compose.runtime.Composable @Composable -expect fun WindowDragArea( - content: @Composable () -> Unit +expect inline fun WindowDragArea( + crossinline content: @Composable () -> Unit ) diff --git a/app/shared/ui-foundation/src/desktopMain/kotlin/platform/PlatformWindow.desktop.kt b/app/shared/ui-foundation/src/desktopMain/kotlin/platform/PlatformWindow.desktop.kt index 8bf67d8699..3a3612ad71 100644 --- a/app/shared/ui-foundation/src/desktopMain/kotlin/platform/PlatformWindow.desktop.kt +++ b/app/shared/ui-foundation/src/desktopMain/kotlin/platform/PlatformWindow.desktop.kt @@ -8,7 +8,7 @@ import androidx.compose.ui.window.WindowScope actual open class PlatformWindow( val windowHandle: Long, - val windowScope: WindowScope + val windowScope: WindowScope? = null ) { internal var savedWindowState: SavedWindowState? = null diff --git a/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/PreviewFoundation.desktop.kt b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/PreviewFoundation.desktop.kt index 538c3039ed..6c07d47906 100644 --- a/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/PreviewFoundation.desktop.kt +++ b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/PreviewFoundation.desktop.kt @@ -12,10 +12,8 @@ package me.him188.ani.app.ui.foundation import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember -import androidx.compose.ui.awt.ComposeWindow import androidx.compose.ui.unit.DpSize import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.FrameWindowScope import androidx.compose.ui.window.WindowState import me.him188.ani.app.platform.DesktopContext import me.him188.ani.app.platform.ExtraWindowProperties @@ -40,13 +38,7 @@ internal actual inline fun ProvidePlatformCompositionLocalsForPreview(crossinlin ) }, LocalPlatformWindow provides remember { - PlatformWindow( - 0L, - object : FrameWindowScope { - override val window: ComposeWindow - get() = TODO("Not yet implemented") - }, - ) + PlatformWindow(0L) }, ) { content() diff --git a/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt index 090550c042..c62e523e03 100644 --- a/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt +++ b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt @@ -14,9 +14,11 @@ import androidx.compose.runtime.Composable import me.him188.ani.app.ui.foundation.layout.LocalPlatformWindow @Composable -actual fun WindowDragArea(content: @Composable () -> Unit) { +actual inline fun WindowDragArea(crossinline content: @Composable () -> Unit) { val windowScope = LocalPlatformWindow.current.windowScope - windowScope.WindowDraggableArea { - content() - } + windowScope?.run { + WindowDraggableArea { + content() + } + } ?: content() } diff --git a/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt b/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt index 0639b9a81b..918f57611c 100644 --- a/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt +++ b/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt @@ -12,6 +12,6 @@ package me.him188.ani.app.ui.foundation.interaction import androidx.compose.runtime.Composable @Composable -actual fun WindowDragArea(content: @Composable () -> Unit) { +actual inline fun WindowDragArea(crossinline content: @Composable () -> Unit) { content() } From b16caea25f7dfd8de645f82426531c49418a2de8 Mon Sep 17 00:00:00 2001 From: Nier4ever <20170127nwl@gmail.com> Date: Sat, 21 Sep 2024 20:08:25 +0800 Subject: [PATCH 4/4] add modifier --- .../ui/foundation/interaction/WindowDragArea.android.kt | 6 +++++- .../kotlin/ui/foundation/interaction/WindowDragArea.kt | 4 +++- .../ui/foundation/interaction/WindowDragArea.desktop.kt | 8 ++++++-- .../ui/foundation/interaction/WindowDragArea.ios.kt | 6 +++++- 4 files changed, 19 insertions(+), 5 deletions(-) diff --git a/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt b/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt index 918f57611c..c65b725758 100644 --- a/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt +++ b/app/shared/ui-foundation/src/androidMain/kotlin/ui/foundation/interaction/WindowDragArea.android.kt @@ -10,8 +10,12 @@ package me.him188.ani.app.ui.foundation.interaction import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier @Composable -actual inline fun WindowDragArea(crossinline content: @Composable () -> Unit) { +actual inline fun WindowDragArea( + modifier: Modifier, + crossinline content: @Composable () -> Unit +) { content() } diff --git a/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt b/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt index 67c9e0e0b0..4f0d4ca444 100644 --- a/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt +++ b/app/shared/ui-foundation/src/commonMain/kotlin/ui/foundation/interaction/WindowDragArea.kt @@ -10,8 +10,10 @@ package me.him188.ani.app.ui.foundation.interaction import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier @Composable expect inline fun WindowDragArea( - crossinline content: @Composable () -> Unit + modifier: Modifier = Modifier, + crossinline content: @Composable () -> Unit = {} ) diff --git a/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt index c62e523e03..791110a2cd 100644 --- a/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt +++ b/app/shared/ui-foundation/src/desktopMain/kotlin/ui/foundation/interaction/WindowDragArea.desktop.kt @@ -11,13 +11,17 @@ package me.him188.ani.app.ui.foundation.interaction import androidx.compose.foundation.window.WindowDraggableArea import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier import me.him188.ani.app.ui.foundation.layout.LocalPlatformWindow @Composable -actual inline fun WindowDragArea(crossinline content: @Composable () -> Unit) { +actual inline fun WindowDragArea( + modifier: Modifier, + crossinline content: @Composable () -> Unit +) { val windowScope = LocalPlatformWindow.current.windowScope windowScope?.run { - WindowDraggableArea { + WindowDraggableArea(modifier) { content() } } ?: content() diff --git a/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt b/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt index 918f57611c..c65b725758 100644 --- a/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt +++ b/app/shared/ui-foundation/src/iosMain/kotlin/ui/foundation/interaction/WindowDragArea.ios.kt @@ -10,8 +10,12 @@ package me.him188.ani.app.ui.foundation.interaction import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier @Composable -actual inline fun WindowDragArea(crossinline content: @Composable () -> Unit) { +actual inline fun WindowDragArea( + modifier: Modifier, + crossinline content: @Composable () -> Unit +) { content() }