summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2019-01-15 20:12:31 +1100
committerJesse Duffield <jessedduffield@gmail.com>2019-01-18 09:32:15 +1100
commit3a607061a2303d9f45d308de652fbebe7300b43c (patch)
tree594c779bda9c1b9e078ff12f710c6daf5db78e45
parent695b092c4120d41c15ad969a6ea472e38379ebbd (diff)
Only reset origin in main view when handling the selection of a new filev0.6
-rw-r--r--pkg/gui/files_panel.go26
-rw-r--r--pkg/gui/gui.go2
-rw-r--r--pkg/gui/view_helpers.go32
3 files changed, 34 insertions, 26 deletions
diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go
index a89138161..f66cabe4a 100644
--- a/pkg/gui/files_panel.go
+++ b/pkg/gui/files_panel.go
@@ -26,7 +26,7 @@ func (gui *Gui) getSelectedFile(g *gocui.Gui) (*commands.File, error) {
return gui.State.Files[selectedLine], nil
}
-func (gui *Gui) handleFileSelect(g *gocui.Gui, v *gocui.View) error {
+func (gui *Gui) handleFileSelect(g *gocui.Gui, v *gocui.View, alreadySelected bool) error {
file, err := gui.getSelectedFile(g)
if err != nil {
if err != gui.Errors.ErrNoFiles {
@@ -44,10 +44,18 @@ func (gui *Gui) handleFileSelect(g *gocui.Gui, v *gocui.View) error {
}
content := gui.GitCommand.Diff(file, false)
+ if alreadySelected {
+ g.Update(func(*gocui.Gui) error {
+ return gui.setViewContent(gui.g, gui.getMainView(gui.g), content)
+ })
+ return nil
+ }
return gui.renderString(g, "main", content)
}
func (gui *Gui) refreshFiles(g *gocui.Gui) error {
+ selectedFile, _ := gui.getSelectedFile(gui.g)
+
filesView, err := g.View("files")
if err != nil {
return err
@@ -64,7 +72,9 @@ func (gui *Gui) refreshFiles(g *gocui.Gui) error {
fmt.Fprint(filesView, list)
if filesView == g.CurrentView() {
- return gui.handleFileSelect(g, filesView)
+ newSelectedFile, _ := gui.getSelectedFile(gui.g)
+ alreadySelected := newSelectedFile.Name == selectedFile.Name
+ return gui.handleFileSelect(g, filesView, alreadySelected)
}
return nil
})
@@ -76,14 +86,14 @@ func (gui *Gui) handleFilesNextLine(g *gocui.Gui, v *gocui.View) error {
panelState := gui.State.Panels.Files
gui.changeSelectedLine(&panelState.SelectedLine, len(gui.State.Files), false)
- return gui.handleFileSelect(gui.g, v)
+ return gui.handleFileSelect(gui.g, v, false)
}
func (gui *Gui) handleFilesPrevLine(g *gocui.Gui, v *gocui.View) error {
panelState := gui.State.Panels.Files
gui.changeSelectedLine(&panelState.SelectedLine, len(gui.State.Files), true)
- return gui.handleFileSelect(gui.g, v)
+ return gui.handleFileSelect(gui.g, v, false)
}
// specific functions
@@ -163,7 +173,7 @@ func (gui *Gui) handleFilePress(g *gocui.Gui, v *gocui.View) error {
return err
}
- return gui.handleFileSelect(g, v)
+ return gui.handleFileSelect(g, v, true)
}
func (gui *Gui) allFilesStaged() bool {
@@ -186,11 +196,7 @@ func (gui *Gui) handleStageAll(g *gocui.Gui, v *gocui.View) error {
_ = gui.createErrorPanel(g, err.Error())
}
- if err := gui.refreshFiles(g); err != nil {
- return err
- }
-
- return gui.handleFileSelect(g, v)
+ return gui.refreshFiles(g)
}
func (gui *Gui) handleAddPatch(g *gocui.Gui, v *gocui.View) error {
diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go
index 8ead65be3..ed7cfba0f 100644
--- a/pkg/gui/gui.go
+++ b/pkg/gui/gui.go
@@ -462,7 +462,7 @@ func (gui *Gui) updateLoader(g *gocui.Gui) error {
content := gui.trimmedContent(view)
if strings.Contains(content, "...") {
staticContent := strings.Split(content, "...")[0] + "..."
- if err := gui.synchronousRenderString(g, "confirmation", staticContent+" "+utils.Loader()); err != nil {
+ if err := gui.setViewContent(g, view, staticContent+" "+utils.Loader()); err != nil {
return err
}
}
diff --git a/pkg/gui/view_helpers.go b/pkg/gui/view_helpers.go
index a88f6ce3d..7979d5e9b 100644
--- a/pkg/gui/view_helpers.go
+++ b/pkg/gui/view_helpers.go
@@ -90,7 +90,7 @@ func (gui *Gui) newLineFocused(g *gocui.Gui, v *gocui.View) error {
case "status":
return gui.handleStatusSelect(g, v)
case "files":
- return gui.handleFileSelect(g, v)
+ return gui.handleFileSelect(g, v, false)
case "branches":
return gui.handleBranchSelect(g, v)
case "commits":
@@ -222,26 +222,28 @@ func (gui *Gui) focusPoint(cx int, cy int, v *gocui.View) error {
return nil
}
-func (gui *Gui) synchronousRenderString(g *gocui.Gui, viewName, s string) error {
- v, err := g.View(viewName)
- // just in case the view disappeared as this function was called, we'll
- // silently return if it's not found
- if err != nil {
- return nil
- }
- v.Clear()
- if err := v.SetOrigin(0, 0); err != nil {
- return err
- }
+func (gui *Gui) cleanString(s string) string {
output := string(bom.Clean([]byte(s)))
- output = utils.NormalizeLinefeeds(output)
- fmt.Fprint(v, output)
+ return utils.NormalizeLinefeeds(output)
+}
+
+func (gui *Gui) setViewContent(g *gocui.Gui, v *gocui.View, s string) error {
+ v.Clear()
+ fmt.Fprint(v, gui.cleanString(s))
return nil
}
+// renderString resets the origin of a view and sets its content
func (gui *Gui) renderString(g *gocui.Gui, viewName, s string) error {
g.Update(func(*gocui.Gui) error {
- return gui.synchronousRenderString(gui.g, viewName, s)
+ v, err := g.View(viewName)
+ if err != nil {
+ return nil // return gracefully if view has been deleted
+ }
+ if err := v.SetOrigin(0, 0); err != nil {
+ return err
+ }
+ return gui.setViewContent(gui.g, v, s)
})
return nil
}