mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-21 12:16:54 +02:00
Now that we have an error handler set, we can simply let them bubble up all the way to gocui.
123 lines
3.4 KiB
Go
123 lines
3.4 KiB
Go
package controllers
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
|
|
"github.com/jesseduffield/lazygit/pkg/gui/context"
|
|
"github.com/jesseduffield/lazygit/pkg/gui/types"
|
|
"github.com/samber/lo"
|
|
)
|
|
|
|
// This controller lets you change the context size for diffs. The 'context' in 'context size' refers to the conventional meaning of the word 'context' in a diff, as opposed to lazygit's own idea of a 'context'.
|
|
|
|
var CONTEXT_KEYS_SHOWING_DIFFS = []types.ContextKey{
|
|
context.FILES_CONTEXT_KEY,
|
|
context.COMMIT_FILES_CONTEXT_KEY,
|
|
context.STASH_CONTEXT_KEY,
|
|
context.LOCAL_COMMITS_CONTEXT_KEY,
|
|
context.SUB_COMMITS_CONTEXT_KEY,
|
|
context.STAGING_MAIN_CONTEXT_KEY,
|
|
context.STAGING_SECONDARY_CONTEXT_KEY,
|
|
context.PATCH_BUILDING_MAIN_CONTEXT_KEY,
|
|
context.PATCH_BUILDING_SECONDARY_CONTEXT_KEY,
|
|
}
|
|
|
|
type ContextLinesController struct {
|
|
baseController
|
|
c *ControllerCommon
|
|
}
|
|
|
|
var _ types.IController = &ContextLinesController{}
|
|
|
|
func NewContextLinesController(
|
|
c *ControllerCommon,
|
|
) *ContextLinesController {
|
|
return &ContextLinesController{
|
|
baseController: baseController{},
|
|
c: c,
|
|
}
|
|
}
|
|
|
|
func (self *ContextLinesController) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding {
|
|
bindings := []*types.Binding{
|
|
{
|
|
Key: opts.GetKey(opts.Config.Universal.IncreaseContextInDiffView),
|
|
Handler: self.Increase,
|
|
Description: self.c.Tr.IncreaseContextInDiffView,
|
|
Tooltip: self.c.Tr.IncreaseContextInDiffViewTooltip,
|
|
},
|
|
{
|
|
Key: opts.GetKey(opts.Config.Universal.DecreaseContextInDiffView),
|
|
Handler: self.Decrease,
|
|
Description: self.c.Tr.DecreaseContextInDiffView,
|
|
Tooltip: self.c.Tr.DecreaseContextInDiffViewTooltip,
|
|
},
|
|
}
|
|
|
|
return bindings
|
|
}
|
|
|
|
func (self *ContextLinesController) Context() types.Context {
|
|
return nil
|
|
}
|
|
|
|
func (self *ContextLinesController) Increase() error {
|
|
if self.isShowingDiff() {
|
|
if err := self.checkCanChangeContext(); err != nil {
|
|
return err
|
|
}
|
|
|
|
self.c.AppState.DiffContextSize++
|
|
return self.applyChange()
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *ContextLinesController) Decrease() error {
|
|
old_size := self.c.AppState.DiffContextSize
|
|
|
|
if self.isShowingDiff() && old_size > 1 {
|
|
if err := self.checkCanChangeContext(); err != nil {
|
|
return err
|
|
}
|
|
|
|
self.c.AppState.DiffContextSize = old_size - 1
|
|
return self.applyChange()
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *ContextLinesController) applyChange() error {
|
|
self.c.Toast(fmt.Sprintf(self.c.Tr.DiffContextSizeChanged, self.c.AppState.DiffContextSize))
|
|
self.c.SaveAppStateAndLogError()
|
|
|
|
currentContext := self.c.CurrentStaticContext()
|
|
switch currentContext.GetKey() {
|
|
// we make an exception for our staging and patch building contexts because they actually need to refresh their state afterwards.
|
|
case context.PATCH_BUILDING_MAIN_CONTEXT_KEY:
|
|
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.PATCH_BUILDING}})
|
|
case context.STAGING_MAIN_CONTEXT_KEY, context.STAGING_SECONDARY_CONTEXT_KEY:
|
|
return self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.STAGING}})
|
|
default:
|
|
return currentContext.HandleRenderToMain()
|
|
}
|
|
}
|
|
|
|
func (self *ContextLinesController) checkCanChangeContext() error {
|
|
if self.c.Git().Patch.PatchBuilder.Active() {
|
|
return errors.New(self.c.Tr.CantChangeContextSizeError)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (self *ContextLinesController) isShowingDiff() bool {
|
|
return lo.Contains(
|
|
CONTEXT_KEYS_SHOWING_DIFFS,
|
|
self.c.CurrentStaticContext().GetKey(),
|
|
)
|
|
}
|