0022048: Visualization, AIS_InteractiveContext - single object selection should alway...
authorkgv <kgv@opencascade.com>
Thu, 7 Sep 2017 15:29:13 +0000 (18:29 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 22 Sep 2017 08:51:38 +0000 (11:51 +0300)
AIS_InteractiveContext::Select() now clears multiple selection when selecting a single object.

src/AIS/AIS_InteractiveContext_1.cxx
src/AIS/AIS_LocalContext.hxx
src/AIS/AIS_LocalContext.lxx
src/ViewerTest/ViewerTest_EventManager.cxx
tests/bugs/vis/bug22048 [new file with mode: 0644]

index a164344..1e7ac28 100644 (file)
@@ -564,7 +564,9 @@ AIS_StatusOfPick AIS_InteractiveContext::Select (const Standard_Boolean toUpdate
   clearDynamicHighlight();
   if (myWasLastMain && !myLastinMain.IsNull())
   {
-    if (!myLastinMain->IsSelected() || myLastinMain->IsForcedHilight())
+    if (!myLastinMain->IsSelected()
+      || myLastinMain->IsForcedHilight()
+      || NbSelected() > 1)
     {
       SetSelected (myLastinMain, Standard_False);
       if(toUpdateViewer)
@@ -1431,13 +1433,11 @@ void AIS_InteractiveContext::EntityOwners(Handle(SelectMgr_IndexedMapOfOwner)& t
 //=======================================================================
 Standard_Integer AIS_InteractiveContext::NbSelected()
 {
-  Standard_Integer aNbSelected = 0;
-  for (InitSelected(); MoreSelected(); NextSelected())
+  if (HasOpenedContext())
   {
-    aNbSelected++;
+    return myLocalContexts (myCurLocalIndex)->Selection()->Extent();
   }
-
-  return aNbSelected;
+  return mySelection->Extent();
 }
 
 //=======================================================================
index 445856e..0a9af0b 100644 (file)
@@ -91,8 +91,8 @@ public:
     Standard_Boolean AcceptErase() const;
   
   Standard_EXPORT void SetContext (const Handle(AIS_InteractiveContext)& aCtx);
-  
-    const Handle(AIS_Selection) Selection() const;
+
+  const Handle(AIS_Selection)& Selection() const { return mySelection; }
   
   Standard_EXPORT void Terminate (const Standard_Boolean updateviewer = Standard_True);
   
index e09769e..a217bef 100644 (file)
@@ -18,9 +18,6 @@
 
 #include <SelectMgr_OrFilter.hxx>
 
-inline const Handle(AIS_Selection) AIS_LocalContext::Selection() const 
-{return mySelection;}
-
 inline void AIS_LocalContext::SetAutomaticHilight(const Standard_Boolean aStatus)
 {myAutoHilight = aStatus;}
 
index 2197d60..661a078 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
+#include <ViewerTest_EventManager.hxx>
 
 #include <AIS_InteractiveContext.hxx>
 #include <Aspect_Grid.hxx>
 #include <Standard_Type.hxx>
 #include <V3d_View.hxx>
-#include <ViewerTest_EventManager.hxx>
 
 IMPLEMENT_STANDARD_RTTIEXT(ViewerTest_EventManager,Standard_Transient)
 
@@ -88,40 +88,31 @@ void ViewerTest_EventManager::Select (const Standard_Integer theXPressed,
                                       const Standard_Integer theYMotion,
                                       const Standard_Boolean theIsAutoAllowOverlap)
 {
-  #define IS_FULL_INCLUSION Standard_True
   if (myView.IsNull()
+   || myCtx.IsNull()
    || Abs (theXPressed - theXMotion) < 2
    || Abs (theYPressed - theYMotion) < 2)
   {
     return;
   }
-  else if (!myCtx.IsNull())
+
+  if (theIsAutoAllowOverlap)
   {
-    if (theIsAutoAllowOverlap)
-    {
-      if (theYPressed == Min (theYPressed, theYMotion))
-      {
-        myCtx->MainSelector()->AllowOverlapDetection (Standard_False);
-      }
-      else
-      {
-        myCtx->MainSelector()->AllowOverlapDetection (Standard_True);
-      }
-    }
-    myCtx->Select (Min (theXPressed, theXMotion),
-                   Min (theYPressed, theYMotion),
-                   Max (theXPressed, theXMotion),
-                   Max (theYPressed, theYMotion),
-                   myView,
-                   Standard_False);
-
-    // to restore default state of viewer selector
-    if (theIsAutoAllowOverlap)
-    {
-      myCtx->MainSelector()->AllowOverlapDetection (Standard_False);
-    }
+    const Standard_Boolean toAllowOverlap = theYPressed != Min (theYPressed, theYMotion);
+    myCtx->MainSelector()->AllowOverlapDetection (toAllowOverlap);
+  }
+  myCtx->Select (Min (theXPressed, theXMotion),
+                 Min (theYPressed, theYMotion),
+                 Max (theXPressed, theXMotion),
+                 Max (theYPressed, theYMotion),
+                 myView,
+                 Standard_False);
+
+  // to restore default state of viewer selector
+  if (theIsAutoAllowOverlap)
+  {
+    myCtx->MainSelector()->AllowOverlapDetection (Standard_False);
   }
-
   myView->Redraw();
 }
 
@@ -137,36 +128,29 @@ void ViewerTest_EventManager::ShiftSelect (const Standard_Integer theXPressed,
                                            const Standard_Boolean theIsAutoAllowOverlap)
 {
   if (myView.IsNull()
+   || myCtx.IsNull()
    || Abs (theXPressed - theXMotion) < 2
    || Abs (theYPressed - theYMotion) < 2)
   {
     return;
   }
-  else if (!myCtx.IsNull())
+
+  if (theIsAutoAllowOverlap)
   {
-    if (theIsAutoAllowOverlap)
-    {
-      if (theYPressed == Min (theYPressed, theYMotion))
-      {
-        myCtx->MainSelector()->AllowOverlapDetection (Standard_False);
-      }
-      else
-      {
-        myCtx->MainSelector()->AllowOverlapDetection (Standard_True);
-      }
-    }
-    myCtx->ShiftSelect (Min (theXPressed, theXMotion),
-                        Min (theYPressed, theYMotion),
-                        Max (theXPressed, theXMotion),
-                        Max (theYPressed, theYMotion),
-                        myView,
-                        Standard_False);
-
-    // to restore default state of viewer selector
-    if (theIsAutoAllowOverlap)
-    {
-      myCtx->MainSelector()->AllowOverlapDetection (Standard_False);
-    }
+    const Standard_Boolean toAllowOverlap = theYPressed != Min (theYPressed, theYMotion);
+    myCtx->MainSelector()->AllowOverlapDetection (toAllowOverlap);
+  }
+  myCtx->ShiftSelect (Min (theXPressed, theXMotion),
+                      Min (theYPressed, theYMotion),
+                      Max (theXPressed, theXMotion),
+                      Max (theYPressed, theYMotion),
+                      myView,
+                      Standard_False);
+
+  // to restore default state of viewer selector
+  if (theIsAutoAllowOverlap)
+  {
+    myCtx->MainSelector()->AllowOverlapDetection (Standard_False);
   }
   myView->Redraw();
 }
@@ -178,15 +162,13 @@ void ViewerTest_EventManager::ShiftSelect (const Standard_Integer theXPressed,
 
 void ViewerTest_EventManager::Select()
 {
-  if (myView.IsNull())
+  if (myView.IsNull()
+   || myCtx.IsNull())
   {
     return;
   }
-  else if (!myCtx.IsNull())
-  {
-    myCtx->Select (Standard_False);
-  }
 
+  myCtx->Select (Standard_False);
   myView->Redraw();
 }
 
@@ -197,15 +179,13 @@ void ViewerTest_EventManager::Select()
 
 void ViewerTest_EventManager::ShiftSelect()
 {
-  if (myView.IsNull())
+  if (myView.IsNull()
+   || myCtx.IsNull())
   {
     return;
   }
-  else if (!myCtx.IsNull())
-  {
-    myCtx->ShiftSelect (Standard_False);
-  }
 
+  myCtx->ShiftSelect (Standard_False);
   myView->Redraw();
 }
 
@@ -216,15 +196,13 @@ void ViewerTest_EventManager::ShiftSelect()
 
 void ViewerTest_EventManager::Select (const TColgp_Array1OfPnt2d& thePolyline)
 {
-  if (myView.IsNull())
+  if (myView.IsNull()
+   || myCtx.IsNull())
   {
     return;
   }
-  else if (!myCtx.IsNull())
-  {
-    myCtx->Select (thePolyline, myView, Standard_False);
-  }
 
+  myCtx->Select (thePolyline, myView, Standard_False);
   myView->Redraw();
 }
 
@@ -235,18 +213,20 @@ void ViewerTest_EventManager::Select (const TColgp_Array1OfPnt2d& thePolyline)
 
 void ViewerTest_EventManager::ShiftSelect (const TColgp_Array1OfPnt2d& thePolyline)
 {
-  if (myView.IsNull())
+  if (myView.IsNull()
+   || myCtx.IsNull())
   {
     return;
   }
-  else if (!myCtx.IsNull())
-  {
-    myCtx->ShiftSelect (thePolyline, myView, Standard_False);
-  }
 
+  myCtx->ShiftSelect (thePolyline, myView, Standard_False);
   myView->Redraw();
 }
 
+//=======================================================================
+//function : GetCurrentPosition
+//purpose  :
+//=======================================================================
 void ViewerTest_EventManager::GetCurrentPosition (Standard_Integer& theXPix, Standard_Integer& theYPix) const
 {
   theXPix = myX;
diff --git a/tests/bugs/vis/bug22048 b/tests/bugs/vis/bug22048
new file mode 100644 (file)
index 0000000..bce206b
--- /dev/null
@@ -0,0 +1,22 @@
+puts "========"
+puts "0022048: Visualization, AIS_InteractiveContext - single object selection should always clear multiple selection"
+puts "========"
+puts ""
+
+pload MODELING VISUALIZATION
+box b1  0  0  0 10 10 10
+box b2 20 20 20 30 30 30
+vclear
+vinit View1
+vaxo
+vdisplay -dispMode 1 b1 b2
+vfit
+vselprops selHighlight -dispMode -1
+vselect 0 0 400 400 1
+if { [vreadpixel  50 300 rgb name] != "GRAY66"         } { puts "Error: b1 should be selected."}
+if { [vreadpixel 300 200 rgb name] != "GRAY66"         } { puts "Error: b2 should be selected."}
+vselect 200 200
+if { [vreadpixel  50 300 rgb name] != "DARKGOLDENROD3" } { puts "Error: b1 should not be selected."}
+if { [vreadpixel 300 200 rgb name] != "GRAY66"         } { puts "Error: b2 should be selected."}
+
+vdump $imagedir/${casename}.png