Files
parchment/tui.go
T

96 lines
2.9 KiB
Go

package main
import (
"os"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
type UIState struct {
Page string
Error string
Success string
}
func AppUI(app *tview.Application, currentFrame **tview.Frame, state *UIState) *tview.Frame {
list := tview.NewList()
list.AddItem("CPkg Tools", "Create and unpack cpkg files for distribution", 'c', func() {
newFrame := PackageUI(app, currentFrame, state)
*currentFrame = newFrame
state.Page = "package"
app.SetRoot(newFrame, true)
})
list.AddItem("Upload to Cardputer", "Creates a package and uploads it to the connected Cardputer", 'u', nil)
list.AddItem("Live Refresh", "Monitors for changes and automatically uploads to the Cardputer (WIP)", 'l', nil)
frame := tview.NewFrame(list)
frame.SetBorders(0, 0, 0, 0, 0, 0)
frame.AddText("Parchment - v0.0.1", true, tview.AlignLeft, tcell.ColorWhite)
frame.AddText("Waiting for cardputer...", false, tview.AlignLeft, tcell.ColorWhite)
return frame
}
func SetError(state *UIState, text string) {
state.Success = ""
state.Error = text
}
func SetSuccess(state *UIState, text string) {
state.Error = ""
state.Success = text
}
func PackageUI(app *tview.Application, currentFrame **tview.Frame, state *UIState) *tview.Frame {
list := tview.NewList()
list.AddItem("Create Package", "Creates a .cpkg file in the running directory", 'c', func() {
fsys := os.DirFS(".")
pkgData, err := loadPackageJSON(fsys)
if err != nil {
SetError(state, "Failed to load package.json")
return
}
if pkgData == nil {
SetError(state, "Failed to load package.json")
return
}
pkg, err := createCpkg(fsys, pkgData)
if err != nil {
SetError(state, err.Error())
} else {
SetSuccess(state, "Created file "+pkg.packageName+".cpkg")
}
})
list.AddItem("Unpack Package", "Unpacks a chosen .cpkg file into a subdirectory", 'u', nil)
list.AddItem("Back", "Go back to the home page", 'b', func() {
newFrame := AppUI(app, currentFrame, state)
*currentFrame = newFrame
state.Page = "home"
app.SetRoot(newFrame, true)
})
frame := tview.NewFrame(list)
frame.SetBorders(0, 0, 0, 0, 0, 0)
frame.AddText("Package Tools", true, tview.AlignLeft, tcell.ColorWhite)
frame.AddText("Waiting for cardputer...", false, tview.AlignLeft, tcell.ColorWhite)
return frame
}
func UpdateDeviceStatus(app *tview.Application, frame *tview.Frame, state *UIState, status string, color tcell.Color) {
app.QueueUpdateDraw(func() {
frame.Clear()
switch state.Page {
case "home":
frame.AddText("Parchment - v0.0.1", true, tview.AlignLeft, tcell.ColorWhite)
case "package":
frame.AddText("Package Tools", true, tview.AlignLeft, tcell.ColorWhite)
}
if state.Error != "" {
frame.AddText(state.Error, false, tview.AlignRight, tcell.ColorRed)
}
if state.Success != "" {
frame.AddText(state.Success, false, tview.AlignRight, tcell.ColorGreen)
}
frame.AddText(status, false, tview.AlignLeft, color)
})
}