/
diagram.go
102 lines (80 loc) · 1.63 KB
/
diagram.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package main
import (
"image"
"gioui.org/op"
"gioui.org/text"
"gioui.org/widget/material"
)
type Diagram struct {
Nodes []*Node
Conns []*Conn
Selection Set
Focus Set
}
func NewDiagram() *Diagram {
diagram := &Diagram{}
diagram.Selection = NewSet()
diagram.Focus = NewSet()
return diagram
}
type Node struct {
Box
Display Display
In []*Port
Out []*Port
Ports []*Port
}
type Display interface {
Layout(gtx *Context)
}
type Port struct {
Name string
Owner *Node
Offset Vector
}
func (p *Port) Position() Vector {
return p.Owner.Pos.Add(p.Offset)
}
type Conn struct {
From *Port
To *Port
}
func (diagram *Diagram) NewNode(display Display, pos, size Vector, in []*Port, out []*Port) *Node {
node := &Node{
Box: Box{
Pos: pos,
Size: size,
},
Display: display,
}
for y, p := range in {
p.Owner = node
p.Offset = V(0, Unit(y)+0.5)
node.In = append(node.In, p)
node.Ports = append(node.Ports, p)
}
for y, p := range out {
p.Owner = node
p.Offset = V(size.X, Unit(y)+0.5)
node.Out = append(node.Out, p)
node.Ports = append(node.Ports, p)
}
diagram.Nodes = append(diagram.Nodes, node)
return node
}
type Label string
func (label Label) Layout(gtx *Context) {
w := material.Body1(gtx.Theme.Theme, string(label))
w.Alignment = text.Middle
w.Layout(gtx.Context)
}
type List []string
func (list List) Layout(gtx *Context) {
defer op.Offset(image.Point{}).Push(gtx.Ops).Pop()
for _, label := range list {
w := material.Body1(gtx.Theme.Theme, string(label))
w.Alignment = text.Middle
w.Layout(gtx.Context)
op.Offset(image.Point{Y: gtx.PxPerUnit}).Add(gtx.Ops)
}
}