1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-02-13 13:59:06 +02:00

better handling of cursor relocation

This commit is contained in:
Jesse Duffield 2021-03-21 09:20:52 +11:00
parent d2b65537f6
commit 5edea5a8dc
2 changed files with 36 additions and 21 deletions

View File

@ -524,6 +524,24 @@ func (gui *Gui) refreshStateFiles() error {
// move the cursor to there.
selectedNode := gui.getSelectedStatusNode()
prevNodes := gui.State.StatusLineManager.GetAllItems()
prevSelectedLineIdx := gui.State.Panels.Files.SelectedLineIdx
files := gui.GitCommand.GetStatusFiles(commands.GetStatusFileOptions{})
gui.State.StatusLineManager.SetFiles(files)
if err := gui.fileWatcher.addFilesToFileWatcher(files); err != nil {
return err
}
// Let's try to find our file again and move the cursor to that.
// If we can't find our file, it was probably just removed by the user. In that
// case, we go looking for where the next file has been moved to. Given that the
// user could have removed a whole directory, we continue iterating through the old
// nodes until we find one that exists in the new set of nodes, then move the cursor
// to that
if selectedNode != nil {
getPaths := func(node *models.StatusLineNode) []string {
if node == nil {
return nil
@ -534,29 +552,22 @@ func (gui *Gui) refreshStateFiles() error {
return []string{node.Path}
}
}
selectedPaths := getPaths(selectedNode)
prevSelectedLineIdx := gui.State.Panels.Files.SelectedLineIdx
outer:
for _, prevNode := range prevNodes[prevSelectedLineIdx:] {
selectedPaths := getPaths(prevNode)
files := gui.GitCommand.GetStatusFiles(commands.GetStatusFileOptions{})
gui.State.StatusLineManager.SetFiles(files)
if err := gui.fileWatcher.addFilesToFileWatcher(files); err != nil {
return err
}
// let's try to find our file again and move the cursor to that
if selectedNode != nil {
for idx, node := range gui.State.StatusLineManager.GetAllItems() {
paths := getPaths(node)
// If you started off with a rename selected, and now it's broken in two, we want you to jump to the new file, not the old file.
// This is because the new should be in the same position as the rename was meaning less cursor jumping
foundOldFileInRename := selectedNode.File != nil && selectedNode.File.IsRename() && node.Path == selectedNode.File.PreviousName
selectedNodeHasMoved := idx != prevSelectedLineIdx && utils.StringArraysOverlap(paths, selectedPaths) && !foundOldFileInRename
if selectedNodeHasMoved {
foundOldFileInRename := prevNode.File != nil && prevNode.File.IsRename() && node.Path == prevNode.File.PreviousName
foundNode := utils.StringArraysOverlap(paths, selectedPaths) && !foundOldFileInRename
if foundNode {
gui.State.Panels.Files.SelectedLineIdx = idx
break
break outer
}
}
}
}

View File

@ -41,6 +41,10 @@ func (m *StatusLineManager) GetIndexForPath(path string) (int, bool) {
}
func (m *StatusLineManager) GetAllItems() []*models.StatusLineNode {
if m.Tree == nil {
return nil
}
return m.Tree.Flatten(m.CollapsedPaths)[1:] // ignoring root
}