more WIP
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user