adam-gui/vendor/fyne.io/fyne/v2/widget/label.go
2024-04-29 19:13:50 +02:00

181 lines
4.2 KiB
Go

package widget
import (
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/internal/cache"
"fyne.io/fyne/v2/theme"
)
// Label widget is a label component with appropriate padding and layout.
type Label struct {
BaseWidget
Text string
Alignment fyne.TextAlign // The alignment of the text
Wrapping fyne.TextWrap // The wrapping of the text
TextStyle fyne.TextStyle // The style of the label text
// The truncation mode of the text
//
// Since: 2.4
Truncation fyne.TextTruncation
// Importance informs how the label should be styled, i.e. warning or disabled
//
// Since: 2.4
Importance Importance
provider *RichText
binder basicBinder
}
// NewLabel creates a new label widget with the set text content
func NewLabel(text string) *Label {
return NewLabelWithStyle(text, fyne.TextAlignLeading, fyne.TextStyle{})
}
// NewLabelWithData returns an Label widget connected to the specified data source.
//
// Since: 2.0
func NewLabelWithData(data binding.String) *Label {
label := NewLabel("")
label.Bind(data)
return label
}
// NewLabelWithStyle creates a new label widget with the set text content
func NewLabelWithStyle(text string, alignment fyne.TextAlign, style fyne.TextStyle) *Label {
l := &Label{
Text: text,
Alignment: alignment,
TextStyle: style,
}
l.ExtendBaseWidget(l)
return l
}
// Bind connects the specified data source to this Label.
// The current value will be displayed and any changes in the data will cause the widget to update.
//
// Since: 2.0
func (l *Label) Bind(data binding.String) {
l.binder.SetCallback(l.updateFromData) // This could only be done once, maybe in ExtendBaseWidget?
l.binder.Bind(data)
}
// CreateRenderer is a private method to Fyne which links this widget to its renderer
func (l *Label) CreateRenderer() fyne.WidgetRenderer {
l.provider = NewRichTextWithText(l.Text)
l.ExtendBaseWidget(l)
l.syncSegments()
return l.provider.CreateRenderer()
}
// ExtendBaseWidget is used by an extending widget to make use of BaseWidget functionality.
func (l *Label) ExtendBaseWidget(w fyne.Widget) {
if w == nil {
w = l
}
l.BaseWidget.ExtendBaseWidget(w)
if l.provider != nil {
l.provider.ExtendBaseWidget(l.super())
}
}
// MinSize returns the size that this label should not shrink below.
//
// Implements: fyne.Widget
func (l *Label) MinSize() fyne.Size {
if l.provider == nil {
l.ExtendBaseWidget(l)
cache.Renderer(l.super())
}
return l.provider.MinSize()
}
// Refresh triggers a redraw of the label.
//
// Implements: fyne.Widget
func (l *Label) Refresh() {
if l.provider == nil { // not created until visible
return
}
l.syncSegments()
l.provider.Refresh()
l.BaseWidget.Refresh()
}
// Resize sets a new size for the label.
// This should only be called if it is not in a container with a layout manager.
//
// Implements: fyne.Widget
func (l *Label) Resize(s fyne.Size) {
l.BaseWidget.Resize(s)
if l.provider != nil {
l.provider.Resize(s)
}
}
// SetText sets the text of the label
func (l *Label) SetText(text string) {
l.Text = text
l.Refresh()
}
// Unbind disconnects any configured data source from this Label.
// The current value will remain at the last value of the data source.
//
// Since: 2.0
func (l *Label) Unbind() {
l.binder.Unbind()
}
func (l *Label) syncSegments() {
var color fyne.ThemeColorName
switch l.Importance {
case LowImportance:
color = theme.ColorNameDisabled
case MediumImportance:
color = theme.ColorNameForeground
case HighImportance:
color = theme.ColorNamePrimary
case DangerImportance:
color = theme.ColorNameError
case WarningImportance:
color = theme.ColorNameWarning
case SuccessImportance:
color = theme.ColorNameSuccess
default:
color = theme.ColorNameForeground
}
l.provider.Wrapping = l.Wrapping
l.provider.Truncation = l.Truncation
l.provider.Segments[0].(*TextSegment).Style = RichTextStyle{
Alignment: l.Alignment,
ColorName: color,
Inline: true,
TextStyle: l.TextStyle,
}
l.provider.Segments[0].(*TextSegment).Text = l.Text
}
func (l *Label) updateFromData(data binding.DataItem) {
if data == nil {
return
}
textSource, ok := data.(binding.String)
if !ok {
return
}
val, err := textSource.Get()
if err != nil {
fyne.LogError("Error getting current data value", err)
return
}
l.SetText(val)
}