Run gofumpt on the project
This commit is contained in:
+1
-1
@@ -317,7 +317,7 @@ func (c *Config) WriteConfigFile(filepath string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
os.WriteFile(filepath, b, 0644)
|
os.WriteFile(filepath, b, 0o644)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,9 +39,7 @@ type ImageCache struct {
|
|||||||
cache map[string]CacheItem
|
cache map[string]CacheItem
|
||||||
}
|
}
|
||||||
|
|
||||||
var (
|
var ErrNotFound = errors.New("item not found")
|
||||||
ErrNotFound = errors.New("item not found")
|
|
||||||
)
|
|
||||||
|
|
||||||
func (i *ImageCache) Init(ctx context.Context, evictionInterval time.Duration) {
|
func (i *ImageCache) Init(ctx context.Context, evictionInterval time.Duration) {
|
||||||
i.cache = make(map[string]CacheItem)
|
i.cache = make(map[string]CacheItem)
|
||||||
@@ -238,5 +236,4 @@ func (i *ImageCache) EvictExpired() {
|
|||||||
delete(i.cache, key)
|
delete(i.cache, key)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -130,7 +130,6 @@ func (c *Client) Quit() error {
|
|||||||
|
|
||||||
func (c *Client) sendRequest(path string) (string, error) {
|
func (c *Client) sendRequest(path string) (string, error) {
|
||||||
resp, err := c.httpC.Get("http://supersonic/" + path)
|
resp, err := c.httpC.Get("http://supersonic/" + path)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,9 +32,11 @@ type MediaIterator[M any] interface {
|
|||||||
Next() *M
|
Next() *M
|
||||||
}
|
}
|
||||||
|
|
||||||
type ArtistIterator = MediaIterator[Artist]
|
type (
|
||||||
type AlbumIterator = MediaIterator[Album]
|
ArtistIterator = MediaIterator[Artist]
|
||||||
type TrackIterator = MediaIterator[Track]
|
AlbumIterator = MediaIterator[Album]
|
||||||
|
TrackIterator = MediaIterator[Track]
|
||||||
|
)
|
||||||
|
|
||||||
type MediaFilter[M, F any] interface {
|
type MediaFilter[M, F any] interface {
|
||||||
Options() F
|
Options() F
|
||||||
|
|||||||
@@ -298,7 +298,8 @@ func (s *subsonicMediaProvider) ClientDecidesScrobble() bool { return true }
|
|||||||
func (s *subsonicMediaProvider) TrackBeganPlayback(trackID string) error {
|
func (s *subsonicMediaProvider) TrackBeganPlayback(trackID string) error {
|
||||||
return s.client.Scrobble(trackID, map[string]string{
|
return s.client.Scrobble(trackID, map[string]string{
|
||||||
"time": strconv.FormatInt(time.Now().UnixMilli(), 10),
|
"time": strconv.FormatInt(time.Now().UnixMilli(), 10),
|
||||||
"submission": "false"})
|
"submission": "false",
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *subsonicMediaProvider) TrackEndedPlayback(trackID string, _ int, submission bool) error {
|
func (s *subsonicMediaProvider) TrackEndedPlayback(trackID string, _ int, submission bool) error {
|
||||||
@@ -307,7 +308,8 @@ func (s *subsonicMediaProvider) TrackEndedPlayback(trackID string, _ int, submis
|
|||||||
}
|
}
|
||||||
return s.client.Scrobble(trackID, map[string]string{
|
return s.client.Scrobble(trackID, map[string]string{
|
||||||
"time": strconv.FormatInt(time.Now().UnixMilli(), 10),
|
"time": strconv.FormatInt(time.Now().UnixMilli(), 10),
|
||||||
"submission": "true"})
|
"submission": "true",
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *subsonicMediaProvider) SetFavorite(params mediaprovider.RatingFavoriteParameters, favorite bool) error {
|
func (s *subsonicMediaProvider) SetFavorite(params mediaprovider.RatingFavoriteParameters, favorite bool) error {
|
||||||
|
|||||||
+1
-3
@@ -24,9 +24,7 @@ var (
|
|||||||
_ types.OrgMprisMediaPlayer2PlayerAdapterLoopStatus = (*MPRISHandler)(nil)
|
_ types.OrgMprisMediaPlayer2PlayerAdapterLoopStatus = (*MPRISHandler)(nil)
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var errNotSupported = errors.New("not supported")
|
||||||
errNotSupported = errors.New("not supported")
|
|
||||||
)
|
|
||||||
|
|
||||||
type MPRISHandler struct {
|
type MPRISHandler struct {
|
||||||
// Function called if the player is requested to quit through MPRIS.
|
// Function called if the player is requested to quit through MPRIS.
|
||||||
|
|||||||
@@ -109,7 +109,6 @@ func (j *JukeboxPlayer) SetNextTrack(track *mediaprovider.Track) error {
|
|||||||
}
|
}
|
||||||
j.queueLength += 1
|
j.queueLength += 1
|
||||||
return nil
|
return nil
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (j *JukeboxPlayer) SeekSeconds(secs float64) error {
|
func (j *JukeboxPlayer) SeekSeconds(secs float64) error {
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package mpv
|
|||||||
// #include <mpv/client.h>
|
// #include <mpv/client.h>
|
||||||
// int mpv_get_peaks(mpv_handle* handle, double* lPeak, double* rPeak, double* lRMS, double* rRMS);
|
// int mpv_get_peaks(mpv_handle* handle, double* lPeak, double* rPeak, double* lRMS, double* rRMS);
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/supersonic-app/go-mpv"
|
"github.com/supersonic-app/go-mpv"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ func SavePlayQueue(serverID string, pm *PlaybackManager, filepath string, server
|
|||||||
TimePos: stats.TimePos,
|
TimePos: stats.TimePos,
|
||||||
}
|
}
|
||||||
b, _ := json.Marshal(saved)
|
b, _ := json.Marshal(saved)
|
||||||
err := os.WriteFile(filepath, b, 0644)
|
err := os.WriteFile(filepath, b, 0o644)
|
||||||
|
|
||||||
if server != nil {
|
if server != nil {
|
||||||
// save to server
|
// save to server
|
||||||
|
|||||||
@@ -391,7 +391,7 @@ func computePeakAndRMS(chunk []float64) (peak float64, rms float64) {
|
|||||||
sumSquares += float64(v * v)
|
sumSquares += float64(v * v)
|
||||||
}
|
}
|
||||||
rms = math.Sqrt(sumSquares / float64(len(chunk)))
|
rms = math.Sqrt(sumSquares / float64(len(chunk)))
|
||||||
return
|
return peak, rms
|
||||||
}
|
}
|
||||||
|
|
||||||
func float64ToByte(val float64) byte {
|
func float64ToByte(val float64) byte {
|
||||||
|
|||||||
@@ -17,8 +17,10 @@ import (
|
|||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SMTCPlaybackState int
|
type (
|
||||||
type SMTCButton int
|
SMTCPlaybackState int
|
||||||
|
SMTCButton int
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// constants from smtc.h in github.com/supersonic-app/smtc-dll
|
// constants from smtc.h in github.com/supersonic-app/smtc-dll
|
||||||
|
|||||||
@@ -4,8 +4,10 @@ package windows
|
|||||||
|
|
||||||
import "errors"
|
import "errors"
|
||||||
|
|
||||||
type SMTCPlaybackState int
|
type (
|
||||||
type SMTCButton int
|
SMTCPlaybackState int
|
||||||
|
SMTCButton int
|
||||||
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
// constants from smtc.h in github.com/supersonic-app/smtc-dll
|
// constants from smtc.h in github.com/supersonic-app/smtc-dll
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ package windows
|
|||||||
extern void goButtonClicked(int);
|
extern void goButtonClicked(int);
|
||||||
*/
|
*/
|
||||||
import "C"
|
import "C"
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
"errors"
|
||||||
"image"
|
"image"
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func Test_ReorderItems(t *testing.T) {
|
func Test_ReorderItems(t *testing.T) {
|
||||||
|
|
||||||
tracks := []*mediaprovider.Track{
|
tracks := []*mediaprovider.Track{
|
||||||
{ID: "a"}, // 0
|
{ID: "a"}, // 0
|
||||||
{ID: "b"}, // 1
|
{ID: "b"}, // 1
|
||||||
|
|||||||
@@ -204,7 +204,8 @@ func NewGenreList(sorting widgets.ListHeaderSort) *GenreList {
|
|||||||
a.hdr = widgets.NewListHeader([]widgets.ListColumn{
|
a.hdr = widgets.NewListHeader([]widgets.ListColumn{
|
||||||
{Text: lang.L("Name"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
{Text: lang.L("Name"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
||||||
{Text: albumCount, Alignment: fyne.TextAlignTrailing, CanToggleVisible: false},
|
{Text: albumCount, Alignment: fyne.TextAlignTrailing, CanToggleVisible: false},
|
||||||
{Text: trackCount, Alignment: fyne.TextAlignTrailing, CanToggleVisible: false}},
|
{Text: trackCount, Alignment: fyne.TextAlignTrailing, CanToggleVisible: false},
|
||||||
|
},
|
||||||
a.columnsLayout)
|
a.columnsLayout)
|
||||||
a.hdr.SetSorting(sorting)
|
a.hdr.SetSorting(sorting)
|
||||||
a.hdr.OnColumnSortChanged = a.onSorted
|
a.hdr.OnColumnSortChanged = a.onSorted
|
||||||
|
|||||||
@@ -360,8 +360,10 @@ func (a *NowPlayingPage) updateLyrics() {
|
|||||||
// set the widget to an empty (not nil) lyric during fetch
|
// set the widget to an empty (not nil) lyric during fetch
|
||||||
// to keep it from showing "Lyrics not available"
|
// to keep it from showing "Lyrics not available"
|
||||||
a.lyricsViewer.DisableTapToSeek()
|
a.lyricsViewer.DisableTapToSeek()
|
||||||
a.lyricsViewer.SetLyrics(&mediaprovider.Lyrics{Synced: true,
|
a.lyricsViewer.SetLyrics(&mediaprovider.Lyrics{
|
||||||
Lines: []mediaprovider.LyricLine{{Text: ""}}})
|
Synced: true,
|
||||||
|
Lines: []mediaprovider.LyricLine{{Text: ""}},
|
||||||
|
})
|
||||||
tr, _ := a.nowPlaying.(*mediaprovider.Track)
|
tr, _ := a.nowPlaying.(*mediaprovider.Track)
|
||||||
go a.fetchLyrics(ctx, tr)
|
go a.fetchLyrics(ctx, tr)
|
||||||
}
|
}
|
||||||
@@ -482,7 +484,6 @@ func (a *NowPlayingPage) OnPlayTimeUpdate(curTime, _ float64, seeked bool) {
|
|||||||
|
|
||||||
func (a *NowPlayingPage) currentTracklistOrNil() *widgets.PlayQueueList {
|
func (a *NowPlayingPage) currentTracklistOrNil() *widgets.PlayQueueList {
|
||||||
if a.tabs != nil {
|
if a.tabs != nil {
|
||||||
|
|
||||||
switch a.tabs.SelectedIndex() {
|
switch a.tabs.SelectedIndex() {
|
||||||
case 0: /*queue*/
|
case 0: /*queue*/
|
||||||
return a.queueList
|
return a.queueList
|
||||||
|
|||||||
@@ -389,7 +389,8 @@ func (p *PlaylistList) buildHeaderAndLayout() {
|
|||||||
{Text: lang.L("Name"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
{Text: lang.L("Name"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
||||||
{Text: lang.L("_Description"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
{Text: lang.L("_Description"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
||||||
{Text: lang.L("Owner"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
{Text: lang.L("Owner"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
||||||
{Text: trackCount, Alignment: fyne.TextAlignTrailing, CanToggleVisible: false}}, p.columnsLayout)
|
{Text: trackCount, Alignment: fyne.TextAlignTrailing, CanToggleVisible: false},
|
||||||
|
}, p.columnsLayout)
|
||||||
p.header.SetSorting(p.sorting)
|
p.header.SetSorting(p.sorting)
|
||||||
p.header.OnColumnSortChanged = p.onSorted
|
p.header.OnColumnSortChanged = p.onSorted
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -253,7 +253,8 @@ func NewRadioList(nowPlayingIDPtr *string) *RadioList {
|
|||||||
a.ExtendBaseWidget(a)
|
a.ExtendBaseWidget(a)
|
||||||
a.hdr = widgets.NewListHeader([]widgets.ListColumn{
|
a.hdr = widgets.NewListHeader([]widgets.ListColumn{
|
||||||
{Text: lang.L("Name"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
{Text: lang.L("Name"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
||||||
{Text: lang.L("Home Page"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false}},
|
{Text: lang.L("Home Page"), Alignment: fyne.TextAlignLeading, CanToggleVisible: false},
|
||||||
|
},
|
||||||
a.columnsLayout)
|
a.columnsLayout)
|
||||||
a.hdr.DisableSorting = true
|
a.hdr.DisableSorting = true
|
||||||
a.list = widgets.NewFocusList(
|
a.list = widgets.NewFocusList(
|
||||||
@@ -299,8 +300,7 @@ func NewRadioList(nowPlayingIDPtr *string) *RadioList {
|
|||||||
row.IsPlaying = isPlaying
|
row.IsPlaying = isPlaying
|
||||||
row.nameLabel.Segments[0].(*widget.TextSegment).Style.TextStyle.Bold = isPlaying
|
row.nameLabel.Segments[0].(*widget.TextSegment).Style.TextStyle.Bold = isPlaying
|
||||||
if isPlaying {
|
if isPlaying {
|
||||||
row.Content.(*fyne.Container).Objects[0] =
|
row.Content.(*fyne.Container).Objects[0] = container.NewBorder(nil, nil, a.playingIcon, nil,
|
||||||
container.NewBorder(nil, nil, a.playingIcon, nil,
|
|
||||||
container.New(layout.NewCustomPaddedLayout(0, 0, -5, 0), row.nameLabel))
|
container.New(layout.NewCustomPaddedLayout(0, 0, -5, 0), row.nameLabel))
|
||||||
} else {
|
} else {
|
||||||
row.Content.(*fyne.Container).Objects[0] = row.nameLabel
|
row.Content.(*fyne.Container).Objects[0] = row.nameLabel
|
||||||
|
|||||||
@@ -309,7 +309,6 @@ func (c *Controller) ShowAboutDialog() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) ShowSettingsDialog(themeUpdateCallbk func(), themeFiles map[string]string) {
|
func (c *Controller) ShowSettingsDialog(themeUpdateCallbk func(), themeFiles map[string]string) {
|
||||||
|
|
||||||
devs, err := c.App.LocalPlayer.ListAudioDevices()
|
devs, err := c.App.LocalPlayer.ListAudioDevices()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("error listing audio devices: %v", err)
|
log.Printf("error listing audio devices: %v", err)
|
||||||
@@ -358,7 +357,6 @@ func (c *Controller) ShowSettingsDialog(themeUpdateCallbk func(), themeFiles map
|
|||||||
c.ClosePopUpOnEscape(pop)
|
c.ClosePopUpOnEscape(pop)
|
||||||
c.haveModal = true
|
c.haveModal = true
|
||||||
pop.Show()
|
pop.Show()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Controller) doModalClosed() {
|
func (c *Controller) doModalClosed() {
|
||||||
@@ -467,7 +465,6 @@ func (c *Controller) ShowDownloadDialog(tracks []*mediaprovider.Track, downloadN
|
|||||||
} else {
|
} else {
|
||||||
go c.downloadTracks(tracks, file.URI().Path(), downloadName)
|
go c.downloadTracks(tracks, file.URI().Path(), downloadName)
|
||||||
}
|
}
|
||||||
|
|
||||||
},
|
},
|
||||||
c.MainWindow)
|
c.MainWindow)
|
||||||
dg.SetFileName(fileName)
|
dg.SetFileName(fileName)
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ func (m *Controller) DoAddTracksToPlaylistWorkflow(trackIDs []string) {
|
|||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
})
|
})
|
||||||
m.ClosePopUpOnEscape(pop)
|
m.ClosePopUpOnEscape(pop)
|
||||||
m.haveModal = true
|
m.haveModal = true
|
||||||
|
|||||||
@@ -81,6 +81,7 @@ func GenresRoute() Route {
|
|||||||
func PlaylistRoute(id string) Route {
|
func PlaylistRoute(id string) Route {
|
||||||
return Route{Page: Playlist, Arg: id}
|
return Route{Page: Playlist, Arg: id}
|
||||||
}
|
}
|
||||||
|
|
||||||
func PlaylistsRoute() Route {
|
func PlaylistsRoute() Route {
|
||||||
return Route{Page: Playlists}
|
return Route{Page: Playlists}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -200,7 +200,6 @@ func (m *Controller) PromptForLoginAndConnect() {
|
|||||||
pop.Show()
|
pop.Show()
|
||||||
}
|
}
|
||||||
}, m.MainWindow)
|
}, m.MainWindow)
|
||||||
|
|
||||||
}
|
}
|
||||||
m.haveModal = true
|
m.haveModal = true
|
||||||
pop.Show()
|
pop.Show()
|
||||||
|
|||||||
@@ -374,5 +374,4 @@ func (q *searchEntry) TypedKey(e *fyne.KeyEvent) {
|
|||||||
default:
|
default:
|
||||||
q.SearchEntry.TypedKey(e)
|
q.SearchEntry.TypedKey(e)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -488,7 +488,8 @@ func (s *SettingsDialog) createAppearanceTab(window fyne.Window) *container.TabI
|
|||||||
themeModeSelect := widget.NewSelect([]string{
|
themeModeSelect := widget.NewSelect([]string{
|
||||||
string(myTheme.AppearanceDark),
|
string(myTheme.AppearanceDark),
|
||||||
string(myTheme.AppearanceLight),
|
string(myTheme.AppearanceLight),
|
||||||
string(myTheme.AppearanceAuto)}, nil)
|
string(myTheme.AppearanceAuto),
|
||||||
|
}, nil)
|
||||||
themeModeSelect.OnChanged = func(_ string) {
|
themeModeSelect.OnChanged = func(_ string) {
|
||||||
s.config.Theme.Appearance = themeModeSelect.Options[themeModeSelect.SelectedIndex()]
|
s.config.Theme.Appearance = themeModeSelect.Options[themeModeSelect.SelectedIndex()]
|
||||||
if s.OnThemeSettingChanged != nil {
|
if s.OnThemeSettingChanged != nil {
|
||||||
|
|||||||
@@ -20,6 +20,8 @@ var (
|
|||||||
ShortcutNavSeven = desktop.CustomShortcut{KeyName: fyne.Key7, Modifier: fyne.KeyModifierShortcutDefault}
|
ShortcutNavSeven = desktop.CustomShortcut{KeyName: fyne.Key7, Modifier: fyne.KeyModifierShortcutDefault}
|
||||||
ShortcutNavEight = desktop.CustomShortcut{KeyName: fyne.Key8, Modifier: fyne.KeyModifierShortcutDefault}
|
ShortcutNavEight = desktop.CustomShortcut{KeyName: fyne.Key8, Modifier: fyne.KeyModifierShortcutDefault}
|
||||||
|
|
||||||
NavShortcuts = []desktop.CustomShortcut{ShortcutNavOne, ShortcutNavTwo, ShortcutNavThree,
|
NavShortcuts = []desktop.CustomShortcut{
|
||||||
ShortcutNavFour, ShortcutNavFive, ShortcutNavSix, ShortcutNavSeven, ShortcutNavEight}
|
ShortcutNavOne, ShortcutNavTwo, ShortcutNavThree,
|
||||||
|
ShortcutNavFour, ShortcutNavFive, ShortcutNavSix, ShortcutNavSeven, ShortcutNavEight,
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -89,7 +89,6 @@ func (t *ToastOverlay) makeToastAnimFunc(endPos fyne.Position, dismissal bool) f
|
|||||||
t.cancelPreviousToast()
|
t.cancelPreviousToast()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+3
-3
@@ -225,7 +225,7 @@ func colorToHexAndOpacity(color color.Color) (hexStr, aStr string) {
|
|||||||
r, g, b, a := toNRGBA(color)
|
r, g, b, a := toNRGBA(color)
|
||||||
cBytes := []byte{byte(r), byte(g), byte(b)}
|
cBytes := []byte{byte(r), byte(g), byte(b)}
|
||||||
hexStr, aStr = "#"+hex.EncodeToString(cBytes), strconv.FormatFloat(float64(a)/0xff, 'f', 6, 64)
|
hexStr, aStr = "#"+hex.EncodeToString(cBytes), strconv.FormatFloat(float64(a)/0xff, 'f', 6, 64)
|
||||||
return
|
return hexStr, aStr
|
||||||
}
|
}
|
||||||
|
|
||||||
// toNRGBA converts a color to RGBA values which are not premultiplied, unlike color.RGBA().
|
// toNRGBA converts a color to RGBA values which are not premultiplied, unlike color.RGBA().
|
||||||
@@ -300,7 +300,7 @@ func toNRGBA(c color.Color) (r, g, b, a int) {
|
|||||||
default: // RGBA, RGBA64, and unknown implementations of Color
|
default: // RGBA, RGBA64, and unknown implementations of Color
|
||||||
r, g, b, a = unmultiplyAlpha(c)
|
r, g, b, a = unmultiplyAlpha(c)
|
||||||
}
|
}
|
||||||
return
|
return r, g, b, a
|
||||||
}
|
}
|
||||||
|
|
||||||
// unmultiplyAlpha returns a color's RGBA components as 8-bit integers by calling c.RGBA() and then removing the alpha premultiplication.
|
// unmultiplyAlpha returns a color's RGBA components as 8-bit integers by calling c.RGBA() and then removing the alpha premultiplication.
|
||||||
@@ -317,5 +317,5 @@ func unmultiplyAlpha(c color.Color) (r, g, b, a int) {
|
|||||||
g = int(green >> 8)
|
g = int(green >> 8)
|
||||||
b = int(blue >> 8)
|
b = int(blue >> 8)
|
||||||
a = int(alpha >> 8)
|
a = int(alpha >> 8)
|
||||||
return
|
return r, g, b, a
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -55,7 +55,7 @@ func dateFormatForLocale(locale string) DateFormat {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func shortMonthName(month int) string {
|
func shortMonthName(month int) string {
|
||||||
var months = [12]string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"}
|
months := [12]string{"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"}
|
||||||
if month >= 1 && month <= 12 {
|
if month >= 1 && month <= 12 {
|
||||||
return lang.L(months[month-1])
|
return lang.L(months[month-1])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -71,10 +71,12 @@ func (g *FocusList) FocusNeighbor(curItem widget.ListItemID, up bool) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var _ fyne.Tappable = (*FocusListRowBase)(nil)
|
var (
|
||||||
var _ fyne.Widget = (*FocusListRowBase)(nil)
|
_ fyne.Tappable = (*FocusListRowBase)(nil)
|
||||||
var _ fyne.Focusable = (*FocusListRowBase)(nil)
|
_ fyne.Widget = (*FocusListRowBase)(nil)
|
||||||
var _ desktop.Hoverable = (*FocusListRowBase)(nil)
|
_ fyne.Focusable = (*FocusListRowBase)(nil)
|
||||||
|
_ desktop.Hoverable = (*FocusListRowBase)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
// Base type used for all list rows in widgets such as Tracklist, etc.
|
// Base type used for all list rows in widgets such as Tracklist, etc.
|
||||||
type FocusListRowBase struct {
|
type FocusListRowBase struct {
|
||||||
|
|||||||
@@ -21,8 +21,10 @@ import (
|
|||||||
"github.com/dweymouth/supersonic/ui/util"
|
"github.com/dweymouth/supersonic/ui/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ fyne.Widget = (*GridViewItem)(nil)
|
var (
|
||||||
var _ fyne.Focusable = (*GridViewItem)(nil)
|
_ fyne.Widget = (*GridViewItem)(nil)
|
||||||
|
_ fyne.Focusable = (*GridViewItem)(nil)
|
||||||
|
)
|
||||||
|
|
||||||
var _ fyne.Widget = (*coverImage)(nil)
|
var _ fyne.Widget = (*coverImage)(nil)
|
||||||
|
|
||||||
|
|||||||
@@ -28,8 +28,10 @@ type LoadingDots struct {
|
|||||||
func NewLoadingDots() *LoadingDots {
|
func NewLoadingDots() *LoadingDots {
|
||||||
l := &LoadingDots{}
|
l := &LoadingDots{}
|
||||||
for i := range l.dots {
|
for i := range l.dots {
|
||||||
l.dots[i] = minSizeCircle{Circle: canvas.Circle{
|
l.dots[i] = minSizeCircle{
|
||||||
FillColor: theme.DisabledColor()},
|
Circle: canvas.Circle{
|
||||||
|
FillColor: theme.DisabledColor(),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
l.ExtendBaseWidget(l)
|
l.ExtendBaseWidget(l)
|
||||||
|
|||||||
@@ -264,7 +264,6 @@ func (p *PlayQueueList) onShowContextMenu(e *fyne.PointEvent, trackIdx int) {
|
|||||||
p.ensureRadiosMenu()
|
p.ensureRadiosMenu()
|
||||||
p.radiosMenu.ShowAtPosition(e.AbsolutePosition)
|
p.radiosMenu.ShowAtPosition(e.AbsolutePosition)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PlayQueueList) ensureTracksMenu() {
|
func (p *PlayQueueList) ensureTracksMenu() {
|
||||||
|
|||||||
@@ -352,6 +352,7 @@ func (t *tracklistRowBase) create(tracklist *Tracklist) {
|
|||||||
func (t *tracklistRowBase) SetOnTappedSecondary(f func(*fyne.PointEvent, int)) {
|
func (t *tracklistRowBase) SetOnTappedSecondary(f func(*fyne.PointEvent, int)) {
|
||||||
t.OnTappedSecondary = f
|
t.OnTappedSecondary = f
|
||||||
}
|
}
|
||||||
|
|
||||||
func (t *tracklistRowBase) TrackID() string {
|
func (t *tracklistRowBase) TrackID() string {
|
||||||
return t.trackID
|
return t.trackID
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user