Salome HOME
Adjust unit tests
[modules/shaper.git] / src / XGUI / XGUI_PropertyPanel.cpp
index bdc4792593ea8b0c9439af775711c4f4daa76d9b..737027b35aafce7b6bdc1a9fab0d220722499f34 100755 (executable)
 // email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
 //
 
-#include <XGUI_PropertyPanel.h>
 #include <XGUI_ActionsMgr.h>
+#include <XGUI_ActiveControlMgr.h>
+#include <XGUI_SelectionActivate.h>
+#include <XGUI_ActiveControlSelector.h>
+#include <XGUI_PropertyPanel.h>
+#include <XGUI_PropertyPanelSelector.h>
 #include <XGUI_OperationMgr.h>
+#include <XGUI_Tools.h>
+#include <XGUI_Workshop.h>
+
 //#include <AppElements_Constants.h>
 #include <ModuleBase_WidgetMultiSelector.h>
 #include <ModuleBase_Tools.h>
@@ -123,6 +130,10 @@ void XGUI_PropertyPanel::cleanContent()
   if (myActiveWidget)
     myActiveWidget->deactivate();
 
+  XGUI_ActiveControlSelector* aPPSelector = XGUI_Tools::workshop(myOperationMgr->workshop())->
+    activeControlMgr()->getSelector(XGUI_PropertyPanelSelector::Type());
+  aPPSelector->reset(); // it removes need to be updated widget link
+
   /// as the widgets are deleted later, it is important that the signals
   /// of these widgets are not processed. An example of the error is issue 986.
   /// In the given case, the property panel is firstly filled by new widgets
@@ -141,6 +152,9 @@ void XGUI_PropertyPanel::cleanContent()
   myWidgets.clear();
   myPanelPage->clearPage();
   myActiveWidget = NULL;
+  emit propertyPanelDeactivated();
+  myOperationMgr->workshop()->selectionActivate()->updateSelectionModes();
+  myOperationMgr->workshop()->selectionActivate()->updateSelectionFilters();
 #ifdef DEBUG_ACTIVE_WIDGET
   std::cout << "myActiveWidget = NULL" << std::endl;
 #endif
@@ -422,7 +436,7 @@ bool XGUI_PropertyPanel::focusNextPrevChild(bool theIsNext)
       bool isFirstControl = !theIsNext;
       QWidget* aLastFocusControl = myActiveWidget->getControlAcceptingFocus(isFirstControl);
       if (aFocusWidget == aLastFocusControl) {
-        setActiveWidget(NULL);
+        setActiveWidget(NULL, false);
       }
     }
 
@@ -450,15 +464,10 @@ void XGUI_PropertyPanel::activateWidget(ModuleBase_ModelWidget* theWidget, const
     aPreviosAttributeID = myActiveWidget->attributeID();
 
   // Avoid activation of already actve widget. It could happen on focusIn event many times
-  if (setActiveWidget(theWidget) && theEmitSignal) {
-    emit widgetActivated(myActiveWidget);
-    if (!myActiveWidget && !isEditingMode()) {
-      emit noMoreWidgets(aPreviosAttributeID);
-    }
-  }
+  setActiveWidget(theWidget, theEmitSignal);
 }
 
-bool XGUI_PropertyPanel::setActiveWidget(ModuleBase_ModelWidget* theWidget)
+bool XGUI_PropertyPanel::setActiveWidget(ModuleBase_ModelWidget* theWidget, const bool isEmitSignal)
 {
   // Avoid activation of already actve widget. It could happen on focusIn event many times
   if (theWidget == myActiveWidget) {
@@ -477,12 +486,31 @@ bool XGUI_PropertyPanel::setActiveWidget(ModuleBase_ModelWidget* theWidget)
     theWidget->activate();
   }
   myActiveWidget = theWidget;
+
 #ifdef DEBUG_ACTIVE_WIDGET
   std::cout << "myActiveWidget = " << (theWidget ? theWidget->context().c_str() : "") << std::endl;
 #endif
-  static Events_ID anEvent = Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION);
-  Events_Loop::loop()->flush(anEvent);
-
+  bool anIsNoMoreWidgets = false;
+  if (isEmitSignal) {
+    //emit widgetActivated(myActiveWidget);
+    if (!myActiveWidget && !isEditingMode()) {
+      anIsNoMoreWidgets = true;
+      emit noMoreWidgets(aPreviosAttributeID);
+    }
+  }
+  if (myActiveWidget)
+    emit propertyPanelActivated();
+  else
+    emit propertyPanelDeactivated();
+  myOperationMgr->workshop()->selectionActivate()->updateSelectionModes();
+  myOperationMgr->workshop()->selectionActivate()->updateSelectionFilters();
+
+  if (!anIsNoMoreWidgets && myActiveWidget)
+  {
+    // restore widget selection should be done after selection modes of widget activating
+    static Events_ID anEvent = Events_Loop::eventByName(EVENT_UPDATE_BY_WIDGET_SELECTION);
+    Events_Loop::loop()->flush(anEvent);
+  }
   return true;
 }