mirror of
				https://github.com/jesseduffield/lazygit.git
				synced 2025-10-31 02:25:35 +03:00 
			
		
		
		
	These are never called on the context, they only exist to satisfy the HasKeybindings interface. But that's wrong, HasKeybindings has nothing to do with focus handling or rendering the main view. Remove them from that interface and add them to IController instead.
		
			
				
	
	
		
			219 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			5.8 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package context
 | |
| 
 | |
| import (
 | |
| 	"github.com/jesseduffield/gocui"
 | |
| 	"github.com/jesseduffield/lazygit/pkg/gui/types"
 | |
| )
 | |
| 
 | |
| type BaseContext struct {
 | |
| 	kind            types.ContextKind
 | |
| 	key             types.ContextKey
 | |
| 	view            *gocui.View
 | |
| 	viewTrait       types.IViewTrait
 | |
| 	windowName      string
 | |
| 	onGetOptionsMap func() map[string]string
 | |
| 
 | |
| 	keybindingsFns           []types.KeybindingsFn
 | |
| 	mouseKeybindingsFns      []types.MouseKeybindingsFn
 | |
| 	onClickFn                func() error
 | |
| 	onClickFocusedMainViewFn onClickFocusedMainViewFn
 | |
| 	onRenderToMainFn         func()
 | |
| 	onFocusFn                onFocusFn
 | |
| 	onFocusLostFn            onFocusLostFn
 | |
| 
 | |
| 	focusable                   bool
 | |
| 	transient                   bool
 | |
| 	hasControlledBounds         bool
 | |
| 	needsRerenderOnWidthChange  types.NeedsRerenderOnWidthChangeLevel
 | |
| 	needsRerenderOnHeightChange bool
 | |
| 	highlightOnFocus            bool
 | |
| 
 | |
| 	*ParentContextMgr
 | |
| }
 | |
| 
 | |
| type (
 | |
| 	onFocusFn                = func(types.OnFocusOpts)
 | |
| 	onFocusLostFn            = func(types.OnFocusLostOpts)
 | |
| 	onClickFocusedMainViewFn = func(mainViewName string, clickedLineIdx int) error
 | |
| )
 | |
| 
 | |
| var _ types.IBaseContext = &BaseContext{}
 | |
| 
 | |
| type NewBaseContextOpts struct {
 | |
| 	Kind                        types.ContextKind
 | |
| 	Key                         types.ContextKey
 | |
| 	View                        *gocui.View
 | |
| 	WindowName                  string
 | |
| 	Focusable                   bool
 | |
| 	Transient                   bool
 | |
| 	HasUncontrolledBounds       bool // negating for the sake of making false the default
 | |
| 	HighlightOnFocus            bool
 | |
| 	NeedsRerenderOnWidthChange  types.NeedsRerenderOnWidthChangeLevel
 | |
| 	NeedsRerenderOnHeightChange bool
 | |
| 
 | |
| 	OnGetOptionsMap func() map[string]string
 | |
| }
 | |
| 
 | |
