diff options
Diffstat (limited to 'menu/menu.go')
-rw-r--r-- | menu/menu.go | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/menu/menu.go b/menu/menu.go new file mode 100644 index 0000000..51bb89d --- /dev/null +++ b/menu/menu.go @@ -0,0 +1,85 @@ +package menu + +import ( + . "github.com/gbin/goncurses" + "log" +) + +const ( + HEIGHT = 10 + WIDTH = 30 +) + +func CreateMenu(menu []string) { + var active int + stdscr, err := Init() + if err != nil { + log.Fatal(err) + } + defer End() + + Raw(true) + Echo(false) + Cursor(0) + stdscr.Clear() + stdscr.Keypad(true) + + my, mx := stdscr.MaxYX() + y, x := 2, (mx/2)-(WIDTH/2) + + win, _ := NewWindow(HEIGHT, WIDTH, y, x) + win.Keypad(true) + + stdscr.Print("Use arrow keys to go up and down, Press enter to select") + stdscr.Refresh() + + printmenu(win, menu, active) + + for { + ch := stdscr.GetChar() + switch Key(ch) { + case 'q': + return + case KEY_UP: + if active == 0 { + active = len(menu) - 1 + } else { + active -= 1 + } + case KEY_DOWN: + if active == len(menu)-1 { + active = 0 + } else { + active += 1 + } + case KEY_RETURN, KEY_ENTER, Key('\r'): + stdscr.MovePrintf(my-2, 0, "Choice #%d: %s selected", + active, + menu[active]) + stdscr.ClearToEOL() + stdscr.Refresh() + default: + stdscr.MovePrintf(my-2, 0, "Character pressed = %3d/%c", + ch, ch) + stdscr.ClearToEOL() + stdscr.Refresh() + } + + printmenu(win, menu, active) + } +} + +func printmenu(w *Window, menu []string, active int) { + y, x := 2, 2 + w.Box(0, 0) + for i, s := range menu { + if i == active { + w.AttrOn(A_REVERSE) + w.MovePrint(y+i, x, s) + w.AttrOff(A_REVERSE) + } else { + w.MovePrint(y+i, x, s) + } + } + w.Refresh() +} |