pull in patched hyperlink bug fix from Fyne, start removing CustomHyperlink

This commit is contained in:
Drew Weymouth
2023-10-22 11:10:36 -07:00
parent bf93689bce
commit 6f08032f22
9 changed files with 104 additions and 159 deletions
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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=
+6 -4
View File
@@ -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))
}
+2 -3
View File
@@ -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)) }
-133
View File
@@ -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()))
}
}
+73
View File
@@ -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)
}
}
+6 -5
View File
@@ -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 {
+9 -7
View File
@@ -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
+5 -4
View File
@@ -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()