icon.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package widget
  2. import (
  3. "fyne.io/fyne/v2"
  4. "fyne.io/fyne/v2/canvas"
  5. "fyne.io/fyne/v2/internal/widget"
  6. "fyne.io/fyne/v2/theme"
  7. )
  8. type iconRenderer struct {
  9. widget.BaseRenderer
  10. raster *canvas.Image
  11. image *Icon
  12. }
  13. func (i *iconRenderer) MinSize() fyne.Size {
  14. size := theme.IconInlineSize()
  15. return fyne.NewSize(size, size)
  16. }
  17. func (i *iconRenderer) Layout(size fyne.Size) {
  18. if len(i.Objects()) == 0 {
  19. return
  20. }
  21. i.Objects()[0].Resize(size)
  22. }
  23. func (i *iconRenderer) Refresh() {
  24. if i.image.Resource == i.image.cachedRes {
  25. return
  26. }
  27. i.image.propertyLock.RLock()
  28. i.raster.Resource = i.image.Resource
  29. i.image.cachedRes = i.image.Resource
  30. i.image.propertyLock.RUnlock()
  31. canvas.Refresh(i.image.super())
  32. }
  33. // Icon widget is a basic image component that load's its resource to match the theme.
  34. type Icon struct {
  35. BaseWidget
  36. Resource fyne.Resource // The resource for this icon
  37. cachedRes fyne.Resource
  38. }
  39. // SetResource updates the resource rendered in this icon widget
  40. func (i *Icon) SetResource(res fyne.Resource) {
  41. i.Resource = res
  42. i.Refresh()
  43. }
  44. // MinSize returns the size that this widget should not shrink below
  45. func (i *Icon) MinSize() fyne.Size {
  46. i.ExtendBaseWidget(i)
  47. return i.BaseWidget.MinSize()
  48. }
  49. // CreateRenderer is a private method to Fyne which links this widget to its renderer
  50. func (i *Icon) CreateRenderer() fyne.WidgetRenderer {
  51. i.ExtendBaseWidget(i)
  52. i.propertyLock.RLock()
  53. defer i.propertyLock.RUnlock()
  54. img := canvas.NewImageFromResource(i.Resource)
  55. img.FillMode = canvas.ImageFillContain
  56. r := &iconRenderer{image: i, raster: img}
  57. r.SetObjects([]fyne.CanvasObject{img})
  58. i.cachedRes = i.Resource
  59. return r
  60. }
  61. // NewIcon returns a new icon widget that displays a themed icon resource
  62. func NewIcon(res fyne.Resource) *Icon {
  63. icon := &Icon{}
  64. icon.ExtendBaseWidget(icon)
  65. icon.SetResource(res) // force the image conversion
  66. return icon
  67. }