From 713fba6ab96d1bd86afb087f66b37fa35c2c35ff Mon Sep 17 00:00:00 2001 From: Abdelilah El Aissaoui Date: Thu, 18 Nov 2021 02:01:17 +0100 Subject: [PATCH] Started side menu desgin change and added tags support --- src/main/kotlin/app/git/GitManager.kt | 4 + src/main/kotlin/app/git/TagsManager.kt | 15 ++++ src/main/kotlin/app/theme/Color.kt | 2 +- src/main/kotlin/app/ui/Branches.kt | 78 ++++-------------- src/main/kotlin/app/ui/RepositoryOpen.kt | 2 + src/main/kotlin/app/ui/Stashes.kt | 82 ++++--------------- src/main/kotlin/app/ui/Tags.kt | 66 +++++++++++++++ .../kotlin/app/ui/components/SideMenuEntry.kt | 40 +++++++++ .../app/ui/components/SideMenuSubentry.kt | 53 ++++++++++++ 9 files changed, 215 insertions(+), 127 deletions(-) create mode 100644 src/main/kotlin/app/ui/Tags.kt create mode 100644 src/main/kotlin/app/ui/components/SideMenuEntry.kt create mode 100644 src/main/kotlin/app/ui/components/SideMenuSubentry.kt diff --git a/src/main/kotlin/app/git/GitManager.kt b/src/main/kotlin/app/git/GitManager.kt index 6dfa145..56ba3db 100644 --- a/src/main/kotlin/app/git/GitManager.kt +++ b/src/main/kotlin/app/git/GitManager.kt @@ -59,6 +59,9 @@ class GitManager @Inject constructor( val branches: StateFlow> get() = branchesManager.branches + val tags: StateFlow> + get() = tagsManager.tags + val currentBranch: StateFlow get() = branchesManager.currentBranch @@ -177,6 +180,7 @@ class GitManager @Inject constructor( private suspend fun refreshRepositoryInfo() { statusManager.loadHasUncommitedChanges(safeGit) branchesManager.loadBranches(safeGit) + tagsManager.loadTags(safeGit) stashManager.loadStashList(safeGit) coLoadLog() } diff --git a/src/main/kotlin/app/git/TagsManager.kt b/src/main/kotlin/app/git/TagsManager.kt index 32517bf..ddee8ec 100644 --- a/src/main/kotlin/app/git/TagsManager.kt +++ b/src/main/kotlin/app/git/TagsManager.kt @@ -1,12 +1,27 @@ package app.git import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.withContext import org.eclipse.jgit.api.Git +import org.eclipse.jgit.lib.Ref import org.eclipse.jgit.revwalk.RevCommit import javax.inject.Inject class TagsManager @Inject constructor() { + + private val _tags = MutableStateFlow>(listOf()) + val tags: StateFlow> + get() = _tags + + suspend fun loadTags(git: Git) = withContext(Dispatchers.IO) { + val branchList = git.tagList().call() + + + _tags.value = branchList + } + suspend fun createTagOnCommit(git: Git, tag: String, revCommit: RevCommit) = withContext(Dispatchers.IO) { git .tag() diff --git a/src/main/kotlin/app/theme/Color.kt b/src/main/kotlin/app/theme/Color.kt index dc237cb..8c77815 100644 --- a/src/main/kotlin/app/theme/Color.kt +++ b/src/main/kotlin/app/theme/Color.kt @@ -8,7 +8,7 @@ val primaryDark = Color(0xFF014F97) val secondary = Color(0xFFAB02E9) val mainText = Color(0xFF212934) val mainTextDark = Color(0xFFFFFFFF) -val secondaryText = Color(0xFF8F8F8F) +val secondaryText = Color(0xFF595858) val secondaryTextDark = Color(0xFFCCCBCB) val errorColor = Color(0xFFFA4B4B) val primaryGrayLight = Color(0xFF464646) diff --git a/src/main/kotlin/app/ui/Branches.kt b/src/main/kotlin/app/ui/Branches.kt index 57c0e1e..097e3d0 100644 --- a/src/main/kotlin/app/ui/Branches.kt +++ b/src/main/kotlin/app/ui/Branches.kt @@ -24,33 +24,25 @@ import app.git.GitManager import org.eclipse.jgit.lib.Ref import app.theme.headerBackground import app.theme.headerText +import app.ui.components.SideMenuEntry +import app.ui.components.SideMenuSubentry @Composable fun Branches(gitManager: GitManager) { val branches by gitManager.branches.collectAsState() val currentBranch by gitManager.currentBranch.collectAsState() - Card( - modifier = Modifier - .fillMaxWidth() - .fillMaxHeight(0.5f) - .padding(8.dp) - ) { - Column { - Text( - modifier = Modifier - .background(MaterialTheme.colors.headerBackground) - .padding(vertical = 8.dp) - .fillMaxWidth(), - text = "Local branches", - fontWeight = FontWeight.Bold, - textAlign = TextAlign.Center, - color = MaterialTheme.colors.headerText, - fontSize = 14.sp, - maxLines = 1, - ) + Column { + SideMenuEntry("Branches") - ScrollableLazyColumn(modifier = Modifier.weight(5f)) { + val branchesHeight = branches.count() * 40 + val maxHeight = if(branchesHeight < 300) + branchesHeight + else + 300 + + Box(modifier = Modifier.heightIn(max = maxHeight.dp)) { + ScrollableLazyColumn(modifier = Modifier.fillMaxWidth()) { itemsIndexed(branches) { _, branch -> BranchRow( branch = branch, @@ -68,48 +60,12 @@ private fun BranchRow( branch: Ref, isCurrentBranch: Boolean ) { - val fontWeight = if(isCurrentBranch) - FontWeight.Bold - else - FontWeight.Normal - - Row( - modifier = Modifier - .height(40.dp) - .fillMaxWidth() - .clickable(onClick = {}), - verticalAlignment = Alignment.CenterVertically, + SideMenuSubentry( + text = branch.simpleName, + iconResourcePath = "branch.svg" ) { - - Icon( - painter = painterResource("branch.svg"), - contentDescription = null, - modifier = Modifier - .padding(horizontal = 8.dp) - .size(16.dp), - tint = MaterialTheme.colors.primary, - ) - - Text( - text = branch.simpleName, - fontWeight = fontWeight, - modifier = Modifier.weight(1f, fill = true), - maxLines = 1, - fontSize = 14.sp, - overflow = TextOverflow.Ellipsis, - ) - - IconButton( - onClick = {}, - modifier = Modifier - .padding(horizontal = 16.dp) - .size(16.dp) - ) { - Icon( - imageVector = Icons.Default.MoreVert, - contentDescription = null, - tint = MaterialTheme.colors.primary, - ) + if (isCurrentBranch) { + Text("***") } } } \ No newline at end of file diff --git a/src/main/kotlin/app/ui/RepositoryOpen.kt b/src/main/kotlin/app/ui/RepositoryOpen.kt index 445ed3a..18f2c4d 100644 --- a/src/main/kotlin/app/ui/RepositoryOpen.kt +++ b/src/main/kotlin/app/ui/RepositoryOpen.kt @@ -2,6 +2,7 @@ package app.ui import androidx.compose.animation.Crossfade import androidx.compose.foundation.layout.* +import androidx.compose.material.Text import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp @@ -93,6 +94,7 @@ fun RepositoryOpenPage(gitManager: GitManager, dialogManager: DialogManager) { .fillMaxHeight() ) { Branches(gitManager = gitManager) + Tags(gitManager = gitManager) Stashes(gitManager = gitManager) } Box( diff --git a/src/main/kotlin/app/ui/Stashes.kt b/src/main/kotlin/app/ui/Stashes.kt index d413697..475064b 100644 --- a/src/main/kotlin/app/ui/Stashes.kt +++ b/src/main/kotlin/app/ui/Stashes.kt @@ -21,6 +21,8 @@ import app.git.StashStatus import org.eclipse.jgit.revwalk.RevCommit import app.theme.headerBackground import app.theme.headerText +import app.ui.components.SideMenuEntry +import app.ui.components.SideMenuSubentry @Composable fun Stashes(gitManager: GitManager) { @@ -32,78 +34,28 @@ fun Stashes(gitManager: GitManager) { else listOf() - Card( - modifier = Modifier - .fillMaxWidth() - .fillMaxHeight(0.5f) - .padding(8.dp) - ) { - Column { - Text( - modifier = Modifier - .background(MaterialTheme.colors.headerBackground) - .padding(vertical = 8.dp) - .fillMaxWidth(), - text = "Stashes", - fontWeight = FontWeight.Bold, - textAlign = TextAlign.Center, - color = MaterialTheme.colors.headerText, - fontSize = 14.sp, - maxLines = 1, - ) - ScrollableLazyColumn(modifier = Modifier.weight(5f)) { - items(items = stashList) { stash -> - StashRow( - stash = stash, - ) + Column { + SideMenuEntry( + text = "Stashes", + ) + + ScrollableLazyColumn(modifier = Modifier.fillMaxWidth()) { + items(items = stashList) { stash -> + StashRow( + stash = stash, + ) - } } } } + } @Composable private fun StashRow(stash: RevCommit) { - Row( - modifier = Modifier - .height(40.dp) - .fillMaxWidth() - .clickable(onClick = {}), - verticalAlignment = Alignment.CenterVertically, - ) { - - Icon( - painter = painterResource("stash.svg"), - contentDescription = null, - modifier = Modifier - .padding(horizontal = 8.dp) - .size(16.dp), - tint = MaterialTheme.colors.primary, - ) - - Text( - text = stash.shortMessage, - modifier = Modifier - .weight(1f, fill = true) - .padding(end = 16.dp), - maxLines = 1, - fontSize = 14.sp, - overflow = TextOverflow.Ellipsis, - ) - -// IconButton( -// onClick = {}, -// modifier = Modifier -// .padding(horizontal = 16.dp) -// .size(16.dp) -// ) { -// Icon( -// imageVector = Icons.Default.MoreVert, -// contentDescription = null, -// tint = MaterialTheme.colors.primary, -// ) -// } - } + SideMenuSubentry( + text = stash.name, + iconResourcePath = "stash.svg", + ) } \ No newline at end of file diff --git a/src/main/kotlin/app/ui/Tags.kt b/src/main/kotlin/app/ui/Tags.kt new file mode 100644 index 0000000..aa1d305 --- /dev/null +++ b/src/main/kotlin/app/ui/Tags.kt @@ -0,0 +1,66 @@ +package app.ui + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.foundation.lazy.items +import androidx.compose.material.* +import androidx.compose.runtime.Composable +import androidx.compose.runtime.collectAsState +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import app.extensions.simpleName +import app.ui.components.ScrollableLazyColumn +import app.git.GitManager +import app.git.StashStatus +import org.eclipse.jgit.revwalk.RevCommit +import app.theme.headerBackground +import app.theme.headerText +import app.ui.components.SideMenuEntry +import app.ui.components.SideMenuSubentry +import org.eclipse.jgit.lib.Ref + +@Composable +fun Tags(gitManager: GitManager) { + val tagsState = gitManager.tags.collectAsState() + val tags = tagsState.value + + + Column { + SideMenuEntry( + text = "Tags", + ) + + val branchesHeight = tags.count() * 40 + val maxHeight = if (branchesHeight < 300) + branchesHeight + else + 300 + + Box(modifier = Modifier.heightIn(max = maxHeight.dp)) { + ScrollableLazyColumn(modifier = Modifier.fillMaxWidth()) { + items(items = tags) { tag -> + TagRow( + tag = tag, + ) + + } + } + } + } + +} + +@Composable +private fun TagRow(tag: Ref) { + SideMenuSubentry( + text = tag.simpleName, + iconResourcePath = "tag.svg", + ) +} \ No newline at end of file diff --git a/src/main/kotlin/app/ui/components/SideMenuEntry.kt b/src/main/kotlin/app/ui/components/SideMenuEntry.kt new file mode 100644 index 0000000..a569866 --- /dev/null +++ b/src/main/kotlin/app/ui/components/SideMenuEntry.kt @@ -0,0 +1,40 @@ +package app.ui.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import app.theme.secondaryTextColor + +@Composable +fun SideMenuEntry( + text: String, +) { + Row( + modifier = Modifier + .height(40.dp) + .fillMaxWidth() + .clickable(onClick = {}), + verticalAlignment = Alignment.CenterVertically, + ) { + + Text( + text = text, + modifier = Modifier + .padding(horizontal = 8.dp), + maxLines = 1, + fontSize = 14.sp, + color = MaterialTheme.colors.secondaryTextColor, + overflow = TextOverflow.Ellipsis, + ) + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/ui/components/SideMenuSubentry.kt b/src/main/kotlin/app/ui/components/SideMenuSubentry.kt new file mode 100644 index 0000000..f064a8c --- /dev/null +++ b/src/main/kotlin/app/ui/components/SideMenuSubentry.kt @@ -0,0 +1,53 @@ +package app.ui.components + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.* +import androidx.compose.material.Icon +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp +import app.extensions.simpleName +import app.theme.primaryTextColor +import app.theme.secondaryTextColor + +@Composable +fun SideMenuSubentry( + text: String, + iconResourcePath: String, + additionalInfo: @Composable () -> Unit = {} +) { + Row( + modifier = Modifier + .height(40.dp) + .fillMaxWidth() + .clickable(onClick = {}), + verticalAlignment = Alignment.CenterVertically, + ) { + Icon( + painter = painterResource(iconResourcePath), + contentDescription = null, + modifier = Modifier + .padding(horizontal = 8.dp) + .size(16.dp), + tint = MaterialTheme.colors.primary, + ) + + Text( + text = text, + modifier = Modifier.weight(1f, fill = true), + maxLines = 1, + fontSize = 14.sp, + color = MaterialTheme.colors.primaryTextColor, + overflow = TextOverflow.Ellipsis, + ) + + additionalInfo() + } +} \ No newline at end of file