diff --git a/internal/driver/glfw/menu.go b/internal/driver/glfw/menu.go index da494d6930..b7604ddc4d 100644 --- a/internal/driver/glfw/menu.go +++ b/internal/driver/glfw/menu.go @@ -5,7 +5,15 @@ import ( ) func buildMenuOverlay(menus *fyne.MainMenu, c fyne.Canvas) fyne.CanvasObject { - if menus.Items[0].Items[len(menus.Items[0].Items)-1].Label != "Quit" { // make sure the first menu always has a quit option + if len(menus.Items) == 0 { + fyne.LogError("Main menu must have at least one child menu", nil) + return nil + } + var firstItem *fyne.MenuItem + if len(menus.Items[0].Items) > 0 { + firstItem = menus.Items[0].Items[len(menus.Items[0].Items)-1] + } + if firstItem == nil || firstItem.Label != "Quit" { // make sure the first menu always has a quit option quitItem := fyne.NewMenuItem("Quit", func() { fyne.CurrentApp().Quit() }) diff --git a/internal/driver/glfw/menu_test.go b/internal/driver/glfw/menu_test.go new file mode 100644 index 0000000000..89a6e7dc10 --- /dev/null +++ b/internal/driver/glfw/menu_test.go @@ -0,0 +1,33 @@ +package glfw + +import ( + "testing" + + "fyne.io/fyne" + + "github.com/stretchr/testify/assert" +) + +func Test_Menu_Empty(t *testing.T) { + w := createWindow("Menu Test").(*window) + bar := buildMenuOverlay(fyne.NewMainMenu(), w.canvas) + assert.Nil(t, bar) // no bar but does not crash +} + +func Test_Menu_AddsQuit(t *testing.T) { + w := createWindow("Menu Test").(*window) + mainMenu := fyne.NewMainMenu(fyne.NewMenu("File")) + bar := buildMenuOverlay(mainMenu, w.canvas) + assert.NotNil(t, bar) + assert.Equal(t, 1, len(mainMenu.Items)) + assert.Equal(t, 2, len(mainMenu.Items[0].Items)) // separator+quit inserted +} + +func Test_Menu_LeaveQuit(t *testing.T) { + w := createWindow("Menu Test").(*window) + mainMenu := fyne.NewMainMenu(fyne.NewMenu("File", fyne.NewMenuItem("Quit", nil))) + bar := buildMenuOverlay(mainMenu, w.canvas) + assert.NotNil(t, bar) + assert.Equal(t, 1, len(mainMenu.Items[0].Items)) // no separator added + assert.Nil(t, mainMenu.Items[0].Items[0].Action) // no quit handler added +}