Removed scroll to top in favor of workspace button
This commit is contained in:
parent
2ffb8d9038
commit
08536b2caa
@ -179,11 +179,11 @@ class TabState @Inject constructor(
|
|||||||
_refreshData.emit(refreshType)
|
_refreshData.emit(refreshType)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun newSelectedStash(stash: RevCommit) {
|
suspend fun newSelectedStash(stash: RevCommit) {
|
||||||
newSelectedItem(SelectedItem.Stash(stash))
|
newSelectedItem(SelectedItem.Stash(stash))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun noneSelected() {
|
suspend fun noneSelected() {
|
||||||
newSelectedItem(SelectedItem.None)
|
newSelectedItem(SelectedItem.None)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -194,7 +194,9 @@ class TabState @Inject constructor(
|
|||||||
newSelectedItem(SelectedItem.None)
|
newSelectedItem(SelectedItem.None)
|
||||||
} else {
|
} else {
|
||||||
val commit = findCommit(git, objectId)
|
val commit = findCommit(git, objectId)
|
||||||
newSelectedItem(SelectedItem.Ref(commit))
|
val newSelectedItem = SelectedItem.Ref(commit)
|
||||||
|
newSelectedItem(newSelectedItem)
|
||||||
|
_taskEvent.emit(TaskEvent.ScrollToGraphItem(newSelectedItem))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -202,8 +204,12 @@ class TabState @Inject constructor(
|
|||||||
return git.repository.parseCommit(objectId)
|
return git.repository.parseCommit(objectId)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun newSelectedItem(selectedItem: SelectedItem) {
|
suspend fun newSelectedItem(selectedItem: SelectedItem, scrollToItem: Boolean = false) {
|
||||||
_selectedItem.value = selectedItem
|
_selectedItem.value = selectedItem
|
||||||
|
|
||||||
|
if (scrollToItem) {
|
||||||
|
_taskEvent.emit(TaskEvent.ScrollToGraphItem(selectedItem))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
suspend fun emitNewTaskEvent(taskEvent: TaskEvent) {
|
suspend fun emitNewTaskEvent(taskEvent: TaskEvent) {
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
package com.jetpackduba.gitnuro.git
|
package com.jetpackduba.gitnuro.git
|
||||||
|
|
||||||
|
import com.jetpackduba.gitnuro.ui.SelectedItem
|
||||||
import org.eclipse.jgit.revwalk.RevCommit
|
import org.eclipse.jgit.revwalk.RevCommit
|
||||||
|
|
||||||
sealed interface TaskEvent {
|
sealed interface TaskEvent {
|
||||||
data class RebaseInteractive(val revCommit: RevCommit) : TaskEvent
|
data class RebaseInteractive(val revCommit: RevCommit) : TaskEvent
|
||||||
|
data class ScrollToGraphItem(val selectedItem: SelectedItem) : TaskEvent
|
||||||
}
|
}
|
@ -14,20 +14,16 @@ import androidx.compose.runtime.*
|
|||||||
import androidx.compose.ui.Alignment
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.ExperimentalComposeUiApi
|
import androidx.compose.ui.ExperimentalComposeUiApi
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.draw.alpha
|
|
||||||
import androidx.compose.ui.draw.clip
|
import androidx.compose.ui.draw.clip
|
||||||
import androidx.compose.ui.graphics.Color
|
|
||||||
import androidx.compose.ui.graphics.ColorFilter
|
import androidx.compose.ui.graphics.ColorFilter
|
||||||
import androidx.compose.ui.graphics.painter.Painter
|
import androidx.compose.ui.graphics.painter.Painter
|
||||||
import androidx.compose.ui.input.pointer.PointerIconDefaults
|
|
||||||
import androidx.compose.ui.input.pointer.pointerHoverIcon
|
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.text.style.TextAlign
|
import androidx.compose.ui.text.style.TextAlign
|
||||||
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.jetpackduba.gitnuro.extensions.handMouseClickable
|
import com.jetpackduba.gitnuro.extensions.handMouseClickable
|
||||||
import com.jetpackduba.gitnuro.extensions.handOnHover
|
import com.jetpackduba.gitnuro.extensions.handOnHover
|
||||||
import com.jetpackduba.gitnuro.extensions.ignoreKeyEvents
|
import com.jetpackduba.gitnuro.extensions.ignoreKeyEvents
|
||||||
import com.jetpackduba.gitnuro.theme.primaryTextColor
|
|
||||||
import com.jetpackduba.gitnuro.ui.context_menu.*
|
import com.jetpackduba.gitnuro.ui.context_menu.*
|
||||||
import com.jetpackduba.gitnuro.viewmodels.MenuViewModel
|
import com.jetpackduba.gitnuro.viewmodels.MenuViewModel
|
||||||
|
|
||||||
@ -37,6 +33,7 @@ fun Menu(
|
|||||||
modifier: Modifier,
|
modifier: Modifier,
|
||||||
menuViewModel: MenuViewModel,
|
menuViewModel: MenuViewModel,
|
||||||
onCreateBranch: () -> Unit,
|
onCreateBranch: () -> Unit,
|
||||||
|
onGoToWorkspace: () -> Unit,
|
||||||
onStashWithMessage: () -> Unit,
|
onStashWithMessage: () -> Unit,
|
||||||
) {
|
) {
|
||||||
var showAdditionalOptionsDropDownMenu by remember { mutableStateOf(false) }
|
var showAdditionalOptionsDropDownMenu by remember { mutableStateOf(false) }
|
||||||
@ -46,6 +43,15 @@ fun Menu(
|
|||||||
horizontalArrangement = Arrangement.Center,
|
horizontalArrangement = Arrangement.Center,
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
) {
|
) {
|
||||||
|
MenuButton(
|
||||||
|
modifier = Modifier
|
||||||
|
.padding(start = 16.dp),
|
||||||
|
title = "Workspace",
|
||||||
|
icon = painterResource("computer.svg"),
|
||||||
|
onClick = onGoToWorkspace,
|
||||||
|
fixedWidth = false,
|
||||||
|
)
|
||||||
|
|
||||||
Spacer(modifier = Modifier.weight(1f))
|
Spacer(modifier = Modifier.weight(1f))
|
||||||
|
|
||||||
ExtendedMenuButton(
|
ExtendedMenuButton(
|
||||||
@ -144,6 +150,7 @@ fun MenuButton(
|
|||||||
enabled: Boolean = true,
|
enabled: Boolean = true,
|
||||||
title: String,
|
title: String,
|
||||||
icon: Painter,
|
icon: Painter,
|
||||||
|
fixedWidth: Boolean = true,
|
||||||
onClick: () -> Unit
|
onClick: () -> Unit
|
||||||
) {
|
) {
|
||||||
Row(
|
Row(
|
||||||
@ -152,7 +159,12 @@ fun MenuButton(
|
|||||||
.clip(RoundedCornerShape(4.dp))
|
.clip(RoundedCornerShape(4.dp))
|
||||||
.background(MaterialTheme.colors.primary)
|
.background(MaterialTheme.colors.primary)
|
||||||
.handMouseClickable { if (enabled) onClick() }
|
.handMouseClickable { if (enabled) onClick() }
|
||||||
.width(100.dp),
|
.run {
|
||||||
|
return@run if (fixedWidth) {
|
||||||
|
this.width(100.dp)
|
||||||
|
} else
|
||||||
|
this.padding(horizontal = 16.dp)
|
||||||
|
},
|
||||||
horizontalArrangement = Arrangement.Center,
|
horizontalArrangement = Arrangement.Center,
|
||||||
verticalAlignment = Alignment.CenterVertically,
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
) {
|
) {
|
||||||
|
@ -136,6 +136,7 @@ fun RepositoryOpenPage(tabViewModel: TabViewModel) {
|
|||||||
menuViewModel = tabViewModel.menuViewModel,
|
menuViewModel = tabViewModel.menuViewModel,
|
||||||
onCreateBranch = { showNewBranchDialog = true },
|
onCreateBranch = { showNewBranchDialog = true },
|
||||||
onStashWithMessage = { showStashWithMessageDialog = true },
|
onStashWithMessage = { showStashWithMessageDialog = true },
|
||||||
|
onGoToWorkspace = { tabViewModel.selectUncommitedChanges() }
|
||||||
)
|
)
|
||||||
|
|
||||||
RepoContent(tabViewModel, diffSelected, selectedItem, repositoryState, blameState, showHistory)
|
RepoContent(tabViewModel, diffSelected, selectedItem, repositoryState, blameState, showHistory)
|
||||||
@ -322,6 +323,7 @@ fun RepoContent(
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OptIn(ExperimentalSplitPaneApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
fun MainContentView(
|
fun MainContentView(
|
||||||
tabViewModel: TabViewModel,
|
tabViewModel: TabViewModel,
|
||||||
|
@ -30,7 +30,6 @@ import androidx.compose.ui.input.key.KeyEventType
|
|||||||
import androidx.compose.ui.input.key.onPreviewKeyEvent
|
import androidx.compose.ui.input.key.onPreviewKeyEvent
|
||||||
import androidx.compose.ui.input.key.type
|
import androidx.compose.ui.input.key.type
|
||||||
import androidx.compose.ui.input.pointer.PointerIcon
|
import androidx.compose.ui.input.pointer.PointerIcon
|
||||||
import androidx.compose.ui.input.pointer.PointerIconDefaults
|
|
||||||
import androidx.compose.ui.input.pointer.pointerHoverIcon
|
import androidx.compose.ui.input.pointer.pointerHoverIcon
|
||||||
import androidx.compose.ui.platform.LocalDensity
|
import androidx.compose.ui.platform.LocalDensity
|
||||||
import androidx.compose.ui.res.painterResource
|
import androidx.compose.ui.res.painterResource
|
||||||
@ -38,23 +37,23 @@ import androidx.compose.ui.text.font.FontStyle
|
|||||||
import androidx.compose.ui.text.style.TextOverflow
|
import androidx.compose.ui.text.style.TextOverflow
|
||||||
import androidx.compose.ui.unit.Dp
|
import androidx.compose.ui.unit.Dp
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import com.jetpackduba.gitnuro.git.workspace.StatusSummary
|
import com.jetpackduba.gitnuro.extensions.*
|
||||||
import com.jetpackduba.gitnuro.git.graph.GraphCommitList
|
import com.jetpackduba.gitnuro.git.graph.GraphCommitList
|
||||||
import com.jetpackduba.gitnuro.git.graph.GraphNode
|
import com.jetpackduba.gitnuro.git.graph.GraphNode
|
||||||
|
import com.jetpackduba.gitnuro.git.workspace.StatusSummary
|
||||||
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
|
import com.jetpackduba.gitnuro.keybindings.KeybindingOption
|
||||||
import com.jetpackduba.gitnuro.keybindings.matchesBinding
|
import com.jetpackduba.gitnuro.keybindings.matchesBinding
|
||||||
|
import com.jetpackduba.gitnuro.theme.*
|
||||||
import com.jetpackduba.gitnuro.ui.SelectedItem
|
import com.jetpackduba.gitnuro.ui.SelectedItem
|
||||||
import com.jetpackduba.gitnuro.ui.components.AvatarImage
|
import com.jetpackduba.gitnuro.ui.components.AvatarImage
|
||||||
import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn
|
import com.jetpackduba.gitnuro.ui.components.ScrollableLazyColumn
|
||||||
|
import com.jetpackduba.gitnuro.ui.context_menu.*
|
||||||
import com.jetpackduba.gitnuro.ui.dialogs.NewBranchDialog
|
import com.jetpackduba.gitnuro.ui.dialogs.NewBranchDialog
|
||||||
import com.jetpackduba.gitnuro.ui.dialogs.NewTagDialog
|
import com.jetpackduba.gitnuro.ui.dialogs.NewTagDialog
|
||||||
import com.jetpackduba.gitnuro.ui.dialogs.ResetBranchDialog
|
import com.jetpackduba.gitnuro.ui.dialogs.ResetBranchDialog
|
||||||
import com.jetpackduba.gitnuro.viewmodels.LogSearch
|
import com.jetpackduba.gitnuro.viewmodels.LogSearch
|
||||||
import com.jetpackduba.gitnuro.viewmodels.LogStatus
|
import com.jetpackduba.gitnuro.viewmodels.LogStatus
|
||||||
import com.jetpackduba.gitnuro.viewmodels.LogViewModel
|
import com.jetpackduba.gitnuro.viewmodels.LogViewModel
|
||||||
import com.jetpackduba.gitnuro.extensions.*
|
|
||||||
import com.jetpackduba.gitnuro.theme.*
|
|
||||||
import com.jetpackduba.gitnuro.ui.context_menu.*
|
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import org.eclipse.jgit.lib.Ref
|
import org.eclipse.jgit.lib.Ref
|
||||||
import org.eclipse.jgit.lib.RepositoryState
|
import org.eclipse.jgit.lib.RepositoryState
|
||||||
@ -99,7 +98,6 @@ fun Log(
|
|||||||
val logStatus = logStatusState.value
|
val logStatus = logStatusState.value
|
||||||
val showLogDialog by logViewModel.logDialog.collectAsState()
|
val showLogDialog by logViewModel.logDialog.collectAsState()
|
||||||
|
|
||||||
|
|
||||||
val selectedCommit = if (selectedItem is SelectedItem.CommitBasedItem) {
|
val selectedCommit = if (selectedItem is SelectedItem.CommitBasedItem) {
|
||||||
selectedItem.revCommit
|
selectedItem.revCommit
|
||||||
} else {
|
} else {
|
||||||
@ -107,6 +105,7 @@ fun Log(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (logStatus is LogStatus.Loaded) {
|
if (logStatus is LogStatus.Loaded) {
|
||||||
|
val coroutineScope = rememberCoroutineScope()
|
||||||
val hasUncommitedChanges = logStatus.hasUncommitedChanges
|
val hasUncommitedChanges = logStatus.hasUncommitedChanges
|
||||||
val commitList = logStatus.plotCommitList
|
val commitList = logStatus.plotCommitList
|
||||||
val verticalScrollState by logViewModel.verticalListState.collectAsState()
|
val verticalScrollState by logViewModel.verticalListState.collectAsState()
|
||||||
@ -117,18 +116,18 @@ fun Log(
|
|||||||
// the proper scroll position
|
// the proper scroll position
|
||||||
verticalScrollState.observeScrollChanges()
|
verticalScrollState.observeScrollChanges()
|
||||||
|
|
||||||
LaunchedEffect(selectedCommit) {
|
|
||||||
// Scroll to commit if a Ref is selected
|
|
||||||
if (selectedItem is SelectedItem.Ref) {
|
|
||||||
scrollToCommit(verticalScrollState, commitList, selectedCommit)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
LaunchedEffect(Unit) {
|
LaunchedEffect(Unit) {
|
||||||
|
coroutineScope.launch {
|
||||||
logViewModel.focusCommit.collect { commit ->
|
logViewModel.focusCommit.collect { commit ->
|
||||||
scrollToCommit(verticalScrollState, commitList, commit)
|
scrollToCommit(verticalScrollState, commitList, commit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
coroutineScope.launch {
|
||||||
|
logViewModel.scrollToUncommitedChanges.collect {
|
||||||
|
scrollToUncommitedChanges(verticalScrollState, commitList)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
LogDialogs(
|
LogDialogs(
|
||||||
logViewModel,
|
logViewModel,
|
||||||
@ -218,38 +217,6 @@ fun Log(
|
|||||||
),
|
),
|
||||||
adapter = rememberScrollbarAdapter(horizontalScrollState)
|
adapter = rememberScrollbarAdapter(horizontalScrollState)
|
||||||
)
|
)
|
||||||
|
|
||||||
if (verticalScrollState.firstVisibleItemIndex > 0) {
|
|
||||||
Box(
|
|
||||||
modifier = Modifier
|
|
||||||
.align(Alignment.BottomEnd)
|
|
||||||
.padding(bottom = 16.dp, end = 16.dp)
|
|
||||||
.clip(RoundedCornerShape(50))
|
|
||||||
.handMouseClickable {
|
|
||||||
scope.launch {
|
|
||||||
verticalScrollState.scrollToItem(0)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.background(MaterialTheme.colors.primary)
|
|
||||||
.padding(vertical = 8.dp, horizontal = 16.dp),
|
|
||||||
) {
|
|
||||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
|
||||||
Icon(
|
|
||||||
painterResource("align_top.svg"),
|
|
||||||
contentDescription = null,
|
|
||||||
tint = MaterialTheme.colors.onPrimary,
|
|
||||||
modifier = Modifier.size(18.dp),
|
|
||||||
)
|
|
||||||
|
|
||||||
Text(
|
|
||||||
text = "Scroll to top",
|
|
||||||
modifier = Modifier.padding(start = 8.dp),
|
|
||||||
color = MaterialTheme.colors.onPrimary,
|
|
||||||
style = MaterialTheme.typography.body1,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -267,6 +234,14 @@ suspend fun scrollToCommit(
|
|||||||
if (index >= 0) verticalScrollState.scrollToItem(index)
|
if (index >= 0) verticalScrollState.scrollToItem(index)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun scrollToUncommitedChanges(
|
||||||
|
verticalScrollState: LazyListState,
|
||||||
|
commitList: GraphCommitList,
|
||||||
|
) {
|
||||||
|
if (commitList.isNotEmpty())
|
||||||
|
verticalScrollState.scrollToItem(0)
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun SearchFilter(
|
fun SearchFilter(
|
||||||
logViewModel: LogViewModel,
|
logViewModel: LogViewModel,
|
||||||
@ -306,10 +281,12 @@ fun SearchFilter(
|
|||||||
}
|
}
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyUp -> {
|
keyEvent.matchesBinding(KeybindingOption.EXIT) && keyEvent.type == KeyEventType.KeyUp -> {
|
||||||
logViewModel.closeSearch()
|
logViewModel.closeSearch()
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -549,16 +526,19 @@ fun LogDialogs(
|
|||||||
onResetShowLogDialog()
|
onResetShowLogDialog()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
is LogDialog.NewTag -> {
|
is LogDialog.NewTag -> {
|
||||||
NewTagDialog(onReject = onResetShowLogDialog, onAccept = { tagName ->
|
NewTagDialog(onReject = onResetShowLogDialog, onAccept = { tagName ->
|
||||||
logViewModel.createTagOnCommit(tagName, showLogDialog.graphNode)
|
logViewModel.createTagOnCommit(tagName, showLogDialog.graphNode)
|
||||||
onResetShowLogDialog()
|
onResetShowLogDialog()
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
is LogDialog.ResetBranch -> ResetBranchDialog(onReject = onResetShowLogDialog, onAccept = { resetType ->
|
is LogDialog.ResetBranch -> ResetBranchDialog(onReject = onResetShowLogDialog, onAccept = { resetType ->
|
||||||
logViewModel.resetToCommit(showLogDialog.graphNode, resetType)
|
logViewModel.resetToCommit(showLogDialog.graphNode, resetType)
|
||||||
onResetShowLogDialog()
|
onResetShowLogDialog()
|
||||||
})
|
})
|
||||||
|
|
||||||
LogDialog.None -> {
|
LogDialog.None -> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,13 @@ package com.jetpackduba.gitnuro.viewmodels
|
|||||||
import androidx.compose.foundation.ScrollState
|
import androidx.compose.foundation.ScrollState
|
||||||
import androidx.compose.foundation.lazy.LazyListState
|
import androidx.compose.foundation.lazy.LazyListState
|
||||||
import com.jetpackduba.gitnuro.extensions.delayedStateChange
|
import com.jetpackduba.gitnuro.extensions.delayedStateChange
|
||||||
|
import com.jetpackduba.gitnuro.git.RefreshType
|
||||||
|
import com.jetpackduba.gitnuro.git.TabState
|
||||||
|
import com.jetpackduba.gitnuro.git.TaskEvent
|
||||||
|
import com.jetpackduba.gitnuro.git.branches.*
|
||||||
import com.jetpackduba.gitnuro.git.graph.GraphCommitList
|
import com.jetpackduba.gitnuro.git.graph.GraphCommitList
|
||||||
import com.jetpackduba.gitnuro.git.graph.GraphNode
|
import com.jetpackduba.gitnuro.git.graph.GraphNode
|
||||||
|
import com.jetpackduba.gitnuro.git.log.*
|
||||||
import com.jetpackduba.gitnuro.git.rebase.RebaseBranchUseCase
|
import com.jetpackduba.gitnuro.git.rebase.RebaseBranchUseCase
|
||||||
import com.jetpackduba.gitnuro.git.remote_operations.DeleteRemoteBranchUseCase
|
import com.jetpackduba.gitnuro.git.remote_operations.DeleteRemoteBranchUseCase
|
||||||
import com.jetpackduba.gitnuro.git.remote_operations.PullFromSpecificBranchUseCase
|
import com.jetpackduba.gitnuro.git.remote_operations.PullFromSpecificBranchUseCase
|
||||||
@ -12,16 +17,11 @@ import com.jetpackduba.gitnuro.git.remote_operations.PushToSpecificBranchUseCase
|
|||||||
import com.jetpackduba.gitnuro.git.tags.CreateTagOnCommitUseCase
|
import com.jetpackduba.gitnuro.git.tags.CreateTagOnCommitUseCase
|
||||||
import com.jetpackduba.gitnuro.git.tags.DeleteTagUseCase
|
import com.jetpackduba.gitnuro.git.tags.DeleteTagUseCase
|
||||||
import com.jetpackduba.gitnuro.git.workspace.CheckHasUncommitedChangedUseCase
|
import com.jetpackduba.gitnuro.git.workspace.CheckHasUncommitedChangedUseCase
|
||||||
import com.jetpackduba.gitnuro.git.RefreshType
|
|
||||||
import com.jetpackduba.gitnuro.git.TabState
|
|
||||||
import com.jetpackduba.gitnuro.git.workspace.GetStatusSummaryUseCase
|
import com.jetpackduba.gitnuro.git.workspace.GetStatusSummaryUseCase
|
||||||
import com.jetpackduba.gitnuro.git.workspace.StatusSummary
|
import com.jetpackduba.gitnuro.git.workspace.StatusSummary
|
||||||
import com.jetpackduba.gitnuro.preferences.AppSettings
|
import com.jetpackduba.gitnuro.preferences.AppSettings
|
||||||
import com.jetpackduba.gitnuro.ui.SelectedItem
|
import com.jetpackduba.gitnuro.ui.SelectedItem
|
||||||
import com.jetpackduba.gitnuro.ui.log.LogDialog
|
import com.jetpackduba.gitnuro.ui.log.LogDialog
|
||||||
import com.jetpackduba.gitnuro.git.TaskEvent
|
|
||||||
import com.jetpackduba.gitnuro.git.branches.*
|
|
||||||
import com.jetpackduba.gitnuro.git.log.*
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
import kotlinx.coroutines.CoroutineScope
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.flow.*
|
import kotlinx.coroutines.flow.*
|
||||||
@ -74,8 +74,19 @@ class LogViewModel @Inject constructor(
|
|||||||
var savedSearchFilter: String = ""
|
var savedSearchFilter: String = ""
|
||||||
var graphPadding = 0f
|
var graphPadding = 0f
|
||||||
|
|
||||||
private val _focusCommit = MutableSharedFlow<GraphNode>()
|
private val scrollToItem: Flow<RevCommit> = tabState.taskEvent
|
||||||
val focusCommit: SharedFlow<GraphNode> = _focusCommit
|
.filterIsInstance<TaskEvent.ScrollToGraphItem>()
|
||||||
|
.map { it.selectedItem }
|
||||||
|
.filterIsInstance<SelectedItem.CommitBasedItem>()
|
||||||
|
.map { it.revCommit }
|
||||||
|
|
||||||
|
val scrollToUncommitedChanges: Flow<SelectedItem.UncommitedChanges> = tabState.taskEvent
|
||||||
|
.filterIsInstance<TaskEvent.ScrollToGraphItem>()
|
||||||
|
.map { it.selectedItem }
|
||||||
|
.filterIsInstance<SelectedItem.UncommitedChanges>()
|
||||||
|
|
||||||
|
private val _focusCommit = MutableSharedFlow<RevCommit>()
|
||||||
|
val focusCommit: Flow<RevCommit> = merge(_focusCommit, scrollToItem)
|
||||||
|
|
||||||
private val _logDialog = MutableStateFlow<LogDialog>(LogDialog.None)
|
private val _logDialog = MutableStateFlow<LogDialog>(LogDialog.None)
|
||||||
val logDialog: StateFlow<LogDialog> = _logDialog
|
val logDialog: StateFlow<LogDialog> = _logDialog
|
||||||
@ -255,7 +266,9 @@ class LogViewModel @Inject constructor(
|
|||||||
rebaseBranchUseCase(git, ref)
|
rebaseBranchUseCase(git, ref)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun selectUncommitedChanges() {
|
fun selectUncommitedChanges() = tabState.runOperation(
|
||||||
|
refreshType = RefreshType.NONE,
|
||||||
|
) {
|
||||||
tabState.newSelectedItem(SelectedItem.UncommitedChanges)
|
tabState.newSelectedItem(SelectedItem.UncommitedChanges)
|
||||||
|
|
||||||
val searchValue = _logSearchFilterResults.value
|
val searchValue = _logSearchFilterResults.value
|
||||||
@ -275,7 +288,9 @@ class LogViewModel @Inject constructor(
|
|||||||
NONE_MATCHING_INDEX
|
NONE_MATCHING_INDEX
|
||||||
}
|
}
|
||||||
|
|
||||||
fun selectLogLine(commit: GraphNode) {
|
fun selectLogLine(commit: GraphNode) = tabState.runOperation(
|
||||||
|
refreshType = RefreshType.NONE,
|
||||||
|
) {
|
||||||
tabState.newSelectedItem(SelectedItem.Commit(commit))
|
tabState.newSelectedItem(SelectedItem.Commit(commit))
|
||||||
|
|
||||||
val searchValue = _logSearchFilterResults.value
|
val searchValue = _logSearchFilterResults.value
|
||||||
|
@ -58,11 +58,15 @@ class StashesViewModel @Inject constructor(
|
|||||||
stashDropped(stash)
|
stashDropped(stash)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun selectTab(stash: RevCommit) {
|
fun selectTab(stash: RevCommit) = tabState.runOperation(
|
||||||
|
refreshType = RefreshType.NONE,
|
||||||
|
) {
|
||||||
tabState.newSelectedStash(stash)
|
tabState.newSelectedStash(stash)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun stashDropped(stash: RevCommit) {
|
private fun stashDropped(stash: RevCommit) = tabState.runOperation(
|
||||||
|
refreshType = RefreshType.NONE,
|
||||||
|
) {
|
||||||
val selectedValue = tabState.selectedItem.value
|
val selectedValue = tabState.selectedItem.value
|
||||||
if (
|
if (
|
||||||
selectedValue is SelectedItem.Stash &&
|
selectedValue is SelectedItem.Stash &&
|
||||||
|
@ -4,10 +4,10 @@ import com.jetpackduba.gitnuro.AppStateManager
|
|||||||
import com.jetpackduba.gitnuro.ErrorsManager
|
import com.jetpackduba.gitnuro.ErrorsManager
|
||||||
import com.jetpackduba.gitnuro.credentials.CredentialsState
|
import com.jetpackduba.gitnuro.credentials.CredentialsState
|
||||||
import com.jetpackduba.gitnuro.credentials.CredentialsStateManager
|
import com.jetpackduba.gitnuro.credentials.CredentialsStateManager
|
||||||
|
import com.jetpackduba.gitnuro.git.*
|
||||||
import com.jetpackduba.gitnuro.git.repository.GetRepositoryStateUseCase
|
import com.jetpackduba.gitnuro.git.repository.GetRepositoryStateUseCase
|
||||||
import com.jetpackduba.gitnuro.git.repository.InitLocalRepositoryUseCase
|
import com.jetpackduba.gitnuro.git.repository.InitLocalRepositoryUseCase
|
||||||
import com.jetpackduba.gitnuro.git.repository.OpenRepositoryUseCase
|
import com.jetpackduba.gitnuro.git.repository.OpenRepositoryUseCase
|
||||||
import com.jetpackduba.gitnuro.git.*
|
|
||||||
import com.jetpackduba.gitnuro.logging.printLog
|
import com.jetpackduba.gitnuro.logging.printLog
|
||||||
import com.jetpackduba.gitnuro.models.AuthorInfoSimple
|
import com.jetpackduba.gitnuro.models.AuthorInfoSimple
|
||||||
import com.jetpackduba.gitnuro.newErrorNow
|
import com.jetpackduba.gitnuro.newErrorNow
|
||||||
@ -130,6 +130,8 @@ class TabViewModel @Inject constructor(
|
|||||||
tabState.taskEvent.collect { taskEvent ->
|
tabState.taskEvent.collect { taskEvent ->
|
||||||
when (taskEvent) {
|
when (taskEvent) {
|
||||||
is TaskEvent.RebaseInteractive -> onRebaseInteractive(taskEvent)
|
is TaskEvent.RebaseInteractive -> onRebaseInteractive(taskEvent)
|
||||||
|
else -> { /*Nothing to do here*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -429,10 +431,18 @@ class TabViewModel @Inject constructor(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun selectCommit(commit: RevCommit) {
|
fun selectCommit(commit: RevCommit) = tabState.runOperation(
|
||||||
|
refreshType = RefreshType.NONE,
|
||||||
|
) {
|
||||||
tabState.newSelectedItem(SelectedItem.Commit(commit))
|
tabState.newSelectedItem(SelectedItem.Commit(commit))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun selectUncommitedChanges() = tabState.runOperation(
|
||||||
|
refreshType = RefreshType.NONE,
|
||||||
|
) {
|
||||||
|
tabState.newSelectedItem(SelectedItem.UncommitedChanges, true)
|
||||||
|
}
|
||||||
|
|
||||||
fun fileHistory(filePath: String) {
|
fun fileHistory(filePath: String) {
|
||||||
historyViewModel = historyViewModelProvider.get()
|
historyViewModel = historyViewModelProvider.get()
|
||||||
historyViewModel?.fileHistory(filePath)
|
historyViewModel?.fileHistory(filePath)
|
||||||
|
1
src/main/resources/computer.svg
Normal file
1
src/main/resources/computer.svg
Normal file
@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#000000"><path d="M0 0h24v24H0z" fill="none"/><path d="M20 18c1.1 0 1.99-.9 1.99-2L22 6c0-1.1-.9-2-2-2H4c-1.1 0-2 .9-2 2v10c0 1.1.9 2 2 2H0v2h24v-2h-4zM4 6h16v10H4V6z"/></svg>
|
After Width: | Height: | Size: 268 B |
Loading…
Reference in New Issue
Block a user