menu.py 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. """!
  2. @package gui_core.menu
  3. @brief Menu classes for wxGUI
  4. Classes:
  5. - menu::Menu
  6. (C) 2010 by the GRASS Development Team
  7. This program is free software under the GNU General Public License
  8. (>=v2). Read the file COPYING that comes with GRASS for details.
  9. @author Martin Landa <landa.martin gmail.com>
  10. @author Pawel Netzel (menu customization)
  11. @author Milena Nowotarska (menu customization)
  12. @author Robert Szczepanek (menu customization)
  13. @author Vaclav Petras <wenzeslaus gmail.com> (menu customization)
  14. """
  15. import wx
  16. from core import globalvar
  17. from core import utils
  18. from core.gcmd import EncodeString
  19. from core.settings import UserSettings
  20. class Menu(wx.MenuBar):
  21. def __init__(self, parent, data):
  22. """!Creates menubar"""
  23. wx.MenuBar.__init__(self)
  24. self.parent = parent
  25. self.menudata = data
  26. self.menucmd = dict()
  27. self.menustyle = UserSettings.Get(group='appearance', key='menustyle', subkey='selection')
  28. for eachMenuData in self.menudata.GetMenu():
  29. for eachHeading in eachMenuData:
  30. menuLabel = eachHeading[0]
  31. menuItems = eachHeading[1]
  32. self.Append(self._createMenu(menuItems), menuLabel)
  33. def _createMenu(self, menuData):
  34. """!Creates menu"""
  35. menu = wx.Menu()
  36. for eachItem in menuData:
  37. if len(eachItem) == 2:
  38. label = eachItem[0]
  39. subMenu = self._createMenu(eachItem[1])
  40. menu.AppendMenu(wx.ID_ANY, label, subMenu)
  41. else:
  42. self._createMenuItem(menu, self.menustyle, *eachItem)
  43. self.parent.Bind(wx.EVT_MENU_HIGHLIGHT_ALL, self.OnMenuHighlight)
  44. return menu
  45. def _createMenuItem(self, menu, menustyle, label, help, handler, gcmd, keywords,
  46. shortcut = '', wxId = wx.ID_ANY, kind = wx.ITEM_NORMAL):
  47. """!Creates menu items
  48. There are three menu styles (menu item text styles).
  49. 1 -- label only, 2 -- label and cmd name, 3 -- cmd name only
  50. """
  51. if not label:
  52. menu.AppendSeparator()
  53. return
  54. if len(gcmd) > 0:
  55. helpString = gcmd + ' -- ' + help
  56. if menustyle == 1:
  57. label += ' [' + gcmd + ']'
  58. elif menustyle == 2:
  59. label = ' [' + gcmd + ']'
  60. else:
  61. helpString = help
  62. if shortcut:
  63. label += '\t' + shortcut
  64. menuItem = menu.Append(wxId, label, helpString, kind)
  65. self.menucmd[menuItem.GetId()] = gcmd
  66. if gcmd:
  67. try:
  68. cmd = utils.split(str(gcmd))
  69. except UnicodeError:
  70. cmd = utils.split(EncodeString((gcmd)))
  71. if cmd and cmd[0] not in globalvar.grassCmd['all']:
  72. menuItem.Enable(False)
  73. rhandler = eval('self.parent.' + handler)
  74. self.parent.Bind(wx.EVT_MENU, rhandler, menuItem)
  75. def GetData(self):
  76. """!Get menu data"""
  77. return self.menudata
  78. def GetCmd(self):
  79. """!Get list of commands
  80. @return list of commands
  81. """
  82. return self.menucmd
  83. def OnMenuHighlight(self, event):
  84. """
  85. Default menu help handler
  86. """
  87. # Show how to get menu item info from this event handler
  88. id = event.GetMenuId()
  89. item = self.FindItemById(id)
  90. if item:
  91. text = item.GetText()
  92. help = item.GetHelp()
  93. # but in this case just call Skip so the default is done
  94. event.Skip()