]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Improve multi-selector control to provide items multi-selection and "Delete" context...
authornds <nds@opencascade.com>
Mon, 11 Jan 2016 13:21:31 +0000 (16:21 +0300)
committerdbv <dbv@opencascade.com>
Tue, 16 Feb 2016 14:03:00 +0000 (17:03 +0300)
src/Model/Model_AttributeRefList.cpp
src/Model/Model_AttributeRefList.h
src/Model/Model_AttributeSelectionList.cpp
src/Model/Model_AttributeSelectionList.h
src/ModelAPI/ModelAPI_AttributeRefList.h
src/ModelAPI/ModelAPI_AttributeSelectionList.h
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_WidgetMultiSelector.h

index 469a4add2b2983532e8d4980357dd5c8c89759fd..200807984d374405683e8c42e44b0d7063a18f1a 100644 (file)
@@ -212,6 +212,10 @@ void Model_AttributeRefList::removeLast()
   }
 }
 
+void Model_AttributeRefList::remove(const std::set<int>& theIndices)
+{
+}
+
 Model_AttributeRefList::Model_AttributeRefList(TDF_Label& theLabel)
 {
   myIsInitialized = theLabel.FindAttribute(TDataStd_ReferenceList::GetID(), myRef) == Standard_True;
index e92f5eae312dc2f6b08dbee10b8e09a91b97cad2..eaa1d92067a7fd8d384f1e09781290e694fdc67e 100644 (file)
@@ -56,6 +56,10 @@ class Model_AttributeRefList : public ModelAPI_AttributeRefList
   /// Removes the last element in the list.
   MODEL_EXPORT virtual void removeLast();
 
+  /// Removes the elements from the list.
+  /// \param theIndices a list of indices of elements to be removed
+  MODEL_EXPORT virtual void remove(const std::set<int>& theIndices);
+
   /// Returns true if attribute was  initialized by some value
   MODEL_EXPORT virtual bool isInitialized();
  protected:
index f762ebaf39699e006fc32d8f45ceab799528bdf0..677d14d78760e552a6ee12fc9c7639fd488bcba8 100644 (file)
@@ -83,6 +83,10 @@ void Model_AttributeSelectionList::removeLast()
   }
 }
 
