소스 검색

wxGUI: menu clean up

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@41566 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 15 년 전
부모
커밋
92da1399d1

+ 1 - 0
gui/wxpython/gui_modules/__init__.py

@@ -18,6 +18,7 @@ all = [
     "mapdisp_window.py",
     "mapdisp.py",
     "mcalc_builder.py",
+    "menu.py",
     "menudata.py",
     "menuform.py",
     "nviz_mapdisp.py",

+ 1 - 1
gui/wxpython/gui_modules/help.py

@@ -72,7 +72,7 @@ class MenuTreeWindow(wx.Frame):
         self.dataBox = wx.StaticBox(parent = self.panel, id = wx.ID_ANY,
                                     label=" %s " % _("Menu tree (double-click to run command)"))        
         # tree
-        self.tree = MenuTree(parent = self.panel, data = menudata.Data())
+        self.tree = MenuTree(parent = self.panel, data = menudata.ManagerData())
         self.tree.Load()
         
         self.searchDict = { _('label')    : 'label', # i18n workaround

+ 71 - 0
gui/wxpython/gui_modules/menu.py

@@ -0,0 +1,71 @@
+import wx
+
+import globalvar
+
+class Menu(wx.MenuBar):
+    def __init__(self, parent, data):
+        """!Creates menubar"""
+        wx.MenuBar.__init__(self)
+        self.parent   = parent
+        self.menudata = data
+        self.menucmd  = dict()
+        
+        for eachMenuData in self.menudata.GetMenu():
+            for eachHeading in eachMenuData:
+                menuLabel = eachHeading[0]
+                menuItems = eachHeading[1]
+                self.Append(self._createMenu(menuItems), menuLabel)
+        
+    def _createMenu(self, menuData):
+        """!Creates menu"""
+        menu = wx.Menu()
+        for eachItem in menuData:
+            if len(eachItem) == 2:
+                label = eachItem[0]
+                subMenu = self._createMenu(eachItem[1])
+                menu.AppendMenu(wx.ID_ANY, label, subMenu)
+            else:
+                self._createMenuItem(menu, *eachItem)
+        
+        self.parent.Bind(wx.EVT_MENU_HIGHLIGHT_ALL, self.parent.OnMenuHighlight)
+        
+        return menu
+
+    def _createMenuItem(self, menu, label, help, handler, gcmd, keywords,
+                        shortcut = '', kind = wx.ITEM_NORMAL):
+        """!Creates menu items"""
+        if not label:
+            menu.AppendSeparator()
+            return
+        
+        if len(gcmd) > 0:
+            helpString = gcmd + ' -- ' + help
+        else:
+            helpString = help
+        
+        if shortcut:
+            label += '\t' + shortcut
+        
+        menuItem = menu.Append(wx.ID_ANY, label, helpString, kind)
+        
+        self.menucmd[menuItem.GetId()] = gcmd
+        
+        if len(gcmd) > 0 and \
+                gcmd.split()[0] not in globalvar.grassCmd['all']:
+            menuItem.Enable (False)
+        
+        rhandler = eval('self.parent.' + handler)
+        
+        self.parent.Bind(wx.EVT_MENU, rhandler, menuItem)
+
+    def GetData(self):
+        """!Get menu data"""
+        return self.menudata
+    
+    def GetCmd(self):
+        """!Get list of commands
+
+        @return list of commands
+        """
+        return self.menucmd
+        

+ 90 - 58
gui/wxpython/gui_modules/menudata.py

@@ -1,11 +1,12 @@
 """!
 @package menudata.py
 
-@brief Complex list for main menu entries for GRASS wxPython GUI.
+@brief Complex list for menu entries for wxGUI.
 
 Classes:
  - Data
- - MenuTree
+ - ManagerData
+ - ModelerData
 
 Usage:
 @code
@@ -16,11 +17,11 @@ where <i>action</i>:
  - strings (default)
  - tree
  - commands
+ - dump
 
-(C) 2007-2009 by the GRASS Development Team
-This program is free software under the GNU General Public
-License (>=v2). Read the file COPYING that comes with GRASS
-for details.
+(C) 2007-2010 by the GRASS Development Team
+This program is free software under the GNU General Public License
+(>=v2). Read the file COPYING that comes with GRASS for details.
 
 @author Michael Barton (Arizona State University)
 @author Yann Chemin <yann.chemin gmail.com>
@@ -38,55 +39,46 @@ except ImportError:
 
 import globalvar
 
-class Data:
-    '''!Data object that returns menu descriptions to be used in wxgui.py.'''
-    def __init__(self, filename=None):
-        if not filename:
-            gisbase = os.getenv('GISBASE')
-	    filename = os.path.join(globalvar.ETCWXDIR, 'xml', 'menudata.xml')
+class MenuData:
+    """!Abstract menu data class"""
+    def __init__(self, filename):
 	self.tree = etree.parse(filename)
 
-    def getMenuItem(self, mi):
-	if mi.tag == 'separator':
-	    return ('', '', '', '', '')
-	elif mi.tag == 'menuitem':
-	    label    = _(mi.find('label').text)
-	    help     = _(mi.find('help').text)
-	    handler  = mi.find('handler').text
-	    gcmd     = mi.find('command')  # optional
-            keywords = mi.find('keywords') # optional
-            shortcut = mi.find('shortcut') # optional
-	    if gcmd != None:
-		gcmd = gcmd.text
-	    else:
-		gcmd = ""
-            if keywords != None:
-                keywords = keywords.text
-            else:
-                keywords = ""
-            if shortcut != None:
-                shortcut = shortcut.text
-            else:
-                shortcut = ""
-	    return (label, help, handler, gcmd, keywords, shortcut)
-	elif mi.tag == 'menu':
-	    return self.getMenu(mi)
-	else:
-	    raise Exception()
+    def _getMenu(self, m):
+        """!Get menu
 
-    def getMenu(self, m):
+        @param m menu
+
+        @return label, menu items
+        """
 	label = _(m.find('label').text)
 	items = m.find('items')
-	return (label, tuple(map(self.getMenuItem, items)))
+	return (label, tuple(map(self._getMenuItem, items)))
+    
+    def _getMenuBar(self, mb):
+        """!Get menu bar
 
-    def getMenuBar(self, mb):
-	return tuple(map(self.getMenu, mb.findall('menu')))
+        @param mb menu bar instance
+        
+        @return menu items
+        """
+	return tuple(map(self._getMenu, mb.findall('menu')))
 
-    def getMenuData(self, md):
-	return list(map(self.getMenuBar, md.findall('menubar')))
+    def _getMenuData(self, md):
+        """!Get menu data
+
+        @param md menu data instace
+        
+        @return menu data
+        """
+	return list(map(self._getMenuBar, md.findall('menubar')))
 
     def GetMenu(self):
-	return self.getMenuData(self.tree.getroot())
+        """!Get menu
+
+        @return menu data
+        """
+	return self._getMenuData(self.tree.getroot())
 
     def PrintStrings(self, fh):
         """!Print menu strings to file (used for localization)
@@ -105,10 +97,10 @@ class Data:
         level = 0
         for eachMenuData in self.GetMenu():
             for label, items in eachMenuData:
-                fh.write('- %s\n' % label)
-                self.__PrintTreeItems(fh, level + 1, items)
-
-    def __PrintTreeItems(self, fh, level, menuData):
+                fh.write('- %s\n' % label.replace('&', ''))
+                self._PrintTreeItems(fh, level + 1, items)
+        
+    def _PrintTreeItems(self, fh, level, menuData):
         """!Print menu tree items to file (used by PrintTree)
 
         @param fh file descriptor
@@ -118,7 +110,7 @@ class Data:
             if len(eachItem) == 2:
                 if eachItem[0]:
                     fh.write('%s - %s\n' % (' ' * level, eachItem[0]))
-                self.__PrintTreeItems(fh, level + 1, eachItem[1])
+                self._PrintTreeItems(fh, level + 1, eachItem[1])
             else:
                 if eachItem[0]:
                     fh.write('%s - %s\n' % (' ' * level, eachItem[0]))
@@ -132,10 +124,10 @@ class Data:
         for eachMenuData in self.GetMenu():
             for label, items in eachMenuData:
                 menuItems = [label, ]
-                self.__PrintCommandsItems(fh, level + 1, items,
-                                          menuItems, itemSep, menuSep)
+                self._PrintCommandsItems(fh, level + 1, items,
+                                         menuItems, itemSep, menuSep)
         
-    def __PrintCommandsItems(self, fh, level, menuData,
+    def _PrintCommandsItems(self, fh, level, menuData,
                              menuItems, itemSep, menuSep):
         """!Print commands item (used by PrintCommands)
 
@@ -149,7 +141,7 @@ class Data:
                         menuItems[level] = eachItem[0]
                     except IndexError:
                         menuItems.append(eachItem[0])
-                self.__PrintCommandsItems(fh, level + 1, eachItem[1],
+                self._PrintCommandsItems(fh, level + 1, eachItem[1],
                                           menuItems, itemSep, menuSep)
             else:
                 try:
@@ -159,10 +151,50 @@ class Data:
                 
                 if eachItem[3]:
                     fh.write('%s%s' % (eachItem[3], itemSep))
-                    fh.write(menuSep.join(menuItems))
+                    fh.write(menuSep.join(map(lambda x: x.replace('&', ''), menuItems)))
                     fh.write('%s%s' % (menuSep, eachItem[0]))
                     fh.write('\n')
 
+class ManagerData(MenuData):
+    def __init__(self, filename = None):
+        if not filename:
+            gisbase = os.getenv('GISBASE')
+	    filename = os.path.join(globalvar.ETCWXDIR, 'xml', 'menudata.xml')
+        
+        MenuData.__init__(self, filename)
+    
+    def _getMenuItem(self, mi):
+        """!Get menu item
+
+        @param mi menu item instance
+        """
+	if mi.tag == 'separator':
+	    return ('', '', '', '', '')
+	elif mi.tag == 'menuitem':
+	    label    = _(mi.find('label').text)
+	    help     = _(mi.find('help').text)
+	    handler  = mi.find('handler').text
+	    gcmd     = mi.find('command')  # optional
+            keywords = mi.find('keywords') # optional
+            shortcut = mi.find('shortcut') # optional
+	    if gcmd != None:
+		gcmd = gcmd.text
+	    else:
+		gcmd = ""
+            if keywords != None:
+                keywords = keywords.text
+            else:
+                keywords = ""
+            if shortcut != None:
+                shortcut = shortcut.text
+            else:
+                shortcut = ""
+	    return (label, help, handler, gcmd, keywords, shortcut)
+	elif mi.tag == 'menu':
+	    return self._getMenu(mi)
+	else:
+	    raise Exception()
+        
     def GetModules(self):
         """!Create dictionary of modules used to search module by
         keywords, description, etc."""
@@ -205,9 +237,9 @@ if __name__ == "__main__":
         file = sys.argv[2]
 
     if file:
-        data = Data(file)
+        data = ManagerData(file)
     else:
-        data = Data()
+        data = ManagerData()
     
     if action == 'strings':
         data.PrintStrings(sys.stdout)

+ 2 - 2
gui/wxpython/gui_modules/prompt.py

@@ -140,7 +140,7 @@ class TextCtrlAutoComplete(wx.ComboBox, listmix.ColumnSorterMixin):
         self.popupsize = wx.Size(charwidth*longest, charheight*itemcount)
         self.dropdownlistbox.SetSize(self.popupsize)
         self.dropdown.SetClientSize(self.popupsize)
-
+        
     def _showDropDown(self, show = True):
         """!Either display the drop down list (show = True) or hide it
         (show = False).
@@ -480,7 +480,7 @@ class GPrompt(object):
         
         # dictionary of modules (description, keywords, ...)
         if not self.standAlone:
-            self.moduleDesc = parent.parent.menudata.GetModules()
+            self.moduleDesc = parent.parent.menubar.GetData().GetModules()
             self.moduleList = self._getListOfModules()
             self.mapList = self._getListOfMaps()
         else:

+ 4 - 57
gui/wxpython/wxgui.py

@@ -89,6 +89,7 @@ import gui_modules.gdialogs as gdialogs
 import gui_modules.colorrules as colorrules
 import gui_modules.ogc_services as ogc_services
 import gui_modules.prompt as prompt
+import gui_modules.menu as menu
 from   gui_modules.debug import Debug
 from   gui_modules.help import MenuTreeWindow
 from   gui_modules.help import AboutWindow
@@ -123,7 +124,6 @@ class GMFrame(wx.Frame):
         self.curr_page     = ''           # currently selected page for layer tree notebook
         self.curr_pagenum  = ''           # currently selected page number for layer tree notebook
         self.workspaceFile = workspace    # workspace file
-        self.menucmd       = dict()       # menuId / cmd
         self.georectifying = None         # reference to GCP class or None
         # list of open dialogs
         self.dialogs        = dict()
@@ -132,7 +132,9 @@ class GMFrame(wx.Frame):
         
         # creating widgets
         # -> self.notebook, self.goutput, self.outpage
-        self.menubar, self.menudata = self.__createMenuBar()
+        self.menubar = menu.Menu(parent = self, data = menudata.ManagerData())
+        self.SetMenuBar(self.menubar)
+        self.menucmd = self.menubar.GetCmd()
         self.statusbar = self.CreateStatusBar(number=1)
         self.notebook  = self.__createNoteBook()
         self.toolbar   = self.__createToolBar()
@@ -191,61 +193,6 @@ class GMFrame(wx.Frame):
         self.curr_page.maptree.mapdisplay.Raise()
         self.Raise()
             
-    def __createMenuBar(self):
-        """!Creates menubar"""
-
-        self.menubar = wx.MenuBar()
-        self.menudata = menudata.Data()
-        for eachMenuData in self.menudata.GetMenu():
-            for eachHeading in eachMenuData:
-                menuLabel = eachHeading[0]
-                menuItems = eachHeading[1]
-                self.menubar.Append(self.__createMenu(menuItems), menuLabel)
-        self.SetMenuBar(self.menubar)
-
-        return (self.menubar, self.menudata)
-
-    def __createMenu(self, menuData):
-        """!Creates menu"""
-
-        menu = wx.Menu()
-        for eachItem in menuData:
-            if len(eachItem) == 2:
-                label = eachItem[0]
-                subMenu = self.__createMenu(eachItem[1])
-                menu.AppendMenu(wx.ID_ANY, label, subMenu)
-            else:
-                self.__createMenuItem(menu, *eachItem)
-        self.Bind(wx.EVT_MENU_HIGHLIGHT_ALL, self.OnMenuHighlight)
-        return menu
-
-    def __createMenuItem(self, menu, label, help, handler, gcmd, keywords, shortcut = '', kind = wx.ITEM_NORMAL):
-        """!Creates menu items"""
-
-        if not label:
-            menu.AppendSeparator()
-            return
-
-        if len(gcmd) > 0:
-            helpString = gcmd + ' -- ' + help
-        else:
-            helpString = help
-        
-        if shortcut:
-            label += '\t' + shortcut
-        
-        menuItem = menu.Append(wx.ID_ANY, label, helpString, kind)
-
-        self.menucmd[menuItem.GetId()] = gcmd
-
-        if len(gcmd) > 0 and \
-                gcmd.split()[0] not in globalvar.grassCmd['all']:
-            menuItem.Enable (False)
-
-        rhandler = eval(handler)
-
-        self.Bind(wx.EVT_MENU, rhandler, menuItem)
-
     def __createNoteBook(self):
         """!Creates notebook widgets"""
 

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 373 - 373
gui/wxpython/xml/menudata.xml