package main import ( "fmt" "log" "os" "github.com/gdamore/tcell" "github.com/rivo/tview" "bnbl.io/pgqt/postgres" ) var app = tview.NewApplication() func main() { if len(os.Args) < 2 { fmt.Fprintf(os.Stderr, "usage: %s \n", os.Args[0]) os.Exit(1) } db, err := postgres.Open(os.Args[1]) if err != nil { log.Printf("could not connect to db: %v", err) os.Exit(1) } schemata := newSchemaSelector(db) queries := newQuerySelector(db) pv := newPlanView() flex := tview.NewFlex(). AddItem(schemata, 30, 0, true). AddItem(tview.NewFlex(). SetDirection(tview.FlexRow). AddItem(queries, 0, 25, false). AddItem(pv, 0, 75, false), 0, 100, false) schemata.SetSelectedFunc(func(_ int, t, _ string, _ rune) { go func() { app.QueueUpdateDraw(func() { if queries.SelectSchema(t) { app.SetFocus(queries) } }) }() }) app.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey { switch event.Key() { case tcell.KeyF1: app.SetFocus(schemata) case tcell.KeyF2: app.SetFocus(queries) case tcell.KeyF3: app.SetFocus(pv.tree) case tcell.KeyF4: app.SetFocus(pv.detail) case tcell.KeyEnter: if app.GetFocus() == queries { p, err := queries.Analyze() if err != nil { pv.SetError(err) } else { pv.SetPlan(p) app.SetFocus(pv) } } } return event }) if err := app.SetRoot(flex, true).Run(); err != nil { log.Printf("could not create application: %v", err) os.Exit(1) } }