diff --git a/OMEdit/OMEditLIB/Element/Element.cpp b/OMEdit/OMEditLIB/Element/Element.cpp index 55d4a7f8ce4..e1ab995ec2b 100644 --- a/OMEdit/OMEditLIB/Element/Element.cpp +++ b/OMEdit/OMEditLIB/Element/Element.cpp @@ -3854,12 +3854,23 @@ void Element::showParameters() } pMainWindow->getStatusBar()->showMessage(tr("Opening %1 %2 parameters window").arg(mpLibraryTreeItem->getNameStructure()).arg(getName())); } - pMainWindow->getProgressBar()->setRange(0, 0); - pMainWindow->showProgressBar(); - ElementParameters *pElementParameters = new ElementParameters(this, pMainWindow); - pMainWindow->hideProgressBar(); - pMainWindow->getStatusBar()->clearMessage(); - pElementParameters->exec(); + + if (MainWindow::instance()->isNewApi()) { + pMainWindow->getProgressBar()->setRange(0, 0); + pMainWindow->showProgressBar(); + ElementParameters *pElementParameters = new ElementParameters(mpModelComponent, mpGraphicsView, isInheritedElement(), false, pMainWindow); + pMainWindow->hideProgressBar(); + pMainWindow->getStatusBar()->clearMessage(); + pElementParameters->exec(); + pElementParameters->deleteLater(); + } else { + pMainWindow->getProgressBar()->setRange(0, 0); + pMainWindow->showProgressBar(); + ElementParametersOld *pElementParametersOld = new ElementParametersOld(this, pMainWindow); + pMainWindow->hideProgressBar(); + pMainWindow->getStatusBar()->clearMessage(); + pElementParametersOld->exec(); + } } /*! diff --git a/OMEdit/OMEditLIB/Element/ElementProperties.cpp b/OMEdit/OMEditLIB/Element/ElementProperties.cpp index 63158631219..90bb6cac9a1 100644 --- a/OMEdit/OMEditLIB/Element/ElementProperties.cpp +++ b/OMEdit/OMEditLIB/Element/ElementProperties.cpp @@ -66,7 +66,7 @@ Parameter::Parameter(Element *pElement, bool showStartAttribute, QString tab, QS mpElement = pElement; mpModelInstanceComponent = 0; mTab = tab; - mGroupBox = groupBox; + mGroup = groupBox; mShowStartAttribute = showStartAttribute; mpNameLabel = new Label; mpFixedCheckBox = new FixedCheckBox; @@ -150,11 +150,12 @@ Parameter::Parameter(ModelInstance::Component *pComponent, ElementParameters *pE mpElementParameters = pElementParameters; const ModelInstance::DialogAnnotation dialogAnnotation = mpModelInstanceComponent->getAnnotation()->getDialogAnnotation(); mTab = dialogAnnotation.getTab(); - mGroupBox = dialogAnnotation.getGroup(); - mGroupBoxDefined = !mGroupBox.isEmpty(); + mGroup = dialogAnnotation.getGroup(); + mGroupDefined = !mGroup.isEmpty(); mEnable = dialogAnnotation.isEnabled(); mShowStartAttribute = dialogAnnotation.getShowStartAttribute(); - //mColorSelector = dialogAnnotation.getCol; + mShowStartAndFixed = mShowStartAttribute; + mColorSelector = dialogAnnotation.isColorSelector(); const ModelInstance::Selector loadSelector = dialogAnnotation.getLoadSelector(); mLoadSelectorFilter = loadSelector.getFilter(); mLoadSelectorCaption = loadSelector.getCaption(); @@ -167,20 +168,20 @@ Parameter::Parameter(ModelInstance::Component *pComponent, ElementParameters *pE } mConnectorSizing = dialogAnnotation.isConnectorSizing(); - QString start = "", fixed = ""; + QString start = ""; bool isParameter = (mpModelInstanceComponent->getVariability().compare(QStringLiteral("parameter")) == 0); - // If not a parameter then check for start and fixed bindings. See Modelica.Electrical.Analog.Basic.Resistor parameter R. + // If not a parameter then check for start modifier if (!isParameter && !mShowStartAttribute) { start = mpModelInstanceComponent->getModifier().getModifierValue(QStringList() << "start"); - fixed = mpModelInstanceComponent->getModifier().getModifierValue(QStringList() << "fixed"); - mShowStartAttribute = (!start.isEmpty() || !fixed.isEmpty()) ? true : false; + mShowStartAndFixed = !start.isEmpty(); } - - // if showStartAttribute true and group name is empty or Parameters then we should make group name Initialization - if (mShowStartAttribute && mGroupBox.isEmpty()) { - mGroupBox = "Initialization"; - } else if (mGroupBox.isEmpty() && (isParameter || mpModelInstanceComponent->getAnnotation()->hasDialogAnnotation() || mpModelInstanceComponent->getReplaceable()->isReplaceable())) { - mGroupBox = "Parameters"; + /* if start modifier or showStartAttribute and group name is empty then set group name to Initialization. + * else set group name to Parameters for actual parameters or elements that have dialog annotation or replaceable elements. + */ + if ((mShowStartAndFixed || mShowStartAttribute) && mGroup.isEmpty()) { + mGroup = "Initialization"; + } else if (mGroup.isEmpty() && (isParameter || mpModelInstanceComponent->getAnnotation()->hasDialogAnnotation() || mpModelInstanceComponent->getReplaceable()->isReplaceable())) { + mGroup = "Parameters"; } mpNameLabel = new Label; @@ -198,8 +199,12 @@ Parameter::Parameter(ModelInstance::Component *pComponent, ElementParameters *pE mValueType = Parameter::Enumeration; } else if (OptionsDialog::instance()->getGeneralSettingsPage()->getReplaceableSupport() && mpModelInstanceComponent->getReplaceable()->isReplaceable()) { // replaceable component or short element definition - if (mpModelInstanceComponent->getModel() && mpModelInstanceComponent->getModel()->isType()) { + if (mpModelInstanceComponent->getModel()) { mValueType = Parameter::ReplaceableClass; + mpModifyReplaceableButton = new QToolButton; + mpModifyReplaceableButton->setText("M"); + mpModifyReplaceableButton->setToolButtonStyle(Qt::ToolButtonTextOnly); + connect(mpModifyReplaceableButton, SIGNAL(clicked()), SLOT(modifyReplaceableButtonClicked())); } else { mValueType = Parameter::ReplaceableComponent; } @@ -266,9 +271,8 @@ Parameter::Parameter(ModelInstance::Component *pComponent, ElementParameters *pE } else { setValueWidget(mpModelInstanceComponent->getModifier().getValue(), true, mUnit); } - if (mShowStartAttribute) { + if (mShowStartAndFixed || mShowStartAttribute) { setValueWidget(start, true, mUnit); - setFixedState(fixed, true); } update(); } @@ -280,7 +284,7 @@ Parameter::Parameter(ModelInstance::Component *pComponent, ElementParameters *pE void Parameter::updateNameLabel() { if (MainWindow::instance()->isNewApi()) { - mpNameLabel->setText(mpModelInstanceComponent->getName() + (mShowStartAttribute ? ".start" : "")); + mpNameLabel->setText(mpModelInstanceComponent->getName() + (mShowStartAndFixed ? ".start" : "")); } else { mpNameLabel->setText(mpElement->getName() + (mShowStartAttribute ? ".start" : "")); } @@ -683,6 +687,24 @@ void Parameter::updateValueBinding(const FlatModelica::Expression expression) } } +void Parameter::modifyReplaceableButtonClicked() +{ + QString className = mpModelInstanceComponent->getType(); + qDebug() << className; + + MainWindow::instance()->getProgressBar()->setRange(0, 0); + MainWindow::instance()->showProgressBar(); + ElementParameters *pElementParameters = new ElementParameters(mpModelInstanceComponent, mpElementParameters->getGraphicsView(), + mpElementParameters->isInherited(), true, mpElementParameters); + MainWindow::instance()->hideProgressBar(); + MainWindow::instance()->getStatusBar()->clearMessage(); + if (pElementParameters->exec() == QDialog::Accepted) { + qDebug() << pElementParameters->getModification(); + setValueWidget(pElementParameters->getModification(), false, mUnit); + } + pElementParameters->deleteLater(); +} + /*! * \brief Parameter::fileSelectorButtonClicked * Slot activated when mpFileSelectorButton clicked SIGNAL is raised. @@ -972,16 +994,22 @@ QVBoxLayout *ParametersScrollArea::getLayout() */ /*! * \brief ElementParameters::ElementParameters - * \param pElement - pointer to Element + * \param pElement - pointer to ModelInstance::Element + * \param pGraphicsView + * \param className + * \param inherited * \param pParent */ -ElementParameters::ElementParameters(Element *pElement, QWidget *pParent) +ElementParameters::ElementParameters(ModelInstance::Component *pComponent, GraphicsView *pGraphicsView, bool inherited, bool nested, QWidget *pParent) : QDialog(pParent) { - QString className = pElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); - setWindowTitle(tr("%1 - %2 - %3 in %4").arg(Helper::applicationName).arg(tr("Element Parameters")).arg(pElement->getName()).arg(className)); - setAttribute(Qt::WA_DeleteOnClose); - mpElement = pElement; + const QString className = pGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure(); + setWindowTitle(tr("%1 - %2 - %3 in %4").arg(Helper::applicationName).arg(tr("Element Parameters")).arg(pComponent->getQualifiedName()).arg(className)); + mpElement = pComponent; + mpGraphicsView = pGraphicsView; + mInherited = inherited; + mNested = nested; + mModification.clear(); setUpDialog(); } @@ -1007,8 +1035,9 @@ void ElementParameters::updateParameters() } /*! - Creates the Dialog and set up all the controls with default values. - */ + * \brief ElementParameters::setUpDialog + * Creates the Dialog and set up all the controls with default values. + */ void ElementParameters::setUpDialog() { // heading label @@ -1021,7 +1050,7 @@ void ElementParameters::setUpDialog() mpComponentGroupBox = new QGroupBox(tr("Component")); // Component name mpComponentNameLabel = new Label(Helper::name); - mpComponentNameTextBox = new Label(mpElement->getName()); + mpComponentNameTextBox = new Label(mpElement->getQualifiedName()); mpComponentCommentLabel = new Label(Helper::comment); mpComponentCommentTextBox = new Label(mpElement->getComment()); QGridLayout *pComponentGroupBoxLayout = new QGridLayout; @@ -1035,22 +1064,13 @@ void ElementParameters::setUpDialog() mpComponentClassGroupBox = new QGroupBox(tr("Class")); // Component class name mpComponentClassNameLabel = new Label(Helper::path); - if (MainWindow::instance()->isNewApi()) { - mpComponentClassNameTextBox = new Label(mpElement->getModel()->getName()); - } else { - mpComponentClassNameTextBox = new Label(mpElement->getElementInfo()->getClassName()); - } + mpComponentClassNameTextBox = new Label(mpElement->getModel()->getName()); // Component comment mpComponentClassCommentLabel = new Label(Helper::comment); mpComponentClassCommentTextBox = new Label; mpComponentClassCommentTextBox->setTextFormat(Qt::RichText); - mpComponentClassCommentTextBox->setTextInteractionFlags(mpComponentClassCommentTextBox->textInteractionFlags() - | Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard); - if (mpElement->getLibraryTreeItem()) { - mpComponentClassCommentTextBox->setText(mpElement->getLibraryTreeItem()->mClassInformation.comment); - } else { - mpComponentClassCommentTextBox->setText(mpElement->getModel()->getComment()); - } + mpComponentClassCommentTextBox->setTextInteractionFlags(mpComponentClassCommentTextBox->textInteractionFlags() | Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard); + mpComponentClassCommentTextBox->setText(mpElement->getModel()->getComment()); connect(mpComponentClassCommentTextBox, SIGNAL(linkActivated(QString)), SLOT(commentLinkClicked(QString))); QGridLayout *pComponentClassGroupBoxLayout = new QGridLayout; pComponentClassGroupBoxLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); @@ -1070,32 +1090,16 @@ void ElementParameters::setUpDialog() pParametersScrollArea->addGroupBox(pInitializationGroupBox); mTabsMap.insert("General", mpParametersTabWidget->addTab(pParametersScrollArea, "General")); // create parameters tabs and groupboxes - if (MainWindow::instance()->isNewApi()) { - createTabsGroupBoxesAndParameters(mpElement->getModel()); - /* We append the actual Element's parameters first so that they appear first on the list. - * For that we use QList insert instead of append in ElementParameters::createTabsGroupBoxesAndParametersHelper() function. - * Modelica.Electrical.Analog.Basic.Resistor order is wrong if we don't use insert. - */ - createTabsGroupBoxesAndParametersHelper(mpElement->getModel(), true); - fetchElementExtendsModifiers(mpElement->getModel()); - fetchElementModifiers(); - fetchClassExtendsModifiers(); - } else { - createTabsGroupBoxesAndParameters(mpElement->getLibraryTreeItem()); - /* We append the actual Element's parameters first so that they appear first on the list. - * For that we use QList insert instead of append in ElementParameters::createTabsGroupBoxesAndParametersHelper() function. - * Modelica.Electrical.Analog.Basic.Resistor order is wrong if we don't use insert. - */ - createTabsGroupBoxesAndParametersHelper(mpElement->getLibraryTreeItem(), true); - fetchElementModifiers(); - fetchElementExtendsModifiers(); - } + createTabsGroupBoxesAndParameters(mpElement->getModel()); + fetchElementExtendsModifiers(mpElement->getModel()); + fetchElementModifiers(); + fetchClassExtendsModifiers(); foreach (Parameter *pParameter, mParametersList) { ParametersScrollArea *pParametersScrollArea = qobject_cast(mpParametersTabWidget->widget(mTabsMap.value(pParameter->getTab()))); if (pParametersScrollArea) { - if (!pParameter->getGroupBox().isEmpty()) { - GroupBox *pGroupBox = pParametersScrollArea->getGroupBox(pParameter->getGroupBox()); + if (!pParameter->getGroup().isEmpty()) { + GroupBox *pGroupBox = pParametersScrollArea->getGroupBox(pParameter->getGroup()); if (pGroupBox) { /* We hide the groupbox when we create it. Show the groupbox now since it has a parameter. */ pGroupBox->show(); @@ -1104,12 +1108,19 @@ void ElementParameters::setUpDialog() int columnIndex = 0; pParameter->updateNameLabel(); pGroupBoxGridLayout->addWidget(pParameter->getNameLabel(), layoutIndex, columnIndex++); - if (pParameter->isShowStartAttribute()) { + if (pParameter->isShowStartAndFixed()) { pGroupBoxGridLayout->addWidget(pParameter->getFixedCheckBox(), layoutIndex, columnIndex++); } else { pGroupBoxGridLayout->addItem(new QSpacerItem(1, 1), layoutIndex, columnIndex++); } pGroupBoxGridLayout->addWidget(pParameter->getValueWidget(), layoutIndex, columnIndex++); + +// if (pParameter->getModifyReplaceableButton()) { +// pGroupBoxGridLayout->addWidget(pParameter->getModifyReplaceableButton(), layoutIndex, columnIndex++); +// } else { +// pGroupBoxGridLayout->addItem(new QSpacerItem(1, 1), layoutIndex, columnIndex++); +// } + if (pParameter->getLoadSelectorFilter().compare("-") != 0 || pParameter->getLoadSelectorCaption().compare("-") != 0 || pParameter->getSaveSelectorFilter().compare("-") != 0 || pParameter->getSaveSelectorCaption().compare("-") != 0) { pGroupBoxGridLayout->addWidget(pParameter->getFileSelectorButton(), layoutIndex, columnIndex++); @@ -1168,9 +1179,7 @@ void ElementParameters::setUpDialog() mpOkButton = new QPushButton(Helper::ok); mpOkButton->setAutoDefault(true); connect(mpOkButton, SIGNAL(clicked()), this, SLOT(updateElementParameters())); - if (mpElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->isSystemLibrary() || mpElement->getGraphicsView()->isVisualizationView()) { - mpOkButton->setDisabled(true); - } + mpOkButton->setDisabled(mpGraphicsView->getModelWidget()->getLibraryTreeItem()->isSystemLibrary() || mpGraphicsView->isVisualizationView()); mpCancelButton = new QPushButton(Helper::cancel); mpCancelButton->setAutoDefault(false); connect(mpCancelButton, SIGNAL(clicked()), this, SLOT(reject())); @@ -1188,222 +1197,10 @@ void ElementParameters::setUpDialog() /*! * \brief ElementParameters::createTabsGroupBoxesAndParameters - * Loops over the inherited classes of the Element. - * \param pLibraryTreeItem - * \see ElementParameters::createTabsGroupBoxesAndParametersHelper() - */ -void ElementParameters::createTabsGroupBoxesAndParameters(LibraryTreeItem *pLibraryTreeItem) -{ - foreach (LibraryTreeItem *pInheritedLibraryTreeItem, pLibraryTreeItem->getModelWidget()->getInheritedClassesList()) { - createTabsGroupBoxesAndParameters(pInheritedLibraryTreeItem); - createTabsGroupBoxesAndParametersHelper(pInheritedLibraryTreeItem); - } -} - -/*! - * \brief ElementParameters::createTabsGroupBoxesAndParametersHelper - * Creates the dynamic tabs for QTabWidget and QGroupBoxes within them. - * Creats the parameters and adds them to the appropriate tab and groupbox. - * \param pLibraryTreeItem - * \param useInsert - if true we use QList insert instead of append. - * \see ElementParameters::createTabsGroupBoxesAndParameters() + * \param pModelInstance */ -void ElementParameters::createTabsGroupBoxesAndParametersHelper(LibraryTreeItem *pLibraryTreeItem, bool useInsert) -{ - OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); - foreach (LibraryTreeItem *pInheritedLibraryTreeItem, pLibraryTreeItem->getInheritedClasses()) { - QMap extendsModifiers = pLibraryTreeItem->getModelWidget()->getExtendsModifiersMap(pInheritedLibraryTreeItem->getNameStructure()); - QMap::iterator extendsModifiersIterator; - for (extendsModifiersIterator = extendsModifiers.begin(); extendsModifiersIterator != extendsModifiers.end(); ++extendsModifiersIterator) { - QString parameterName = StringHandler::getFirstWordBeforeDot(extendsModifiersIterator.key()); - /* Ticket #2531 - * Check if parameter is marked final in the extends modifier. - */ - if (pOMCProxy->isExtendsModifierFinal(pLibraryTreeItem->getNameStructure(), pInheritedLibraryTreeItem->getNameStructure(), parameterName)) { - Parameter *pParameter = findParameter(parameterName); - if (pParameter) { - mParametersList.removeOne(pParameter); - delete pParameter; - } - } else { - Parameter *pParameter = findParameter(parameterName); - if (pParameter) { - if (extendsModifiersIterator.key().compare(parameterName + ".start") == 0) { - QString start = extendsModifiersIterator.value(); - if (!start.isEmpty()) { - if (pParameter->getGroupBox().isEmpty()) { - pParameter->setGroupBox("Initialization"); - } - pParameter->setShowStartAttribute(true); - pParameter->setValueWidget(start, true, pParameter->getUnit()); - } - } else if (extendsModifiersIterator.key().compare(parameterName + ".fixed") == 0) { - QString fixed = extendsModifiersIterator.value(); - if (!fixed.isEmpty()) { - if (pParameter->getGroupBox().isEmpty()) { - pParameter->setGroupBox("Initialization"); - } - pParameter->setShowStartAttribute(true); - pParameter->setFixedState(fixed, true); - } - } else { - pParameter->setValueWidget(extendsModifiersIterator.value(), true, pParameter->getUnit()); - } - } - } - } - } - int insertIndex = 0; - pLibraryTreeItem->getModelWidget()->loadDiagramView(); - foreach (Element *pElement, pLibraryTreeItem->getModelWidget()->getDiagramGraphicsView()->getElementsList()) { - // if we already have the parameter from one of the inherited class then just skip this one. - if (findParameter(pElement->getName())) { - continue; - } - /* Ticket #2531 - * Do not show the protected & final parameters. - */ - if (pElement->getElementInfo()->getProtected() || pElement->getElementInfo()->getFinal()) { - continue; - } - /* I didn't find anything useful in the specification regarding this issue. - * The parameters dialog is only suppose to show the parameters. However, Dymola also shows the variables in the parameters window - * which have the dialog annotation with them. So, if the variable has dialog annotation or it is a parameter then show it. - * If the variable have start/fixed attribute set then show it also. - */ - QString tab = QString("General"); - QString groupBox = ""; - bool enable = true; - bool showStartAttribute = false; - QString loadSelectorFilter = "-", loadSelectorCaption = "-", saveSelectorFilter = "-", saveSelectorCaption = "-"; - QString start = "", fixed = ""; - bool isParameter = (pElement->getElementInfo()->getVariablity().compare("parameter") == 0); - // If not a parameter then check for start and fixed bindings. See Modelica.Electrical.Analog.Basic.Resistor parameter R. - if (!isParameter) { - OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); - QString className = pElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); - QMap modifiers = pElement->getElementInfo()->getModifiersMap(pOMCProxy, className, pElement); - QMap::iterator modifiersIterator; - for (modifiersIterator = modifiers.begin(); modifiersIterator != modifiers.end(); ++modifiersIterator) { - if (modifiersIterator.key().compare("start") == 0) { - start = modifiersIterator.value(); - } - else if (modifiersIterator.key().compare("fixed") == 0) { - fixed = modifiersIterator.value(); - } - } - showStartAttribute = (!start.isEmpty() || !fixed.isEmpty()) ? true : false; - } - /* get the dialog annotation */ - QStringList dialogAnnotation = pElement->getDialogAnnotation(); - QString groupImage = ""; - bool connectorSizing = false; - if (dialogAnnotation.size() > 10) { - // get the tab value - tab = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(0)); - // get the group value - groupBox = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(1)); - // get the enable value - /* Ticket #4008 - * For now just display all parameters as enabled. - */ - //enable = (dialogAnnotation.at(2).compare("true") == 0); - // get the showStartAttribute value - if (dialogAnnotation.at(3).compare("-") != 0) { - showStartAttribute = (dialogAnnotation.at(3).compare("true") == 0); - } - // get the loadSelector - loadSelectorFilter = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(5)); - loadSelectorCaption = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(6)); - // get the saveSelector - saveSelectorFilter = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(7)); - saveSelectorCaption = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(8)); - // get the group image - groupImage = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(9)); - if (!groupImage.isEmpty()) { - groupImage = MainWindow::instance()->getOMCProxy()->uriToFilename(groupImage); - } - // get the connectorSizing - connectorSizing = (dialogAnnotation.at(10).compare("true") == 0); - } - // if connectorSizing is present then don't show the parameter - if (connectorSizing) { - continue; - } - // if showStartAttribute true and group name is empty or Parameters then we should make group name Initialization - if (showStartAttribute && groupBox.isEmpty()) { - groupBox = "Initialization"; - } else if (groupBox.isEmpty() && (isParameter || (dialogAnnotation.size() > 0) || (pElement->getElementInfo()->getReplaceable()))) { - groupBox = "Parameters"; - } - if (!mTabsMap.contains(tab)) { - ParametersScrollArea *pParametersScrollArea = new ParametersScrollArea; - GroupBox *pGroupBox = new GroupBox(groupBox); - // set the group image - pGroupBox->setGroupImage(groupImage); - pParametersScrollArea->addGroupBox(pGroupBox); - mTabsMap.insert(tab, mpParametersTabWidget->addTab(pParametersScrollArea, tab)); - } else { - ParametersScrollArea *pParametersScrollArea; - pParametersScrollArea = qobject_cast(mpParametersTabWidget->widget(mTabsMap.value(tab))); - GroupBox *pGroupBox = pParametersScrollArea->getGroupBox(groupBox); - if (pParametersScrollArea && !pGroupBox) { - pGroupBox = new GroupBox(groupBox); - pParametersScrollArea->addGroupBox(pGroupBox); - } - // set the group image - pGroupBox->setGroupImage(groupImage); - } - // create the Parameter - Parameter *pParameter = new Parameter(pElement, showStartAttribute, tab, groupBox); - pParameter->setEnabled(enable); - pParameter->setLoadSelectorFilter(loadSelectorFilter); - pParameter->setLoadSelectorCaption(loadSelectorCaption); - pParameter->setSaveSelectorFilter(saveSelectorFilter); - pParameter->setSaveSelectorCaption(saveSelectorCaption); - if (pParameter->getValueType() == Parameter::ReplaceableClass) { - QString className = pElement->getElementInfo()->getClassName(); - QString comment = ""; - if (pElement->getLibraryTreeItem()) { - comment = pElement->getLibraryTreeItem()->mClassInformation.comment; - } else { - comment = (pOMCProxy->getClassInformation(className)).comment; - } - pParameter->setValueWidget(comment.isEmpty() ? className : QString("%1 - %2").arg(className, comment), true, pParameter->getUnit()); - } else if (pParameter->getValueType() == Parameter::ReplaceableComponent) { - pParameter->setValueWidget(QString("replaceable %1 %2").arg(pElement->getElementInfo()->getClassName(), pElement->getName()), true, pParameter->getUnit()); - } else { - QString elementDefinedInClass = pElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); - QString value = pElement->getElementInfo()->getParameterValue(pOMCProxy, elementDefinedInClass); - pParameter->setValueWidget(value, true, pParameter->getUnit()); - } - if (showStartAttribute) { - pParameter->setValueWidget(start, true, pParameter->getUnit()); - pParameter->setFixedState(fixed, true); - } - if (useInsert) { - mParametersList.insert(insertIndex, pParameter); - } else { - mParametersList.append(pParameter); - } - insertIndex++; - } -} - void ElementParameters::createTabsGroupBoxesAndParameters(ModelInstance::Model *pModelInstance) { - foreach (auto pElement, pModelInstance->getElements()) { - if (pElement->isExtend() && pElement->getModel()) { - auto pExtend = dynamic_cast(pElement); - createTabsGroupBoxesAndParameters(pExtend->getModel()); - createTabsGroupBoxesAndParametersHelper(pExtend->getModel()); - } - } -} - -void ElementParameters::createTabsGroupBoxesAndParametersHelper(ModelInstance::Model *pModelInstance, bool useInsert) -{ - int insertIndex = 0; foreach (auto pElement, pModelInstance->getElements()) { if (pElement->isComponent()) { auto pComponent = dynamic_cast(pElement); @@ -1423,10 +1220,9 @@ void ElementParameters::createTabsGroupBoxesAndParametersHelper(ModelInstance::M } // create the Parameter Parameter *pParameter = new Parameter(pComponent, this); - if (!mTabsMap.contains(pParameter->getTab())) { ParametersScrollArea *pParametersScrollArea = new ParametersScrollArea; - GroupBox *pGroupBox = new GroupBox(pParameter->getGroupBox()); + GroupBox *pGroupBox = new GroupBox(pParameter->getGroup()); // set the group image pGroupBox->setGroupImage(pParameter->getGroupImage()); pParametersScrollArea->addGroupBox(pGroupBox); @@ -1434,21 +1230,27 @@ void ElementParameters::createTabsGroupBoxesAndParametersHelper(ModelInstance::M } else { ParametersScrollArea *pParametersScrollArea; pParametersScrollArea = qobject_cast(mpParametersTabWidget->widget(mTabsMap.value(pParameter->getTab()))); - GroupBox *pGroupBox = pParametersScrollArea->getGroupBox(pParameter->getGroupBox()); + GroupBox *pGroupBox = pParametersScrollArea->getGroupBox(pParameter->getGroup()); if (pParametersScrollArea && !pGroupBox) { - pGroupBox = new GroupBox(pParameter->getGroupBox()); + pGroupBox = new GroupBox(pParameter->getGroup()); pParametersScrollArea->addGroupBox(pGroupBox); + mTabsMap.insert(pParameter->getTab(), mpParametersTabWidget->addTab(pParametersScrollArea, pParameter->getTab())); + } else { + ParametersScrollArea *pParametersScrollArea; + pParametersScrollArea = qobject_cast(mpParametersTabWidget->widget(mTabsMap.value(pParameter->getTab()))); + GroupBox *pGroupBox = pParametersScrollArea->getGroupBox(pParameter->getGroup()); + if (pParametersScrollArea && !pGroupBox) { + pGroupBox = new GroupBox(pParameter->getGroup()); + pParametersScrollArea->addGroupBox(pGroupBox); + } + // set the group image + pGroupBox->setGroupImage(pParameter->getGroupImage()); } - // set the group image - pGroupBox->setGroupImage(pParameter->getGroupImage()); - } - - if (useInsert) { - mParametersList.insert(insertIndex, pParameter); - } else { - mParametersList.append(pParameter); } - insertIndex++; + mParametersList.append(pParameter); + } else if (pElement->isExtend() && pElement->getModel()) { + auto pExtend = dynamic_cast(pElement); + createTabsGroupBoxesAndParameters(pExtend->getModel()); } } } @@ -1479,10 +1281,10 @@ void ElementParameters::fetchElementExtendsModifiers(ModelInstance::Model *pMode if (subModifier.getName().compare(QStringLiteral("start")) == 0 || subModifier.getName().compare(QStringLiteral("fixed")) == 0) { QString startOrFixed = subModifier.getValueWithoutQuotes(); if (!startOrFixed.isEmpty()) { - if (!pParameter->isGroupBoxDefined()) { - pParameter->setGroupBox("Initialization"); + if (!pParameter->isGroupDefined()) { + pParameter->setGroup("Initialization"); } - pParameter->setShowStartAttribute(true); + pParameter->setShowStartAndFixed(true); if (subModifier.getName().compare(QStringLiteral("start")) == 0) { pParameter->setValueWidget(startOrFixed, true, pParameter->getUnit()); } else { // fixed modifier @@ -1516,160 +1318,36 @@ void ElementParameters::fetchElementExtendsModifiers(ModelInstance::Model *pMode } /*! - * \brief ElementParameters::fetchElementExtendsModifiers - * Fetches the Element's extends modifiers and apply modifier values on the appropriate Parameters. - */ -void ElementParameters::fetchElementExtendsModifiers() -{ - if (mpElement->getReferenceElement()) { - OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); - QString inheritedClassName; - inheritedClassName = mpElement->getReferenceElement()->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); - QMap extendsModifiersMap = mpElement->getGraphicsView()->getModelWidget()->getExtendsModifiersMap(inheritedClassName); - QMap::iterator extendsModifiersIterator; - for (extendsModifiersIterator = extendsModifiersMap.begin(); extendsModifiersIterator != extendsModifiersMap.end(); ++extendsModifiersIterator) { - QString elementName = StringHandler::getFirstWordBeforeDot(extendsModifiersIterator.key()); - if (mpElement->getName().compare(elementName) == 0) { - /* Ticket #4095 - * Handle parameters display of inherited elements. - */ - QString parameterName = extendsModifiersIterator.key(); - Parameter *pParameter = findParameter(StringHandler::removeFirstWordAfterDot(parameterName)); - if (pParameter) { - if (pParameter->isShowStartAttribute()) { - if (extendsModifiersIterator.key().compare(parameterName + ".start") == 0) { - QString start = extendsModifiersIterator.value(); - if (!start.isEmpty()) { - if (pParameter->getGroupBox().isEmpty()) { - pParameter->setGroupBox("Initialization"); - } - pParameter->setShowStartAttribute(true); - pParameter->setValueWidget(start, false, pParameter->getUnit()); - } - } else if (extendsModifiersIterator.key().compare(parameterName + ".fixed") == 0) { - QString fixed = extendsModifiersIterator.value(); - if (!fixed.isEmpty()) { - if (pParameter->getGroupBox().isEmpty()) { - pParameter->setGroupBox("Initialization"); - } - pParameter->setShowStartAttribute(true); - pParameter->setFixedState(fixed, false); - } - } - } else if (extendsModifiersIterator.key().compare(parameterName) == 0) { - pParameter->setValueWidget(extendsModifiersIterator.value(), false, pParameter->getUnit()); - } - if (extendsModifiersIterator.key().compare(parameterName + ".displayUnit") == 0) { - QString displayUnit = StringHandler::removeFirstLastQuotes(extendsModifiersIterator.value()); - int index = pParameter->getUnitComboBox()->findData(displayUnit); - if (index < 0) { - // add extends modifier as additional display unit if compatible - index = pParameter->getUnitComboBox()->count() - 1; - if (index > -1 && - (pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(0).toString(), displayUnit)).unitsCompatible) { - pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit); - index ++; - } - } - if (index > -1) { - pParameter->getUnitComboBox()->setCurrentIndex(index); - pParameter->setDisplayUnit(displayUnit); - } - } - } - } - } - } -} - -/*! - * \brief ElementParameters::fetchElementModifiers - * Fetches the Element's modifiers and apply modifier values on the appropriate Parameters. + * \brief ElementParameters::fetchElementModifiers + * Fetches the Element's modifiers and apply modifier values on the appropriate Parameters. */ void ElementParameters::fetchElementModifiers() { - if (MainWindow::instance()->isNewApi()) { - foreach (auto modifier, mpElement->getModelComponent()->getModifier().getModifiers()) { - Parameter *pParameter = findParameter(modifier.getName()); - if (pParameter) { - pParameter->setValueWidget(modifier.getValue(), mpElement->isInheritedElement(), pParameter->getUnit()); - foreach (auto subModifier, modifier.getModifiers()) { - if (subModifier.getName().compare(QStringLiteral("start")) == 0 || subModifier.getName().compare(QStringLiteral("fixed")) == 0) { - QString startOrFixed = subModifier.getValueWithoutQuotes(); - if (!startOrFixed.isEmpty()) { - if (!pParameter->isGroupBoxDefined()) { - pParameter->setGroupBox("Initialization"); - } - pParameter->setShowStartAttribute(true); - if (subModifier.getName().compare(QStringLiteral("start")) == 0) { - pParameter->setValueWidget(startOrFixed, mpElement->isInheritedElement(), pParameter->getUnit()); - } else { // fixed modifier - pParameter->setFixedState(startOrFixed, mpElement->isInheritedElement()); - } - } - } else if (subModifier.getName().compare(QStringLiteral("displayUnit")) == 0) { - QString displayUnit = subModifier.getValueWithoutQuotes(); - int index = pParameter->getUnitComboBox()->findData(displayUnit); - if (index < 0) { - // add modifier as additional display unit if compatible - index = pParameter->getUnitComboBox()->count() - 1; - OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); - if (index > -1 && - (pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(0).toString(), displayUnit)).unitsCompatible) { - pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit); - index ++; - } - } - if (index > -1) { - pParameter->getUnitComboBox()->setCurrentIndex(index); - pParameter->setDisplayUnit(displayUnit); - } - } - } - } - } - } else { - Element *pElement = mpElement; - if (mpElement->getReferenceElement()) { - pElement = mpElement->getReferenceElement(); - } - OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); - QString className = pElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); - QMap modifiers = pElement->getElementInfo()->getModifiersMap(pOMCProxy, className, mpElement); - QMap::iterator modifiersIterator; - for (modifiersIterator = modifiers.begin(); modifiersIterator != modifiers.end(); ++modifiersIterator) { - QString parameterName = StringHandler::getFirstWordBeforeDot(modifiersIterator.key()); - Parameter *pParameter = findParameter(parameterName); - if (pParameter) { - if (pParameter->isShowStartAttribute()) { - if (modifiersIterator.key().compare(parameterName + ".start") == 0) { - QString start = modifiersIterator.value(); - if (!start.isEmpty()) { - if (pParameter->getGroupBox().isEmpty()) { - pParameter->setGroupBox("Initialization"); - } - pParameter->setShowStartAttribute(true); - pParameter->setValueWidget(start, mpElement->getReferenceElement() ? true : false, pParameter->getUnit()); + foreach (auto modifier, mpElement->getModifier().getModifiers()) { + Parameter *pParameter = findParameter(modifier.getName()); + if (pParameter) { + pParameter->setValueWidget(modifier.getValue(), mInherited, pParameter->getUnit()); + foreach (auto subModifier, modifier.getModifiers()) { + if (subModifier.getName().compare(QStringLiteral("start")) == 0 || subModifier.getName().compare(QStringLiteral("fixed")) == 0) { + QString startOrFixed = subModifier.getValueWithoutQuotes(); + if (!startOrFixed.isEmpty()) { + if (!pParameter->isGroupDefined()) { + pParameter->setGroup("Initialization"); } - } else if (modifiersIterator.key().compare(parameterName + ".fixed") == 0) { - QString fixed = modifiersIterator.value(); - if (!fixed.isEmpty()) { - if (pParameter->getGroupBox().isEmpty()) { - pParameter->setGroupBox("Initialization"); - } - pParameter->setShowStartAttribute(true); - pParameter->setFixedState(fixed, mpElement->getReferenceElement() ? true : false); + pParameter->setShowStartAndFixed(true); + if (subModifier.getName().compare(QStringLiteral("start")) == 0) { + pParameter->setValueWidget(startOrFixed, mInherited, pParameter->getUnit()); + } else { // fixed modifier + pParameter->setFixedState(startOrFixed, mInherited); } } - } else if (modifiersIterator.key().compare(parameterName) == 0) { - pParameter->setValueWidget(modifiersIterator.value(), mpElement->getReferenceElement() ? true : false, pParameter->getUnit()); - } - if (modifiersIterator.key().compare(parameterName + ".displayUnit") == 0) { - QString displayUnit = StringHandler::removeFirstLastQuotes(modifiersIterator.value()); + } else if (subModifier.getName().compare(QStringLiteral("displayUnit")) == 0) { + QString displayUnit = subModifier.getValueWithoutQuotes(); int index = pParameter->getUnitComboBox()->findData(displayUnit); if (index < 0) { // add modifier as additional display unit if compatible index = pParameter->getUnitComboBox()->count() - 1; + OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); if (index > -1 && (pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(0).toString(), displayUnit)).unitsCompatible) { pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit); @@ -1692,12 +1370,12 @@ void ElementParameters::fetchElementModifiers() */ void ElementParameters::fetchClassExtendsModifiers() { - ModelInstance::Model *pClassModelInstance = mpElement->getGraphicsView()->getModelWidget()->getModelInstance(); + ModelInstance::Model *pClassModelInstance = mpGraphicsView->getModelWidget()->getModelInstance(); QList elements = pClassModelInstance->getElements(); foreach (auto pElement, elements) { if (pElement->isExtend() && pElement->getModel()) { auto pExtend = dynamic_cast(pElement); - if (pExtend->getModel()->getName().compare(mpElement->getModelComponent()->getParentModel()->getName()) == 0) { + if (pExtend->getModel()->getName().compare(mpElement->getParentModel()->getName()) == 0) { foreach (auto modifier, pExtend->getExtendsModifier().getModifiers()) { if (modifier.getName().compare(mpElement->getName()) == 0) { foreach (auto subModifier, modifier.getModifiers()) { @@ -1708,10 +1386,10 @@ void ElementParameters::fetchClassExtendsModifiers() if (subSubModifier.getName().compare(QStringLiteral("start")) == 0 || subSubModifier.getName().compare(QStringLiteral("fixed")) == 0) { QString startOrFixed = subSubModifier.getValueWithoutQuotes(); if (!startOrFixed.isEmpty()) { - if (!pParameter->isGroupBoxDefined()) { - pParameter->setGroupBox("Initialization"); + if (!pParameter->isGroupDefined()) { + pParameter->setGroup("Initialization"); } - pParameter->setShowStartAttribute(true); + pParameter->setShowStartAndFixed(true); if (subSubModifier.getName().compare(QStringLiteral("start")) == 0) { pParameter->setValueWidget(startOrFixed, false, pParameter->getUnit()); } else { // fixed modifier @@ -1730,21 +1408,21 @@ void ElementParameters::fetchClassExtendsModifiers() pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit); index ++; } + if (index > -1) { + pParameter->getUnitComboBox()->setCurrentIndex(index); + pParameter->setDisplayUnit(displayUnit); + } + } else { + pParameter->setValueWidget(modifier.getValueWithoutQuotes(), false, pParameter->getUnit()); } - if (index > -1) { - pParameter->getUnitComboBox()->setCurrentIndex(index); - pParameter->setDisplayUnit(displayUnit); - } - } else { - pParameter->setValueWidget(modifier.getValueWithoutQuotes(), false, pParameter->getUnit()); } } } + break; } - break; } + break; } - break; } } } @@ -1779,19 +1457,17 @@ Parameter* ElementParameters::findParameter(LibraryTreeItem *pLibraryTreeItem, c Parameter* ElementParameters::findParameter(const QString ¶meter, Qt::CaseSensitivity caseSensitivity) const { foreach (Parameter *pParameter, mParametersList) { - if (MainWindow::instance()->isNewApi()) { - if (pParameter->getModelInstanceComponent()->getName().compare(parameter, caseSensitivity) == 0) { - return pParameter; - } - } else { - if (pParameter->getElement()->getName().compare(parameter, caseSensitivity) == 0) { - return pParameter; - } + if (pParameter->getModelInstanceComponent()->getName().compare(parameter, caseSensitivity) == 0) { + return pParameter; } } return 0; } +/*! + * \brief ElementParameters::commentLinkClicked + * \param link + */ void ElementParameters::commentLinkClicked(QString link) { QUrl linkUrl(link); @@ -1813,8 +1489,10 @@ void ElementParameters::commentLinkClicked(QString link) */ void ElementParameters::updateElementParameters() { - if (MainWindow::instance()->isNewApi()) { - ModelWidget *pModelWidget = mpElement->getGraphicsView()->getModelWidget(); + if (isNested()) { + mModification = "Test"; + } else { + ModelWidget *pModelWidget = mpGraphicsView->getModelWidget(); ModelInfo oldModelInfo = pModelWidget->createModelInfo(); QString className = pModelWidget->getLibraryTreeItem()->getNameStructure(); OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); @@ -1822,6 +1500,10 @@ void ElementParameters::updateElementParameters() QMap elementModifiersMap; // any parameter changed foreach (Parameter *pParameter, mParametersList) { + // if parameter is not visible then continue + if (pParameter->getGroup().isEmpty()) { + continue; + } QString elementModifierKey = pParameter->getNameLabel()->text(); QString elementModifierValue = pParameter->getValue(); // convert the value to display unit @@ -1843,14 +1525,14 @@ void ElementParameters::updateElementParameters() valueChanged = true; elementModifiersMap.insert(elementModifierKey, elementModifierValue); } - if (pParameter->isShowStartAttribute() && (pParameter->getFixedState().compare(pParameter->getOriginalFixedValue()) != 0)) { + if (pParameter->isShowStartAndFixed() && (pParameter->getFixedState().compare(pParameter->getOriginalFixedValue()) != 0)) { valueChanged = true; elementModifierKey = elementModifierKey.replace(".start", ".fixed"); elementModifierValue = pParameter->getFixedState(); elementModifiersMap.insert(elementModifierKey, elementModifierValue); } // remove the .start or .fixed from modifier key - if (pParameter->isShowStartAttribute()) { + if (pParameter->isShowStartAndFixed()) { if (elementModifierKey.endsWith(".start")) { elementModifierKey.chop(QString(".start").length()); } @@ -1895,124 +1577,17 @@ void ElementParameters::updateElementParameters() QString modifierValue = newElementModifier.value(); QString modifierKey = QString(mpElement->getName() % "." % newElementModifier.key()); // if the element is inherited then add the modifier value into the extends. - if (mpElement->isInheritedElement()) { - pOMCProxy->setExtendsModifierValue(className, mpElement->getModelComponent()->getParentModel()->getName(), modifierKey, modifierValue); + if (mInherited) { + pOMCProxy->setExtendsModifierValue(className, mpElement->getParentModel()->getName(), modifierKey, modifierValue); } else { pOMCProxy->setComponentModifierValue(className, modifierKey, modifierValue); } } ModelInfo newModelInfo = pModelWidget->createModelInfo(); - pModelWidget->getUndoStack()->push(new OMCUndoCommand(pModelWidget->getLibraryTreeItem(), oldModelInfo, newModelInfo, QString("Update Element %1 Parameters").arg(mpElement->getName()))); + pModelWidget->getUndoStack()->push(new OMCUndoCommand(pModelWidget->getLibraryTreeItem(), oldModelInfo, newModelInfo, + QString("Update Element %1 Parameters").arg(mpElement->getName()))); pModelWidget->updateModelText(); } - } else { - OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); - QString className = mpElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); - bool valueChanged = false; - // save the Element modifiers - QMap oldElementModifiersMap = mpElement->getElementInfo()->getModifiersMap(pOMCProxy, className, mpElement); - // new Element modifiers - QMap newElementModifiersMap = mpElement->getElementInfo()->getModifiersMap(pOMCProxy, className, mpElement); - QMap newElementExtendsModifiersMap; - // any parameter changed - foreach (Parameter *pParameter, mParametersList) { - QString elementModifierKey = pParameter->getNameLabel()->text(); - QString elementModifierValue = pParameter->getValue(); - // convert the value to display unit - if (!pParameter->getUnit().isEmpty() && pParameter->getUnit().compare(pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString()) != 0) { - bool ok = true; - qreal elementModifierRealValue = elementModifierValue.toDouble(&ok); - // if the modifier is a literal constant - if (ok) { - OMCInterface::convertUnits_res convertUnit = pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString(), pParameter->getUnit()); - if (convertUnit.unitsCompatible) { - elementModifierRealValue = Utilities::convertUnit(elementModifierRealValue, convertUnit.offset, convertUnit.scaleFactor); - elementModifierValue = StringHandler::number(elementModifierRealValue); - } - } else { // if expression - elementModifierValue = Utilities::arrayExpressionUnitConversion(pOMCProxy, elementModifierValue, pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString(), pParameter->getUnit()); - } - } - if (pParameter->isValueModified()) { - valueChanged = true; - /* If the element is inherited then add the modifier value into the extends. */ - if (mpElement->isInheritedElement()) { - newElementExtendsModifiersMap.insert(mpElement->getName() + "." + elementModifierKey, elementModifierValue); - } else { - newElementModifiersMap.insert(elementModifierKey, elementModifierValue); - } - } - if (pParameter->isShowStartAttribute() && (pParameter->getFixedState().compare(pParameter->getOriginalFixedValue()) != 0)) { - valueChanged = true; - elementModifierKey = elementModifierKey.replace(".start", ".fixed"); - elementModifierValue = pParameter->getFixedState(); - /* If the element is inherited then add the modifier value into the extends. */ - if (mpElement->isInheritedElement()) { - newElementExtendsModifiersMap.insert(mpElement->getName() + "." + elementModifierKey, elementModifierValue); - } else { - newElementModifiersMap.insert(elementModifierKey, elementModifierValue); - } - } - // remove the .start or .fixed from modifier key - if (pParameter->isShowStartAttribute()) { - if (elementModifierKey.endsWith(".start")) { - elementModifierKey.chop(QString(".start").length()); - } - if (elementModifierKey.endsWith(".fixed")) { - elementModifierKey.chop(QString(".fixed").length()); - } - } - // if displayUnit is changed - if (pParameter->getUnitComboBox()->isEnabled() && pParameter->getDisplayUnit().compare(pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString()) != 0) { - valueChanged = true; - /* If the element is inherited then add the modifier value into the extends. */ - if (mpElement->isInheritedElement()) { - newElementExtendsModifiersMap.insert(mpElement->getName() + "." + elementModifierKey + ".displayUnit", - "\"" + pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString() + "\""); - } else { - newElementModifiersMap.insert(elementModifierKey + ".displayUnit", "\"" + pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString() + "\""); - } - } - } - // any new modifier is added - if (!mpModifiersTextBox->text().isEmpty()) { - QString regexp ("\\s*([A-Za-z0-9._]+\\s*)\\(\\s*([A-Za-z0-9._]+)\\s*=\\s*([A-Za-z0-9._]+)\\s*\\)$"); - QRegExp modifierRegExp (regexp); - #if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) - QStringList modifiers = mpModifiersTextBox->text().split(",", Qt::SkipEmptyParts); - #else // QT_VERSION_CHECK - QStringList modifiers = mpModifiersTextBox->text().split(",", QString::SkipEmptyParts); - #endif // QT_VERSION_CHECK - foreach (QString modifier, modifiers) { - modifier = modifier.trimmed(); - if (modifierRegExp.exactMatch(modifier)) { - valueChanged = true; - QString elementModifierKey = modifier.mid(0, modifier.indexOf("(")); - QString elementModifierValue = modifier.mid(modifier.indexOf("(")); - newElementModifiersMap.insert(elementModifierKey, elementModifierValue); - } else { - MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, - GUIMessages::getMessage(GUIMessages::WRONG_MODIFIER).arg(modifier), - Helper::scriptingKind, Helper::errorLevel)); - } - } - } - // if valueChanged is true then put the change in the undo stack. - if (valueChanged) { - // save the Element extends modifiers - QMap oldElementExtendsModifiersMap; - if (mpElement->getReferenceElement()) { - QString inheritedClassName; - inheritedClassName = mpElement->getReferenceElement()->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); - oldElementExtendsModifiersMap = mpElement->getGraphicsView()->getModelWidget()->getExtendsModifiersMap(inheritedClassName); - } - // create UpdateElementParametersCommand - UpdateElementParametersCommand *pUpdateElementParametersCommand; - pUpdateElementParametersCommand = new UpdateElementParametersCommand(mpElement, oldElementModifiersMap, oldElementExtendsModifiersMap, - newElementModifiersMap, newElementExtendsModifiersMap); - mpElement->getGraphicsView()->getModelWidget()->getUndoStack()->push(pUpdateElementParametersCommand); - mpElement->getGraphicsView()->getModelWidget()->updateModelText(); - } } accept(); } @@ -2023,17 +1598,725 @@ void ElementParameters::updateElementParameters() */ void ElementParameters::reject() { - if (MainWindow::instance()->isNewApi()) { - foreach (Parameter *pParameter, mParametersList) { - // reset any changed parameter binding - if (pParameter->isValueModified()) { - pParameter->getModelInstanceComponent()->resetBinding(); - } + foreach (Parameter *pParameter, mParametersList) { + // reset any changed parameter binding + if (pParameter->isValueModified()) { + pParameter->getModelInstanceComponent()->resetBinding(); } } QDialog::reject(); } +/*! + * \class ElementParameters + * \brief A dialog for displaying Element's parameters. + */ +/*! + * \brief ElementParameters::ElementParameters + * \param pElement - pointer to Element + * \param pParent + */ +ElementParametersOld::ElementParametersOld(Element *pElement, QWidget *pParent) + : QDialog(pParent) +{ + QString className = pElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); + setWindowTitle(tr("%1 - %2 - %3 in %4").arg(Helper::applicationName).arg(tr("Element Parameters")).arg(pElement->getName()).arg(className)); + setAttribute(Qt::WA_DeleteOnClose); + mpElement = pElement; + setUpDialog(); +} + +/*! + * \brief ElementParameters::~ElementParameters + * Deletes the list of Parameter objects. + */ +ElementParametersOld::~ElementParametersOld() +{ + qDeleteAll(mParametersList.begin(), mParametersList.end()); + mParametersList.clear(); +} + +/*! + * \brief ElementParameters::updateParameters + * Updates the parameters. + */ +void ElementParametersOld::updateParameters() +{ + foreach (Parameter *pParameter, mParametersList) { + pParameter->update(); + } +} + +/*! + Creates the Dialog and set up all the controls with default values. + */ +void ElementParametersOld::setUpDialog() +{ + // heading label + mpParametersHeading = Utilities::getHeadingLabel(Helper::parameters); + // set separator line + mHorizontalLine = Utilities::getHeadingLine(); + // parameters tab widget + mpParametersTabWidget = new QTabWidget; + // Component Group Box + mpComponentGroupBox = new QGroupBox(tr("Component")); + // Component name + mpComponentNameLabel = new Label(Helper::name); + mpComponentNameTextBox = new Label(mpElement->getName()); + mpComponentCommentLabel = new Label(Helper::comment); + mpComponentCommentTextBox = new Label(mpElement->getComment()); + QGridLayout *pComponentGroupBoxLayout = new QGridLayout; + pComponentGroupBoxLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); + pComponentGroupBoxLayout->addWidget(mpComponentNameLabel, 0, 0); + pComponentGroupBoxLayout->addWidget(mpComponentNameTextBox, 0, 1); + pComponentGroupBoxLayout->addWidget(mpComponentCommentLabel, 1, 0); + pComponentGroupBoxLayout->addWidget(mpComponentCommentTextBox, 1, 1); + mpComponentGroupBox->setLayout(pComponentGroupBoxLayout); + // Component Class Group Box + mpComponentClassGroupBox = new QGroupBox(tr("Class")); + // Component class name + mpComponentClassNameLabel = new Label(Helper::path); + mpComponentClassNameTextBox = new Label(mpElement->getElementInfo()->getClassName()); + // Component comment + mpComponentClassCommentLabel = new Label(Helper::comment); + mpComponentClassCommentTextBox = new Label; + mpComponentClassCommentTextBox->setTextFormat(Qt::RichText); + mpComponentClassCommentTextBox->setTextInteractionFlags(mpComponentClassCommentTextBox->textInteractionFlags() | Qt::LinksAccessibleByMouse | Qt::LinksAccessibleByKeyboard); + if (mpElement->getLibraryTreeItem()) { + mpComponentClassCommentTextBox->setText(mpElement->getLibraryTreeItem()->mClassInformation.comment); + } else { + mpComponentClassCommentTextBox->setText(mpElement->getModel()->getComment()); + } + connect(mpComponentClassCommentTextBox, SIGNAL(linkActivated(QString)), SLOT(commentLinkClicked(QString))); + QGridLayout *pComponentClassGroupBoxLayout = new QGridLayout; + pComponentClassGroupBoxLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); + pComponentClassGroupBoxLayout->addWidget(mpComponentClassNameLabel, 0, 0); + pComponentClassGroupBoxLayout->addWidget(mpComponentClassNameTextBox, 0, 1); + pComponentClassGroupBoxLayout->addWidget(mpComponentClassCommentLabel, 1, 0); + pComponentClassGroupBoxLayout->addWidget(mpComponentClassCommentTextBox, 1, 1); + mpComponentClassGroupBox->setLayout(pComponentClassGroupBoxLayout); + // Create General tab and Parameters GroupBox + ParametersScrollArea *pParametersScrollArea = new ParametersScrollArea; + // first add the Component Group Box and component class group box + pParametersScrollArea->getLayout()->addWidget(mpComponentGroupBox); + pParametersScrollArea->getLayout()->addWidget(mpComponentClassGroupBox); + GroupBox *pParametersGroupBox = new GroupBox("Parameters"); + pParametersScrollArea->addGroupBox(pParametersGroupBox); + GroupBox *pInitializationGroupBox = new GroupBox("Initialization"); + pParametersScrollArea->addGroupBox(pInitializationGroupBox); + mTabsMap.insert("General", mpParametersTabWidget->addTab(pParametersScrollArea, "General")); + // create parameters tabs and groupboxes + createTabsGroupBoxesAndParameters(mpElement->getLibraryTreeItem()); + /* We append the actual Element's parameters first so that they appear first on the list. + * For that we use QList insert instead of append in ElementParameters::createTabsGroupBoxesAndParametersHelper() function. + * Modelica.Electrical.Analog.Basic.Resistor order is wrong if we don't use insert. + */ + createTabsGroupBoxesAndParametersHelper(mpElement->getLibraryTreeItem(), true); + fetchElementModifiers(); + fetchElementExtendsModifiers(); + + foreach (Parameter *pParameter, mParametersList) { + ParametersScrollArea *pParametersScrollArea = qobject_cast(mpParametersTabWidget->widget(mTabsMap.value(pParameter->getTab()))); + if (pParametersScrollArea) { + if (!pParameter->getGroup().isEmpty()) { + GroupBox *pGroupBox = pParametersScrollArea->getGroupBox(pParameter->getGroup()); + if (pGroupBox) { + /* We hide the groupbox when we create it. Show the groupbox now since it has a parameter. */ + pGroupBox->show(); + QGridLayout *pGroupBoxGridLayout = pGroupBox->getGridLayout(); + int layoutIndex = pGroupBoxGridLayout->rowCount(); + int columnIndex = 0; + pParameter->updateNameLabel(); + pGroupBoxGridLayout->addWidget(pParameter->getNameLabel(), layoutIndex, columnIndex++); + if (pParameter->isShowStartAttribute()) { + pGroupBoxGridLayout->addWidget(pParameter->getFixedCheckBox(), layoutIndex, columnIndex++); + } else { + pGroupBoxGridLayout->addItem(new QSpacerItem(1, 1), layoutIndex, columnIndex++); + } + pGroupBoxGridLayout->addWidget(pParameter->getValueWidget(), layoutIndex, columnIndex++); + + if (pParameter->getModifyReplaceableButton()) { + pGroupBoxGridLayout->addWidget(pParameter->getModifyReplaceableButton(), layoutIndex, columnIndex++); + } else { + pGroupBoxGridLayout->addItem(new QSpacerItem(1, 1), layoutIndex, columnIndex++); + } + + if (pParameter->getLoadSelectorFilter().compare("-") != 0 || pParameter->getLoadSelectorCaption().compare("-") != 0 || + pParameter->getSaveSelectorFilter().compare("-") != 0 || pParameter->getSaveSelectorCaption().compare("-") != 0) { + pGroupBoxGridLayout->addWidget(pParameter->getFileSelectorButton(), layoutIndex, columnIndex++); + } else { + pGroupBoxGridLayout->addItem(new QSpacerItem(1, 1), layoutIndex, columnIndex++); + } + if (pParameter->getUnitComboBox()->count() > 0) { // only add the unit combobox if we really have a unit + /* ticket:4421 + * Show a fixed value when there is only one unit. + */ + if (pParameter->getUnitComboBox()->count() == 1) { + pGroupBoxGridLayout->addWidget(new Label(pParameter->getUnitComboBox()->currentText()), layoutIndex, columnIndex++); + } else { + pGroupBoxGridLayout->addWidget(pParameter->getUnitComboBox(), layoutIndex, columnIndex++); + } + } else { + pGroupBoxGridLayout->addItem(new QSpacerItem(1, 1), layoutIndex, columnIndex++); + } + pGroupBoxGridLayout->addWidget(pParameter->getCommentLabel(), layoutIndex, columnIndex++); + } + } + } + } + // create Modifiers tab + QWidget *pModifiersTab = new QWidget; + // add items to modifiers tab + mpModifiersLabel = new Label(tr("Add new modifiers, e.g., phi(start=1), w(start=2)")); + mpModifiersTextBox = new QLineEdit; + QVBoxLayout *pModifiersTabLayout = new QVBoxLayout; + pModifiersTabLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); + pModifiersTabLayout->addWidget(mpModifiersLabel); + pModifiersTabLayout->addWidget(mpModifiersTextBox); + pModifiersTab->setLayout(pModifiersTabLayout); + mpParametersTabWidget->addTab(pModifiersTab, "Modifiers"); + // Issue #7494. Hide any empty tab. + for (int i = 0; i < mpParametersTabWidget->count(); ++i) { + ParametersScrollArea *pParametersScrollArea = qobject_cast(mpParametersTabWidget->widget(i)); + if (pParametersScrollArea) { + bool tabIsEmpty = true; + // The tab is empty if its groupbox layout is empty. + for (int j = 0; j < pParametersScrollArea->groupBoxesSize(); ++j) { + GroupBox *pGroupBox = pParametersScrollArea->getGroupBox(j); + if (pGroupBox && !pGroupBox->getGridLayout()->isEmpty()) { + tabIsEmpty = false; + break; + } + } + // If the tab is empty then remove it and move one step back. + if (tabIsEmpty) { + mpParametersTabWidget->removeTab(i); + --i; + } + } + } + // Create the buttons + mpOkButton = new QPushButton(Helper::ok); + mpOkButton->setAutoDefault(true); + connect(mpOkButton, SIGNAL(clicked()), this, SLOT(updateElementParameters())); + if (mpElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->isSystemLibrary() || mpElement->getGraphicsView()->isVisualizationView()) { + mpOkButton->setDisabled(true); + } + mpCancelButton = new QPushButton(Helper::cancel); + mpCancelButton->setAutoDefault(false); + connect(mpCancelButton, SIGNAL(clicked()), this, SLOT(reject())); + mpButtonBox = new QDialogButtonBox(Qt::Horizontal); + mpButtonBox->addButton(mpOkButton, QDialogButtonBox::ActionRole); + mpButtonBox->addButton(mpCancelButton, QDialogButtonBox::ActionRole); + // main layout + QVBoxLayout *pMainLayout = new QVBoxLayout; + pMainLayout->addWidget(mpParametersHeading); + pMainLayout->addWidget(mHorizontalLine); + pMainLayout->addWidget(mpParametersTabWidget); + pMainLayout->addWidget(mpButtonBox); + setLayout(pMainLayout); +} + +/*! + * \brief ElementParameters::createTabsGroupBoxesAndParameters + * Loops over the inherited classes of the Element. + * \param pLibraryTreeItem + * \see ElementParameters::createTabsGroupBoxesAndParametersHelper() + */ +void ElementParametersOld::createTabsGroupBoxesAndParameters(LibraryTreeItem *pLibraryTreeItem) +{ + foreach (LibraryTreeItem *pInheritedLibraryTreeItem, pLibraryTreeItem->getModelWidget()->getInheritedClassesList()) { + createTabsGroupBoxesAndParameters(pInheritedLibraryTreeItem); + createTabsGroupBoxesAndParametersHelper(pInheritedLibraryTreeItem); + } +} + +/*! + * \brief ElementParameters::createTabsGroupBoxesAndParametersHelper + * Creates the dynamic tabs for QTabWidget and QGroupBoxes within them. + * Creats the parameters and adds them to the appropriate tab and groupbox. + * \param pLibraryTreeItem + * \param useInsert - if true we use QList insert instead of append. + * \see ElementParameters::createTabsGroupBoxesAndParameters() + */ +void ElementParametersOld::createTabsGroupBoxesAndParametersHelper(LibraryTreeItem *pLibraryTreeItem, bool useInsert) +{ + OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); + foreach (LibraryTreeItem *pInheritedLibraryTreeItem, pLibraryTreeItem->getInheritedClasses()) { + QMap extendsModifiers = pLibraryTreeItem->getModelWidget()->getExtendsModifiersMap(pInheritedLibraryTreeItem->getNameStructure()); + QMap::iterator extendsModifiersIterator; + for (extendsModifiersIterator = extendsModifiers.begin(); extendsModifiersIterator != extendsModifiers.end(); ++extendsModifiersIterator) { + QString parameterName = StringHandler::getFirstWordBeforeDot(extendsModifiersIterator.key()); + /* Ticket #2531 + * Check if parameter is marked final in the extends modifier. + */ + if (pOMCProxy->isExtendsModifierFinal(pLibraryTreeItem->getNameStructure(), pInheritedLibraryTreeItem->getNameStructure(), parameterName)) { + Parameter *pParameter = findParameter(parameterName); + if (pParameter) { + mParametersList.removeOne(pParameter); + delete pParameter; + } + } else { + Parameter *pParameter = findParameter(parameterName); + if (pParameter) { + if (extendsModifiersIterator.key().compare(parameterName + ".start") == 0) { + QString start = extendsModifiersIterator.value(); + if (!start.isEmpty()) { + if (pParameter->getGroup().isEmpty()) { + pParameter->setGroup("Initialization"); + } + pParameter->setShowStartAttribute(true); + pParameter->setValueWidget(start, true, pParameter->getUnit()); + } + } else if (extendsModifiersIterator.key().compare(parameterName + ".fixed") == 0) { + QString fixed = extendsModifiersIterator.value(); + if (!fixed.isEmpty()) { + if (pParameter->getGroup().isEmpty()) { + pParameter->setGroup("Initialization"); + } + pParameter->setShowStartAttribute(true); + pParameter->setFixedState(fixed, true); + } + } else { + pParameter->setValueWidget(extendsModifiersIterator.value(), true, pParameter->getUnit()); + } + } + } + } + } + int insertIndex = 0; + pLibraryTreeItem->getModelWidget()->loadDiagramView(); + foreach (Element *pElement, pLibraryTreeItem->getModelWidget()->getDiagramGraphicsView()->getElementsList()) { + // if we already have the parameter from one of the inherited class then just skip this one. + if (findParameter(pElement->getName())) { + continue; + } + /* Ticket #2531 + * Do not show the protected & final parameters. + */ + if (pElement->getElementInfo()->getProtected() || pElement->getElementInfo()->getFinal()) { + continue; + } + /* I didn't find anything useful in the specification regarding this issue. + * The parameters dialog is only suppose to show the parameters. However, Dymola also shows the variables in the parameters window + * which have the dialog annotation with them. So, if the variable has dialog annotation or it is a parameter then show it. + * If the variable have start/fixed attribute set then show it also. + */ + QString tab = QString("General"); + QString groupBox = ""; + bool enable = true; + bool showStartAttribute = false; + QString loadSelectorFilter = "-", loadSelectorCaption = "-", saveSelectorFilter = "-", saveSelectorCaption = "-"; + QString start = "", fixed = ""; + bool isParameter = (pElement->getElementInfo()->getVariablity().compare("parameter") == 0); + // If not a parameter then check for start and fixed bindings. See Modelica.Electrical.Analog.Basic.Resistor parameter R. + if (!isParameter) { + OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); + QString className = pElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); + QMap modifiers = pElement->getElementInfo()->getModifiersMap(pOMCProxy, className, pElement); + QMap::iterator modifiersIterator; + for (modifiersIterator = modifiers.begin(); modifiersIterator != modifiers.end(); ++modifiersIterator) { + if (modifiersIterator.key().compare("start") == 0) { + start = modifiersIterator.value(); + } + else if (modifiersIterator.key().compare("fixed") == 0) { + fixed = modifiersIterator.value(); + } + } + showStartAttribute = (!start.isEmpty() || !fixed.isEmpty()) ? true : false; + } + /* get the dialog annotation */ + QStringList dialogAnnotation = pElement->getDialogAnnotation(); + QString groupImage = ""; + bool connectorSizing = false; + if (dialogAnnotation.size() > 10) { + // get the tab value + tab = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(0)); + // get the group value + groupBox = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(1)); + // get the enable value + /* Ticket #4008 + * For now just display all parameters as enabled. + */ + //enable = (dialogAnnotation.at(2).compare("true") == 0); + // get the showStartAttribute value + if (dialogAnnotation.at(3).compare("-") != 0) { + showStartAttribute = (dialogAnnotation.at(3).compare("true") == 0); + } + // get the loadSelector + loadSelectorFilter = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(5)); + loadSelectorCaption = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(6)); + // get the saveSelector + saveSelectorFilter = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(7)); + saveSelectorCaption = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(8)); + // get the group image + groupImage = StringHandler::removeFirstLastQuotes(dialogAnnotation.at(9)); + if (!groupImage.isEmpty()) { + groupImage = MainWindow::instance()->getOMCProxy()->uriToFilename(groupImage); + } + // get the connectorSizing + connectorSizing = (dialogAnnotation.at(10).compare("true") == 0); + } + // if connectorSizing is present then don't show the parameter + if (connectorSizing) { + continue; + } + // if showStartAttribute true and group name is empty or Parameters then we should make group name Initialization + if (showStartAttribute && groupBox.isEmpty()) { + groupBox = "Initialization"; + } else if (groupBox.isEmpty() && (isParameter || (dialogAnnotation.size() > 0) || (pElement->getElementInfo()->getReplaceable()))) { + groupBox = "Parameters"; + } + if (!mTabsMap.contains(tab)) { + ParametersScrollArea *pParametersScrollArea = new ParametersScrollArea; + GroupBox *pGroupBox = new GroupBox(groupBox); + // set the group image + pGroupBox->setGroupImage(groupImage); + pParametersScrollArea->addGroupBox(pGroupBox); + mTabsMap.insert(tab, mpParametersTabWidget->addTab(pParametersScrollArea, tab)); + } else { + ParametersScrollArea *pParametersScrollArea; + pParametersScrollArea = qobject_cast(mpParametersTabWidget->widget(mTabsMap.value(tab))); + GroupBox *pGroupBox = pParametersScrollArea->getGroupBox(groupBox); + if (pParametersScrollArea && !pGroupBox) { + pGroupBox = new GroupBox(groupBox); + pParametersScrollArea->addGroupBox(pGroupBox); + } + // set the group image + pGroupBox->setGroupImage(groupImage); + } + // create the Parameter + Parameter *pParameter = new Parameter(pElement, showStartAttribute, tab, groupBox); + pParameter->setEnabled(enable); + pParameter->setLoadSelectorFilter(loadSelectorFilter); + pParameter->setLoadSelectorCaption(loadSelectorCaption); + pParameter->setSaveSelectorFilter(saveSelectorFilter); + pParameter->setSaveSelectorCaption(saveSelectorCaption); + if (pParameter->getValueType() == Parameter::ReplaceableClass) { + QString className = pElement->getElementInfo()->getClassName(); + QString comment = ""; + if (pElement->getLibraryTreeItem()) { + comment = pElement->getLibraryTreeItem()->mClassInformation.comment; + } else { + comment = (pOMCProxy->getClassInformation(className)).comment; + } + pParameter->setValueWidget(comment.isEmpty() ? className : QString("%1 - %2").arg(className, comment), true, pParameter->getUnit()); + } else if (pParameter->getValueType() == Parameter::ReplaceableComponent) { + pParameter->setValueWidget(QString("replaceable %1 %2").arg(pElement->getElementInfo()->getClassName(), pElement->getName()), true, pParameter->getUnit()); + } else { + QString elementDefinedInClass = pElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); + QString value = pElement->getElementInfo()->getParameterValue(pOMCProxy, elementDefinedInClass); + pParameter->setValueWidget(value, true, pParameter->getUnit()); + } + if (showStartAttribute) { + pParameter->setValueWidget(start, true, pParameter->getUnit()); + pParameter->setFixedState(fixed, true); + } + if (useInsert) { + mParametersList.insert(insertIndex, pParameter); + } else { + mParametersList.append(pParameter); + } + insertIndex++; + } +} + +/*! + * \brief ElementParameters::fetchElementExtendsModifiers + * Fetches the Element's extends modifiers and apply modifier values on the appropriate Parameters. + */ +void ElementParametersOld::fetchElementExtendsModifiers() +{ + if (mpElement->getReferenceElement()) { + OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); + QString inheritedClassName; + inheritedClassName = mpElement->getReferenceElement()->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); + QMap extendsModifiersMap = mpElement->getGraphicsView()->getModelWidget()->getExtendsModifiersMap(inheritedClassName); + QMap::iterator extendsModifiersIterator; + for (extendsModifiersIterator = extendsModifiersMap.begin(); extendsModifiersIterator != extendsModifiersMap.end(); ++extendsModifiersIterator) { + QString elementName = StringHandler::getFirstWordBeforeDot(extendsModifiersIterator.key()); + if (mpElement->getName().compare(elementName) == 0) { + /* Ticket #4095 + * Handle parameters display of inherited elements. + */ + QString parameterName = extendsModifiersIterator.key(); + Parameter *pParameter = findParameter(StringHandler::removeFirstWordAfterDot(parameterName)); + if (pParameter) { + if (pParameter->isShowStartAttribute()) { + if (extendsModifiersIterator.key().compare(parameterName + ".start") == 0) { + QString start = extendsModifiersIterator.value(); + if (!start.isEmpty()) { + if (pParameter->getGroup().isEmpty()) { + pParameter->setGroup("Initialization"); + } + pParameter->setShowStartAttribute(true); + pParameter->setValueWidget(start, false, pParameter->getUnit()); + } + } else if (extendsModifiersIterator.key().compare(parameterName + ".fixed") == 0) { + QString fixed = extendsModifiersIterator.value(); + if (!fixed.isEmpty()) { + if (pParameter->getGroup().isEmpty()) { + pParameter->setGroup("Initialization"); + } + pParameter->setShowStartAttribute(true); + pParameter->setFixedState(fixed, false); + } + } + } else if (extendsModifiersIterator.key().compare(parameterName) == 0) { + pParameter->setValueWidget(extendsModifiersIterator.value(), false, pParameter->getUnit()); + } + if (extendsModifiersIterator.key().compare(parameterName + ".displayUnit") == 0) { + QString displayUnit = StringHandler::removeFirstLastQuotes(extendsModifiersIterator.value()); + int index = pParameter->getUnitComboBox()->findData(displayUnit); + if (index < 0) { + // add extends modifier as additional display unit if compatible + index = pParameter->getUnitComboBox()->count() - 1; + if (index > -1 && + (pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(0).toString(), displayUnit)).unitsCompatible) { + pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit); + index ++; + } + } + if (index > -1) { + pParameter->getUnitComboBox()->setCurrentIndex(index); + pParameter->setDisplayUnit(displayUnit); + } + } + } + } + } + } +} + +/*! + * \brief ElementParameters::fetchElementModifiers + * Fetches the Element's modifiers and apply modifier values on the appropriate Parameters. + */ +void ElementParametersOld::fetchElementModifiers() +{ + Element *pElement = mpElement; + if (mpElement->getReferenceElement()) { + pElement = mpElement->getReferenceElement(); + } + OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); + QString className = pElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); + QMap modifiers = pElement->getElementInfo()->getModifiersMap(pOMCProxy, className, mpElement); + QMap::iterator modifiersIterator; + for (modifiersIterator = modifiers.begin(); modifiersIterator != modifiers.end(); ++modifiersIterator) { + QString parameterName = StringHandler::getFirstWordBeforeDot(modifiersIterator.key()); + Parameter *pParameter = findParameter(parameterName); + if (pParameter) { + if (pParameter->isShowStartAttribute()) { + if (modifiersIterator.key().compare(parameterName + ".start") == 0) { + QString start = modifiersIterator.value(); + if (!start.isEmpty()) { + if (pParameter->getGroup().isEmpty()) { + pParameter->setGroup("Initialization"); + } + pParameter->setShowStartAttribute(true); + pParameter->setValueWidget(start, mpElement->getReferenceElement() ? true : false, pParameter->getUnit()); + } + } else if (modifiersIterator.key().compare(parameterName + ".fixed") == 0) { + QString fixed = modifiersIterator.value(); + if (!fixed.isEmpty()) { + if (pParameter->getGroup().isEmpty()) { + pParameter->setGroup("Initialization"); + } + pParameter->setShowStartAttribute(true); + pParameter->setFixedState(fixed, mpElement->getReferenceElement() ? true : false); + } + } + } else if (modifiersIterator.key().compare(parameterName) == 0) { + pParameter->setValueWidget(modifiersIterator.value(), mpElement->getReferenceElement() ? true : false, pParameter->getUnit()); + } + if (modifiersIterator.key().compare(parameterName + ".displayUnit") == 0) { + QString displayUnit = StringHandler::removeFirstLastQuotes(modifiersIterator.value()); + int index = pParameter->getUnitComboBox()->findData(displayUnit); + if (index < 0) { + // add modifier as additional display unit if compatible + index = pParameter->getUnitComboBox()->count() - 1; + if (index > -1 && + (pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(0).toString(), displayUnit)).unitsCompatible) { + pParameter->getUnitComboBox()->addItem(Utilities::convertUnitToSymbol(displayUnit), displayUnit); + index ++; + } + } + if (index > -1) { + pParameter->getUnitComboBox()->setCurrentIndex(index); + pParameter->setDisplayUnit(displayUnit); + } + } + } + } +} + +/*! + * \brief ElementParameters::findParameter + * Finds the Parameter. + * \param pLibraryTreeItem + * \param parameter + * \param caseSensitivity + * \return + */ +Parameter* ElementParametersOld::findParameter(LibraryTreeItem *pLibraryTreeItem, const QString ¶meter, Qt::CaseSensitivity caseSensitivity) const +{ + foreach (Parameter *pParameter, mParametersList) { + if ((pParameter->getElement()->getGraphicsView()->getModelWidget()->getLibraryTreeItem() == pLibraryTreeItem) && + (pParameter->getElement()->getName().compare(parameter, caseSensitivity) == 0)) { + return pParameter; + } + } + return 0; +} + +/*! + * \brief ElementParameters::findParameter + * Finds the Parameter. + * \param parameter + * \param caseSensitivity + * \return + */ +Parameter* ElementParametersOld::findParameter(const QString ¶meter, Qt::CaseSensitivity caseSensitivity) const +{ + foreach (Parameter *pParameter, mParametersList) { + if (pParameter->getElement()->getName().compare(parameter, caseSensitivity) == 0) { + return pParameter; + } + } + return 0; +} + +void ElementParametersOld::commentLinkClicked(QString link) +{ + QUrl linkUrl(link); + if (linkUrl.scheme().compare("modelica") == 0) { + link = link.remove("modelica://"); + LibraryTreeItem *pLibraryTreeItem = MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->findLibraryTreeItem(link); + if (pLibraryTreeItem) { + MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->showModelWidget(pLibraryTreeItem); + } + } else { + QDesktopServices::openUrl(link); + } +} + +/*! + * \brief ElementParameters::updateElementParameters + * Slot activated when mpOkButton clicked signal is raised.\n + * Checks the list of parameters i.e mParametersList and if the value is changed then sets the new value. + */ +void ElementParametersOld::updateElementParameters() +{ + OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy(); + QString className = mpElement->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); + bool valueChanged = false; + // save the Element modifiers + QMap oldElementModifiersMap = mpElement->getElementInfo()->getModifiersMap(pOMCProxy, className, mpElement); + // new Element modifiers + QMap newElementModifiersMap = mpElement->getElementInfo()->getModifiersMap(pOMCProxy, className, mpElement); + QMap newElementExtendsModifiersMap; + // any parameter changed + foreach (Parameter *pParameter, mParametersList) { + QString elementModifierKey = pParameter->getNameLabel()->text(); + QString elementModifierValue = pParameter->getValue(); + // convert the value to display unit + if (!pParameter->getUnit().isEmpty() && pParameter->getUnit().compare(pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString()) != 0) { + bool ok = true; + qreal elementModifierRealValue = elementModifierValue.toDouble(&ok); + // if the modifier is a literal constant + if (ok) { + OMCInterface::convertUnits_res convertUnit = pOMCProxy->convertUnits(pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString(), pParameter->getUnit()); + if (convertUnit.unitsCompatible) { + elementModifierRealValue = Utilities::convertUnit(elementModifierRealValue, convertUnit.offset, convertUnit.scaleFactor); + elementModifierValue = StringHandler::number(elementModifierRealValue); + } + } else { // if expression + elementModifierValue = Utilities::arrayExpressionUnitConversion(pOMCProxy, elementModifierValue, pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString(), pParameter->getUnit()); + } + } + if (pParameter->isValueModified()) { + valueChanged = true; + /* If the element is inherited then add the modifier value into the extends. */ + if (mpElement->isInheritedElement()) { + newElementExtendsModifiersMap.insert(mpElement->getName() + "." + elementModifierKey, elementModifierValue); + } else { + newElementModifiersMap.insert(elementModifierKey, elementModifierValue); + } + } + if (pParameter->isShowStartAttribute() && (pParameter->getFixedState().compare(pParameter->getOriginalFixedValue()) != 0)) { + valueChanged = true; + elementModifierKey = elementModifierKey.replace(".start", ".fixed"); + elementModifierValue = pParameter->getFixedState(); + /* If the element is inherited then add the modifier value into the extends. */ + if (mpElement->isInheritedElement()) { + newElementExtendsModifiersMap.insert(mpElement->getName() + "." + elementModifierKey, elementModifierValue); + } else { + newElementModifiersMap.insert(elementModifierKey, elementModifierValue); + } + } + // remove the .start or .fixed from modifier key + if (pParameter->isShowStartAttribute()) { + if (elementModifierKey.endsWith(".start")) { + elementModifierKey.chop(QString(".start").length()); + } + if (elementModifierKey.endsWith(".fixed")) { + elementModifierKey.chop(QString(".fixed").length()); + } + } + // if displayUnit is changed + if (pParameter->getUnitComboBox()->isEnabled() && pParameter->getDisplayUnit().compare(pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString()) != 0) { + valueChanged = true; + /* If the element is inherited then add the modifier value into the extends. */ + if (mpElement->isInheritedElement()) { + newElementExtendsModifiersMap.insert(mpElement->getName() + "." + elementModifierKey + ".displayUnit", + "\"" + pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString() + "\""); + } else { + newElementModifiersMap.insert(elementModifierKey + ".displayUnit", "\"" + pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString() + "\""); + } + } + } + // any new modifier is added + if (!mpModifiersTextBox->text().isEmpty()) { + QString regexp ("\\s*([A-Za-z0-9._]+\\s*)\\(\\s*([A-Za-z0-9._]+)\\s*=\\s*([A-Za-z0-9._]+)\\s*\\)$"); + QRegExp modifierRegExp (regexp); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) + QStringList modifiers = mpModifiersTextBox->text().split(",", Qt::SkipEmptyParts); +#else // QT_VERSION_CHECK + QStringList modifiers = mpModifiersTextBox->text().split(",", QString::SkipEmptyParts); +#endif // QT_VERSION_CHECK + foreach (QString modifier, modifiers) { + modifier = modifier.trimmed(); + if (modifierRegExp.exactMatch(modifier)) { + valueChanged = true; + QString elementModifierKey = modifier.mid(0, modifier.indexOf("(")); + QString elementModifierValue = modifier.mid(modifier.indexOf("(")); + newElementModifiersMap.insert(elementModifierKey, elementModifierValue); + } else { + MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, + GUIMessages::getMessage(GUIMessages::WRONG_MODIFIER).arg(modifier), + Helper::scriptingKind, Helper::errorLevel)); + } + } + } + // if valueChanged is true then put the change in the undo stack. + if (valueChanged) { + // save the Element extends modifiers + QMap oldElementExtendsModifiersMap; + if (mpElement->getReferenceElement()) { + QString inheritedClassName; + inheritedClassName = mpElement->getReferenceElement()->getGraphicsView()->getModelWidget()->getLibraryTreeItem()->getNameStructure(); + oldElementExtendsModifiersMap = mpElement->getGraphicsView()->getModelWidget()->getExtendsModifiersMap(inheritedClassName); + } + // create UpdateElementParametersCommand + UpdateElementParametersCommand *pUpdateElementParametersCommand; + pUpdateElementParametersCommand = new UpdateElementParametersCommand(mpElement, oldElementModifiersMap, oldElementExtendsModifiersMap, + newElementModifiersMap, newElementExtendsModifiersMap); + mpElement->getGraphicsView()->getModelWidget()->getUndoStack()->push(pUpdateElementParametersCommand); + mpElement->getGraphicsView()->getModelWidget()->updateModelText(); + } + accept(); +} + /*! * \class ElementAttributes * \brief A dialog for displaying elements attributes like visibility, stream, casuality etc. diff --git a/OMEdit/OMEditLIB/Element/ElementProperties.h b/OMEdit/OMEditLIB/Element/ElementProperties.h index 71c35261d6c..389894b2ceb 100644 --- a/OMEdit/OMEditLIB/Element/ElementProperties.h +++ b/OMEdit/OMEditLIB/Element/ElementProperties.h @@ -39,6 +39,7 @@ #include +class ElementParametersOld; class ElementParameters; class Parameter : public QObject { @@ -59,12 +60,14 @@ class Parameter : public QObject ModelInstance::Component* getModelInstanceComponent() {return mpModelInstanceComponent;} void setTab(QString tab) {mTab = tab;} StringAnnotation getTab() {return mTab;} - void setGroupBox(QString groupBox) {mGroupBox = groupBox;} - StringAnnotation getGroupBox() {return mGroupBox;} - void setGroupBoxDefined(bool groupBoxDefined) {mGroupBoxDefined = groupBoxDefined;} - bool isGroupBoxDefined() const {return mGroupBoxDefined;} + void setGroup(QString group) {mGroup = group;} + StringAnnotation getGroup() {return mGroup;} + void setGroupDefined(bool groupDefined) {mGroupDefined = groupDefined;} + bool isGroupDefined() const {return mGroupDefined;} void setShowStartAttribute(bool showStartAttribute) {mShowStartAttribute = showStartAttribute;} - bool isShowStartAttribute() {return mShowStartAttribute;} + bool isShowStartAttribute() const {return mShowStartAttribute;} + void setShowStartAndFixed(bool showStartAndFixed) {mShowStartAndFixed = showStartAndFixed;} + bool isShowStartAndFixed() const {return mShowStartAndFixed;} StringAnnotation getGroupImage() const {return mGroupImage;} void updateNameLabel(); Label* getNameLabel() {return mpNameLabel;} @@ -76,6 +79,7 @@ class Parameter : public QObject QWidget* getValueWidget(); bool isValueModified(); QString getValue(); + QToolButton *getModifyReplaceableButton() const {return mpModifyReplaceableButton;} QToolButton* getFileSelectorButton() {return mpFileSelectorButton;} void setLoadSelectorFilter(QString loadSelectorFilter) {mLoadSelectorFilter = loadSelectorFilter;} QString getLoadSelectorFilter() {return mLoadSelectorFilter;} @@ -99,10 +103,11 @@ class Parameter : public QObject ModelInstance::Component *mpModelInstanceComponent; ElementParameters *mpElementParameters = 0; StringAnnotation mTab; - StringAnnotation mGroupBox; - bool mGroupBoxDefined; + StringAnnotation mGroup; + bool mGroupDefined; BooleanAnnotation mEnable; BooleanAnnotation mShowStartAttribute; + bool mShowStartAndFixed; BooleanAnnotation mColorSelector; StringAnnotation mLoadSelectorFilter; StringAnnotation mLoadSelectorCaption; @@ -120,6 +125,7 @@ class Parameter : public QObject QComboBox *mpValueComboBox; QLineEdit *mpValueTextBox; QCheckBox *mpValueCheckBox; + QToolButton *mpModifyReplaceableButton = 0; QToolButton *mpFileSelectorButton; QString mUnit; QString mDisplayUnit; @@ -131,6 +137,7 @@ class Parameter : public QObject void enableDisableUnitComboBox(const QString &value); void updateValueBinding(const FlatModelica::Expression expression); public slots: + void modifyReplaceableButtonClicked(); void fileSelectorButtonClicked(); void unitComboBoxChanged(int index); void valueComboBoxChanged(int index); @@ -176,8 +183,59 @@ class ElementParameters : public QDialog { Q_OBJECT public: - ElementParameters(Element *pComponent, QWidget *pParent = 0); + ElementParameters(ModelInstance::Component *pComponent, GraphicsView *pGraphicsView, bool inherited, bool nested, QWidget *pParent = 0); ~ElementParameters(); + GraphicsView *getGraphicsView() const {return mpGraphicsView;} + bool isInherited() const {return mInherited;} + bool isNested() const {return mNested;} + QString getModification() const {return mModification;} + void updateParameters(); +private: + ModelInstance::Component *mpElement; + GraphicsView *mpGraphicsView; + bool mInherited; + bool mNested; + QString mModification; + Label *mpParametersHeading; + QFrame *mHorizontalLine; + QTabWidget *mpParametersTabWidget; + QGroupBox *mpComponentGroupBox; + Label *mpComponentNameLabel; + Label *mpComponentNameTextBox; + Label *mpComponentCommentLabel; + Label *mpComponentCommentTextBox; + QGroupBox *mpComponentClassGroupBox; + Label *mpComponentClassNameLabel; + Label *mpComponentClassNameTextBox; + Label *mpComponentClassCommentLabel; + Label *mpComponentClassCommentTextBox; + Label *mpModifiersLabel; + QLineEdit *mpModifiersTextBox; + QMap mTabsMap; + QList mParametersList; + QPushButton *mpOkButton; + QPushButton *mpCancelButton; + QDialogButtonBox *mpButtonBox; + + void setUpDialog(); + void createTabsGroupBoxesAndParameters(ModelInstance::Model *pModelInstance); + void fetchElementExtendsModifiers(ModelInstance::Model *pModelInstance); + void fetchElementModifiers(); + void fetchClassExtendsModifiers(); + Parameter* findParameter(LibraryTreeItem *pLibraryTreeItem, const QString ¶meter, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) const; + Parameter* findParameter(const QString ¶meter, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) const; +public slots: + void commentLinkClicked(QString link); + void updateElementParameters(); + virtual void reject() override; +}; + +class ElementParametersOld : public QDialog +{ + Q_OBJECT +public: + ElementParametersOld(Element *pComponent, QWidget *pParent = 0); + ~ElementParametersOld(); void updateParameters(); private: @@ -199,7 +257,6 @@ class ElementParameters : public QDialog QLineEdit *mpModifiersTextBox; QMap mTabsMap; QList mParametersList; - QList mOrderedParametersList; QPushButton *mpOkButton; QPushButton *mpCancelButton; QDialogButtonBox *mpButtonBox; @@ -207,18 +264,13 @@ class ElementParameters : public QDialog void setUpDialog(); void createTabsGroupBoxesAndParameters(LibraryTreeItem *pLibraryTreeItem); void createTabsGroupBoxesAndParametersHelper(LibraryTreeItem *pLibraryTreeItem, bool useInsert = false); - void createTabsGroupBoxesAndParameters(ModelInstance::Model *pModelInstance); - void createTabsGroupBoxesAndParametersHelper(ModelInstance::Model *pModelInstance, bool useInsert = false); - void fetchElementExtendsModifiers(ModelInstance::Model *pModelInstance); void fetchElementExtendsModifiers(); void fetchElementModifiers(); - void fetchClassExtendsModifiers(); Parameter* findParameter(LibraryTreeItem *pLibraryTreeItem, const QString ¶meter, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) const; Parameter* findParameter(const QString ¶meter, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) const; public slots: void commentLinkClicked(QString link); void updateElementParameters(); - virtual void reject() override; }; class ElementAttributes : public QDialog diff --git a/OMEdit/OMEditLIB/Modeling/Model.cpp b/OMEdit/OMEditLIB/Modeling/Model.cpp index f90dbe86779..122d9311687 100644 --- a/OMEdit/OMEditLIB/Modeling/Model.cpp +++ b/OMEdit/OMEditLIB/Modeling/Model.cpp @@ -253,8 +253,8 @@ namespace ModelInstance Extend *Shape::getParentExtend() const { - if (mpParentModel && mpParentModel->getParentElement() && mpParentModel->getParentElement()->isExtend()) { - return dynamic_cast(mpParentModel->getParentElement()); + if (mpParentModel) { + return mpParentModel->getParentExtend(); } return 0; } @@ -950,6 +950,24 @@ namespace ModelInstance } } + Extend *Model::getParentExtend() const + { + if (mpParentElement && mpParentElement->isExtend()) { + return dynamic_cast(mpParentElement); + } else { + return 0; + } + } + + Component *Model::getParentComponent() const + { + if (mpParentElement && mpParentElement->isComponent()) { + return dynamic_cast(mpParentElement); + } else { + return 0; + } + } + bool Model::isConnector() const { if (isExpandableConnector() || (mRestriction.compare(QStringLiteral("connector")) == 0)) { @@ -1468,6 +1486,20 @@ namespace ModelInstance return modifierValue; } + /*! + * \brief Component::getQualifiedName + * Returns the qualified name of the component. + * \return + */ + QString Component::getQualifiedName() const + { + if (mpParentModel && mpParentModel->getParentElement()) { + return mpParentModel->getParentElement()->getQualifiedName() % "." % mName; + } else { + return mName; + } + } + Extend::Extend(Model *pParentModel, const QJsonObject &jsonObject) : Element(pParentModel) { @@ -1490,6 +1522,20 @@ namespace ModelInstance } } + /*! + * \brief Extend::getQualifiedName + * Returns the qualified name of component. + * \return + */ + QString Extend::getQualifiedName() const + { + if (mpParentModel && mpParentModel->getParentElement()) { + return mpParentModel->getParentElement()->getQualifiedName(); + } else { + return ""; + } + } + Part::Part() { mName = ""; @@ -1515,7 +1561,7 @@ namespace ModelInstance if (mSubScripts.isEmpty()) { return mName; } else { - return QString("%1[%2]").arg(mName, mSubScripts.join(",")); + return mName % "[" % mSubScripts.join(",") % "]"; } } diff --git a/OMEdit/OMEditLIB/Modeling/Model.h b/OMEdit/OMEditLIB/Modeling/Model.h index 774a89b6a4b..4522d3c0113 100644 --- a/OMEdit/OMEditLIB/Modeling/Model.h +++ b/OMEdit/OMEditLIB/Modeling/Model.h @@ -479,6 +479,7 @@ namespace ModelInstance }; class Element; + class Component; class Connection; class Transition; class InitialState; @@ -490,6 +491,8 @@ namespace ModelInstance void deserialize(); Element *getParentElement() const {return mpParentElement;} + Extend *getParentExtend() const; + Component *getParentComponent() const; QJsonObject getModelJson() const {return mModelJson;} void setModelJson(const QJsonObject &modelJson) {mModelJson = modelJson;} QString getName() const {return mName;} @@ -569,6 +572,7 @@ namespace ModelInstance void setModel(Model *pModel) {mpModel = pModel;} Model *getModel() const {return mpModel;} + virtual QString getQualifiedName() const = 0; virtual bool isComponent() const = 0; virtual bool isExtend() const = 0; protected: @@ -634,6 +638,7 @@ namespace ModelInstance static QString getModifierValueFromInheritedType(Model *pModel, QStringList modifierName); // Element interface public: + virtual QString getQualifiedName() const override; virtual bool isComponent() const override {return true;} virtual bool isExtend() const override {return false;} }; @@ -651,6 +656,7 @@ namespace ModelInstance Modifier mExtendsModifier; // Element interface public: + virtual QString getQualifiedName() const override; virtual bool isComponent() const override {return false;} virtual bool isExtend() const override {return true;} };