Salome HOME
Issue #2352 - Undo list is disabled when change focus from multi-selection to ordinar...
authornds <nds@opencascade.com>
Thu, 14 Dec 2017 20:17:44 +0000 (23:17 +0300)
committernds <nds@opencascade.com>
Thu, 14 Dec 2017 20:18:20 +0000 (23:18 +0300)
Issue #2368 - Fatal error when Undo in Fillet

src/ModuleBase/ModuleBase_ModelWidget.h
src/ModuleBase/ModuleBase_WidgetMultiSelector.cpp
src/ModuleBase/ModuleBase_WidgetMultiSelector.h
src/XGUI/XGUI_PropertyPanel.cpp

index 0c0dddece67bee7c6eda485f2c4ea15a589013e7..61c278353e192758d8cfa3dbb531a419a15f0d35 100644 (file)
@@ -200,6 +200,11 @@ Q_OBJECT
   /// The method called when widget is deactivated
   virtual void deactivate();
 
+  /// Opportunity to do something after the active widget of the property panel changed
+  virtual void updateAfterDeactivation() {}
+  /// Opportunity to do something after the active widget of the property panel changed
+  virtual void updateAfterActivation() {}
+
   /// The method called if widget should be activated always
   virtual bool needToBeActiated() { return false; }
 
index b3884b4966c655063793b2451e9e1f2c364ecd72..de224116ca7a132508a28ba0409bf51386f86631 100755 (executable)
@@ -150,7 +150,6 @@ void ModuleBase_WidgetMultiSelector::activateCustom()
   myWorkshop->module()->activateCustomPrs(myFeature,
                             ModuleBase_IModule::CustomizeHighlightedObjects, true);
   clearSelectedHistory();
-  myWorkshop->updateCommandStatus();
 }
 
 //********************************************************************
@@ -160,6 +159,19 @@ void ModuleBase_WidgetMultiSelector::deactivate()
 
   myWorkshop->module()->deactivateCustomPrs(ModuleBase_IModule::CustomizeHighlightedObjects, true);
   clearSelectedHistory();
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::updateAfterDeactivation()
+{
+  // restore previous Undo/Redo workshop state
+  myWorkshop->updateCommandStatus();
+}
+
+//********************************************************************
+void ModuleBase_WidgetMultiSelector::updateAfterActivation()
+{
+  // fill Undo/Redo actions with current information
   myWorkshop->updateCommandStatus();
 }
 
@@ -331,13 +343,6 @@ bool ModuleBase_WidgetMultiSelector::processAction(ModuleBase_ActionType theActi
   }
 }
 
-//********************************************************************
-void ModuleBase_WidgetMultiSelector::updateSelectionModesAndFilters(bool toActivate)
-{
-  myWorkshop->updateCommandStatus(); // update enable state of Undo/Redo application actions
-  ModuleBase_WidgetSelector::updateSelectionModesAndFilters(toActivate);
-}
-
 //********************************************************************
 bool ModuleBase_WidgetMultiSelector::isValidSelectionCustom(const ModuleBase_ViewerPrsPtr& thePrs)
 {
index 2ea07f58e73b52ae27a88cc8d079036e572a1093..f4a155981fc69e822da0d61539aa1b1a0d79eebf 100755 (executable)
@@ -75,6 +75,12 @@ class MODULEBASE_EXPORT ModuleBase_WidgetMultiSelector : public ModuleBase_Widge
   /// The methiod called when widget is deactivated
   virtual void deactivate();
 
+  /// Update Undo/Redo actions state
+  virtual void updateAfterDeactivation();
+
+  /// Update Undo/Redo actions state
+  virtual void updateAfterActivation();
+
   /// Set the given wrapped value to the current widget
   /// This value should be processed in the widget according to the needs
   /// \param theValues the wrapped selection values
@@ -95,9 +101,6 @@ class MODULEBASE_EXPORT ModuleBase_WidgetMultiSelector : public ModuleBase_Widge
   virtual bool processAction(ModuleBase_ActionType theActionType,
                              const ActionParamPtr& theParam = ActionParamPtr());
 
-  /// Activate or deactivate selection and selection filters
-  virtual void updateSelectionModesAndFilters(bool toActivate);
-
   /// Checks the widget validity. By default, it returns true.
   /// \param thePrs a selected presentation in the view
   /// \return a boolean value
index 737027b35aafce7b6bdc1a9fab0d220722499f34..7c5ac6ed49c36acab6ce5be9dfb80dbca368ca30 100755 (executable)
@@ -474,16 +474,19 @@ bool XGUI_PropertyPanel::setActiveWidget(ModuleBase_ModelWidget* theWidget, cons
     return false;
   }
   std::string aPreviosAttributeID;
+  ModuleBase_ModelWidget* aDeactivatedWidget = NULL, *anActivatedWidget = NULL;
   if(myActiveWidget) {
     aPreviosAttributeID = myActiveWidget->attributeID();
     myActiveWidget->processValueState();
     myActiveWidget->deactivate();
     myActiveWidget->setHighlighted(false);
+    aDeactivatedWidget = myActiveWidget;
   }
   if(theWidget) {
     emit beforeWidgetActivated(theWidget);
     theWidget->setHighlighted(true);
     theWidget->activate();
+    anActivatedWidget = theWidget;
   }
   myActiveWidget = theWidget;
 
@@ -505,6 +508,11 @@ bool XGUI_PropertyPanel::setActiveWidget(ModuleBase_ModelWidget* theWidget, cons
   myOperationMgr->workshop()->selectionActivate()->updateSelectionModes();
   myOperationMgr->workshop()->selectionActivate()->updateSelectionFilters();
 
+  if (aDeactivatedWidget)
+    aDeactivatedWidget->updateAfterDeactivation();
+  if (anActivatedWidget)
+    anActivatedWidget->updateAfterActivation();
+
   if (!anIsNoMoreWidgets && myActiveWidget)
   {
     // restore widget selection should be done after selection modes of widget activating