Skip to content

Commit cf075d3

Browse files
authored
Merge pull request #5560 from ErikKalkoken/fix-issue-5557
Fix: Logs error when rendering disabled menu item with non-SVG icon
2 parents 0cc601e + 7270c59 commit cf075d3

File tree

3 files changed

+95
-7
lines changed

3 files changed

+95
-7
lines changed

widget/menu_item.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"fyne.io/fyne/v2"
88
"fyne.io/fyne/v2/canvas"
99
"fyne.io/fyne/v2/driver/desktop"
10+
"fyne.io/fyne/v2/internal/svg"
1011
"fyne.io/fyne/v2/internal/widget"
1112
"fyne.io/fyne/v2/theme"
1213
)
@@ -341,7 +342,7 @@ func (r *menuItemRenderer) updateIcon(img *canvas.Image, rsc fyne.Resource) {
341342
if img == nil {
342343
return
343344
}
344-
if r.i.Item.Disabled {
345+
if r.i.Item.Disabled && svg.IsResourceSVG(rsc) {
345346
img.Resource = theme.NewDisabledResource(rsc)
346347
} else {
347348
img.Resource = rsc

widget/menu_item_test.go

+93-6
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,108 @@
11
package widget
22

33
import (
4+
"bytes"
5+
_ "embed"
6+
"log"
7+
"os"
48
"testing"
59

610
"github.com/stretchr/testify/assert"
711

812
"fyne.io/fyne/v2"
913
"fyne.io/fyne/v2/internal/cache"
14+
internalWidget "fyne.io/fyne/v2/internal/widget"
15+
"fyne.io/fyne/v2/test"
1016
"fyne.io/fyne/v2/theme"
1117
)
1218

19+
//go:embed testdata/fyne.png
20+
var iconData []byte
21+
1322
func TestMenuItem_Disabled(t *testing.T) {
14-
i := fyne.NewMenuItem("Disabled", func() {})
15-
m := fyne.NewMenu("top", []*fyne.MenuItem{i}...)
16-
i.Disabled = true
17-
w := newMenuItem(i, NewMenu(m))
18-
r := cache.Renderer(w)
23+
t.Run("can render disabled item", func(t *testing.T) {
24+
i := fyne.NewMenuItem("Disabled", func() {})
25+
m := fyne.NewMenu("top", []*fyne.MenuItem{i}...)
26+
i.Disabled = true
27+
w := newMenuItem(i, NewMenu(m))
28+
r := cache.Renderer(w)
29+
30+
assert.Equal(t, theme.Color(theme.ColorNameDisabled), r.(*menuItemRenderer).text.Color)
31+
})
32+
33+
t.Run("should apply themeing to disabled item SVG icon", func(t *testing.T) {
34+
i := fyne.NewMenuItem("Disabled", func() {})
35+
m := fyne.NewMenu("top", i)
36+
i.Disabled = true
37+
i.Icon = theme.AccountIcon()
38+
w := newMenuItem(i, NewMenu(m))
39+
r := cache.Renderer(w)
40+
41+
assert.Equal(t, theme.NewDisabledResource(theme.AccountIcon()), r.(*menuItemRenderer).icon.Resource)
42+
})
43+
44+
t.Run("should not apply themeing to disabled item with PNG icon", func(t *testing.T) {
45+
i := fyne.NewMenuItem("Disabled", func() {})
46+
m := fyne.NewMenu("top", i)
47+
i.Disabled = true
48+
i.Icon = fyne.NewStaticResource("fyne.png", iconData)
49+
w := newMenuItem(i, NewMenu(m))
50+
r := cache.Renderer(w)
51+
52+
assert.Equal(t, i.Icon, r.(*menuItemRenderer).icon.Resource)
53+
})
54+
55+
t.Run("should not log error when rendering disabled menu item with PNG icon", func(t *testing.T) {
56+
var buf bytes.Buffer
57+
log.SetOutput(&buf)
58+
defer func() {
59+
log.SetOutput(os.Stderr)
60+
}()
61+
62+
test.NewTempApp(t)
63+
64+
w := fyne.CurrentApp().NewWindow("")
65+
defer w.Close()
66+
w.SetPadded(false)
67+
c := w.Canvas()
68+
69+
item := fyne.NewMenuItem("Foo", func() {})
70+
item.Icon = fyne.NewStaticResource("fyne.png", iconData)
71+
item.Disabled = true
72+
m := NewMenu(fyne.NewMenu("", item))
73+
size := m.MinSize()
74+
w.Resize(size.Add(fyne.NewSize(10, 10)))
75+
m.Resize(size)
76+
o := internalWidget.NewOverlayContainer(m, c, func() {})
77+
w.SetContent(o)
78+
79+
assert.Equal(t, "", buf.String()) // should not log an error
80+
})
81+
82+
t.Run("should not log error when rendering disabled menu item with SVG icon", func(t *testing.T) {
83+
var buf bytes.Buffer
84+
log.SetOutput(&buf)
85+
defer func() {
86+
log.SetOutput(os.Stderr)
87+
}()
88+
89+
test.NewTempApp(t)
90+
91+
w := fyne.CurrentApp().NewWindow("")
92+
defer w.Close()
93+
w.SetPadded(false)
94+
c := w.Canvas()
95+
96+
item := fyne.NewMenuItem("Foo", func() {})
97+
item.Icon = theme.AccountIcon()
98+
item.Disabled = true
99+
m := NewMenu(fyne.NewMenu("", item))
100+
size := m.MinSize()
101+
w.Resize(size.Add(fyne.NewSize(10, 10)))
102+
m.Resize(size)
103+
o := internalWidget.NewOverlayContainer(m, c, func() {})
104+
w.SetContent(o)
19105

20-
assert.Equal(t, theme.Color(theme.ColorNameDisabled), r.(*menuItemRenderer).text.Color)
106+
assert.Equal(t, "", buf.String()) // should not log an error
107+
})
21108
}

widget/testdata/fyne.png

19.1 KB
Loading

0 commit comments

Comments
 (0)