-// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2019 CEA/DEN, EDF R&D
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
-// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
-// See http://www.salome-platform.org/ or
-// email : webmaster.salome@opencascade.com<mailto:webmaster.salome@opencascade.com>
+// See http://www.salome-platform.org/ or email : 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>
#include <ModuleBase_WidgetFactory.h>
#include <ModuleBase_OperationDescription.h>
#include <ModuleBase_Events.h>
+#include <ModuleBase_IModule.h>
#include <ModuleBase_IWorkshop.h>
#include <Events_Loop.h>
: ModuleBase_IPropertyPanel(theParent),
myActiveWidget(NULL),
myPreselectionWidget(NULL),
+ myInternalActiveWidget(NULL),
myPanelPage(NULL),
myOperationMgr(theMgr)
{
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
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
void XGUI_PropertyPanel::setModelWidgets(const QList<ModuleBase_ModelWidget*>& theWidgets)
{
myWidgets = theWidgets;
- if (theWidgets.empty()) return;
+ if (theWidgets.empty())
+ return;
foreach (ModuleBase_ModelWidget* aWidget, theWidgets) {
connect(aWidget, SIGNAL(focusInWidget(ModuleBase_ModelWidget*)),
this, SLOT(onFocusInWidget(ModuleBase_ModelWidget*)));
this, SIGNAL(keyReleased(QObject*, QKeyEvent*)));
connect(aWidget, SIGNAL(enterClicked(QObject*)),
this, SIGNAL(enterClicked(QObject*)));
-
}
}
}
std::shared_ptr<Config_FeatureMessage> aFeatureInfo =
myOperationMgr->workshop()->featureInfo(theFeature->getKind().c_str());
- findButton(PROP_PANEL_OK_PLUS)->setVisible(aFeatureInfo->isApplyContinue());
+ if (aFeatureInfo.get())
+ findButton(PROP_PANEL_OK_PLUS)->setVisible(aFeatureInfo->isApplyContinue());
+}
+
+ModuleBase_ModelWidget* XGUI_PropertyPanel::activeWidget(const bool isUseCustomWidget) const
+{
+ if (isUseCustomWidget && myInternalActiveWidget)
+ return myInternalActiveWidget;
+
+ return myActiveWidget;
}
void XGUI_PropertyPanel::activateNextWidget(ModuleBase_ModelWidget* theWidget)
#endif
ModuleBase_ModelWidget* aFocusMWidget = ModuleBase_ModelWidget::findModelWidget(this,
aFocusWidget);
- if (aFocusMWidget)
- aFocusMWidget->setHighlighted(false);
+ //if (aFocusMWidget)
+ // aFocusMWidget->setHighlighted(false);
QWidget* aNewFocusWidget = 0;
if (aFocusWidget) {
bool isFirstControl = !theIsNext;
QWidget* aLastFocusControl = myActiveWidget->getControlAcceptingFocus(isFirstControl);
if (aFocusWidget == aLastFocusControl) {
- setActiveWidget(NULL);
+ setActiveWidget(NULL, false);
}
}
ModuleBase_ModelWidget* aNewFocusMWidget = ModuleBase_ModelWidget::findModelWidget(this,
aNewFocusWidget);
- if (aNewFocusMWidget)
+ if (aNewFocusMWidget) {
+ if (aFocusMWidget) {
+ aFocusMWidget->setHighlighted(false);
+ }
aNewFocusMWidget->emitFocusInWidget();
- isChangedFocus = true;
+ isChangedFocus = true;
+ }
}
return isChangedFocus;
}
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) {
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;
+
#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 aHasMoreWidgets = true;
+ if (isEmitSignal) {
+ //emit widgetActivated(myActiveWidget);
+ if (!myActiveWidget && !isEditingMode()) {
+ aHasMoreWidgets = false;
+ emit noMoreWidgets(aPreviosAttributeID);
+ }
+ }
+ if (myActiveWidget)
+ emit propertyPanelActivated();
+ else
+ emit propertyPanelDeactivated();
+ myOperationMgr->workshop()->selectionActivate()->updateSelectionModes();
+ myOperationMgr->workshop()->selectionActivate()->updateSelectionFilters();
+
+ if (aHasMoreWidgets && aDeactivatedWidget)
+ aDeactivatedWidget->updateAfterDeactivation();
+ if (aHasMoreWidgets && anActivatedWidget)
+ anActivatedWidget->updateAfterActivation();
+
+ if (aHasMoreWidgets && 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;
}
}
}
+void XGUI_PropertyPanel::onAcceptData()
+{
+ foreach (ModuleBase_ModelWidget* aWidget, myWidgets) {
+ aWidget->onFeatureAccepted();
+ }
+}
+
+void XGUI_PropertyPanel::setInternalActiveWidget(ModuleBase_ModelWidget* theWidget)
+{
+ if (theWidget)
+ {
+ myInternalActiveWidget = theWidget;
+ emit propertyPanelActivated();
+ }
+ else
+ {
+ if (myInternalActiveWidget)
+ {
+ delete myInternalActiveWidget;
+ myInternalActiveWidget = 0;
+ }
+ emit propertyPanelDeactivated();
+ }
+ myOperationMgr->workshop()->selectionActivate()->updateSelectionModes();
+ myOperationMgr->workshop()->selectionActivate()->updateSelectionFilters();
+}
+
ModuleBase_ModelWidget* XGUI_PropertyPanel::preselectionWidget() const
{
return myPreselectionWidget;