1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-02-03 13:21:56 +02:00

generalise popup menu panel

This commit is contained in:
Jesse Duffield 2018-09-18 21:07:25 +10:00
parent f89bc10af1
commit b384fcf6af
4 changed files with 73 additions and 60 deletions

View File

@ -83,7 +83,6 @@ type guiState struct {
EditHistory *stack.Stack EditHistory *stack.Stack
Platform commands.Platform Platform commands.Platform
Updating bool Updating bool
Keys []*Binding
} }
// NewGui builds a new gui handler // NewGui builds a new gui handler

View File

@ -93,7 +93,7 @@ func (gui *Gui) GetKeybindings() []*Binding {
ViewName: "", ViewName: "",
Key: 'x', Key: 'x',
Modifier: gocui.ModNone, Modifier: gocui.ModNone,
Handler: gui.handleMenu, Handler: gui.handleCreateOptionsMenu,
}, { }, {
ViewName: "status", ViewName: "status",
Key: 'e', Key: 'e',
@ -369,11 +369,6 @@ func (gui *Gui) GetKeybindings() []*Binding {
Key: 'q', Key: 'q',
Modifier: gocui.ModNone, Modifier: gocui.ModNone,
Handler: gui.handleMenuClose, Handler: gui.handleMenuClose,
}, {
ViewName: "menu",
Key: gocui.KeySpace,
Modifier: gocui.ModNone,
Handler: gui.handleMenuPress,
}, },
} }

View File

@ -8,21 +8,6 @@ import (
"github.com/jesseduffield/lazygit/pkg/utils" "github.com/jesseduffield/lazygit/pkg/utils"
) )
func (gui *Gui) handleMenuPress(g *gocui.Gui, v *gocui.View) error {
lineNumber := gui.getItemPosition(v)
if gui.State.Keys[lineNumber].Key == nil {
return nil
}
if len(gui.State.Keys) > lineNumber {
err := gui.handleMenuClose(g, v)
if err != nil {
return err
}
return gui.State.Keys[lineNumber].Handler(g, v)
}
return nil
}
func (gui *Gui) handleMenuSelect(g *gocui.Gui, v *gocui.View) error { func (gui *Gui) handleMenuSelect(g *gocui.Gui, v *gocui.View) error {
// doing nothing for now // doing nothing for now
// but it is needed for switch in newLineFocused // but it is needed for switch in newLineFocused
@ -39,9 +24,9 @@ func (gui *Gui) renderMenuOptions(g *gocui.Gui) error {
} }
func (gui *Gui) handleMenuClose(g *gocui.Gui, v *gocui.View) error { func (gui *Gui) handleMenuClose(g *gocui.Gui, v *gocui.View) error {
// better to delete because for example after closing update confirmation panel, if err := g.DeleteKeybinding("menu", gocui.KeySpace, gocui.ModNone); err != nil {
// the focus isn't set back to any of panels and one is unable to even quit return err
//_, err := g.SetViewOnBottom(v.Name()) }
err := g.DeleteView("menu") err := g.DeleteView("menu")
if err != nil { if err != nil {
return err return err
@ -49,55 +34,38 @@ func (gui *Gui) handleMenuClose(g *gocui.Gui, v *gocui.View) error {
return gui.returnFocus(g, v) return gui.returnFocus(g, v)
} }
func (gui *Gui) getBindings(v *gocui.View) []*Binding { func (gui *Gui) createMenu(items interface{}, handlePress func(int) error) error {
var ( list, err := utils.RenderList(items)
bindingsGlobal, bindingsPanel []*Binding
)
bindings := gui.GetKeybindings()
for _, binding := range bindings {
if binding.GetKey() != "" && binding.Description != "" {
switch binding.ViewName {
case "":
bindingsGlobal = append(bindingsGlobal, binding)
case v.Name():
bindingsPanel = append(bindingsPanel, binding)
}
}
}
// append dummy element to have a separator between
// panel and global keybindings
bindingsPanel = append(bindingsPanel, &Binding{})
return append(bindingsPanel, bindingsGlobal...)
}
func (gui *Gui) handleMenu(g *gocui.Gui, v *gocui.View) error {
gui.State.Keys = gui.getBindings(v)
list, err := utils.RenderList(gui.State.Keys)
if err != nil { if err != nil {
return err return err
} }
x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(g, list) x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(gui.g, list)
menuView, _ := g.SetView("menu", x0, y0, x1, y1, 0) menuView, _ := gui.g.SetView("menu", x0, y0, x1, y1, 0)
menuView.Title = strings.Title(gui.Tr.SLocalize("menu")) menuView.Title = strings.Title(gui.Tr.SLocalize("menu"))
menuView.FgColor = gocui.ColorWhite menuView.FgColor = gocui.ColorWhite
menuView.Clear() menuView.Clear()
fmt.Fprint(menuView, list) fmt.Fprint(menuView, list)
if err := gui.renderMenuOptions(g); err != nil { if err := gui.renderMenuOptions(gui.g); err != nil {
return err return err
} }
g.Update(func(g *gocui.Gui) error { wrappedHandlePress := func(g *gocui.Gui, v *gocui.View) error {
_, err := g.SetViewOnTop("menu") lineNumber := gui.getItemPosition(v)
if err != nil { return handlePress(lineNumber)
}
if err := gui.g.SetKeybinding("menu", gocui.KeySpace, gocui.ModNone, wrappedHandlePress); err != nil {
return err
}
gui.g.Update(func(g *gocui.Gui) error {
if _, err := g.SetViewOnTop("menu"); err != nil {
return err return err
} }
return gui.switchFocus(g, v, menuView) currentView := gui.g.CurrentView()
return gui.switchFocus(gui.g, currentView, menuView)
}) })
return nil return nil
} }

View File

@ -0,0 +1,51 @@
package gui
import (
"errors"
"github.com/jesseduffield/gocui"
)
func (gui *Gui) getBindings(v *gocui.View) []*Binding {
var (
bindingsGlobal, bindingsPanel []*Binding
)
bindings := gui.GetKeybindings()
for _, binding := range bindings {
if binding.GetKey() != "" && binding.Description != "" {
switch binding.ViewName {
case "":
bindingsGlobal = append(bindingsGlobal, binding)
case v.Name():
bindingsPanel = append(bindingsPanel, binding)
}
}
}
// append dummy element to have a separator between
// panel and global keybindings
bindingsPanel = append(bindingsPanel, &Binding{})
return append(bindingsPanel, bindingsGlobal...)
}
func (gui *Gui) handleCreateOptionsMenu(g *gocui.Gui, v *gocui.View) error {
bindings := gui.getBindings(v)
handleOptionsMenuPress := func(index int) error {
if bindings[index].Key == nil {
return nil
}
if index <= len(bindings) {
return errors.New("Index is greater than size of bindings")
}
err := gui.handleMenuClose(g, v)
if err != nil {
return err
}
return bindings[index].Handler(g, v)
}
return gui.createMenu(bindings, handleOptionsMenuPress)
}