浏览代码

wxGUI/toolboxes: finishing https://trac.osgeo.org/grass/changeset/57187 and 57188 (basic version of generation of translation files, code clean up)

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@57199 15284696-431f-4ddb-bdfa-cd5b030d7da7
Vaclav Petras 11 年之前
父节点
当前提交
6d65092e3e

+ 3 - 2
gui/wxpython/Makefile

@@ -40,11 +40,12 @@ xml/menudata.xml: core/toolboxes.py
 	$(call run_grass,$(PYTHON) $< > $@)
 
 xml/module_tree_menudata.xml: core/toolboxes.py
-	$(call run_grass,$(PYTHON) $< dummy_parameter > $@)
+	$(call run_grass,$(PYTHON) $< "module_tree" > $@)
 
 menustrings.py: core/menutree.py $(ETCDIR)/xml/menudata.xml $(ETCDIR)/xml/module_tree_menudata.xml $(ETCDIR)/xml/menudata_modeler.xml $(ETCDIR)/xml/menudata_psmap.xml
 	@echo "# This is a generated file.\n" > $@
-	$(call run_grass,$(PYTHON) $< >> $@)
+	$(call run_grass,$(PYTHON) $< "manager" >> $@)
+	$(call run_grass,$(PYTHON) $< "module_tree" >> $@)
 	$(call run_grass,$(PYTHON) $< "modeler" >> $@)
 	$(call run_grass,$(PYTHON) $< "psmap" >> $@)
 

+ 15 - 2
gui/wxpython/core/menutree.py

@@ -18,7 +18,8 @@ where <i>action</i>:
  - dump (tree structure with stored data)
 
 and <i>menu</i>:
- - manager (Layer Manager)
+ - manager (Main menu in Layer Manager)
+ - module_tree (Module tree in Layer Manager)
  - modeler (Graphical Modeler)
  - psmap (Cartographic Composer)
 
@@ -221,7 +222,7 @@ if __name__ == "__main__":
     for arg in sys.argv:
         if arg in ('strings', 'tree', 'commands', 'dump'):
             action =  arg
-        elif arg in ('manager', 'modeler', 'psmap'):
+        elif arg in ('manager', 'module_tree', 'modeler', 'psmap'):
             menu = arg
 
     gui_wx_path = os.path.join(os.getenv('GISBASE'), 'etc', 'gui', 'wxpython')
@@ -234,12 +235,21 @@ if __name__ == "__main__":
         from core.globalvar    import ETCWXDIR
         filename = os.path.join(ETCWXDIR, 'xml', 'menudata.xml')
         menudata = LayerManagerMenuData(filename)
+    # FIXME: since module descriptions are used again we have now the third copy of the same string (one is in modules)
+    elif menu == 'module_tree':
+        from lmgr.menudata import LayerManagerModuleTree
+        from core.globalvar import ETCWXDIR
+        filename = os.path.join(ETCWXDIR, 'xml', 'module_tree_menudata.xml')
+        menudata = LayerManagerModuleTree(filename)
     elif menu == 'modeler':
         from gmodeler.menudata import ModelerMenuData
         menudata = ModelerMenuData()
     elif menu == 'psmap':
         from psmap.menudata import PsMapMenuData
         menudata = PsMapMenuData()
+    else:
+        import grass.script.core as gscore
+        gscore.fatal("Unknown value for parameter menu: " % menu)
 
     if action == 'strings':
         menudata.PrintStrings(sys.stdout)
@@ -249,5 +259,8 @@ if __name__ == "__main__":
         menudata.PrintCommands(sys.stdout)
     elif action == 'dump':
         print menudata.model
+    else:
+        import grass.script.core as gscore
+        gscore.fatal("Unknown value for parameter action: " % action)
 
     sys.exit(0)

+ 2 - 2
gui/wxpython/core/test.toolboxes_menudata.xml

@@ -63,8 +63,8 @@
         <menuitem>
           <label>Convert coordinates</label>
           <command>m.proj</command>
-          <help />
-          <keywords />
+          <help>Converts coordinates from one projection to another (cs2cs frontend).</help>
+          <keywords>miscellaneous,projection</keywords>
           <handler>OnMenuCmd</handler>
         </menuitem>
       </items>

+ 33 - 129
gui/wxpython/core/toolboxes.py

@@ -68,9 +68,8 @@ def toolboxesOutdated():
         gcore.try_remove(path)
 
 
-# TODO: merge the function with getMenuFile
 def getMenudataFile(userRootFile, newFile, fallback):
-    """!Returns path to XML file for building menu.
+    """!Returns path to XML file for building menu or another tree.
 
     Creates toolbox directory where user defined toolboxes should be located.
     Checks whether it is needed to create new XML file (user changed toolboxes)
