181 lines
4.3 KiB
Go
181 lines
4.3 KiB
Go
package main
|
|
|
|
import (
|
|
"log"
|
|
|
|
engine "git.pablu.de/pablu/sqv-engine"
|
|
"github.com/gdamore/tcell/v2"
|
|
"github.com/rivo/tview"
|
|
// "github.com/uaraven/logview"
|
|
)
|
|
|
|
func main() {
|
|
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()
|
|
})
|
|
|
|
// logView := logview.NewLogView().SetTitle("Logs")
|
|
|
|
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)
|
|
// AddItem(logView, 0, 0, false)
|
|
|
|
m, err := engine.NewManager("db.sqlite")
|
|
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")
|
|
}
|
|
|
|
tableView.SetFixed(1, 0)
|
|
for i, c := range t.Columns {
|
|
color := tcell.ColorDarkGreen
|
|
tableView.SetCell(0, i, tview.NewTableCell(c.Name).SetTextColor(color).SetAlign(tview.AlignCenter))
|
|
}
|
|
|
|
err = m.LoadTable(&t)
|
|
if err != nil {
|
|
log.Fatalf("Error while loading Table, err: %v\n", err)
|
|
}
|
|
|
|
for ri, r := range t.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()
|
|
})
|
|
|
|
// 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.SetText(err.Error(), true)
|
|
}
|
|
|
|
tableView.Clear()
|
|
tableView.SetFixed(1, 0)
|
|
for i, c := range t.Columns {
|
|
color := tcell.ColorDarkGreen
|
|
tableView.SetCell(0, i, tview.NewTableCell(c.Name).SetTextColor(color).SetAlign(tview.AlignCenter))
|
|
}
|
|
|
|
for ri, r := range t.Rows {
|
|
for rc, c := range r.Values {
|
|
tableView.SetCell(ri+1, rc, tview.NewTableCell(c).SetTextColor(tcell.ColorWhite).SetAlign(tview.AlignCenter))
|
|
}
|
|
}
|
|
|
|
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)
|
|
app.SetFocus(verticalFlex)
|
|
} else {
|
|
horizontalFlex.ResizeItem(sqlEditor, 0, 1)
|
|
app.SetFocus(sqlEditor)
|
|
}
|
|
editorHidden = !editorHidden
|
|
// case tcell.KeyCtrlD:
|
|
// if !logHidden {
|
|
// horizontalFlex.ResizeItem(logView, 0, 0)
|
|
// } else {
|
|
// horizontalFlex.ResizeItem(logView, 0, 1)
|
|
// }
|
|
// logHidden = !logHidden
|
|
}
|
|
|
|
return event
|
|
})
|
|
|
|
if err := app.SetRoot(horizontalFlex, true).EnableMouse(true).Run(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
}
|