experimental WIP
this commit experiments with node and edge rendering. For these I'm trying a Page element with a list of Node and Edge primitives. Node primitives are textviews. Edges are a new, custom primitive. the edge only draws a line from 0,0 to 5,5 right now but shows that I'm able to implement a Draw that just writes arbitrary characters to the screen. I need to do several things, some of which suggest that i'm abusing the Pages primitive in terrible ways: - Add and remove nodes as needed. Pages has no Clear() or Reset(). I will have to manually keep track of the page -> node relationship - Give nodes and edges page names that are unique. I won't really be using these and I must avoid collisions. - Relate edges to nodes somehow so they can be drawn properly - Ensure that all edges are drawn before all nodes and a lot more A tremendous amount of work is ahead but I at least have some basic stuff proven to be workable.trunk
parent
2bc70d3377
commit
4ee66d876e
75
main.go
75
main.go
|
@ -2,7 +2,9 @@ package main
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"math/rand"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"github.com/gdamore/tcell/v2"
|
||||
"github.com/rivo/tview"
|
||||
|
@ -22,11 +24,12 @@ type UI struct {
|
|||
Mode mode
|
||||
App *tview.Application
|
||||
Fields []field
|
||||
Nodes []node
|
||||
|
||||
// UI things
|
||||
Pages *tview.Pages
|
||||
TopFlex *tview.Flex
|
||||
Field *tview.Box
|
||||
Field *tview.Pages
|
||||
FieldBar *tview.Flex
|
||||
BottomBar *tview.Pages
|
||||
ExInput *tview.InputField
|
||||
|
@ -83,15 +86,57 @@ type field struct {
|
|||
Selected bool
|
||||
}
|
||||
|
||||
type node struct {
|
||||
Text string
|
||||
Edges []*node
|
||||
X int
|
||||
Y int
|
||||
}
|
||||
|
||||
type Edge struct {
|
||||
}
|
||||
|
||||
func (e Edge) Draw(screen tcell.Screen) {
|
||||
screen.SetContent(0, 0, '!', []rune{}, tcell.StyleDefault)
|
||||
}
|
||||
|
||||
func (e Edge) GetRect() (int, int, int, int) {
|
||||
return 0, 0, 0, 0
|
||||
}
|
||||
|
||||
func (e Edge) SetRect(x, y, width, height int) {
|
||||
}
|
||||
|
||||
func (e Edge) InputHandler() func(_ *tcell.EventKey, _ func(p tview.Primitive)) {
|
||||
return func(event *tcell.EventKey, setFocus func(p tview.Primitive)) {}
|
||||
}
|
||||
|
||||
func (e Edge) HasFocus() bool {
|
||||
return false
|
||||
}
|
||||
|
||||
func (e Edge) Focus(delegate func(p tview.Primitive)) {
|
||||
}
|
||||
|
||||
func (e Edge) Blur() {
|
||||
}
|
||||
|
||||
func (e Edge) MouseHandler() func(action tview.MouseAction, event *tcell.EventMouse, setFocus func(p tview.Primitive)) (consumed bool, capture tview.Primitive) {
|
||||
return func(action tview.MouseAction, event *tcell.EventMouse, setFocus func(p tview.Primitive)) (consumed bool, capture tview.Primitive) {
|
||||
return false, nil
|
||||
}
|
||||
}
|
||||
|
||||
func NewUI() *UI {
|
||||
app := tview.NewApplication()
|
||||
ui := UI{
|
||||
Mode: modeNormal,
|
||||
App: app,
|
||||
Fields: []field{{"scratch", true}, {"test", false}},
|
||||
Nodes: []node{},
|
||||
Pages: tview.NewPages(),
|
||||
TopFlex: tview.NewFlex(),
|
||||
Field: tview.NewBox(),
|
||||
Field: tview.NewPages(),
|
||||
FieldBar: tview.NewFlex(),
|
||||
BottomBar: tview.NewPages(),
|
||||
ExInput: tview.NewInputField(),
|
||||
|
@ -118,7 +163,33 @@ func NewUI() *UI {
|
|||
|
||||
ui.FieldBar.SetDirection(tview.FlexColumn)
|
||||
|
||||
ui.Nodes = append(ui.Nodes, node{
|
||||
Text: "foobar\nbaz\nquux",
|
||||
})
|
||||
ui.Nodes = append(ui.Nodes, node{
|
||||
Text: "hello\nthere\nhow",
|
||||
})
|
||||
|
||||
x := 0
|
||||
y := 0
|
||||
|
||||
rand.Seed(time.Now().Unix())
|
||||
|
||||
for _, n := range ui.Nodes {
|
||||
b := tview.NewTextView()
|
||||
b.SetText(n.Text)
|
||||
b.SetBorder(true)
|
||||
b.SetRect(x, y, 10, 5)
|
||||
x += 20
|
||||
ui.Field.AddPage(fmt.Sprintf("%d", rand.Intn(10000)), b, false, true)
|
||||
}
|
||||
|
||||
ui.Field.AddPage("edge", Edge{}, false, true)
|
||||
|
||||
app.SetBeforeDrawFunc(func(_ tcell.Screen) bool {
|
||||
// Handle nodes
|
||||
// TODO
|
||||
|
||||
// Handle field bar
|
||||
ui.FieldBar.Clear()
|
||||
|
||||
|
|
Loading…
Reference in New Issue