X-Git-Url: http://git.salome-platform.org/gitweb/?a=blobdiff_plain;f=src%2FModuleBase%2FModuleBase_WidgetFactory.cpp;h=bd45e4ee04ae26eabd8b8a42cbde496e3f80423b;hb=f40895b4d881810ef7d19c27ce6e952d72353d2c;hp=9437d5de6d5f1bf32588b65e32e4606539f0cc16;hpb=6df60c642d0427e2cb42bd29e2c64d4e5dbdaee4;p=modules%2Fshaper.git diff --git a/src/ModuleBase/ModuleBase_WidgetFactory.cpp b/src/ModuleBase/ModuleBase_WidgetFactory.cpp index 9437d5de6..bd45e4ee0 100644 --- a/src/ModuleBase/ModuleBase_WidgetFactory.cpp +++ b/src/ModuleBase/ModuleBase_WidgetFactory.cpp @@ -7,11 +7,28 @@ #include -#include -#include - #include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + #include #include @@ -32,35 +49,41 @@ #include #include -ModuleBase_WidgetFactory::ModuleBase_WidgetFactory(ModuleBase_Operation* theOperation) - : myOperation(theOperation) +ModuleBase_WidgetFactory::ModuleBase_WidgetFactory(const std::string& theXmlRepresentation, + ModuleBase_IWorkshop* theWorkshop) + : myWorkshop(theWorkshop) { - QString aXml = myOperation->getDescription()->xmlRepresentation(); - myWidgetApi = new Config_WidgetAPI(aXml.toStdString()); + myWidgetApi = new Config_WidgetAPI(theXmlRepresentation); } ModuleBase_WidgetFactory::~ModuleBase_WidgetFactory() { + delete myWidgetApi; } void ModuleBase_WidgetFactory::createWidget(QWidget* theParent) { + myParentId = myWidgetApi->widgetId(); if (!myWidgetApi->toChildWidget()) return; QVBoxLayout* aWidgetLay = new QVBoxLayout(theParent); - aWidgetLay->setContentsMargins(2, 2, 2, 2); - do { //Iterate over each node + do { //Iterate over each node std::string aWdgType = myWidgetApi->widgetType(); //Create a widget (doublevalue, groupbox, toolbox, etc. QWidget* aWidget = createWidgetByType(aWdgType, theParent); if (aWidget) { - aWidgetLay->addWidget(aWidget); + if (!myWidgetApi->getBooleanAttribute(ATTRIBUTE_INTERNAL, false)) { + aWidgetLay->addWidget(aWidget); + } else { + aWidget->setVisible(false); + } } if (myWidgetApi->isContainerWidget()) { //if current widget is groupbox (container) process it's children recursively QString aGroupName = qs(myWidgetApi->getProperty(CONTAINER_PAGE_NAME)); createWidget(aWidget); + ModuleBase_Tools::adjustMargins(aWidget); QGroupBox* aGrBox = qobject_cast(aWidget); aGrBox->setTitle(aGroupName); } @@ -71,17 +94,18 @@ void ModuleBase_WidgetFactory::createWidget(QWidget* theParent) do { QString aPageName = qs(myWidgetApi->getProperty(CONTAINER_PAGE_NAME)); QWidget* aPage = new QWidget(aWidget); + ModuleBase_Tools::adjustMargins(aPage); createWidget(aPage); if (aWdgType == WDG_SWITCH) { ModuleBase_WidgetSwitch* aSwitch = qobject_cast(aWidget); aSwitch->addPage(aPage, aPageName); - } else if (aWdgType == WDG_TOOLBOX){ + } else if (aWdgType == WDG_TOOLBOX) { QToolBox* aToolbox = qobject_cast(aWidget); aToolbox->addItem(aPage, aPageName); } - } while(myWidgetApi->toNextWidget()); + } while (myWidgetApi->toNextWidget()); } - } while(myWidgetApi->toNextWidget()); + } while (myWidgetApi->toNextWidget()); theParent->setLayout(aWidgetLay); } @@ -90,6 +114,7 @@ QWidget* ModuleBase_WidgetFactory::labelControl(QWidget* theParent) QWidget* result = new QWidget(theParent); QVBoxLayout* aLabelLay = new QVBoxLayout(result); QLabel* aLabel = new QLabel(result); + aLabel->setWordWrap(true); aLabel->setText(qs(myWidgetApi->getProperty(INFO_WDG_TEXT))); aLabel->setToolTip(qs(myWidgetApi->getProperty(INFO_WDG_TOOLTIP))); aLabelLay->addWidget(aLabel); @@ -98,23 +123,81 @@ QWidget* ModuleBase_WidgetFactory::labelControl(QWidget* theParent) return result; } -QWidget* ModuleBase_WidgetFactory::createWidgetByType(const std::string& theType, QWidget* theParent) +void ModuleBase_WidgetFactory::processAttributes() +{ + // register that this attribute in feature is not obligatory for the feature execution + // so, it is not needed for the standard validation mechanism + bool isObligatory = true; + bool isConcealment = false; + if( myWidgetApi ){ + isObligatory = myWidgetApi->getBooleanAttribute(ATTRIBUTE_OBLIGATORY, true); + isConcealment = myWidgetApi->getBooleanAttribute(ATTRIBUTE_CONCEALMENT, false); + } + boost::shared_ptr aSession = ModelAPI_Session::get(); + if (!isObligatory) { + aSession->validators()->registerNotObligatory(myParentId, myWidgetApi->widgetId()); + } + if(isConcealment) { + aSession->validators()->registerConcealment(myParentId, myWidgetApi->widgetId()); + } +} + +QWidget* ModuleBase_WidgetFactory::createWidgetByType(const std::string& theType, + QWidget* theParent) { QWidget* result = NULL; if (theType == WDG_DOUBLEVALUE) { - result = doubleSpinBoxControl(); + result = doubleSpinBoxControl(theParent); + } else if (theType == WDG_INFO) { result = labelControl(theParent); - } - else if (theType == WDG_POINT_SELECTOR) { + + } else if (theType == WDG_SHAPE_SELECTOR) { + result = shapeSelectorControl(theParent); + + } else if (theType == WDG_BOOLVALUE) { + result = booleanControl(theParent); + + } else if (theType == WDG_POINT_SELECTOR) { result = pointSelectorControl(theParent); - } - else if (myWidgetApi->isContainerWidget() || myWidgetApi->isPagedWidget()) { + + } else if (theType == WDG_FEATURE_SELECTOR) { + result = featureSelectorControl(theParent); + + } else if (theType == WDG_FEATURE_OR_ATTRIBUTE_SELECTOR) { + result = featureOrAttributeSelectorControl(theParent); + + } else if (theType == WDG_DOUBLEVALUE_EDITOR) { + result = doubleValueEditor(theParent); + + } else if (theType == WDG_POINT2D_DISTANCE) { + result = point2dDistanceControl(theParent); + + } else if (theType == WDG_FILE_SELECTOR) { + result = fileSelectorControl(theParent); + + } else if (theType == WDG_CHOICE) { + result = choiceControl(theParent); + + } else if (theType == WDG_STRINGVALUE) { + result = lineEditControl(theParent); + + } else if (theType == WDG_MULTISELECTOR) { + result = multiSelectorControl(theParent); + + } else if (myWidgetApi->isContainerWidget() || myWidgetApi->isPagedWidget()) { result = createContainer(theType, theParent); - } + } else { + result = myWorkshop->module()->createWidgetByType(theType, theParent, myWidgetApi, + myModelWidgets); #ifdef _DEBUG - else { qDebug() << "ModuleBase_WidgetFactory::fillWidget: find bad widget type"; } + if (!result) {qDebug("ModuleBase_WidgetFactory::fillWidget: find bad widget type");} #endif + } + if (result) { + processAttributes(); + } + return result; } @@ -133,80 +216,105 @@ QWidget* ModuleBase_WidgetFactory::createContainer(const std::string& theType, Q result = NULL; } #ifdef _DEBUG - else { qDebug() << "ModuleBase_WidgetFactory::fillWidget: find bad container type"; } + else {qDebug() << "ModuleBase_WidgetFactory::fillWidget: find bad container type";} #endif return result; } -QWidget* ModuleBase_WidgetFactory::doubleSpinBoxControl() -{ - QWidget* result = new QWidget(); - QHBoxLayout* aControlLay = new QHBoxLayout(result); - aControlLay->setContentsMargins(0, 0, 0, 0); - QString aLabelText = qs(myWidgetApi->widgetLabel()); - QString aLabelIcon = qs(myWidgetApi->widgetIcon()); - QLabel* aLabel = new QLabel(aLabelText); - aLabel->setPixmap(QPixmap(aLabelIcon)); - - aControlLay->addWidget(aLabel); - QDoubleSpinBox* aBox = new QDoubleSpinBox(result); - QString anObjName = QString::fromStdString(myWidgetApi->widgetId()); - aBox->setObjectName(anObjName); - bool isOk = false; - std::string aProp = myWidgetApi->getProperty(DOUBLE_WDG_MIN); - double aMinVal = qs(aProp).toDouble(&isOk); - if (isOk) { - aBox->setMinimum(aMinVal); - } else { - aBox->setMinimum(-DBL_MAX); - } - aProp = myWidgetApi->getProperty(DOUBLE_WDG_MAX); - double aMaxVal = qs(aProp).toDouble(&isOk); - if (isOk) { - aBox->setMaximum(aMaxVal); - } else { - aBox->setMaximum(DBL_MAX); - } - aProp = myWidgetApi->getProperty(DOUBLE_WDG_STEP); - double aStepVal = qs(aProp).toDouble(&isOk); - if (isOk) { - aBox->setSingleStep(aStepVal); - } - aProp = myWidgetApi->getProperty(DOUBLE_WDG_DFLT); - double aDefVal = qs(aProp).toDouble(&isOk); - if (isOk) { - aBox->setValue(aDefVal); - } - QString aTTip = qs(myWidgetApi->widgetTooltip()); - aBox->setToolTip(aTTip); - aControlLay->addWidget(aBox); - aControlLay->setStretch(1, 1); - result->setLayout(aControlLay); - connectWidget(aBox, WDG_DOUBLEVALUE); - return result; +QWidget* ModuleBase_WidgetFactory::doubleSpinBoxControl(QWidget* theParent) +{ + ModuleBase_WidgetDoubleValue* aDblWgt = + new ModuleBase_WidgetDoubleValue(theParent, myWidgetApi, myParentId); + myModelWidgets.append(aDblWgt); + return aDblWgt->getControl(); } QWidget* ModuleBase_WidgetFactory::pointSelectorControl(QWidget* theParent) { - ModuleBase_WidgetPoint2D* aWidget = new ModuleBase_WidgetPoint2D(theParent, - qs(myWidgetApi->getProperty(CONTAINER_PAGE_NAME)), myWidgetApi->widgetId()); - connectWidget(aWidget, WDG_POINT_SELECTOR); + ModuleBase_WidgetPoint2D* aWidget = + new ModuleBase_WidgetPoint2D(theParent, myWidgetApi,myParentId); + myModelWidgets.append(aWidget); return aWidget->getControl(); } -bool ModuleBase_WidgetFactory::connectWidget(QObject* theWidget, const QString& theType) +QWidget* ModuleBase_WidgetFactory::featureSelectorControl(QWidget* theParent) { - bool result = false; - if (theType == WDG_DOUBLEVALUE) { - result = QObject::connect(theWidget, SIGNAL(valueChanged(double)), - myOperation, SLOT(storeReal(double))); - } - if (theType == WDG_POINT_SELECTOR) { - ModuleBase_WidgetCustom* aCustom = dynamic_cast(theWidget); - result = QObject::connect(aCustom, SIGNAL(valuesChanged()), - myOperation, SLOT(storeCustomValue())); - } - return result; + ModuleBase_WidgetFeature* aWidget = + new ModuleBase_WidgetFeature(theParent, myWidgetApi,myParentId); + myModelWidgets.append(aWidget); + return aWidget->getControl(); +} + +QWidget* ModuleBase_WidgetFactory::featureOrAttributeSelectorControl(QWidget* theParent) +{ + ModuleBase_WidgetFeatureOrAttribute* aWidget = + new ModuleBase_WidgetFeatureOrAttribute(theParent, myWidgetApi, myParentId); + myModelWidgets.append(aWidget); + return aWidget->getControl(); +} + +QWidget* ModuleBase_WidgetFactory::doubleValueEditor(QWidget* theParent) +{ + ModuleBase_WidgetEditor* aWidget = + new ModuleBase_WidgetEditor(theParent, myWidgetApi, myParentId); + myModelWidgets.append(aWidget); + return aWidget->getControl(); +} + +QWidget* ModuleBase_WidgetFactory::shapeSelectorControl(QWidget* theParent) +{ + ModuleBase_WidgetShapeSelector* aSelector = + new ModuleBase_WidgetShapeSelector(theParent, myWorkshop, myWidgetApi, myParentId); + myModelWidgets.append(aSelector); + return aSelector->getControl(); +} + +QWidget* ModuleBase_WidgetFactory::booleanControl(QWidget* theParent) +{ + ModuleBase_WidgetBoolValue* aBoolWgt = + new ModuleBase_WidgetBoolValue(theParent, myWidgetApi, myParentId); + myModelWidgets.append(aBoolWgt); + return aBoolWgt->getControl(); +} + +QWidget* ModuleBase_WidgetFactory::point2dDistanceControl(QWidget* theParent) +{ + ModuleBase_WidgetPoint2dDistance* aDistWgt = + new ModuleBase_WidgetPoint2dDistance(theParent, myWidgetApi, myParentId); + myModelWidgets.append(aDistWgt); + return aDistWgt->getControl(); +} + +QWidget* ModuleBase_WidgetFactory::fileSelectorControl(QWidget* theParent) +{ + ModuleBase_WidgetFileSelector* aFileSelectorWgt = + new ModuleBase_WidgetFileSelector(theParent, myWidgetApi, myParentId); + myModelWidgets.append(aFileSelectorWgt); + return aFileSelectorWgt->getControl(); +} + +QWidget* ModuleBase_WidgetFactory::choiceControl(QWidget* theParent) +{ + ModuleBase_WidgetChoice* aChoiceWgt = + new ModuleBase_WidgetChoice(theParent, myWidgetApi,myParentId); + myModelWidgets.append(aChoiceWgt); + return aChoiceWgt->getControl(); +} + +QWidget* ModuleBase_WidgetFactory::lineEditControl(QWidget* theParent) +{ + ModuleBase_WidgetLineEdit* aLineEditWgt = + new ModuleBase_WidgetLineEdit(theParent, myWidgetApi,myParentId); + myModelWidgets.append(aLineEditWgt); + return aLineEditWgt->getControl(); +} + +QWidget* ModuleBase_WidgetFactory::multiSelectorControl(QWidget* theParent) +{ + ModuleBase_WidgetMultiSelector* aMultiselectorWgt = + new ModuleBase_WidgetMultiSelector(theParent, myWorkshop, myWidgetApi,myParentId); + myModelWidgets.append(aMultiselectorWgt); + return aMultiselectorWgt->getControl(); } QString ModuleBase_WidgetFactory::qs(const std::string& theStdString) const