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 @@ + + + + + + + + + + + + + + + + + Test + Line2 + + + + 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 +