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
-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()