package ui import ( "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/inpututil" ) type TextInput struct { TextBox input string label string focused bool } func (ti *TextInput) InitTextInput(x, y int, width, height int, label string) { ti.TextBox = *(NewFixedTextBox(x, y, width, height, "").Centering(true)) ti.input = "" ti.label = label ti.renderImpl = func() *ebiten.Image { if ti.input == "" { ti.text = ti.label } else { ti.text = ti.input } return ti.render() } } func NewTextInput(x, y int, width, height int, label string) *TextInput { w := &TextInput{} w.InitTextInput(x, y, width, height, label) return w } func (ti *TextInput) SetInput(input string) { ti.input = input ti.ForceRedraw() } func (ti *TextInput) AddInput(input []rune) { ti.SetInput(ti.input + string(input)) } func (ti *TextInput) HandleKey() { if inpututil.IsKeyJustPressed(ebiten.KeyBackspace) { if len(ti.input) > 0 { ti.input = ti.input[:len(ti.input)-1] ti.ForceRedraw() } } } func (ti *TextInput) Text() string { return ti.input } // return the text or use label as fallback func (ti *TextInput) TextOrLabel() string { if ti.input != "" { return ti.input } return ti.label } func (*TextInput) IsFocusable() bool { return true }