Salome HOME
Drawing of zones in OCC view improved.
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_ImportImageOp.cxx
index 3ad1959d30b56bcc2ae585a643639ca30b72fcab..13fc3a7923b1513fedc9cfc0f64d2cce22f9db49 100644 (file)
@@ -308,52 +308,72 @@ bool HYDROGUI_ImportImageOp::processApply( int& theUpdateFlags,
 
 void HYDROGUI_ImportImageOp::onCreatePreview( QImage theImage )
 {
+  HYDROGUI_ImportImageDlg* aPanel = (HYDROGUI_ImportImageDlg*)inputPanel();
+
   myImage = theImage;
 
-  LightApp_Application* anApp = module()->getApp();
+  if( myPreviewPrs ) // if the image is changed by choosing another file
+  {
+    myPreviewPrs->setImage( myImage );
+    myPreviewPrs->compute();
 
-  myActiveViewManager = anApp->activeViewManager();
+    if( myPreviewViewManager )
+    {
+      if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() )
+      {
+        if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() )
+        {
+          aViewPort->onBoundingRectChanged();
+          aViewPort->fitAll();
+        }
+      }
+    }
+  }
+  else
+  {
+    LightApp_Application* anApp = module()->getApp();
 
-  myPreviewPrs = new HYDROGUI_PrsImage( myIsEdit ? myEditedObject : 0 );
-  myPreviewPrs->setImage( myImage );
-  myPreviewPrs->compute();
+    myActiveViewManager = anApp->activeViewManager();
 
-  myPreviewViewManager =
-    dynamic_cast<GraphicsView_ViewManager*>( anApp->createViewManager( GraphicsView_Viewer::Type() ) );
-  if( myPreviewViewManager )
-  {
-    connect( myPreviewViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
-             this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
+    myPreviewPrs = new HYDROGUI_PrsImage( myIsEdit ? myEditedObject : 0 );
+    myPreviewPrs->setImage( myImage );
+    myPreviewPrs->compute();
 
-    module()->setViewManagerRole( myPreviewViewManager, HYDROGUI_Module::VMR_TransformImage );
-    myPreviewViewManager->setTitle( tr( "TRANSFORM_IMAGE" ) );
-    if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() )
+    myPreviewViewManager =
+      dynamic_cast<GraphicsView_ViewManager*>( anApp->createViewManager( GraphicsView_Viewer::Type() ) );
+    if( myPreviewViewManager )
     {
-      if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() )
+      connect( myPreviewViewManager, SIGNAL( lastViewClosed( SUIT_ViewManager* ) ),
+               this, SLOT( onLastViewClosed( SUIT_ViewManager* ) ) );
+
+      module()->setViewManagerRole( myPreviewViewManager, HYDROGUI_Module::VMR_TransformImage );
+      myPreviewViewManager->setTitle( tr( "TRANSFORM_IMAGE" ) );
+      if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() )
       {
-        //aViewPort->setMousePositionEnabled( true ); //ouv: temporarily commented
+        if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() )
+        {
+          //aViewPort->setMousePositionEnabled( true ); //ouv: temporarily commented
 
-        aViewPort->addItem( myPreviewPrs );
-        aViewPort->fitAll();
+          aViewPort->addItem( myPreviewPrs );
+          aViewPort->fitAll();
 
-        myPreviewPrs->setIsTransformationPointPreview( true );
+          myPreviewPrs->setIsTransformationPointPreview( true );
+        }
+        connect( aViewer, SIGNAL( selectionChanged( GV_SelectionChangeStatus ) ),
+                 this, SLOT( onPointSelected() ) );
       }
-      connect( aViewer, SIGNAL( selectionChanged( GV_SelectionChangeStatus ) ),
-               this, SLOT( onPointSelected() ) );
     }
-  }
 
-  HYDROGUI_ImportImageDlg* aPanel = (HYDROGUI_ImportImageDlg*)inputPanel();
-
-  QString anImageName;
-  if( myIsEdit )
-  {
-    if( !myEditedObject.IsNull() )
-      anImageName = myEditedObject->GetName();
+    QString anImageName;
+    if( myIsEdit )
+    {
+      if( !myEditedObject.IsNull() )
+        anImageName = myEditedObject->GetName();
+    }
+    else
+      anImageName = HYDROGUI_Tool::GenerateObjectName( module(), "Image" );
+    aPanel->setImageName( anImageName );
   }
-  else
-    anImageName = HYDROGUI_Tool::GenerateObjectName( module(), "Image" );
-  aPanel->setImageName( anImageName );
 
   aPanel->setImageSize( myImage.size() );
 
@@ -479,6 +499,14 @@ void HYDROGUI_ImportImageOp::onPointSelected( bool theIsRefImage )
 
 void HYDROGUI_ImportImageOp::closePreview()
 {
+  // It's very strange, but without calling this method (it's quite safe) a crash is stably reproduced.
+  // Scenario: create any non-Graphics view, activate import op, click apply.
+  // Result: a few SIGSEGVs coming from processEvents(), then crash.
+  if( myPreviewViewManager )
+    if( GraphicsView_Viewer* aViewer = myPreviewViewManager->getViewer() )
+      if( GraphicsView_ViewPort* aViewPort = aViewer->getActiveViewPort() )
+        aViewPort->onBoundingRectChanged();
+
   if( myPreviewPrs )
   {
     delete myPreviewPrs;