|
- package uiterm // import "layeh.com/barnard/uiterm"
-
- import (
- "strings"
- "unicode/utf8"
-
- "github.com/nsf/termbox-go"
- )
-
- type Textbox struct {
- Text string
- Fg, Bg Attribute
-
- Input func(ui *Ui, textbox *Textbox, text string)
-
- ui *Ui
- active bool
- x0, y0, x1, y1 int
- }
-
- func (t *Textbox) uiInitialize(ui *Ui) {
- t.ui = ui
- }
-
- func (t *Textbox) uiSetActive(active bool) {
- t.active = active
- t.uiDraw()
- }
-
- func (t *Textbox) uiSetBounds(x0, y0, x1, y1 int) {
- t.x0 = x0
- t.y0 = y0
- t.x1 = x1
- t.y1 = y1
- t.uiDraw()
- }
-
- func (t *Textbox) uiDraw() {
- t.ui.beginDraw()
- defer t.ui.endDraw()
-
- var setCursor = false
- reader := strings.NewReader(t.Text)
- for y := t.y0; y < t.y1; y++ {
- for x := t.x0; x < t.x1; x++ {
- var chr rune
- if ch, _, err := reader.ReadRune(); err != nil {
- if t.active && !setCursor {
- termbox.SetCursor(x, y)
- setCursor = true
- }
- chr = ' '
- } else {
- chr = ch
- }
- termbox.SetCell(x, y, chr, termbox.Attribute(t.Fg), termbox.Attribute(t.Bg))
- }
- }
- }
-
- func (t *Textbox) uiKeyEvent(mod Modifier, key Key) {
- redraw := false
- switch key {
- case KeyCtrlC:
- t.Text = ""
- redraw = true
- case KeyEnter:
- if t.Input != nil {
- t.Input(t.ui, t, t.Text)
- }
- t.Text = ""
- redraw = true
- case KeySpace:
- t.Text = t.Text + " "
- redraw = true
- case KeyBackspace:
- case KeyBackspace2:
- if len(t.Text) > 0 {
- if r, size := utf8.DecodeLastRuneInString(t.Text); r != utf8.RuneError {
- t.Text = t.Text[:len(t.Text)-size]
- redraw = true
- }
- }
- }
- if redraw {
- t.uiDraw()
- }
- }
-
- func (t *Textbox) uiCharacterEvent(chr rune) {
- t.Text = t.Text + string(chr)
- t.uiDraw()
- }
|