From 89e26cfa9644fcdf97473dde56617ab824431855 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Sun, 26 Mar 2023 20:21:14 -0700 Subject: [PATCH] beginning of star rating widget --- ui/widgets/starrating.go | 71 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 ui/widgets/starrating.go diff --git a/ui/widgets/starrating.go b/ui/widgets/starrating.go new file mode 100644 index 0000000..5e836e2 --- /dev/null +++ b/ui/widgets/starrating.go @@ -0,0 +1,71 @@ +package widgets + +import ( + "supersonic/res" + "supersonic/ui/layouts" + + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/canvas" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/widget" +) + +type StarRating struct { + widget.BaseWidget + + Rating int + StarSize float32 + + container *fyne.Container +} + +func NewStarRating() *StarRating { + s := &StarRating{} + s.ExtendBaseWidget(s) + return s +} + +func (s *StarRating) createContainer() { + s.container = container.New(&layouts.HboxCustomPadding{ + DisableThemePad: true, + ExtraPad: 2, + }) + var im *canvas.Image + for i := 0; i < 5; i++ { + if s.Rating > i { + im = canvas.NewImageFromResource(res.ResStarFilledInvertPng) + } else { + im = canvas.NewImageFromResource(res.ResStarOutlineInvertPng) + } + im.SetMinSize(fyne.NewSize(s.StarSize, s.StarSize)) + s.container.Add(im) + } +} + +func (s *StarRating) Refresh() { + // widget has not had renderer created yet + if s.container == nil { + return + } + for i := 0; i < 5; i++ { + im := s.container.Objects[i].(*canvas.Image) + im.SetMinSize(fyne.NewSize(s.StarSize, s.StarSize)) + if s.Rating > i { + im.Resource = res.ResStarFilledInvertPng + } else { + im.Resource = res.ResStarOutlineInvertPng + } + } + s.BaseWidget.Refresh() +} + +func (s *StarRating) MinSize() fyne.Size { + return fyne.NewSize(s.StarSize*5, s.StarSize) +} + +func (s *StarRating) CreateRenderer() fyne.WidgetRenderer { + if s.container == nil { + s.createContainer() + } + return widget.NewSimpleRenderer(container.NewCenter(s.container)) +}