mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-25 12:24:47 +02:00
So far, lines in the view corresponded 1:1 to lines in the patch. Once we turn on wrapping for the staging view (which we don't do yet), this is no longer true, so we need to convert from view lines to patch lines or vice versa all over the place.
143 lines
3.4 KiB
Go
143 lines
3.4 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)
|
|
_ types.ISearchableContext = (*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()
|
|
ctx.NavigateTo(selectedLineIdx)
|
|
return nil
|
|
}),
|
|
)
|
|
|
|
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() {
|
|
self.setContent()
|
|
|
|
self.FocusSelection()
|
|
self.c.Render()
|
|
}
|
|
|
|
func (self *PatchExplorerContext) Render() {
|
|
self.setContent()
|
|
|
|
self.c.Render()
|
|
}
|
|
|
|
func (self *PatchExplorerContext) Focus() {
|
|
self.FocusSelection()
|
|
self.c.Render()
|
|
}
|
|
|
|
func (self *PatchExplorerContext) setContent() {
|
|
self.GetView().SetContent(self.GetContentToRender())
|
|
}
|
|
|
|
func (self *PatchExplorerContext) FocusSelection() {
|
|
view := self.GetView()
|
|
state := self.GetState()
|
|
bufferHeight := view.InnerHeight()
|
|
_, origin := view.Origin()
|
|
numLines := view.ViewLinesHeight()
|
|
|
|
newOriginY := state.CalculateOrigin(origin, bufferHeight, numLines)
|
|
|
|
view.SetOriginY(newOriginY)
|
|
|
|
startIdx, endIdx := state.SelectedViewRange()
|
|
// As far as the view is concerned, we are always selecting a range
|
|
view.SetRangeSelectStart(startIdx)
|
|
view.SetCursorY(endIdx - newOriginY)
|
|
}
|
|
|
|
func (self *PatchExplorerContext) GetContentToRender() string {
|
|
if self.GetState() == nil {
|
|
return ""
|
|
}
|
|
|
|
return self.GetState().RenderForLineIndices(self.GetIncludedLineIndices())
|
|
}
|
|
|
|
func (self *PatchExplorerContext) NavigateTo(selectedLineIdx int) {
|
|
self.GetState().SetLineSelectMode()
|
|
self.GetState().SelectLine(selectedLineIdx)
|
|
|
|
self.RenderAndFocus()
|
|
}
|
|
|
|
func (self *PatchExplorerContext) GetMutex() *deadlock.Mutex {
|
|
return self.mutex
|
|
}
|
|
|
|
func (self *PatchExplorerContext) ModelSearchResults(searchStr string, caseSensitive bool) []gocui.SearchPosition {
|
|
return nil
|
|
}
|