Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 11 additions & 8 deletions widget/radio_group.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ type RadioGroup struct {
OnChanged func(string) `json:"-"`
Options []string
Selected string
// The wrapping of the Options Text
//
// Since: 2.9
Wrapping fyne.TextWrap

// this index is ONE-BASED so the default zero-value is unselected
// use r.selectedIndex(), r.setSelectedIndex(int) to maniupulate this field
Expand Down Expand Up @@ -52,7 +56,7 @@ func (r *RadioGroup) CreateRenderer() fyne.WidgetRenderer {
items := make([]fyne.CanvasObject, len(r.Options))
for i, option := range r.Options {
idx := i
items[idx] = newRadioItem(option, func(item *radioItem) {
items[idx] = newRadioItem(option, r, func(item *radioItem) {
r.itemTapped(item, idx)
})
}
Expand Down Expand Up @@ -154,19 +158,18 @@ type radioGroupRenderer struct {
}

// Layout the components of the radio widget
func (r *radioGroupRenderer) Layout(_ fyne.Size) {
func (r *radioGroupRenderer) Layout(size fyne.Size) {
count := 1
if len(r.items) > 0 {
count = len(r.items)
}
var itemHeight, itemWidth float32
minSize := r.radio.MinSize()
if r.radio.Horizontal {
itemHeight = minSize.Height
itemWidth = minSize.Width / float32(count)
itemHeight = size.Height
itemWidth = size.Width / float32(count)
} else {
itemHeight = minSize.Height / float32(count)
itemWidth = minSize.Width
itemHeight = size.Height / float32(count)
itemWidth = size.Width
}

itemSize := fyne.NewSize(itemWidth, itemHeight)
Expand Down Expand Up @@ -213,7 +216,7 @@ func (r *radioGroupRenderer) updateItems(refresh bool) {
if len(r.items) < len(r.radio.Options) {
for i := len(r.items); i < len(r.radio.Options); i++ {
idx := i
item := newRadioItem(r.radio.Options[idx], func(item *radioItem) {
item := newRadioItem(r.radio.Options[idx], r.radio, func(item *radioItem) {
r.radio.itemTapped(item, idx)
})
r.items = append(r.items, item)
Expand Down
6 changes: 3 additions & 3 deletions widget/radio_group_extended_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (
"testing"

"fyne.io/fyne/v2"
"fyne.io/fyne/v2/canvas"
"fyne.io/fyne/v2/driver/desktop"
"fyne.io/fyne/v2/internal/cache"
"fyne.io/fyne/v2/test"
Expand Down Expand Up @@ -167,13 +168,12 @@ func TestRadioGroupRenderer_Extended_ApplyTheme(t *testing.T) {
radio := newextendedRadioGroup([]string{"Test"}, func(string) {})
render := cache.Renderer(test.TempWidgetRenderer(t, radio).Objects()[0].(*radioItem)).(*radioItemRenderer)

textSize := render.label.TextSize
textSize := test.TempWidgetRenderer(t, render.label).Objects()[0].(*canvas.Text).TextSize
customTextSize := textSize
test.WithTestTheme(t, func() {
render.Refresh()
customTextSize = render.label.TextSize
customTextSize = test.TempWidgetRenderer(t, render.label).Objects()[0].(*canvas.Text).TextSize
})

assert.NotEqual(t, textSize, customTextSize)
}

Expand Down
4 changes: 2 additions & 2 deletions widget/radio_group_internal_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -298,11 +298,11 @@ func TestRadioGroupRenderer_ApplyTheme(t *testing.T) {
radio := NewRadioGroup([]string{"Test"}, func(string) {})
render := radioGroupTestItemRenderer(t, radio, 0)

textSize := render.label.TextSize
textSize := render.label.Theme()
customTextSize := textSize
test.WithTestTheme(t, func() {
render.Refresh()
customTextSize = render.label.TextSize
customTextSize = render.label.Theme()
})

assert.NotEqual(t, textSize, customTextSize)
Expand Down
27 changes: 15 additions & 12 deletions widget/radio_item.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ var (
_ fyne.Focusable = (*radioItem)(nil)
)

func newRadioItem(label string, onTap func(*radioItem)) *radioItem {
i := &radioItem{Label: label, onTap: onTap}
func newRadioItem(label string, radio *RadioGroup, onTap func(*radioItem)) *radioItem {
i := &radioItem{Label: label, onTap: onTap, radio: radio}
i.ExtendBaseWidget(i)
return i
}
Expand All @@ -29,6 +29,7 @@ type radioItem struct {

Label string
Selected bool
radio *RadioGroup

focused bool
hovered bool
Expand All @@ -37,10 +38,10 @@ type radioItem struct {

// CreateRenderer is a private method to Fyne which links this widget to its renderer.
func (i *radioItem) CreateRenderer() fyne.WidgetRenderer {
txt := canvas.Text{Alignment: fyne.TextAlignLeading}
txt.TextSize = i.Theme().Size(theme.SizeNameText)
r := &radioItemRenderer{item: i, label: &txt}
r.SetObjects([]fyne.CanvasObject{&r.focusIndicator, &r.icon, &r.over, &txt})
txt := NewRichTextWithText(i.Label)
txt.Wrapping = i.radio.Wrapping
r := &radioItemRenderer{item: i, label: txt}
r.SetObjects([]fyne.CanvasObject{&r.focusIndicator, &r.icon, &r.over, txt})
r.update()
return r
}
Expand Down Expand Up @@ -124,7 +125,7 @@ type radioItemRenderer struct {

focusIndicator canvas.Circle
icon, over canvas.Image
label *canvas.Text
label *RichText
}

func (r *radioItemRenderer) Layout(size fyne.Size) {
Expand All @@ -137,7 +138,7 @@ func (r *radioItemRenderer) Layout(size fyne.Size) {
r.focusIndicator.Resize(focusIndicatorSize)
r.focusIndicator.Move(fyne.NewPos(borderSize, (size.Height-focusIndicatorSize.Height)/2))

labelSize := fyne.NewSize(size.Width, size.Height)
labelSize := fyne.NewSize(size.Width-iconInlineSize, size.Height-iconInlineSize)
Comment thread
qiulaidongfeng marked this conversation as resolved.
r.label.Resize(labelSize)
r.label.Move(fyne.NewPos(focusIndicatorSize.Width+th.Size(theme.SizeNamePadding), 0))

Expand Down Expand Up @@ -166,13 +167,15 @@ func (r *radioItemRenderer) update() {
th := r.item.Theme()
v := fyne.CurrentApp().Settings().ThemeVariant()

r.label.Text = r.item.Label
r.label.TextSize = th.Size(theme.SizeNameText)
r.label.Segments[0].(*TextSegment).Text = r.item.Label
r.label.Segments[0].(*TextSegment).Style.SizeName = theme.SizeNameText
r.label.Wrapping = r.item.radio.Wrapping
if r.item.Disabled() {
r.label.Color = th.Color(theme.ColorNameDisabled, v)
r.label.Segments[0].(*TextSegment).Style.ColorName = theme.ColorNameDisabled
} else {
r.label.Color = th.Color(theme.ColorNameForeground, v)
r.label.Segments[0].(*TextSegment).Style.ColorName = theme.ColorNameForeground
}
r.label.Refresh()

out := theme.NewThemedResource(th.Icon(theme.IconNameRadioButton))
out.ColorName = theme.ColorNameInputBorder
Expand Down
2 changes: 1 addition & 1 deletion widget/radio_item_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ func BenchmarkRadioCreateRenderer(b *testing.B) {
}

func TestRadioItem_FocusIndicator_Centered_Vertically(t *testing.T) {
item := newRadioItem("Hello", nil)
item := newRadioItem("Hello", new(RadioGroup), nil)
render := test.TempWidgetRenderer(t, item).(*radioItemRenderer)
render.Layout(fyne.NewSize(200, 100))

Expand Down
20 changes: 13 additions & 7 deletions widget/testdata/radio_group/disabled_append_none_selected.xml
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
<canvas padded size="150x200">
<content>
<container pos="4,4" size="142x192">
<widget pos="21,60" size="98x70" type="*widget.RadioGroup">
<widget size="98x35" type="*widget.radioItem">
<widget pos="13,44" size="114x102" type="*widget.RadioGroup">
<widget size="114x34" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="background"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="disabled"/>
<text color="disabled" pos="32,0" size="98x35">Option A</text>
<widget pos="32,0" size="94x14" type="*widget.RichText">
<text color="disabled" pos="8,8" size="57x19">Option A</text>
</widget>
</widget>
<widget pos="0,35" size="98x35" type="*widget.radioItem">
<widget pos="0,34" size="114x34" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="background"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="disabled"/>
<text color="disabled" pos="32,0" size="98x35">Option B</text>
<widget pos="32,0" size="94x14" type="*widget.RichText">
<text color="disabled" pos="8,8" size="58x19">Option B</text>
</widget>
</widget>
<widget pos="0,70" size="98x35" type="*widget.radioItem">
<widget pos="0,68" size="114x34" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="background"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="disabled"/>
<text color="disabled" pos="32,0" size="98x35">Option C</text>
<widget pos="32,0" size="94x14" type="*widget.RichText">
<text color="disabled" pos="8,8" size="57x19">Option C</text>
</widget>
</widget>
</widget>
</container>
Expand Down
26 changes: 15 additions & 11 deletions widget/testdata/radio_group/disabled_none_selected.xml
Original file line number Diff line number Diff line change
@@ -1,18 +1,22 @@
<canvas padded size="150x200">
<content>
<container pos="4,4" size="142x192">
<widget pos="21,60" size="98x70" type="*widget.RadioGroup">
<widget size="98x35" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="background"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="disabled"/>
<text color="disabled" pos="32,0" size="98x35">Option A</text>
<widget pos="13,44" size="114x102" type="*widget.RadioGroup">
<widget size="114x51" type="*widget.radioItem">
<circle pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="background"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="disabled"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text color="disabled" pos="8,8" size="57x19">Option A</text>
</widget>
</widget>
<widget pos="0,35" size="98x35" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="background"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="disabled"/>
<text color="disabled" pos="32,0" size="98x35">Option B</text>
<widget pos="0,51" size="114x51" type="*widget.radioItem">
<circle pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="background"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="disabled"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text color="disabled" pos="8,8" size="58x19">Option B</text>
</widget>
</widget>
</widget>
</container>
Expand Down
38 changes: 22 additions & 16 deletions widget/testdata/radio_group/focus_a_focused_b_selected.xml
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
<canvas padded size="150x200">
<content>
<container pos="4,4" size="142x192">
<widget pos="21,43" size="98x105" type="*widget.RadioGroup">
<widget size="98x35" type="*widget.radioItem">
<circle fillColor="focus" pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<text pos="32,0" size="98x35">Option A</text>
<widget pos="13,19" size="114x153" type="*widget.RadioGroup">
<widget size="114x51" type="*widget.radioItem">
<circle fillColor="focus" pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text pos="8,8" size="57x19">Option A</text>
</widget>
</widget>
<widget pos="0,35" size="98x35" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="primary"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="foreground"/>
<text pos="32,0" size="98x35">Option B</text>
<widget pos="0,51" size="114x51" type="*widget.radioItem">
<circle pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="primary"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="foreground"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text pos="8,8" size="58x19">Option B</text>
</widget>
</widget>
<widget pos="0,70" size="98x35" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<text pos="32,0" size="98x35">Option C</text>
<widget pos="0,102" size="114x51" type="*widget.radioItem">
<circle pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text pos="8,8" size="57x19">Option C</text>
</widget>
</widget>
</widget>
</container>
Expand Down
38 changes: 22 additions & 16 deletions widget/testdata/radio_group/focus_a_focused_none_selected.xml
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
<canvas padded size="150x200">
<content>
<container pos="4,4" size="142x192">
<widget pos="21,43" size="98x105" type="*widget.RadioGroup">
<widget size="98x35" type="*widget.radioItem">
<circle fillColor="focus" pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<text pos="32,0" size="98x35">Option A</text>
<widget pos="13,19" size="114x153" type="*widget.RadioGroup">
<widget size="114x51" type="*widget.radioItem">
<circle fillColor="focus" pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text pos="8,8" size="57x19">Option A</text>
</widget>
</widget>
<widget pos="0,35" size="98x35" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<text pos="32,0" size="98x35">Option B</text>
<widget pos="0,51" size="114x51" type="*widget.radioItem">
<circle pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text pos="8,8" size="58x19">Option B</text>
</widget>
</widget>
<widget pos="0,70" size="98x35" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<text pos="32,0" size="98x35">Option C</text>
<widget pos="0,102" size="114x51" type="*widget.radioItem">
<circle pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text pos="8,8" size="57x19">Option C</text>
</widget>
</widget>
</widget>
</container>
Expand Down
38 changes: 22 additions & 16 deletions widget/testdata/radio_group/focus_b_focused_b_selected.xml
Original file line number Diff line number Diff line change
@@ -1,24 +1,30 @@
<canvas padded size="150x200">
<content>
<container pos="4,4" size="142x192">
<widget pos="21,43" size="98x105" type="*widget.RadioGroup">
<widget size="98x35" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<text pos="32,0" size="98x35">Option A</text>
<widget pos="13,19" size="114x153" type="*widget.RadioGroup">
<widget size="114x51" type="*widget.radioItem">
<circle pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text pos="8,8" size="57x19">Option A</text>
</widget>
</widget>
<widget pos="0,35" size="98x35" type="*widget.radioItem">
<circle fillColor="focus" pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="primary"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="foreground"/>
<text pos="32,0" size="98x35">Option B</text>
<widget pos="0,51" size="114x51" type="*widget.radioItem">
<circle fillColor="focus" pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="primary"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="foreground"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text pos="8,8" size="58x19">Option B</text>
</widget>
</widget>
<widget pos="0,70" size="98x35" type="*widget.radioItem">
<circle pos="2,3" size="28x28"/>
<image pos="6,7" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,7" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<text pos="32,0" size="98x35">Option C</text>
<widget pos="0,102" size="114x51" type="*widget.radioItem">
<circle pos="2,11" size="28x28"/>
<image pos="6,15" rsc="radioButtonFillIcon" size="iconInlineSize" themed="inputBackground"/>
<image pos="6,15" rsc="radioButtonIcon" size="iconInlineSize" themed="inputBorder"/>
<widget pos="32,0" size="94x31" type="*widget.RichText">
<text pos="8,8" size="57x19">Option C</text>
</widget>
</widget>
</widget>
</container>
Expand Down
Loading