add volume slider
This commit is contained in:
+13
-5
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,6 +61,7 @@ type BottomPanel struct {
|
||||
|
||||
NowPlaying *widgets.NowPlayingCard
|
||||
Controls *widgets.PlayerControls
|
||||
AuxControls *widgets.AuxControls
|
||||
container *fyne.Container
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user