This commit is contained in:
Drew Weymouth
2023-11-05 14:07:52 -08:00
parent 38a399222a
commit 17df4d780e
5 changed files with 75 additions and 16 deletions
+9 -3
View File
@@ -91,6 +91,8 @@ func mergeResults(
for _, al := range searchResult.Album { for _, al := range searchResult.Album {
results = append(results, &mediaprovider.SearchResult{ results = append(results, &mediaprovider.SearchResult{
Type: mediaprovider.ContentTypeAlbum, Type: mediaprovider.ContentTypeAlbum,
ID: al.ID,
CoverID: al.CoverArt,
Name: al.Name, Name: al.Name,
ArtistName: getNameString(al.Artist, al.Artists), ArtistName: getNameString(al.Artist, al.Artists),
Size: al.SongCount, Size: al.SongCount,
@@ -99,15 +101,19 @@ func mergeResults(
for _, ar := range searchResult.Artist { for _, ar := range searchResult.Artist {
results = append(results, &mediaprovider.SearchResult{ results = append(results, &mediaprovider.SearchResult{
Type: mediaprovider.ContentTypeArtist, Type: mediaprovider.ContentTypeArtist,
Name: ar.Name, ID: ar.ID,
Size: ar.AlbumCount, CoverID: ar.CoverArt,
Name: ar.Name,
Size: ar.AlbumCount,
}) })
} }
for _, tr := range searchResult.Song { for _, tr := range searchResult.Song {
results = append(results, &mediaprovider.SearchResult{ results = append(results, &mediaprovider.SearchResult{
Type: mediaprovider.ContentTypeTrack, Type: mediaprovider.ContentTypeTrack,
ID: tr.ID,
CoverID: tr.CoverArt,
Name: tr.Title, Name: tr.Title,
ArtistName: getNameString(tr.Artist, tr.Artists), ArtistName: getNameString(tr.Artist, tr.Artists),
Size: tr.Duration, Size: tr.Duration,
+3 -2
View File
@@ -64,7 +64,7 @@ type BrowsingPane struct {
container *fyne.Container container *fyne.Container
} }
func NewBrowsingPane(app *backend.App) *BrowsingPane { func NewBrowsingPane(app *backend.App, controller *controller.Controller) *BrowsingPane {
b := &BrowsingPane{app: app} b := &BrowsingPane{app: app}
b.ExtendBaseWidget(b) b.ExtendBaseWidget(b)
b.home = widget.NewButtonWithIcon("", theme.HomeIcon(), b.GoHome) b.home = widget.NewButtonWithIcon("", theme.HomeIcon(), b.GoHome)
@@ -81,13 +81,14 @@ func NewBrowsingPane(app *backend.App) *BrowsingPane {
p.ShowAtPosition(fyne.NewPos(b.Size().Width-p.MinSize().Width+4, p.ShowAtPosition(fyne.NewPos(b.Size().Width-p.MinSize().Width+4,
b.navBtnsContainer.MinSize().Height+theme.Padding())) b.navBtnsContainer.MinSize().Height+theme.Padding()))
}) })
quickSearchBtn := widget.NewButtonWithIcon("", theme.SearchIcon(), controller.ShowQuickSearch)
b.settingsMenu = fyne.NewMenu("") b.settingsMenu = fyne.NewMenu("")
b.navBtnsContainer = container.NewHBox() b.navBtnsContainer = container.NewHBox()
b.container = container.NewBorder(container.New( b.container = container.NewBorder(container.New(
&layouts.MaxPadLayout{PadLeft: -5, PadRight: -5}, &layouts.MaxPadLayout{PadLeft: -5, PadRight: -5},
container.New(layouts.NewLeftMiddleRightLayout(0), container.New(layouts.NewLeftMiddleRightLayout(0),
container.NewHBox(b.home, b.back, b.forward, b.reload), b.navBtnsContainer, container.NewHBox(b.home, b.back, b.forward, b.reload), b.navBtnsContainer,
container.NewHBox(layout.NewSpacer(), b.settingsBtn))), container.NewHBox(layout.NewSpacer(), quickSearchBtn, b.settingsBtn))),
nil, nil, nil, b.pageContainer) nil, nil, nil, b.pageContainer)
b.updateHistoryButtons() b.updateHistoryButtons()
return b return b
+26
View File
@@ -483,6 +483,32 @@ func (c *Controller) ShowSettingsDialog(themeUpdateCallbk func(), themeFiles map
pop.Show() pop.Show()
} }
func (c *Controller) ShowQuickSearch() {
qs := dialogs.NewQuickSearch(c.App.ServerManager.Server, c.App.ImageManager)
pop := widget.NewModalPopUp(qs, c.MainWindow.Canvas())
qs.OnDismiss = func() {
pop.Hide()
c.doModalClosed()
}
qs.OnNavigateTo = func(contentType mediaprovider.ContentType, id string) {
pop.Hide()
c.doModalClosed()
switch contentType {
case mediaprovider.ContentTypeAlbum:
c.NavigateTo(AlbumRoute(id))
case mediaprovider.ContentTypeArtist:
c.NavigateTo(ArtistRoute(id))
case mediaprovider.ContentTypeTrack:
// TODO
case mediaprovider.ContentTypePlaylist:
c.NavigateTo(PlaylistRoute(id))
case mediaprovider.ContentTypeGenre:
c.NavigateTo(GenreRoute(id))
}
}
pop.Show()
}
func (c *Controller) trySetPasswordAndConnectToServer(server *backend.ServerConfig, password string) error { func (c *Controller) trySetPasswordAndConnectToServer(server *backend.ServerConfig, password string) error {
if err := c.App.ServerManager.SetServerPassword(server, password); err != nil { if err := c.App.ServerManager.SetServerPassword(server, password); err != nil {
log.Printf("error setting keyring credentials: %v", err) log.Printf("error setting keyring credentials: %v", err)
+33 -7
View File
@@ -2,6 +2,7 @@ package dialogs
import ( import (
"image" "image"
"log"
"sync" "sync"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
@@ -18,7 +19,10 @@ import (
type QuickSearch struct { type QuickSearch struct {
widget.BaseWidget widget.BaseWidget
mp *mediaprovider.MediaProvider OnDismiss func()
OnNavigateTo func(mediaprovider.ContentType, string)
mp mediaprovider.MediaProvider
im *backend.ImageManager im *backend.ImageManager
resultsMutex sync.RWMutex resultsMutex sync.RWMutex
@@ -29,7 +33,7 @@ type QuickSearch struct {
content *fyne.Container content *fyne.Container
} }
func NewQuickSearch(mp *mediaprovider.MediaProvider, im *backend.ImageManager) *QuickSearch { func NewQuickSearch(mp mediaprovider.MediaProvider, im *backend.ImageManager) *QuickSearch {
q := &QuickSearch{ q := &QuickSearch{
mp: mp, mp: mp,
im: im, im: im,
@@ -57,25 +61,42 @@ func NewQuickSearch(mp *mediaprovider.MediaProvider, im *backend.ImageManager) *
) )
title := widget.NewRichText(&widget.TextSegment{Text: "Quick Search", Style: boldStyle}) title := widget.NewRichText(&widget.TextSegment{Text: "Quick Search", Style: boldStyle})
title.Segments[0].(*widget.TextSegment).Style.Alignment = fyne.TextAlignCenter title.Segments[0].(*widget.TextSegment).Style.Alignment = fyne.TextAlignCenter
q.content = container.NewVBox( q.content = container.NewBorder(
title, container.NewVBox(title, searchEntry), nil, nil, nil, q.list)
container.NewBorder(searchEntry, nil, nil, nil, q.list),
)
return q return q
} }
func (q *QuickSearch) onSearched(query string) { func (q *QuickSearch) onSearched(query string) {
var results []*mediaprovider.SearchResult
if query != "" {
if res, err := q.mp.SearchAll(query, 20); err != nil {
log.Printf("Error searching: %s", err.Error())
} else {
results = res
}
}
q.resultsMutex.Lock()
q.searchResults = results
q.resultsMutex.Unlock()
q.list.Refresh()
} }
func (q *QuickSearch) CreateRenderer() fyne.WidgetRenderer { func (q *QuickSearch) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(q.content) return widget.NewSimpleRenderer(q.content)
} }
func (q *QuickSearch) MinSize() fyne.Size {
return fyne.NewSize(500, 350)
}
type quickSearchResult struct { type quickSearchResult struct {
widget.BaseWidget widget.BaseWidget
// parent *QuickSearch // parent *QuickSearch
id string
contentType mediaprovider.ContentType
imageLoader backend.ThumbnailLoader imageLoader backend.ThumbnailLoader
image *widgets.ImagePlaceholder image *widgets.ImagePlaceholder
@@ -88,7 +109,7 @@ type quickSearchResult struct {
func newQuickSearchResult(im *backend.ImageManager) *quickSearchResult { func newQuickSearchResult(im *backend.ImageManager) *quickSearchResult {
qs := &quickSearchResult{ qs := &quickSearchResult{
image: widgets.NewImagePlaceholder(myTheme.AlbumIcon, 64), image: widgets.NewImagePlaceholder(myTheme.AlbumIcon, 50),
title: widget.NewLabel(""), title: widget.NewLabel(""),
secondary: widget.NewRichText(), secondary: widget.NewRichText(),
} }
@@ -107,6 +128,11 @@ func (q *quickSearchResult) Update(result *mediaprovider.SearchResult) {
if result == nil { if result == nil {
return return
} }
if q.contentType == result.Type && q.id == result.ID {
return // nothing to do
}
q.id = result.ID
q.contentType = result.Type
q.image.CenterIcon = placeholderIconForContentType(result.Type) q.image.CenterIcon = placeholderIconForContentType(result.Type)
q.imageLoader.Load(result.CoverID) q.imageLoader.Load(result.CoverID)
q.title.SetText(result.Name) q.title.SetText(result.Name)
+4 -4
View File
@@ -53,10 +53,9 @@ type MainWindow struct {
func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string, app *backend.App, size fyne.Size) MainWindow { func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string, app *backend.App, size fyne.Size) MainWindow {
m := MainWindow{ m := MainWindow{
App: app, App: app,
Window: fyneApp.NewWindow(displayAppName), Window: fyneApp.NewWindow(displayAppName),
BrowsingPane: browsing.NewBrowsingPane(app), theme: theme.NewMyTheme(&app.Config.Theme, configdir.LocalConfig(appName, "themes")),
theme: theme.NewMyTheme(&app.Config.Theme, configdir.LocalConfig(appName, "themes")),
} }
m.theme.NormalFont = app.Config.Application.FontNormalTTF m.theme.NormalFont = app.Config.Application.FontNormalTTF
@@ -71,6 +70,7 @@ func NewMainWindow(fyneApp fyne.App, appName, displayAppName, appVersion string,
MainWindow: m.Window, MainWindow: m.Window,
App: app, App: app,
} }
m.BrowsingPane = browsing.NewBrowsingPane(app, m.Controller)
m.Router = browsing.NewRouter(app, m.Controller, m.BrowsingPane) m.Router = browsing.NewRouter(app, m.Controller, m.BrowsingPane)
// inject controller dependencies // inject controller dependencies
m.Controller.NavHandler = m.Router.NavigateTo m.Controller.NavHandler = m.Router.NavigateTo