Skip to content

Commit

Permalink
Added a context menu to allow setting final and each modifiers (#11019)
Browse files Browse the repository at this point in the history
Fixes #5395, Fixes #5405, Fixes #5489, Fixes #5737, Fixes #7750 and Fixes #10226

Apply the modifiers with one call of `setElementModifierValue`.
Added a new button for final and each context menu.
Improved the handling of modifiers.
  • Loading branch information
adeas31 committed Nov 2, 2023
1 parent 6289c24 commit 0281e54
Show file tree
Hide file tree
Showing 14 changed files with 606 additions and 203 deletions.
3 changes: 2 additions & 1 deletion OMEdit/OMEditLIB/Element/Element.cpp
Expand Up @@ -3568,7 +3568,8 @@ void Element::duplicate()
ModelInstance::Component *pModelInstanceComponent = GraphicsView::createModelInstanceComponent(mpGraphicsView->getModelWidget()->getModelInstance(), name, getClassName());
mpGraphicsView->addElementToView(pModelInstanceComponent, false, true, false, QPointF(0, 0), getOMCPlacementAnnotation(gridStep), false);
// set modifiers
GraphicsView::setModifiers(mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure(), name, "", mpModelComponent->getModifier());
MainWindow::instance()->getOMCProxy()->setElementModifierValue(mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure(), name,
mpModelComponent->getModifier().toString());
} else {
mpElementInfo->getModifiersMap(MainWindow::instance()->getOMCProxy(), mpGraphicsView->getModelWidget()->getLibraryTreeItem()->getNameStructure(), this);
ElementInfo *pElementInfo = new ElementInfo(mpElementInfo);
Expand Down
302 changes: 240 additions & 62 deletions OMEdit/OMEditLIB/Element/ElementProperties.cpp

Large diffs are not rendered by default.

35 changes: 33 additions & 2 deletions OMEdit/OMEditLIB/Element/ElementProperties.h
Expand Up @@ -39,6 +39,27 @@

#include <QRadioButton>

class FinalEachToolButton : public QToolButton
{
Q_OBJECT
public:
FinalEachToolButton(bool canHaveEach, QWidget *parent = nullptr);

void setFinal(bool final);
bool isFinal() const {return mpFinalAction->isChecked();}
void setEach(bool each);
bool isEach() const {return mpEachAction->isChecked();}
bool isModified() const;
private:
QMenu *mpFinalEachMenu;
QAction *mpFinalAction;
bool mFinalDefault = false;
QAction *mpEachAction;
bool mEachDefault = false;
public slots:
void showParameterMenu();
};

class ElementParametersOld;
class ElementParameters;
class Parameter : public QObject
Expand Down Expand Up @@ -74,14 +95,16 @@ class Parameter : public QObject
void updateNameLabel();
Label* getNameLabel() {return mpNameLabel;}
FixedCheckBox* getFixedCheckBox() {return mpFixedCheckBox;}
QString getOriginalFixedValue() {return mOriginalFixedValue;}
QString getOriginalFixedValue() const {return mOriginalFixedValue;}
FinalEachToolButton *getFixedFinalEachMenu() const {return mpFixedFinalEachMenuButton;}
void setValueType(ValueType valueType) {mValueType = valueType;}
void setValueWidget(QString value, bool defaultValue, QString fromUnit, bool valueModified = false, bool adjustSize = true, bool unitComboBoxChanged = false);
ValueType getValueType() {return mValueType;}
QWidget* getValueWidget();
bool isValueModified();
QString getValue();
QToolButton *getEditRedeclareClassButton() const {return mpEditRedeclareClassButton;}
FinalEachToolButton *getFinalEachMenu() const {return mpFinalEachMenuButton;}
QToolButton* getFileSelectorButton() {return mpFileSelectorButton;}
void setLoadSelectorFilter(QString loadSelectorFilter) {mLoadSelectorFilter = loadSelectorFilter;}
QString getLoadSelectorFilter() {return mLoadSelectorFilter;}
Expand All @@ -91,10 +114,13 @@ class Parameter : public QObject
QString getSaveSelectorFilter() {return mSaveSelectorFilter;}
void setSaveSelectorCaption(QString saveSelectorCaption) {mSaveSelectorCaption = saveSelectorCaption;}
QString getSaveSelectorCaption() {return mSaveSelectorCaption;}
void setHasDisplayUnit(bool hasDisplayUnit) {mHasDisplayUnit = hasDisplayUnit;}
bool hasDisplayUnit() const {return mHasDisplayUnit;}
QString getUnit() {return mUnit;}
void setDisplayUnit(QString displayUnit) {mDisplayUnit = displayUnit;}
QString getDisplayUnit() {return mDisplayUnit;}
QComboBox* getUnitComboBox() {return mpUnitComboBox;}
FinalEachToolButton *getDisplayUnitFinalEachMenu() const {return mpDisplayUnitFinalEachMenuButton;}
Label* getCommentLabel() {return mpCommentLabel;}
void setFixedState(QString fixed, bool defaultValue);
QString getFixedState() const;
Expand Down Expand Up @@ -122,23 +148,28 @@ class Parameter : public QObject
Label *mpNameLabel;
FixedCheckBox *mpFixedCheckBox;
QString mOriginalFixedValue;
FinalEachToolButton *mpFixedFinalEachMenuButton = 0;
ValueType mValueType;
bool mValueCheckBoxModified;
QString mDefaultValue;
QComboBox *mpValueComboBox;
QLineEdit *mpValueTextBox;
QCheckBox *mpValueCheckBox;
QToolButton *mpEditRedeclareClassButton = 0;
FinalEachToolButton *mpFinalEachMenuButton = 0;
QToolButton *mpFileSelectorButton;
bool mHasDisplayUnit = false;
QString mUnit;
QString mDisplayUnit;
QString mPreviousUnit;
QComboBox *mpUnitComboBox;
FinalEachToolButton *mpDisplayUnitFinalEachMenuButton = 0;
Label *mpCommentLabel;

void createValueWidget();
void enableDisableUnitComboBox(const QString &value);
void updateValueBinding(const FlatModelica::Expression expression);
bool isValueModifiedHelper() const;
public slots:
void editRedeclareClassButtonClicked();
void fileSelectorButtonClicked();
Expand Down Expand Up @@ -193,7 +224,7 @@ class ElementParameters : public QDialog
GraphicsView *getGraphicsView() const {return mpGraphicsView;}
bool isInherited() const {return mInherited;}
QString getModification() const {return mModification;}
void applyFinalStartFixedAndDisplayUnitModifiers(Parameter *pParameter, const ModelInstance::Modifier &modifier, bool defaultValue, bool isElementModification);
void applyFinalStartFixedAndDisplayUnitModifiers(Parameter *pParameter, const ModelInstance::Modifier &modifier, bool defaultValue, bool isElementModification, bool checkFinal);
void updateParameters();
private:
ModelInstance::Element *mpElement;
Expand Down
10 changes: 5 additions & 5 deletions OMEdit/OMEditLIB/Modeling/Commands.cpp
Expand Up @@ -566,7 +566,7 @@ void UpdateElementAttributesCommand::updateComponentModifiers(Element *pComponen
for (modifiersIterator = modifiers.begin(); modifiersIterator != modifiers.end(); ++modifiersIterator) {
QString modifierName = QString(pComponent->getName()).append(".").append(modifiersIterator.key());
QString modifierValue = modifiersIterator.value();
if (MainWindow::instance()->getOMCProxy()->setElementModifierValue(modelName, modifierName, modifierValue)) {
if (MainWindow::instance()->getOMCProxy()->setElementModifierValueOld(modelName, modifierName, modifierValue)) {
modifierValueChanged = true;
}
}
Expand Down Expand Up @@ -606,7 +606,7 @@ void UpdateElementParametersCommand::redoInternal()
for (componentModifier = mNewComponentModifiersMap.begin(); componentModifier != mNewComponentModifiersMap.end(); ++componentModifier) {
QString modifierValue = componentModifier.value();
QString modifierKey = QString(mpComponent->getName()).append(".").append(componentModifier.key());
pOMCProxy->setElementModifierValue(className, modifierKey, modifierValue);
pOMCProxy->setElementModifierValueOld(className, modifierKey, modifierValue);
}
// we want to load modifiers even if they are loaded already
mpComponent->getElementInfo()->setModifiersLoaded(false);
Expand All @@ -618,7 +618,7 @@ void UpdateElementParametersCommand::redoInternal()
QMap<QString, QString>::iterator componentExtendsModifier;
for (componentExtendsModifier = mNewComponentExtendsModifiersMap.begin(); componentExtendsModifier != mNewComponentExtendsModifiersMap.end(); ++componentExtendsModifier) {
QString modifierValue = componentExtendsModifier.value();
pOMCProxy->setExtendsModifierValue(className, inheritedClassName, componentExtendsModifier.key(), modifierValue);
pOMCProxy->setExtendsModifierValueOld(className, inheritedClassName, componentExtendsModifier.key(), modifierValue);
}
mpComponent->getGraphicsView()->getModelWidget()->fetchExtendsModifiers(inheritedClassName);
}
Expand All @@ -641,7 +641,7 @@ void UpdateElementParametersCommand::undo()
for (componentModifier = mOldComponentModifiersMap.begin(); componentModifier != mOldComponentModifiersMap.end(); ++componentModifier) {
QString modifierValue = componentModifier.value();
QString modifierKey = QString(mpComponent->getName()).append(".").append(componentModifier.key());
pOMCProxy->setElementModifierValue(className, modifierKey, modifierValue);
pOMCProxy->setElementModifierValueOld(className, modifierKey, modifierValue);
}
// we want to load modifiers even if they are loaded already
mpComponent->getElementInfo()->setModifiersLoaded(false);
Expand All @@ -655,7 +655,7 @@ void UpdateElementParametersCommand::undo()
QMap<QString, QString>::iterator componentExtendsModifier;
for (componentExtendsModifier = mOldComponentExtendsModifiersMap.begin(); componentExtendsModifier != mOldComponentExtendsModifiersMap.end(); ++componentExtendsModifier) {
QString modifierValue = componentExtendsModifier.value();
pOMCProxy->setExtendsModifierValue(className, inheritedClassName, componentExtendsModifier.key(), modifierValue);
pOMCProxy->setExtendsModifierValueOld(className, inheritedClassName, componentExtendsModifier.key(), modifierValue);
}
mpComponent->getGraphicsView()->getModelWidget()->fetchExtendsModifiers(inheritedClassName);
}
Expand Down
67 changes: 48 additions & 19 deletions OMEdit/OMEditLIB/Modeling/Model.cpp
Expand Up @@ -720,41 +720,50 @@ namespace ModelInstance
}
}

