icon.go 1.8 KB

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