Skip to content

Commit c710224

Browse files
committed
Add navigation keybindings to focused main view
1 parent 10c0e9c commit c710224

File tree

2 files changed

+113
-0
lines changed

2 files changed

+113
-0
lines changed

pkg/gui/controllers.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,7 @@ func (gui *Gui) resetHelpersAndControllers() {
181181
contextLinesController := controllers.NewContextLinesController(common)
182182
renameSimilarityThresholdController := controllers.NewRenameSimilarityThresholdController(common)
183183
verticalScrollControllerFactory := controllers.NewVerticalScrollControllerFactory(common, &gui.viewBufferManagerMap)
184+
viewSelectionControllerFactory := controllers.NewViewSelectionControllerFactory(common, &gui.viewBufferManagerMap)
184185

185186
branchesController := controllers.NewBranchesController(common)
186187
gitFlowController := controllers.NewGitFlowController(common)
@@ -327,11 +328,13 @@ func (gui *Gui) resetHelpersAndControllers() {
327328
controllers.AttachControllers(gui.State.Contexts.Normal,
328329
mainViewController,
329330
verticalScrollControllerFactory.Create(gui.State.Contexts.Normal),
331+
viewSelectionControllerFactory.Create(gui.State.Contexts.Normal),
330332
)
331333

332334
controllers.AttachControllers(gui.State.Contexts.NormalSecondary,
333335
secondaryViewController,
334336
verticalScrollControllerFactory.Create(gui.State.Contexts.NormalSecondary),
337+
viewSelectionControllerFactory.Create(gui.State.Contexts.NormalSecondary),
335338
)
336339

337340
controllers.AttachControllers(gui.State.Contexts.Files,
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
package controllers
2+
3+
import (
4+
"github.com/jesseduffield/gocui"
5+
"github.com/jesseduffield/lazygit/pkg/gui/types"
6+
"github.com/jesseduffield/lazygit/pkg/tasks"
7+
"github.com/samber/lo"
8+
)
9+
10+
type ViewSelectionControllerFactory struct {
11+
c *ControllerCommon
12+
viewBufferManagerMap *map[string]*tasks.ViewBufferManager
13+
}
14+
15+
func NewViewSelectionControllerFactory(c *ControllerCommon, viewBufferManagerMap *map[string]*tasks.ViewBufferManager) *ViewSelectionControllerFactory {
16+
return &ViewSelectionControllerFactory{
17+
c: c,
18+
viewBufferManagerMap: viewBufferManagerMap,
19+
}
20+
}
21+
22+
func (self *ViewSelectionControllerFactory) Create(context types.Context) types.IController {
23+
return &ViewSelectionController{
24+
baseController: baseController{},
25+
c: self.c,
26+
context: context,
27+
viewBufferManagerMap: self.viewBufferManagerMap,
28+
}
29+
}
30+
31+
type ViewSelectionController struct {
32+
baseController
33+
c *ControllerCommon
34+
35+
context types.Context
36+
viewBufferManagerMap *map[string]*tasks.ViewBufferManager
37+
}
38+
39+
func (self *ViewSelectionController) Context() types.Context {
40+
return self.context
41+
}
42+
43+
func (self *ViewSelectionController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding {
44+
return []*types.Binding{
45+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.PrevItem), Handler: self.handlePrevLine},
46+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.PrevItemAlt), Handler: self.handlePrevLine},
47+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.NextItem), Handler: self.handleNextLine},
48+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.NextItemAlt), Handler: self.handleNextLine},
49+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.PrevPage), Handler: self.handlePrevPage, Description: self.c.Tr.PrevPage},
50+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.NextPage), Handler: self.handleNextPage, Description: self.c.Tr.NextPage},
51+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.GotoTop), Handler: self.handleGotoTop, Description: self.c.Tr.GotoTop, Alternative: "<home>"},
52+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.GotoBottom), Handler: self.handleGotoBottom, Description: self.c.Tr.GotoBottom, Alternative: "<end>"},
53+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.GotoTopAlt), Handler: self.handleGotoTop},
54+
{Tag: "navigation", Key: opts.GetKey(opts.Config.Universal.GotoBottomAlt), Handler: self.handleGotoBottom},
55+
}
56+
}
57+
58+
func (self *ViewSelectionController) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding {
59+
return []*gocui.ViewMouseBinding{}
60+
}
61+
62+
func (self *ViewSelectionController) handleLineChange(delta int) {
63+
if delta > 0 {
64+
if manager, ok := (*self.viewBufferManagerMap)[self.context.GetViewName()]; ok {
65+
manager.ReadLines(delta)
66+
}
67+
}
68+
69+
v := self.Context().GetView()
70+
lineIdxBefore := v.CursorY() + v.OriginY()
71+
lineIdxAfter := lo.Clamp(lineIdxBefore+delta, 0, v.ViewLinesHeight()-1)
72+
if delta == -1 {
73+
checkScrollUp(self.Context().GetViewTrait(), self.c.UserConfig(), lineIdxBefore, lineIdxAfter)
74+
} else if delta == 1 {
75+
checkScrollDown(self.Context().GetViewTrait(), self.c.UserConfig(), lineIdxBefore, lineIdxAfter)
76+
}
77+
v.FocusPoint(0, lineIdxAfter)
78+
}
79+
80+
func (self *ViewSelectionController) handlePrevLine() error {
81+
self.handleLineChange(-1)
82+
return nil
83+
}
84+
85+
func (self *ViewSelectionController) handleNextLine() error {
86+
self.handleLineChange(1)
87+
return nil
88+
}
89+
90+
func (self *ViewSelectionController) handlePrevPage() error {
91+
self.handleLineChange(-self.context.GetViewTrait().PageDelta())
92+
return nil
93+
}
94+
95+
func (self *ViewSelectionController) handleNextPage() error {
96+
self.handleLineChange(self.context.GetViewTrait().PageDelta())
97+
return nil
98+
}
99+
100+
func (self *ViewSelectionController) handleGotoTop() error {
101+
v := self.Context().GetView()
102+
v.FocusPoint(0, 0)
103+
return nil
104+
}
105+
106+
func (self *ViewSelectionController) handleGotoBottom() error {
107+
v := self.Context().GetView()
108+
v.FocusPoint(0, v.ViewLinesHeight()-1)
109+
return nil
110+
}

0 commit comments

Comments
 (0)