@@ -134,7 +133,7 @@ def getMenudataFile(userRootFile, newFile, fallback):
                 tree = createTree(distributionRootFile=distributionRootFile, userRootFile=userRootFile)
             except ETREE_EXCEPTIONS:
                 GError(_("Unable to parse user toolboxes XML files. "
-                         "Default toolboxes will be loaded."))
+                         "Default files will be loaded."))
                 return fallback
 
             try:
@@ -144,75 +143,12 @@ def getMenudataFile(userRootFile, newFile, fallback):
                 fh.close()
                 return menudataFile
             except:
+                Debug.msg(2, "toolboxes.getMenudataFile: writing menudata failed, returning fallback file")
                 return fallback
         else:
             return menudataFile
     else:
-        return fallback
-
-
-def getMenuFile():
-    """!Returns path to XML file for building menu.
-
-    Creates toolbox directory where user defined toolboxes should be located.
-    Checks whether it is needed to create new XML file (user changed toolboxes)
-    or the already generated file could be used.
-    If something goes wrong during building or user doesn't modify menu,
-    default file (from distribution) is returned.
-    """
-    Debug.msg(1, "toolboxes.getMenuFile")
-    fallback = os.path.join(ETCWXDIR, 'xml', 'menudata.xml')
-    # always create toolboxes directory if does not exist yet
-    tbDir = _setupToolboxes()
-
-    if tbDir:
-        menudataFile = os.path.join(tbDir, 'menudata.xml')
-        generateNew = False
-        # when any of main_menu.xml or toolboxes.xml are changed,
-        # generate new menudata.xml
-
-        if os.path.exists(menudataFile):
-            # remove menu file when there is no main_menu and toolboxes
-            if not userToolboxesFile and not userMainMenuFile:
-                os.remove(menudataFile)
-                return fallback
-
-            if bool(userToolboxesFile) != bool(userMainMenuFile):
-                # always generate new because we don't know if there has been any change
-                generateNew = True
-            else:
-                # if newer files -> generate new
-                menudataTime = os.path.getmtime(menudataFile)
-                if userToolboxesFile:
-                    if os.path.getmtime(userToolboxesFile) > menudataTime:
-                        generateNew = True
-                if userMainMenuFile:
-                    if os.path.getmtime(userMainMenuFile) > menudataTime:
-                        generateNew = True
-        elif userToolboxesFile or userMainMenuFile:
-            generateNew = True
-        else:
-            return fallback
-
-        if generateNew:
-            try:
-                tree = toolboxes2menudata()
-            except ETREE_EXCEPTIONS:
-                GError(_("Unable to parse user toolboxes XML files. "
-                         "Default toolboxes will be loaded."))
-                return fallback
-
-            try:
-                xml = _getXMLString(tree.getroot())
-                fh = open(os.path.join(tbDir, 'menudata.xml'), 'w')
-                fh.write(xml)
-                fh.close()
-                return menudataFile
-            except:
-                return fallback
-        else:
-            return menudataFile
-    else:
+        Debug.msg(2, "toolboxes.getMenudataFile: returning menudata fallback file")
         return fallback
 
 
@@ -241,7 +177,7 @@ def _createPath(path):
             return False
     return True
 
-# TODO: merge with toolboxes2menudata
+
 def createTree(distributionRootFile, userRootFile, userDefined=True):
     """!Creates XML file with data for menu.
 
@@ -268,49 +204,15 @@ def createTree(distributionRootFile, userRootFile, userDefined=True):
     wxguiItems = etree.parse(wxguiItemsFile)
     moduleItems = etree.parse(moduleItemsFile)
 
-    return toolboxes2menudataInternal(mainMenu=mainMenu,
-                                      toolboxes=toolboxes,
-                                      userToolboxes=userToolboxes,
-                                      wxguiItems=wxguiItems,
-                                      moduleItems=moduleItems)
+    return toolboxes2menudata(mainMenu=mainMenu,
+                              toolboxes=toolboxes,
+                              userToolboxes=userToolboxes,
+                              wxguiItems=wxguiItems,
+                              moduleItems=moduleItems)
 
 
-def toolboxes2menudata(userDefined=True):
-    """!Creates XML file with data for menu.
-
-    Parses toolboxes files from distribution and from users,
-    puts them together, adds metadata to modules and convert
-    tree to previous format used for loading menu.
-
-    @param userDefined use toolboxes defined by user or not (during compilation)
-
-    @return ElementTree instance
-    """
-    if userDefined and userMainMenuFile:
-        mainMenu = etree.parse(userMainMenuFile)
-    else:
-        mainMenu = etree.parse(mainMenuFile)
-
-    toolboxes = etree.parse(toolboxesFile)
-
-    if userDefined and userToolboxesFile:
-        userToolboxes = etree.parse(userToolboxesFile)
-    else:
-        userToolboxes = None
-
-    wxguiItems = etree.parse(wxguiItemsFile)
-    moduleItems = etree.parse(moduleItemsFile)
-
-    return toolboxes2menudataInternal(mainMenu=mainMenu,
-                                      toolboxes=toolboxes,
-                                      userToolboxes=userToolboxes,
-                                      wxguiItems=wxguiItems,
-                                      moduleItems=moduleItems)
-
-
-# TODO: rename
-def toolboxes2menudataInternal(mainMenu, toolboxes, userToolboxes,
-                               wxguiItems, moduleItems):
+def toolboxes2menudata(mainMenu, toolboxes, userToolboxes,
+                       wxguiItems, moduleItems):
     """!Creates XML file with data for menu.
 
     Parses toolboxes files from distribution and from users,
