more progress - player switching working
This commit is contained in:
@@ -157,6 +157,7 @@ func (p *playbackEngine) SetPlayer(pl player.BasePlayer) {
|
|||||||
p.SeekSeconds(p.pendingPlayerChangeTimePos)
|
p.SeekSeconds(p.pendingPlayerChangeTimePos)
|
||||||
p.pendingPlayerChange = false
|
p.pendingPlayerChange = false
|
||||||
}
|
}
|
||||||
|
p.invokeNoArgCallbacks(p.onPlayerChange)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *playbackEngine) PlayTrackAt(idx int) error {
|
func (p *playbackEngine) PlayTrackAt(idx int) error {
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -3,6 +3,7 @@
|
|||||||
fyne bundle -package res -prefix Res appicon-256.png > bundled.go
|
fyne bundle -package res -prefix Res appicon-256.png > bundled.go
|
||||||
fyne bundle -append -prefix Res icons/coreui/playlist-add-next.svg >> bundled.go
|
fyne bundle -append -prefix Res icons/coreui/playlist-add-next.svg >> bundled.go
|
||||||
fyne bundle -append -prefix Res icons/freepik/playbutton.png >> bundled.go
|
fyne bundle -append -prefix Res icons/freepik/playbutton.png >> bundled.go
|
||||||
|
fyne bundle -append -prefix Res icons/publicdomain/cast.svg >> bundled.go
|
||||||
fyne bundle -append -prefix Res icons/publicdomain/disc.svg >> bundled.go
|
fyne bundle -append -prefix Res icons/publicdomain/disc.svg >> bundled.go
|
||||||
fyne bundle -append -prefix Res icons/publicdomain/headphones.svg >> bundled.go
|
fyne bundle -append -prefix Res icons/publicdomain/headphones.svg >> bundled.go
|
||||||
fyne bundle -append -prefix Res icons/publicdomain/heart-filled.svg >> bundled.go
|
fyne bundle -append -prefix Res icons/publicdomain/heart-filled.svg >> bundled.go
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools -->
|
||||||
|
<svg fill="#000000" width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" d="M1,21 L1,19 C2.1045695,19 3,19.8954305 3,21 L1,21 Z M7,21 L5,21 C5,18.790861 3.209139,17 1,17 L1,15 C4.3137085,15 7,17.6862915 7,21 Z M11,21 L9,21 C9,16.581722 5.418278,13 1,13 L1,11 C6.5228475,11 11,15.4771525 11,21 Z M3,9 L1,9 L1,5 C1,3.8954305 1.8954305,3 3,3 L21,3 C22.1045695,3 23,3.8954305 23,5 L23,19 C23,20.1045695 22.1045695,21 21,21 L13,21 L13,19 L21,19 L21,5 L3,5 L3,9 Z"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 646 B |
@@ -3,6 +3,7 @@ package ui
|
|||||||
import (
|
import (
|
||||||
"github.com/dweymouth/supersonic/backend"
|
"github.com/dweymouth/supersonic/backend"
|
||||||
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
||||||
|
"github.com/dweymouth/supersonic/backend/player/mpv"
|
||||||
"github.com/dweymouth/supersonic/ui/controller"
|
"github.com/dweymouth/supersonic/ui/controller"
|
||||||
"github.com/dweymouth/supersonic/ui/layouts"
|
"github.com/dweymouth/supersonic/ui/layouts"
|
||||||
"github.com/dweymouth/supersonic/ui/util"
|
"github.com/dweymouth/supersonic/ui/util"
|
||||||
@@ -111,6 +112,10 @@ func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr
|
|||||||
pm.OnVolumeChange(func(vol int) {
|
pm.OnVolumeChange(func(vol int) {
|
||||||
fyne.Do(func() { bp.AuxControls.VolumeControl.SetVolume(vol) })
|
fyne.Do(func() { bp.AuxControls.VolumeControl.SetVolume(vol) })
|
||||||
})
|
})
|
||||||
|
pm.OnPlayerChange(func() {
|
||||||
|
_, local := pm.CurrentPlayer().(*mpv.Player)
|
||||||
|
fyne.Do(func() { bp.AuxControls.SetIsRemotePlayer(!local) })
|
||||||
|
})
|
||||||
bp.AuxControls.VolumeControl.OnSetVolume = func(v int) {
|
bp.AuxControls.VolumeControl.OnSetVolume = func(v int) {
|
||||||
pm.SetVolume(v)
|
pm.SetVolume(v)
|
||||||
}
|
}
|
||||||
@@ -121,6 +126,7 @@ func NewBottomPanel(pm *backend.PlaybackManager, im *backend.ImageManager, contr
|
|||||||
pm.SetAutoplay(autoplay)
|
pm.SetAutoplay(autoplay)
|
||||||
}
|
}
|
||||||
bp.AuxControls.OnShowPlayQueue(contr.ShowPopUpPlayQueue)
|
bp.AuxControls.OnShowPlayQueue(contr.ShowPopUpPlayQueue)
|
||||||
|
bp.AuxControls.OnShowCastMenu(contr.ShowCastMenu)
|
||||||
|
|
||||||
bp.imageLoader = util.NewThumbnailLoader(im, bp.NowPlaying.SetImage)
|
bp.imageLoader = util.NewThumbnailLoader(im, bp.NowPlaying.SetImage)
|
||||||
|
|
||||||
|
|||||||
@@ -151,6 +151,26 @@ func (m *Controller) HaveModal() bool {
|
|||||||
return m.haveModal
|
return m.haveModal
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (m *Controller) ShowCastMenu() {
|
||||||
|
devices := m.App.PlaybackManager.RemotePlayers()
|
||||||
|
menu := fyne.NewMenu("")
|
||||||
|
menu.Items = append(menu.Items, fyne.NewMenuItem(lang.L("Local player"), func() {
|
||||||
|
m.App.PlaybackManager.SetRemotePlayer(nil)
|
||||||
|
}))
|
||||||
|
for _, d := range devices {
|
||||||
|
_d := d
|
||||||
|
menu.Items = append(menu.Items, fyne.NewMenuItem(d.Name, func() {
|
||||||
|
m.App.PlaybackManager.SetRemotePlayer(&_d)
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
pop := widget.NewPopUpMenu(menu, m.MainWindow.Canvas())
|
||||||
|
canvasSize := m.MainWindow.Canvas().Size()
|
||||||
|
pop.ShowAtPosition(fyne.NewPos(
|
||||||
|
canvasSize.Width-pop.MinSize().Width-10,
|
||||||
|
canvasSize.Height-pop.MinSize().Height-100,
|
||||||
|
))
|
||||||
|
}
|
||||||
|
|
||||||
func (m *Controller) ShowPopUpPlayQueue() {
|
func (m *Controller) ShowPopUpPlayQueue() {
|
||||||
m.popUpQueueMutex.Lock()
|
m.popUpQueueMutex.Lock()
|
||||||
if m.popUpQueue == nil {
|
if m.popUpQueue == nil {
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ var (
|
|||||||
AlbumIcon fyne.Resource = theme.NewThemedResource(res.ResDiscSvg)
|
AlbumIcon fyne.Resource = theme.NewThemedResource(res.ResDiscSvg)
|
||||||
ArtistIcon fyne.Resource = theme.NewThemedResource(res.ResPeopleSvg)
|
ArtistIcon fyne.Resource = theme.NewThemedResource(res.ResPeopleSvg)
|
||||||
AutoplayIcon fyne.Resource = theme.NewThemedResource(res.ResInfinitySvg)
|
AutoplayIcon fyne.Resource = theme.NewThemedResource(res.ResInfinitySvg)
|
||||||
|
CastIcon fyne.Resource = theme.NewThemedResource(res.ResCastSvg)
|
||||||
RadioIcon fyne.Resource = theme.NewThemedResource(res.ResBroadcastSvg)
|
RadioIcon fyne.Resource = theme.NewThemedResource(res.ResBroadcastSvg)
|
||||||
FavoriteIcon fyne.Resource = theme.NewThemedResource(res.ResHeartFilledSvg)
|
FavoriteIcon fyne.Resource = theme.NewThemedResource(res.ResHeartFilledSvg)
|
||||||
NotFavoriteIcon fyne.Resource = theme.NewThemedResource(res.ResHeartOutlineSvg)
|
NotFavoriteIcon fyne.Resource = theme.NewThemedResource(res.ResHeartOutlineSvg)
|
||||||
|
|||||||
@@ -25,6 +25,7 @@ type AuxControls struct {
|
|||||||
VolumeControl *VolumeControl
|
VolumeControl *VolumeControl
|
||||||
autoplay *IconButton
|
autoplay *IconButton
|
||||||
loop *IconButton
|
loop *IconButton
|
||||||
|
cast *IconButton
|
||||||
showQueue *IconButton
|
showQueue *IconButton
|
||||||
|
|
||||||
container *fyne.Container
|
container *fyne.Container
|
||||||
@@ -35,10 +36,17 @@ func NewAuxControls(initialVolume int, initialLoopMode backend.LoopMode, initial
|
|||||||
VolumeControl: NewVolumeControl(initialVolume),
|
VolumeControl: NewVolumeControl(initialVolume),
|
||||||
autoplay: NewIconButton(myTheme.AutoplayIcon, nil),
|
autoplay: NewIconButton(myTheme.AutoplayIcon, nil),
|
||||||
loop: NewIconButton(myTheme.RepeatIcon, nil),
|
loop: NewIconButton(myTheme.RepeatIcon, nil),
|
||||||
|
cast: NewIconButton(myTheme.CastIcon, nil),
|
||||||
showQueue: NewIconButton(myTheme.PlayQueueIcon, nil),
|
showQueue: NewIconButton(myTheme.PlayQueueIcon, nil),
|
||||||
}
|
}
|
||||||
|
|
||||||
a.loop.IconSize = IconButtonSizeSmaller
|
a.loop.IconSize = IconButtonSizeSmaller
|
||||||
a.loop.SetToolTip(lang.L("Repeat"))
|
a.loop.SetToolTip(lang.L("Repeat"))
|
||||||
|
a.SetLoopMode(initialLoopMode)
|
||||||
|
|
||||||
|
a.cast.IconSize = IconButtonSizeSmaller
|
||||||
|
a.cast.SetToolTip(lang.L("Cast to device"))
|
||||||
|
|
||||||
a.autoplay.Highlighted = initialAutoplay
|
a.autoplay.Highlighted = initialAutoplay
|
||||||
//a.autoplay.IconSize = IconButtonSizeSmaller
|
//a.autoplay.IconSize = IconButtonSizeSmaller
|
||||||
a.autoplay.SetToolTip(lang.L("Autoplay"))
|
a.autoplay.SetToolTip(lang.L("Autoplay"))
|
||||||
@@ -48,9 +56,10 @@ func NewAuxControls(initialVolume int, initialLoopMode backend.LoopMode, initial
|
|||||||
a.OnChangeAutoplay(a.autoplay.Highlighted)
|
a.OnChangeAutoplay(a.autoplay.Highlighted)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
a.SetLoopMode(initialLoopMode)
|
|
||||||
a.showQueue.IconSize = IconButtonSizeSmaller
|
a.showQueue.IconSize = IconButtonSizeSmaller
|
||||||
a.showQueue.SetToolTip(lang.L("Show play queue"))
|
a.showQueue.SetToolTip(lang.L("Show play queue"))
|
||||||
|
|
||||||
a.container = container.NewHBox(
|
a.container = container.NewHBox(
|
||||||
layout.NewSpacer(),
|
layout.NewSpacer(),
|
||||||
container.NewVBox(
|
container.NewVBox(
|
||||||
@@ -58,7 +67,7 @@ func NewAuxControls(initialVolume int, initialLoopMode backend.LoopMode, initial
|
|||||||
a.VolumeControl,
|
a.VolumeControl,
|
||||||
container.New(
|
container.New(
|
||||||
layout.NewCustomPaddedHBoxLayout(theme.Padding()*1.5),
|
layout.NewCustomPaddedHBoxLayout(theme.Padding()*1.5),
|
||||||
layout.NewSpacer(), a.autoplay, a.loop, a.showQueue, util.NewHSpace(5)),
|
layout.NewSpacer(), a.autoplay, a.loop, a.cast, a.showQueue, util.NewHSpace(5)),
|
||||||
layout.NewSpacer(),
|
layout.NewSpacer(),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@@ -88,6 +97,11 @@ func (a *AuxControls) SetLoopMode(mode backend.LoopMode) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *AuxControls) SetIsRemotePlayer(isRemote bool) {
|
||||||
|
a.cast.Highlighted = isRemote
|
||||||
|
a.cast.Refresh()
|
||||||
|
}
|
||||||
|
|
||||||
func (a *AuxControls) SetAutoplay(autoplay bool) {
|
func (a *AuxControls) SetAutoplay(autoplay bool) {
|
||||||
if autoplay == a.autoplay.Highlighted {
|
if autoplay == a.autoplay.Highlighted {
|
||||||
return
|
return
|
||||||
@@ -100,6 +114,10 @@ func (a *AuxControls) OnShowPlayQueue(f func()) {
|
|||||||
a.showQueue.OnTapped = f
|
a.showQueue.OnTapped = f
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *AuxControls) OnShowCastMenu(f func()) {
|
||||||
|
a.cast.OnTapped = f
|
||||||
|
}
|
||||||
|
|
||||||
type volumeSlider struct {
|
type volumeSlider struct {
|
||||||
widget.Slider
|
widget.Slider
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user