Salome HOME
Update of CheckDone
[modules/smesh.git] / src / StdMeshersGUI / StdMeshersGUI_SubShapeSelectorWdg.cxx
index 0ba30408664397aa29ab0530d5bebb0d15f58942..5033645c556ca4512e82ee7fb9e048e3f629dc37 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2024  CEA, EDF, OPEN CASCADE
 //
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
@@ -37,6 +37,7 @@
 #include <SALOME_ListIO.hxx>
 #include <SUIT_OverrideCursor.h>
 #include <SUIT_ResourceMgr.h>
+#include <SUIT_Session.h>
 #include <SVTK_Selector.h>
 #include <SVTK_ViewModel.h>
 #include <SVTK_ViewWindow.h>
 StdMeshersGUI_SubShapeSelectorWdg
 ::StdMeshersGUI_SubShapeSelectorWdg( QWidget *        parent,
                                      TopAbs_ShapeEnum subShType,
-                                     const bool       toShowList ):
+                                     const bool       toShowList,
+                                     const bool       toShowActivateBtn,
+                                     const int        minListWidth ):
   QWidget( parent ),
   myMaxSize( -1 ),
   myPreviewActor( 0 )
 {
   QPixmap image0( SMESH::GetResourceMgr( mySMESHGUI )->loadPixmap( "SMESH", tr( "ICON_SELECT" ) ) );
 
-  QGridLayout* edgesLayout = new QGridLayout( this );
-  edgesLayout->setMargin( MARGIN );
-  edgesLayout->setSpacing( SPACING );
+  QGridLayout* layout = new QGridLayout( this );
+  layout->setMargin( MARGIN );
+  layout->setSpacing( SPACING );
 
   if ( toShowList )
   {
-    myListWidget   = new QListWidget( this );
-    myAddButton    = new QPushButton( tr( "SMESH_BUT_ADD" ),    this );
-    myRemoveButton = new QPushButton( tr( "SMESH_BUT_REMOVE" ), this );
+    QPixmap iconSelect (SUIT_Session::session()->resourceMgr()->loadPixmap("SMESH", tr("ICON_SELECT")));
+    myListWidget     = new QListWidget( this );
+    myActivateButton = new QPushButton( iconSelect, "", this );
+    myAddButton      = new QPushButton( tr( "SMESH_BUT_ADD" ),    this );
+    myRemoveButton   = new QPushButton( tr( "SMESH_BUT_REMOVE" ), this );
     myListWidget->setSelectionMode( QListWidget::ExtendedSelection );
-    myListWidget->setMinimumWidth(300);
+    myListWidget->setMinimumWidth( minListWidth );
+    myListWidget->setWrapping( true );
+    myActivateButton->setCheckable( true );
   }
   else
   {
-    myListWidget   = 0;
-    myAddButton    = 0;
-    myRemoveButton = 0;
+    myListWidget     = 0;
+    myActivateButton = 0;
+    myAddButton      = 0;
+    myRemoveButton   = 0;
   }
   myInfoLabel    = new QLabel( this );
   myPrevButton   = new QPushButton( "<<", this );
@@ -103,21 +111,27 @@ StdMeshersGUI_SubShapeSelectorWdg
 
   if ( myListWidget )
   {
-    edgesLayout->addWidget(myListWidget,   0, 0, 3, 3);
-    edgesLayout->addWidget(myAddButton,    0, 3);
-    edgesLayout->addWidget(myRemoveButton, 1, 3);
-    edgesLayout->addWidget(myInfoLabel,    3, 0, 1, 3);
-    edgesLayout->addWidget(myPrevButton,   4, 0);
-    edgesLayout->addWidget(myNextButton,   4, 2);
-
-    edgesLayout->setRowStretch(2, 5);
-    edgesLayout->setColumnStretch(1, 5);
+    int row = 0;
+    layout->addWidget(myListWidget,   row, 0, 3+toShowActivateBtn, 3);
+    if ( toShowActivateBtn )
+      layout->addWidget( myActivateButton, row++, 3 );
+    else
+      myActivateButton->hide();
+    layout->addWidget(myAddButton,      row, 3);
+    layout->addWidget(myRemoveButton, ++row, 3);
+    ++row;
+    layout->addWidget(myInfoLabel,    ++row, 0, 1, 3);
+    layout->addWidget(myPrevButton,   ++row, 0);
+    layout->addWidget(myNextButton,     row, 2);
+
+    layout->setRowStretch(row-2, 5);
+    layout->setColumnStretch(1, 5);
   }
   else // show only Prev and Next buttons
   {
-    edgesLayout->addWidget(myInfoLabel,    0, 0, 1, 2);
-    edgesLayout->addWidget(myPrevButton,   1, 0);
-    edgesLayout->addWidget(myNextButton,   1, 1);
+    layout->addWidget(myInfoLabel,    0, 0, 1, 2);
+    layout->addWidget(myPrevButton,   1, 0);
+    layout->addWidget(myNextButton,   1, 1);
   }
   //myInfoLabel->setMinimumWidth(300);
   //myInfoLabel->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
@@ -187,6 +201,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::init()
     myRemoveButton->setEnabled( false );
 
     connect( myListWidget,   SIGNAL(itemSelectionChanged()),    this, SLOT(onListSelectionChanged()));
+    connect( myActivateButton, SIGNAL( toggled(bool) ), SLOT( ActivateSelection(bool)));
     connect( myAddButton,    SIGNAL(clicked()), SLOT(onAdd()));
     connect( myRemoveButton, SIGNAL(clicked()), SLOT(onRemove()));
   }
