]> SALOME platform Git repositories - modules/gui.git/commitdiff
Salome HOME
PPGP patch: provides "closeStudy" event
authorvsv <vsv@opencascade.com>
Fri, 22 Nov 2013 12:06:21 +0000 (12:06 +0000)
committervsv <vsv@opencascade.com>
Fri, 22 Nov 2013 12:06:21 +0000 (12:06 +0000)
src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.cxx
src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_ModuleLight.h
src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.cxx
src/SALOME_PYQT/SALOME_PYQT_GUILight/SALOME_PYQT_PyModule.h

index eb9437f05ceb87a916c8f15d312d9ad53702c899..88602237702edce212cf379776796a6e31c87001 100644 (file)
@@ -162,7 +162,7 @@ bool SALOME_PYQT_ModuleLight::activateModule( SUIT_Study* study )
   \sa PyModuleHelper::deactivate()
 */
 bool SALOME_PYQT_ModuleLight::deactivateModule( SUIT_Study* study )
-{
+{  
   // call helper
   bool res = myHelper->deactivate( study );
     
@@ -170,6 +170,21 @@ bool SALOME_PYQT_ModuleLight::deactivateModule( SUIT_Study* study )
   return LightApp_Module::deactivateModule( study ) && res;
 }
 
+/*!
+  \brief Close of the module.
+
+  This function is usually used in order to close the module's 
+  specific menus and toolbars and perform other such actions
+  required when the module is closed.
+*/
+void SALOME_PYQT_ModuleLight::onModelClosed()
+{
+  // call helper
+  myHelper->modelClosed(application()->activeStudy());
+  LightApp_Module::onModelClosed();
+}
+
+
 /*!
   \brief Get the dockable windows associated with the module.
   \param winMap output map of dockable windows in form { <window_type> : <dock_area> }
index f6e7143df0f9ff0b39903b4f11cf92d2ef15c576..dff9b5963c9b04fd5676f493b0ca41220948b20f 100644 (file)
@@ -49,6 +49,7 @@ public:
   void            initialize( CAM_Application* );
   bool            activateModule( SUIT_Study* );
   bool            deactivateModule( SUIT_Study* );
+  void            onModelClosed();
   void            windows( QMap<int, int>& ) const;
   void            viewManagers( QStringList& ) const;
   void            studyActivated();
index 25120ac5e29de82acc743e04f563e4a921f9a54d..b4eba060a54045c450310f9da1e166019640ad82 100644 (file)
@@ -962,6 +962,58 @@ bool PyModuleHelper::deactivate( SUIT_Study* study )
   return true;
 }
 
+/*!
+  \brief Close of the module.
+
+  This function is usually used in order to close the module's 
+  specific menus and toolbars and perform other such actions
+  required when the module is closed.
+*/
+void PyModuleHelper::modelClosed( SUIT_Study* study )
+{
+  FuncMsg fmsg( "PyModuleHelper::modelClosed()" );
+
+  class StudyClosedReq : public PyInterp_LockRequest
+  {
+  public:
+    StudyClosedReq( PyInterp_Interp* _py_interp,
+                   PyModuleHelper*  _helper,
+                   SUIT_Study*      _study )
+      : PyInterp_LockRequest( _py_interp, 0, true ), // this request should be processed synchronously (sync == true)
+        myHelper( _helper ),
+        myStudy ( _study )
+    {}
+  protected:
+    virtual void execute()
+    {
+      myHelper->internalClosedStudy( myStudy );
+    }
+  private:
+    PyModuleHelper* myHelper;
+    SUIT_Study*     myStudy;
+  };
+
+  // post request
+  PyInterp_Dispatcher::Get()->Exec( new StudyClosedReq( myInterp, this, study ) );
+
+  // disconnect preferences changing signal
+  disconnect( myModule->getApp(), SIGNAL( preferenceChanged( const QString&, const QString&, const QString& ) ),
+              this,               SLOT(   preferenceChanged( const QString&, const QString&, const QString& ) ) );
+  
+  // disconnect the SUIT_Desktop signal windowActivated()
+  SUIT_Desktop* d = study->application()->desktop();
+  disconnect( d,     SIGNAL( windowActivated( SUIT_ViewWindow* ) ),
+             this,  SLOT( activeViewChanged( SUIT_ViewWindow* ) ) );
+
+  // deactivate menus, toolbars, etc
+  if ( myXmlHandler ) myXmlHandler->activateMenus( false );
+
+  // hide menus / toolbars
+  myModule->setMenuShown( false );
+  myModule->setToolShown( false );
+}
+
+
 /*!
   \brief Process module's preferences changing.
 
@@ -2013,6 +2065,39 @@ void PyModuleHelper::internalDeactivate( SUIT_Study* study )
   }
 }
 
+/*!
+  \brief Internal closure:
+
+  Performs the following actions:
+  - call Python module's closeStudy() method
+
+  \param theStudy parent study object
+*/
+void PyModuleHelper::internalClosedStudy( SUIT_Study* theStudy )
+{
+  FuncMsg fmsg( "--- PyModuleHelper::internalClosedStudy()" );
+
+  // Get study Id
+  // get study Id
+  LightApp_Study* aStudy = dynamic_cast<LightApp_Study*>( theStudy );
+  int aStudyId = aStudy ? aStudy->id() : 0;
+
+  // check that Python subinterpreter is initialized and Python module is imported
+  if ( !myInterp || !myPyModule ) {
+    // Error! Python subinterpreter should be initialized and module should be imported first!
+    return;
+  }
+  // then call Python module's deactivate() method
+  if ( PyObject_HasAttrString( myPyModule , (char*)"closeStudy" ) ) {
+    PyObjWrapper res( PyObject_CallMethod( myPyModule, (char*)"closeStudy", (char*)"i", aStudyId ) );
+    if( !res ) {
+      PyErr_Print();
+    }
+  }
+}
+
+
+
 /*!
   \brief Preference changing callback function.
   \internal
index f450ab89a46bccfec2505cb52f30f02bcb2cbc84..49c4296325c00077533ef462694c4d6912d80016 100644 (file)
@@ -86,6 +86,7 @@ public slots:
   void                       initialize( CAM_Application* );
   bool                       activate( SUIT_Study* study );
   bool                       deactivate( SUIT_Study* study );
+  void                       modelClosed( SUIT_Study* study );
   void                       preferencesChanged( const QString&, const QString& setting );
   void                       preferenceChanged( const QString&, const QString&, const QString& setting );
   void                       studyActivated( SUIT_Study* );
@@ -114,6 +115,7 @@ private:
   void                       internalActivate( SUIT_Study* );
   void                       internalCustomize( SUIT_Study* );
   void                       internalDeactivate( SUIT_Study* );
+  void                       internalClosedStudy( SUIT_Study* );
   void                       internalPreferencesChanged( const QString&, const QString& );
   void                       internalStudyChanged( SUIT_Study* );
   void                       internalActionActivated( int );