adventofcode/2019/intcode-processor/debugger/screen_main.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
}