@@ -240,6 +255,20 @@ void StdMeshersGUI_SubShapeSelectorWdg::ShowPreview( bool visible)
   }
 }
 
+//================================================================================
+/*!
+ * \brief Connect selection slots
+  * \param other - another StdMeshersGUI_ObjectReferenceParamWdg
+ */
+//================================================================================
+
+void StdMeshersGUI_SubShapeSelectorWdg::
+AvoidSimultaneousSelection ( StdMeshersGUI_SubShapeSelectorWdg* other)
+{
+  connect(other, SIGNAL(selectionActivated()), this, SLOT(deactivateSelection()));
+  connect(this, SIGNAL(selectionActivated()), other, SLOT(deactivateSelection()));
+}
+
 //================================================================================
 /*!
  * \brief Connect/disconnect to change of selection
@@ -248,16 +277,31 @@ void StdMeshersGUI_SubShapeSelectorWdg::ShowPreview( bool visible)
 
 void StdMeshersGUI_SubShapeSelectorWdg::ActivateSelection( bool toActivate )
 {
+  // adjust state of myActivateButton
+  if ( myActivateButton &&
+       myActivateButton != sender() &&
+       myActivateButton->isChecked() != toActivate )
+  {
+    myActivateButton->toggle();
+    return;
+  }
+
   if ( !mySelectionMgr ) return;
 
   if ( toActivate )
   {
-    connect( mySelectionMgr, SIGNAL(currentSelectionChanged()), this, SLOT(selectionIntoArgument()));
+    connect( mySelectionMgr, SIGNAL(currentSelectionChanged()), SLOT(selectionIntoArgument()));
   }
   else
   {
     disconnect(mySelectionMgr, 0, this, 0 );
   }
+
+  if ( sender() == myActivateButton )
+    ShowPreview( toActivate );
+
+  if ( toActivate )
+    emit selectionActivated();
 }
 
 //================================================================================
@@ -361,6 +405,7 @@ void StdMeshersGUI_SubShapeSelectorWdg::selectionIntoArgument()
     myAddButton->setEnabled(( myListWidget->count() < myMaxSize || myMaxSize == -1 ) &&
                             ( mySelectedIDs.size() > 0                             ) &&
                             ( mySelectedIDs.size() <= myMaxSize || myMaxSize == -1 ) );
+    myRemoveButton->setEnabled( mySelectedIDs.size() > 0 );
 
     //Connect Selected Ids in viewer and dialog's Ids list
     bool signalsBlocked = myListWidget->blockSignals( true );
@@ -551,16 +596,12 @@ void StdMeshersGUI_SubShapeSelectorWdg::updateState()
 GEOM::GEOM_Object_var StdMeshersGUI_SubShapeSelectorWdg::GetGeomObjectByEntry( const QString& theEntry )
 {
   GEOM::GEOM_Object_var aGeomObj;
-  SALOMEDS::Study_var aStudy = SMESHGUI::GetSMESHGen()->GetCurrentStudy();
-  if ( !aStudy->_is_nil() )
+  SALOMEDS::SObject_var aSObj = SMESH_Gen_i::GetSMESHGen()->getStudyServant()->FindObjectID( theEntry.toUtf8().data() );
+  if (!aSObj->_is_nil() )
   {
-    SALOMEDS::SObject_var aSObj = aStudy->FindObjectID( theEntry.toLatin1().data() );
-    if (!aSObj->_is_nil() )
-    {
-      CORBA::Object_var obj = aSObj->GetObject();
-      aGeomObj = GEOM::GEOM_Object::_narrow(obj);
-      aSObj->UnRegister();
-    }
+    CORBA::Object_var obj = aSObj->GetObject();
+    aGeomObj = GEOM::GEOM_Object::_narrow(obj);
+    aSObj->UnRegister();
   }
   return aGeomObj._retn();
 }