From 4f0b2c24c89760302d0b84d6b0f1487ab0641c68 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Thu, 29 Dec 2022 14:40:10 -0800 Subject: [PATCH] add volume slider --- ui/bottompanel.go | 24 ++++++--- ui/widgets/auxcontrols.go | 108 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 8 deletions(-) create mode 100644 ui/widgets/auxcontrols.go diff --git a/ui/bottompanel.go b/ui/bottompanel.go index 42ae4da..a942b42 100644 --- a/ui/bottompanel.go +++ b/ui/bottompanel.go @@ -41,14 +41,14 @@ func (b *bottomPanelLayout) MinSize(objects []fyne.CanvasObject) fyne.Size { func (b *bottomPanelLayout) Layout(_ []fyne.CanvasObject, size fyne.Size) { midW := fyne.Max(b.middleWidth, b.middle.MinSize().Width) - lrW := (size.Width - midW) / 2 + lrW := (size.Width - midW - theme.Padding()*4) / 2 b.left.Resize(fyne.NewSize(lrW, size.Height)) - b.left.Move(fyne.NewPos(0, 0)) + b.left.Move(fyne.NewPos(theme.Padding(), 0)) b.middle.Resize(fyne.NewSize(midW, size.Height)) - b.middle.Move(fyne.NewPos(lrW+theme.Padding(), 0)) + b.middle.Move(fyne.NewPos(lrW+theme.Padding()*2, 0)) if b.right != nil { b.right.Resize(fyne.NewSize(lrW, size.Height)) - b.right.Move(fyne.NewPos(lrW+theme.Padding()*2, 0)) + b.right.Move(fyne.NewPos(lrW+midW+theme.Padding()*3, 0)) } } @@ -59,9 +59,10 @@ type BottomPanel struct { playbackManager *backend.PlaybackManager - NowPlaying *widgets.NowPlayingCard - Controls *widgets.PlayerControls - container *fyne.Container + NowPlaying *widgets.NowPlayingCard + Controls *widgets.PlayerControls + AuxControls *widgets.AuxControls + container *fyne.Container } var _ fyne.Widget = (*BottomPanel)(nil) @@ -94,7 +95,13 @@ func NewBottomPanel(p *player.Player) *BottomPanel { p.Seek(fmt.Sprintf("%d", int(f*100)), player.SeekAbsolutePercent) }) - bp.container = container.New(newBottomPanelLayout(500, bp.NowPlaying, bp.Controls, nil), bp.NowPlaying, bp.Controls) + bp.AuxControls = widgets.NewAuxControls() + bp.AuxControls.VolumeControl.OnVolumeChanged = func(v int) { + _ = p.SetVolume(v) + } + + bp.container = container.New(newBottomPanelLayout(500, bp.NowPlaying, bp.Controls, bp.AuxControls), + bp.NowPlaying, bp.Controls, bp.AuxControls) return bp } @@ -121,5 +128,6 @@ func (bp *BottomPanel) onSongChange(song *subsonic.Child) { } func (bp *BottomPanel) CreateRenderer() fyne.WidgetRenderer { + bp.ExtendBaseWidget(bp) return widget.NewSimpleRenderer(bp.container) } diff --git a/ui/widgets/auxcontrols.go b/ui/widgets/auxcontrols.go new file mode 100644 index 0000000..f2019fd --- /dev/null +++ b/ui/widgets/auxcontrols.go @@ -0,0 +1,108 @@ +package widgets + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/layout" + "fyne.io/fyne/v2/theme" + "fyne.io/fyne/v2/widget" +) + +type AuxControls struct { + widget.BaseWidget + + VolumeControl *VolumeControl + + container *fyne.Container +} + +func NewAuxControls() *AuxControls { + a := &AuxControls{ + VolumeControl: NewVolumeControl(), + } + a.container = container.NewHBox(layout.NewSpacer(), a.VolumeControl) + return a +} + +func (a *AuxControls) CreateRenderer() fyne.WidgetRenderer { + a.ExtendBaseWidget(a) + return widget.NewSimpleRenderer(a.container) +} + +type volumeSlider struct { + widget.Slider + + Width float32 +} + +func NewVolumeSlider(width float32) *volumeSlider { + v := &volumeSlider{ + Slider: widget.Slider{ + Min: 0, + Max: 100, + Step: 1, + Orientation: widget.Horizontal, + Value: 100, + }, + Width: width, + } + v.ExtendBaseWidget(v) + return v +} + +func (v *volumeSlider) MinSize() fyne.Size { + h := v.Slider.MinSize().Height + return fyne.NewSize(v.Width, h) +} + +type VolumeControl struct { + widget.BaseWidget + + icon *widget.Icon + slider *volumeSlider + + OnVolumeChanged func(int) + + container *fyne.Container +} + +func NewVolumeControl() *VolumeControl { + v := &VolumeControl{} + v.ExtendBaseWidget(v) + v.icon = widget.NewIcon(theme.VolumeUpIcon()) + v.slider = NewVolumeSlider(100) + v.slider.Step = 1 + v.slider.Orientation = widget.Horizontal + v.slider.Value = 100 + v.slider.OnChanged = v.onChanged + v.container = container.NewHBox(v.icon, v.slider) + return v +} + +func (v *VolumeControl) onChanged(volume float64) { + vol := int(volume) + if vol <= 0 { + vol = 0 + v.icon.Resource = theme.VolumeMuteIcon() + } else if vol < 50 { + v.icon.Resource = theme.VolumeDownIcon() + } else { + if vol > 100 { + vol = 100 + } + v.icon.Resource = theme.VolumeUpIcon() + } + v.icon.Refresh() + if v.OnVolumeChanged != nil { + v.OnVolumeChanged(vol) + } +} + +func (v *VolumeControl) CreateRenderer() fyne.WidgetRenderer { + v.ExtendBaseWidget(v) + return widget.NewSimpleRenderer(v.container) +} + +func (v *VolumeControl) SetVolume(vol int) { + v.slider.Value = float64(vol) +}