]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
Improve modules management (for singleton modules like PARAVIS)
authorvsr <vsr@opencascade.com>
Mon, 25 Jan 2010 06:41:36 +0000 (06:41 +0000)
committervsr <vsr@opencascade.com>
Mon, 25 Jan 2010 06:41:36 +0000 (06:41 +0000)
src/CAM/CAM_Application.cxx
src/LightApp/LightApp_Application.cxx
src/LightApp/LightApp_Application.h

index 22a406965aadee11200b6d4e4e5d7cf41ed96f9b..3dfe8dbf6ed5eced2ba1355e4ca999b0806eb0fd 100755 (executable)
@@ -238,7 +238,7 @@ void CAM_Application::loadModules()
 {
   for ( ModuleInfoList::const_iterator it = myInfoList.begin(); it != myInfoList.end(); ++it )
   {
-    if (!isModuleAccessible((*it).name)) {
+    if ( !isModuleAccessible( (*it).title ) ) {
       continue;
     }
     CAM_Module* mod = loadModule( (*it).title );
@@ -273,6 +273,11 @@ CAM_Module* CAM_Application::loadModule( const QString& modName, const bool show
     return 0;
   }
 
+  if ( !isModuleAccessible( modName ) ) {
+    qWarning( qPrintable( tr( "Module \"%1\" cannot be loaded in this application." ).arg( modName ) ) );
+    return 0;
+  }
+
   QString libName = moduleLibrary( modName );
   if ( libName.isEmpty() )
   {
@@ -520,16 +525,30 @@ QString CAM_Application::moduleIcon( const QString& name ) const
   \brief Returns \c true if module is accessible for the current application.
   Singleton module can be loaded only in one application object. In other application
   objects this module will be unavailable.
+  \param title module title (user name)
+  \return \c true if module is accessible (can be loaded) or \c false otherwise
  */
-bool CAM_Application::isModuleAccessible( const QString& name ) const
+bool CAM_Application::isModuleAccessible( const QString& title ) const
 {
   bool found   = false;
   bool blocked = false;
-  int aAppsNb = SUIT_Session::session()->applications().count();
+  
+  QStringList somewhereLoaded;
+  QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
+  foreach( SUIT_Application* app, apps ) {
+    CAM_Application* camApp = dynamic_cast<CAM_Application*>( app );
+    if ( !camApp ) continue;
+    QStringList loaded;
+    camApp->modules( loaded, true );
+    foreach( QString lm, loaded ) {
+      if ( !somewhereLoaded.contains( lm ) ) somewhereLoaded << lm;
+    }
+  }
+
   for ( ModuleInfoList::const_iterator it = myInfoList.begin(); it != myInfoList.end() && !found; ++it )
   {
-    found = (*it).name == name;
-    if ( found ) blocked = (*it).isSingleton && (aAppsNb > 1);
+    found = (*it).title == title;
+    blocked = (*it).isSingleton && somewhereLoaded.contains((*it).title);
   }
   return found && !blocked;
 }
index 46d71f48ff33ab59df2c71344c6beeaf005cc0fb..119329bf041cedcd1315be521dbc4339b81e2023 100644 (file)
@@ -543,7 +543,7 @@ void LightApp_Application::createActions()
   
   QStringList modList;
   modules( modList, false );
-  
+
   if ( modList.count() > 1 )
   {
     LightApp_ModuleAction* moduleAction =
@@ -562,7 +562,7 @@ void LightApp_Application::createActions()
       
       QString modName = moduleName( *it );
 
-      if (!isModuleAccessible(modName))
+      if ( !isModuleAccessible( *it ) )
        continue;
 
       QString iconName;
@@ -2525,8 +2525,17 @@ void LightApp_Application::afterCloseDoc()
 void LightApp_Application::updateModuleActions()
 {
   QString modName;
-  if ( activeModule() )
+  if ( activeModule() ) {
     modName = activeModule()->moduleName();
+    if ( !isModuleAccessible( modName ) ) {
+      QList<SUIT_Application*> apps = SUIT_Session::session()->applications();
+      foreach( SUIT_Application* app, apps ) {
+       LightApp_Application* lapp = dynamic_cast<LightApp_Application*>( app );
+       if ( lapp && lapp != this )
+         lapp->removeModuleAction( modName );
+      }
+    }
+  }
 
   LightApp_ModuleAction* moduleAction =
     qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
@@ -2534,6 +2543,14 @@ void LightApp_Application::updateModuleActions()
     moduleAction->setActiveModule( modName );
 }
 
+void LightApp_Application::removeModuleAction( const QString& modName )
+{
+  LightApp_ModuleAction* moduleAction =
+    qobject_cast<LightApp_ModuleAction*>( action( ModulesListId ) );
+  if ( moduleAction )
+    moduleAction->removeModule( modName );
+}
+
 /*!
   Gets current windows.
   \param winMap - output current windows map.
index b36d155a41f813c1d9957893f53d62104451bb96..27d0852afb498397de19554f759a6e3907330a40 100644 (file)
@@ -230,6 +230,7 @@ protected:
   void                                updateWindows();
   void                                updateViewManagers();
   void                                updateModuleActions();
+  void                                removeModuleAction( const QString& );
 
   void                                loadDockWindowsState();
   void                                saveDockWindowsState();