diff --git a/container/testdata/doctabs/desktop/single_custom_theme.png b/container/testdata/doctabs/desktop/single_custom_theme.png
index 63bc14ad29..d5ac152b8b 100644
Binary files a/container/testdata/doctabs/desktop/single_custom_theme.png and b/container/testdata/doctabs/desktop/single_custom_theme.png differ
diff --git a/widget/button.go b/widget/button.go
index 69cda5a16b..5d58884af0 100644
--- a/widget/button.go
+++ b/widget/button.go
@@ -97,8 +97,10 @@ func NewButtonWithIcon(label string, icon fyne.Resource, tapped func()) *Button
// CreateRenderer is a private method to Fyne which links this widget to its renderer
func (b *Button) CreateRenderer() fyne.WidgetRenderer {
b.ExtendBaseWidget(b)
- text := canvas.NewText(b.Text, theme.ForegroundColor())
- text.TextStyle.Bold = true
+ seg := &TextSegment{Text: b.Text, Style: RichTextStyleStrong}
+ seg.Style.Alignment = fyne.TextAlignCenter
+ text := NewRichText(seg)
+ text.inset = fyne.NewSize(theme.Padding()*2, theme.Padding()*2)
background := canvas.NewRectangle(theme.ButtonColor())
tapBG := canvas.NewRectangle(color.Transparent)
@@ -216,7 +218,7 @@ type buttonRenderer struct {
*widget.ShadowingRenderer
icon *canvas.Image
- label *canvas.Text
+ label *RichText
background *canvas.Rectangle
tapBG *canvas.Rectangle
button *Button
@@ -237,7 +239,7 @@ func (r *buttonRenderer) Layout(size fyne.Size) {
r.background.Resize(bgSize)
hasIcon := r.icon != nil
- hasLabel := r.label.Text != ""
+ hasLabel := r.label.Segments[0].(*TextSegment).Text != ""
if !hasIcon && !hasLabel {
// Nothing to layout
return
@@ -277,7 +279,7 @@ func (r *buttonRenderer) Layout(size fyne.Size) {
// amount of padding added.
func (r *buttonRenderer) MinSize() (size fyne.Size) {
hasIcon := r.icon != nil
- hasLabel := r.label.Text != ""
+ hasLabel := r.label.Segments[0].(*TextSegment).Text != ""
iconSize := fyne.NewSize(theme.IconInlineSize(), theme.IconInlineSize())
labelSize := r.label.MinSize()
if hasLabel {
@@ -295,7 +297,8 @@ func (r *buttonRenderer) MinSize() (size fyne.Size) {
}
func (r *buttonRenderer) Refresh() {
- r.label.Text = r.button.Text
+ r.label.inset = fyne.NewSize(theme.Padding()*2, theme.Padding()*2)
+ r.label.Segments[0].(*TextSegment).Text = r.button.Text
r.updateIconAndText()
r.applyTheme()
r.background.Refresh()
@@ -306,14 +309,14 @@ func (r *buttonRenderer) Refresh() {
// applyTheme updates this button to match the current theme
func (r *buttonRenderer) applyTheme() {
r.background.FillColor = r.buttonColor()
- r.label.TextSize = theme.TextSize()
- r.label.Color = theme.ForegroundColor()
+ r.label.Segments[0].(*TextSegment).Style.ColorName = theme.ColorNameForeground
switch {
case r.button.disabled:
- r.label.Color = theme.DisabledColor()
+ r.label.Segments[0].(*TextSegment).Style.ColorName = theme.ColorNameDisabled
case r.button.Importance == HighImportance:
- r.label.Color = theme.BackgroundColor()
+ r.label.Segments[0].(*TextSegment).Style.ColorName = theme.ColorNameBackground
}
+ r.label.Refresh()
if r.icon != nil && r.icon.Resource != nil {
switch res := r.icon.Resource.(type) {
case *theme.ThemedResource:
diff --git a/widget/button_internal_test.go b/widget/button_internal_test.go
index 26f977a08e..2964947dfa 100644
--- a/widget/button_internal_test.go
+++ b/widget/button_internal_test.go
@@ -6,6 +6,7 @@ import (
"testing"
"fyne.io/fyne/v2"
+ "fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/internal/cache"
col "fyne.io/fyne/v2/internal/color"
"fyne.io/fyne/v2/internal/widget"
@@ -208,12 +209,13 @@ func TestButton_Shadow(t *testing.T) {
func TestButtonRenderer_ApplyTheme(t *testing.T) {
button := &Button{}
render := test.WidgetRenderer(button).(*buttonRenderer)
+ textRender := test.WidgetRenderer(render.label).(*textRenderer)
- textSize := render.label.TextSize
+ textSize := textRender.Objects()[0].(*canvas.Text).TextSize
customTextSize := textSize
test.WithTestTheme(t, func() {
- render.applyTheme()
- customTextSize = render.label.TextSize
+ button.Refresh()
+ customTextSize = textRender.Objects()[0].(*canvas.Text).TextSize
})
assert.NotEqual(t, textSize, customTextSize)
diff --git a/widget/button_test.go b/widget/button_test.go
index 302fda0711..aa787aec7b 100644
--- a/widget/button_test.go
+++ b/widget/button_test.go
@@ -190,6 +190,10 @@ func TestButton_Layout(t *testing.T) {
alignment: widget.ButtonAlignTrailing,
placement: widget.ButtonIconTrailingText,
},
+ "text_only_multiline": {
+ text: "Test\nLine2",
+ alignment: widget.ButtonAlignCenter,
+ },
"icon_only_center_leading": {
icon: theme.CancelIcon(),
alignment: widget.ButtonAlignCenter,
diff --git a/widget/testdata/accordion/layout_multiple_open_multiple_items.xml b/widget/testdata/accordion/layout_multiple_open_multiple_items.xml
index e4e410a193..ae41b1725d 100644
--- a/widget/testdata/accordion/layout_multiple_open_multiple_items.xml
+++ b/widget/testdata/accordion/layout_multiple_open_multiple_items.xml
@@ -5,13 +5,17 @@
- A
+
+ A
+
- B
+
+ B
+
diff --git a/widget/testdata/accordion/layout_multiple_open_multiple_items_opened.xml b/widget/testdata/accordion/layout_multiple_open_multiple_items_opened.xml
index 4fa3b215f8..fe99e23443 100644
--- a/widget/testdata/accordion/layout_multiple_open_multiple_items_opened.xml
+++ b/widget/testdata/accordion/layout_multiple_open_multiple_items_opened.xml
@@ -5,13 +5,17 @@
- A
+
+ A
+
- B
+
+ B
+
diff --git a/widget/testdata/accordion/layout_multiple_open_one_item.xml b/widget/testdata/accordion/layout_multiple_open_one_item.xml
index 3385f2393f..0e002cc886 100644
--- a/widget/testdata/accordion/layout_multiple_open_one_item.xml
+++ b/widget/testdata/accordion/layout_multiple_open_one_item.xml
@@ -5,7 +5,9 @@
- A
+
+ A
+
diff --git a/widget/testdata/accordion/layout_multiple_open_one_item_opened.xml b/widget/testdata/accordion/layout_multiple_open_one_item_opened.xml
index 0da8d246e2..91000a052b 100644
--- a/widget/testdata/accordion/layout_multiple_open_one_item_opened.xml
+++ b/widget/testdata/accordion/layout_multiple_open_one_item_opened.xml
@@ -5,7 +5,9 @@
- A
+
+ A
+
diff --git a/widget/testdata/accordion/layout_single_open_multiple_items.xml b/widget/testdata/accordion/layout_single_open_multiple_items.xml
index e4e410a193..ae41b1725d 100644
--- a/widget/testdata/accordion/layout_single_open_multiple_items.xml
+++ b/widget/testdata/accordion/layout_single_open_multiple_items.xml
@@ -5,13 +5,17 @@
- A
+
+ A
+
- B
+
+ B
+
diff --git a/widget/testdata/accordion/layout_single_open_multiple_items_opened.xml b/widget/testdata/accordion/layout_single_open_multiple_items_opened.xml
index 51d5c5583b..61a5424731 100644
--- a/widget/testdata/accordion/layout_single_open_multiple_items_opened.xml
+++ b/widget/testdata/accordion/layout_single_open_multiple_items_opened.xml
@@ -5,13 +5,17 @@
- A
+
+ A
+
- B
+
+ B
+
diff --git a/widget/testdata/accordion/layout_single_open_one_item.xml b/widget/testdata/accordion/layout_single_open_one_item.xml
index 3385f2393f..0e002cc886 100644
--- a/widget/testdata/accordion/layout_single_open_one_item.xml
+++ b/widget/testdata/accordion/layout_single_open_one_item.xml
@@ -5,7 +5,9 @@
- A
+
+ A
+
diff --git a/widget/testdata/accordion/layout_single_open_one_item_opened.xml b/widget/testdata/accordion/layout_single_open_one_item_opened.xml
index 0da8d246e2..91000a052b 100644
--- a/widget/testdata/accordion/layout_single_open_one_item_opened.xml
+++ b/widget/testdata/accordion/layout_single_open_one_item_opened.xml
@@ -5,7 +5,9 @@
- A
+
+ A
+
diff --git a/widget/testdata/button/layout_text_icon_center_leading.xml b/widget/testdata/button/layout_text_icon_center_leading.xml
index 56920504d4..82cc0f85db 100644
--- a/widget/testdata/button/layout_text_icon_center_leading.xml
+++ b/widget/testdata/button/layout_text_icon_center_leading.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_icon_center_trailing.xml b/widget/testdata/button/layout_text_icon_center_trailing.xml
index 84e9424729..392b53311b 100644
--- a/widget/testdata/button/layout_text_icon_center_trailing.xml
+++ b/widget/testdata/button/layout_text_icon_center_trailing.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_icon_leading_leading.xml b/widget/testdata/button/layout_text_icon_leading_leading.xml
index 1bc8547b49..2be99cabd9 100644
--- a/widget/testdata/button/layout_text_icon_leading_leading.xml
+++ b/widget/testdata/button/layout_text_icon_leading_leading.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_icon_leading_trailing.xml b/widget/testdata/button/layout_text_icon_leading_trailing.xml
index e6017ad872..fb930d4ff6 100644
--- a/widget/testdata/button/layout_text_icon_leading_trailing.xml
+++ b/widget/testdata/button/layout_text_icon_leading_trailing.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_icon_trailing_leading.xml b/widget/testdata/button/layout_text_icon_trailing_leading.xml
index be7acf67de..a14e5c611c 100644
--- a/widget/testdata/button/layout_text_icon_trailing_leading.xml
+++ b/widget/testdata/button/layout_text_icon_trailing_leading.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_icon_trailing_trailing.xml b/widget/testdata/button/layout_text_icon_trailing_trailing.xml
index d9be60bcf6..ede8d11d3f 100644
--- a/widget/testdata/button/layout_text_icon_trailing_trailing.xml
+++ b/widget/testdata/button/layout_text_icon_trailing_trailing.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_only_center_leading.xml b/widget/testdata/button/layout_text_only_center_leading.xml
index 2577bd1ae4..1f400c95d1 100644
--- a/widget/testdata/button/layout_text_only_center_leading.xml
+++ b/widget/testdata/button/layout_text_only_center_leading.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_only_center_trailing.xml b/widget/testdata/button/layout_text_only_center_trailing.xml
index 2577bd1ae4..1f400c95d1 100644
--- a/widget/testdata/button/layout_text_only_center_trailing.xml
+++ b/widget/testdata/button/layout_text_only_center_trailing.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_only_leading_leading.xml b/widget/testdata/button/layout_text_only_leading_leading.xml
index 89bc1d7fec..7f63b321a8 100644
--- a/widget/testdata/button/layout_text_only_leading_leading.xml
+++ b/widget/testdata/button/layout_text_only_leading_leading.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_only_leading_trailing.xml b/widget/testdata/button/layout_text_only_leading_trailing.xml
index 89bc1d7fec..7f63b321a8 100644
--- a/widget/testdata/button/layout_text_only_leading_trailing.xml
+++ b/widget/testdata/button/layout_text_only_leading_trailing.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_only_multiline.xml b/widget/testdata/button/layout_text_only_multiline.xml
new file mode 100644
index 0000000000..d0cd7db937
--- /dev/null
+++ b/widget/testdata/button/layout_text_only_multiline.xml
@@ -0,0 +1,22 @@
+
diff --git a/widget/testdata/button/layout_text_only_trailing_leading.xml b/widget/testdata/button/layout_text_only_trailing_leading.xml
index 9c74be654b..24347356f2 100644
--- a/widget/testdata/button/layout_text_only_trailing_leading.xml
+++ b/widget/testdata/button/layout_text_only_trailing_leading.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/button/layout_text_only_trailing_trailing.xml b/widget/testdata/button/layout_text_only_trailing_trailing.xml
index 9c74be654b..24347356f2 100644
--- a/widget/testdata/button/layout_text_only_trailing_trailing.xml
+++ b/widget/testdata/button/layout_text_only_trailing_trailing.xml
@@ -13,7 +13,9 @@
- Test
+
+ Test
+
diff --git a/widget/testdata/form/layout.xml b/widget/testdata/form/layout.xml
index 1cb5f9e9ff..a4e57306b4 100644
--- a/widget/testdata/form/layout.xml
+++ b/widget/testdata/form/layout.xml
@@ -49,7 +49,9 @@
- Cancel
+
+ Cancel
+
@@ -65,7 +67,9 @@
- Submit
+
+ Submit
+