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 }) if err := app.SetRoot(horizontalFlex, true).EnableMouse(true).Run(); err != nil { panic(err) } }