widget{,/material}: [API] split interactive and non-interactive text widgets

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>
This commit is contained in:
Chris Waldon
2023-03-27 12:35:01 -04:00
committed by Elias Naur
parent 5e6e1217da
commit 9d0a53fc9f
7 changed files with 28 additions and 40 deletions
+11 -2
View File
@@ -14,6 +14,9 @@ import (
"gioui.org/widget"
)
// LabelStyle configures the presentation of text. If the State field is set, the
// label will be laid out as interactive (able to be selected and copied). Otherwise,
// the label will be non-interactive.
type LabelStyle struct {
// Face defines the text style.
Font text.Font
@@ -109,6 +112,12 @@ func (l LabelStyle) Layout(gtx layout.Context) layout.Dimensions {
paint.ColorOp{Color: l.SelectionColor}.Add(gtx.Ops)
selectColor := selectColorMacro.Stop()
tl := widget.Label{Alignment: l.Alignment, MaxLines: l.MaxLines, Selectable: l.State}
return tl.Layout(gtx, l.shaper, l.Font, l.TextSize, l.Text, textColor, selectColor)
if l.State != nil {
if l.State.Text() != l.Text {
l.State.SetText(l.Text)
}
return l.State.Layout(gtx, l.shaper, l.Font, l.TextSize, textColor, selectColor)
}
tl := widget.Label{Alignment: l.Alignment, MaxLines: l.MaxLines}
return tl.Layout(gtx, l.shaper, l.Font, l.TextSize, l.Text, textColor)
}