diff options
author | Dawid Dziurla <dawidd0811@gmail.com> | 2018-09-05 11:12:11 +0200 |
---|---|---|
committer | Dawid Dziurla <dawidd0811@gmail.com> | 2018-09-05 11:12:11 +0200 |
commit | 557009e660e3203dce62624599c173e25f086465 (patch) | |
tree | 01e3a891e8bcab6aef70c8867f6abd06683aa30c /pkg/gui/menu_panel.go | |
parent | e21f739f4fbef045c90ab44365105c2d04334a72 (diff) |
help -> menu
Diffstat (limited to 'pkg/gui/menu_panel.go')
-rw-r--r-- | pkg/gui/menu_panel.go | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/pkg/gui/menu_panel.go b/pkg/gui/menu_panel.go new file mode 100644 index 000000000..fa276e8c4 --- /dev/null +++ b/pkg/gui/menu_panel.go @@ -0,0 +1,107 @@ +package gui + +import ( + "fmt" + "strings" + + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +func (gui *Gui) handleMenuPress(g *gocui.Gui, v *gocui.View) error { + lineNumber := gui.getItemPosition(v) + 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 { + // doing nothing for now + // but it is needed for switch in newLineFocused + return nil +} + +func (gui *Gui) renderMenuOptions(g *gocui.Gui) error { + optionsMap := map[string]string{ + "esc/q": gui.Tr.SLocalize("close"), + "↑ ↓": gui.Tr.SLocalize("navigate"), + "space": gui.Tr.SLocalize("execute"), + } + return gui.renderOptionsMap(g, optionsMap) +} + +func (gui *Gui) handleMenuClose(g *gocui.Gui, v *gocui.View) error { + // better to delete because for example after closing update confirmation panel, + // the focus isn't set back to any of panels and one is unable to even quit + //_, err := g.SetViewOnBottom(v.Name()) + err := g.DeleteView("menu") + if err != nil { + return err + } + return gui.returnFocus(g, v) +} + +func (gui *Gui) GetKey(binding Binding) string { + r, ok := binding.Key.(rune) + key := "" + + if ok { + key = string(r) + } else if binding.KeyReadable != "" { + key = binding.KeyReadable + } + + return key +} + +func (gui *Gui) getMaxKeyLength(bindings []Binding) int { + max := 0 + for _, binding := range bindings { + keyLength := len(gui.GetKey(binding)) + if keyLength > max { + max = keyLength + } + } + return max +} + +func (gui *Gui) handleMenu(g *gocui.Gui, v *gocui.View) error { + // clear keys slice, so we don't have ghost elements + gui.State.Keys = gui.State.Keys[:0] + content := "" + bindings := gui.GetKeybindings() + padWidth := gui.getMaxKeyLength(bindings) + + for _, binding := range bindings { + if key := gui.GetKey(binding); key != "" && binding.ViewName == v.Name() && binding.Description != "" { + content += fmt.Sprintf("%s %s\n", utils.WithPadding(key, padWidth), binding.Description) + gui.State.Keys = append(gui.State.Keys, binding) + } + } + + // y1-1 so there will not be an extra space at the end of panel + x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(g, content) + menuView, _ := g.SetView("menu", x0, y0, x1, y1-1, 0) + menuView.Title = strings.Title(gui.Tr.SLocalize("menu")) + menuView.FgColor = gocui.ColorWhite + + if err := gui.renderMenuOptions(g); err != nil { + return err + } + + fmt.Fprint(menuView, content) + + g.Update(func(g *gocui.Gui) error { + _, err := g.SetViewOnTop("menu") + if err != nil { + return err + } + return gui.switchFocus(g, v, menuView) + }) + return nil +} |