Salome HOME
untabify
[modules/geom.git] / src / GEOMGUI / GEOMGUI_Selection.cxx
index d89088f618253fee8b01124d4a4772bd07539a13..a3e9d133b849598d95f10c653bb678c06271221c 100644 (file)
 #include <SOCC_Prs.h>
 #include <SVTK_Prs.h>
 #include <SALOME_Actor.h>
+#include <GEOM_Actor.h>
 
 #include <OCCViewer_ViewModel.h>
 #include <SVTK_ViewModel.h>
 
 #include <GEOMImpl_Types.hxx>
 
+#include <GEOM_AISShape.hxx>
+
 // OCCT Includes
 #include <AIS.hxx>
 #include <AIS_InteractiveObject.hxx>
@@ -80,10 +83,18 @@ QVariant GEOMGUI_Selection::parameter( const int ind, const QString& p ) const
 //  else
   if( p == "type" )
     return QVariant( typeName( ind ) );
+  if( p == "typeid" )
+    return QVariant( typeId( ind ) );
   else if ( p == "displaymode" )
     return QVariant( displayMode( ind ) );
   else if ( p == "isAutoColor" )
     return QVariant( isAutoColor( ind ) );
+  else if ( p == "isVectorsMode" )
+    return QVariant( isVectorsMode( ind ) );
+  else if ( p == "hasHiddenChildren" )
+    return QVariant( hasHiddenChildren( ind ) );
+  else if ( p == "hasShownChildren" )
+    return QVariant( hasShownChildren( ind ) );
   else
     return LightApp_Selection::parameter( ind, p );
 }
@@ -103,6 +114,15 @@ QString GEOMGUI_Selection::typeName( const int index ) const
   return "Unknown";
 }
 
+int GEOMGUI_Selection::typeId( const int index ) const
+{
+  int aType = -1;
+  GEOM::GEOM_Object_var anObj = getObject( index );
+  if ( !CORBA::is_nil( anObj ) )
+    aType = anObj->GetType();
+  return aType;
+}
+
 bool GEOMGUI_Selection::isVisible( const int index ) const
 {
   GEOM::GEOM_Object_var obj = getObject( index );
@@ -177,6 +197,108 @@ QString GEOMGUI_Selection::displayMode( const int index ) const
   return "";
 }
 
+bool GEOMGUI_Selection::isVectorsMode( const int index ) const
+{
+  bool ret = false;
+  SALOME_View* view = GEOM_Displayer::GetActiveView();
+  QString viewType = activeViewType();
+  if ( view && ( viewType == OCCViewer_Viewer::Type() || viewType == SVTK_Viewer::Type() ) ) {
+    SALOME_Prs* prs = view->CreatePrs( entry( index ).toLatin1().constData() );
+    if ( prs ) {
+      if ( viewType == OCCViewer_Viewer::Type() ) { // assuming OCC
+        SOCC_Prs* occPrs = (SOCC_Prs*) prs;
+        AIS_ListOfInteractive lst;
+        occPrs->GetObjects( lst );
+        if ( lst.Extent() ) {
+          Handle(AIS_InteractiveObject) io = lst.First();
+          if ( !io.IsNull() ) {
+            Handle(GEOM_AISShape) aSh = Handle(GEOM_AISShape)::DownCast(io);
+            if ( !aSh.IsNull() )
+              ret = aSh->isShowVectors();
+          }
+        }
+      } else if ( viewType == SVTK_Viewer::Type() ) { // assuming VTK
+        SVTK_Prs* vtkPrs = dynamic_cast<SVTK_Prs*>( prs );
+        vtkActorCollection* lst = vtkPrs ? vtkPrs->GetObjects() : 0;
+        if ( lst ) {
+          lst->InitTraversal();
+          vtkActor* actor = lst->GetNextActor();
+          if ( actor ) {
+            GEOM_Actor* aGeomActor = GEOM_Actor::SafeDownCast(actor);
+            if ( aGeomActor )
+              ret = aGeomActor->GetVectorMode();
+          }
+        }
+      }
+    }
+  }
+  return ret;
+}
+
+bool GEOMGUI_Selection::hasChildren( const _PTR(SObject)& obj )
+{
+  bool ok = false;
+  if ( obj ) {
+    _PTR(ChildIterator) it ( obj->GetStudy()->NewChildIterator( obj ) );
+    for ( ; it->More() && !ok; it->Next() ) {
+      _PTR(SObject) child = it->Value();
+      if ( child ) {
+       _PTR(SObject) refObj;
+       if ( child->ReferencedObject( refObj ) ) continue; // omit references
+       if ( child->GetName() != "" ) ok = true;
+      }
+    }
+  }
+  return ok;
+}
+
+bool GEOMGUI_Selection::expandable( const _PTR(SObject)& obj )
+{
+  bool exp = true;
+  _PTR(GenericAttribute) anAttr;
+  if ( obj && obj->FindAttribute( anAttr, "AttributeExpandable" ) ) {
+    _PTR(AttributeExpandable) aAttrExp = anAttr;
+    exp = aAttrExp->IsExpandable();
+  }
+  return exp;
+}
+
+bool GEOMGUI_Selection::hasHiddenChildren( const int index ) const
+{
+  bool OK = false;
+  SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>
+    (SUIT_Session::session()->activeApplication()->activeStudy());
+
+  if ( appStudy && index >= 0 && index < count() )  {
+    _PTR(Study) study = appStudy->studyDS();
+    QString anEntry = entry( index );
+
+    if ( study && !anEntry.isEmpty() ) {
+      _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) );
+      OK = !expandable( aSO ) && hasChildren( aSO );
+    }
+  }
+  return OK;
+}
+
+bool GEOMGUI_Selection::hasShownChildren( const int index ) const
+{
+  bool OK = false;
+  SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>
+    (SUIT_Session::session()->activeApplication()->activeStudy());
+
+  if ( appStudy && index >= 0 && index < count() )  {
+    _PTR(Study) study = appStudy->studyDS();
+    QString anEntry = entry( index );
+
+    if ( study && !anEntry.isEmpty() ) {
+      _PTR(SObject) aSO( study->FindObjectID( anEntry.toStdString() ) );
+      OK = expandable( aSO ) && hasChildren( aSO );
+    }
+  }
+  return OK;
+}
+
 bool GEOMGUI_Selection::isComponent( const int index ) const
 {
   SalomeApp_Study* appStudy = dynamic_cast<SalomeApp_Study*>