Salome HOME
refs #327 - Polyline is not shown during creation
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Operation.cxx
index ed01027c546ce1e6543d16844e25fa74c75dfb84..8b397f151c77e5938f4e07fef8cb5c800ed7e8b0 100644 (file)
@@ -25,6 +25,7 @@
 #include "HYDROGUI_InputPanel.h"
 #include "HYDROGUI_Module.h"
 #include "HYDROGUI_Tool.h"
+#include "HYDROGUI_OCCDisplayer.h"
 
 #include <HYDROData_Document.h>
 #include <HYDROData_Iterator.h>
 HYDROGUI_Operation::HYDROGUI_Operation( HYDROGUI_Module* theModule )
 : LightApp_Operation(),
   myModule( theModule ),
-  myPanel( 0 )
+  myPanel( 0 ),
+  myIsPrintErrorMessage( true ),
+  myPreviewManager( 0 ),
+  myPreviewZLayer( -1 )
 {
   connect( this, SIGNAL( helpContextModule( const QString&, const QString&,
                                             const QString& ) ),
@@ -85,9 +89,51 @@ HYDROGUI_Module* HYDROGUI_Operation::module() const
   return myModule;
 }
 
+/**
+  * Returns Z layer of the operation preview.
+  \ returns a layer position
+ */
+int HYDROGUI_Operation::getPreviewZLayer() const
+{
+  return myPreviewZLayer;
+}
+
+/**
+ * Set Z layer for the operation preview.
+ \param theLayer a layer position
+ */
+void HYDROGUI_Operation::setPreviewZLayer( int theLayer )
+{
+  if ( theLayer != myPreviewZLayer )
+    myPreviewZLayer = theLayer;
+}
+
+/**
+ * Return the operation preview manager
+ */
+OCCViewer_ViewManager* HYDROGUI_Operation::getPreviewManager()
+{
+  return myPreviewManager;
+}
+
+/**
+ * Set the preview manager
+ */
+void HYDROGUI_Operation::setPreviewManager( OCCViewer_ViewManager* theManager )
+{
+  if ( !theManager && myPreviewManager )
+    module()->getOCCDisplayer()->RemoveZLayer( myPreviewManager, getPreviewZLayer() );
+
+  myPreviewManager = theManager;
+
+  if ( myPreviewManager )
+    setPreviewZLayer( module()->getOCCDisplayer()->AddTopZLayer( myPreviewManager ) );
+}
+
 void HYDROGUI_Operation::startOperation()
 {
   LightApp_Operation::startOperation();
+  myModule->getActiveOperations().push( this );
 
   if( inputPanel() )
   {
@@ -108,6 +154,34 @@ void HYDROGUI_Operation::commitOperation()
   closeInputPanel();
 }
 
+void HYDROGUI_Operation::stopOperation()
+{
+  LightApp_Operation::stopOperation();
+
+  // pop the operation from the cached map of active operations
+  QStack<HYDROGUI_Operation*>& anOperations = myModule->getActiveOperations();
+  if ( anOperations.top() == this )
+  {
+    anOperations.pop();
+  }
+  else {
+    // find in the stack the current operation and remove it from the stack
+    QVectorIterator<HYDROGUI_Operation*> aVIt( anOperations );
+    aVIt.toBack();
+    aVIt.previous(); // skip the top show/hide operation
+    while ( aVIt.hasPrevious() )
+    {
+      HYDROGUI_Operation* anOp = aVIt.previous();
+      if ( anOp == this )
+        anOperations.remove( anOperations.lastIndexOf( anOp ) );
+    }
+  }
+
+  // removes the Z layer, created for the operation preview
+  if ( myPreviewManager && getPreviewZLayer() >= 0 )
+    module()->getOCCDisplayer()->RemoveZLayer( myPreviewManager, getPreviewZLayer() );
+}
+
 void HYDROGUI_Operation::setDialogActive( const bool active )
 {
   LightApp_Operation::setDialogActive( active );
@@ -207,14 +281,38 @@ void HYDROGUI_Operation::onApply()
   }
   else
   {
-    abortDocOperation();
+    // Abort document opeartion only if requested
+    if ( isToAbortOnApply() )
+      abortDocOperation();
+
+    printErrorMessage( anErrorMsg );
+    // If the operation has no input panel - do abort
+    if ( !inputPanel() ) {
+      abort();
+    }
+  }
+}
+
+void HYDROGUI_Operation::setPrintErrorMessage( const bool theIsPrint )
+{
+  myIsPrintErrorMessage = theIsPrint;
+}
+
+void HYDROGUI_Operation::printErrorMessage( const QString& theErrorMsg )
+{
+  if ( myIsPrintErrorMessage )
+  {
     QString aMsg = tr( "INPUT_VALID_DATA" );
-    if( !anErrorMsg.isEmpty() )
-      aMsg.prepend( anErrorMsg + "\n" );
+    if( !theErrorMsg.isEmpty() )
+      aMsg.prepend( theErrorMsg + "\n" );
     SUIT_MessageBox::critical( module()->getApp()->desktop(),
                                tr( "INSUFFICIENT_INPUT_DATA" ),
-                               aMsg ); 
+                               aMsg );
+
   }
+  
+  myIsPrintErrorMessage = true;
 }
 
 void HYDROGUI_Operation::onCancel()