-
Notifications
You must be signed in to change notification settings - Fork 0
/
component_textfield.go
135 lines (109 loc) · 2.67 KB
/
component_textfield.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
package zgui
import (
"fmt"
"zgui/events"
rl "github.com/xzebra/raylib-go/raylib"
)
type textFieldCallback func(tf *TextFieldComponent)
type TextFieldOptions struct {
Box *BoxOptions
Text *TextOptions
IsPassword bool
SubmitCallback textFieldCallback
}
const (
selectedBarTime = 0.5
)
type TextFieldComponent struct {
*baseComponent
Box *LineBoxComponent
Label *LabelComponent
// Real text inserted (Label contains the "display text").
Text string
// showBar shows the blinking focus indicator
showBar bool
// timer is used for the blinking
timer float32
opt *TextFieldOptions
}
func NewTextFieldComponent(options *TextFieldOptions) *TextFieldComponent {
tf := &TextFieldComponent{
baseComponent: newBaseComponent(),
Box: NewLineBoxComponent(options.Box),
Label: NewLabelComponent("", options.Text),
opt: options,
}
tf.On(events.Pressed, func() {
rl.ShowKeyboard(true)
})
tf.On(events.Focused, func() {
tf.timer = 0
tf.showBar = true
})
tf.On(events.Unfocused, func() {
tf.showBar = false
// rl.ShowKeyboard(false)
})
tf.Box.Add(tf.Label, DefaultConstraints())
tf.baseComponent.Add(tf.Box, DefaultConstraints())
return tf
}
func (tf *TextFieldComponent) SetState(val GuiState) {
if val != StatePressed {
tf.showBar = false
} else {
tf.timer = 0
rl.ShowKeyboard(true)
}
tf.baseComponent.SetState(val)
}
func (tf *TextFieldComponent) handleKeyPressed(key int32) {
// Update the real text variable.
tf.Text += string(key)
// According to text representation, update the display text.
if tf.opt.IsPassword {
tf.Label.Text += "*"
} else {
tf.Label.Text += string(key)
}
}
func (tf *TextFieldComponent) removeChar() {
textLen := len(tf.Text)
if textLen == 0 {
// avoid removing from empty string
return
}
// Remove last character
tf.Text = tf.Text[:textLen-1]
tf.Label.Text = tf.Label.Text[:textLen-1]
}
func (tf *TextFieldComponent) Update(dt float32) {
tf.baseComponent.Update(dt)
if !tf.IsSelected() {
return
}
tf.timer += dt
if tf.timer >= selectedBarTime {
tf.timer = 0
tf.showBar = !tf.showBar
}
// text field keyboard handling
latestKey := rl.GetKeyPressed()
if latestKey != 0 {
// only non special keys are listed as KeyPressed,
// the rest of them can be checked with rl.IsKeyPressed
tf.handleKeyPressed(latestKey)
} else if rl.IsKeyPressed(rl.KeyBackspace) {
tf.removeChar()
} else if rl.IsKeyPressed(rl.KeyEnter) &&
tf.opt.SubmitCallback != nil &&
len(tf.Text) > 0 {
// submit text field content
tf.opt.SubmitCallback(tf)
tf.Text = ""
tf.Label.Text = ""
}
}
func (b *TextFieldComponent) String() string {
return fmt.Sprintf("TextFieldComponent%+v", b.opt)
}