GRASS Programmer's Manual
6.4.2(2012)
|
00001 """! 00002 @package menu.py 00003 00004 @brief Menu classes for wxGUI 00005 00006 Classes: 00007 - Menu 00008 00009 (C) 2010 by the GRASS Development Team 00010 This program is free software under the GNU General Public License 00011 (>=v2). Read the file COPYING that comes with GRASS for details. 00012 00013 @author Martin Landa <landa.martin gmail.com> 00014 @author Pawel Netzel (menu customization) 00015 @author Milena Nowotarska (menu customization) 00016 @author Robert Szczepanek (menu customization) 00017 @author Vaclav Petras <wenzeslaus gmail.com> (menu customization) 00018 """ 00019 00020 import wx 00021 00022 import globalvar 00023 import utils 00024 00025 from preferences import globalSettings as UserSettings 00026 00027 class Menu(wx.MenuBar): 00028 def __init__(self, parent, data): 00029 """!Creates menubar""" 00030 wx.MenuBar.__init__(self) 00031 self.parent = parent 00032 self.menudata = data 00033 self.menucmd = dict() 00034 00035 self.menustyle = UserSettings.Get(group='appearance', key='menustyle', subkey='selection') 00036 00037 for eachMenuData in self.menudata.GetMenu(): 00038 for eachHeading in eachMenuData: 00039 menuLabel = eachHeading[0] 00040 menuItems = eachHeading[1] 00041 self.Append(self._createMenu(menuItems), menuLabel) 00042 00043 def _createMenu(self, menuData): 00044 """!Creates menu""" 00045 menu = wx.Menu() 00046 for eachItem in menuData: 00047 if len(eachItem) == 2: 00048 label = eachItem[0] 00049 subMenu = self._createMenu(eachItem[1]) 00050 menu.AppendMenu(wx.ID_ANY, label, subMenu) 00051 else: 00052 self._createMenuItem(menu, self.menustyle, *eachItem) 00053 00054 self.parent.Bind(wx.EVT_MENU_HIGHLIGHT_ALL, self.OnMenuHighlight) 00055 00056 return menu 00057 00058 def _createMenuItem(self, menu, menustyle, label, help, handler, gcmd, keywords, 00059 shortcut = '', kind = wx.ITEM_NORMAL): 00060 """!Creates menu items 00061 There are three menu styles (menu item text styles). 00062 1 -- label only, 2 -- label and cmd name, 3 -- cmd name only 00063 """ 00064 if not label: 00065 menu.AppendSeparator() 00066 return 00067 00068 if len(gcmd) > 0: 00069 helpString = gcmd + ' -- ' + help 00070 if menustyle == 1: 00071 label += ' [' + gcmd + ']' 00072 elif menustyle == 2: 00073 label = ' [' + gcmd + ']' 00074 else: 00075 helpString = help 00076 00077 if shortcut: 00078 label += '\t' + shortcut 00079 00080 menuItem = menu.Append(wx.ID_ANY, label, helpString, kind) 00081 00082 self.menucmd[menuItem.GetId()] = gcmd 00083 00084 if gcmd: 00085 try: 00086 cmd = utils.split(str(gcmd)) 00087 except UnicodeError: 00088 cmd = utils.split(utils.EncodeString((gcmd))) 00089 if cmd and cmd[0] not in globalvar.grassCmd['all']: 00090 menuItem.Enable(False) 00091 00092 rhandler = eval('self.parent.' + handler) 00093 00094 self.parent.Bind(wx.EVT_MENU, rhandler, menuItem) 00095 00096 def GetData(self): 00097 """!Get menu data""" 00098 return self.menudata 00099 00100 def GetCmd(self): 00101 """!Get list of commands 00102 00103 @return list of commands 00104 """ 00105 return self.menucmd 00106 00107 def OnMenuHighlight(self, event): 00108 """ 00109 Default menu help handler 00110 """ 00111 # Show how to get menu item info from this event handler 00112 id = event.GetMenuId() 00113 item = self.FindItemById(id) 00114 if item: 00115 text = item.GetText() 00116 help = item.GetHelp() 00117 00118 # but in this case just call Skip so the default is done 00119 event.Skip()