feat: make menu creation into module

This commit is contained in:
Zhongheng Liu 2024-10-21 09:07:20 +03:00
commit c71be875a5
Signed by: steven
GPG key ID: DC8F48E7B4C40905
2 changed files with 88 additions and 80 deletions

83
main.go
View file

@ -1,87 +1,10 @@
package main
import (
. "github.com/gbin/goncurses"
"log"
)
const (
HEIGHT = 10
WIDTH = 30
"gitlab.com/stvnliu/ai_game/menu"
)
func main() {
var active int
menu := []string{"Choice 1", "Choice 2", "Choice 3", "Choice 4", "Exit"}
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()
menu_items := []string{"New game", "Continue", "Exit"}
menu.CreateMenu(menu_items)
}

85
menu/menu.go Normal file
View 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()
}