Salome HOME
updated copyright message
[modules/gui.git] / src / SalomeApp / salome_pluginsmanager.py
index c6bc59f1ecb0cc5207aa4df567daf3709a9c0ad6..fb27befd0309fa6a3af9ca59cb7a9ec1ef2a793b 100644 (file)
@@ -1,5 +1,5 @@
 # -*- coding: utf-8 -*-
-# Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+# Copyright (C) 2007-2023  CEA, EDF, OPEN CASCADE
 #
 # This library is free software; you can redistribute it and/or
 # modify it under the terms of the GNU Lesser General Public
@@ -156,6 +156,7 @@ class PluginsManager:
         self.lasttime=0
         self.plugindirs=[]
         self.plugins_files=[]
+        self.toolbar = None
 
         # MODULES plugins directory.
         # The SALOME modules may provides natively some plugins. These
@@ -205,11 +206,14 @@ class PluginsManager:
         else:
           self.menu=QMenu(self.menuname,self.basemenu)
           self.basemenu.addMenu(self.menu)
+        self.toolbar=sgPyQt.createTool(self.menuname)
 
         self.menu.menuAction().setVisible(False)
 
         self.basemenu.aboutToShow.connect(self.importPlugins)
 
+        self.importPlugins() # to create toolbar immediately
+
     def analyseFile(self,filename):
       """
       This function checks if the specified file is a plugins python
@@ -223,10 +227,10 @@ class PluginsManager:
           self.plugindirs.append(dirpath)
           logger.debug("The directory %s has been added to plugin paths"%dirpath)
         
-    def AddFunction(self,name,description,script):
+    def AddFunction(self,name,description,script,icon=None):
         """ Add a plugin function
         """
-        self.registry[name]=script,description
+        self.registry[name]=script,description,icon
         self.entries.append(name)
 
         def handler(obj=self,script=script):
@@ -240,8 +244,13 @@ class PluginsManager:
 
     def importPlugins(self):
         """Execute the salome_plugins file that contains plugins definition """
+        ior_fake_ns = None
+        prefix_ior = "--iorfakens="
+        presence_ior = [elt for elt in QApplication.arguments() if elt[:len(prefix_ior)]==prefix_ior]
+        if any(presence_ior):
+          ior_fake_ns = presence_ior[-1][len(prefix_ior):]
         if self.lasttime ==0 or salome.myStudy == None:
-          salome.salome_init(embedded=1)
+          salome.salome_init(embedded=True,iorfakensfile=ior_fake_ns)
 
         lasttime=0
 
@@ -277,9 +286,10 @@ class PluginsManager:
               sys.path.insert(0,directory)
               logger.debug("The directory %s has been added to PYTHONPATH"%directory)
             try:
-              exec(compile(open(plugins_file).read(), plugins_file, 'exec'),globals(),{})
+              with open(plugins_file, 'rb') as fp:
+                exec(compile(fp.read(), plugins_file, 'exec'), globals(), {})
             except:
-              logger.fatal("Error while loading plugins from file %s"%plugins_file)
+              logger.critical("Error while loading plugins from file %s"%plugins_file)
               traceback.print_exc()
 
           self.updateMenu()
@@ -287,6 +297,7 @@ class PluginsManager:
     def updateMenu(self):
         """Update the Plugins menu"""
         self.menu.clear()
+        sgPyQt.clearTool(self.menuname)
         for entry in self.entries:
           names=entry.split("/")
           if len(names) < 1:continue
@@ -312,14 +323,18 @@ class PluginsManager:
           name=names.pop(0)
           act=parentMenu.addAction(name,self.handlers[entry])
           act.setStatusTip(self.registry[entry][1])
+          icon = self.registry[entry][2] if len(self.registry[entry])>2 else None
+          if icon is not None and not icon.isNull() and icon.availableSizes():
+            act.setIcon(icon)
+            sgPyQt.createTool(act, self.toolbar)
 
         self.menu.menuAction().setVisible(True)
 
-def AddFunction(name,description,script):
+def AddFunction(name,description,script,icon=None):
    """ Add a plugin function
        Called by a user to register a function (script)
    """
-   return current_plugins_manager.AddFunction(name,description,script)
+   return current_plugins_manager.AddFunction(name,description,script,icon)
 
 def entries():
   """ Return the list of entries in menu: can be sorted or modified in place to customize menu content """