forked from joejulian/gio
3d37491342
The unit.Value is a struct and thus more inconvenient to use than its
underlying float32 type. In addition, most uses don't need a general
value, but rather a specific unit given by the context. This change
replaces unit.Value with two float32 units, Dp and Sp. It also changes
variables and parameters of unit.Value to a specific unit type matching
the context. That is, unit.Dp everywhere except for text sizes which are
in Sp.
Switching to typed float32s has multiple advantages
- They can be constants:
const touchSlop = unit.Dp(16)
- Casting untyped constants is no longer necessary:
insets := layout.UniformInset(16)
- Calculation with values is natural:
func (s ScrollbarStyle) Width() unit.Dp {
return s.Indicator.MinorWidth + s.Track.MinorPadding + s.Track.MinorPadding
}
The main API change is that calls to gtx.Px must be replaced with either
gtx.Dp or gtx.Sp depending on the unit.
Idea by Christophe Meessen.
Signed-off-by: Elias Naur <mail@eliasnaur.com>
100 lines
2.2 KiB
Go
100 lines
2.2 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
package material
|
|
|
|
import (
|
|
"image/color"
|
|
|
|
"gioui.org/layout"
|
|
"gioui.org/op/paint"
|
|
"gioui.org/text"
|
|
"gioui.org/unit"
|
|
"gioui.org/widget"
|
|
)
|
|
|
|
type LabelStyle struct {
|
|
// Face defines the text style.
|
|
Font text.Font
|
|
// Color is the text color.
|
|
Color color.NRGBA
|
|
// Alignment specify the text alignment.
|
|
Alignment text.Alignment
|
|
// MaxLines limits the number of lines. Zero means no limit.
|
|
MaxLines int
|
|
Text string
|
|
TextSize unit.Sp
|
|
|
|
shaper text.Shaper
|
|
}
|
|
|
|
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,
|
|
TextSize: size,
|
|
shaper: th.Shaper,
|
|
}
|
|
}
|
|
|
|
func (l LabelStyle) Layout(gtx layout.Context) layout.Dimensions {
|
|
paint.ColorOp{Color: l.Color}.Add(gtx.Ops)
|
|
tl := widget.Label{Alignment: l.Alignment, MaxLines: l.MaxLines}
|
|
return tl.Layout(gtx, l.shaper, l.Font, l.TextSize, l.Text)
|
|
}
|