Salome HOME
refs #416: to store the open state of object browser items in the binary array
[modules/gui.git] / src / SVTK / SVTK_SetRotationPointDlg.cxx
index 174a6bae0d422fdb83f3867ad3080e5656b67f97..57cbd922991b047e560ccd962405ee0e0e16a9f0 100755 (executable)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
 #include <QGroupBox>
 #include <QLabel>
 #include <QPushButton>
+#include <QMenu>
 #include <QGridLayout>
 #include <QDoubleValidator>
 #include <QCheckBox>
 
 #include <vtkCallbackCommand.h>
+#include <vtkInteractorStyle.h>
 
 /*!
   Constructor
@@ -87,12 +89,19 @@ SVTK_SetRotationPointDlg
   vbox->addWidget(myToOrigin);
   connect(myToOrigin, SIGNAL(clicked()), this, SLOT(onToOrigin()));
 
-  // Create "Select Point from View" button
-  mySelectPoint = new QPushButton(myGroupBoxSel);
-  mySelectPoint->setText(tr("LBL_SELECTPOINT"));
+  // Create "Gravity Center of Select Object" button
+  mySelectPoint = new QPushButton(tr("LBL_SELECTPOINT"));
   mySelectPoint->setCheckable(true);
+
+  QMenu* menuType = new QMenu( this );
+  mySelectActions[ menuType->addAction( tr("LBL_POINT") ) ] = NodeSelection;
+  mySelectActions[ menuType->addAction( tr("LBL_EDGE") ) ] = EdgeSelection;
+  mySelectActions[ menuType->addAction( tr("LBL_FACE") ) ] = FaceSelection;
+  mySelectActions[ menuType->addAction( tr("LBL_VOLUME") ) ] = VolumeSelection;
+  connect( menuType, SIGNAL( triggered( QAction* ) ),  this, SLOT( onSelectMenu( QAction* ) ) );
+
+  mySelectPoint->setMenu( menuType );
   vbox->addWidget(mySelectPoint);
-  connect(mySelectPoint, SIGNAL(clicked()), this, SLOT(onSelectPoint()));
 
   // Create croup box with grid layout
   myGroupBoxCoord = new QGroupBox(this);
@@ -165,7 +174,6 @@ SVTK_SetRotationPointDlg
   myEventCallbackCommand->Delete();
   myEventCallbackCommand->SetClientData(this);
   myEventCallbackCommand->SetCallback(SVTK_SetRotationPointDlg::ProcessEvents);
-  myIsObserverAdded = false;
 }
 
 /*
@@ -181,11 +189,10 @@ void
 SVTK_SetRotationPointDlg
 ::addObserver()
 {
-  if ( !myIsObserverAdded ) {
-    vtkInteractorStyle* aIStyle = myRWInteractor->GetInteractorStyle();
+  vtkInteractorStyle* aIStyle = myRWInteractor->GetInteractorStyle();
+  if( !IsObserverAdded( aIStyle ) ) {
     aIStyle->AddObserver(SVTK::BBCenterChanged, myEventCallbackCommand.GetPointer(), myPriority);
     aIStyle->AddObserver(SVTK::RotationPointChanged, myEventCallbackCommand.GetPointer(), myPriority);
-    myIsObserverAdded = true;
   }
 }
 
@@ -211,7 +218,7 @@ SVTK_SetRotationPointDlg
                 void* theCallData)
 {
   SVTK_SetRotationPointDlg* self = reinterpret_cast<SVTK_SetRotationPointDlg*>(theClientData);
-  vtkFloatingPointType* aCoord = (vtkFloatingPointType*)theCallData;
+  double* aCoord = (double*)theCallData;
   
   switch ( theEvent ) {
   case SVTK::BBCenterChanged:
@@ -239,6 +246,21 @@ SVTK_SetRotationPointDlg
   }
 }
 
+bool
+SVTK_SetRotationPointDlg
+::IsObserverAdded( vtkInteractorStyle* theInteractorStyle )
+{
+  bool isAdded = false;
+  for( int i = 0; i < myInteractorStyleList.count(); i++ )
+    if( myInteractorStyleList.at(i) == theInteractorStyle )
+      isAdded = true;
+
+  if( !isAdded )
+    myInteractorStyleList.append( theInteractorStyle );
+
+  return isAdded;
+}
+
 void 
 SVTK_SetRotationPointDlg
 ::setEnabled(QGroupBox* theGrp, const bool theState)
@@ -284,8 +306,7 @@ void
 SVTK_SetRotationPointDlg
 ::onToOrigin()
 {
-  if ( mySelectPoint->isChecked() )
-    mySelectPoint->toggle();
+  mySelectPoint->setChecked( false );
   myX->setText(QString::number(0.0));
   myY->setText(QString::number(0.0));
   myZ->setText(QString::number(0.0));
@@ -293,12 +314,10 @@ SVTK_SetRotationPointDlg
 
 void
 SVTK_SetRotationPointDlg
-::onSelectPoint()
+::onSelectMenu( QAction* theAction )
 {
-  if ( mySelectPoint->isChecked() )
-    myMainWindow->activateStartPointSelection();
-  else
-    mySelectPoint->toggle();
+  mySelectPoint->setChecked( true );
+  myMainWindow->activateStartPointSelection( mySelectActions[theAction] );
 }
 
 void
@@ -310,7 +329,7 @@ SVTK_SetRotationPointDlg
          &&
          ( myX->hasFocus() || myY->hasFocus() || myZ->hasFocus() ) )
       mySelectPoint->toggle();
-    vtkFloatingPointType aCenter[3] = {myX->text().toDouble(), 
+    double aCenter[3] = {myX->text().toDouble(), 
                                        myY->text().toDouble(), 
                                        myZ->text().toDouble()};
     myMainWindow->activateSetRotationSelected((void*)aCenter);