forked from joejulian/gio
9d0a53fc9f
This commit separates the types for interactive and non-interactive text within package widget. widget.Selectable is used for all interactive text. widget.Label is used for all non-interactive text. There is no longer a field on widget.Label to provide it with a Selectable. If you want selectable text and are not relying upon the material pacakge API, you need to create widget.Selectables instead of widget.Labels. The material package's LabelStyle API is unchanged. Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
115 lines
3.2 KiB
Go
115 lines
3.2 KiB
Go
package widget
|
|
|
|
import (
|
|
"fmt"
|
|
"image"
|
|
"testing"
|
|
|
|
"gioui.org/font/gofont"
|
|
"gioui.org/io/key"
|
|
"gioui.org/layout"
|
|
"gioui.org/op"
|
|
"gioui.org/text"
|
|
"gioui.org/unit"
|
|
)
|
|
|
|
func TestSelectableZeroValue(t *testing.T) {
|
|
var s Selectable
|
|
if s.Text() != "" {
|
|
t.Errorf("expected zero value to have no text, got %q", s.Text())
|
|
}
|
|
if start, end := s.Selection(); start != 0 || end != 0 {
|
|
t.Errorf("expected start=0, end=0, got start=%d, end=%d", start, end)
|
|
}
|
|
if selected := s.SelectedText(); selected != "" {
|
|
t.Errorf("expected selected text to be \"\", got %q", selected)
|
|
}
|
|
s.SetCaret(5, 5)
|
|
if start, end := s.Selection(); start != 0 || end != 0 {
|
|
t.Errorf("expected start=0, end=0, got start=%d, end=%d", start, end)
|
|
}
|
|
}
|
|
|
|
// Verify that an existing selection is dismissed when you press arrow keys.
|
|
func TestSelectableMove(t *testing.T) {
|
|
gtx := layout.Context{
|
|
Ops: new(op.Ops),
|
|
Locale: english,
|
|
}
|
|
cache := text.NewShaper(gofont.Collection())
|
|
font := text.Font{}
|
|
fontSize := unit.Sp(10)
|
|
|
|
str := `0123456789`
|
|
|
|
// Layout once to populate e.lines and get focus.
|
|
gtx.Queue = newQueue(key.FocusEvent{Focus: true})
|
|
s := new(Selectable)
|
|
|
|
s.SetText(str)
|
|
s.Layout(gtx, cache, text.Font{}, fontSize, op.CallOp{}, op.CallOp{})
|
|
|
|
testKey := func(keyName string) {
|
|
// Select 345
|
|
s.SetCaret(3, 6)
|
|
if start, end := s.Selection(); start != 3 || end != 6 {
|
|
t.Errorf("expected start=%d, end=%d, got start=%d, end=%d", 3, 6, start, end)
|
|
}
|
|
if expected, got := "345", s.SelectedText(); expected != got {
|
|
t.Errorf("KeyName %s, expected %q, got %q", keyName, expected, got)
|
|
}
|
|
|
|
// Press the key
|
|
gtx.Queue = newQueue(key.Event{State: key.Press, Name: keyName})
|
|
s.SetText(str)
|
|
s.Layout(gtx, cache, font, fontSize, op.CallOp{}, op.CallOp{})
|
|
|
|
if expected, got := "", s.SelectedText(); expected != got {
|
|
t.Errorf("KeyName %s, expected %q, got %q", keyName, expected, got)
|
|
}
|
|
}
|
|
|
|
testKey(key.NameLeftArrow)
|
|
testKey(key.NameRightArrow)
|
|
testKey(key.NameUpArrow)
|
|
testKey(key.NameDownArrow)
|
|
}
|
|
|
|
func TestSelectableConfigurations(t *testing.T) {
|
|
gtx := layout.Context{
|
|
Ops: new(op.Ops),
|
|
Constraints: layout.Exact(image.Pt(300, 300)),
|
|
Locale: english,
|
|
}
|
|
cache := text.NewShaper(gofont.Collection())
|
|
fontSize := unit.Sp(10)
|
|
font := text.Font{}
|
|
sentence := "\n\n\n\n\n\n\n\n\n\n\n\nthe quick brown fox jumps over the lazy dog"
|
|
|
|
for _, alignment := range []text.Alignment{text.Start, text.Middle, text.End} {
|
|
for _, zeroMin := range []bool{true, false} {
|
|
t.Run(fmt.Sprintf("Alignment: %v ZeroMinConstraint: %v", alignment, zeroMin), func(t *testing.T) {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
t.Error(err)
|
|
}
|
|
}()
|
|
if zeroMin {
|
|
gtx.Constraints.Min = image.Point{}
|
|
} else {
|
|
gtx.Constraints.Min = gtx.Constraints.Max
|
|
}
|
|
s := new(Selectable)
|
|
s.text.Alignment = alignment
|
|
s.SetText(sentence)
|
|
interactiveDims := s.Layout(gtx, cache, font, fontSize, op.CallOp{}, op.CallOp{})
|
|
staticDims := Label{Alignment: alignment}.Layout(gtx, cache, font, fontSize, sentence, op.CallOp{})
|
|
|
|
if interactiveDims != staticDims {
|
|
t.Errorf("expected consistent dimensions, static returned %#+v, interactive returned %#+v", staticDims, interactiveDims)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|