Skip to content

Commit

Permalink
more fyne.Do updates
Browse files Browse the repository at this point in the history
  • Loading branch information
dweymouth committed Jan 12, 2025
1 parent 021609a commit a6085a2
Show file tree
Hide file tree
Showing 7 changed files with 38 additions and 85 deletions.
21 changes: 8 additions & 13 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -75,21 +75,20 @@ func main() {
fyneApp.SetIcon(res.ResAppicon256Png)

mainWindow := ui.NewMainWindow(fyneApp, res.AppName, res.DisplayName, res.AppVersion, myApp)
mainWindow.Window.SetMaster()
myApp.OnReactivate = mainWindow.Show
myApp.OnExit = mainWindow.Quit

go func() {
fyneApp.Lifecycle().SetOnEnteredForeground(sync.OnceFunc(func() {
defaultServer := myApp.ServerManager.GetDefaultServer()
if defaultServer == nil {
fyne.Do(mainWindow.Controller.PromptForFirstServer)
mainWindow.Controller.PromptForFirstServer()
} else {
fyne.Do(func() { mainWindow.Controller.DoConnectToServerWorkflow(defaultServer) })
mainWindow.Controller.DoConnectToServerWorkflow(defaultServer)
}
}()

// slightly hacky workaround for https://github.com/fyne-io/fyne/issues/4964
if runtime.GOOS == "linux" {
workaroundWindowSize := sync.OnceFunc(func() {
// slightly hacky workaround for https://github.com/fyne-io/fyne/issues/4964
if runtime.GOOS == "linux" {
isWayland := false
mainWindow.Window.(driver.NativeWindow).RunNative(func(ctx any) {
_, isWayland = ctx.(*driver.WaylandWindowContext)
Expand All @@ -103,12 +102,8 @@ func main() {
fyne.Do(func() { mainWindow.Window.Resize(s) }) // back to desired size
}()
}
})
fyneApp.Lifecycle().SetOnEnteredForeground(func() {
workaroundWindowSize()
})
}

}
}))
mainWindow.ShowAndRun()

log.Println("Running shutdown tasks...")
Expand Down
15 changes: 9 additions & 6 deletions ui/browsing/albumpage.go
Original file line number Diff line number Diff line change
Expand Up @@ -168,11 +168,13 @@ func (a *AlbumPage) load() {
if a.disposed {
return
}
a.header.Update(album, a.im)
a.tracklist.Options.ShowDiscNumber = len(album.Tracks) > 0 && album.Tracks[0].DiscNumber != album.Tracks[len(album.Tracks)-1].DiscNumber
a.tracks = album.Tracks
a.tracklist.SetTracks(album.Tracks)
a.tracklist.SetNowPlaying(a.nowPlayingID)
fyne.Do(func() {
a.header.Update(album, a.im)
a.tracklist.Options.ShowDiscNumber = len(album.Tracks) > 0 && album.Tracks[0].DiscNumber != album.Tracks[len(album.Tracks)-1].DiscNumber
a.tracks = album.Tracks
a.tracklist.SetTracks(album.Tracks)
a.tracklist.SetNowPlaying(a.nowPlayingID)
})
}

type AlbumPageHeader struct {
Expand Down Expand Up @@ -344,6 +346,7 @@ func (a *AlbumPageHeader) toggleFavorited() {
a.page.mp.SetFavorite(params, a.toggleFavButton.IsFavorited)
}

// should be called asynchronously
func (a *AlbumPageHeader) showPopUpCover() {
if a.fullSizeCoverFetching {
return
Expand All @@ -356,7 +359,7 @@ func (a *AlbumPageHeader) showPopUpCover() {
return
}
if a.page != nil {
a.page.contr.ShowPopUpImage(cover)
fyne.Do(func() { a.page.contr.ShowPopUpImage(cover) })
}
}

Expand Down
2 changes: 1 addition & 1 deletion ui/browsing/browsingpane.go
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ func (b *BrowsingPane) onSongChange(song mediaprovider.MediaItem, lastScrobbledI
return
}
if p, ok := b.curPage.(CanShowNowPlaying); ok {
p.OnSongChange(song, lastScrobbledIfAny)
fyne.Do(func() { p.OnSongChange(song, lastScrobbledIfAny) })
}
}

Expand Down
12 changes: 7 additions & 5 deletions ui/browsing/playlistpage.go
Original file line number Diff line number Diff line change
Expand Up @@ -166,10 +166,12 @@ func (a *PlaylistPage) load() {
return
}
renumberTracks(playlist.Tracks)
a.tracks = playlist.Tracks
a.tracklist.SetTracks(playlist.Tracks)
a.tracklist.SetNowPlaying(a.nowPlayingID)
a.header.Update(playlist)
fyne.Do(func() {
a.tracks = playlist.Tracks
a.tracklist.SetTracks(playlist.Tracks)
a.tracklist.SetNowPlaying(a.nowPlayingID)
a.header.Update(playlist)
})
}

func renumberTracks(tracks []*mediaprovider.Track) {
Expand Down Expand Up @@ -205,8 +207,8 @@ func (a *PlaylistPage) doSetNewTrackOrder(ids []string, newPos int) {
)
})
} else {
renumberTracks(newTracks)
fyne.Do(func() {
renumberTracks(newTracks)
// force-switch back to unsorted view to show new track order
a.tracklist.SetSorting(widgets.TracklistSort{})
a.tracklist.SetTracks(newTracks)
Expand Down
6 changes: 3 additions & 3 deletions ui/mainwindow.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string,
if app.Config.Application.CloseToSystemTray && m.HaveSystemTray() {
m.Window.Hide()
} else {
fyneApp.Quit()
m.Window.Close()
}
})

Expand Down Expand Up @@ -288,8 +288,8 @@ func (m *MainWindow) SetupSystemTrayMenu(appName string, fyneApp fyne.App) {
m.App.PlaybackManager.SetVolume(vol)
}),
fyne.NewMenuItemSeparator(),
fyne.NewMenuItem(lang.L("Show"), m.Window.Show),
fyne.NewMenuItem(lang.L("Hide"), m.Window.Hide),
fyne.NewMenuItem(lang.L("Show"), func() { fyne.Do(m.Window.Show) }),
fyne.NewMenuItem(lang.L("Hide"), func() { fyne.Do(m.Window.Hide) }),
)
desk.SetSystemTrayMenu(menu)
desk.SetSystemTrayIcon(res.ResAppicon256Png)
Expand Down
60 changes: 5 additions & 55 deletions ui/widgets/tracklist.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ import (
"slices"
"sort"
"strings"
"sync"

"fyne.io/fyne/v2/lang"

Expand Down Expand Up @@ -91,7 +90,6 @@ type Tracklist struct {
visibleColumns []bool
sorting TracklistSort

tracksMutex sync.RWMutex
tracks []*util.TrackListModel
tracksOrigOrder []*util.TrackListModel

Expand Down Expand Up @@ -148,7 +146,7 @@ func NewTracklist(tracks []*mediaprovider.Track, im *backend.ImageManager, useCo
}

t.list = NewFocusList(
t.lenTracks,
func() int { return len(t.tracks) },
func() fyne.CanvasObject {
var tr TracklistRow
if t.compactRows {
Expand All @@ -169,16 +167,13 @@ func NewTracklist(tracks []*mediaprovider.Track, im *backend.ImageManager, useCo
return tr
},
func(itemID widget.ListItemID, item fyne.CanvasObject) {
t.tracksMutex.RLock()
// we could have removed tracks from the list in between
// Fyne calling the length callback and this update callback
// so the itemID may be out of bounds. if so, do nothing.
if itemID >= len(t.tracks) {
t.tracksMutex.RUnlock()
return
}
model := t.tracks[itemID]
t.tracksMutex.RUnlock()

tr := item.(TracklistRow)
if tr.TrackID() != model.Item.Metadata().ID || tr.ItemID() != itemID {
Expand Down Expand Up @@ -219,10 +214,8 @@ func (t *Tracklist) Scroll(amount float32) {
t.list.ScrollToOffset(t.list.GetScrollOffset() + amount)
}

// Gets the track at the given index. Thread-safe.
// Gets the track at the given index.
func (t *Tracklist) TrackAt(idx int) *mediaprovider.Track {
t.tracksMutex.RLock()
defer t.tracksMutex.RUnlock()
if idx >= len(t.tracks) {
log.Println("error: Tracklist.TrackAt: index out of range")
return nil
Expand Down Expand Up @@ -291,10 +284,8 @@ func (t *Tracklist) SetSorting(sorting TracklistSort) {
// Sets the currently playing track ID and updates the list rendering
func (t *Tracklist) SetNowPlaying(trackID string) {
prevNowPlaying := t.nowPlayingID
t.tracksMutex.RLock()
trPrev, idxPrev := util.FindItemByID(t.tracks, prevNowPlaying)
tr, idx := util.FindItemByID(t.tracks, trackID)
t.tracksMutex.RUnlock()
t.nowPlayingID = trackID
if trPrev != nil {
t.list.RefreshItem(idxPrev)
Expand All @@ -306,58 +297,46 @@ func (t *Tracklist) SetNowPlaying(trackID string) {

// Increments the play count of the given track and updates the list rendering
func (t *Tracklist) IncrementPlayCount(trackID string) {
t.tracksMutex.RLock()
tr, idx := util.FindItemByID(t.tracks, trackID)
t.tracksMutex.RUnlock()
if tr != nil {
tr.(*mediaprovider.Track).PlayCount += 1
t.list.RefreshItem(idx)
}
}

// Remove all tracks from the tracklist. Does not issue Refresh call. Thread-safe.
// Remove all tracks from the tracklist. Does not issue Refresh call.
func (t *Tracklist) Clear() {
t.tracksMutex.Lock()
defer t.tracksMutex.Unlock()
t.tracks = nil
t.tracksOrigOrder = nil
}

// Sets the tracks in the tracklist. Thread-safe.
// Sets the tracks in the tracklist.
func (t *Tracklist) SetTracks(trs []*mediaprovider.Track) {
t._setTracks(trs)
t.Refresh()
}

func (t *Tracklist) _setTracks(trs []*mediaprovider.Track) {
t.tracksMutex.Lock()
defer t.tracksMutex.Unlock()
t.tracksOrigOrder = util.ToTrackListModels(trs)
t.doSortTracks()
}

// Returns the tracks in the tracklist in the current display order.
func (t *Tracklist) GetTracks() []*mediaprovider.Track {
t.tracksMutex.RLock()
defer t.tracksMutex.RUnlock()
return sharedutil.MapSlice(t.tracks, func(tm *util.TrackListModel) *mediaprovider.Track {
return tm.Track()
})
}

// Append more tracks to the tracklist. Thread-safe.
// Append more tracks to the tracklist.
func (t *Tracklist) AppendTracks(trs []*mediaprovider.Track) {
t.tracksMutex.Lock()
t.tracksOrigOrder = append(t.tracks, util.ToTrackListModels(trs)...)
t.doSortTracks()
t.tracksMutex.Unlock()
t.list.Refresh()
}

func (t *Tracklist) SelectAll() {
t.tracksMutex.RLock()
util.SelectAllItems(t.tracks)
t.tracksMutex.RUnlock()
t.list.Refresh()
}

Expand All @@ -367,13 +346,10 @@ func (t *Tracklist) UnselectAll() {
}

func (t *Tracklist) unselectAll() {
t.tracksMutex.RLock()
util.UnselectAllItems(t.tracks)
t.tracksMutex.RUnlock()
}

func (t *Tracklist) SelectAndScrollToTrack(trackID string) {
t.tracksMutex.RLock()
idx := -1
for i, tr := range t.tracks {
if tr.Item.Metadata().ID == trackID {
Expand All @@ -383,7 +359,6 @@ func (t *Tracklist) SelectAndScrollToTrack(trackID string) {
tr.Selected = false
}
}
t.tracksMutex.RUnlock()
if idx >= 0 {
t.list.ScrollTo(idx)
}
Expand Down Expand Up @@ -474,9 +449,7 @@ func (t *Tracklist) doSortTracks() {

func (t *Tracklist) onSorted(sort ListHeaderSort) {
t.sorting = TracklistSort{ColumnName: t.colName(sort.ColNumber), SortOrder: sort.Type}
t.tracksMutex.Lock()
t.doSortTracks()
t.tracksMutex.Unlock()
t.Refresh()
}

Expand All @@ -503,20 +476,14 @@ func (t *Tracklist) onSelectTrack(idx int) {
}

func (t *Tracklist) selectAddOrRemove(idx int) {
t.tracksMutex.RLock()
defer t.tracksMutex.RUnlock()
t.tracks[idx].Selected = !t.tracks[idx].Selected
}

func (t *Tracklist) selectTrack(idx int) {
t.tracksMutex.RLock()
defer t.tracksMutex.RUnlock()
util.SelectItem(t.tracks, idx)
}

func (t *Tracklist) selectRange(idx int) {
t.tracksMutex.RLock()
defer t.tracksMutex.RUnlock()
util.SelectItemRange(t.tracks, idx)
}

Expand Down Expand Up @@ -606,9 +573,7 @@ func (t *Tracklist) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
}

func (t *Tracklist) onSetFavorite(trackID string, fav bool) {
t.tracksMutex.RLock()
item, _ := util.FindItemByID(t.tracks, trackID)
t.tracksMutex.RUnlock()
t.onSetFavorites([]*mediaprovider.Track{item.(*mediaprovider.Track)}, fav, false)
}

Expand All @@ -627,9 +592,7 @@ func (t *Tracklist) onSetFavorites(tracks []*mediaprovider.Track, fav bool, need

func (t *Tracklist) onSetRating(trackID string, rating int) {
// update our own track model
t.tracksMutex.RLock()
item, _ := util.FindItemByID(t.tracks, trackID)
t.tracksMutex.RUnlock()
t.onSetRatings([]*mediaprovider.Track{item.(*mediaprovider.Track)}, rating, false)
}

Expand Down Expand Up @@ -681,37 +644,24 @@ func (t *Tracklist) onPlaySongRadio(tracks []*mediaprovider.Track) {
}

func (t *Tracklist) selectedTracks() []*mediaprovider.Track {
t.tracksMutex.RLock()
defer t.tracksMutex.RUnlock()
return util.SelectedTracks(t.tracks)
}

func (t *Tracklist) SelectedTrackIDs() []string {
t.tracksMutex.RLock()
defer t.tracksMutex.RUnlock()
return util.SelectedItemIDs(t.tracks)
}

// SelectedTrackIndexes returns the indexes of the selected tracks in the
// original sort order (ie if tracklist is sorted by some column), the indexes
// returned will correspond to the order of tracks when the list was initialized.
func (t *Tracklist) SelectedTrackIndexes() []int {
t.tracksMutex.RLock()
defer t.tracksMutex.RUnlock()

idx := -1
return sharedutil.FilterMapSlice(t.tracksOrigOrder, func(t *util.TrackListModel) (int, bool) {
idx++
return idx, t.Selected
})
}

func (t *Tracklist) lenTracks() int {
t.tracksMutex.RLock()
defer t.tracksMutex.RUnlock()
return len(t.tracks)
}

func (t *Tracklist) ColNumber(colName string) int {
i := slices.IndexFunc(t.columns, func(c TracklistColumn) bool {
return c.Name == colName
Expand Down
7 changes: 5 additions & 2 deletions ui/widgets/tracklistloader.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package widgets
import (
"sync/atomic"

"fyne.io/fyne/v2"
"github.com/dweymouth/supersonic/backend/mediaprovider"
)

Expand Down Expand Up @@ -69,8 +70,10 @@ func (t *TracklistLoader) loadMoreTracks(num int) {
if t.disposed.Load() {
return
}
t.tracklist.AppendTracks(t.trackBuffer)
t.len += len(t.trackBuffer)
fyne.Do(func() {
t.tracklist.AppendTracks(t.trackBuffer)
t.len += len(t.trackBuffer)
})
}
if t.done {
t.trackBuffer = nil
Expand Down

0 comments on commit a6085a2

Please sign in to comment.