QString Modifier::getValueWithSubModifiers() const
QString Modifier::toString() const
{
if (mModifiers.isEmpty()) {
if (isRedeclare()) {
return mValue;
} else {
QStringList modifiers;
QString value;
value.append(printRedeclare());
value.append(printEach());
value.append(printFinal());
value.append(printReplaceable());
value.append(mName);
QStringList subModifiers;
foreach (auto subModifier, mModifiers) {
if (subModifier.getModifiers().isEmpty()) {
modifiers.append(subModifier.getName() % "=" % subModifier.getValue());
} else {
modifiers.append(subModifier.getName() % subModifier.getValueWithSubModifiers());
}
subModifiers.append(subModifier.toString());
}
if (!subModifiers.isEmpty()) {
value.append("(" % subModifiers.join(", ") % ")");
}
if (mValue.isEmpty()) {
return value;
} else {
return value.append(mName.isEmpty() ? mValue : " = " % mValue);
}
return "(" % modifiers.join(",") % ")";
}
}

QString Modifier::getModifier(const QString &m) const
Modifier Modifier::getModifier(const QString &m) const
{
foreach (auto modifier, mModifiers) {
foreach (Modifier modifier, mModifiers) {
if (modifier.getName().compare(m) == 0) {
return modifier.getValue();
return modifier;
}
}
return "";
return Modifier();
}

QString Modifier::getModifierValue(const QString &m) const
{
return getModifier(m).getValue();
}

bool Modifier::hasModifier(const QString &m) const
{
foreach (auto modifier, mModifiers) {
if (modifier.getName().compare(m) == 0) {
return true;
}
}
return false;
return getModifier(m).getName().compare(m) == 0;
}

QString Modifier::getModifierValue(QStringList qualifiedModifierName) const
Expand Down Expand Up @@ -787,6 +796,26 @@ namespace ModelInstance
return "";
}

QString Modifier::printEach() const
{
return isEach() ? "each " : "";
}

QString Modifier::printFinal() const
{
return isFinal() ? "final " : "";
}

QString Modifier::printRedeclare() const
{
return isRedeclare() ? "redeclare " : "";
}

QString Modifier::printReplaceable() const
{
return isReplaceable() ? "replaceable " : "";
}

Replaceable::Replaceable(Model *pParentModel)
{
mpParentModel = pParentModel;
Expand Down
13 changes: 10 additions & 3 deletions OMEdit/OMEditLIB/Modeling/Model.h
Expand Up @@ -460,15 +460,22 @@ namespace ModelInstance
void setName(const QString &name) {mName = name;}
const QString &getValue() const {return mValue;}
QString getValueWithoutQuotes() const {return StringHandler::removeFirstLastQuotes(getValue());}
QString getValueWithSubModifiers() const;
QString getModifier(const QString &m) const;
bool hasModifier(const QString &m) const;
QString toString() const;
Modifier getModifier(const QString &m) const;
QString getModifierValue(const QString &m) const;
bool hasModifier(const QString &modifier) const;
const QList<Modifier> &getModifiers() const {return mModifiers;}
bool isFinal() const {return mFinal;}
bool isEach() const {return mEach;}
bool isRedeclare() const {return mRedeclare;}
bool isReplaceable() const {return mReplaceable;}
QString getModifierValue(QStringList qualifiedModifierName) const;

QString printEach() const;
QString printFinal() const;
QString printRedeclare() const;
QString printReplaceable() const;

private:
QString mName;
QString mValue;
Expand Down
24 changes: 3 additions & 21 deletions OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.cpp
Expand Up @@ -931,25 +931,6 @@ ModelInstance::Component *GraphicsView::createModelInstanceComponent(ModelInstan
return pComponent;
}

/*!
* \brief GraphicsView::setModifiers
* Sets the modifiers on Element.
* \param modelName
* \param name
* \param modifierNames
* \param modifier
*/
void GraphicsView::setModifiers(const QString &modelName, const QString &name, QString modifierNames, const ModelInstance::Modifier modifier)
{
foreach (auto subModifier, modifier.getModifiers()) {
if (!subModifier.getValue().isEmpty()) {
const QString modifierName = name % "." % modifierNames % subModifier.getName();
MainWindow::instance()->getOMCProxy()->setElementModifierValue(modelName, modifierName, subModifier.getValue());
}
GraphicsView::setModifiers(modelName, name, modifierNames % subModifier.getName() % ".", subModifier);
}
}

bool GraphicsView::addComponent(QString className, QPointF position)
{
MainWindow *pMainWindow = MainWindow::instance();
Expand Down Expand Up @@ -3132,7 +3113,7 @@ bool GraphicsView::updateElementConnectorSizingParameter(GraphicsView *pGraphics
return true;
} else {
QString modifierKey = QString("%1.%2").arg(pElement->getRootParentElement()->getName()).arg(parameter);
MainWindow::instance()->getOMCProxy()->setElementModifierValue(className, modifierKey, QString::number(numberOfElementConnections));
MainWindow::instance()->getOMCProxy()->setElementModifierValueOld(className, modifierKey, QString::number(numberOfElementConnections));
return true;
}
}
Expand Down Expand Up @@ -3977,7 +3958,8 @@ void GraphicsView::pasteItems()
ModelInstance::Component *pModelInstanceComponent = GraphicsView::createModelInstanceComponent(mpModelWidget->getModelInstance(), name, className);
addElementToView(pModelInstanceComponent, false, true, false, QPointF(0, 0), pComponent->getOMCPlacementAnnotation(QPointF(0, 0)), false);
// set modifiers
GraphicsView::setModifiers(mpModelWidget->getLibraryTreeItem()->getNameStructure(), name, "", pMimeData->getModifiers().at(index));
MainWindow::instance()->getOMCProxy()->setElementModifierValue(mpModelWidget->getLibraryTreeItem()->getNameStructure(), name,
pMimeData->getModifiers().at(index).toString());
} else {
ElementInfo *pComponentInfo = new ElementInfo(pComponent->getElementInfo());
pComponentInfo->setName(name);
Expand Down
1 change: 0 additions & 1 deletion OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h
Expand Up @@ -246,7 +246,6 @@ class GraphicsView : public QGraphicsView
QAction* getFlipVerticalAction() {return mpFlipVerticalAction;}
bool performElementCreationChecks(LibraryTreeItem *pLibraryTreeItem, QString *name, QString *defaultPrefix);
static ModelInstance::Component* createModelInstanceComponent(ModelInstance::Model *pModelInstance, const QString &name, const QString &className);
static void setModifiers(const QString &modelName, const QString &name, QString modifierNames, const ModelInstance::Modifier modifier);
bool addComponent(QString className, QPointF position);
void addComponentToView(QString name, LibraryTreeItem *pLibraryTreeItem, QString annotation, QPointF position,
ElementInfo *pComponentInfo, bool addObject, bool openingClass, bool emitComponentAdded);
Expand Down

0 comments on commit 0281e54

Please sign in to comment.