menu.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package glfw
  2. import (
  3. "fyne.io/fyne/v2"
  4. )
  5. func buildMenuOverlay(menus *fyne.MainMenu, w *window) fyne.CanvasObject {
  6. if len(menus.Items) == 0 {
  7. fyne.LogError("Main menu must have at least one child menu", nil)
  8. return nil
  9. }
  10. menus = addMissingQuitForMainMenu(menus, w)
  11. return NewMenuBar(menus, w.canvas)
  12. }
  13. func addMissingQuitForMainMenu(menus *fyne.MainMenu, w *window) *fyne.MainMenu {
  14. var lastItem *fyne.MenuItem
  15. if len(menus.Items[0].Items) > 0 {
  16. lastItem = menus.Items[0].Items[len(menus.Items[0].Items)-1]
  17. if lastItem.Label == "Quit" {
  18. lastItem.IsQuit = true
  19. }
  20. }
  21. if lastItem == nil || !lastItem.IsQuit { // make sure the first menu always has a quit option
  22. quitItem := fyne.NewMenuItem("Quit", nil)
  23. quitItem.IsQuit = true
  24. menus.Items[0].Items = append(menus.Items[0].Items, fyne.NewMenuItemSeparator(), quitItem)
  25. }
  26. for _, item := range menus.Items[0].Items {
  27. if item.IsQuit && item.Action == nil {
  28. item.Action = func() {
  29. for _, win := range w.driver.AllWindows() {
  30. if glWin, ok := win.(*window); ok {
  31. glWin.closed(glWin.view())
  32. } else {
  33. win.Close() // for test windows
  34. }
  35. }
  36. }
  37. }
  38. }
  39. return menus
  40. }