From 04a2e844860a0b88185ac9207b5daae1b99d0ed0 Mon Sep 17 00:00:00 2001 From: AmirHossein Abdolmotallebi Date: Thu, 12 Sep 2024 08:18:58 +0330 Subject: [PATCH 1/3] save categories size --- .../desktop/pages/home/HomeComponent.kt | 23 +++++++++++++-- .../desktop/pages/home/HomePage.kt | 28 ++++++++++--------- .../desktop/pages/home/HomePersistedState.kt | 4 +++ 3 files changed, 40 insertions(+), 15 deletions(-) diff --git a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeComponent.kt b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeComponent.kt index 56e22ab..0cc9068 100644 --- a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeComponent.kt +++ b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeComponent.kt @@ -18,7 +18,9 @@ import com.abdownloadmanager.desktop.utils.action.simpleAction import com.abdownloadmanager.desktop.utils.mvi.ContainsEffects import com.abdownloadmanager.desktop.utils.mvi.supportEffects import androidx.compose.runtime.* +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.DpSize +import androidx.compose.ui.unit.coerceIn import androidx.compose.ui.unit.dp import com.arkivanov.decompose.ComponentContext import ir.amirab.downloader.downloaditem.DownloadCredentials @@ -49,7 +51,7 @@ sealed interface HomeEffects { data object BringToFront : HomeEffects data class DeleteItems( - val list: List + val list: List, ) : HomeEffects } @@ -272,9 +274,22 @@ class HomeComponent( _windowSize.update { dpSize } } + private val _categoriesWidth = homePageStateToPersist.mapTwoWayStateFlow( + map = { + it.categoriesWidth.dp.coerceIn(CATEGORIES_SIZE_RANGE) + }, + unMap = { + copy(categoriesWidth = it.coerceIn(CATEGORIES_SIZE_RANGE).value) + } + ) + val categoriesWidth = _categoriesWidth.asStateFlow() + fun setCategoriesWidth(updater: (Dp) -> Dp) { + _categoriesWidth.value = updater(_categoriesWidth.value) + } + private fun requestDelete( - downloadList: List + downloadList: List, ) { sendEffect(HomeEffects.DeleteItems(downloadList)) } @@ -645,4 +660,8 @@ class HomeComponent( "DELETE" to downloadActions.deleteAction "ctrl I" to downloadActions.openDownloadDialogAction } + + companion object { + val CATEGORIES_SIZE_RANGE = 0.dp..500.dp + } } \ No newline at end of file diff --git a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomePage.kt b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomePage.kt index aa90c91..044cd30 100644 --- a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomePage.kt +++ b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomePage.kt @@ -22,7 +22,6 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import com.abdownloadmanager.desktop.ui.widget.Text import androidx.compose.runtime.* -import com.abdownloadmanager.desktop.utils.externaldraggable.* import com.abdownloadmanager.desktop.utils.externaldraggable.onExternalDrag import androidx.compose.ui.* import androidx.compose.ui.draw.alpha @@ -111,21 +110,24 @@ fun HomePage(component: HomeComponent) { Spacer(Modifier.height(4.dp)) TopBar(component) Spacer(Modifier.height(6.dp)) - Spacer(Modifier.fillMaxWidth() - .height(1.dp) - .background(myColors.surface) + Spacer( + Modifier.fillMaxWidth() + .height(1.dp) + .background(myColors.surface) ) Row() { - var width by remember { mutableStateOf(170.dp) } - Categories(Modifier.padding(top = 8.dp) - .width(width), component + val categoriesWidth by component.categoriesWidth.collectAsState() + Categories( + Modifier.padding(top = 8.dp) + .width(categoriesWidth), component ) Spacer(Modifier.size(8.dp)) //split pane - Handle(Modifier.width(5.dp) - .fillMaxHeight() - ) { - width += it + Handle( + Modifier.width(5.dp) + .fillMaxHeight() + ) { delta -> + component.setCategoriesWidth { it + delta } } Column(Modifier.weight(1f)) { Row( @@ -262,7 +264,7 @@ private fun ShowDeletePrompts( ActionButton( text = "Delete", onClick = onConfirm, - borderColor = SolidColor(myColors.error ), + borderColor = SolidColor(myColors.error), contentColor = myColors.error, ) Spacer(Modifier.width(8.dp)) @@ -274,7 +276,7 @@ private fun ShowDeletePrompts( @Stable class DeletePromptState( - val downloadList: List + val downloadList: List, ) { var alsoDeleteFile by mutableStateOf(false) } diff --git a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomePersistedState.kt b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomePersistedState.kt index 4f38563..71c282f 100644 --- a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomePersistedState.kt +++ b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomePersistedState.kt @@ -17,6 +17,7 @@ import org.koin.core.component.inject data class HomePageStateToPersist( val downloadListState: TableState.SerializableTableState? = null, val windowSize: Pair = 1000f to 500f, + val categoriesWidth: Float = 170f, ) { class ConfigLens(prefix: String) : Lens, KoinComponent { @@ -25,6 +26,7 @@ data class HomePageStateToPersist( class Keys(prefix: String) { val windowWidth = floatKeyOf("${prefix}window.width") val windowHeight = floatKeyOf("${prefix}window.height") + val categoriesWidth = floatKeyOf("${prefix}categories.width") val downloadListTableState = keyOfEncoded("${prefix}downloadListState") } @@ -34,6 +36,7 @@ data class HomePageStateToPersist( return with(json) { HomePageStateToPersist( downloadListState = source.getDecoded(keys.downloadListTableState), + categoriesWidth = source.get(keys.categoriesWidth) ?: default.categoriesWidth, windowSize = run { val width = source.get(keys.windowWidth) val height = source.get(keys.windowHeight) @@ -51,6 +54,7 @@ data class HomePageStateToPersist( with(json) { source.put(keys.windowWidth, focus.windowSize.first) source.put(keys.windowHeight, focus.windowSize.second) + source.put(keys.categoriesWidth, focus.categoriesWidth) source.putEncodedNullable(keys.downloadListTableState, focus.downloadListState) } return source From c24f27229053da3f5028a9134271755f3ba722d6 Mon Sep 17 00:00:00 2001 From: AmirHossein Abdolmotallebi Date: Thu, 12 Sep 2024 08:43:22 +0330 Subject: [PATCH 2/3] ignore saving home page screen size when its maximized --- .../com/abdownloadmanager/desktop/pages/home/HomeWindow.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeWindow.kt b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeWindow.kt index 4155b02..dd948ca 100644 --- a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeWindow.kt +++ b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeWindow.kt @@ -3,6 +3,7 @@ package com.abdownloadmanager.desktop.pages.home import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.runtime.* import androidx.compose.ui.Alignment +import androidx.compose.ui.window.WindowPlacement import androidx.compose.ui.window.WindowPosition import androidx.compose.ui.window.rememberWindowState import com.abdownloadmanager.desktop.actions.LocalShortCutManager @@ -43,7 +44,9 @@ fun HomeWindow( } ) { LaunchedEffect(windowState.size) { - homeComponent.setWindowSize(windowState.size) + if (!windowState.isMinimized && windowState.placement == WindowPlacement.Floating) { + homeComponent.setWindowSize(windowState.size) + } } window.minimumSize = Dimension( 400, 400 From 372ee77f302fed755fe582f5b371e90ba4e3dbcc Mon Sep 17 00:00:00 2001 From: AmirHossein Abdolmotallebi Date: Thu, 12 Sep 2024 08:47:26 +0330 Subject: [PATCH 3/3] refactor home page: don't use update function for window size --- .../com/abdownloadmanager/desktop/pages/home/HomeComponent.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeComponent.kt b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeComponent.kt index 0cc9068..32157d4 100644 --- a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeComponent.kt +++ b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/pages/home/HomeComponent.kt @@ -271,7 +271,7 @@ class HomeComponent( ) val windowSize = _windowSize.asStateFlow() fun setWindowSize(dpSize: DpSize) { - _windowSize.update { dpSize } + _windowSize.value = dpSize } private val _categoriesWidth = homePageStateToPersist.mapTwoWayStateFlow(