Fix #595: fix a few missed threading/fyne.Do conversions in controller

This commit is contained in:
Drew Weymouth
2025-04-19 08:24:41 -07:00
parent 00557a08e2
commit 5ebf611eaf
3 changed files with 35 additions and 17 deletions
+13 -7
View File
@@ -57,7 +57,7 @@ func (m *Controller) connectTracklistActionsWithReplayGainMode(tracklist *widget
} }
tracklist.OnDownload = m.ShowDownloadDialog tracklist.OnDownload = m.ShowDownloadDialog
tracklist.OnShare = func(trackID string) { tracklist.OnShare = func(trackID string) {
go m.ShowShareDialog(trackID) m.ShowShareDialog(trackID)
} }
tracklist.OnShowTrackInfo = m.ShowTrackInfoDialog tracklist.OnShowTrackInfo = m.ShowTrackInfoDialog
tracklist.OnPlaySongRadio = func(track *mediaprovider.Track) { tracklist.OnPlaySongRadio = func(track *mediaprovider.Track) {
@@ -104,7 +104,9 @@ func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) {
log.Printf("error loading album: %s", err.Error()) log.Printf("error loading album: %s", err.Error())
return return
} }
m.DoAddTracksToPlaylistWorkflow(sharedutil.TracksToIDs(album.Tracks)) fyne.Do(func() {
m.DoAddTracksToPlaylistWorkflow(sharedutil.TracksToIDs(album.Tracks))
})
}() }()
} }
grid.OnDownload = func(albumID string) { grid.OnDownload = func(albumID string) {
@@ -114,11 +116,13 @@ func (m *Controller) ConnectAlbumGridActions(grid *widgets.GridView) {
log.Printf("error loading album: %s", err.Error()) log.Printf("error loading album: %s", err.Error())
return return
} }
m.ShowDownloadDialog(album.Tracks, album.Name) fyne.Do(func() {
m.ShowDownloadDialog(album.Tracks, album.Name)
})
}() }()
} }
grid.OnShare = func(albumID string) { grid.OnShare = func(albumID string) {
go m.ShowShareDialog(albumID) m.ShowShareDialog(albumID)
} }
} }
@@ -132,7 +136,7 @@ func (m *Controller) ConnectArtistGridActions(grid *widgets.GridView) {
go m.App.PlaybackManager.LoadTracks(m.GetArtistTracks(artistID), backend.Append, false) go m.App.PlaybackManager.LoadTracks(m.GetArtistTracks(artistID), backend.Append, false)
} }
grid.OnAddToPlaylist = func(artistID string) { grid.OnAddToPlaylist = func(artistID string) {
go m.DoAddTracksToPlaylistWorkflow( m.DoAddTracksToPlaylistWorkflow(
sharedutil.TracksToIDs(m.GetArtistTracks(artistID))) sharedutil.TracksToIDs(m.GetArtistTracks(artistID)))
} }
grid.OnFavorite = func(artistID string, favorite bool) { grid.OnFavorite = func(artistID string, favorite bool) {
@@ -148,11 +152,13 @@ func (m *Controller) ConnectArtistGridActions(grid *widgets.GridView) {
log.Printf("error getting artist: %v", err.Error()) log.Printf("error getting artist: %v", err.Error())
return return
} }
m.ShowDownloadDialog(tracks, tist.Name) fyne.Do(func() {
m.ShowDownloadDialog(tracks, tist.Name)
})
}() }()
} }
grid.OnShare = func(artistID string) { grid.OnShare = func(artistID string) {
go m.ShowShareDialog(artistID) m.ShowShareDialog(artistID)
} }
} }
+8 -4
View File
@@ -400,7 +400,7 @@ func (c *Controller) ShowShareDialog(id string) {
container.NewHBox( container.NewHBox(
hyperlink, hyperlink,
widget.NewButtonWithIcon("", theme.ContentCopyIcon(), func() { widget.NewButtonWithIcon("", theme.ContentCopyIcon(), func() {
c.MainWindow.Clipboard().SetContent(hyperlink.Text) fyne.CurrentApp().Clipboard().SetContent(hyperlink.Text)
}), }),
widget.NewButtonWithIcon("", theme.ViewRefreshIcon(), func() { widget.NewButtonWithIcon("", theme.ViewRefreshIcon(), func() {
if shareUrl, err := c.createShareURL(id); err == nil { if shareUrl, err := c.createShareURL(id); err == nil {
@@ -486,8 +486,10 @@ func (c *Controller) downloadTrack(track *mediaprovider.Track, filePath string)
return return
} }
log.Printf("Saved song %s to: %s\n", track.Title, filePath) log.Printf("Saved track %q to: %s\n", track.Title, filePath)
c.sendNotification(fmt.Sprintf(lang.L("Download completed")+": %s", track.Title), fmt.Sprintf(lang.L("Saved at")+": %s", filePath)) fyne.Do(func() {
c.sendNotification(fmt.Sprintf(lang.L("Download completed")+": %s", track.Title), fmt.Sprintf(lang.L("Saved at")+": %s", filePath))
})
} }
func (c *Controller) downloadTracks(tracks []*mediaprovider.Track, filePath, downloadName string) { func (c *Controller) downloadTracks(tracks []*mediaprovider.Track, filePath, downloadName string) {
@@ -525,7 +527,9 @@ func (c *Controller) downloadTracks(tracks []*mediaprovider.Track, filePath, dow
log.Printf("Saved song %s to: %s\n", track.Title, filePath) log.Printf("Saved song %s to: %s\n", track.Title, filePath)
} }
c.sendNotification(fmt.Sprintf(lang.L("Download completed")+": %s", downloadName), fmt.Sprintf("Saved at: %s", filePath)) fyne.Do(func() {
c.sendNotification(fmt.Sprintf(lang.L("Download completed")+": %s", downloadName), fmt.Sprintf("Saved at: %s", filePath))
})
} }
func (c *Controller) sendNotification(title, content string) { func (c *Controller) sendNotification(title, content string) {
+14 -6
View File
@@ -22,8 +22,10 @@ func (m *Controller) PromptForFirstServer() {
go func() { go func() {
if m.testConnectionAndUpdateDialogText(d) { if m.testConnectionAndUpdateDialogText(d) {
// connection is good // connection is good
pop.Hide() fyne.Do(func() {
m.doModalClosed() pop.Hide()
m.doModalClosed()
})
conn := backend.ServerConnection{ conn := backend.ServerConnection{
ServerType: d.ServerType, ServerType: d.ServerType,
Hostname: d.Host, Hostname: d.Host,
@@ -35,8 +37,9 @@ func (m *Controller) PromptForFirstServer() {
if err := m.trySetPasswordAndConnectToServer(server, d.Password); err != nil { if err := m.trySetPasswordAndConnectToServer(server, d.Password); err != nil {
log.Printf("error connecting to server: %s", err.Error()) log.Printf("error connecting to server: %s", err.Error())
} }
} else {
fyne.Do(d.EnableSubmit)
} }
d.EnableSubmit()
}() }()
} }
m.haveModal = true m.haveModal = true
@@ -227,8 +230,9 @@ func (c *Controller) tryConnectToServer(ctx context.Context, server *backend.Ser
return nil return nil
} }
// should be called from goroutine
func (c *Controller) testConnectionAndUpdateDialogText(dlg *dialogs.AddEditServerDialog) bool { func (c *Controller) testConnectionAndUpdateDialogText(dlg *dialogs.AddEditServerDialog) bool {
dlg.SetInfoText(lang.L("Testing connection") + "...") fyne.Do(func() { dlg.SetInfoText(lang.L("Testing connection") + "...") })
conn := backend.ServerConnection{ conn := backend.ServerConnection{
ServerType: dlg.ServerType, ServerType: dlg.ServerType,
Hostname: dlg.Host, Hostname: dlg.Host,
@@ -240,10 +244,14 @@ func (c *Controller) testConnectionAndUpdateDialogText(dlg *dialogs.AddEditServe
defer cancel() defer cancel()
err := c.App.ServerManager.TestConnectionAndAuth(ctx, conn, dlg.Password) err := c.App.ServerManager.TestConnectionAndAuth(ctx, conn, dlg.Password)
if err == backend.ErrUnreachable { if err == backend.ErrUnreachable {
dlg.SetErrorText(lang.L("Could not reach server") + fmt.Sprintf(" (%s?)", lang.L("wrong URL"))) fyne.Do(func() {
dlg.SetErrorText(lang.L("Could not reach server") + fmt.Sprintf(" (%s?)", lang.L("wrong URL")))
})
return false return false
} else if err != nil { } else if err != nil {
dlg.SetErrorText(lang.L("Authentication failed") + fmt.Sprintf(" (%s)", lang.L("wrong username/password"))) fyne.Do(func() {
dlg.SetErrorText(lang.L("Authentication failed") + fmt.Sprintf(" (%s)", lang.L("wrong username/password")))
})
return false return false
} }
return true return true