mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-07-05 00:59:19 +02:00
refactor to only have one context per view
This commit is contained in:
83
vendor/github.com/jesseduffield/gocui/gui.go
generated
vendored
83
vendor/github.com/jesseduffield/gocui/gui.go
generated
vendored
@ -78,16 +78,13 @@ type ViewMouseBinding struct {
|
||||
// the view that is clicked
|
||||
ViewName string
|
||||
|
||||
// the context we are in when the click occurs. Not necessarily the context
|
||||
// of the view we're clicking. If this is blank then it is a global binding.
|
||||
FromContext string
|
||||
|
||||
// the context assigned to the clicked view. If blank, then we don't care
|
||||
// what context is assigned
|
||||
ToContext string
|
||||
// the view that has focus when the click occurs.
|
||||
FocusedView string
|
||||
|
||||
Handler func(ViewMouseBindingOpts) error
|
||||
|
||||
Modifier Modifier
|
||||
|
||||
// must be a mouse key
|
||||
Key Key
|
||||
}
|
||||
@ -191,8 +188,6 @@ type Gui struct {
|
||||
screen tcell.Screen
|
||||
suspendedMutex sync.Mutex
|
||||
suspended bool
|
||||
|
||||
currentContext string
|
||||
}
|
||||
|
||||
// NewGui returns a new Gui object with a given output mode.
|
||||
@ -268,10 +263,6 @@ func (g *Gui) Size() (x, y int) {
|
||||
return g.maxX, g.maxY
|
||||
}
|
||||
|
||||
func (g *Gui) SetCurrentContext(context string) {
|
||||
g.currentContext = context
|
||||
}
|
||||
|
||||
// SetRune writes a rune at the given point, relative to the top-left
|
||||
// corner of the terminal. It checks if the position is valid and applies
|
||||
// the given colors.
|
||||
@ -370,6 +361,45 @@ func (g *Gui) SetViewOnBottom(name string) (*View, error) {
|
||||
return nil, errors.Wrap(ErrUnknownView, 0)
|
||||
}
|
||||
|
||||
func (g *Gui) SetViewOnTopOf(toMove string, other string) error {
|
||||
g.Mutexes.ViewsMutex.Lock()
|
||||
defer g.Mutexes.ViewsMutex.Unlock()
|
||||
|
||||
if toMove == other {
|
||||
return nil
|
||||
}
|
||||
|
||||
// need to find the two current positions and then move toMove before other in the list.
|
||||
toMoveIndex := -1
|
||||
otherIndex := -1
|
||||
|
||||
for i, v := range g.views {
|
||||
if v.name == toMove {
|
||||
toMoveIndex = i
|
||||
}
|
||||
|
||||
if v.name == other {
|
||||
otherIndex = i
|
||||
}
|
||||
}
|
||||
|
||||
if toMoveIndex == -1 || otherIndex == -1 {
|
||||
return errors.Wrap(ErrUnknownView, 0)
|
||||
}
|
||||
|
||||
// already on top
|
||||
if toMoveIndex > otherIndex {
|
||||
return nil
|
||||
}
|
||||
|
||||
// need to actually do it the other way around. Last is highest
|
||||
viewToMove := g.views[toMoveIndex]
|
||||
|
||||
g.views = append(g.views[:toMoveIndex], g.views[toMoveIndex+1:]...)
|
||||
g.views = append(g.views[:otherIndex], append([]*View{viewToMove}, g.views[otherIndex:]...)...)
|
||||
return nil
|
||||
}
|
||||
|
||||
// Views returns all the views in the GUI.
|
||||
func (g *Gui) Views() []*View {
|
||||
return g.views
|
||||
@ -470,7 +500,7 @@ func (g *Gui) CurrentView() *View {
|
||||
// It behaves differently on different platforms. Somewhere it doesn't register Alt key press,
|
||||
// on others it might report Ctrl as Alt. It's not consistent and therefore it's not recommended
|
||||
// to use with mouse keys.
|
||||
func (g *Gui) SetKeybinding(viewname string, contexts []string, key interface{}, mod Modifier, handler func(*Gui, *View) error) error {
|
||||
func (g *Gui) SetKeybinding(viewname string, key interface{}, mod Modifier, handler func(*Gui, *View) error) error {
|
||||
var kb *keybinding
|
||||
|
||||
k, ch, err := getKey(key)
|
||||
@ -482,7 +512,7 @@ func (g *Gui) SetKeybinding(viewname string, contexts []string, key interface{},
|
||||
return ErrBlacklisted
|
||||
}
|
||||
|
||||
kb = newKeybinding(viewname, contexts, k, ch, mod, handler)
|
||||
kb = newKeybinding(viewname, k, ch, mod, handler)
|
||||
g.keybindings = append(g.keybindings, kb)
|
||||
return nil
|
||||
}
|
||||
@ -1181,7 +1211,7 @@ func (g *Gui) onKey(ev *GocuiEvent) error {
|
||||
return err
|
||||
}
|
||||
|
||||
if ev.Mod == ModNone && IsMouseKey(ev.Key) {
|
||||
if IsMouseKey(ev.Key) {
|
||||
opts := ViewMouseBindingOpts{X: newCx + v.ox, Y: newCy + v.oy}
|
||||
matched, err := g.execMouseKeybindings(v, ev, opts)
|
||||
if err != nil {
|
||||
@ -1202,18 +1232,20 @@ func (g *Gui) onKey(ev *GocuiEvent) error {
|
||||
|
||||
func (g *Gui) execMouseKeybindings(view *View, ev *GocuiEvent, opts ViewMouseBindingOpts) (bool, error) {
|
||||
isMatch := func(binding *ViewMouseBinding) bool {
|
||||
return binding.ViewName == view.Name() && ev.Key == binding.Key && (binding.ToContext == "" || binding.ToContext == view.Context)
|
||||
return binding.ViewName == view.Name() &&
|
||||
ev.Key == binding.Key &&
|
||||
ev.Mod == binding.Modifier
|
||||
}
|
||||
|
||||
// first pass looks for ones that match both the view and the from context
|
||||
// first pass looks for ones that match the focused view
|
||||
for _, binding := range g.viewMouseBindings {
|
||||
if isMatch(binding) && binding.FromContext != "" && binding.FromContext == g.currentContext {
|
||||
if isMatch(binding) && binding.FocusedView != "" && binding.FocusedView == g.currentView.Name() {
|
||||
return true, binding.Handler(opts)
|
||||
}
|
||||
}
|
||||
|
||||
for _, binding := range g.viewMouseBindings {
|
||||
if isMatch(binding) && binding.FromContext == "" {
|
||||
if isMatch(binding) && binding.FocusedView == "" {
|
||||
return true, binding.Handler(opts)
|
||||
}
|
||||
}
|
||||
@ -1485,14 +1517,5 @@ func (g *Gui) matchView(v *View, kb *keybinding) bool {
|
||||
if kb.viewName != v.name {
|
||||
return false
|
||||
}
|
||||
// if the keybinding doesn't specify contexts, it applies for all contexts
|
||||
if len(kb.contexts) == 0 {
|
||||
return true
|
||||
}
|
||||
for _, context := range kb.contexts {
|
||||
if context == v.Context {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
return true
|
||||
}
|
||||
|
4
vendor/github.com/jesseduffield/gocui/keybinding.go
generated
vendored
4
vendor/github.com/jesseduffield/gocui/keybinding.go
generated
vendored
@ -20,7 +20,6 @@ type Modifier tcell.ModMask
|
||||
// Keybidings are used to link a given key-press event with a handler.
|
||||
type keybinding struct {
|
||||
viewName string
|
||||
contexts []string
|
||||
key Key
|
||||
ch rune
|
||||
mod Modifier
|
||||
@ -93,10 +92,9 @@ func MustParseAll(input []string) map[interface{}]Modifier {
|
||||
}
|
||||
|
||||
// newKeybinding returns a new Keybinding object.
|
||||
func newKeybinding(viewname string, contexts []string, key Key, ch rune, mod Modifier, handler func(*Gui, *View) error) (kb *keybinding) {
|
||||
func newKeybinding(viewname string, key Key, ch rune, mod Modifier, handler func(*Gui, *View) error) (kb *keybinding) {
|
||||
kb = &keybinding{
|
||||
viewName: viewname,
|
||||
contexts: contexts,
|
||||
key: key,
|
||||
ch: ch,
|
||||
mod: mod,
|
||||
|
2
vendor/github.com/jesseduffield/gocui/view.go
generated
vendored
2
vendor/github.com/jesseduffield/gocui/view.go
generated
vendored
@ -146,8 +146,6 @@ type View struct {
|
||||
// ParentView is the view which catches events bubbled up from the given view if there's no matching handler
|
||||
ParentView *View
|
||||
|
||||
Context string // this is for assigning keybindings to a view only in certain contexts
|
||||
|
||||
searcher *searcher
|
||||
|
||||
// KeybindOnEdit should be set to true when you want to execute keybindings even when the view is editable
|
||||
|
Reference in New Issue
Block a user