Salome HOME
Issue #371: show external edges in different color. Also hide rigid constraint for...
[modules/shaper.git] / src / PartSet / PartSet_WidgetSketchLabel.cpp
index a766918818c43b5f06ddeae28c6d4336c019b055..159624efa7cd8309d092f426e3a7558f9427fc1b 100644 (file)
@@ -1,3 +1,5 @@
+// Copyright (C) 2014-20xx CEA/DEN, EDF R&D
+
 // File:        PartSet_WidgetSketchLabel.cpp
 // Created:     07 July 2014
 // Author:      Vitaly SMETANNIKOV
@@ -33,9 +35,9 @@
 #include <Config_PropManager.h>
 
 #include <QLabel>
+#include <QTimer>
+#include <QApplication>
 
-#define PLANE_SIZE          "200"     
-#define SKETCH_WIDTH        "4"
 
 
 PartSet_WidgetSketchLabel::PartSet_WidgetSketchLabel(QWidget* theParent,
@@ -49,6 +51,10 @@ PartSet_WidgetSketchLabel::PartSet_WidgetSketchLabel(QWidget* theParent,
   myTooltip = QString::fromStdString(theData->getProperty("tooltip"));
   myLabel->setToolTip("");
   myLabel->setIndent(5);
+
+  mySelectionTimer = new QTimer(this);
+  connect(mySelectionTimer, SIGNAL(timeout()), SLOT(setSketchingMode()));
+  mySelectionTimer->setSingleShot(true);
 }
 
 PartSet_WidgetSketchLabel::~PartSet_WidgetSketchLabel()
@@ -102,11 +108,15 @@ void PartSet_WidgetSketchLabel::onPlaneSelected()
 
         // Clear selection mode and define sketching mode
         XGUI_Displayer* aDisp = myWorkshop->displayer();
-        aDisp->removeSelectionFilter(myPlaneFilter);
-        aDisp->closeLocalContexts();
+        aDisp->removeSelectionFilter(myFaceFilter);
+        //aDisp->closeLocalContexts();
+        emit planeSelected(plane());
         setSketchingMode();
+
+        // Update sketcher actions
         XGUI_ActionsMgr* anActMgr = myWorkshop->actionsMgr();
         anActMgr->update();
+        myWorkshop->viewer()->update();
       }
     }
   }
@@ -119,24 +129,26 @@ std::shared_ptr<GeomAPI_Pln> PartSet_WidgetSketchLabel::plane() const
 
 }
 
-void PartSet_WidgetSketchLabel::activate()
+void PartSet_WidgetSketchLabel::activateCustom()
 {
   std::shared_ptr<GeomAPI_Pln> aPlane = plane();
   if (aPlane) {
-    setSketchingMode();
+    //setSketchingMode();
+    // In order to avoid Opening/Closing of context too often
+    mySelectionTimer->start(20);
   } else {
     // We have to select a plane before any operation
     showPreviewPlanes();
 
     XGUI_Displayer* aDisp = myWorkshop->displayer();
-    aDisp->openLocalContext();
-    aDisp->activateObjectsOutOfContext(QIntList());
-    if (myPlaneFilter.IsNull())
-      myPlaneFilter = new StdSelect_FaceFilter(StdSelect_Plane);
-    aDisp->addSelectionFilter(myPlaneFilter);
+    //aDisp->openLocalContext();
+    //aDisp->activateObjects(QIntList());
+    if (myFaceFilter.IsNull())
+      myFaceFilter = new StdSelect_FaceFilter(StdSelect_Plane);
+    aDisp->addSelectionFilter(myFaceFilter);
     QIntList aModes;
     aModes << TopAbs_FACE;
-    aDisp->setSelectionModes(aModes);
+    aDisp->activateObjects(aModes);
 
     myLabel->setText(myText);
     myLabel->setToolTip(myTooltip);
@@ -148,11 +160,12 @@ void PartSet_WidgetSketchLabel::activate()
 
 void PartSet_WidgetSketchLabel::deactivate()
 {
-
+  // Do not set selection mode if the widget was activated for a small moment 
+  mySelectionTimer->stop();
   XGUI_Displayer* aDisp = myWorkshop->displayer();
-  aDisp->removeSelectionFilter(myPlaneFilter);
+  aDisp->removeSelectionFilter(myFaceFilter);
   //aDisp->removeSelectionFilter(mySketchFilter);
-  aDisp->closeLocalContexts();
+  //aDisp->closeLocalContexts();
   erasePreviewPlanes();
 }
 
@@ -199,7 +212,7 @@ AISObjectPtr PartSet_WidgetSketchLabel::createPreviewPlane(std::shared_ptr<GeomA
                                                            std::shared_ptr<GeomAPI_Dir> theNorm, 
                                                            const int theRGB[3])
 {
-  double aSize = Config_PropManager::integer("Sketch planes", "Size of planes", PLANE_SIZE);
+  double aSize = Config_PropManager::integer("Sketch planes", "planes_size", PLANE_SIZE);
   std::shared_ptr<GeomAPI_Shape> aFace = GeomAlgoAPI_FaceBuilder::square(theOrigin, theNorm, aSize);
   AISObjectPtr aAIS = AISObjectPtr(new GeomAPI_AISObject());
   aAIS->createShape(aFace);
@@ -260,25 +273,16 @@ std::shared_ptr<GeomAPI_Dir> PartSet_WidgetSketchLabel::setSketchPlane(const Top
 void PartSet_WidgetSketchLabel::setSketchingMode()
 {
   XGUI_Displayer* aDisp = myWorkshop->displayer();
-  QIntList aModes;
   // Clear standard selection modes if they are defined
-  aDisp->setSelectionModes(aModes);
-  aDisp->openLocalContext();
-
-  // Set filter
-  std::shared_ptr<GeomAPI_Pln> aPlane = plane();
-  double aA, aB, aC, aD;
-  aPlane->coefficients(aA, aB, aC, aD);
-  gp_Pln aPln(aA, aB, aC, aD);
-  // No selection of external objects
-  //mySketchFilter = new ModuleBase_ShapeInPlaneFilter(aPln);
-  //aDisp->addSelectionFilter(mySketchFilter);
+  //aDisp->activateObjects(aModes);
+  //aDisp->openLocalContext();
 
   // Get default selection modes
+  QIntList aModes;
   aModes.append(AIS_DSM_Text);
   aModes.append(AIS_DSM_Line);
   aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum) TopAbs_VERTEX));
   aModes.append(AIS_Shape::SelectionMode((TopAbs_ShapeEnum) TopAbs_EDGE));
 
-  aDisp->activateObjectsOutOfContext(aModes);
+  aDisp->activateObjects(aModes);
 }