aboutsummaryrefslogtreecommitdiff
path: root/menu/menu.go
diff options
context:
space:
mode:
Diffstat (limited to 'menu/menu.go')
-rw-r--r--menu/menu.go85
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()
+}