From ccd345d5ea7c5eac3e8d496b425e5517b6fa2c26 Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Thu, 30 Sep 2021 01:21:46 +0200 Subject: [PATCH] Added reset file button --- src/main/kotlin/GitManager.kt | 10 ++- src/main/kotlin/UncommitedChanges.kt | 113 ++++++++++++++++++--------- src/main/kotlin/git/StatusManager.kt | 18 +++++ 3 files changed, 102 insertions(+), 39 deletions(-) diff --git a/src/main/kotlin/GitManager.kt b/src/main/kotlin/GitManager.kt index 017059f..2fba1d0 100644 --- a/src/main/kotlin/GitManager.kt +++ b/src/main/kotlin/GitManager.kt @@ -137,7 +137,7 @@ class GitManager { val oldTree = DirCacheIterator(repo.readDirCache()) val newTree = FileTreeIterator(repo) - if(diffEntryType is DiffEntryType.UnstagedDiff) + if (diffEntryType is DiffEntryType.UnstagedDiff) formatter.scan(oldTree, newTree) formatter.format(diffEntry) @@ -179,6 +179,14 @@ class GitManager { fun deleteBranch(branch: Ref) = managerScope.launch { branchesManager.deleteBranch(safeGit, branch) } + + fun resetStaged(diffEntry: DiffEntry) = managerScope.launch { + statusManager.reset(safeGit, diffEntry, staged = true) + } + + fun resetUnstaged(diffEntry: DiffEntry) = managerScope.launch { + statusManager.reset(safeGit, diffEntry, staged = false) + } } diff --git a/src/main/kotlin/UncommitedChanges.kt b/src/main/kotlin/UncommitedChanges.kt index d9d1072..49a7713 100644 --- a/src/main/kotlin/UncommitedChanges.kt +++ b/src/main/kotlin/UncommitedChanges.kt @@ -1,10 +1,10 @@ +@file:Suppress("UNUSED_PARAMETER") + import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.ExperimentalAnimationApi import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut -import androidx.compose.foundation.background -import androidx.compose.foundation.border -import androidx.compose.foundation.clickable +import androidx.compose.foundation.* import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.itemsIndexed @@ -15,10 +15,12 @@ import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.Close import androidx.compose.runtime.* import androidx.compose.ui.Alignment +import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.platform.ContextMenuItem +import androidx.compose.ui.platform.ContextMenuState import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow @@ -68,6 +70,9 @@ fun UncommitedChanges( onDiffEntrySelected = onStagedDiffEntrySelected, onDiffEntryOptionSelected = { gitManager.unstage(it) + }, + onReset = { diffEntry -> + gitManager.resetStaged(diffEntry) } ) @@ -82,6 +87,9 @@ fun UncommitedChanges( onDiffEntrySelected = onUnstagedDiffEntrySelected, onDiffEntryOptionSelected = { gitManager.stage(it) + }, + onReset = { diffEntry -> + gitManager.resetUnstaged(diffEntry) } ) @@ -130,6 +138,7 @@ private fun EntriesList( diffEntries: List, onDiffEntrySelected: (DiffEntry) -> Unit, onDiffEntryOptionSelected: (DiffEntry) -> Unit, + onReset: (DiffEntry) -> Unit, ) { Card( modifier = modifier @@ -157,6 +166,9 @@ private fun EntriesList( }, onButtonClick = { onDiffEntryOptionSelected(diffEntry) + }, + onReset = { + onReset(diffEntry) } ) @@ -169,44 +181,69 @@ private fun EntriesList( } } +@OptIn( + ExperimentalComposeUiApi::class, ExperimentalFoundationApi::class, + ExperimentalDesktopApi::class +) @Composable -private fun FileEntry(diffEntry: DiffEntry, icon: ImageVector, onClick: () -> Unit, onButtonClick: () -> Unit) { - Row( +private fun FileEntry( + diffEntry: DiffEntry, + icon: ImageVector, + onClick: () -> Unit, + onButtonClick: () -> Unit, + onReset: () -> Unit, +) { + Box( modifier = Modifier - .height(56.dp) - .fillMaxWidth() - .clickable(onClick = onClick), - verticalAlignment = Alignment.CenterVertically, + .clickable { onClick() } ) { - - Icon( - imageVector = diffEntry.icon, - contentDescription = null, - modifier = Modifier - .padding(horizontal = 16.dp) - .size(24.dp), - tint = MaterialTheme.colors.primary, - ) - - Text( - text = diffEntry.filePath, - modifier = Modifier.weight(1f, fill = true), - maxLines = 1, - overflow = TextOverflow.Ellipsis, - ) - - IconButton( - onClick = onButtonClick, - modifier = Modifier - .padding(horizontal = 16.dp) - .size(32.dp) - .border(1.dp, MaterialTheme.colors.primary, RoundedCornerShape(10.dp)) + ContextMenuArea( + items = { + listOf( + ContextMenuItem( + label = "Reset", + onClick = onReset + ) + ) + }, ) { - Icon( - imageVector = icon, - contentDescription = null, - tint = MaterialTheme.colors.primary, - ) + Row( + modifier = Modifier + .height(56.dp) + .fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + + Icon( + imageVector = diffEntry.icon, + contentDescription = null, + modifier = Modifier + .padding(horizontal = 16.dp) + .size(24.dp), + tint = MaterialTheme.colors.primary, + ) + + Text( + text = diffEntry.filePath, + modifier = Modifier.weight(1f, fill = true), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + + IconButton( + onClick = onButtonClick, + modifier = Modifier + .padding(horizontal = 16.dp) + .size(32.dp) + .border(1.dp, MaterialTheme.colors.primary, RoundedCornerShape(10.dp)) + ) { + Icon( + imageVector = icon, + contentDescription = null, + tint = MaterialTheme.colors.primary, + ) + } + } } } } \ No newline at end of file diff --git a/src/main/kotlin/git/StatusManager.kt b/src/main/kotlin/git/StatusManager.kt index 913ec28..f22bbd2 100644 --- a/src/main/kotlin/git/StatusManager.kt +++ b/src/main/kotlin/git/StatusManager.kt @@ -74,6 +74,24 @@ class StatusManager { loadStatus(git) } + + suspend fun reset(git: Git, diffEntry: DiffEntry, staged: Boolean) = withContext(Dispatchers.IO) { + println("Staged $staged") + + if(staged) { + git + .reset() + .addPath(diffEntry.filePath) + .call() + } + + git + .checkout() + .addPath(diffEntry.filePath) + .call() + + loadStatus(git) + } } sealed class StageStatus {