summaryrefslogtreecommitdiffstats
path: root/pkg/gui/options_menu_panel.go
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2018-09-18 21:07:25 +1000
committerJesse Duffield <jessedduffield@gmail.com>2018-09-18 21:07:25 +1000
commitb384fcf6af4e5248616712414e0164887d7bbcbd (patch)
treec464c806ede33869764bd7476a48ef85ec310946 /pkg/gui/options_menu_panel.go
parentf89bc10af1f9fb4211badd2fee51e903bbc03f6c (diff)
generalise popup menu panel
Diffstat (limited to 'pkg/gui/options_menu_panel.go')
-rw-r--r--pkg/gui/options_menu_panel.go51
1 files changed, 51 insertions, 0 deletions
diff --git a/pkg/gui/options_menu_panel.go b/pkg/gui/options_menu_panel.go
new file mode 100644
index 000000000..2da002b43
--- /dev/null
+++ b/pkg/gui/options_menu_panel.go
@@ -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)
+}