+void Model_AttributeSelectionList::remove(const std::set<int>& theIndices)
+{
+}
+
 int Model_AttributeSelectionList::size()
 {
   return mySize->Get();
index 6721dd8adfff67a59d0ed9b1a458a1de8bfe6fc8..a69635c4bdb7b41bede5677b15ca2656f7956b63 100644 (file)
@@ -42,6 +42,10 @@ public:
   /// Removes the last element in the list
   MODEL_EXPORT virtual void removeLast();
 
+  /// Removes the elements from the list.
+  /// \param theIndices a list of indices of elements to be removed
+  MODEL_EXPORT virtual void remove(const std::set<int>& theIndices);
+
   /// Returns the number ofselection attributes in the list
   MODEL_EXPORT virtual int size();
 
index d519000225f194394ffe0231acbe356abdeb4303..101fc8695959e9a84470cead938bf45f1c6011f9 100644 (file)
@@ -61,6 +61,10 @@ class ModelAPI_AttributeRefList : public ModelAPI_Attribute
   /// Removes the last element in the list.
   virtual void removeLast() = 0;
 
+  /// Removes the elements from the list.
+  /// \param theIndices a list of indices of elements to be removed
+  virtual void remove(const std::set<int>& theIndices) = 0;
+
   MODELAPI_EXPORT virtual ~ModelAPI_AttributeRefList();
  protected:
   /// Objects are created for features automatically
index 52eec8ca15ab35acd71cbb4cffacd4a53d133b53..0c875c3365ec8e35df1a87b04133c7bde0c67a25 100644 (file)
@@ -35,6 +35,10 @@ class ModelAPI_AttributeSelectionList : public ModelAPI_Attribute
   /// Removes the last element in the list
   virtual void removeLast() = 0;
 
+  /// Removes the elements from the list.
+  /// \param theIndices a list of indices of elements to be removed
+  virtual void remove(const std::set<int>& theIndices) = 0;
+
   /// Returns the number of selection attributes in the list
   virtual int size() = 0;
 
index bb4ec7861b59d4fbab17a35f63aa69df0bbcddbf..73ee5e4629d3a0bec8ca1b325b4e905e1287fe63 100755 (executable)
@@ -37,6 +37,8 @@
 #include <memory>
 #include <string>
 
+const int ATTRIBUTE_SELECTION_INDEX_ROLE = Qt::UserRole + 1;
+
 /**
 * Customization of a List Widget to make it to be placed on full width of container
 */
@@ -129,6 +131,7 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen
   QString anObjName = QString::fromStdString(attributeID());
   myListControl->setObjectName(anObjName);
   myListControl->setToolTip(aToolTip);
+  myListControl->setSelectionMode(QAbstractItemView::ExtendedSelection);
 
   aMainLay->addWidget(myListControl, 2, 0, 1, -1);
   aMainLay->setRowStretch(2, 1);
@@ -142,6 +145,13 @@ ModuleBase_WidgetMultiSelector::ModuleBase_WidgetMultiSelector(QWidget* theParen
   myCopyAction->setEnabled(false);
   connect(myCopyAction, SIGNAL(triggered(bool)), SLOT(onCopyItem()));
   myListControl->addAction(myCopyAction);
+
+  myDeleteAction = new QAction(QIcon(":pictures/delete.png"), tr("Delete"), this);
+  myDeleteAction->setShortcut(QKeySequence::Delete);
+  myDeleteAction->setEnabled(false);
+  connect(myDeleteAction, SIGNAL(triggered(bool)), SLOT(onDeleteItem()));
+  myListControl->addAction(myDeleteAction);
+
   myListControl->setContextMenuPolicy(Qt::ActionsContextMenu);
   connect(myListControl, SIGNAL(itemSelectionChanged()), SLOT(onListSelection()));
 }
@@ -426,15 +436,21 @@ void ModuleBase_WidgetMultiSelector::updateSelectionList()
   if (aSelectionListAttr.get()) {
     for (int i = 0; i < aSelectionListAttr->size(); i++) {
       AttributeSelectionPtr aAttr = aSelectionListAttr->value(i);
-      myListControl->addItem(aAttr->namingName().c_str());
+      QListWidgetItem* anItem = new QListWidgetItem(aAttr->namingName().c_str(), myListControl);
+      anItem->setData(ATTRIBUTE_SELECTION_INDEX_ROLE, i);
+      myListControl->addItem(anItem);
     }
   }
   else {
     AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
     for (int i = 0; i < aRefListAttr->size(); i++) {
       ObjectPtr anObject = aRefListAttr->object(i);
-      if (anObject.get())
-        myListControl->addItem(anObject->data()->name().c_str());
+      if (anObject.get()) {
+        QListWidgetItem* anItem = new QListWidgetItem(anObject->data()->name().c_str(),
+                                                      myListControl);
+        anItem->setData(ATTRIBUTE_SELECTION_INDEX_ROLE, i);
+        myListControl->addItem(anItem);
+      }
     }
   }
   // We have to call repaint because sometimes the List control is not updated
@@ -474,9 +490,49 @@ void ModuleBase_WidgetMultiSelector::onCopyItem()
   }
 }
 
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::onDeleteItem()
+{
+  // find attribute indices to delete
+  QList<QListWidgetItem*> aItems = myListControl->selectedItems();
+  std::set<int> anAttributeIds;
+  foreach(QListWidgetItem* anItem, aItems) {
+    int anIndex = anItem->data(ATTRIBUTE_SELECTION_INDEX_ROLE).toInt();
+    if (anAttributeIds.find(anIndex) == anAttributeIds.end())
+      anAttributeIds.insert(anIndex);
+  }
+  // refill attribute by the items which indices are not in the list of ids
+  bool aDone = false;
+  AttributeSelectionListPtr aSelectionListAttr = myFeature->data()->selectionList(attributeID());
+  if (aSelectionListAttr.get()) {
+    aDone = !anAttributeIds.empty();
+    //aSelectionListAttr->remove(anAttributeIds);
+    std::set<int>::const_iterator anIt = anAttributeIds.begin(), aLast = anAttributeIds.end();
+    for (; anIt != aLast; anIt++)
+      aSelectionListAttr->removeLast();
+  }
+  else {
+    AttributeRefListPtr aRefListAttr = myFeature->data()->reflist(attributeID());
+    if (aRefListAttr.get()) {
+      aDone = !anAttributeIds.empty();
+      //aRefListAttr->remove(anAttributeIds);
+      std::set<int>::const_iterator anIt = anAttributeIds.begin(), aLast = anAttributeIds.end();
+      for (; anIt != aLast; anIt++)
+        aRefListAttr->removeLast();
+    }
+  }
+  if (aDone) {
+    restoreValue();
+    myWorkshop->setSelected(getAttributeSelection());
+  }
+}
+
 //********************************************************************
 void ModuleBase_WidgetMultiSelector::onListSelection()
 {
   QList<QListWidgetItem*> aItems = myListControl->selectedItems();
   myCopyAction->setEnabled(!aItems.isEmpty());
+  myDeleteAction->setEnabled(!aItems.isEmpty());
+
+  //myWorkshop->setSelected(>setSelected(getAttributeSelection());
 }
index d8df98aa3cb815bba77ee99f2ac008c45575a230..9165161fc09f0d4fc978613b9cfe2d40d8eb1b2f 100755 (executable)
@@ -85,6 +85,9 @@ protected slots:
   /// Slot for copy command in a list pop-up menu
   void onCopyItem();
 
+  /// Slot for delete command in a list pop-up menu
+  void onDeleteItem();
+
   /// Slot is called on selection of list of selected items
   void onListSelection();
 
@@ -153,6 +156,7 @@ protected:
 
   /// An action for pop-up menu in a list control
   QAction* myCopyAction;
+  QAction* myDeleteAction;
 
   /// backup parameters of the model attribute. The class processes three types of attribute:
   /// Reference, RefAttr and Selection. Depending on the attribute type, only the attribute parameter