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

78 lines
1.5 KiB
Go

package cache
import (
"sync"
"fyne.io/fyne/v2"
)
var renderersLock sync.RWMutex
var renderers = map[fyne.Widget]*rendererInfo{}
type isBaseWidget interface {
ExtendBaseWidget(fyne.Widget)
super() fyne.Widget
}
// Renderer looks up the render implementation for a widget
func Renderer(wid fyne.Widget) fyne.WidgetRenderer {
if wid == nil {
return nil
}
if wd, ok := wid.(isBaseWidget); ok {
if wd.super() != nil {
wid = wd.super()
}
}
renderersLock.RLock()
rinfo, ok := renderers[wid]
renderersLock.RUnlock()
if !ok {
rinfo = &rendererInfo{renderer: wid.CreateRenderer()}
renderersLock.Lock()
renderers[wid] = rinfo
renderersLock.Unlock()
}
if rinfo == nil {
return nil
}
rinfo.setAlive()
return rinfo.renderer
}
// DestroyRenderer frees a render implementation for a widget.
// This is typically for internal use only.
func DestroyRenderer(wid fyne.Widget) {
renderersLock.RLock()
rinfo, ok := renderers[wid]
renderersLock.RUnlock()
if !ok {
return
}
if rinfo != nil {
rinfo.renderer.Destroy()
}
renderersLock.Lock()
delete(renderers, wid)
renderersLock.Unlock()
}
// IsRendered returns true of the widget currently has a renderer.
// One will be created the first time a widget is shown but may be removed after it is hidden.
func IsRendered(wid fyne.Widget) bool {
renderersLock.RLock()
_, found := renderers[wid]
renderersLock.RUnlock()
return found
}
type rendererInfo struct {
expiringCache
renderer fyne.WidgetRenderer
}