mirror of
https://github.com/wisplite/parchment.git
synced 2026-06-27 21:57:08 -05:00
122 lines
3.8 KiB
Go
122 lines
3.8 KiB
Go
package main
|
|
|
|
import (
|
|
"os"
|
|
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/navidys/tvxwidgets"
|
|
"github.com/rivo/tview"
|
|
)
|
|
|
|
type UIState struct {
|
|
Page string
|
|
Error string
|
|
Success string
|
|
}
|
|
|
|
func AppUI(app *tview.Application, currentFrame **tview.Frame, state *UIState, device *Device) *tview.Frame {
|
|
list := tview.NewList()
|
|
list.AddItem("CPkg Tools", "Create and unpack cpkg files for distribution", 'c', func() {
|
|
newFrame := PackageUI(app, currentFrame, state, device)
|
|
*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', func() {
|
|
if !device.Connected {
|
|
SetError(state, "No cardputer connected")
|
|
return
|
|
} else {
|
|
SetSuccess(state, "Upload started")
|
|
}
|
|
newFrame := UploadUI(app, currentFrame, state, device)
|
|
*currentFrame = newFrame
|
|
state.Page = "upload"
|
|
app.SetRoot(newFrame, true)
|
|
})
|
|
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 UploadUI(app *tview.Application, currentFrame **tview.Frame, state *UIState, device *Device) *tview.Frame {
|
|
list := tview.NewFlex()
|
|
list.SetDirection(tview.FlexRow)
|
|
progress := tvxwidgets.NewPercentageModeGauge()
|
|
progress.SetValue(0)
|
|
progress.SetMaxValue(100)
|
|
progress.SetBorder(true)
|
|
progress.SetTitle("Upload Progress")
|
|
list.AddItem(progress, 0, 1, false)
|
|
return tview.NewFrame(list)
|
|
}
|
|
|
|
func PackageUI(app *tview.Application, currentFrame **tview.Frame, state *UIState, device *Device) *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, device)
|
|
*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)
|
|
case "upload":
|
|
frame.AddText("Uploading to Cardputer - Do not disconnect the cardputer until the upload is complete", 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)
|
|
})
|
|
}
|