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:
parent
f89bc10af1
commit
b384fcf6af
@ -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
|
||||||
|
@ -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,
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
51
pkg/gui/options_menu_panel.go
Normal file
51
pkg/gui/options_menu_panel.go
Normal 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)
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user