From 6599f2f8619e17fcb7d06d7e455bf431c2d5d92e Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Sun, 26 Jun 2022 18:46:48 +0200 Subject: [PATCH] Side panel now is a single big list with local branches and stashes expanded by default --- src/main/kotlin/app/ui/Remotes.kt | 11 ----- src/main/kotlin/app/ui/RepositoryOpen.kt | 6 +-- .../app/ui/components/ScrollableColumn.kt | 43 +++++++++++++++++++ .../kotlin/app/ui/components/SideMenuPanel.kt | 9 ++-- .../app/viewmodels/BranchesViewModel.kt | 2 +- .../app/viewmodels/ExpandableViewModel.kt | 4 +- .../kotlin/app/viewmodels/StashesViewModel.kt | 2 +- 7 files changed, 52 insertions(+), 25 deletions(-) create mode 100644 src/main/kotlin/app/ui/components/ScrollableColumn.kt diff --git a/src/main/kotlin/app/ui/Remotes.kt b/src/main/kotlin/app/ui/Remotes.kt index 96f8d34..f20bd68 100644 --- a/src/main/kotlin/app/ui/Remotes.kt +++ b/src/main/kotlin/app/ui/Remotes.kt @@ -38,16 +38,6 @@ fun Remotes( var showEditRemotesDialog by remember { mutableStateOf(false) } val isExpanded by remotesViewModel.isExpanded.collectAsState() - val itemsCount = remember(remotes) { - val allBranches = remotes.filter { remoteView -> - remoteView.isExpanded // Only include in the branches count the nodes expanded - }.map { remoteView -> - remoteView.remoteInfo.branchesList - }.flatten() - - allBranches.count() + remotes.count() - } - if (showEditRemotesDialog) { EditRemotesDialog( remotesViewModel = remotesViewModel, @@ -61,7 +51,6 @@ fun Remotes( title = "Remotes", icon = painterResource("cloud.svg"), items = remotes, - itemsCountForMaxHeight = itemsCount, isExpanded = isExpanded, onExpand = { remotesViewModel.onExpand() }, contextItems = { diff --git a/src/main/kotlin/app/ui/RepositoryOpen.kt b/src/main/kotlin/app/ui/RepositoryOpen.kt index 0de5055..0140f1c 100644 --- a/src/main/kotlin/app/ui/RepositoryOpen.kt +++ b/src/main/kotlin/app/ui/RepositoryOpen.kt @@ -17,6 +17,7 @@ import androidx.compose.ui.unit.sp import app.extensions.handMouseClickable import app.git.DiffEntryType import app.theme.* +import app.ui.components.ScrollableColumn import app.ui.dialogs.AuthorDialog import app.ui.dialogs.NewBranchDialog import app.ui.dialogs.StashWithMessageDialog @@ -176,10 +177,7 @@ fun MainContentView( Row { HorizontalSplitPane { first(minSize = 250.dp) { - Column( - modifier = Modifier - .fillMaxHeight() - ) { + ScrollableColumn(modifier = Modifier.fillMaxHeight( )) { Branches( branchesViewModel = tabViewModel.branchesViewModel, ) diff --git a/src/main/kotlin/app/ui/components/ScrollableColumn.kt b/src/main/kotlin/app/ui/components/ScrollableColumn.kt new file mode 100644 index 0000000..d236e68 --- /dev/null +++ b/src/main/kotlin/app/ui/components/ScrollableColumn.kt @@ -0,0 +1,43 @@ +package app.ui.components + +import androidx.compose.foundation.* +import androidx.compose.foundation.layout.* +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import app.theme.scrollbarHover +import app.theme.scrollbarNormal + +@Composable +fun ScrollableColumn( + modifier: Modifier, + state: ScrollState = rememberScrollState(0), + content: @Composable ColumnScope.() -> Unit +) { + + Box( + modifier = modifier, + ) { + Column( + content = content, + modifier = Modifier + .verticalScroll(state) + ) + + VerticalScrollbar( + modifier = Modifier + .align(Alignment.CenterEnd) + .fillMaxHeight() + .padding(end = 2.dp), + style = LocalScrollbarStyle.current.copy( + unhoverColor = MaterialTheme.colors.scrollbarNormal, + hoverColor = MaterialTheme.colors.scrollbarHover, + ), + adapter = rememberScrollbarAdapter( + scrollState = state + ), + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/ui/components/SideMenuPanel.kt b/src/main/kotlin/app/ui/components/SideMenuPanel.kt index 9ecfc76..eaf7178 100644 --- a/src/main/kotlin/app/ui/components/SideMenuPanel.kt +++ b/src/main/kotlin/app/ui/components/SideMenuPanel.kt @@ -4,6 +4,7 @@ import androidx.compose.foundation.ContextMenuArea import androidx.compose.foundation.ContextMenuItem import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.lazy.items @@ -23,13 +24,10 @@ fun SideMenuPanel( items: List, isExpanded: Boolean = false, onExpand: () -> Unit, - itemsCountForMaxHeight: Int = items.count(), itemContent: @Composable (T) -> Unit, headerHoverIcon: @Composable (() -> Unit)? = null, contextItems: () -> List = { emptyList() }, ) { - val maxHeight = remember(items) { maxSidePanelHeight(itemsCountForMaxHeight) } - VerticalExpandable( isExpanded = isExpanded, onExpand = onExpand, @@ -46,13 +44,12 @@ fun SideMenuPanel( } }, ) { - ScrollableLazyColumn( + Column( modifier = Modifier .fillMaxWidth() - .heightIn(max = maxHeight.dp) .background(MaterialTheme.colors.background) ) { - items(items) { item -> + for (item in items) { itemContent(item) } } diff --git a/src/main/kotlin/app/viewmodels/BranchesViewModel.kt b/src/main/kotlin/app/viewmodels/BranchesViewModel.kt index 288452f..6ee4960 100644 --- a/src/main/kotlin/app/viewmodels/BranchesViewModel.kt +++ b/src/main/kotlin/app/viewmodels/BranchesViewModel.kt @@ -15,7 +15,7 @@ class BranchesViewModel @Inject constructor( private val remoteOperationsManager: RemoteOperationsManager, private val tabState: TabState, private val appPreferences: AppPreferences, -) : ExpandableViewModel() { +) : ExpandableViewModel(true) { 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 index 3adaf80..042d1d0 100644 --- a/src/main/kotlin/app/viewmodels/ExpandableViewModel.kt +++ b/src/main/kotlin/app/viewmodels/ExpandableViewModel.kt @@ -3,8 +3,8 @@ package app.viewmodels import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow -abstract class ExpandableViewModel { - private val _isExpanded = MutableStateFlow(true) +abstract class ExpandableViewModel(expandedDefault: Boolean = false) { + private val _isExpanded = MutableStateFlow(expandedDefault) val isExpanded: StateFlow = _isExpanded fun onExpand() { diff --git a/src/main/kotlin/app/viewmodels/StashesViewModel.kt b/src/main/kotlin/app/viewmodels/StashesViewModel.kt index b268bf2..069fa26 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() { +) : ExpandableViewModel(true) { private val _stashStatus = MutableStateFlow(StashStatus.Loaded(listOf())) val stashStatus: StateFlow get() = _stashStatus