canvases.go 944 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package cache
  2. import (
  3. "sync"
  4. "fyne.io/fyne/v2"
  5. )
  6. var canvasesLock sync.RWMutex
  7. var canvases = make(map[fyne.CanvasObject]*canvasInfo, 1024)
  8. // GetCanvasForObject returns the canvas for the specified object.
  9. func GetCanvasForObject(obj fyne.CanvasObject) fyne.Canvas {
  10. canvasesLock.RLock()
  11. cinfo, ok := canvases[obj]
  12. canvasesLock.RUnlock()
  13. if cinfo == nil || !ok {
  14. return nil
  15. }
  16. cinfo.setAlive()
  17. return cinfo.canvas
  18. }
  19. // SetCanvasForObject sets the canvas for the specified object.
  20. // The passed function will be called if the item was not previously attached to this canvas
  21. func SetCanvasForObject(obj fyne.CanvasObject, c fyne.Canvas, setup func()) {
  22. cinfo := &canvasInfo{canvas: c}
  23. cinfo.setAlive()
  24. canvasesLock.Lock()
  25. old, found := canvases[obj]
  26. canvases[obj] = cinfo
  27. canvasesLock.Unlock()
  28. if (!found || old.canvas != c) && setup != nil {
  29. setup()
  30. }
  31. }
  32. type canvasInfo struct {
  33. expiringCache
  34. canvas fyne.Canvas
  35. }