zntg/ui/label.go

78 lines
1.7 KiB
Go
Raw Normal View History

package ui
import (
2020-12-12 13:46:52 +00:00
"image/color"
"opslag.de/schobers/geom"
)
type TextOverflow int
const (
TextOverflowClip TextOverflow = iota
TextOverflowEllipsis
)
type Label struct {
ControlBase
Text string
TextOverflow TextOverflow
DropShadow color.Color
desired CachedValue
}
func BuildLabel(text string, fn func(*Label)) *Label {
var l = &Label{Text: text}
if fn != nil {
fn(l)
}
return l
}
func (l *Label) hashDesiredSize(ctx Context) string {
2020-05-12 18:58:42 +00:00
return l.FontName(ctx) + l.Text
}
func (l *Label) desiredSize(ctx Context) interface{} {
2021-07-19 05:58:46 +00:00
font := l.ActualFont(ctx)
2020-05-12 18:58:42 +00:00
width := font.WidthOf(l.Text)
height := font.Height()
2021-07-19 05:58:46 +00:00
pad := l.ActualTextPadding(ctx)
return geom.PtF32(pad.Left+width+pad.Right, pad.Top+height+pad.Bottom)
2020-05-12 18:58:42 +00:00
}
func (l *Label) DesiredSize(ctx Context, _ geom.PointF32) geom.PointF32 {
return l.desired.GetContext(ctx, l.desiredSize, l.hashDesiredSize).(geom.PointF32)
}
2020-12-12 13:46:52 +00:00
func (l *Label) getLabelTopLeft(ctx Context) geom.PointF32 {
2021-07-19 05:58:46 +00:00
pad := l.ActualTextPadding(ctx)
bounds := pad.InsetRect(l.bounds)
switch l.TextAlignment {
case AlignRight:
2020-12-12 13:46:52 +00:00
return geom.PtF32(bounds.Max.X, bounds.Min.Y)
case AlignCenter:
2020-12-12 13:46:52 +00:00
return geom.PtF32(.5*(bounds.Min.X+bounds.Max.X), bounds.Min.Y)
default:
return bounds.Min
}
}
func (l *Label) Render(ctx Context) {
l.RenderBackground(ctx)
fontColor := l.TextColor(ctx)
font := l.ActualFont(ctx)
2020-12-12 13:46:52 +00:00
topLeft := l.getLabelTopLeft(ctx)
text := l.Text
availableWidth := l.bounds.Dx()
if l.TextOverflow == TextOverflowEllipsis {
text = fitTextEllipsis(font, text, availableWidth)
}
2020-12-12 13:46:52 +00:00
if l.DropShadow != nil {
ctx.Renderer().TextAlign(font, topLeft.Add2D(1, 1), l.DropShadow, text, l.TextAlignment)
}
ctx.Renderer().TextAlign(font, topLeft, fontColor, text, l.TextAlignment)
}