2023-06-11 22:58:01 +00:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
|
|
|
|
"github.com/gdamore/tcell/v2"
|
|
|
|
"github.com/rivo/tview"
|
|
|
|
"github.com/spf13/cobra"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
NormalMode = "normal"
|
|
|
|
FocusedMode = "focused"
|
|
|
|
SearchMode = "search"
|
|
|
|
ExMode = "ex"
|
|
|
|
)
|
|
|
|
|
|
|
|
type UI struct {
|
2023-06-11 23:48:45 +00:00
|
|
|
Mode string
|
|
|
|
App *tview.Application
|
|
|
|
Fields []Field
|
|
|
|
|
|
|
|
// UI things
|
|
|
|
Pages *tview.Pages
|
|
|
|
TopFlex *tview.Flex
|
|
|
|
Field *tview.Box
|
|
|
|
FieldBar *tview.Flex
|
|
|
|
BottomBar *tview.Pages
|
|
|
|
ExInput *tview.InputField
|
|
|
|
ExOutput *tview.TextView
|
2023-06-11 22:58:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func (ui *UI) handleInput(event *tcell.EventKey) *tcell.EventKey {
|
2023-06-11 23:48:45 +00:00
|
|
|
switch ui.Mode {
|
|
|
|
case NormalMode:
|
|
|
|
case ExMode:
|
|
|
|
case FocusedMode:
|
|
|
|
case SearchMode:
|
|
|
|
default:
|
|
|
|
panic("mode?")
|
|
|
|
}
|
|
|
|
return event
|
|
|
|
}
|
|
|
|
|
|
|
|
type Field struct {
|
|
|
|
Name string
|
|
|
|
Selected bool
|
2023-06-11 22:58:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
func newUI() *UI {
|
|
|
|
app := tview.NewApplication()
|
|
|
|
ui := UI{
|
2023-06-11 23:48:45 +00:00
|
|
|
Mode: NormalMode,
|
|
|
|
App: app,
|
|
|
|
Fields: []Field{{"scratch", true}, {"test", false}},
|
|
|
|
Pages: tview.NewPages(),
|
|
|
|
TopFlex: tview.NewFlex(),
|
|
|
|
Field: tview.NewBox(),
|
|
|
|
FieldBar: tview.NewFlex(),
|
|
|
|
BottomBar: tview.NewPages(),
|
|
|
|
ExInput: tview.NewInputField(),
|
|
|
|
ExOutput: tview.NewTextView(),
|
2023-06-11 22:58:01 +00:00
|
|
|
}
|
2023-06-11 23:48:45 +00:00
|
|
|
|
2023-06-11 22:58:01 +00:00
|
|
|
app.SetInputCapture(ui.handleInput)
|
2023-06-11 23:48:45 +00:00
|
|
|
|
|
|
|
ui.TopFlex.SetDirection(tview.FlexRow)
|
|
|
|
ui.TopFlex.AddItem(ui.Field, 0, 20, true)
|
|
|
|
ui.TopFlex.AddItem(ui.FieldBar, 0, 1, false)
|
|
|
|
ui.TopFlex.AddItem(ui.BottomBar, 1, -1, false)
|
|
|
|
|
|
|
|
ui.Pages.AddPage("main", ui.TopFlex, true, true)
|
|
|
|
|
|
|
|
ui.BottomBar.AddPage("output", ui.ExOutput, true, true)
|
|
|
|
ui.BottomBar.AddPage("input", ui.ExInput, false, false)
|
|
|
|
|
|
|
|
fmt.Fprintln(ui.ExOutput, "porphyry has started. :q to quit")
|
|
|
|
|
|
|
|
ui.FieldBar.SetDirection(tview.FlexColumn)
|
|
|
|
app.SetBeforeDrawFunc(func(_ tcell.Screen) bool {
|
|
|
|
ui.FieldBar.Clear()
|
|
|
|
for _, f := range ui.Fields {
|
|
|
|
t := tview.NewTextView().SetTextStyle(tcell.StyleDefault.Bold(f.Selected))
|
|
|
|
t.SetMaxLines(1)
|
|
|
|
t.SetBorder(true)
|
|
|
|
fmt.Fprintf(t, f.Name)
|
|
|
|
ui.FieldBar.AddItem(t, 0, 1, false)
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
})
|
|
|
|
|
|
|
|
app.SetRoot(ui.Pages, true)
|
2023-06-11 22:58:01 +00:00
|
|
|
return &ui
|
|
|
|
}
|
|
|
|
|
|
|
|
func _main() error {
|
|
|
|
cmd := &cobra.Command{
|
|
|
|
Use: "porphyry",
|
|
|
|
RunE: func(cmd *cobra.Command, args []string) error {
|
|
|
|
return newUI().App.Run()
|
|
|
|
},
|
|
|
|
}
|
|
|
|
|
|
|
|
return cmd.Execute()
|
|
|
|
}
|
|
|
|
|
|
|
|
func main() {
|
|
|
|
if err := _main(); err != nil {
|
|
|
|
fmt.Fprintf(os.Stderr, err.Error()+"\n")
|
|
|
|
}
|
|
|
|
}
|