@@ -758,9 +660,7 @@ def doc_test():
     @return a number of failed tests
     """
     import doctest
-
     do_doctest_gettext_workaround()
-
     return doctest.testmod().failed
 
 
@@ -781,16 +681,21 @@ def module_test():
     wxguiItems = etree.parse(wxguiItemsFile)
     moduleItems = etree.parse(moduleItemsFile)
 
-    tree = toolboxes2menudataInternal(mainMenu=menu,
-                                      toolboxes=toolboxes,
-                                      userToolboxes=userToolboxes,
-                                      wxguiItems=wxguiItems,
-                                      moduleItems=moduleItems)
+    tree = toolboxes2menudata(mainMenu=menu,
+                              toolboxes=toolboxes,
+                              userToolboxes=userToolboxes,
+                              wxguiItems=wxguiItems,
+                              moduleItems=moduleItems)
     root = tree.getroot()
     tested = _getXMLString(root)
-    # useful to generate the correct file (uncomment)
-    #sys.stdout.write(_getXMLString(root))
-    #return 0
+
+    # for generatiing correct test file supposing that the implementation
+    # is now correct and working
+    # run the normal test and check the difference before overwriting
+    # the old correct test file
+    if len(sys.argv) > 2 and sys.argv[2] == "generate-correct-file":
+        sys.stdout.write(_getXMLString(root))
+        return 0
 
     menudataFile = 'test.toolboxes_menudata.xml'
     with open(menudataFile) as correctMenudata:
@@ -807,11 +712,11 @@ def module_test():
             sys.stdout.write(line)
             someDiff = True
     if someDiff:
-        print "difference"
+        print "Difference between files."
+        return 1
     else:
         print "OK"
-
-    return 0
+        return 0
 
 
 def main():
@@ -822,13 +727,12 @@ def main():
     # TODO: fix parameter handling
     if len(sys.argv) > 1:
         mainFile = os.path.join(ETCWXDIR, 'xml', 'module_tree.xml')
-        tree = createTree(distributionRootFile=mainFile, userRootFile=None, userDefined=False)
-        root = tree.getroot()
-        sys.stdout.write(_getXMLString(root))
     else:
-        tree = toolboxes2menudata(userDefined=False)
-        root = tree.getroot()
-        sys.stdout.write(_getXMLString(root))
+        mainFile = os.path.join(ETCWXDIR, 'xml', 'main_menu.xml')
+    tree = createTree(distributionRootFile=mainFile, userRootFile=None,
+                      userDefined=False)
+    root = tree.getroot()
+    sys.stdout.write(_getXMLString(root))
 
     return 0
 

+ 7 - 4
gui/wxpython/lmgr/menudata.py

@@ -18,20 +18,23 @@ This program is free software under the GNU General Public License
 import os
 
 from core.menutree  import MenuTreeModelBuilder
-from core.toolboxes import getMenuFile, getMenudataFile
+from core.toolboxes import getMenudataFile
 from core.globalvar import ETCWXDIR
 from core.gcmd import GError
 
 
 class LayerManagerMenuData(MenuTreeModelBuilder):
     def __init__(self, filename=None):
+        fallback = os.path.join(ETCWXDIR, 'xml', 'menudata.xml')
         if not filename:
-            filename = getMenuFile()
+            filename = getMenudataFile(userRootFile='main_menu.xml',
+                                       newFile='menudata.xml',
+                                       fallback=fallback)
         try:
             MenuTreeModelBuilder.__init__(self, filename)
         except (ValueError, AttributeError, TypeError):
             GError(_("Unable to parse user toolboxes XML files. "
-                     "Default toolboxes will be loaded."))
+                     "Default main menu will be loaded."))
             fallback = os.path.join(ETCWXDIR, 'xml', 'menudata.xml')
             MenuTreeModelBuilder.__init__(self, fallback)
 
@@ -48,5 +51,5 @@ class LayerManagerModuleTree(MenuTreeModelBuilder):
             MenuTreeModelBuilder.__init__(self, filename)
         except (ValueError, AttributeError, TypeError):
             GError(_("Unable to parse user toolboxes XML files. "
-                     "Default toolboxes will be loaded."))
+                     "Default module tree will be loaded."))
             MenuTreeModelBuilder.__init__(self, fallback)