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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
package tui
var (
_ Viewable = (*Element)(nil)
_ Focusable = (*Element)(nil)
_ Layoutable = (*Element)(nil)
)
type TextAlign int
const (
TextAlignLeft TextAlign = iota
TextAlignCenter
TextAlignRight
)
type ScrollMode int
const (
ScrollNone ScrollMode = iota
ScrollVertical
ScrollHorizontal
ScrollBoth
)
type OverflowMode int
const (
OverflowVisible OverflowMode = iota
OverflowHidden
)
type Element struct {
children []*Element
parent *Element
app *App
style LayoutStyle
layout LayoutResult
dirty bool
border BorderStyle
borderStyle Style
background *Style
borderTitle string
borderTitleAlign TextAlign
borderTitleStyle *Style
focusBorderStyle *Style
text string
richText []TextSpan
textStyle Style
textStyleSet bool
textAlign TextAlign
truncate bool
noWrap bool
focusable bool
tabStop bool
focused bool
autoFocus bool
onFocus func(*Element)
onBlur func(*Element)
onActivate func()
savedBorderStyle Style
hasSavedBorder bool
onChildAdded func(*Element)
onFocusableAdded func(Focusable)
onRender func(*Element, *Buffer)
scrollMode ScrollMode
scrollX int
scrollY int
contentWidth int
contentHeight int
scrollToBottomPending bool
scrollbarStyle Style
scrollbarThumbStyle Style
scrollbarHidden bool
hr bool
hidden bool
overlay bool
overflow OverflowMode
textGradient *Gradient
bgGradient *Gradient
borderGradient *Gradient
onUpdate func()
watchers []Watcher
tag string
component Component
cursorSource cursorSource
cursorReport cursorReport
}
type cursorReport struct {
x, y int
visible bool
}
func New(opts ...Option) *Element {
e := &Element{
style: DefaultLayoutStyle(),
borderTitleAlign: TextAlignCenter,
dirty: true,
}
for _, opt := range opts {
opt(e)
}
return e
}
|