Salome HOME
refs #327 - Polyline is not shown during creation
[modules/hydro.git] / src / HYDROGUI / HYDROGUI_Operation.cxx
index cd2ac6849a993eed670e8b5dad3bf86dae7263c9..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>
@@ -42,7 +43,9 @@ HYDROGUI_Operation::HYDROGUI_Operation( HYDROGUI_Module* theModule )
 : LightApp_Operation(),
   myModule( theModule ),
   myPanel( 0 ),
-  myIsPrintErrorMessage( true )
+  myIsPrintErrorMessage( true ),
+  myPreviewManager( 0 ),
+  myPreviewZLayer( -1 )
 {
   connect( this, SIGNAL( helpContextModule( const QString&, const QString&,
                                             const QString& ) ),
@@ -86,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() )
   {
@@ -109,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 );