]> SALOME platform Git repositories - modules/shaper.git/commitdiff
Salome HOME
Issue #2154 Multiselection field is cleared when trying to add another object
authornds <nds@opencascade.com>
Tue, 16 May 2017 12:15:13 +0000 (15:15 +0300)
committernds <nds@opencascade.com>
Tue, 16 May 2017 12:15:13 +0000 (15:15 +0300)
1. EVENT_UPDATE_BY_WIDGET_SELECTION should be flushed after ObjectBrowser updateCommandStatus
2. Synchronization should also happens in ObjectBrowser.
Not implemented: deselection of result in Object Browser if an operation is active

src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_WidgetMultiSelector.h
src/XGUI/XGUI_ModuleConnector.cpp
src/XGUI/XGUI_SelectionMgr.h

index 9e911159185f554b8cbd90817f85e9a2d808b1b4..4f19014723958ebb3e1bbeacb168e5b12e2ef2e1 100755 (executable)
@@ -275,17 +275,6 @@ bool ModuleBase_WidgetMultiSelector::setSelection(QList<ModuleBase_ViewerPrsPtr>
     //emit valuesChanged();
   //}
 
-  // Restore selection in the viewer by the attribute selection list
-  // it is possible that diring selection attribute filling, selection in Object Browser
-  // is changed(some items were removed/added) and as result, selection in the viewer
-  // differs from the selection come to this method. By next rows, we restore selection
-  // in the viewer according to content of selection attribute. Case is Edge selection in Group
-  myIsSetSelectionBlocked = true;
-  static Events_ID anEvent = Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION);
-  ModelAPI_EventCreator::get()->sendUpdated(myFeature, anEvent);
-  Events_Loop::loop()->flush(anEvent);
-  myIsSetSelectionBlocked = false;
-
   if (aSelectionListAttr.get())
     aSelectionListAttr->cashValues(false);
 
@@ -479,6 +468,29 @@ void ModuleBase_WidgetMultiSelector::updateSelectionName()
 {
 }
 
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::updateOnSelectionChanged(const bool theDone)
+{
+  if (myIsSetSelectionBlocked)
+    return;
+  ModuleBase_WidgetSelector::updateOnSelectionChanged(theDone);
+
+  // according to #2154 we need to update OB selection when selection in the viewer happens
+  // it is important to flush sinchronize selection signal after flush of Update/Create/Delete.
+  // because we need that Object Browser has been already updated when synchronize happens.
+
+  // Restore selection in the viewer by the attribute selection list
+  // it is possible that diring selection attribute filling, selection in Object Browser
+  // is changed(some items were removed/added) and as result, selection in the viewer
+  // differs from the selection come to this method. By next rows, we restore selection
+  // in the viewer according to content of selection attribute. Case is Edge selection in Group
+  myIsSetSelectionBlocked = true;
+  static Events_ID anEvent = Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION);
+  ModelAPI_EventCreator::get()->sendUpdated(myFeature, anEvent);
+  Events_Loop::loop()->flush(anEvent);
+  myIsSetSelectionBlocked = false;
+}
+
 //********************************************************************
 QIntList ModuleBase_WidgetMultiSelector::shapeTypes() const
 {
index e7713928ad6fc28d55d18224fd3c9b7bddb4b699..1e28d62ef320093922dc93390d82e00ab9d98264 100755 (executable)
@@ -119,6 +119,10 @@ protected:
   /// Computes and updates name of selected object in the widget
   virtual void updateSelectionName();
 
+  /// Emits model changed info, updates the current control by selection change
+  /// \param theDone a state whether the selection is set
+  virtual void updateOnSelectionChanged(const bool theDone);
+
   /// Retunrs a list of possible shape types
   /// \return a list of shapes
   virtual QIntList shapeTypes() const;
index 51358f13c1246adc1cffa9591ced1e38f6404037..53cc4a919e75838e24ea4e44174d2f71292d15e1 100644 (file)
@@ -123,6 +123,8 @@ void XGUI_ModuleConnector::setSelected(const QList<ModuleBase_ViewerPrsPtr>& the
     myWorkshop->selector()->clearSelection();
   } else {
     aDisp->setSelected(theValues);
+    // according to #2154 we need to update OB selection when selection in the viewer happens
+    myWorkshop->selector()->onViewerSelection();
   }
 }
 
index e1381858739877765b18a30aed3dd043b63d9113..32344dec78a4bd1ebded87799d6b716b21bdecc4 100644 (file)
@@ -58,7 +58,7 @@ signals:
   //! Emited when selection in a one of viewers was changed
   void selectionChanged();
 
- private slots:
+ public slots:
    /// Reaction on selectio0n in Object browser
   void onObjectBrowserSelection();