-// Copyright (C) 2014-2017 CEA/DEN, EDF R&D
+// Copyright (C) 2014-2020 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>
#include <QGridLayout>
#include <QWidget>
#include <QAction>
+#include <QScrollArea>
#ifdef _DEBUG
#include <iostream>
XGUI_PropertyPanel::XGUI_PropertyPanel(QWidget* theParent, XGUI_OperationMgr* theMgr)
: ModuleBase_IPropertyPanel(theParent),
+ myPanelPage(NULL),
myActiveWidget(NULL),
myPreselectionWidget(NULL),
- myPanelPage(NULL),
+ myInternalActiveWidget(NULL),
myOperationMgr(theMgr)
{
setWindowTitle(tr("Property Panel"));
- QAction* aViewAct = toggleViewAction();
+ MAYBE_UNUSED QAction* aViewAct = toggleViewAction();
setObjectName(PROP_PANEL);
setStyleSheet("::title { position: relative; padding-left: 5px; text-align: left center }");
QStringList aBtnNames;
aBtnNames << QString(PROP_PANEL_HELP)
- << QString(PROP_PANEL_OK)
- << QString(PROP_PANEL_OK_PLUS)
- << QString(PROP_PANEL_CANCEL);
+ << QString(PROP_PANEL_OK)
+ << QString(PROP_PANEL_OK_PLUS)
+ << QString(PROP_PANEL_CANCEL);
foreach(QString eachBtnName, aBtnNames) {
QToolButton* aBtn = new QToolButton(aFrm);
aBtn->setObjectName(eachBtnName);
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();
+ // VSV: It seems that this code is not necessary:
+ // it is called on propertyPanelDeactivated() event
+ //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*)));
-
}
}
+
const QList<ModuleBase_ModelWidget*>& XGUI_PropertyPanel::modelWidgets() const
{
return myWidgets;
eachWidget->restoreValue();
}
// the repaint is used here to immediately react in GUI to the values change.
- repaint();
+ update();
}
void XGUI_PropertyPanel::createContentPanel(FeaturePtr theFeature)
if (theFeature->isAction() || !theFeature->data())
return;
+ ModuleBase_Operation* anOperation = myOperationMgr->currentOperation();
if (myWidgets.empty()) {
- ModuleBase_Operation* anOperation = myOperationMgr->currentOperation();
QString aXmlRepr = anOperation->getDescription()->xmlRepresentation();
ModuleBase_WidgetFactory aFactory(aXmlRepr.toStdString(), myOperationMgr->workshop());
- aFactory.createPanel(contentWidget(), theFeature);
- /// Apply button should be update if the feature was modified by the panel
+ ModuleBase_PageBase* aPage = contentWidget();
+ aFactory.createPanel(aPage, theFeature);
+ // update model widgets if exist
+ setModelWidgets(aPage->modelWidgets());
+ // Apply button should be update if the feature was modified by the panel
myOperationMgr->onValidateOperation();
}
- std::shared_ptr<Config_FeatureMessage> aFeatureInfo =
- myOperationMgr->workshop()->featureInfo(theFeature->getKind().c_str());
- findButton(PROP_PANEL_OK_PLUS)->setVisible(aFeatureInfo->isApplyContinue());
+ ModuleBase_OperationFeature* aFeatureOp =
+ dynamic_cast<ModuleBase_OperationFeature*>(anOperation);
+ if (aFeatureOp && (!aFeatureOp->isEditOperation()))
+ updateApplyPlusButton(theFeature);
+ else
+ findButton(PROP_PANEL_OK_PLUS)->setVisible(false);
+}
+
+void XGUI_PropertyPanel::updateApplyPlusButton(FeaturePtr theFeature)
+{
+ if (theFeature.get()) {
+ std::shared_ptr<Config_FeatureMessage> aFeatureInfo =
+ myOperationMgr->workshop()->featureInfo(theFeature->getKind().c_str());
+ if (aFeatureInfo.get()) {
+ findButton(PROP_PANEL_OK_PLUS)->setVisible(aFeatureInfo->isApplyContinue());
+ return;
+ }
+ }
+ findButton(PROP_PANEL_OK_PLUS)->setVisible(false);
+}
+
+ModuleBase_ModelWidget* XGUI_PropertyPanel::activeWidget(const bool isUseCustomWidget) const
+{
+ if (isUseCustomWidget && myInternalActiveWidget)
+ return myInternalActiveWidget;
+
+ return myActiveWidget;
}
void XGUI_PropertyPanel::activateNextWidget(ModuleBase_ModelWidget* theWidget)
}
}
else if (anItem->layout()) {
- QLayout* aLayout = anItem->layout();
- for (int i = 0, aCount = aLayout->count(); i < aCount; i++) {
- QLayoutItem* anItem = aLayout->itemAt(i);
- QWidget* aWidget = anItem ? anItem->widget() : 0;
- if (aWidget) {
- if (aWidget->isVisible()) {
- if (aWidget->focusPolicy() != Qt::NoFocus)
- theWidgets.append(aWidget);
- findDirectChildren(aWidget, theWidgets, false);
+ QLayout* anItemLayout = anItem->layout();
+ for (int it = 0, cnt = anItemLayout->count(); it < cnt; it++) {
+ QLayoutItem* aCurItem = anItemLayout->itemAt(it);
+ QWidget* aCurWidget = aCurItem ? aCurItem->widget() : 0;
+ if (aCurWidget) {
+ if (aCurWidget->isVisible()) {
+ if (aCurWidget->focusPolicy() != Qt::NoFocus)
+ theWidgets.append(aCurWidget);
+ findDirectChildren(aCurWidget, theWidgets, false);
}
}
else {
#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 != aNewFocusMWidget)) {
+ 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;