| func NewBaseContext(opts NewBaseContextOpts) *BaseContext {
 | |
| 	viewTrait := NewViewTrait(opts.View)
 | |
| 
 | |
| 	hasControlledBounds := !opts.HasUncontrolledBounds
 | |
| 
 | |
| 	return &BaseContext{
 | |
| 		kind:                        opts.Kind,
 | |
| 		key:                         opts.Key,
 | |
| 		view:                        opts.View,
 | |
| 		windowName:                  opts.WindowName,
 | |
| 		onGetOptionsMap:             opts.OnGetOptionsMap,
 | |
| 		focusable:                   opts.Focusable,
 | |
| 		transient:                   opts.Transient,
 | |
| 		hasControlledBounds:         hasControlledBounds,
 | |
| 		highlightOnFocus:            opts.HighlightOnFocus,
 | |
| 		needsRerenderOnWidthChange:  opts.NeedsRerenderOnWidthChange,
 | |
| 		needsRerenderOnHeightChange: opts.NeedsRerenderOnHeightChange,
 | |
| 		ParentContextMgr:            &ParentContextMgr{},
 | |
| 		viewTrait:                   viewTrait,
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetOptionsMap() map[string]string {
 | |
| 	if self.onGetOptionsMap != nil {
 | |
| 		return self.onGetOptionsMap()
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) SetWindowName(windowName string) {
 | |
| 	self.windowName = windowName
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetWindowName() string {
 | |
| 	return self.windowName
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetViewName() string {
 | |
| 	// for the sake of the global context which has no view
 | |
| 	if self.view == nil {
 | |
| 		return ""
 | |
| 	}
 | |
| 
 | |
| 	return self.view.Name()
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetView() *gocui.View {
 | |
| 	return self.view
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetViewTrait() types.IViewTrait {
 | |
| 	return self.viewTrait
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetKind() types.ContextKind {
 | |
| 	return self.kind
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetKey() types.ContextKey {
 | |
| 	return self.key
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetKeybindings(opts types.KeybindingsOpts) []*types.Binding {
 | |
| 	bindings := []*types.Binding{}
 | |
| 	for i := range self.keybindingsFns {
 | |
| 		// the first binding in the bindings array takes precedence but we want the
 | |
| 		// last keybindingsFn to take precedence to we add them in reverse
 | |
| 		bindings = append(bindings, self.keybindingsFns[len(self.keybindingsFns)-1-i](opts)...)
 | |
| 	}
 | |
| 
 | |
| 	return bindings
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) AddKeybindingsFn(fn types.KeybindingsFn) {
 | |
| 	self.keybindingsFns = append(self.keybindingsFns, fn)
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) AddMouseKeybindingsFn(fn types.MouseKeybindingsFn) {
 | |
| 	self.mouseKeybindingsFns = append(self.mouseKeybindingsFns, fn)
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) ClearAllBindingsFn() {
 | |
| 	self.keybindingsFns = []types.KeybindingsFn{}
 | |
| 	self.mouseKeybindingsFns = []types.MouseKeybindingsFn{}
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) AddOnClickFn(fn func() error) {
 | |
| 	if fn != nil {
 | |
| 		self.onClickFn = fn
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) AddOnClickFocusedMainViewFn(fn onClickFocusedMainViewFn) {
 | |
| 	if fn != nil {
 | |
| 		self.onClickFocusedMainViewFn = fn
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetOnClick() func() error {
 | |
| 	return self.onClickFn
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetOnClickFocusedMainView() onClickFocusedMainViewFn {
 | |
| 	return self.onClickFocusedMainViewFn
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) AddOnRenderToMainFn(fn func()) {
 | |
| 	if fn != nil {
 | |
| 		self.onRenderToMainFn = fn
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) AddOnFocusFn(fn onFocusFn) {
 | |
| 	if fn != nil {
 | |
| 		self.onFocusFn = fn
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) AddOnFocusLostFn(fn onFocusLostFn) {
 | |
| 	if fn != nil {
 | |
| 		self.onFocusLostFn = fn
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) GetMouseKeybindings(opts types.KeybindingsOpts) []*gocui.ViewMouseBinding {
 | |
| 	bindings := []*gocui.ViewMouseBinding{}
 | |
| 	for i := range self.mouseKeybindingsFns {
 | |
| 		// the first binding in the bindings array takes precedence but we want the
 | |
| 		// last keybindingsFn to take precedence to we add them in reverse
 | |
| 		bindings = append(bindings, self.mouseKeybindingsFns[len(self.mouseKeybindingsFns)-1-i](opts)...)
 | |
| 	}
 | |
| 
 | |
| 	return bindings
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) IsFocusable() bool {
 | |
| 	return self.focusable
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) IsTransient() bool {
 | |
| 	return self.transient
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) HasControlledBounds() bool {
 | |
| 	return self.hasControlledBounds
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) NeedsRerenderOnWidthChange() types.NeedsRerenderOnWidthChangeLevel {
 | |
| 	return self.needsRerenderOnWidthChange
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) NeedsRerenderOnHeightChange() bool {
 | |
| 	return self.needsRerenderOnHeightChange
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) Title() string {
 | |
| 	return ""
 | |
| }
 | |
| 
 | |
| func (self *BaseContext) TotalContentHeight() int {
 | |
| 	return self.view.ViewLinesHeight()
 | |
| }
 |