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