127 lines
2.3 KiB
Go
127 lines
2.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
intcode "git.bullercodeworks.com/brian/adventofcode/2019/intcode-processor"
|
|
"github.com/br0xen/termbox-screen"
|
|
"github.com/br0xen/termbox-util"
|
|
termbox "github.com/nsf/termbox-go"
|
|
)
|
|
|
|
const (
|
|
MS_MODE_WAIT = iota
|
|
MS_MODE_LOAD
|
|
MS_MODE_RUN
|
|
|
|
MS_MODES = 15
|
|
|
|
MS_MODE_MENU = 1 << 4
|
|
)
|
|
|
|
type MainScreen struct {
|
|
id int
|
|
title string
|
|
mode int
|
|
|
|
filename string
|
|
|
|
prog *intcode.Program
|
|
menu []*MenuItem
|
|
}
|
|
|
|
func NewMainScreen() *MainScreen {
|
|
m := &MainScreen{
|
|
id: ScreenIdMain,
|
|
title: "IntCode Debugger",
|
|
mode: MS_MODE_WAIT,
|
|
}
|
|
m.menu = append(m.menu, NewMenu("File", NewMenu("Load"), NewMenu("Exit")))
|
|
return m
|
|
}
|
|
|
|
func (screen *MainScreen) Id() int { return screen.id }
|
|
|
|
func (screen *MainScreen) Initialize(bundle termboxScreen.Bundle) error {
|
|
return nil
|
|
}
|
|
|
|
func (screen *MainScreen) ResizeScreen() {
|
|
screen.Initialize(nil)
|
|
}
|
|
|
|
func (screen *MainScreen) HandleNoneEvent(event termbox.Event) int {
|
|
return screen.Id()
|
|
}
|
|
|
|
func (screen *MainScreen) HandleKeyEvent(event termbox.Event) int {
|
|
if event.Ch == 0 && event.Key == termbox.KeyEsc {
|
|
screen.toggleMenu()
|
|
}
|
|
return screen.Id()
|
|
}
|
|
|
|
// ╭╼╾╮
|
|
// │┼━│
|
|
// ├┴┬┤
|
|
// ╰──╯
|
|
func (screen *MainScreen) DrawScreen() {
|
|
//w, _ := termbox.Size()
|
|
screen.drawHeader()
|
|
|
|
screen.drawFooter()
|
|
}
|
|
|
|
func (screen *MainScreen) drawHeader() {
|
|
w, _ := termbox.Size()
|
|
spaces := strings.Repeat(" ", ((w-len(screen.title))/2)+1)
|
|
termboxUtil.DrawStringAtPoint(fmt.Sprintf("%s%s%s", spaces, screen.title, spaces), 0, 0, TitleFg, TitleBg)
|
|
if screen.menuIsOn() {
|
|
|
|
}
|
|
}
|
|
|
|
func (screen *MainScreen) drawFooter() {
|
|
|
|
}
|
|
|
|
func (screen *MainScreen) getMode() int {
|
|
return screen.mode & MS_MODES
|
|
}
|
|
|
|
func (screen *MainScreen) menuIsOn() bool {
|
|
return screen.mode&MS_MODE_MENU == MS_MODE_MENU
|
|
}
|
|
|
|
func (screen *MainScreen) toggleMenu() {
|
|
if screen.menuIsOn() {
|
|
screen.hideMenu()
|
|
} else {
|
|
screen.showMenu()
|
|
}
|
|
}
|
|
|
|
func (screen *MainScreen) showMenu() {
|
|
screen.mode = screen.mode | MS_MODE_MENU
|
|
}
|
|
|
|
func (screen *MainScreen) hideMenu() {
|
|
screen.mode = screen.mode ^ MS_MODE_MENU
|
|
}
|
|
|
|
type MenuItem struct {
|
|
title string
|
|
parent string
|
|
SubMenu []*MenuItem
|
|
}
|
|
|
|
func NewMenu(title string, items ...*MenuItem) *MenuItem {
|
|
m := MenuItem{title: title}
|
|
for i := range items {
|
|
items[i].parent = title
|
|
m.SubMenu = append(m.SubMenu, items[i])
|
|
}
|
|
return &m
|
|
}
|