From 6f08032f227daf69254063f855cd1567e5583f75 Mon Sep 17 00:00:00 2001 From: Drew Weymouth Date: Thu, 19 Oct 2023 09:07:35 -0700 Subject: [PATCH] pull in patched hyperlink bug fix from Fyne, start removing CustomHyperlink --- go.mod | 2 +- go.sum | 4 +- ui/browsing/albumpage.go | 10 ++- ui/browsing/artistpage.go | 5 +- ui/widgets/customhyperlink.go | 133 ----------------------------- ui/widgets/disableablehyperlink.go | 73 ++++++++++++++++ ui/widgets/gridviewitem.go | 11 +-- ui/widgets/nowplayingcard.go | 16 ++-- ui/widgets/tracklist.go | 9 +- 9 files changed, 104 insertions(+), 159 deletions(-) delete mode 100644 ui/widgets/customhyperlink.go create mode 100644 ui/widgets/disableablehyperlink.go diff --git a/go.mod b/go.mod index 83b7bae..cf35c7b 100644 --- a/go.mod +++ b/go.mod @@ -47,4 +47,4 @@ require ( honnef.co/go/js/dom v0.0.0-20210725211120-f030747120f2 // indirect ) -replace fyne.io/fyne/v2 v2.3.5 => github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20230505012127-ca61c153b2a5 +replace fyne.io/fyne/v2 v2.3.5 => github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20231019154213-5f32d36c2968 diff --git a/go.sum b/go.sum index d267dc9..e972422 100644 --- a/go.sum +++ b/go.sum @@ -74,8 +74,8 @@ github.com/danieljoos/wincred v1.1.0/go.mod h1:XYlo+eRTsVA9aHGp7NGjFkPla4m+DCL7h github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20230505012127-ca61c153b2a5 h1:uXbHzg9HfefA7OVHu9gahobCP5B43df3L1MwU0GbdRs= -github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20230505012127-ca61c153b2a5/go.mod h1:X2+NrR+62mvAiAt2fwKT7035zQsE77KVV1NlvWo4vW8= +github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20231019154213-5f32d36c2968 h1:RYHUvyoVXfXprkVU06XkzupfldcZ9vlhslxFYi00YCY= +github.com/dweymouth/fyne/v2 v2.3.0-rc1.0.20231019154213-5f32d36c2968/go.mod h1:X2+NrR+62mvAiAt2fwKT7035zQsE77KVV1NlvWo4vW8= github.com/dweymouth/go-mpv v0.0.0-20230406003141-7f1858e503ee h1:ZGyJ6wp7CAfT31BugypcF/TPKEy2RrGR9JFq1JOjOpY= github.com/dweymouth/go-mpv v0.0.0-20230406003141-7f1858e503ee/go.mod h1:Ov0ieN90M7i+0k3OxhA/g1dozGs+UcPHDsMKqPgRDk0= github.com/dweymouth/go-subsonic v0.0.0-20231013011542-14b66c5a1fff h1:71TfIg5TMXMi9rGQYFhW8Gvs/GmBGK9O2gSmgzYXl4I= diff --git a/ui/browsing/albumpage.go b/ui/browsing/albumpage.go index 1b38846..1e9582c 100644 --- a/ui/browsing/albumpage.go +++ b/ui/browsing/albumpage.go @@ -175,8 +175,8 @@ type AlbumPageHeader struct { cover *widgets.TappableImage titleLabel *widget.RichText - artistLabel *widgets.CustomHyperlink - genreLabel *widgets.CustomHyperlink + artistLabel *widget.Hyperlink + genreLabel *widget.Hyperlink miscLabel *widget.Label toggleFavButton *widgets.FavoriteButton @@ -200,11 +200,13 @@ func NewAlbumPageHeader(page *AlbumPage) *AlbumPageHeader { a.titleLabel.Segments[0].(*widget.TextSegment).Style = widget.RichTextStyle{ SizeName: theme.SizeNameHeadingText, } - a.artistLabel = widgets.NewCustomHyperlink() + a.artistLabel = widget.NewHyperlink("", nil) + a.artistLabel.Wrapping = fyne.TextTruncate a.artistLabel.OnTapped = func() { a.page.contr.NavigateTo(controller.ArtistRoute(a.artistID)) } - a.genreLabel = widgets.NewCustomHyperlink() + a.genreLabel = widget.NewHyperlink("", nil) + a.genreLabel.Wrapping = fyne.TextTruncate a.genreLabel.OnTapped = func() { a.page.contr.NavigateTo(controller.GenreRoute(a.genre)) } diff --git a/ui/browsing/artistpage.go b/ui/browsing/artistpage.go index 05bf1ed..b4d2c47 100644 --- a/ui/browsing/artistpage.go +++ b/ui/browsing/artistpage.go @@ -366,10 +366,9 @@ func (a *ArtistPageHeader) UpdateInfo(info *mediaprovider.ArtistInfo) { break } if len(a.similarArtists.Objects) <= i+1 { - a.similarArtists.Add(widgets.NewCustomHyperlink()) + a.similarArtists.Add(widget.NewHyperlink("", nil)) } - h := a.similarArtists.Objects[i+1].(*widgets.CustomHyperlink) - h.NoTruncate = true + h := a.similarArtists.Objects[i+1].(*widget.Hyperlink) h.SetText(art.Name) h.OnTapped = func(id string) func() { return func() { a.artistPage.contr.NavigateTo(controller.ArtistRoute(id)) } diff --git a/ui/widgets/customhyperlink.go b/ui/widgets/customhyperlink.go deleted file mode 100644 index 321b127..0000000 --- a/ui/widgets/customhyperlink.go +++ /dev/null @@ -1,133 +0,0 @@ -package widgets - -import ( - "fyne.io/fyne/v2" - "fyne.io/fyne/v2/container" - "fyne.io/fyne/v2/layout" - "fyne.io/fyne/v2/theme" - "fyne.io/fyne/v2/widget" -) - -type hyperlinkWrapper struct { - widget.Hyperlink - - textWidthCached float32 - MaxWidth float32 -} - -func newHyperlinkWrapper() *hyperlinkWrapper { - h := &hyperlinkWrapper{ - Hyperlink: widget.Hyperlink{ - Text: "", - Wrapping: fyne.TextTruncate, - }, - textWidthCached: -1, - } - h.ExtendBaseWidget(h) - return h -} - -func (h *hyperlinkWrapper) MinSize() fyne.Size { - if h.textWidthCached < 0 { - s := fyne.MeasureText(h.Text, theme.TextSize(), h.TextStyle) - // the 2.7 factor is a bit of a magic number but it works ¯\_(ツ)_/¯ - h.textWidthCached = s.Width + theme.Padding()*2.7 - } - return fyne.NewSize(fyne.Min(h.MaxWidth, h.textWidthCached), h.Hyperlink.MinSize().Height) -} - -func (h *hyperlinkWrapper) SetText(text string) { - h.Text = text - h.textWidthCached = -1 -} - -func (h *hyperlinkWrapper) TypedKey(e *fyne.KeyEvent) { - if e.Name == fyne.KeySpace { - if h.OnTapped != nil { - h.OnTapped() - } - } -} - -type CustomHyperlink struct { - widget.BaseWidget - h *hyperlinkWrapper - l *widget.Label - - OnTapped func() - NoTruncate bool - Disabled bool - - lastDisabled bool - container *fyne.Container - fullTextWidth float32 -} - -func NewCustomHyperlink() *CustomHyperlink { - c := &CustomHyperlink{ - h: newHyperlinkWrapper(), - l: widget.NewLabel(""), - container: container.NewMax(), - } - c.h.OnTapped = func() { - if c.OnTapped != nil { - c.OnTapped() - } - } - c.fullTextWidth = c.l.MinSize().Width - c.ExtendBaseWidget(c) - c.updateContainer(c.Disabled) - return c -} - -func (c *CustomHyperlink) SetText(text string) { - lastWrapping := c.l.Wrapping - c.l.Wrapping = fyne.TextWrapOff - c.l.SetText(text) - c.fullTextWidth = c.l.MinSize().Width - c.h.SetText(text) - c.l.Wrapping = lastWrapping - c.Refresh() -} - -func (c *CustomHyperlink) SetTextStyle(style fyne.TextStyle) { - c.h.TextStyle = style -} - -func (c *CustomHyperlink) Resize(size fyne.Size) { - c.h.MaxWidth = size.Width - c.BaseWidget.Resize(size) -} - -func (c *CustomHyperlink) Refresh() { - if c.NoTruncate { - c.l.Wrapping = fyne.TextWrapOff - } else { - c.l.Wrapping = fyne.TextTruncate - } - if c.lastDisabled != c.Disabled { - c.updateContainer(c.Disabled) - c.lastDisabled = c.Disabled - } - c.container.Refresh() -} - -func (c *CustomHyperlink) MinSize() fyne.Size { - if c.NoTruncate { - return fyne.NewSize(c.fullTextWidth, c.l.MinSize().Height) - } - return fyne.NewSize(0, c.l.MinSize().Height) -} - -func (c *CustomHyperlink) CreateRenderer() fyne.WidgetRenderer { - return widget.NewSimpleRenderer(c.container) -} - -func (c *CustomHyperlink) updateContainer(linkDisabled bool) { - c.container.RemoveAll() - if linkDisabled { - c.container.Add(c.l) - } else { - c.container.Add(container.NewHBox(c.h, layout.NewSpacer())) - } -} diff --git a/ui/widgets/disableablehyperlink.go b/ui/widgets/disableablehyperlink.go new file mode 100644 index 0000000..fa3845b --- /dev/null +++ b/ui/widgets/disableablehyperlink.go @@ -0,0 +1,73 @@ +package widgets + +import ( + "fyne.io/fyne/v2" + "fyne.io/fyne/v2/container" + "fyne.io/fyne/v2/widget" +) + +type DisableableHyperlink struct { + widget.BaseWidget + h *widget.Hyperlink + l *widget.Label + + OnTapped func() + NoTruncate bool + Disabled bool + + lastDisabled bool + container *fyne.Container +} + +func NewDisableableHyperlink() *DisableableHyperlink { + c := &DisableableHyperlink{ + h: widget.NewHyperlink("", nil), + l: widget.NewLabel(""), + container: container.NewMax(), + } + c.h.OnTapped = func() { + if c.OnTapped != nil { + c.OnTapped() + } + } + c.ExtendBaseWidget(c) + c.updateContainer(c.Disabled) + return c +} + +func (c *DisableableHyperlink) SetText(text string) { + lastWrapping := c.l.Wrapping + c.l.Wrapping = fyne.TextWrapOff + c.l.SetText(text) + c.h.SetText(text) + c.l.Wrapping = lastWrapping + c.Refresh() +} + +func (c *DisableableHyperlink) Refresh() { + if c.NoTruncate { + c.h.Wrapping = fyne.TextWrapOff + c.l.Wrapping = fyne.TextWrapOff + } else { + c.h.Wrapping = fyne.TextTruncate + c.l.Wrapping = fyne.TextTruncate + } + if c.lastDisabled != c.Disabled { + c.updateContainer(c.Disabled) + c.lastDisabled = c.Disabled + } + c.container.Refresh() +} + +func (c *DisableableHyperlink) CreateRenderer() fyne.WidgetRenderer { + return widget.NewSimpleRenderer(c.container) +} + +func (c *DisableableHyperlink) updateContainer(linkDisabled bool) { + c.container.RemoveAll() + if linkDisabled { + c.container.Add(c.l) + } else { + c.container.Add(c.h) + } +} diff --git a/ui/widgets/gridviewitem.go b/ui/widgets/gridviewitem.go index 4ef8186..d245497 100644 --- a/ui/widgets/gridviewitem.go +++ b/ui/widgets/gridviewitem.go @@ -134,8 +134,8 @@ type GridViewItem struct { itemID string secondaryID string - primaryText *CustomHyperlink - secondaryText *CustomHyperlink + primaryText *widget.Hyperlink + secondaryText *DisableableHyperlink container *fyne.Container // updated by GridView @@ -150,11 +150,12 @@ type GridViewItem struct { func NewGridViewItem(placeholderResource fyne.Resource) *GridViewItem { g := &GridViewItem{ - primaryText: NewCustomHyperlink(), - secondaryText: NewCustomHyperlink(), + primaryText: widget.NewHyperlink("", nil), + secondaryText: NewDisableableHyperlink(), Cover: newCoverImage(placeholderResource), } - g.primaryText.SetTextStyle(fyne.TextStyle{Bold: true}) + g.primaryText.TextStyle.Bold = true + g.primaryText.Wrapping = fyne.TextTruncate g.ExtendBaseWidget(g) g.Cover.OnPlay = func() { if g.OnPlay != nil { diff --git a/ui/widgets/nowplayingcard.go b/ui/widgets/nowplayingcard.go index b961e3a..3367607 100644 --- a/ui/widgets/nowplayingcard.go +++ b/ui/widgets/nowplayingcard.go @@ -17,9 +17,9 @@ import ( type NowPlayingCard struct { widget.BaseWidget - trackName *CustomHyperlink - artistName *CustomHyperlink - albumName *CustomHyperlink + trackName *widget.Hyperlink + artistName *DisableableHyperlink + albumName *widget.Hyperlink cover *TappableImage menu *widget.PopUpMenu @@ -33,9 +33,9 @@ type NowPlayingCard struct { func NewNowPlayingCard() *NowPlayingCard { n := &NowPlayingCard{ - trackName: NewCustomHyperlink(), - artistName: NewCustomHyperlink(), - albumName: NewCustomHyperlink(), + trackName: widget.NewHyperlink("", nil), + artistName: NewDisableableHyperlink(), + albumName: widget.NewHyperlink("", nil), } n.ExtendBaseWidget(n) n.cover = NewTappableImage(n.onShowCoverImage) @@ -43,7 +43,9 @@ func NewNowPlayingCard() *NowPlayingCard { n.trackName.Hidden = true n.artistName.Hidden = true n.albumName.Hidden = true - n.trackName.SetTextStyle(fyne.TextStyle{Bold: true}) + n.albumName.Wrapping = fyne.TextTruncate + n.trackName.Wrapping = fyne.TextTruncate + n.trackName.TextStyle.Bold = true n.cover.SetMinSize(fyne.NewSize(85, 85)) n.cover.FillMode = canvas.ImageFillContain diff --git a/ui/widgets/tracklist.go b/ui/widgets/tracklist.go index 45d18a0..15b791d 100644 --- a/ui/widgets/tracklist.go +++ b/ui/widgets/tracklist.go @@ -676,8 +676,8 @@ type TrackRow struct { num *widget.RichText name *widget.RichText - artist *CustomHyperlink - album *CustomHyperlink + artist *DisableableHyperlink + album *widget.Hyperlink dur *widget.RichText year *widget.RichText favorite *fyne.Container @@ -697,9 +697,10 @@ func NewTrackRow(tracklist *Tracklist, playingIcon fyne.CanvasObject) *TrackRow t.ExtendBaseWidget(t) t.num = newTrailingAlignRichText() t.name = newTruncatingRichText() - t.artist = NewCustomHyperlink() + t.artist = NewDisableableHyperlink() t.artist.OnTapped = func() { tracklist.onArtistTapped(t.artistID) } - t.album = NewCustomHyperlink() + t.album = widget.NewHyperlink("", nil) + t.album.Wrapping = fyne.TextTruncate t.album.OnTapped = func() { tracklist.onAlbumTapped(t.albumID) } t.dur = newTrailingAlignRichText() t.year = newTrailingAlignRichText()