Fix #625: Allow customization of grid card size
This commit is contained in:
@@ -36,6 +36,8 @@ const (
|
|||||||
var (
|
var (
|
||||||
ErrNoServers = errors.New("no servers set up")
|
ErrNoServers = errors.New("no servers set up")
|
||||||
ErrAnotherInstance = errors.New("another instance is running")
|
ErrAnotherInstance = errors.New("another instance is running")
|
||||||
|
|
||||||
|
appInstance *App
|
||||||
)
|
)
|
||||||
|
|
||||||
type App struct {
|
type App struct {
|
||||||
@@ -204,9 +206,14 @@ func StartupApp(appName, displayAppName, appVersion, appVersionTag, latestReleas
|
|||||||
|
|
||||||
a.startConfigWriter(a.bgrndCtx)
|
a.startConfigWriter(a.bgrndCtx)
|
||||||
|
|
||||||
|
appInstance = a
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func AppInstance() *App {
|
||||||
|
return appInstance
|
||||||
|
}
|
||||||
|
|
||||||
func (a *App) IsFirstLaunch() bool {
|
func (a *App) IsFirstLaunch() bool {
|
||||||
return a.isFirstLaunch
|
return a.isFirstLaunch
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -89,6 +89,10 @@ type FavoritesPageConfig struct {
|
|||||||
ShowAlbumYears bool
|
ShowAlbumYears bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type GridViewConfig struct {
|
||||||
|
CardSize float32
|
||||||
|
}
|
||||||
|
|
||||||
type PlaylistPageConfig struct {
|
type PlaylistPageConfig struct {
|
||||||
TracklistColumns []string
|
TracklistColumns []string
|
||||||
}
|
}
|
||||||
@@ -154,6 +158,7 @@ type Config struct {
|
|||||||
ArtistPage ArtistPageConfig
|
ArtistPage ArtistPageConfig
|
||||||
ArtistsPage ArtistsPageConfig
|
ArtistsPage ArtistsPageConfig
|
||||||
FavoritesPage FavoritesPageConfig
|
FavoritesPage FavoritesPageConfig
|
||||||
|
GridView GridViewConfig
|
||||||
PlaylistPage PlaylistPageConfig
|
PlaylistPage PlaylistPageConfig
|
||||||
PlaylistsPage PlaylistsPageConfig
|
PlaylistsPage PlaylistsPageConfig
|
||||||
TracksPage TracksPageConfig
|
TracksPage TracksPageConfig
|
||||||
@@ -215,6 +220,9 @@ func DefaultConfig(appVersionTag string) *Config {
|
|||||||
InitialView: "Albums",
|
InitialView: "Albums",
|
||||||
ShowAlbumYears: false,
|
ShowAlbumYears: false,
|
||||||
},
|
},
|
||||||
|
GridView: GridViewConfig{
|
||||||
|
CardSize: 200,
|
||||||
|
},
|
||||||
PlaylistPage: PlaylistPageConfig{
|
PlaylistPage: PlaylistPageConfig{
|
||||||
TracklistColumns: []string{"Album", "Time", "Plays"},
|
TracklistColumns: []string{"Album", "Time", "Plays"},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -97,6 +97,7 @@
|
|||||||
"Genres": "Genres",
|
"Genres": "Genres",
|
||||||
"Github page": "Github page",
|
"Github page": "Github page",
|
||||||
"Go to release page": "Go to release page",
|
"Go to release page": "Go to release page",
|
||||||
|
"Grid card size": "Grid card size",
|
||||||
"Hide": "Hide",
|
"Hide": "Hide",
|
||||||
"Home": "Home",
|
"Home": "Home",
|
||||||
"Home Page": "Home Page",
|
"Home Page": "Home Page",
|
||||||
|
|||||||
@@ -519,6 +519,16 @@ func (s *SettingsDialog) createAppearanceTab(window fyne.Window) *container.TabI
|
|||||||
})
|
})
|
||||||
disableDPI.Checked = s.config.Application.DisableDPIDetection
|
disableDPI.Checked = s.config.Application.DisableDPIDetection
|
||||||
|
|
||||||
|
gridCardSize := widget.NewSlider(150, 350)
|
||||||
|
gridCardSize.SetValue(float64(s.config.GridView.CardSize))
|
||||||
|
gridCardSize.Step = 10
|
||||||
|
gridCardSize.OnChanged = func(f float64) {
|
||||||
|
s.config.GridView.CardSize = float32(f)
|
||||||
|
if s.OnPageNeedsRefresh != nil {
|
||||||
|
s.OnPageNeedsRefresh()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return container.NewTabItem(lang.L("Appearance"), container.NewVBox(
|
return container.NewTabItem(lang.L("Appearance"), container.NewVBox(
|
||||||
util.NewHSpace(0), // insert a theme.Padding amount of space at top
|
util.NewHSpace(0), // insert a theme.Padding amount of space at top
|
||||||
container.NewBorder(nil, nil, widget.NewLabel(lang.L("Theme")), /*left*/
|
container.NewBorder(nil, nil, widget.NewLabel(lang.L("Theme")), /*left*/
|
||||||
@@ -527,6 +537,7 @@ func (s *SettingsDialog) createAppearanceTab(window fyne.Window) *container.TabI
|
|||||||
),
|
),
|
||||||
widget.NewRichText(&widget.TextSegment{Text: lang.L("UI Scaling"), Style: util.BoldRichTextStyle}),
|
widget.NewRichText(&widget.TextSegment{Text: lang.L("UI Scaling"), Style: util.BoldRichTextStyle}),
|
||||||
uiScaleRadio,
|
uiScaleRadio,
|
||||||
|
container.NewBorder(nil, nil, widget.NewLabel(lang.L("Grid card size")), nil, gridCardSize),
|
||||||
disableDPI,
|
disableDPI,
|
||||||
s.newSectionSeparator(),
|
s.newSectionSeparator(),
|
||||||
widget.NewRichText(&widget.TextSegment{Text: lang.L("Application font"), Style: util.BoldRichTextStyle}),
|
widget.NewRichText(&widget.TextSegment{Text: lang.L("Application font"), Style: util.BoldRichTextStyle}),
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import (
|
|||||||
|
|
||||||
"fyne.io/fyne/v2/lang"
|
"fyne.io/fyne/v2/lang"
|
||||||
|
|
||||||
|
"github.com/dweymouth/supersonic/backend"
|
||||||
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
"github.com/dweymouth/supersonic/backend/mediaprovider"
|
||||||
"github.com/dweymouth/supersonic/sharedutil"
|
"github.com/dweymouth/supersonic/sharedutil"
|
||||||
myTheme "github.com/dweymouth/supersonic/ui/theme"
|
myTheme "github.com/dweymouth/supersonic/ui/theme"
|
||||||
@@ -282,6 +283,7 @@ func (g *GridView) createGridWrap() {
|
|||||||
// update func
|
// update func
|
||||||
func(itemID widget.GridWrapItemID, obj fyne.CanvasObject) {
|
func(itemID widget.GridWrapItemID, obj fyne.CanvasObject) {
|
||||||
ac := obj.(*GridViewItem)
|
ac := obj.(*GridViewItem)
|
||||||
|
ac.SetSize(backend.AppInstance().Config.GridView.CardSize)
|
||||||
g.doUpdateItemCard(int(itemID), ac)
|
g.doUpdateItemCard(int(itemID), ac)
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
@@ -289,6 +291,7 @@ func (g *GridView) createGridWrap() {
|
|||||||
|
|
||||||
func (g *GridView) createNewItemCard() fyne.CanvasObject {
|
func (g *GridView) createNewItemCard() fyne.CanvasObject {
|
||||||
card := NewGridViewItem(g.Placeholder)
|
card := NewGridViewItem(g.Placeholder)
|
||||||
|
card.SetSize(backend.AppInstance().Config.GridView.CardSize)
|
||||||
card.ItemIndex = -1
|
card.ItemIndex = -1
|
||||||
card.ImgLoader = util.NewThumbnailLoader(g.imageFetcher, card.Cover.SetImage)
|
card.ImgLoader = util.NewThumbnailLoader(g.imageFetcher, card.Cover.SetImage)
|
||||||
card.ImgLoader.OnBeforeLoad = func() { card.Cover.SetImage(nil) }
|
card.ImgLoader.OnBeforeLoad = func() { card.Cover.SetImage(nil) }
|
||||||
|
|||||||
@@ -517,6 +517,10 @@ func (g *GridViewItem) Update(model *GridViewItemModel) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (g *GridViewItem) SetSize(sideDim float32) {
|
||||||
|
g.Cover.Im.SetMinSize(fyne.NewSquareSize(sideDim))
|
||||||
|
}
|
||||||
|
|
||||||
func (g *GridViewItem) Refresh() {
|
func (g *GridViewItem) Refresh() {
|
||||||
if g.focused {
|
if g.focused {
|
||||||
g.focusRect.Show()
|
g.focusRect.Show()
|
||||||
@@ -531,6 +535,7 @@ func (g *GridViewItem) Refresh() {
|
|||||||
g.secondaryText.Suffix = ""
|
g.secondaryText.Suffix = ""
|
||||||
g.secondaryText.Refresh()
|
g.secondaryText.Refresh()
|
||||||
}
|
}
|
||||||
|
canvas.Refresh(g)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GridViewItem) ItemID() string {
|
func (g *GridViewItem) ItemID() string {
|
||||||
|
|||||||
@@ -24,18 +24,18 @@ type ImagePlaceholder struct {
|
|||||||
image image.Image
|
image image.Image
|
||||||
iconImage *canvas.Image
|
iconImage *canvas.Image
|
||||||
border *myTheme.ThemedRectangle
|
border *myTheme.ThemedRectangle
|
||||||
minSize float32
|
minSize fyne.Size
|
||||||
|
|
||||||
OnTapped func(*fyne.PointEvent)
|
OnTapped func(*fyne.PointEvent)
|
||||||
OnTappedSecondary func(*fyne.PointEvent)
|
OnTappedSecondary func(*fyne.PointEvent)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewImagePlaceholder(centerIcon fyne.Resource, minSize float32) *ImagePlaceholder {
|
func NewImagePlaceholder(centerIcon fyne.Resource, minSize float32) *ImagePlaceholder {
|
||||||
i := &ImagePlaceholder{minSize: minSize, PlaceholderIcon: centerIcon}
|
i := &ImagePlaceholder{minSize: fyne.NewSquareSize(minSize), PlaceholderIcon: centerIcon}
|
||||||
i.ExtendBaseWidget(i)
|
i.ExtendBaseWidget(i)
|
||||||
i.iconImage = canvas.NewImageFromResource(centerIcon)
|
i.iconImage = canvas.NewImageFromResource(centerIcon)
|
||||||
i.iconImage.FillMode = canvas.ImageFillContain
|
i.iconImage.FillMode = canvas.ImageFillContain
|
||||||
i.iconImage.SetMinSize(fyne.NewSize(minSize/4, minSize/4))
|
i.iconImage.SetMinSize(fyne.NewSquareSize(minSize / 4))
|
||||||
i.imageDisp = NewTappableImage(i.onTapped)
|
i.imageDisp = NewTappableImage(i.onTapped)
|
||||||
i.imageDisp.OnTappedSecondary = i.onTappedSecondary
|
i.imageDisp.OnTappedSecondary = i.onTappedSecondary
|
||||||
i.imageDisp.FillMode = canvas.ImageFillContain
|
i.imageDisp.FillMode = canvas.ImageFillContain
|
||||||
@@ -88,8 +88,18 @@ func (i *ImagePlaceholder) onTappedSecondary(e *fyne.PointEvent) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (i *ImagePlaceholder) SetMinSize(size fyne.Size) {
|
||||||
|
if i.minSize == size {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
i.minSize = size
|
||||||
|
d := fyne.Min(i.minSize.Width, i.minSize.Height)
|
||||||
|
i.iconImage.SetMinSize(fyne.NewSquareSize(d / 4))
|
||||||
|
}
|
||||||
|
|
||||||
func (i *ImagePlaceholder) MinSize() fyne.Size {
|
func (i *ImagePlaceholder) MinSize() fyne.Size {
|
||||||
return fyne.NewSize(i.minSize, i.minSize)
|
return i.minSize
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *ImagePlaceholder) Refresh() {
|
func (i *ImagePlaceholder) Refresh() {
|
||||||
|
|||||||
Reference in New Issue
Block a user