From 41ff6a57b8306d7eac91c6e19dfd67e51cf4084b Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Thu, 24 Feb 2022 23:07:28 +0100 Subject: [PATCH] Improved display of branches' names in branch context menu --- .../kotlin/app/extensions/RefExtensions.kt | 5 +++ src/main/kotlin/app/ui/Branches.kt | 20 ++++++------ .../app/ui/context_menu/BranchContextMenu.kt | 32 +++++++++++-------- src/main/kotlin/app/ui/log/Log.kt | 6 ++-- .../app/viewmodels/BranchesViewModel.kt | 8 ++--- 5 files changed, 41 insertions(+), 30 deletions(-) diff --git a/src/main/kotlin/app/extensions/RefExtensions.kt b/src/main/kotlin/app/extensions/RefExtensions.kt index d8e6b68..403f021 100644 --- a/src/main/kotlin/app/extensions/RefExtensions.kt +++ b/src/main/kotlin/app/extensions/RefExtensions.kt @@ -60,6 +60,11 @@ val Ref.isBranch: Boolean return this is ObjectIdRef.PeeledNonTag } +val Ref.isHead: Boolean + get() { + return this.name == Constants.HEAD + } + val Ref.isTag: Boolean get() = this.name.startsWith(Constants.R_TAGS) diff --git a/src/main/kotlin/app/ui/Branches.kt b/src/main/kotlin/app/ui/Branches.kt index 74a2e55..36a2650 100644 --- a/src/main/kotlin/app/ui/Branches.kt +++ b/src/main/kotlin/app/ui/Branches.kt @@ -25,7 +25,9 @@ fun Branches( branchesViewModel: BranchesViewModel, ) { val branches by branchesViewModel.branches.collectAsState() - val currentBranch by branchesViewModel.currentBranch.collectAsState() + val currentBranchState = branchesViewModel.currentBranch.collectAsState() + val currentBranch = currentBranchState.value + val (mergeBranch, setMergeBranch) = remember { mutableStateOf(null) } val (rebaseBranch, setRebaseBranch) = remember { mutableStateOf(null) } @@ -36,8 +38,8 @@ fun Branches( itemContent = { branch -> BranchLineEntry( branch = branch, - currentBranchName = currentBranch, - isCurrentBranch = currentBranch == branch.name, + currentBranch = currentBranch, + isCurrentBranch = currentBranch?.name == branch.name, onBranchClicked = { branchesViewModel.selectBranch(branch) }, onCheckoutBranch = { branchesViewModel.checkoutRef(branch) }, onMergeBranch = { setMergeBranch(branch) }, @@ -49,18 +51,18 @@ fun Branches( } ) - if (mergeBranch != null) { + if (mergeBranch != null && currentBranch != null) { MergeDialog( - currentBranch, + currentBranchName = currentBranch.simpleName, mergeBranchName = mergeBranch.name, onReject = { setMergeBranch(null) }, onAccept = { ff -> branchesViewModel.mergeBranch(mergeBranch, ff) } ) } - if (rebaseBranch != null) { + if (rebaseBranch != null && currentBranch != null) { RebaseDialog( - currentBranch, + currentBranchName = currentBranch.simpleName, rebaseBranchName = rebaseBranch.name, onReject = { setRebaseBranch(null) }, onAccept = { branchesViewModel.rebaseBranch(rebaseBranch) } @@ -72,7 +74,7 @@ fun Branches( @Composable private fun BranchLineEntry( branch: Ref, - currentBranchName: String, + currentBranch: Ref?, isCurrentBranch: Boolean, onBranchClicked: () -> Unit, onCheckoutBranch: () -> Unit, @@ -86,7 +88,7 @@ private fun BranchLineEntry( items = { branchContextMenuItems( branch = branch, - currentBranchName = currentBranchName, + currentBranch = currentBranch, isCurrentBranch = isCurrentBranch, isLocal = branch.isLocal, onCheckoutBranch = onCheckoutBranch, diff --git a/src/main/kotlin/app/ui/context_menu/BranchContextMenu.kt b/src/main/kotlin/app/ui/context_menu/BranchContextMenu.kt index 1ff8851..c56325a 100644 --- a/src/main/kotlin/app/ui/context_menu/BranchContextMenu.kt +++ b/src/main/kotlin/app/ui/context_menu/BranchContextMenu.kt @@ -2,6 +2,8 @@ package app.ui.context_menu import androidx.compose.foundation.ContextMenuItem import androidx.compose.foundation.ExperimentalFoundationApi +import app.extensions.isBranch +import app.extensions.isHead import app.extensions.simpleLogName import org.eclipse.jgit.lib.Ref @@ -9,7 +11,7 @@ import org.eclipse.jgit.lib.Ref fun branchContextMenuItems( branch: Ref, isCurrentBranch: Boolean, - currentBranchName: String, + currentBranch: Ref?, isLocal: Boolean, onCheckoutBranch: () -> Unit, onMergeBranch: () -> Unit, @@ -26,18 +28,20 @@ fun branchContextMenuItems( onClick = onCheckoutBranch ) ) - add( - ContextMenuItem( - label = "Merge branch", - onClick = onMergeBranch + if(currentBranch != null && !currentBranch.isHead) { + add( + ContextMenuItem( + label = "Merge branch", + onClick = onMergeBranch + ) ) - ) - add( - ContextMenuItem( - label = "Rebase branch", - onClick = onRebaseBranch + add( + ContextMenuItem( + label = "Rebase branch", + onClick = onRebaseBranch + ) ) - ) + } } if (isLocal && !isCurrentBranch) { add( @@ -47,16 +51,16 @@ fun branchContextMenuItems( ) ) } - if (!isLocal) { + if (!isLocal && currentBranch != null && !currentBranch.isHead) { add( ContextMenuItem( - label = "Push $currentBranchName to ${branch.simpleLogName}", + label = "Push ${currentBranch.simpleLogName} to ${branch.simpleLogName}", onClick = onPushToRemoteBranch ) ) add( ContextMenuItem( - label = "Pull ${branch.simpleLogName} to $currentBranchName", + label = "Pull ${branch.simpleLogName} to ${currentBranch.simpleLogName}", onClick = onPullFromRemoteBranch ) ) diff --git a/src/main/kotlin/app/ui/log/Log.kt b/src/main/kotlin/app/ui/log/Log.kt index 90a5a5a..aefd244 100644 --- a/src/main/kotlin/app/ui/log/Log.kt +++ b/src/main/kotlin/app/ui/log/Log.kt @@ -636,7 +636,7 @@ fun CommitMessage( BranchChip( ref = ref, color = nodeColor, - currentBranch = currentBranch?.name.orEmpty(), + currentBranch = currentBranch, isCurrentBranch = ref.isSameBranch(currentBranch), onCheckoutBranch = { onCheckoutRef(ref) }, onMergeBranch = { onMergeBranch(ref) }, @@ -825,7 +825,7 @@ fun BranchChip( modifier: Modifier = Modifier, isCurrentBranch: Boolean = false, ref: Ref, - currentBranch: String, + currentBranch: Ref?, onCheckoutBranch: () -> Unit, onMergeBranch: () -> Unit, onDeleteBranch: () -> Unit, @@ -837,7 +837,7 @@ fun BranchChip( val contextMenuItemsList = { branchContextMenuItems( branch = ref, - currentBranchName = currentBranch, + currentBranch = currentBranch, isCurrentBranch = isCurrentBranch, isLocal = ref.isLocal, onCheckoutBranch = onCheckoutBranch, diff --git a/src/main/kotlin/app/viewmodels/BranchesViewModel.kt b/src/main/kotlin/app/viewmodels/BranchesViewModel.kt index 33708dd..8ae7576 100644 --- a/src/main/kotlin/app/viewmodels/BranchesViewModel.kt +++ b/src/main/kotlin/app/viewmodels/BranchesViewModel.kt @@ -18,17 +18,17 @@ class BranchesViewModel @Inject constructor( val branches: StateFlow> get() = _branches - private val _currentBranch = MutableStateFlow("") - val currentBranch: StateFlow + private val _currentBranch = MutableStateFlow(null) + val currentBranch: StateFlow get() = _currentBranch suspend fun loadBranches(git: Git) { - _currentBranch.value = branchesManager.currentBranchRef(git)?.name ?: "" + _currentBranch.value = branchesManager.currentBranchRef(git) val branchesList = branchesManager.getBranches(git) // set selected branch as the first one always - val selectedBranch = branchesList.find { it.name == _currentBranch.value } + val selectedBranch = branchesList.find { it.name == _currentBranch.value?.name } if (selectedBranch != null) { branchesList.remove(selectedBranch) branchesList.add(0, selectedBranch)