Selecting a branch, tag or stash in side panel highlights it

This commit is contained in:
Abdelilah El Aissaoui 2023-11-11 16:42:28 +01:00
parent 81c37043ca
commit fbdf5a4da8
No known key found for this signature in database
GPG Key ID: 7587FC860F594869
9 changed files with 48 additions and 25 deletions

View File

@ -11,6 +11,7 @@ import kotlinx.coroutines.*
import kotlinx.coroutines.flow.*
import org.eclipse.jgit.api.Git
import org.eclipse.jgit.lib.ObjectId
import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.revwalk.RevCommit
import javax.inject.Inject
@ -242,7 +243,7 @@ class TabState @Inject constructor(
}
suspend fun newSelectedStash(stash: RevCommit) {
newSelectedItem(SelectedItem.Stash(stash))
newSelectedItem(SelectedItem.Stash(stash), true)
}
suspend fun noneSelected() {
@ -260,7 +261,7 @@ class TabState @Inject constructor(
}
}
fun newSelectedRef(objectId: ObjectId?) = runOperation(
fun newSelectedRef(ref: Ref, objectId: ObjectId?) = runOperation(
refreshType = RefreshType.NONE,
) { git ->
if (objectId == null) {
@ -271,7 +272,7 @@ class TabState @Inject constructor(
if (commit == null) {
newSelectedItem(SelectedItem.None)
} else {
val newSelectedItem = SelectedItem.Ref(commit)
val newSelectedItem = SelectedItem.Ref(ref, commit)
newSelectedItem(newSelectedItem)
_taskEvent.emit(TaskEvent.ScrollToGraphItem(newSelectedItem))
}

View File

@ -20,6 +20,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import com.jetpackduba.gitnuro.AppIcons
import com.jetpackduba.gitnuro.extensions.backgroundIf
import com.jetpackduba.gitnuro.theme.backgroundSelected
import com.jetpackduba.gitnuro.theme.onBackgroundSecondary
import com.jetpackduba.gitnuro.ui.components.AdjustableOutlinedTextField
@ -179,13 +180,7 @@ fun RebaseCommit(
.clickable {
onFocusLine()
}
.run {
if (isSelected) {
background(MaterialTheme.colors.backgroundSelected)
} else {
this
}
}
.backgroundIf(isSelected, MaterialTheme.colors.backgroundSelected)
.padding(horizontal = 16.dp, vertical = 8.dp),
verticalAlignment = Alignment.CenterVertically,
) {

View File

@ -30,6 +30,7 @@ import com.jetpackduba.gitnuro.ui.diff.Diff
import com.jetpackduba.gitnuro.ui.log.Log
import com.jetpackduba.gitnuro.viewmodels.BlameState
import com.jetpackduba.gitnuro.viewmodels.TabViewModel
import org.eclipse.jgit.lib.Ref
import org.eclipse.jgit.lib.RepositoryState
import org.eclipse.jgit.revwalk.RevCommit
import org.jetbrains.compose.splitpane.ExperimentalSplitPaneApi
@ -413,7 +414,7 @@ sealed class SelectedItem {
object None : SelectedItem()
object UncommitedChanges : SelectedItem()
sealed class CommitBasedItem(val revCommit: RevCommit) : SelectedItem()
class Ref(revCommit: RevCommit) : CommitBasedItem(revCommit)
class Ref(val ref: org.eclipse.jgit.lib.Ref, revCommit: RevCommit) : CommitBasedItem(revCommit)
class Commit(revCommit: RevCommit) : CommitBasedItem(revCommit)
class Stash(revCommit: RevCommit) : CommitBasedItem(revCommit)
}

View File

@ -37,6 +37,7 @@ fun SidePanel(
submodulesViewModel: SubmodulesViewModel = sidePanelViewModel.submodulesViewModel,
) {
var filter by remember(sidePanelViewModel) { mutableStateOf(sidePanelViewModel.filter.value) }
val selectedItem by sidePanelViewModel.selectedItem.collectAsState()
val branchesState by branchesViewModel.branchesState.collectAsState()
val remotesState by remotesViewModel.remoteState.collectAsState()
@ -66,6 +67,7 @@ fun SidePanel(
) {
localBranches(
branchesState = branchesState,
selectedItem = selectedItem,
branchesViewModel = branchesViewModel,
onChangeDefaultUpstreamBranch = { setBranchToChangeUpstream(it) }
)
@ -78,11 +80,13 @@ fun SidePanel(
tags(
tagsState = tagsState,
selectedItem = selectedItem,
tagsViewModel = tagsViewModel,
)
stashes(
stashesState = stashesState,
selectedItem = selectedItem,
stashesViewModel = stashesViewModel,
)
@ -165,6 +169,7 @@ fun FilterTextField(value: String, onValueChange: (String) -> Unit, modifier: Mo
fun LazyListScope.localBranches(
branchesState: BranchesState,
selectedItem: SelectedItem,
branchesViewModel: BranchesViewModel,
onChangeDefaultUpstreamBranch: (Ref) -> Unit,
) {
@ -191,18 +196,17 @@ fun LazyListScope.localBranches(
items(branches, key = { it.name }) { branch ->
Branch(
branch = branch,
isSelectedItem = selectedItem is SelectedItem.Ref && selectedItem.ref == branch,
currentBranch = currentBranch,
isCurrentBranch = currentBranch?.name == branch.name,
onBranchClicked = { branchesViewModel.selectBranch(branch) },
onBranchDoubleClicked = { branchesViewModel.checkoutRef(branch) },
onCheckoutBranch = { branchesViewModel.checkoutRef(branch) },
onMergeBranch = { branchesViewModel.mergeBranch(branch) },
onDeleteBranch = { branchesViewModel.deleteBranch(branch) },
onRebaseBranch = { branchesViewModel.rebaseBranch(branch) },
onDeleteBranch = { branchesViewModel.deleteBranch(branch) },
onPushToRemoteBranch = { branchesViewModel.pushToRemoteBranch(branch) },
onPullFromRemoteBranch = { branchesViewModel.pullFromRemoteBranch(branch) },
onChangeDefaultUpstreamBranch = { onChangeDefaultUpstreamBranch(branch) }
)
onPullFromRemoteBranch = { branchesViewModel.pullFromRemoteBranch(branch) }
) { onChangeDefaultUpstreamBranch(branch) }
}
}
}
@ -272,6 +276,7 @@ fun LazyListScope.remotes(
fun LazyListScope.tags(
tagsState: TagsState,
tagsViewModel: TagsViewModel,
selectedItem: SelectedItem,
) {
val isExpanded = tagsState.isExpanded
val tags = tagsState.tags
@ -295,6 +300,7 @@ fun LazyListScope.tags(
items(tags, key = { it.name }) { tag ->
Tag(
tag,
isSelected = selectedItem is SelectedItem.Ref && selectedItem.ref == tag,
onTagClicked = { tagsViewModel.selectTag(tag) },
onCheckoutTag = { tagsViewModel.checkoutRef(tag) },
onDeleteTag = { tagsViewModel.deleteTag(tag) }
@ -306,6 +312,7 @@ fun LazyListScope.tags(
fun LazyListScope.stashes(
stashesState: StashesState,
stashesViewModel: StashesViewModel,
selectedItem: SelectedItem,
) {
val isExpanded = stashesState.isExpanded
val stashes = stashesState.stashes
@ -329,6 +336,7 @@ fun LazyListScope.stashes(
items(stashes, key = { it.name }) { stash ->
Stash(
stash,
isSelected = selectedItem is SelectedItem.Stash && selectedItem.revCommit == stash,
onClick = { stashesViewModel.selectStash(stash) },
onApply = { stashesViewModel.applyStash(stash) },
onPop = { stashesViewModel.popStash(stash) },
@ -396,7 +404,7 @@ fun LazyListScope.submodules(
private fun Branch(
branch: Ref,
currentBranch: Ref?,
isCurrentBranch: Boolean,
isSelectedItem: Boolean,
onBranchClicked: () -> Unit,
onBranchDoubleClicked: () -> Unit,
onCheckoutBranch: () -> Unit,
@ -407,6 +415,8 @@ private fun Branch(
onPullFromRemoteBranch: () -> Unit,
onChangeDefaultUpstreamBranch: () -> Unit,
) {
val isCurrentBranch = currentBranch?.name == branch.name
ContextMenu(
items = {
branchContextMenuItems(
@ -427,6 +437,7 @@ private fun Branch(
SideMenuSubentry(
text = branch.simpleName,
iconResourcePath = AppIcons.BRANCH,
isSelected = isSelectedItem,
onClick = onBranchClicked,
onDoubleClick = onBranchDoubleClicked,
) {
@ -451,7 +462,8 @@ private fun Remote(
SideMenuSubentry(
text = remote.remoteInfo.remoteConfig.name,
iconResourcePath = AppIcons.CLOUD,
onClick = onRemoteClicked
onClick = onRemoteClicked,
isSelected = false,
)
}
@ -487,6 +499,7 @@ private fun RemoteBranches(
SideMenuSubentry(
text = remoteBranch.simpleName,
extraPadding = 24.dp,
isSelected = false,
iconResourcePath = AppIcons.BRANCH,
onClick = onBranchClicked,
onDoubleClick = onCheckoutBranch,
@ -497,6 +510,7 @@ private fun RemoteBranches(
@Composable
private fun Tag(
tag: Ref,
isSelected: Boolean,
onTagClicked: () -> Unit,
onCheckoutTag: () -> Unit,
onDeleteTag: () -> Unit,
@ -511,6 +525,7 @@ private fun Tag(
) {
SideMenuSubentry(
text = tag.simpleName,
isSelected = isSelected,
iconResourcePath = AppIcons.TAG,
onClick = onTagClicked,
)
@ -521,6 +536,7 @@ private fun Tag(
@Composable
private fun Stash(
stash: RevCommit,
isSelected: Boolean,
onClick: () -> Unit,
onApply: () -> Unit,
onPop: () -> Unit,
@ -537,6 +553,7 @@ private fun Stash(
) {
SideMenuSubentry(
text = stash.shortMessage,
isSelected = isSelected,
iconResourcePath = AppIcons.STASH,
onClick = onClick,
)
@ -569,6 +586,7 @@ private fun Submodule(
SideMenuSubentry(
text = submodule.first,
iconResourcePath = AppIcons.TOPIC,
isSelected = false,
onClick = {
if (submodule.second.type.isValid()) {
onOpenSubmoduleInTab()

View File

@ -3,6 +3,7 @@
package com.jetpackduba.gitnuro.ui.components
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
import androidx.compose.foundation.combinedClickable
import androidx.compose.foundation.layout.*
import androidx.compose.material.Icon
@ -15,6 +16,8 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.jetpackduba.gitnuro.extensions.backgroundIf
import com.jetpackduba.gitnuro.theme.backgroundSelected
const val ENTRY_HEIGHT = 36
@ -24,6 +27,7 @@ const val ENTRY_HEIGHT = 36
fun SideMenuSubentry(
text: String,
iconResourcePath: String,
isSelected: Boolean,
extraPadding: Dp = 0.dp,
onClick: (() -> Unit)? = null,
onDoubleClick: (() -> Unit)? = null,
@ -39,8 +43,8 @@ fun SideMenuSubentry(
else
this
}
.padding(start = extraPadding),
// .background(background),
.padding(start = extraPadding)
.backgroundIf(isSelected, MaterialTheme.colors.backgroundSelected),
verticalAlignment = Alignment.CenterVertically,
) {
Icon(

View File

@ -9,6 +9,7 @@ import com.jetpackduba.gitnuro.git.rebase.RebaseBranchUseCase
import com.jetpackduba.gitnuro.git.remote_operations.PullFromSpecificBranchUseCase
import com.jetpackduba.gitnuro.git.remote_operations.PushToSpecificBranchUseCase
import com.jetpackduba.gitnuro.preferences.AppSettings
import com.jetpackduba.gitnuro.ui.SelectedItem
import dagger.assisted.Assisted
import dagger.assisted.AssistedInject
import kotlinx.coroutines.CoroutineScope
@ -53,8 +54,7 @@ class BranchesViewModel @AssistedInject constructor(
init {
tabScope.launch {
tabState.refreshFlowFiltered(RefreshType.ALL_DATA)
{
tabState.refreshFlowFiltered(RefreshType.ALL_DATA) {
refresh(tabState.git)
}
}
@ -105,7 +105,7 @@ class BranchesViewModel @AssistedInject constructor(
}
fun selectBranch(ref: Ref) {
tabState.newSelectedRef(ref.objectId)
tabState.newSelectedRef(ref, ref.objectId)
}
fun pushToRemoteBranch(branch: Ref) = tabState.safeProcessing(

View File

@ -120,7 +120,7 @@ class RemotesViewModel @AssistedInject constructor(
}
fun selectBranch(ref: Ref) {
tabState.newSelectedRef(ref.objectId)
tabState.newSelectedRef(ref, ref.objectId)
}
fun deleteRemote(remoteName: String, isNew: Boolean) = tabState.safeProcessing(

View File

@ -1,6 +1,8 @@
package com.jetpackduba.gitnuro.viewmodels.sidepanel
import com.jetpackduba.gitnuro.di.factories.*
import com.jetpackduba.gitnuro.git.TabState
import com.jetpackduba.gitnuro.ui.SelectedItem
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import javax.inject.Inject
@ -11,9 +13,11 @@ class SidePanelViewModel @Inject constructor(
tagsViewModelFactory: TagsViewModelFactory,
stashesViewModelFactory: StashesViewModelFactory,
submodulesViewModelFactory: SubmodulesViewModelFactory,
tabState: TabState,
) {
private val _filter = MutableStateFlow("")
val filter: StateFlow<String> = _filter
val selectedItem: StateFlow<SelectedItem> = tabState.selectedItem
val branchesViewModel: BranchesViewModel = branchesViewModelFactory.create(filter)
val remotesViewModel: RemotesViewModel = remotesViewModelFactory.create(filter)

View File

@ -67,7 +67,7 @@ class TagsViewModel @AssistedInject constructor(
}
fun selectTag(tag: Ref) {
tabState.newSelectedRef(tag.objectId)
tabState.newSelectedRef(tag, tag.objectId)
}
suspend fun refresh(git: Git) {