adam-gui/vendor/fyne.io/fyne/v2/internal/app/theme.go
2024-04-29 19:13:50 +02:00

52 lines
1.6 KiB
Go

package app
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/internal/cache"
)
// ApplyThemeTo ensures that the specified canvasobject and all widgets and themeable objects will
// be updated for the current theme.
func ApplyThemeTo(content fyne.CanvasObject, canv fyne.Canvas) {
if content == nil {
return
}
switch o := content.(type) {
case fyne.Widget:
for _, co := range cache.Renderer(o).Objects() {
ApplyThemeTo(co, canv)
}
cache.Renderer(o).Layout(content.Size()) // theme can cause sizing changes
case *fyne.Container:
for _, co := range o.Objects {
ApplyThemeTo(co, canv)
}
if l := o.Layout; l != nil {
l.Layout(o.Objects, o.Size()) // theme can cause sizing changes
}
}
content.Refresh()
}
// ApplySettings ensures that all widgets and themeable objects in an application will be updated for the current theme.
// It also checks that scale changes are reflected if required
func ApplySettings(set fyne.Settings, app fyne.App) {
ApplySettingsWithCallback(set, app, nil)
}
// ApplySettingsWithCallback ensures that all widgets and themeable objects in an application will be updated for the current theme.
// It also checks that scale changes are reflected if required. Also it will call `onEveryWindow` on every window
// interaction
func ApplySettingsWithCallback(set fyne.Settings, app fyne.App, onEveryWindow func(w fyne.Window)) {
for _, window := range app.Driver().AllWindows() {
ApplyThemeTo(window.Content(), window.Canvas())
for _, overlay := range window.Canvas().Overlays().List() {
ApplyThemeTo(overlay, window.Canvas())
}
if onEveryWindow != nil {
onEveryWindow(window)
}
}
}