blob: 120f6acd6ec71553940a31a2d21013a67f6ebe52 [file] [log] [blame]
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package widget
import (
"image"
"golang.org/x/exp/shiny/widget/node"
"golang.org/x/exp/shiny/widget/theme"
"golang.org/x/image/font"
"golang.org/x/image/math/fixed"
)
// Label is a leaf widget that holds a text label.
type Label struct {
node.LeafEmbed
Text string
ThemeColor theme.Color
}
// NewLabel returns a new Label widget.
func NewLabel(text string) *Label {
w := &Label{
Text: text,
}
w.Wrapper = w
return w
}
func (w *Label) Measure(t *theme.Theme, widthHint, heightHint int) {
face := t.AcquireFontFace(theme.FontFaceOptions{})
defer t.ReleaseFontFace(theme.FontFaceOptions{}, face)
m := face.Metrics()
// TODO: padding, to match a Text widget?
w.MeasuredSize.X = font.MeasureString(face, w.Text).Ceil()
w.MeasuredSize.Y = m.Ascent.Ceil() + m.Descent.Ceil()
}
func (w *Label) PaintBase(ctx *node.PaintBaseContext, origin image.Point) error {
w.Marks.UnmarkNeedsPaintBase()
dst := ctx.Dst.SubImage(w.Rect.Add(origin)).(*image.RGBA)
if dst.Bounds().Empty() {
return nil
}
face := ctx.Theme.AcquireFontFace(theme.FontFaceOptions{})
defer ctx.Theme.ReleaseFontFace(theme.FontFaceOptions{}, face)
m := face.Metrics()
ascent := m.Ascent.Ceil()
tc := w.ThemeColor
if tc == nil {
tc = theme.Foreground
}
d := font.Drawer{
Dst: dst,
Src: tc.Uniform(ctx.Theme),
Face: face,
Dot: fixed.Point26_6{
X: fixed.I(origin.X + w.Rect.Min.X),
Y: fixed.I(origin.Y + w.Rect.Min.Y + ascent),
},
}
d.DrawString(w.Text)
return nil
}