Salome HOME
PAL7864, PAL7951, PAL7915
[modules/smesh.git] / src / SMESHGUI / SMESHGUI_MultiEditDlg.cxx
index 1e01c6881393c4152b90327907727d96a7923ed5..d311b490e3900dfd661fbdb8dbd5d9c9d65c6145 100755 (executable)
@@ -97,7 +97,7 @@ SMESHGUI_MultiEditDlg::SMESHGUI_MultiEditDlg( QWidget*              theParent,
                                              const bool            the3d2d,
                                               const char*           theName )
 : QDialog( theParent, theName, false, 
-           WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu )
+           WStyle_Customize | WStyle_NormalBorder | WStyle_Title | WStyle_SysMenu | WDestructiveClose )
 {
   myFilterDlg = 0;
   mySubmeshFilter = new SMESH_TypeFilter( SUBMESH );
@@ -148,6 +148,7 @@ QFrame* SMESHGUI_MultiEditDlg::createMainFrame( QWidget* theParent, const bool t
   myListBox->setSelectionMode( QListBox::Extended );
   myListBox->setSizePolicy( QSizePolicy( QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding) );
 //  myListBox->setColumnMode( QListBox::FitToHeight );
+  myListBox->installEventFilter( this );
   
   myFilterBtn = new QPushButton( tr( "FILTER" )   , aFrame );
   myAddBtn    = new QPushButton( tr( "ADD" )      , aFrame );
@@ -232,6 +233,20 @@ SMESHGUI_MultiEditDlg::~SMESHGUI_MultiEditDlg()
   }
 }
 
+//=======================================================================
+// name    : SMESHGUI_MultiEditDlg::eventFilter
+// Purpose : event filter
+//=======================================================================
+bool SMESHGUI_MultiEditDlg::eventFilter( QObject* object, QEvent* event )
+{
+  if ( object == myListBox && event->type() == QEvent::KeyPress ) {
+    QKeyEvent* ke = (QKeyEvent*)event;
+    if ( ke->key() == Key_Delete )
+      onRemoveBtn();
+  }
+  return QDialog::eventFilter( object, event );
+}
+
 //=======================================================================
 // name    : SMESHGUI_MultiEditDlg::Init
 // Purpose : Init dialog fields, connect signals and slots, show dialog
