shadowing_renderer.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. package widget
  2. import (
  3. "fyne.io/fyne/v2"
  4. )
  5. // ShadowingRenderer is a renderer that adds a shadow arount the rendered content.
  6. // When using the ShadowingRenderer the embedding renderer should call
  7. // LayoutShadow(contentSize, contentPos) to lay out the shadow.
  8. type ShadowingRenderer struct {
  9. BaseRenderer
  10. shadow fyne.CanvasObject
  11. }
  12. // NewShadowingRenderer creates a ShadowingRenderer.
  13. func NewShadowingRenderer(objects []fyne.CanvasObject, level ElevationLevel) *ShadowingRenderer {
  14. var s fyne.CanvasObject
  15. if level > 0 {
  16. s = NewShadow(ShadowAround, level)
  17. }
  18. r := &ShadowingRenderer{shadow: s}
  19. r.SetObjects(objects)
  20. return r
  21. }
  22. // LayoutShadow adjusts the size and position of the shadow if necessary.
  23. func (r *ShadowingRenderer) LayoutShadow(size fyne.Size, pos fyne.Position) {
  24. if r.shadow == nil {
  25. return
  26. }
  27. r.shadow.Resize(size)
  28. r.shadow.Move(pos)
  29. }
  30. // SetObjects updates the renderer's objects including the shadow if necessary.
  31. func (r *ShadowingRenderer) SetObjects(objects []fyne.CanvasObject) {
  32. if r.shadow != nil && len(objects) > 0 && r.shadow != objects[0] {
  33. objects = append([]fyne.CanvasObject{r.shadow}, objects...)
  34. }
  35. r.BaseRenderer.SetObjects(objects)
  36. }
  37. // RefreshShadow asks the shadow graphical element to update to current theme
  38. func (r *ShadowingRenderer) RefreshShadow() {
  39. if r.shadow == nil {
  40. return
  41. }
  42. r.shadow.Refresh()
  43. }