| // 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 |
| } |