/
view.go
353 lines (306 loc) · 7.96 KB
/
view.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
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
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
package gui
import (
"fmt"
"github.com/TNK-Studio/lazykube/pkg/log"
"github.com/TNK-Studio/lazykube/pkg/utils"
"github.com/jroimartin/gocui"
)
var (
NotEnoughSpace *View
)
func init() {
NotEnoughSpace = &View{
Name: "notEnoughSpace",
Title: "Not enough space to render.",
DimensionFunc: func(gui *Gui, view *View) (int, int, int, int) {
maxWidth, maxHeight := gui.Size()
return 0, 0, maxWidth - 1, maxHeight - 1
},
OnRender: func(gui *Gui, view *View) error {
gui.Config.Cursor = false
gui.Configure()
view.ReRender()
return nil
},
}
}
type (
// View View
View struct {
Actions []ActionInterface
Name string
Title string
SelectedLine string
OnClick ViewHandler
OnLineClick func(gui *Gui, view *View, cy int, lineString string) error
OnRender ViewHandler
OnRenderOptions ViewHandler
OnFocus ViewHandler
OnFocusLost ViewHandler
OnCursorChange func(gui *Gui, view *View, x, y int) error
OnEditedChange func(gui *Gui, view *View, key gocui.Key, ch rune, mod gocui.Modifier)
OnSelectedLineChange func(gui *Gui, view *View, selectedLine string) error
DimensionFunc DimensionFunc
UpperLeftPointXFunc ViewPointFunc
UpperLeftPointYFunc ViewPointFunc
LowerRightPointXFunc ViewPointFunc
LowerRightPointYFunc ViewPointFunc
ZIndex int
x0 int
y0 int
x1 int
y1 int
gui *Gui
v *gocui.View
state State
FgColor gocui.Attribute
BgColor gocui.Attribute
SelBgColor gocui.Attribute
SelFgColor gocui.Attribute
Clickable bool
Editable bool
Wrap bool
Autoscroll bool
IgnoreCarriageReturns bool
Highlight bool
NoFrame bool
MouseDisable bool
// When the "CanNotReturn" parameter is true, it will not be placed in previousViews where the view was clicked.
CanNotReturn bool
renderTimes int
AlwaysOnTop bool
}
ViewHandler func(gui *Gui, view *View) error
)
// InitView InitView
func (view *View) InitView() {
if view.state == nil {
view.state = NewStateMap()
}
if view.v != nil {
view.v.Title = view.Title
view.v.Wrap = view.Wrap
view.v.Editable = view.Editable
view.v.Autoscroll = view.Autoscroll
view.v.Highlight = view.Highlight
view.v.Frame = !view.NoFrame
view.v.FgColor = view.FgColor
view.v.BgColor = view.BgColor
view.v.SelBgColor = view.SelBgColor
view.v.SelFgColor = view.SelFgColor
view.v.MouseDisable = view.MouseDisable
view.v.Editor = NewViewEditor(view.gui, view)
view.v.OnCursorChange = view.onCursorChange
}
}
// BindGui BindGui
func (view *View) BindGui(gui *Gui) {
view.gui = gui
}
// InitDimension InitDimension
func (view *View) InitDimension() {
if !view.IsBindingGui() {
log.Logger.Warningf("Please run 'InitDimension' after binding Gui.")
return
}
if view.DimensionFunc == nil {
return
}
view.x0, view.y0, view.x1, view.y1 = view.DimensionFunc(view.gui, view)
}
// UpperLeftPointX UpperLeftPointX
func (view *View) UpperLeftPointX() int {
if view.IsBindingGui() && view.UpperLeftPointXFunc != nil {
return view.UpperLeftPointXFunc(view.gui, view)
}
return view.x0
}
// UpperLeftPointY UpperLeftPointY
func (view *View) UpperLeftPointY() int {
if view.IsBindingGui() && view.UpperLeftPointYFunc != nil {
return view.UpperLeftPointYFunc(view.gui, view)
}
return view.y0
}
// LowerRightPointX LowerRightPointX
func (view *View) LowerRightPointX() int {
if view.IsBindingGui() && view.LowerRightPointXFunc != nil {
return view.LowerRightPointXFunc(view.gui, view)
}
return view.x1
}
// LowerRightPointY LowerRightPointY
func (view *View) LowerRightPointY() int {
if view.IsBindingGui() && view.LowerRightPointYFunc != nil {
return view.LowerRightPointYFunc(view.gui, view)
}
return view.y1
}
// GetDimensions GetDimensions
func (view *View) GetDimensions() (int, int, int, int) {
view.InitDimension()
x0, y0, x1, y1 := view.UpperLeftPointX(), view.UpperLeftPointY(), view.LowerRightPointX(), view.LowerRightPointY()
return x0, y0, x1, y1
}
// IsBindingGui IsBindingGui
func (view *View) IsBindingGui() bool {
if view.gui != nil && view.gui.g != nil {
return true
}
return false
}
// Rendered Rendered
func (view *View) Rendered() bool {
return view.v != nil
}
// SetViewContent SetViewContent
func (view *View) SetViewContent(s string) error {
view.v.Clear()
if _, err := fmt.Fprint(view.v, utils.CleanString(s)); err != nil {
return err
}
return nil
}
// SetOrigin SetOrigin
func (view *View) SetOrigin(x, y int) error {
if view.Rendered() {
return view.v.SetOrigin(x, y)
}
return nil
}
// Origin Origin
func (view *View) Origin() (int, int) {
return view.v.Origin()
}
// SetCursor SetCursor
func (view *View) SetCursor(x, y int) error {
if view.Rendered() {
return view.v.SetCursor(x, y)
}
return nil
}
func (view *View) Write(p []byte) (n int, err error) {
return view.v.Write(p)
}
// Clear Clear
func (view *View) Clear() {
if view.Rendered() {
view.v.Clear()
}
}
// Cursor Cursor
func (view *View) Cursor() (int, int) {
return view.v.Cursor()
}
// ViewBufferLines ViewBufferLines
func (view *View) ViewBufferLines() []string {
return view.v.ViewBufferLines()
}
// ViewBuffer ViewBuffer
func (view *View) ViewBuffer() string {
return view.v.ViewBuffer()
}
// Line Line
func (view *View) Line(y int) (string, error) {
return view.v.Line(y)
}
// WhichLine WhichLine
func (view *View) WhichLine(s string) int {
y := -1
for index, line := range view.v.ViewBufferLines() {
if line == s {
return index
}
}
return y
}
// MoveCursor MoveCursor
func (view *View) MoveCursor(dx, dy int, writeMode bool) {
view.v.MoveCursor(dx, dy, writeMode)
}
// ReRender ReRender
func (view *View) ReRender() {
view.renderTimes++
}
// ReRenderTimes ReRenderTimes
func (view *View) ReRenderTimes(times int) {
view.renderTimes += times
}
func (view *View) render() error {
if view.renderTimes < 0 {
return nil
}
view.renderTimes--
if view.OnRender != nil {
if err := view.OnRender(view.gui, view); err != nil {
return err
}
}
return nil
}
func (view *View) renderOptions() error {
if view.OnRenderOptions != nil {
if err := view.OnRenderOptions(view.gui, view); err != nil {
return nil
}
}
return nil
}
func (view *View) focus() error {
log.Logger.Debugf("view.focus - view name :%s", view.Name)
if view.OnFocus != nil {
log.Logger.Debugf("view.OnFocus - view name :%s", view.Name)
if err := view.OnFocus(view.gui, view); err != nil {
return nil
}
}
return nil
}
func (view *View) focusLost() error {
log.Logger.Debugf("view.focusLost - view name :%s", view.Name)
if view.OnFocusLost != nil {
log.Logger.Debugf("view.OnFocusLost - view name :%s", view.Name)
if err := view.OnFocusLost(view.gui, view); err != nil {
return nil
}
}
return nil
}
func (view *View) Size() (int, int) {
return view.v.Size()
}
// ResetCursorOrigin ResetCursorOrigin
func (view *View) ResetCursorOrigin() error {
if err := view.v.SetCursor(0, 0); err != nil {
return err
}
if err := view.v.SetOrigin(0, 0); err != nil {
return err
}
return nil
}
func (view *View) onCursorChange(_ *gocui.View, x, y int) error {
if view.OnCursorChange != nil {
if err := view.OnCursorChange(view.gui, view, x, y); err != nil {
return err
}
}
return nil
}
func (view *View) SetState(key string, value interface{}, reRender bool) error {
err := view.state.Set(key, value)
if err != nil {
return err
}
if reRender {
view.ReRender()
}
return nil
}
func (view *View) GetState(key string) (interface{}, error) {
return view.state.Get(key)
}
// DimensionFunc DimensionFunc
type DimensionFunc func(gui *Gui, view *View) (int, int, int, int)
// ViewPointFunc ViewPointFunc
type ViewPointFunc func(gui *Gui, view *View) int