Files
supersonic/ui/widgets/customhyperlink.go
T

90 lines
1.7 KiB
Go

package widgets
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/widget"
)
type hyperlinkWrapper struct {
widget.Hyperlink
l *widget.Label
MaxWidth float32
}
func newHyperlinkWrapper() *hyperlinkWrapper {
h := &hyperlinkWrapper{
Hyperlink: widget.Hyperlink{
Text: "",
Wrapping: fyne.TextTruncate,
},
l: widget.NewLabel(""),
}
h.ExtendBaseWidget(h)
return h
}
func (h *hyperlinkWrapper) MinSize() fyne.Size {
w := fyne.Min(h.MaxWidth, h.l.MinSize().Width)
return fyne.NewSize(w, h.Hyperlink.MinSize().Height)
}
func (h *hyperlinkWrapper) SetText(text string) {
h.Text = text
h.l.SetText(text)
}
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
OnTapped func()
container *fyne.Container
minSize fyne.Size
}
func NewCustomHyperlink() *CustomHyperlink {
c := &CustomHyperlink{
h: newHyperlinkWrapper(),
}
c.h.OnTapped = func() {
if c.OnTapped != nil {
c.OnTapped()
}
}
c.ExtendBaseWidget(c)
c.container = container.NewHBox(c.h, layout.NewSpacer())
return c
}
func (c *CustomHyperlink) SetText(text string) {
s := widget.NewLabel(text).MinSize()
c.h.SetText(text)
c.minSize = fyne.NewSize(fyne.Min(c.Size().Width, s.Width), s.Height)
c.Refresh()
}
func (c *CustomHyperlink) Resize(size fyne.Size) {
c.h.MaxWidth = size.Width
c.BaseWidget.Resize(size)
}
func (c *CustomHyperlink) Refresh() {
c.container.Refresh()
}
func (c *CustomHyperlink) CreateRenderer() fyne.WidgetRenderer {
return widget.NewSimpleRenderer(c.container)
}