Skip to content

Commit

Permalink
Update the modifiers that are changed (#10660)
Browse files Browse the repository at this point in the history
Fixes #10651
If the modifier value starts with redeclare or with the modifier name then don't add the modifier name to the api.
Fix the calling of set*ModifierValue api for both instance and non instance case.
  • Loading branch information
adeas31 committed May 8, 2023
1 parent 6e60fc3 commit 2cbc1eb
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 57 deletions.
67 changes: 23 additions & 44 deletions OMEdit/OMEditLIB/Element/ElementProperties.cpp
Expand Up @@ -1533,12 +1533,6 @@ void ElementParameters::commentLinkClicked(QString link)
}
}

typedef struct {
QString mKey;
QString mValue;
bool mIsReplaceable;
} ElementModifier;

/*!
* \brief ElementParameters::updateElementParameters
* Slot activated when mpOkButton clicked signal is raised.\n
Expand All @@ -1551,17 +1545,15 @@ void ElementParameters::updateElementParameters()
QString className = pModelWidget->getLibraryTreeItem()->getNameStructure();
OMCProxy *pOMCProxy = MainWindow::instance()->getOMCProxy();
bool valueChanged = false;
QList<ElementModifier> elementModifiersList;
QMap<QString, QString> elementModifiersMap;
// any parameter changed
foreach (Parameter *pParameter, mParametersList) {
// if parameter is not visible then continue
if (pParameter->getGroup().isEmpty()) {
continue;
}
ElementModifier elementModifier;
elementModifier.mKey = pParameter->getNameLabel()->text();
QString elementModifierKey = pParameter->getNameLabel()->text();
QString elementModifierValue = pParameter->getValue();
elementModifier.mIsReplaceable = (pParameter->getValueType() == Parameter::ReplaceableClass || pParameter->getValueType() == Parameter::ReplaceableComponent);
// convert the value to display unit
if (!pParameter->getUnit().isEmpty() && pParameter->getUnit().compare(pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString()) != 0) {
bool ok = true;
Expand All @@ -1577,33 +1569,30 @@ void ElementParameters::updateElementParameters()
elementModifierValue = Utilities::arrayExpressionUnitConversion(pOMCProxy, elementModifierValue, pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString(), pParameter->getUnit());
}
}
elementModifier.mValue = elementModifierValue;
if (pParameter->isValueModified()) {
valueChanged = true;
elementModifiersList.append(elementModifier);
elementModifiersMap.insert(elementModifierKey, elementModifierValue);
}
if (pParameter->isShowStartAndFixed() && (pParameter->getFixedState().compare(pParameter->getOriginalFixedValue()) != 0)) {
valueChanged = true;
elementModifier.mKey.replace(".start", ".fixed");
elementModifier.mValue = pParameter->getFixedState();
elementModifiersList.append(elementModifier);
elementModifierKey = elementModifierKey.replace(".start", ".fixed");
elementModifierValue = pParameter->getFixedState();
elementModifiersMap.insert(elementModifierKey, elementModifierValue);
}
// remove the .start or .fixed from modifier key
if (pParameter->isShowStartAndFixed()) {
if (elementModifier.mKey.endsWith(".start")) {
elementModifier.mKey.chop(QString(".start").length());
if (elementModifierKey.endsWith(".start")) {
elementModifierKey.chop(QString(".start").length());
}
if (elementModifier.mKey.endsWith(".fixed")) {
elementModifier.mKey.chop(QString(".fixed").length());
if (elementModifierKey.endsWith(".fixed")) {
elementModifierKey.chop(QString(".fixed").length());
}
}
// if displayUnit is changed
const QString unit = pParameter->getUnitComboBox()->itemData(pParameter->getUnitComboBox()->currentIndex()).toString();
if (pParameter->getUnitComboBox()->isEnabled() && !unit.isEmpty() && pParameter->getDisplayUnit().compare(unit) != 0) {
valueChanged = true;
elementModifier.mKey = elementModifier.mKey % ".displayUnit";
elementModifier.mValue = "\"" + unit + "\"";
elementModifiersList.append(elementModifier);
elementModifiersMap.insert(elementModifierKey % ".displayUnit", "\"" + unit + "\"");
}
}
// any new modifier is added
Expand All @@ -1616,14 +1605,12 @@ void ElementParameters::updateElementParameters()
QStringList modifiers = mpModifiersTextBox->text().split(",", QString::SkipEmptyParts);
#endif // QT_VERSION_CHECK
foreach (QString modifier, modifiers) {
ElementModifier elementModifier;
modifier = modifier.trimmed();
if (modifierRegExp.exactMatch(modifier)) {
valueChanged = true;
elementModifier.mKey = modifier.mid(0, modifier.indexOf("("));
elementModifier.mValue = modifier.mid(modifier.indexOf("("));
elementModifier.mIsReplaceable = false;
elementModifiersList.append(elementModifier);
QString elementModifierKey = modifier.mid(0, modifier.indexOf("("));
QString elementModifierValue = modifier.mid(modifier.indexOf("("));
elementModifiersMap.insert(elementModifierKey, elementModifierValue);
} else {
MessagesWidget::instance()->addGUIMessage(MessageItem(MessageItem::Modelica, GUIMessages::getMessage(GUIMessages::WRONG_MODIFIER).arg(modifier),
Helper::scriptingKind, Helper::errorLevel));
Expand All @@ -1634,30 +1621,22 @@ void ElementParameters::updateElementParameters()
if (valueChanged) {
if (mNested) {
QStringList modifications;
foreach (ElementModifier elementModifier, elementModifiersList) {
QString modifierValue = elementModifier.mValue.trimmed();
if (elementModifier.mIsReplaceable) {
QMap<QString, QString>::iterator newElementModifier;
for (newElementModifier = elementModifiersMap.begin(); newElementModifier != elementModifiersMap.end(); ++newElementModifier) {
QString modifierValue = newElementModifier.value().trimmed();
if (modifierValue.startsWith(QStringLiteral("redeclare"))) {
modifications.append(modifierValue);
} else {
modifications.append(elementModifier.mKey % "=" % modifierValue);
modifications.append(newElementModifier.key() % "=" % modifierValue);
}
}
mModification = mpElement->getName() % "(" % modifications.join(",") % ")";
} else {
// apply the new Component modifiers if any
foreach (ElementModifier elementModifier, elementModifiersList) {
QString modifierKey;
QString modifierValue;
if (elementModifier.mValue.isEmpty()) {
modifierKey = mpElement->getName() % "." % elementModifier.mKey;
modifierValue = elementModifier.mValue;
} else if (elementModifier.mIsReplaceable) {
modifierKey = mpElement->getName();
modifierValue = elementModifier.mValue;
} else {
modifierKey = mpElement->getName() % "." % elementModifier.mKey;
modifierValue = "=" % elementModifier.mValue;
}
QMap<QString, QString>::iterator newElementModifier;
for (newElementModifier = elementModifiersMap.begin(); newElementModifier != elementModifiersMap.end(); ++newElementModifier) {
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 (mInherited) {
pOMCProxy->setExtendsModifierValue(className, mpElement->getParentModel()->getName(), modifierKey, modifierValue);
Expand Down
38 changes: 26 additions & 12 deletions OMEdit/OMEditLIB/OMC/OMCProxy.cpp
Expand Up @@ -1072,22 +1072,25 @@ QString OMCProxy::getElementModifierValue(QString className, QString name)
}

/*!
Sets the element modifier value.
\param className - is the name of the class whose modifier value is set.
\param name - is the name of the modifier whose value is set.
\param value - is the value to set.
\return true on success.
*/
* \brief OMCProxy::setElementModifierValue
* Sets the element modifier value.
* \param className - is the name of the class whose modifier value is set.
* \param modifierName - is the name of the modifier whose value is set.
* \param modifierValue - is the value to set.
* \return true on success.
*/
bool OMCProxy::setElementModifierValue(QString className, QString modifierName, QString modifierValue)
{
const QString sapi = QString("setElementModifierValue");
QString expression;
if (modifierValue.isEmpty()) {
expression = QString("%1(%2, %3, $Code(()))").arg(sapi).arg(className).arg(modifierName);
} else if (modifierValue.startsWith("=")) {
expression = QString("%1(%2, %3, $Code(%4))").arg(sapi).arg(className).arg(modifierName).arg(modifierValue);
} else {
} else if (modifierValue.startsWith(QStringLiteral("redeclare")) || modifierValue.startsWith(StringHandler::getLastWordAfterDot(modifierName))) {
// Do not give name of the element being redeclared, only the name of the element the redeclare modifier is applied to
modifierName = StringHandler::removeLastWordAfterDot(modifierName);
expression = QString("%1(%2, %3, $Code((%4)))").arg(sapi).arg(className).arg(modifierName).arg(modifierValue);
} else {
expression = QString("%1(%2, %3, $Code(=%4))").arg(sapi).arg(className).arg(modifierName).arg(modifierValue);
}
sendCommand(expression);
if (StringHandler::unparseBool(getResult())) {
Expand Down Expand Up @@ -1148,16 +1151,27 @@ QString OMCProxy::getExtendsModifierValue(QString className, QString extendsClas
return getResult().trimmed();
}

/*!
* \brief OMCProxy::setExtendsModifierValue
* Sets the extends modifier value.
* \param className - is the name of the class whose modifier value is set.
* \param extendsClassName - is the name of the extends class.
* \param modifierName - is the name of the modifier whose value is set.
* \param modifierValue - is the value to set.
* \return true on success.
*/
bool OMCProxy::setExtendsModifierValue(QString className, QString extendsClassName, QString modifierName, QString modifierValue)
{
const QString sapi = QString("setExtendsModifierValue");
QString expression;
if (modifierValue.isEmpty()) {
expression = QString("%1(%2, %3, %4, $Code(()))").arg(sapi, className, extendsClassName, modifierName);
} else if (modifierValue.startsWith("=")) {
expression = QString("%1(%2, %3, %4, $Code(%5))").arg(sapi, className, extendsClassName, modifierName, modifierValue);
} else {
} else if (modifierValue.startsWith(QStringLiteral("redeclare")) || modifierValue.startsWith(StringHandler::getLastWordAfterDot(modifierName))) {
// Do not give name of the element being redeclared, only the name of the element the redeclare modifier is applied to
modifierName = StringHandler::removeLastWordAfterDot(modifierName);
expression = QString("%1(%2, %3, %4, $Code((%5)))").arg(sapi, className, extendsClassName, modifierName, modifierValue);
} else {
expression = QString("%1(%2, %3, %4, $Code(=%5))").arg(sapi, className, extendsClassName, modifierName, modifierValue);
}
sendCommand(expression);
if (StringHandler::unparseBool(getResult())) {
Expand Down
2 changes: 1 addition & 1 deletion OMEdit/OMEditLIB/OMC/OMCProxy.h
Expand Up @@ -133,7 +133,7 @@ class OMCProxy : public QObject
QString getParameterValue(const QString &className, const QString &parameter);
QStringList getElementModifierNames(QString className, QString name);
QString getElementModifierValue(QString className, QString name);
bool setElementModifierValue(QString className, QString name, QString modifierValue);
bool setElementModifierValue(QString className, QString modifierName, QString modifierValue);
bool removeElementModifiers(QString className, QString name);
QString getElementModifierValues(QString className, QString name);
QStringList getExtendsModifierNames(QString className, QString extendsClassName);
Expand Down

0 comments on commit 2cbc1eb

Please sign in to comment.