// SPDX-License-Identifier: Unlicense OR MIT package material import ( "image" "image/color" "gioui.org/f32" "gioui.org/font" "gioui.org/layout" "gioui.org/op/paint" "gioui.org/text" "gioui.org/unit" "gioui.org/widget" "golang.org/x/exp/shiny/materialdesign/icons" ) type Theme struct { Shaper text.Shaper Color struct { Primary color.RGBA Text color.RGBA Hint color.RGBA InvText color.RGBA } TextSize unit.Value checkBoxCheckedIcon *widget.Icon checkBoxUncheckedIcon *widget.Icon radioCheckedIcon *widget.Icon radioUncheckedIcon *widget.Icon } func NewTheme() *Theme { t := &Theme{ Shaper: font.Default(), } t.Color.Primary = rgb(0x3f51b5) t.Color.Text = rgb(0x000000) t.Color.Hint = rgb(0xbbbbbb) t.Color.InvText = rgb(0xffffff) t.TextSize = unit.Sp(16) t.checkBoxCheckedIcon = mustIcon(widget.NewIcon(icons.ToggleCheckBox)) t.checkBoxUncheckedIcon = mustIcon(widget.NewIcon(icons.ToggleCheckBoxOutlineBlank)) t.radioCheckedIcon = mustIcon(widget.NewIcon(icons.ToggleRadioButtonChecked)) t.radioUncheckedIcon = mustIcon(widget.NewIcon(icons.ToggleRadioButtonUnchecked)) return t } func mustIcon(ic *widget.Icon, err error) *widget.Icon { if err != nil { panic(err) } return ic } func rgb(c uint32) color.RGBA { return argb(0xff000000 | c) } func argb(c uint32) color.RGBA { return color.RGBA{A: uint8(c >> 24), R: uint8(c >> 16), G: uint8(c >> 8), B: uint8(c)} } func fill(gtx *layout.Context, col color.RGBA) { cs := gtx.Constraints d := image.Point{X: cs.Width.Min, Y: cs.Height.Min} dr := f32.Rectangle{ Max: f32.Point{X: float32(d.X), Y: float32(d.Y)}, } paint.ColorOp{Color: col}.Add(gtx.Ops) paint.PaintOp{Rect: dr}.Add(gtx.Ops) gtx.Dimensions = layout.Dimensions{Size: d} }