]> SALOME platform Git repositories - modules/hydro.git/commitdiff
Salome HOME
Support #101: it is possible to start operation Obstacle - Create Box during creation...
authormzn <mzn@opencascade.com>
Thu, 19 Dec 2013 07:02:59 +0000 (07:02 +0000)
committermzn <mzn@opencascade.com>
Thu, 19 Dec 2013 07:02:59 +0000 (07:02 +0000)
Fix: Activate GEOM operation inside the HYDRO operation.

src/HYDROGUI/HYDROGUI_GeomObjectDlg.cxx
src/HYDROGUI/HYDROGUI_ImportGeomObjectOp.cxx
src/HYDROGUI/HYDROGUI_ImportGeomObjectOp.h
src/HYDROGUI/HYDROGUI_Module.cxx
src/HYDROGUI/HYDROGUI_Module.h
src/HYDROGUI/HYDROGUI_Operation.cxx
src/HYDROGUI/HYDROGUI_Operations.cxx
src/HYDROGUI/HYDROGUI_Operations.h
src/HYDROGUI/resources/HYDROGUI_msg_en.ts

index f3275eb3d26b6bfc490a3b2bd91ab75543535d56..aec19adadb9a53638ed26edc34fb14c6e977a8f9 100644 (file)
@@ -44,7 +44,7 @@ HYDROGUI_GeomObjectDlg::HYDROGUI_GeomObjectDlg( HYDROGUI_Module* theModule, cons
                                                 const bool theIsToEnableFileSelection )
 : HYDROGUI_InputPanel( theModule, theTitle ),
   myFileSelectionEnabled( theIsToEnableFileSelection ),
-  myDefaultName( theObjectTypeName )
+  myDefaultName( "" )
 {
   // Get resource manager
   SUIT_ResourceMgr* aResMgr = SUIT_Session::session()->resourceMgr();
index 344f8cad83345a0d3efadd30b5214e1418ac8919..c3d9488f872559c42382f29a59116dbb60f7d20b 100644 (file)
 #include <LightApp_Application.h>
 #include <LightApp_UpdateFlags.h>
 
+#include <SUIT_Desktop.h>
+
+#include <QDialog>
+
 HYDROGUI_ImportGeomObjectOp::HYDROGUI_ImportGeomObjectOp( HYDROGUI_Module* theModule,  
                                                           const int theOpType, 
-                                                          const bool theIsToShowPanel )
+                                                          const int theGEOMOp )
 : HYDROGUI_Operation( theModule ),
