Salome HOME
Fix a bug with accessing VTK viewer's props for the detached view V9_3_BR V9_3_0 V9_3_0rc1 V9_3_0rc2
authorvsr <vsr@opencascade.com>
Thu, 4 Apr 2019 16:51:31 +0000 (19:51 +0300)
committervsr <vsr@opencascade.com>
Thu, 4 Apr 2019 16:51:31 +0000 (19:51 +0300)
src/LightApp/LightApp_Application.cxx
src/SALOME_PY/SalomePy.cxx
src/STD/STD_Application.cxx

index c084037b20ec770da1067198313e99c77f81de91..f33201e5b046166fb6557b7906f44e21a8b67ae7 100644 (file)
@@ -1510,7 +1510,8 @@ SUIT_ViewManager* LightApp_Application::getViewManager( const QString& vmType, c
       aVM = anActiveVM;
     }
 
-  if ( aVM && !aVM->getDetached() && create )
+  bool keepDetached = property("keep_detached").toBool();
+  if ( aVM && (!aVM->getDetached() || keepDetached) && create )
   {
     if ( !aVM->getActiveView() )
       {
index 535781ebf900c6a5aaffb938265a522df7f8663c..90cba2fe2d1a4af7a3ca5645a34d15862293384f 100644 (file)
@@ -147,7 +147,7 @@ enum {
   \param toCreate window find/create mode
   \return VTK window pointer or 0 if it could not be found/created
 */
-static SVTK_ViewWindow* GetVTKViewWindow( int toCreate = __FindOrCreate ) {
+static SVTK_ViewWindow* GetVTKViewWindow( int toCreate = __FindOrCreate, int toKeepDetached = 0 ) {
   SVTK_ViewWindow* aVW = 0;
   if ( SUIT_Session::session() ) {
     // get application
@@ -170,7 +170,9 @@ static SVTK_ViewWindow* GetVTKViewWindow( int toCreate = __FindOrCreate ) {
           }
         }
         else {
+          anApp->setProperty("keep_detached", toKeepDetached != 0 );
           SVTK_ViewManager* aVM = dynamic_cast<SVTK_ViewManager*>( anApp->getViewManager( "VTKViewer", toCreate == __FindOrCreate ) );
+          anApp->setProperty("keep_detached", QVariant());
           if ( aVM ) {
             aVW = dynamic_cast<SVTK_ViewWindow*>( aVM->getActiveView() );
             // VSR : When new view window is created it can be not active yet at this moment,
@@ -209,13 +211,14 @@ public:
   typedef PyObject* TResult;
   TResult myResult;
   int     myCreate;
-  TGetRendererEvent( bool toCreate )
-    : myResult( Py_None ), myCreate( toCreate ) {}
+  int     myKeepDetached;
+  TGetRendererEvent( bool toCreate, bool toKeepDetached )
+    : myResult( Py_None ), myCreate( toCreate ), myKeepDetached( toKeepDetached ) {}
   virtual void Execute()
   {
     PyTypeObject* aPyClass = ::GetPyClass( "vtkRenderer" );
     SVTK_ViewWindow* aVTKViewWindow = 
-      ::GetVTKViewWindow( myCreate ? __Create : __FindOrCreate );
+      ::GetVTKViewWindow( myCreate ? __Create : __FindOrCreate, myKeepDetached );
     if( aVTKViewWindow && aPyClass ) {
       vtkRenderer* aVTKObject = aVTKViewWindow->getRenderer();
 #if VTK_XVERSION < 50700
@@ -231,10 +234,11 @@ extern "C" SALOMEPY_EXPORT PyObject* libSalomePy_getRenderer( PyObject* self, Py
 {
   PyObject* aResult = Py_None;
   int toCreate = 0;
-  if ( !PyArg_ParseTuple( args, "|i:getRenderer", &toCreate ) )
+  int toKeepDetached = 0;
+  if ( !PyArg_ParseTuple( args, "|ii:getRenderer", &toCreate, &toKeepDetached ) )
     PyErr_Print();
   else
-    aResult = ProcessEvent( new TGetRendererEvent( toCreate ) );
+    aResult = ProcessEvent( new TGetRendererEvent( toCreate, toKeepDetached ) );
   return aResult;
 }
 
@@ -262,13 +266,14 @@ public:
   typedef PyObject* TResult;
   TResult myResult;
   int     myCreate;
-  TGetRenderWindowEvent( bool toCreate )
-    : myResult( Py_None ), myCreate( toCreate ) {}
+  int     myKeepDetached;
+  TGetRenderWindowEvent( bool toCreate, bool toKeepDetached )
+    : myResult( Py_None ), myCreate( toCreate ), myKeepDetached( toKeepDetached ) {}
   virtual void Execute()
   {
     PyTypeObject* aPyClass = ::GetPyClass( "vtkRenderWindow" );
     SVTK_ViewWindow* aVTKViewWindow = 
-      ::GetVTKViewWindow( myCreate ? __Create : __FindOrCreate );
+      ::GetVTKViewWindow( myCreate ? __Create : __FindOrCreate, myKeepDetached );
     if( aVTKViewWindow && aPyClass ) {
       vtkRenderWindow* aVTKObject = aVTKViewWindow->getRenderWindow();
 #if VTK_XVERSION < 50700
@@ -284,10 +289,11 @@ extern "C" SALOMEPY_EXPORT PyObject* libSalomePy_getRenderWindow( PyObject* self
 {
   PyObject* aResult = Py_None;
   int toCreate = 0;
-  if ( !PyArg_ParseTuple( args, "|i:getRenderWindow", &toCreate ) )
+  int toKeepDetached = 0;
+  if ( !PyArg_ParseTuple( args, "|ii:getRenderWindow", &toCreate, &toKeepDetached ) )
     PyErr_Print();
   else
-    aResult = ProcessEvent( new TGetRenderWindowEvent( toCreate ) );
+    aResult = ProcessEvent( new TGetRenderWindowEvent( toCreate, toKeepDetached ) );
   return aResult;
 }
 
@@ -315,13 +321,14 @@ public:
   typedef PyObject* TResult;
   TResult myResult;
   int     myCreate;
-  TGetRenderWindowInteractorEvent( bool toCreate )
-    : myResult( Py_None ), myCreate( toCreate ) {}
+  int     myKeepDetached;
+  TGetRenderWindowInteractorEvent( bool toCreate, bool toKeepDetached )
+    : myResult( Py_None ), myCreate( toCreate ), myKeepDetached( toKeepDetached ) {}
   virtual void Execute()
   {
     PyTypeObject* aPyClass = ::GetPyClass( "vtkRenderWindowInteractor" );
     SVTK_ViewWindow* aVTKViewWindow = 
-      ::GetVTKViewWindow( myCreate ? __Create : __FindOrCreate );
+      ::GetVTKViewWindow( myCreate ? __Create : __FindOrCreate, myKeepDetached );
     if( aVTKViewWindow && aPyClass ) {
       vtkRenderWindowInteractor* aVTKObject = aVTKViewWindow->getInteractor();
 #if VTK_XVERSION < 50700
@@ -337,10 +344,11 @@ extern "C" SALOMEPY_EXPORT PyObject* libSalomePy_getRenderWindowInteractor( PyOb
 {
   PyObject* aResult = Py_None;
   int toCreate = 0;
-  if ( !PyArg_ParseTuple( args, "|i:getRenderWindowInteractor", &toCreate ) )
+  int toKeepDetached = 0;
+  if ( !PyArg_ParseTuple( args, "|ii:getRenderWindowInteractor", &toCreate, &toKeepDetached ) )
     PyErr_Print();
   else
-    aResult = ProcessEvent( new TGetRenderWindowInteractorEvent( toCreate ) );
+    aResult = ProcessEvent( new TGetRenderWindowInteractorEvent( toCreate, toKeepDetached ) );
   return aResult;
 }
 
index c60e8e5c29daf5fd7798d00d520ce8aa87034c5c..523d571dfdad6193166f14371a423d4954128a2b 100644 (file)
@@ -777,7 +777,8 @@ SUIT_ViewManager* STD_Application::viewManager( const QString& vmType ) const
   SUIT_ViewManager* vm = 0;
   for ( QList<SUIT_ViewManager*>::const_iterator it = myViewMgrs.begin(); it != myViewMgrs.end() && !vm; ++it )
   {
-    if ( (*it)->getType() == vmType && !(*it)->getDetached())
+    bool keepDetached = property("keep_detached").toBool();
+    if ( (*it)->getType() == vmType && (!(*it)->getDetached() || keepDetached))
       vm = *it;
   }
   return vm;