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