File: label.go

package info (click to toggle)
golang-golang-x-exp 0.0~git20230522.2e198f4-1~bpo12%2B1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm-backports
  • size: 6,404 kB
  • sloc: ansic: 1,900; objc: 276; sh: 272; asm: 48; makefile: 26
file content (71 lines) | stat: -rw-r--r-- 1,652 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// 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
}