mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 07:35:40 +00:00
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>
124 lines
3.2 KiB
Go
124 lines
3.2 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package material
|
|
|
|
import (
|
|
"image/color"
|
|
|
|
"gioui.org/internal/f32color"
|
|
"gioui.org/layout"
|
|
"gioui.org/op"
|
|
"gioui.org/op/paint"
|
|
"gioui.org/text"
|
|
"gioui.org/unit"
|
|
"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
|
|
// Color is the text color.
|
|
Color color.NRGBA
|
|
// SelectionColor is the color of the background for selected text.
|
|
SelectionColor color.NRGBA
|
|
// Alignment specify the text alignment.
|
|
Alignment text.Alignment
|
|
// MaxLines limits the number of lines. Zero means no limit.
|
|
MaxLines int
|
|
// Truncator is the text that will be shown at the end of the final
|
|
// line if MaxLines is exceeded. Defaults to "…" if empty.
|
|
Truncator string
|
|
Text string
|
|
TextSize unit.Sp
|
|
|
|
shaper *text.Shaper
|
|
State *widget.Selectable
|
|
}
|
|
|
|
func H1(th *Theme, txt string) LabelStyle {
|
|
label := Label(th, th.TextSize*96.0/16.0, txt)
|
|
label.Font.Weight = text.Light
|
|
return label
|
|
}
|
|
|
|
func H2(th *Theme, txt string) LabelStyle {
|
|
label := Label(th, th.TextSize*60.0/16.0, txt)
|
|
label.Font.Weight = text.Light
|
|
return label
|
|
}
|
|
|
|
func H3(th *Theme, txt string) LabelStyle {
|
|
return Label(th, th.TextSize*48.0/16.0, txt)
|
|
}
|
|
|
|
func H4(th *Theme, txt string) LabelStyle {
|
|
return Label(th, th.TextSize*34.0/16.0, txt)
|
|
}
|
|
|
|
func H5(th *Theme, txt string) LabelStyle {
|
|
return Label(th, th.TextSize*24.0/16.0, txt)
|
|
}
|
|
|
|
func H6(th *Theme, txt string) LabelStyle {
|
|
label := Label(th, th.TextSize*20.0/16.0, txt)
|
|
label.Font.Weight = text.Medium
|
|
return label
|
|
}
|
|
|
|
func Subtitle1(th *Theme, txt string) LabelStyle {
|
|
return Label(th, th.TextSize*16.0/16.0, txt)
|
|
}
|
|
|
|
func Subtitle2(th *Theme, txt string) LabelStyle {
|
|
label := Label(th, th.TextSize*14.0/16.0, txt)
|
|
label.Font.Weight = text.Medium
|
|
return label
|
|
}
|
|
|
|
func Body1(th *Theme, txt string) LabelStyle {
|
|
return Label(th, th.TextSize, txt)
|
|
}
|
|
|
|
func Body2(th *Theme, txt string) LabelStyle {
|
|
return Label(th, th.TextSize*14.0/16.0, txt)
|
|
}
|
|
|
|
func Caption(th *Theme, txt string) LabelStyle {
|
|
return Label(th, th.TextSize*12.0/16.0, txt)
|
|
}
|
|
|
|
func Overline(th *Theme, txt string) LabelStyle {
|
|
return Label(th, th.TextSize*10.0/16.0, txt)
|
|
}
|
|
|
|
func Label(th *Theme, size unit.Sp, txt string) LabelStyle {
|
|
return LabelStyle{
|
|
Text: txt,
|
|
Color: th.Palette.Fg,
|
|
SelectionColor: f32color.MulAlpha(th.Palette.ContrastBg, 0x60),
|
|
TextSize: size,
|
|
shaper: th.Shaper,
|
|
}
|
|
}
|
|
|
|
func (l LabelStyle) Layout(gtx layout.Context) layout.Dimensions {
|
|
textColorMacro := op.Record(gtx.Ops)
|
|
paint.ColorOp{Color: l.Color}.Add(gtx.Ops)
|
|
textColor := textColorMacro.Stop()
|
|
selectColorMacro := op.Record(gtx.Ops)
|
|
paint.ColorOp{Color: l.SelectionColor}.Add(gtx.Ops)
|
|
selectColor := selectColorMacro.Stop()
|
|
|
|
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)
|
|
}
|