mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-12-14 11:23:09 +02:00
79c11a0458
Previously, the current line was only moved as much as necessary so that it's in view again. This had the problem that when jumping downwards from hunk to hunk with the right-arrow key, only the first line of the new hunk was shown at the bottom of the window. I prefer to put the selected line in the middle of the view in this case, so that I can see more of the newly selected hunk. This has the consequence that when scrolling through the view line by line using down-arrow, the view jumps by half a screen whenever I reach the bottom. I can see how some users might be opposed to this change, but I happen to like it too, because it allows me to see more context of what's ahead.
139 lines
3.3 KiB
Go
139 lines
3.3 KiB
Go
package context
|
|
|
|
import (
|
|
"github.com/jesseduffield/gocui"
|
|
"github.com/jesseduffield/lazygit/pkg/gui/patch_exploring"
|
|
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
|
deadlock "github.com/sasha-s/go-deadlock"
|
|
)
|
|
|
|
type PatchExplorerContext struct {
|
|
*SimpleContext
|
|
*SearchTrait
|
|
|
|
state *patch_exploring.State
|
|
viewTrait *ViewTrait
|
|
getIncludedLineIndices func() []int
|
|
c *ContextCommon
|
|
mutex *deadlock.Mutex
|
|
}
|
|
|
|
var _ types.IPatchExplorerContext = (*PatchExplorerContext)(nil)
|
|
|
|
func NewPatchExplorerContext(
|
|
view *gocui.View,
|
|
windowName string,
|
|
key types.ContextKey,
|
|
|
|
getIncludedLineIndices func() []int,
|
|
|
|
c *ContextCommon,
|
|
) *PatchExplorerContext {
|
|
ctx := &PatchExplorerContext{
|
|
state: nil,
|
|
viewTrait: NewViewTrait(view),
|
|
c: c,
|
|
mutex: &deadlock.Mutex{},
|
|
getIncludedLineIndices: getIncludedLineIndices,
|
|
SimpleContext: NewSimpleContext(NewBaseContext(NewBaseContextOpts{
|
|
View: view,
|
|
WindowName: windowName,
|
|
Key: key,
|
|
Kind: types.MAIN_CONTEXT,
|
|
Focusable: true,
|
|
HighlightOnFocus: true,
|
|
})),
|
|
SearchTrait: NewSearchTrait(c),
|
|
}
|
|
|
|
ctx.GetView().SetOnSelectItem(ctx.SearchTrait.onSelectItemWrapper(
|
|
func(selectedLineIdx int) error {
|
|
ctx.GetMutex().Lock()
|
|
defer ctx.GetMutex().Unlock()
|
|
return ctx.NavigateTo(ctx.c.IsCurrentContext(ctx), selectedLineIdx)
|
|
}),
|
|
)
|
|
|
|
return ctx
|
|
}
|
|
|
|
func (self *PatchExplorerContext) IsPatchExplorerContext() {}
|
|
|
|
func (self *PatchExplorerContext) GetState() *patch_exploring.State {
|
|
return self.state
|
|
}
|
|
|
|
func (self *PatchExplorerContext) SetState(state *patch_exploring.State) {
|
|
self.state = state
|
|
}
|
|
|
|
func (self *PatchExplorerContext) GetViewTrait() types.IViewTrait {
|
|
return self.viewTrait
|
|
}
|
|
|
|
func (self *PatchExplorerContext) GetIncludedLineIndices() []int {
|
|
return self.getIncludedLineIndices()
|
|
}
|
|
|
|
func (self *PatchExplorerContext) RenderAndFocus(isFocused bool) error {
|
|
self.setContent(isFocused)
|
|
|
|
self.FocusSelection()
|
|
self.c.Render()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *PatchExplorerContext) Render(isFocused bool) error {
|
|
self.setContent(isFocused)
|
|
|
|
self.c.Render()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *PatchExplorerContext) Focus() error {
|
|
self.FocusSelection()
|
|
self.c.Render()
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *PatchExplorerContext) setContent(isFocused bool) {
|
|
self.GetView().SetContent(self.GetContentToRender(isFocused))
|
|
}
|
|
|
|
func (self *PatchExplorerContext) FocusSelection() {
|
|
view := self.GetView()
|
|
state := self.GetState()
|
|
_, viewHeight := view.Size()
|
|
bufferHeight := viewHeight - 1
|
|
_, origin := view.Origin()
|
|
numLines := view.LinesHeight()
|
|
|
|
newOriginY := state.CalculateOrigin(origin, bufferHeight, numLines)
|
|
|
|
_ = view.SetOriginY(newOriginY)
|
|
|
|
view.SetCursorY(state.GetSelectedLineIdx() - newOriginY)
|
|
}
|
|
|
|
func (self *PatchExplorerContext) GetContentToRender(isFocused bool) string {
|
|
if self.GetState() == nil {
|
|
return ""
|
|
}
|
|
|
|
return self.GetState().RenderForLineIndices(isFocused, self.GetIncludedLineIndices())
|
|
}
|
|
|
|
func (self *PatchExplorerContext) NavigateTo(isFocused bool, selectedLineIdx int) error {
|
|
self.GetState().SetLineSelectMode()
|
|
self.GetState().SelectLine(selectedLineIdx)
|
|
|
|
return self.RenderAndFocus(isFocused)
|
|
}
|
|
|
|
func (self *PatchExplorerContext) GetMutex() *deadlock.Mutex {
|
|
return self.mutex
|
|
}
|