-  myOpType ( theOpType ),
-  myIsToShowPanel ( theIsToShowPanel )
+  myOpType( theOpType ),
+  myGEOMOp( theGEOMOp ),
+  myGEOMOpName( "" ),
+  myIsToShowPanel( true )
 {
   if ( myOpType == ImportSelectedAsPolyline ) {
     setName( tr( "IMPORT_GEOM_OBJECT_AS_POLYLINE" ) );
@@ -60,13 +66,10 @@ HYDROGUI_ImportGeomObjectOp::~HYDROGUI_ImportGeomObjectOp()
 
 void HYDROGUI_ImportGeomObjectOp::startOperation()
 {
-  HYDROGUI_Operation::startOperation();
-
   // Get GEOM objects to import
   myGeomObjects.clear();
-  if ( myOpType == ImportCreatedAsObstacle ) {
-    myGeomObjects = module()->GetGeomObjectsToImport();
-  } else if ( myOpType == ImportSelectedAsObstacle ) {
+
+  if ( myOpType == ImportSelectedAsObstacle ) {
     myGeomObjects = 
       HYDROGUI_Tool::GetSelectedGeomObjects( module(), getObstacleTypes() );
   } else if ( myOpType == ImportSelectedAsPolyline ) {
@@ -74,9 +77,14 @@ void HYDROGUI_ImportGeomObjectOp::startOperation()
       HYDROGUI_Tool::GetSelectedGeomObjects( module(), getPolylineTypes() );
   }
 
+  // Do not show the panel if more than one GEOM objects are selected
+  myIsToShowPanel = myIsToShowPanel && ( myGeomObjects.count() <= 1 );
+
+  HYDROGUI_Operation::startOperation();
+
   HYDROGUI_GeomObjectDlg* aPanel = 0;
 
-  if ( myGeomObjects.count() == 1 ) {
+  if ( myIsToShowPanel ) {
     // Get panel
     aPanel = ::qobject_cast<HYDROGUI_GeomObjectDlg*>( inputPanel() );
 
@@ -85,15 +93,7 @@ void HYDROGUI_ImportGeomObjectOp::startOperation()
       aPanel->reset();
 
       // Set default name
-      SalomeApp_Study* aStudy = 
-        dynamic_cast<SalomeApp_Study*>( module()->getApp()->activeStudy() );
-      if ( aStudy ) {
-        QString anEntry = myGeomObjects.first();
-        _PTR(SObject) aSObject( aStudy->studyDS()->FindObjectID( qPrintable(anEntry) ) );
-        if ( aSObject ) {
-          aPanel->setDefaultName( QString::fromStdString(aSObject->GetName()) );
-        }
-      }
+      updateDefaultName();
 
       // Pass the existing object names to the panel
       QStringList anExistingNames;
@@ -111,15 +111,35 @@ void HYDROGUI_ImportGeomObjectOp::startOperation()
   if ( !aPanel ) {
     onApply();
   }
+
+  // Activate GEOM module operation in case of the corresponding operation type
+  if ( myOpType == ImportCreatedAsObstacle && myGEOMOp > 0 ) {
+    LightApp_Application* anApp = module()->getApp();
+    if ( anApp ) {
+      connect( anApp, SIGNAL( operationFinished( const QString&, const QString&, const QStringList& ) ), 
+        this, SLOT( onExternalOperationFinished( const QString&, const QString&, const QStringList& ) ) );
+
+      module()->getApp()->activateOperation( "Geometry", myGEOMOp );
+    }
+  }
 }
 
 void HYDROGUI_ImportGeomObjectOp::abortOperation()
 {
+  LightApp_Application* anApp = module()->getApp();
+  if ( anApp ) {
+    anApp->disconnect( this );
+  }
+
+  closeExternalOperationDlg();
+
   HYDROGUI_Operation::abortOperation();
 }
 
 void HYDROGUI_ImportGeomObjectOp::commitOperation()
 {
+  closeExternalOperationDlg();
+
   HYDROGUI_Operation::commitOperation();
 }
 
@@ -133,6 +153,12 @@ bool HYDROGUI_ImportGeomObjectOp::processApply( int& theUpdateFlags,
     return false;
   }
 
+  // Check that GEOM objects list is not empty
+  if ( myGeomObjects.isEmpty() ) {
+    theErrorMsg = tr( "NO_GEOM_OBJECT_TO_IMPORT" );
+    return false;
+  }
+
   QString anObjectName;
   Handle(HYDROData_Entity) anObjectToEdit;  
   ObjectKind anObjectKind = 
@@ -244,6 +270,71 @@ HYDROGUI_InputPanel* HYDROGUI_ImportGeomObjectOp::createInputPanel() const
   return aPanel;
 }
 
+void HYDROGUI_ImportGeomObjectOp::updateDefaultName()
+{
+  // Get panel
+  HYDROGUI_GeomObjectDlg* aPanel = ::qobject_cast<HYDROGUI_GeomObjectDlg*>( inputPanel() );
+  if ( !aPanel ) {
+    return;
+  }
+
+  // Set the current GEOM object name to the panel
+  if ( myGeomObjects.count() == 1 ) {
+    SalomeApp_Study* aStudy = 
+      dynamic_cast<SalomeApp_Study*>( module()->getApp()->activeStudy() );
+    if ( aStudy ) {
+      QString anEntry = myGeomObjects.first();
+      _PTR(SObject) aSObject( aStudy->studyDS()->FindObjectID( qPrintable(anEntry) ) );
+      if ( aSObject ) {
+        aPanel->setDefaultName( QString::fromStdString(aSObject->GetName()) );
+      }
+    }
+  }
+}
+
+/**
+ * Called when the operation perfomed by another module is finished.
+ * \param theModuleName the name of the module which perfomed the operation
+ * \param theOperationName the operation name
+ * \param theEntryList the list of the created objects entries
+ */
+void HYDROGUI_ImportGeomObjectOp::onExternalOperationFinished( 
+  const QString& theModuleName, const QString& theOperationName,
+  const QStringList& theEntryList )
+{
+  // Process "Geometry" module operations with non-empty list of created objects only
+  if ( theModuleName != "Geometry" || theEntryList.isEmpty() ) {
+    return;
+  }
+  
+  // Store the operation name
+  myGEOMOpName = theOperationName;
+
+  // Store the geom objects entries list
+  myGeomObjects = theEntryList;
+
+  // Update the default name of the HYDRO object
+  updateDefaultName();
+}
+
+void HYDROGUI_ImportGeomObjectOp::closeExternalOperationDlg()
+{
+  if ( myGEOMOpName.isEmpty() ) {
+    return;
+  }
+
+  SUIT_Desktop* aDesktop = module()->getApp()->desktop();
+  if ( aDesktop ) {
+    QList<QDialog*> aDialogs = aDesktop->findChildren<QDialog*>();
+    foreach ( QDialog* aDlg, aDialogs ) {
+      if ( typeid(*aDlg).name() == myGEOMOpName ) {
+        aDlg->close();
+        break;
+      }
+    }
+  }
+}
+
 QList<GEOM::shape_type> HYDROGUI_ImportGeomObjectOp::getObstacleTypes()
 {
   QList<GEOM::shape_type> aTypes;
index 4b18258499033bb00d8cf399c261eeea88f63130..b8830f9fa155d6a72c2b62d6420a15dc296a73b1 100644 (file)
@@ -45,7 +45,7 @@ public:
 public:
   HYDROGUI_ImportGeomObjectOp( HYDROGUI_Module* theModule,
                                const int theOpType,
-                               const bool theIsToShowPanel = true );
+                               const int theGEOMOp = -1 );
   virtual ~HYDROGUI_ImportGeomObjectOp();
 
   static QList<GEOM::shape_type> getObstacleTypes();
@@ -60,10 +60,20 @@ protected:
 
   virtual bool               processApply( int& theUpdateFlags, QString& theErrorMsg );
 
+protected slots:
+  void                       onExternalOperationFinished( const QString&, const QString&, 
+                                                          const QStringList& );
+
+private:
+  void updateDefaultName();
+  void closeExternalOperationDlg();
+
 private:
   QStringList myGeomObjects; ///< the list of GEOM object entries
   bool myIsToShowPanel; ///< indicates if obstacle panel to be shown
   int  myOpType; ///< operation type (to import selected GEOM objects or the objects just created by GEOM )
+  int  myGEOMOp; ///< GEOM module operation to be called to create GEOM object for import
+  QString myGEOMOpName; ///< the name of the called GEOM module operation
 };
 
 #endif
\ No newline at end of file
index 6091e92e95aa640e45c657788f075d6b79e091f3..909dbdb5dac4b028bcc626474f9ded4141fc9bd3 100644 (file)
@@ -191,9 +191,6 @@ bool HYDROGUI_Module::activateModule( SUIT_Study* theStudy )
 
   updateCommandsStatus();
 
-  connect( anApp, SIGNAL( operationFinished( const QString&, const QString&, const QStringList& ) ), 
-           this, SLOT( onExternalOperationFinished( const QString&, const QString&, const QStringList& ) ) );
-
   HYDROGUI_Tool::setOCCActionShown( this, OCCViewer_ViewWindow::MaximizedId, false );
 
   ViewManagerList anOCCViewManagers;
@@ -243,9 +240,6 @@ bool HYDROGUI_Module::deactivateModule( SUIT_Study* theStudy )
 
   getApp()->setEditEnabled( true ); // show SalomeApp copy/paste actions
 
-  disconnect( getApp(), SIGNAL( operationFinished( const QString&, const QString&, const QStringList& ) ), 
-              this, SLOT( onExternalOperationFinished( const QString&, const QString&, const QStringList& ) ) );
-
   HYDROGUI_Tool::setOCCActionShown( this, OCCViewer_ViewWindow::MaximizedId, true );
 
   return LightApp_Module::deactivateModule( theStudy );
index dc1e7cbc24122262c43fe051787cf3e3f11290b4..3f46027b1b7493f657eb959c60227496a015dce8 100644 (file)
@@ -148,8 +148,6 @@ public:
    */
   void                            updateVTKZRange( const int theViewId, double theRange[] );
 
-  QStringList                     GetGeomObjectsToImport();
-
   /**
    * Returns true if the object with the given entry can be renamed.
    * @param theEntry the object entry
@@ -189,9 +187,6 @@ protected slots:
   virtual void                    onViewCreated( SUIT_ViewWindow* );
 
   void                            onViewPortMouseEvent( QGraphicsSceneMouseEvent* );
-  
-  void                            onExternalOperationFinished( const QString&, const QString&, 
-                                                               const QStringList& );
 
   void                            onMouseMove( SUIT_ViewWindow*, QMouseEvent* );
 
index ed01027c546ce1e6543d16844e25fa74c75dfb84..90a5e308ee3486345c6d5394f0eeb184ae8b0e5e 100644 (file)
@@ -213,7 +213,12 @@ void HYDROGUI_Operation::onApply()
       aMsg.prepend( anErrorMsg + "\n" );
     SUIT_MessageBox::critical( module()->getApp()->desktop(),
                                tr( "INSUFFICIENT_INPUT_DATA" ),
-                               aMsg ); 
+                               aMsg );
+
+    // If the operation has no input panel - do abort
+    if ( !inputPanel() ) {
+      abort();
+    }
   }
 }
 
index d3a2d04ffb829f096f0e8f862ba440e795eb0983..277eee95d06e1fc403a649666490875d94696bb6 100644 (file)
@@ -456,9 +456,6 @@ LightApp_Operation* HYDROGUI_Module::createOperation( const int theId ) const
   case ImportObstacleFromFileId:
     anOp = new HYDROGUI_ImportObstacleFromFileOp( aModule );
     break;
-  case ImportCreatedPrimitiveId:
-    anOp = new HYDROGUI_ImportGeomObjectOp( aModule, HYDROGUI_ImportGeomObjectOp::ImportCreatedAsObstacle );
-    break;
   case ImportGeomObjectAsObstacleId:
     anOp = new HYDROGUI_ImportGeomObjectOp( aModule, HYDROGUI_ImportGeomObjectOp::ImportSelectedAsObstacle );
     break;
@@ -466,10 +463,12 @@ LightApp_Operation* HYDROGUI_Module::createOperation( const int theId ) const
     anOp = new HYDROGUI_ImportGeomObjectOp( aModule, HYDROGUI_ImportGeomObjectOp::ImportSelectedAsPolyline );
     break;
   case CreateBoxId:
-    application()->activateOperation( "Geometry", GEOMOp::OpBox );
+    anOp = new HYDROGUI_ImportGeomObjectOp( aModule, 
+      HYDROGUI_ImportGeomObjectOp::ImportCreatedAsObstacle, GEOMOp::OpBox );
     break;
   case CreateCylinderId:
-    application()->activateOperation( "Geometry", GEOMOp::OpCylinder );
+    anOp = new HYDROGUI_ImportGeomObjectOp( aModule, 
+      HYDROGUI_ImportGeomObjectOp::ImportCreatedAsObstacle, GEOMOp::OpCylinder );
     break;
   case DeleteId:
     anOp = new HYDROGUI_DeleteOp( aModule );
@@ -502,35 +501,6 @@ bool HYDROGUI_Module::reusableOperation( const int id )
   return LightApp_Module::reusableOperation( id );
 }
 
-/**
- * Called when the operation perfomed by another module is finished.
- * \param theModuleName the name of the module which perfomed the operation
- * \param theOperationName the operation name
- * \param theEntryList the list of the created objects entries
- */
-void HYDROGUI_Module::onExternalOperationFinished( const QString& theModuleName,
-                                                   const QString& theOperationName,
-                                                   const QStringList& theEntryList )
-{
-  // Process "Geometry" module operations with non-empty list of created objects only
-  if ( theModuleName != "Geometry" || theEntryList.isEmpty() ) {
-    return;
-  }
-  
-  // Start import GEOM object operation
-  myGeomObjectsToImport = theEntryList;
-  startOperation( ImportCreatedPrimitiveId );
-  myGeomObjectsToImport.clear();
-}
-
-/**
- * Returns the list of entries of GEOM objects to be imported.
- */
-QStringList HYDROGUI_Module::GetGeomObjectsToImport()
-{
-  return myGeomObjectsToImport;
-}
-
 /**
  * Returns true if the object with the given entry can be renamed.
  * @param theEntry the object entry
index 7184340a31d4637b91d1e8a1c193bb41fff52958..5528cbacac8261ecc0bcae086b116494ffc7d3ec 100644 (file)
@@ -87,7 +87,6 @@ enum OperationId
   ImportObstacleFromFileId,
   ImportGeomObjectAsObstacleId,
   ImportGeomObjectAsPolylineId,
-  ImportCreatedPrimitiveId,
   CreateBoxId,
   CreateCylinderId,
 
index b0e13dd5a40720f464c7c8c11ac701bade557695..e2cadb8e5aa5ce16bdfb1d915214ef7a0b938f14 100644 (file)
@@ -1464,6 +1464,10 @@ file cannot be correctly imported for a Bathymetry definition.</translation>
       <source>IMPORT_GEOM_OBJECT_AS_POLYLINE</source>
       <translation>Import GEOM object as polyline</translation>
     </message>
+    <message>
+      <source>NO_GEOM_OBJECT_TO_IMPORT</source>
+      <translation>No GEOM object(s) to import.</translation>
+    </message>
   </context>
 
   <context>