diff options
author | Jesse Duffield <jessedduffield@gmail.com> | 2020-02-14 22:07:56 +1100 |
---|---|---|
committer | Jesse Duffield <jessedduffield@gmail.com> | 2020-02-15 08:47:36 +1100 |
commit | 814a0ea36f9f2e2d438ccb43a76402fe0479421b (patch) | |
tree | af332966e36e807f10242b5a6a05a0e8ceb0ac28 /pkg/gui/menu_panel.go | |
parent | 71e018a3dd01af4cb12c18b2e73ed34d6ce3b010 (diff) |
begin refactor of menu panel
Diffstat (limited to 'pkg/gui/menu_panel.go')
-rw-r--r-- | pkg/gui/menu_panel.go | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/pkg/gui/menu_panel.go b/pkg/gui/menu_panel.go index 526f66d78..94a889506 100644 --- a/pkg/gui/menu_panel.go +++ b/pkg/gui/menu_panel.go @@ -8,6 +8,11 @@ import ( "github.com/jesseduffield/lazygit/pkg/utils" ) +type menuItem struct { + displayStrings []string + onPress func() error +} + // list panel functions func (gui *Gui) handleMenuSelect(g *gocui.Gui, v *gocui.View) error { @@ -38,6 +43,75 @@ func (gui *Gui) handleMenuClose(g *gocui.Gui, v *gocui.View) error { return gui.returnFocus(g, v) } +type createMenuOptions struct { + showCancel bool +} + +func (gui *Gui) createMenuNew(title string, items []*menuItem, createMenuOptions createMenuOptions) error { + if createMenuOptions.showCancel { + // this is mutative but I'm okay with that for now + items = append(items, &menuItem{ + displayStrings: []string{gui.Tr.SLocalize("cancel")}, + onPress: func() error { + return nil + }, + }) + } + + gui.State.MenuItemCount = len(items) + + stringArrays := make([][]string, len(items)) + for i, item := range items { + stringArrays[i] = item.displayStrings + } + + list := utils.RenderDisplayStrings(stringArrays) + + x0, y0, x1, y1 := gui.getConfirmationPanelDimensions(gui.g, false, list) + menuView, _ := gui.g.SetView("menu", x0, y0, x1, y1, 0) + menuView.Title = title + menuView.FgColor = theme.GocuiDefaultTextColor + menuView.Clear() + fmt.Fprint(menuView, list) + gui.State.Panels.Menu.SelectedLine = 0 + + wrappedHandlePress := func(g *gocui.Gui, v *gocui.View) error { + selectedLine := gui.State.Panels.Menu.SelectedLine + if err := items[selectedLine].onPress(); err != nil { + return err + } + + if _, err := gui.g.View("menu"); err == nil { + if _, err := gui.g.SetViewOnBottom("menu"); err != nil { + return err + } + } + + return gui.returnFocus(gui.g, menuView) + } + + gui.State.Panels.Menu.OnPress = wrappedHandlePress + + for _, key := range []gocui.Key{gocui.KeySpace, gocui.KeyEnter, 'y'} { + _ = gui.g.DeleteKeybinding("menu", key, gocui.ModNone) + + if err := gui.g.SetKeybinding("menu", nil, key, gocui.ModNone, wrappedHandlePress); err != nil { + return err + } + } + + gui.g.Update(func(g *gocui.Gui) error { + if _, err := gui.g.View("menu"); err == nil { + if _, err := g.SetViewOnTop("menu"); err != nil { + return err + } + } + currentView := gui.g.CurrentView() + return gui.switchFocus(gui.g, currentView, menuView) + }) + return nil +} + func (gui *Gui) createMenu(title string, items interface{}, itemCount int, handlePress func(int) error) error { isFocused := gui.g.CurrentView().Name() == "menu" gui.State.MenuItemCount = itemCount |