From 855b57196d8926ec82c99e0c0a418cc77eae2a82 Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Fri, 8 Apr 2022 22:05:48 +0200 Subject: [PATCH] Side menu items expand state is now stored in the viewModels to restore it's value after changing tabs --- src/main/kotlin/app/ui/Branches.kt | 3 +++ src/main/kotlin/app/ui/Remotes.kt | 5 ++++- src/main/kotlin/app/ui/Stashes.kt | 4 ++++ src/main/kotlin/app/ui/Tags.kt | 4 ++++ src/main/kotlin/app/ui/components/Expandable.kt | 15 --------------- .../kotlin/app/ui/components/SideMenuPanel.kt | 4 ++++ .../kotlin/app/viewmodels/BranchesViewModel.kt | 2 +- .../kotlin/app/viewmodels/ExpandableViewModel.kt | 13 +++++++++++++ .../kotlin/app/viewmodels/RemotesViewModel.kt | 2 +- .../kotlin/app/viewmodels/StashesViewModel.kt | 2 +- src/main/kotlin/app/viewmodels/TagsViewModel.kt | 2 +- 11 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 src/main/kotlin/app/viewmodels/ExpandableViewModel.kt diff --git a/src/main/kotlin/app/ui/Branches.kt b/src/main/kotlin/app/ui/Branches.kt index 36a2650..f8533e5 100644 --- a/src/main/kotlin/app/ui/Branches.kt +++ b/src/main/kotlin/app/ui/Branches.kt @@ -26,6 +26,7 @@ fun Branches( ) { val branches by branchesViewModel.branches.collectAsState() val currentBranchState = branchesViewModel.currentBranch.collectAsState() + val isExpanded by branchesViewModel.isExpanded.collectAsState() val currentBranch = currentBranchState.value val (mergeBranch, setMergeBranch) = remember { mutableStateOf(null) } @@ -35,6 +36,8 @@ fun Branches( title = "Local branches", icon = painterResource("branch.svg"), items = branches, + isExpanded = isExpanded, + onExpand = { branchesViewModel.onExpand() }, itemContent = { branch -> BranchLineEntry( branch = branch, diff --git a/src/main/kotlin/app/ui/Remotes.kt b/src/main/kotlin/app/ui/Remotes.kt index 7f537d8..e78fcf0 100644 --- a/src/main/kotlin/app/ui/Remotes.kt +++ b/src/main/kotlin/app/ui/Remotes.kt @@ -33,6 +33,7 @@ fun Remotes( ) { val remotes by remotesViewModel.remotes.collectAsState() var showEditRemotesDialog by remember { mutableStateOf(false) } + val isExpanded by remotesViewModel.isExpanded.collectAsState() val itemsCount = remember(remotes) { val allBranches = remotes.filter { remoteView -> @@ -58,6 +59,8 @@ fun Remotes( icon = painterResource("cloud.svg"), items = remotes, itemsCountForMaxHeight = itemsCount, + isExpanded = isExpanded, + onExpand = { remotesViewModel.onExpand() }, contextItems = { remoteContextMenu { showEditRemotesDialog = true } }, @@ -84,7 +87,7 @@ fun Remotes( onDeleteBranch = { branch -> remotesViewModel.deleteRemoteBranch(branch) }, onRemoteClicked = { remotesViewModel.onRemoteClicked(remoteInfo) } ) - } + }, ) } diff --git a/src/main/kotlin/app/ui/Stashes.kt b/src/main/kotlin/app/ui/Stashes.kt index 32cd066..3019e70 100644 --- a/src/main/kotlin/app/ui/Stashes.kt +++ b/src/main/kotlin/app/ui/Stashes.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.ContextMenuItem import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.res.painterResource import app.ui.components.SideMenuPanel import app.ui.components.SideMenuSubentry @@ -21,6 +22,7 @@ fun Stashes( ) { val stashStatusState = stashesViewModel.stashStatus.collectAsState() val stashStatus = stashStatusState.value + val isExpanded by stashesViewModel.isExpanded.collectAsState() val stashList = if (stashStatus is StashStatus.Loaded) stashStatus.stashes @@ -31,6 +33,8 @@ fun Stashes( title = "Stashes", icon = painterResource("stash.svg"), items = stashList, + isExpanded = isExpanded, + onExpand = { stashesViewModel.onExpand() }, itemContent = { stash -> StashRow( stash = stash, diff --git a/src/main/kotlin/app/ui/Tags.kt b/src/main/kotlin/app/ui/Tags.kt index 0c128bf..1fb23a8 100644 --- a/src/main/kotlin/app/ui/Tags.kt +++ b/src/main/kotlin/app/ui/Tags.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.ContextMenuArea import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.runtime.Composable import androidx.compose.runtime.collectAsState +import androidx.compose.runtime.getValue import androidx.compose.ui.res.painterResource import app.extensions.simpleName import app.ui.components.SideMenuPanel @@ -19,11 +20,14 @@ fun Tags( ) { val tagsState = tagsViewModel.tags.collectAsState() val tags = tagsState.value + val isExpanded by tagsViewModel.isExpanded.collectAsState() SideMenuPanel( title = "Tags", items = tags, icon = painterResource("tag.svg"), + isExpanded = isExpanded, + onExpand = { tagsViewModel.onExpand() }, itemContent = { tag -> TagRow( tag = tag, diff --git a/src/main/kotlin/app/ui/components/Expandable.kt b/src/main/kotlin/app/ui/components/Expandable.kt index 56e6d46..95221b0 100644 --- a/src/main/kotlin/app/ui/components/Expandable.kt +++ b/src/main/kotlin/app/ui/components/Expandable.kt @@ -10,21 +10,6 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -@OptIn(ExperimentalAnimationApi::class) -@Composable -fun VerticalExpandable( - isExpanded: MutableState = remember { mutableStateOf(true) }, - header: @Composable () -> Unit, - child: @Composable () -> Unit, -) { - VerticalExpandable( - isExpanded = isExpanded.value, - onExpand = { isExpanded.value = !isExpanded.value }, - header = header, - child = child, - ) -} - @OptIn(ExperimentalAnimationApi::class) @Composable fun VerticalExpandable( diff --git a/src/main/kotlin/app/ui/components/SideMenuPanel.kt b/src/main/kotlin/app/ui/components/SideMenuPanel.kt index 060bc65..9ecfc76 100644 --- a/src/main/kotlin/app/ui/components/SideMenuPanel.kt +++ b/src/main/kotlin/app/ui/components/SideMenuPanel.kt @@ -21,6 +21,8 @@ fun SideMenuPanel( title: String, icon: Painter? = null, items: List, + isExpanded: Boolean = false, + onExpand: () -> Unit, itemsCountForMaxHeight: Int = items.count(), itemContent: @Composable (T) -> Unit, headerHoverIcon: @Composable (() -> Unit)? = null, @@ -29,6 +31,8 @@ fun SideMenuPanel( val maxHeight = remember(items) { maxSidePanelHeight(itemsCountForMaxHeight) } VerticalExpandable( + isExpanded = isExpanded, + onExpand = onExpand, header = { ContextMenuArea( items = contextItems diff --git a/src/main/kotlin/app/viewmodels/BranchesViewModel.kt b/src/main/kotlin/app/viewmodels/BranchesViewModel.kt index 8ae7576..ed018ff 100644 --- a/src/main/kotlin/app/viewmodels/BranchesViewModel.kt +++ b/src/main/kotlin/app/viewmodels/BranchesViewModel.kt @@ -13,7 +13,7 @@ class BranchesViewModel @Inject constructor( private val mergeManager: MergeManager, private val remoteOperationsManager: RemoteOperationsManager, private val tabState: TabState, -) { +) : ExpandableViewModel() { private val _branches = MutableStateFlow>(listOf()) val branches: StateFlow> get() = _branches diff --git a/src/main/kotlin/app/viewmodels/ExpandableViewModel.kt b/src/main/kotlin/app/viewmodels/ExpandableViewModel.kt new file mode 100644 index 0000000..3adaf80 --- /dev/null +++ b/src/main/kotlin/app/viewmodels/ExpandableViewModel.kt @@ -0,0 +1,13 @@ +package app.viewmodels + +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow + +abstract class ExpandableViewModel { + private val _isExpanded = MutableStateFlow(true) + val isExpanded: StateFlow = _isExpanded + + fun onExpand() { + _isExpanded.value = !isExpanded.value + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/viewmodels/RemotesViewModel.kt b/src/main/kotlin/app/viewmodels/RemotesViewModel.kt index d7f428b..8f04223 100644 --- a/src/main/kotlin/app/viewmodels/RemotesViewModel.kt +++ b/src/main/kotlin/app/viewmodels/RemotesViewModel.kt @@ -17,7 +17,7 @@ class RemotesViewModel @Inject constructor( private val remoteOperationsManager: RemoteOperationsManager, private val branchesManager: BranchesManager, private val tabState: TabState, -) { +) : ExpandableViewModel() { private val _remotes = MutableStateFlow>(listOf()) val remotes: StateFlow> get() = _remotes diff --git a/src/main/kotlin/app/viewmodels/StashesViewModel.kt b/src/main/kotlin/app/viewmodels/StashesViewModel.kt index a35de80..b268bf2 100644 --- a/src/main/kotlin/app/viewmodels/StashesViewModel.kt +++ b/src/main/kotlin/app/viewmodels/StashesViewModel.kt @@ -13,7 +13,7 @@ import javax.inject.Inject class StashesViewModel @Inject constructor( private val stashManager: StashManager, private val tabState: TabState, -) { +) : ExpandableViewModel() { private val _stashStatus = MutableStateFlow(StashStatus.Loaded(listOf())) val stashStatus: StateFlow get() = _stashStatus diff --git a/src/main/kotlin/app/viewmodels/TagsViewModel.kt b/src/main/kotlin/app/viewmodels/TagsViewModel.kt index 3e676ab..3bcc701 100644 --- a/src/main/kotlin/app/viewmodels/TagsViewModel.kt +++ b/src/main/kotlin/app/viewmodels/TagsViewModel.kt @@ -16,7 +16,7 @@ class TagsViewModel @Inject constructor( private val tabState: TabState, private val branchesManager: BranchesManager, private val tagsManager: TagsManager, -) { +) : ExpandableViewModel() { private val _tags = MutableStateFlow>(listOf()) val tags: StateFlow> get() = _tags