mirror of
https://github.com/vsariola/sointu.git
synced 2025-07-19 13:34:34 -04:00
refactor(tracker/gioui): make iconCache part of Theme
This commit is contained in:
parent
b291959a97
commit
4fa0e04788
@ -76,7 +76,7 @@ func ActionIcon(gtx C, th *Theme, w *ActionClickable, icon []byte, tip string) T
|
||||
}
|
||||
|
||||
func TipIcon(th *Theme, w *TipClickable, icon []byte, tip string) TipIconButtonStyle {
|
||||
iconButtonStyle := IconButton(th, &w.Clickable, widgetForIcon(icon), "")
|
||||
iconButtonStyle := IconButton(th, &w.Clickable, th.Icon(icon), "")
|
||||
iconButtonStyle.Color = th.Material.Palette.ContrastBg
|
||||
iconButtonStyle.Background = color.NRGBA{}
|
||||
iconButtonStyle.Inset = layout.UniformInset(unit.Dp(6))
|
||||
@ -97,7 +97,7 @@ func ToggleIcon(gtx C, th *Theme, w *BoolClickable, offIcon, onIcon []byte, offT
|
||||
for w.Clickable.Clicked(gtx) {
|
||||
w.Bool.Toggle()
|
||||
}
|
||||
ibStyle := IconButton(th, &w.Clickable, widgetForIcon(icon), "")
|
||||
ibStyle := IconButton(th, &w.Clickable, th.Icon(icon), "")
|
||||
ibStyle.Background = color.NRGBA{}
|
||||
ibStyle.Inset = layout.UniformInset(unit.Dp(6))
|
||||
ibStyle.Color = th.Material.Palette.ContrastBg
|
||||
|
@ -1,22 +0,0 @@
|
||||
package gioui
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"gioui.org/widget"
|
||||
)
|
||||
|
||||
var iconCache = map[*byte]*widget.Icon{}
|
||||
|
||||
// widgetForIcon returns a widget for IconVG data, but caching the results
|
||||
func widgetForIcon(icon []byte) *widget.Icon {
|
||||
if widget, ok := iconCache[&icon[0]]; ok {
|
||||
return widget
|
||||
}
|
||||
widget, err := widget.NewIcon(icon)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
iconCache[&icon[0]] = widget
|
||||
return widget
|
||||
}
|
@ -96,7 +96,7 @@ func (m *MenuStyle) Layout(gtx C, items ...MenuItem) D {
|
||||
if i == m.Menu.hover-1 && item.Doer.Enabled() {
|
||||
macro = op.Record(gtx.Ops)
|
||||
}
|
||||
icon := widgetForIcon(item.IconBytes)
|
||||
icon := m.Theme.Icon(item.IconBytes)
|
||||
iconColor := m.LabelStyle.Color
|
||||
iconInset := layout.Inset{Left: unit.Dp(12), Right: unit.Dp(6)}
|
||||
textLabel := Label(m.Theme, &m.Theme.Menu.Text, item.Text)
|
||||
|
@ -47,7 +47,7 @@ type NumericUpDownStyle struct {
|
||||
type NumericUpDown struct {
|
||||
NumberInput *NumberInput
|
||||
Tooltip component.Tooltip
|
||||
Shaper *text.Shaper
|
||||
Theme *Theme
|
||||
Font font.Font
|
||||
NumericUpDownStyle
|
||||
}
|
||||
@ -59,7 +59,7 @@ func NewNumberInput(v tracker.Int) *NumberInput {
|
||||
func NumUpDown(th *Theme, number *NumberInput, tooltip string) NumericUpDown {
|
||||
return NumericUpDown{
|
||||
NumberInput: number,
|
||||
Shaper: th.Material.Shaper,
|
||||
Theme: th,
|
||||
Tooltip: Tooltip(th, tooltip),
|
||||
NumericUpDownStyle: th.NumericUpDown,
|
||||
}
|
||||
@ -131,12 +131,12 @@ func (s *NumericUpDown) actualLayout(gtx C) D {
|
||||
s.NumberInput.clickDecrease.Add(gtx.Ops)
|
||||
return D{Size: gtx.Constraints.Min}
|
||||
},
|
||||
func(gtx C) D { return widgetForIcon(icons.ContentRemove).Layout(gtx, s.IconColor) },
|
||||
func(gtx C) D { return s.Theme.Icon(icons.ContentRemove).Layout(gtx, s.IconColor) },
|
||||
)
|
||||
}),
|
||||
layout.Flexed(1, func(gtx C) D {
|
||||
paint.ColorOp{Color: s.TextColor}.Add(gtx.Ops)
|
||||
return widget.Label{Alignment: text.Middle}.Layout(gtx, s.Shaper, s.Font, s.TextSize, strconv.Itoa(s.NumberInput.Int.Value()), op.CallOp{})
|
||||
return widget.Label{Alignment: text.Middle}.Layout(gtx, s.Theme.Material.Shaper, s.Font, s.TextSize, strconv.Itoa(s.NumberInput.Int.Value()), op.CallOp{})
|
||||
}),
|
||||
layout.Rigid(func(gtx C) D {
|
||||
gtx.Constraints = layout.Exact(image.Pt(width, height))
|
||||
@ -146,7 +146,7 @@ func (s *NumericUpDown) actualLayout(gtx C) D {
|
||||
s.NumberInput.clickIncrease.Add(gtx.Ops)
|
||||
return D{Size: gtx.Constraints.Min}
|
||||
},
|
||||
func(gtx C) D { return widgetForIcon(icons.ContentAdd).Layout(gtx, s.IconColor) },
|
||||
func(gtx C) D { return s.Theme.Icon(icons.ContentAdd).Layout(gtx, s.IconColor) },
|
||||
)
|
||||
}),
|
||||
)
|
||||
|
@ -286,7 +286,7 @@ func (e *Expander) layoutHeader(gtx C, th *Theme, title string, smallWidget layo
|
||||
icon = icons.NavigationExpandLess
|
||||
}
|
||||
gtx.Constraints.Min = image.Pt(gtx.Dp(unit.Dp(24)), gtx.Dp(unit.Dp(24)))
|
||||
return widgetForIcon(icon).Layout(gtx, th.SongPanel.Expander.Color)
|
||||
return th.Icon(icon).Layout(gtx, th.SongPanel.Expander.Color)
|
||||
}),
|
||||
)
|
||||
},
|
||||
|
@ -107,6 +107,9 @@ type Theme struct {
|
||||
Shadow color.NRGBA
|
||||
}
|
||||
ScrollBar ScrollBarStyle
|
||||
|
||||
// iconCache is used to cache the icons created from iconvg data
|
||||
iconCache map[*byte]*widget.Icon
|
||||
}
|
||||
|
||||
type CursorStyle struct {
|
||||
@ -127,9 +130,19 @@ func NewTheme() (*Theme, error) {
|
||||
ret.Material.Icon.CheckBoxUnchecked = must(widget.NewIcon(icons.ToggleCheckBoxOutlineBlank))
|
||||
ret.Material.Icon.RadioChecked = must(widget.NewIcon(icons.ToggleRadioButtonChecked))
|
||||
ret.Material.Icon.RadioUnchecked = must(widget.NewIcon(icons.ToggleRadioButtonUnchecked))
|
||||
ret.iconCache = make(map[*byte]*widget.Icon)
|
||||
return &ret, warn
|
||||
}
|
||||
|
||||
func (th *Theme) Icon(data []byte) *widget.Icon {
|
||||
if icon, ok := th.iconCache[&data[0]]; ok {
|
||||
return icon
|
||||
}
|
||||
icon := must(widget.NewIcon(data))
|
||||
th.iconCache[&data[0]] = icon
|
||||
return icon
|
||||
}
|
||||
|
||||
func must[T any](ic T, err error) T {
|
||||
if err != nil {
|
||||
panic(err)
|
||||
|
Reference in New Issue
Block a user