@@ -301,9 +316,12 @@ SMESH::long_array_var SMESHGUI_MultiEditDlg::getIds()
   if ( myToAllChk->isChecked() )
   {
     myIds.Clear();
-    if ( myActor != 0 )
+    SMESH_Actor * anActor = SMESH::FindActorByObject( myMesh );
+    if ( !anActor )
+      anActor = myActor;
+    if ( anActor != 0 )
     {
-      TVisualObjPtr aVisualObj = myActor->GetObject();
+      TVisualObjPtr aVisualObj = anActor->GetObject();
       vtkUnstructuredGrid* aGrid = aVisualObj->GetUnstructuredGrid();
       if ( aGrid != 0 )
       {
@@ -350,11 +368,7 @@ void SMESHGUI_MultiEditDlg::onClose()
   disconnect( SMESHGUI::GetSMESHGUI(), 0, this, 0 );
   SMESHGUI::GetSMESHGUI()->ResetState();
   
-  SMESH::RemoveFilter(SMESHGUI_EdgeFilter);
-  SMESH::RemoveFilter(SMESHGUI_FaceFilter);
-  SMESH::RemoveFilter(SMESHGUI_VolumeFilter);
-  SMESH::RemoveFilter(SMESHGUI_QuadFilter);
-  SMESH::RemoveFilter(SMESHGUI_TriaFilter);
+  SMESH::RemoveFilters();
   SMESH::SetPickable();
 
   mySelection->ClearIObjects();
@@ -431,14 +445,11 @@ void SMESHGUI_MultiEditDlg::onSelectionDone()
     if (!myActor)
       myActor = SMESH::FindActorByObject( myMesh );
     VTKViewer_InteractorStyleSALOME* aStyle = SMESH::GetInteractorStyle();
-    Handle(VTKViewer_Filter) aFilter1 = aStyle->GetFilter( myFilterType );
-    Handle(VTKViewer_Filter) aFilter2 = aStyle->GetFilter( SMESHGUI_FaceFilter );
-    if ( !aFilter1.IsNull() )
-      aFilter1->SetActor( myActor );
-    if ( !aFilter2.IsNull() )
-      aFilter2->SetActor( myActor );
-    if ( myActor )
-      SMESH::SetPickable(myActor);
+    Handle(VTKViewer_Filter) aFilter = aStyle->GetFilter( myFilterType );
+    if ( !aFilter.IsNull() )
+      aFilter->SetActor( myActor );
+//if ( myActor )
+//    SMESH::SetPickable(myActor);
   }
   myBusy = false;
 
@@ -535,18 +546,16 @@ void SMESHGUI_MultiEditDlg::onFilterAccepted()
 }
 
 //=======================================================================
-// name    : SMESHGUI_MultiEditDlg::onAddBtn
+// name    : SMESHGUI_MultiEditDlg::isIdValid
 // Purpose : Verify whether Id of element satisfies to filters from viewer
 //=======================================================================
 bool SMESHGUI_MultiEditDlg::isIdValid( const int theId ) const
 {
   VTKViewer_InteractorStyleSALOME* aStyle = SMESH::GetInteractorStyle();
-  Handle(SMESHGUI_Filter) aFilter1 =
+  Handle(SMESHGUI_Filter) aFilter =
     Handle(SMESHGUI_Filter)::DownCast( aStyle->GetFilter( myFilterType ) );
-  Handle(SMESHGUI_Filter) aFilter2 =
-    Handle(SMESHGUI_Filter)::DownCast( aStyle->GetFilter( SMESHGUI_FaceFilter ) );
-  return ( aFilter1.IsNull() || aFilter1->IsObjValid( theId ) ) &&
-         ( aFilter2.IsNull() || aFilter2->IsObjValid( theId ) );
+
+  return ( !aFilter.IsNull() && aFilter->IsObjValid( theId ) );
 }
 
 //=======================================================================
@@ -594,7 +603,7 @@ void SMESHGUI_MultiEditDlg::onAddBtn()
     {
       SMESH::SMESH_GroupBase_var aGroup =
         SMESH::IObjectToInterface<SMESH::SMESH_GroupBase>( anIter.Value() );
-      if ( !aGroup->_is_nil() && aGroup->GetType() == SMESH::FACE )
+      if ( !aGroup->_is_nil() && ( aGroup->GetType() == SMESH::FACE && entityType() == 0 || aGroup->GetType() == SMESH::VOLUME && entityType() == 1 ) )
       {
         if ( aGroup->GetMesh()->GetId() == myMesh->GetId() )
         {
@@ -834,38 +843,31 @@ void SMESHGUI_MultiEditDlg::onToAllChk()
 //=======================================================================
 void SMESHGUI_MultiEditDlg::setSelectionMode()
 {
-  SMESH::RemoveFilter(SMESHGUI_EdgeFilter);
-  SMESH::RemoveFilter(SMESHGUI_FaceFilter);
-  SMESH::RemoveFilter(SMESHGUI_VolumeFilter);
-  SMESH::RemoveFilter(SMESHGUI_QuadFilter);
-  SMESH::RemoveFilter(SMESHGUI_TriaFilter);
-  SMESH::SetPickable();
-
+  SMESH::RemoveFilters();
+    
   mySelection->ClearIObjects();
   mySelection->ClearFilters();
   
-  if ( mySubmeshChk->isChecked() )
-  {
+  if ( mySubmeshChk->isChecked() ) {
     QAD_Application::getDesktop()->SetSelectionMode( ActorSelection, true );
     mySelection->AddFilter( mySubmeshFilter );
   }
-  else if ( myGroupChk->isChecked() )
-  {
+  else if ( myGroupChk->isChecked() ) {
     QAD_Application::getDesktop()->SetSelectionMode( ActorSelection, true );
     mySelection->AddFilter( myGroupFilter );
   }
-  else
-  {
-    if ( myFilterType == SMESHGUI_VolumeFilter ) {
-      QAD_Application::getDesktop()->SetSelectionMode( VolumeSelection, true );
-    }
-    else {
-      QAD_Application::getDesktop()->SetSelectionMode( FaceSelection, true );
-      if ( myFilterType == SMESHGUI_TriaFilter )
-       SMESH::SetFilter( new SMESHGUI_TriangleFilter() );
-      else if ( myFilterType == SMESHGUI_QuadFilter )
-       SMESH::SetFilter( new SMESHGUI_QuadrangleFilter() );
-    }
+  if ( entityType() ) {
+    QAD_Application::getDesktop()->SetSelectionMode( VolumeSelection, true );
+    SMESH::SetFilter( new SMESHGUI_VolumesFilter() );
+  }
+  else {
+    QAD_Application::getDesktop()->SetSelectionMode( FaceSelection, true );
+    if ( myFilterType == SMESHGUI_TriaFilter )
+      SMESH::SetFilter( new SMESHGUI_TriangleFilter() );
+    else if ( myFilterType == SMESHGUI_QuadFilter )
+      SMESH::SetFilter( new SMESHGUI_QuadrangleFilter() );
+    else
+      SMESH::SetFilter( new SMESHGUI_FacesFilter() );
   }
 }
 
@@ -884,6 +886,8 @@ bool SMESHGUI_MultiEditDlg::onApply()
   if ( aMeshEditor->_is_nil()  )
     return false;
 
+  myBusy = true;
+
   SMESH::long_array_var anIds = getIds();
 
   bool aResult = process( aMeshEditor, anIds.inout() );
@@ -903,6 +907,7 @@ bool SMESHGUI_MultiEditDlg::onApply()
     updateButtons();
   }
 
+  myBusy = false;
   return aResult;
 }
 
@@ -920,16 +925,13 @@ void SMESHGUI_MultiEditDlg::on3d2dChanged(int type)
 
     emit ListContensChanged();
     
-    updateButtons();
-
     if ( type )
       myFilterType = SMESHGUI_VolumeFilter;
     else 
       myFilterType = SMESHGUI_FaceFilter;
-    setSelectionMode();
 
-    if ( myActor )
-      mySelection->AddIObject( myActor->getIO(), true );
+    updateButtons();
+    setSelectionMode();
   }
 }