feat: make menu creation into module
This commit is contained in:
parent
a83b6a66ae
commit
c71be875a5
2 changed files with 88 additions and 80 deletions
83
main.go
83
main.go
|
@ -1,87 +1,10 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
. "github.com/gbin/goncurses"
|
"gitlab.com/stvnliu/ai_game/menu"
|
||||||
"log"
|
|
||||||
)
|
|
||||||
|
|
||||||
const (
|
|
||||||
HEIGHT = 10
|
|
||||||
WIDTH = 30
|
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var active int
|
menu_items := []string{"New game", "Continue", "Exit"}
|
||||||
menu := []string{"Choice 1", "Choice 2", "Choice 3", "Choice 4", "Exit"}
|
menu.CreateMenu(menu_items)
|
||||||
|
|
||||||
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()
|
|
||||||
}
|
}
|
||||||
|
|
85
menu/menu.go
Normal file
85
menu/menu.go
Normal file
|
@ -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()
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue