summaryrefslogtreecommitdiffstats
path: root/pkg/gui/line_by_line_panel.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gui/line_by_line_panel.go')
-rw-r--r--pkg/gui/line_by_line_panel.go82
1 files changed, 72 insertions, 10 deletions
diff --git a/pkg/gui/line_by_line_panel.go b/pkg/gui/line_by_line_panel.go
index f36441823..3ad105b0c 100644
--- a/pkg/gui/line_by_line_panel.go
+++ b/pkg/gui/line_by_line_panel.go
@@ -21,7 +21,7 @@ const (
// returns whether the patch is empty so caller can escape if necessary
// both diffs should be non-coloured because we'll parse them and colour them here
-func (gui *Gui) refreshLineByLinePanel(diff string, secondaryDiff string, secondaryFocused bool) (bool, error) {
+func (gui *Gui) refreshLineByLinePanel(diff string, secondaryDiff string, secondaryFocused bool, selectedLineIdx int) (bool, error) {
state := gui.State.Panels.LineByLine
patchParser, err := commands.NewPatchParser(gui.Log, diff)
@@ -33,11 +33,14 @@ func (gui *Gui) refreshLineByLinePanel(diff string, secondaryDiff string, second
return true, nil
}
- var selectedLineIdx int
var firstLineIdx int
var lastLineIdx int
selectMode := LINE
- if state != nil {
+ // if we have clicked from the outside to focus the main view we'll pass in a non-negative line index so that we can instantly select that line
+ if selectedLineIdx >= 0 {
+ selectMode = RANGE
+ firstLineIdx, lastLineIdx = selectedLineIdx, selectedLineIdx
+ } else if state != nil {
if state.SelectMode == HUNK {
// this is tricky: we need to find out which hunk we just staged based on our old `state.PatchParser` (as opposed to the new `patchParser`)
// we do this by getting the first line index of the original hunk, then
@@ -96,20 +99,25 @@ func (gui *Gui) handleSelectPrevLine(g *gocui.Gui, v *gocui.View) error {
}
func (gui *Gui) handleSelectNextLine(g *gocui.Gui, v *gocui.View) error {
- return gui.handleCycleLine(1)
+ return gui.handleCycleLine(+1)
}
func (gui *Gui) handleSelectPrevHunk(g *gocui.Gui, v *gocui.View) error {
- return gui.handleCycleHunk(-1)
+ state := gui.State.Panels.LineByLine
+ newHunk := state.PatchParser.GetHunkContainingLine(state.SelectedLineIdx, -1)
+
+ return gui.selectNewHunk(newHunk)
}
func (gui *Gui) handleSelectNextHunk(g *gocui.Gui, v *gocui.View) error {
- return gui.handleCycleHunk(1)
+ state := gui.State.Panels.LineByLine
+ newHunk := state.PatchParser.GetHunkContainingLine(state.SelectedLineIdx, 1)
+
+ return gui.selectNewHunk(newHunk)
}
-func (gui *Gui) handleCycleHunk(change int) error {
+func (gui *Gui) selectNewHunk(newHunk *commands.PatchHunk) error {
state := gui.State.Panels.LineByLine
- newHunk := state.PatchParser.GetHunkContainingLine(state.SelectedLineIdx, change)
state.SelectedLineIdx = state.PatchParser.GetNextStageableLineIndex(newHunk.FirstLineIdx)
if state.SelectMode == HUNK {
state.FirstLineIdx, state.LastLineIdx = newHunk.FirstLineIdx, newHunk.LastLineIdx
@@ -128,10 +136,16 @@ func (gui *Gui) handleCycleLine(change int) error {
state := gui.State.Panels.LineByLine
if state.SelectMode == HUNK {
- return gui.handleCycleHunk(change)
+ newHunk := state.PatchParser.GetHunkContainingLine(state.SelectedLineIdx, change)
+ return gui.selectNewHunk(newHunk)
}
- newSelectedLineIdx := state.SelectedLineIdx + change
+ return gui.handleSelectNewLine(state.SelectedLineIdx + change)
+}
+
+func (gui *Gui) handleSelectNewLine(newSelectedLineIdx int) error {
+ state := gui.State.Panels.LineByLine
+
if newSelectedLineIdx < 0 {
newSelectedLineIdx = 0
} else if newSelectedLineIdx > len(state.PatchParser.PatchLines)-1 {
@@ -158,6 +172,54 @@ func (gui *Gui) handleCycleLine(change int) error {
return gui.focusSelection(false)
}
+func (gui *Gui) handleMouseDown(g *gocui.Gui, v *gocui.View) error {
+ state := gui.State.Panels.LineByLine
+
+ if gui.popupPanelFocused() {
+ return nil
+ }
+
+ newSelectedLineIdx := v.SelectedLineIdx()
+ state.FirstLineIdx = newSelectedLineIdx
+ state.LastLineIdx = newSelectedLineIdx
+
+ state.SelectMode = RANGE
+
+ return gui.handleSelectNewLine(newSelectedLineIdx)
+}
+
+func (gui *Gui) handleMouseDrag(g *gocui.Gui, v *gocui.View) error {
+ if gui.popupPanelFocused() {
+ return nil
+ }
+
+ return gui.handleSelectNewLine(v.SelectedLineIdx())
+}
+
+func (gui *Gui) handleMouseScrollUp(g *gocui.Gui, v *gocui.View) error {
+ state := gui.State.Panels.LineByLine
+
+ if gui.popupPanelFocused() {
+ return nil
+ }
+
+ state.SelectMode = LINE
+
+ return gui.handleCycleLine(-1)
+}
+
+func (gui *Gui) handleMouseScrollDown(g *gocui.Gui, v *gocui.View) error {
+ state := gui.State.Panels.LineByLine
+
+ if gui.popupPanelFocused() {
+ return nil
+ }
+
+ state.SelectMode = LINE
+
+ return gui.handleCycleLine(1)
+}
+
func (gui *Gui) refreshMainView() error {
state := gui.State.Panels.LineByLine