Files
sqv-engine/cmd/sqv-tview/main.go
2026-01-19 22:49:22 +01:00

180 lines
4.0 KiB
Go

package main
import (
"flag"
"log"
engine "git.pablu.de/pablu/sqv-engine"
"github.com/gdamore/tcell/v2"
"github.com/rivo/tview"
)
func populateTable(tableView *tview.Table, table engine.Table) {
tableView.Clear()
tableView.SetFixed(1, 0)
for i, c := range table.Columns {
color := tcell.ColorDarkGreen
tableView.SetCell(0, i, tview.NewTableCell(c.Name).SetTextColor(color).SetAlign(tview.AlignCenter))
}
for ri, r := range table.Rows {
for rc, c := range r.Values {
tableView.SetCell(ri+1, rc, tview.NewTableCell(c).SetTextColor(tcell.ColorWhite).SetAlign(tview.AlignLeft).SetMaxWidth(30))
}
}
tableView.ScrollToBeginning()
}
var (
dbFile = flag.String("path", "db.sqlite", "Use to set db path")
)
func main() {
flag.Parse()
app := tview.NewApplication()
menuView := tview.NewList()
tableView := tview.NewTable().SetBorders(true)
sqlEditor := tview.NewTextArea()
sqlEditor.SetTitle("SQL Editor").SetBorder(true)
tableView.SetBorder(true).SetTitle("TABLE")
menuView.SetTitle("TABLES").SetBorder(true)
menuView.ShowSecondaryText(false).SetDoneFunc(func() {
tableView.Clear()
})
verticalFlex := tview.NewFlex().
AddItem(menuView, 0, 1, true).
AddItem(tableView, 0, 3, false)
horizontalFlex := tview.NewFlex().
SetDirection(tview.FlexRow).
AddItem(verticalFlex, 0, 4, true).
AddItem(sqlEditor, 0, 1, false)
m, err := engine.NewManager(*dbFile)
if err != nil {
log.Fatalf("Ran into an error on opening Manager, err: %v\n", err)
}
err = m.Start()
if err != nil {
log.Fatalf("Ran into an error on starting Manager, err: %v\n", err)
}
tables := m.GetTables()
for _, t := range tables {
menuView.AddItem(t.Name, "", 0, nil)
}
menuView.SetChangedFunc(func(index int, mainText, secondaryText string, shortcut rune) {
tableView.Clear()
t, ok := m.GetTable(mainText)
if !ok {
panic("AHHHHHHH")
}
err = m.LoadTable(&t)
if !ok {
panic("AHHHHHHH")
}
populateTable(tableView, t)
})
// Idk this shouldnt be needed imo but with only 0 it doesnt work, and with 1, well we are on Table 1 not zero, WHICH WE CANT ALWAYS SAY THERE IS
menuView.SetCurrentItem(1)
menuView.SetCurrentItem(0)
menuView.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() {
case tcell.KeyEscape:
app.Stop()
case tcell.KeyEnter:
app.SetFocus(tableView)
return nil
case tcell.KeyRune:
switch event.Rune() {
case 'j':
return tcell.NewEventKey(tcell.KeyDown, 'j', event.Modifiers())
case 'k':
return tcell.NewEventKey(tcell.KeyUp, 'k', event.Modifiers())
}
}
return event
})
sqlEditor.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
if event.Key() == tcell.KeyEnter {
t, err := m.RunSql(sqlEditor.GetText())
if err != nil {
sqlEditor.Replace(0, sqlEditor.GetTextLength(), err.Error())
tableView.Clear()
return nil
}
populateTable(tableView, t)
return nil
}
return event
})
tableView.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() {
case tcell.KeyEscape:
app.SetFocus(menuView)
return nil
}
return event
})
menuHidden := false
editorHidden := false
// logHidden := true
horizontalFlex.SetInputCapture(func(event *tcell.EventKey) *tcell.EventKey {
switch event.Key() {
case tcell.KeyCtrlH:
if !menuHidden {
verticalFlex.ResizeItem(menuView, 0, 0)
app.SetFocus(tableView)
} else {
verticalFlex.ResizeItem(menuView, 0, 1)
app.SetFocus(menuView)
}
menuHidden = !menuHidden
case tcell.KeyCtrlE:
if !editorHidden {
horizontalFlex.ResizeItem(sqlEditor, 0, 0)
if menuHidden {
app.SetFocus(tableView)
} else {
app.SetFocus(verticalFlex)
}
} else {
horizontalFlex.ResizeItem(sqlEditor, 0, 1)
app.SetFocus(sqlEditor)
}
editorHidden = !editorHidden
}
return event
})
menuView.SetFocusFunc(func() {
menuView.SetBorderColor(tcell.ColorRed)
})
if err := app.SetRoot(horizontalFlex, true).EnableMouse(true).Run(); err != nil {
panic(err)
}
}