// SPDX-License-Identifier: Unlicense OR MIT package material import ( "image/color" "gioui.org/f32" "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 Icon struct { CheckBoxChecked *widget.Icon CheckBoxUnchecked *widget.Icon RadioChecked *widget.Icon RadioUnchecked *widget.Icon } } func NewTheme(fontCollection []text.FontFace) *Theme { t := &Theme{ Shaper: text.NewCache(fontCollection), } 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.Icon.CheckBoxChecked = mustIcon(widget.NewIcon(icons.ToggleCheckBox)) t.Icon.CheckBoxUnchecked = mustIcon(widget.NewIcon(icons.ToggleCheckBoxOutlineBlank)) t.Icon.RadioChecked = mustIcon(widget.NewIcon(icons.ToggleRadioButtonChecked)) t.Icon.RadioUnchecked = 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) layout.Dimensions { cs := gtx.Constraints d := cs.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) return layout.Dimensions{Size: d} }