Skip to content

Commit 1dd1eda

Browse files
authored
Exit show element mode when dependencies are reloaded (OpenModelica#13845)
OpenModelica#13822 Use flag `--loadMissingLibraries=false` when unloading libraries so that libraries are not automatically due to usage. Removed undefined `getCommandLineOptionsAnnotation` from `OMCProxy`.
1 parent f75d465 commit 1dd1eda

File tree

5 files changed

+149
-61
lines changed

5 files changed

+149
-61
lines changed

OMEdit/OMEditLIB/Modeling/LibraryTreeWidget.cpp

Lines changed: 56 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1704,7 +1704,11 @@ bool LibraryTreeModel::unloadClass(LibraryTreeItem *pLibraryTreeItem, bool askQu
17041704
updateLibraryTreeItem(pLibraryTreeItem->parent());
17051705
}
17061706
}
1707-
emit modelStateChanged(pLibraryTreeItem->getNameStructure());
1707+
// set --loadMissingLibraries to false to avoid automatically loading the library again.
1708+
MainWindow::instance()->getOMCProxy()->setCommandLineOptions("--loadMissingLibraries=false");
1709+
emit modelStateChanged(pLibraryTreeItem->getNameStructure(), true);
1710+
// reset the --loadMissingLibraries to true.
1711+
MainWindow::instance()->getOMCProxy()->setCommandLineOptions("--loadMissingLibraries=true");
17081712
pLibraryTreeItem->deleteLater();
17091713
return true;
17101714
} else {
@@ -2458,9 +2462,7 @@ LibraryTreeItem* LibraryTreeModel::createLibraryTreeItemImpl(QString name, Libra
24582462
// load the LibraryTreeItem pixmap
24592463
loadLibraryTreeItemPixmap(pLibraryTreeItem);
24602464
}
2461-
if (!isCreatingAutoLoadedLibrary()) {
2462-
emit modelStateChanged(nameStructure);
2463-
}
2465+
emit modelStateChanged(nameStructure, false);
24642466
return pLibraryTreeItem;
24652467
}
24662468

@@ -2648,7 +2650,8 @@ void unloadHelper(LibraryTreeItem *pLibraryTreeItem)
26482650
pLibraryTreeItem->getModelWidget()->setIconGraphicsView(0);
26492651
}
26502652
pLibraryTreeItem->getModelWidget()->clearDependsOnModels();
2651-
QObject::disconnect(MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel(), SIGNAL(modelStateChanged(QString)), pLibraryTreeItem->getModelWidget(), SLOT(updateModelIfDependsOn(QString)));
2653+
QObject::disconnect(MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel(), SIGNAL(modelStateChanged(QString,bool)),
2654+
pLibraryTreeItem->getModelWidget(), SLOT(updateModelIfDependsOn(QString,bool)));
26522655
pLibraryTreeItem->getModelWidget()->deleteLater();
26532656
pLibraryTreeItem->setModelWidget(0);
26542657
}
@@ -4590,6 +4593,35 @@ void LibraryWidget::loadAutoLoadedLibrary(const QString &modelName)
45904593
mAutoLoadedLibrariesTimer.start();
45914594
}
45924595

4596+
/*!
4597+
* \brief LibraryWidget::setLoadingLibraries
4598+
* Sets the loading libraries flag.
4599+
* If flag is false then see if any model needs update because of it.
4600+
* \param loadingLibraries
4601+
*/
4602+
void LibraryWidget::setLoadingLibraries(bool loadingLibraries)
4603+
{
4604+
mLoadingLibraries = loadingLibraries;
4605+
// if we finish loading libraries then see if any model needs update because of it.
4606+
if (!loadingLibraries) {
4607+
reDrawModelsToUpdate();
4608+
}
4609+
}
4610+
4611+
/*!
4612+
* \brief LibraryWidget::setCreatingAutoLoadedLibrary
4613+
* Sets the creating auto loaded library flag.
4614+
* If flag is false then see if any model needs update because of it.
4615+
* \param creatingAutoLoadedLibrary
4616+
*/
4617+
void LibraryWidget::setCreatingAutoLoadedLibrary(bool creatingAutoLoadedLibrary)
4618+
{
4619+
mCreatingAutoLoadedLibrary = creatingAutoLoadedLibrary;
4620+
if (!creatingAutoLoadedLibrary) {
4621+
reDrawModelsToUpdate();
4622+
}
4623+
}
4624+
45934625
/*!
45944626
* \brief LibraryWidget::multipleTopLevelClasses
45954627
* Checks if we have more than one classes in the list.
@@ -5075,6 +5107,23 @@ void LibraryWidget::cancelLoadingLibraries(const QStringList classes)
50755107
}
50765108
}
50775109

5110+
/*!
5111+
* \brief LibraryWidget::reDrawModelsToUpdate
5112+
* Redraws the models that needs update.
5113+
*/
5114+
void LibraryWidget::reDrawModelsToUpdate()
5115+
{
5116+
mModelsToUpdate.removeDuplicates();
5117+
QStringList models = mModelsToUpdate;
5118+
mModelsToUpdate.clear();
5119+
foreach (QString model, models) {
5120+
LibraryTreeItem *pLibraryTreeItem = mpLibraryTreeModel->findLibraryTreeItem(model);
5121+
if (pLibraryTreeItem && pLibraryTreeItem->getModelWidget()) {
5122+
pLibraryTreeItem->getModelWidget()->reDrawModelWidget(pLibraryTreeItem->getModelWidget()->createModelInfo());
5123+
}
5124+
}
5125+
}
5126+
50785127
/*!
50795128
* \brief LibraryWidget::handleAutoLoadedLibrary
50805129
* Slot activated when auto load library timer is timeout.
@@ -5084,10 +5133,10 @@ void LibraryWidget::handleAutoLoadedLibrary()
50845133
if (isLoadingLibraries()) {
50855134
mAutoLoadedLibrariesTimer.start();
50865135
} else {
5087-
mpLibraryTreeModel->setCreatingAutoLoadedLibrary(true);
5136+
setCreatingAutoLoadedLibrary(true);
50885137
mpLibraryTreeModel->loadDependentLibraries(mAutoLoadedLibrariesList);
50895138
mAutoLoadedLibrariesList.clear();
5090-
mpLibraryTreeModel->setCreatingAutoLoadedLibrary(false);
5139+
setCreatingAutoLoadedLibrary(false);
50915140
}
50925141
}
50935142

OMEdit/OMEditLIB/Modeling/LibraryTreeWidget.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -311,13 +311,10 @@ class LibraryTreeModel : public QAbstractItemModel
311311
void emitDataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight) {emit dataChanged(topLeft, bottomRight);}
312312
void createLibraryTreeItems(LibraryTreeItem *pLibraryTreeItem);
313313
void unloadFileChildren(LibraryTreeItem *pLibraryTreeItem);
314-
void emitModelStateChanged(const QString &name) {emit modelStateChanged(name);}
315-
bool isCreatingAutoLoadedLibrary() const {return mCreatingAutoLoadedLibrary;}
316-
void setCreatingAutoLoadedLibrary(bool creatingAutoLoadedLibrary) {mCreatingAutoLoadedLibrary = creatingAutoLoadedLibrary;}
314+
void emitModelStateChanged(const QString &name, bool unload) {emit modelStateChanged(name, unload);}
317315
private:
318316
LibraryWidget *mpLibraryWidget;
319317
LibraryTreeItem *mpRootLibraryTreeItem;
320-
bool mCreatingAutoLoadedLibrary = false;
321318

322319
QModelIndex libraryTreeItemIndexHelper(const LibraryTreeItem *pLibraryTreeItem, const LibraryTreeItem *pParentLibraryTreeItem, const QModelIndex &parentIndex) const;
323320
LibraryTreeItem* getLibraryTreeItemFromFileHelper(LibraryTreeItem *pLibraryTreeItem, QString fileName, int lineNumber);
@@ -343,7 +340,7 @@ class LibraryTreeModel : public QAbstractItemModel
343340
protected:
344341
Qt::DropActions supportedDropActions() const override;
345342
signals:
346-
void modelStateChanged(const QString &name);
343+
void modelStateChanged(const QString &name, bool unload);
347344
};
348345

349346
class LibraryTreeView : public QTreeView
@@ -480,11 +477,16 @@ class LibraryWidget : public QWidget
480477
void openLibraryTreeItem(QString nameStructure);
481478
void loadAutoLoadedLibrary(const QString &modelName);
482479
bool isLoadingLibraries() const {return mLoadingLibraries;}
483-
void setLoadingLibraries(bool loadingLibraries) {mLoadingLibraries = loadingLibraries;}
480+
void setLoadingLibraries(bool loadingLibraries);
481+
bool isCreatingAutoLoadedLibrary() const {return mCreatingAutoLoadedLibrary;}
482+
void setCreatingAutoLoadedLibrary(bool creatingAutoLoadedLibrary);
483+
void addModelToUpdate(const QString &model) {mModelsToUpdate.append(model);}
484484
private:
485-
bool mLoadingLibraries;
485+
bool mLoadingLibraries = false;
486+
bool mCreatingAutoLoadedLibrary = false;
486487
QTimer mAutoLoadedLibrariesTimer;
487488
QStringList mAutoLoadedLibrariesList;
489+
QStringList mModelsToUpdate;
488490
TreeSearchFilters *mpTreeSearchFilters;
489491
LibraryTreeModel *mpLibraryTreeModel;
490492
LibraryTreeProxyModel *mpLibraryTreeProxyModel;
@@ -503,6 +505,7 @@ class LibraryWidget : public QWidget
503505
void saveTotalLibraryTreeItemHelper(LibraryTreeItem *pLibraryTreeItem);
504506
bool resolveConflictWithLoadedLibraries(const QString &library, const QStringList classes);
505507
static void cancelLoadingLibraries(const QStringList classes);
508+
void reDrawModelsToUpdate();
506509
private slots:
507510
void handleAutoLoadedLibrary();
508511
public slots:

OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.cpp

Lines changed: 80 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -5580,7 +5580,8 @@ void ModelWidget::addDependsOnModel(const QString &dependsOnModel)
55805580
{
55815581
if (!mDependsOnModelsList.contains(dependsOnModel)) {
55825582
mDependsOnModelsList.append(dependsOnModel);
5583-
connect(MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel(), SIGNAL(modelStateChanged(QString)), SLOT(updateModelIfDependsOn(QString)), Qt::UniqueConnection);
5583+
connect(MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel(), SIGNAL(modelStateChanged(QString,bool)),
5584+
SLOT(updateModelIfDependsOn(QString,bool)), Qt::UniqueConnection);
55845585
}
55855586
}
55865587

@@ -5637,7 +5638,7 @@ void ModelWidget::drawModel(const ModelInfo &modelInfo)
56375638
mpIconGraphicsView->drawCoordinateSystem();
56385639
mpDiagramGraphicsView->drawCoordinateSystem();
56395640
clearDependsOnModels();
5640-
disconnect(MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel(), SIGNAL(modelStateChanged(QString)), this, SLOT(updateModelIfDependsOn(QString)));
5641+
disconnect(MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel(), SIGNAL(modelStateChanged(QString,bool)), this, SLOT(updateModelIfDependsOn(QString,bool)));
56415642
// if we are drawing the model inside the element mode and the parent element is extends so draw the element as inherited.
56425643
ModelInstance::Element *pElement = mpModelInstance->getRootParentElement();
56435644
if (pElement && pElement->isExtend()) {
@@ -6194,31 +6195,18 @@ void ModelWidget::reDrawModelWidget()
61946195
} else {
61956196
loadModelInstance(true, ModelInfo());
61966197
}
6197-
// invalidate the simulation options
6198-
mpLibraryTreeItem->mSimulationOptions.setIsValid(false);
6199-
mpLibraryTreeItem->mSimulationOptions.setDataReconciliationInitialized(false);
6200-
// update the icon
6201-
mpLibraryTreeItem->handleIconUpdated();
6202-
// if documentation view is visible and this model is the current active model then update it
6203-
ModelWidget *pModelWidget = mpModelWidgetContainer->getCurrentModelWidget();
6204-
if (pModelWidget && pModelWidget == this && MainWindow::instance()->getDocumentationDockWidget()->isVisible()) {
6205-
MainWindow::instance()->getDocumentationWidget()->showDocumentation(getLibraryTreeItem());
6206-
}
6207-
// Update Element Browser
6208-
if (pModelWidget && pModelWidget->getLibraryTreeItem()) {
6209-
MainWindow::instance()->getElementWidget()->getElementTreeModel()->addElements(pModelWidget->getModelInstance());
6210-
MainWindow::instance()->getElementWidget()->selectDeselectElementItem("", false);
6211-
}
6198+
reDrawModelWidgetHelper();
62126199
// clear the undo stack
62136200
mpUndoStack->clear();
6214-
// if (mpEditor) {
6215-
// mpEditor->getPlainTextEdit()->document()->clearUndoRedoStacks();
6216-
// }
6217-
updateViewButtonsBasedOnAccess();
62186201
}
62196202
QApplication::restoreOverrideCursor();
62206203
}
62216204

6205+
/*!
6206+
* \brief ModelWidget::reDrawModelWidget
6207+
* Redraws the ModelWidget with a new ModelInfo.
6208+
* \param modelInfo
6209+
*/
62226210
void ModelWidget::reDrawModelWidget(const ModelInfo &modelInfo)
62236211
{
62246212
QApplication::setOverrideCursor(Qt::WaitCursor);
@@ -6248,10 +6236,20 @@ void ModelWidget::reDrawModelWidget(const ModelInfo &modelInfo)
62486236
if (mpDiagramGraphicsView) {
62496237
mpDiagramGraphicsView->resetCoordinateSystem();
62506238
}
6239+
// reset if we are inside element mode
6240+
clearGraphicsViewsExceptOutOfSceneItems();
6241+
mModelInstanceList.clear();
6242+
mModelInstancesPos = -1;
6243+
mpElementModeLabel->setText("");
6244+
mPreservedIconShapesList.clear();
6245+
mPreservedDiagramShapesList.clear();
6246+
setComponentModified(false);
6247+
updateElementModeButtons();
62516248
loadModelInstance(false, modelInfo);
6252-
// update the icon
6253-
mpLibraryTreeItem->handleIconUpdated();
6254-
updateViewButtonsBasedOnAccess();
6249+
// update the coordinate system according to new values
6250+
mpIconGraphicsView->resetZoom();
6251+
mpDiagramGraphicsView->resetZoom();
6252+
reDrawModelWidgetHelper();
62556253
QApplication::restoreOverrideCursor();
62566254
}
62576255

@@ -6334,7 +6332,7 @@ bool ModelWidget::modelicaEditorTextChanged(LibraryTreeItem **pLibraryTreeItem)
63346332
pParentLibraryTreeItem->setClassText(stringToLoad);
63356333
updateModelText();
63366334
} else {
6337-
MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->emitModelStateChanged(mpLibraryTreeItem->getNameStructure());
6335+
MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->emitModelStateChanged(mpLibraryTreeItem->getNameStructure(), false);
63386336
}
63396337
// update child classes
63406338
updateChildClasses(mpLibraryTreeItem);
@@ -6347,8 +6345,8 @@ bool ModelWidget::modelicaEditorTextChanged(LibraryTreeItem **pLibraryTreeItem)
63476345
* so we tell unloadLibraryTreeItem to don't try deleteClass since it will only produce error
63486346
*/
63496347
pLibraryTreeModel->unloadLibraryTreeItem(mpLibraryTreeItem, !mpLibraryTreeItem->isInPackageOneFile());
6350-
MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->emitModelStateChanged(mpLibraryTreeItem->getNameStructure());
6351-
disconnect(MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel(), SIGNAL(modelStateChanged(QString)), this, SLOT(updateModelIfDependsOn(QString)));
6348+
MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->emitModelStateChanged(mpLibraryTreeItem->getNameStructure(), false);
6349+
disconnect(MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel(), SIGNAL(modelStateChanged(QString,bool)), this, SLOT(updateModelIfDependsOn(QString,bool)));
63526350
mpLibraryTreeItem->setModelWidget(0);
63536351
QString name = StringHandler::getLastWordAfterDot(className);
63546352
LibraryTreeItem *pNewLibraryTreeItem = pLibraryTreeModel->createLibraryTreeItem(name, mpLibraryTreeItem->parent(), false, false, true, row);
@@ -6502,7 +6500,7 @@ void ModelWidget::updateModelText()
65026500
mUpdateModelTimer.start();
65036501
callHandleCollidingConnectionsIfNeeded();
65046502
// announce the change.
6505-
MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->emitModelStateChanged(mpLibraryTreeItem->getNameStructure());
6503+
MainWindow::instance()->getLibraryWidget()->getLibraryTreeModel()->emitModelStateChanged(mpLibraryTreeItem->getNameStructure(), false);
65066504
// Update Element Browser
65076505
MainWindow::instance()->getElementWidget()->getElementTreeModel()->addElements(mpModelInstance);
65086506
MainWindow::instance()->getElementWidget()->selectDeselectElementItem("", false);
@@ -6760,14 +6758,20 @@ void ModelWidget::processPendingModelUpdate()
67606758
* Updates the model if it depends on modelName.\n
67616759
* Slot activated when modelStateChanged SIGNAL of LibraryTreeModel is raised.
67626760
* \param modelName
6761+
* \param unload
67636762
*/
6764-
void ModelWidget::updateModelIfDependsOn(const QString &modelName)
6763+
void ModelWidget::updateModelIfDependsOn(const QString &modelName, bool unload)
67656764
{
6766-
if (mDiagramViewLoaded && dependsOnModel(modelName)) {
6765+
if (mDiagramViewLoaded && dependsOnModel(modelName, unload)) {
67676766
// if this is the current ModelWidget then update it directly otherwise mark it for update
67686767
if (this == mpModelWidgetContainer->getCurrentModelWidget()) {
67696768
setRequiresUpdate(false);
6770-
reDrawModelWidget(createModelInfo());
6769+
// if the update is called because of loading a library then postpone the update
6770+
if (MainWindow::instance()->getLibraryWidget()->isLoadingLibraries() || MainWindow::instance()->getLibraryWidget()->isCreatingAutoLoadedLibrary()) {
6771+
MainWindow::instance()->getLibraryWidget()->addModelToUpdate(mpLibraryTreeItem->getNameStructure());
6772+
} else {
6773+
reDrawModelWidget(createModelInfo());
6774+
}
67716775
} else {
67726776
setRequiresUpdate(true);
67736777
}
@@ -7244,12 +7248,18 @@ void ModelWidget::associateBusWithConnectors(Element *pBusComponent, GraphicsVie
72447248
* \brief ModelWidget::dependsOnModel
72457249
* Checks if modelName exists in dependsOnModel list
72467250
* \param modelName
7251+
* \param unload - true if unloading the model
72477252
* \return
72487253
*/
7249-
bool ModelWidget::dependsOnModel(const QString &modelName)
7254+
bool ModelWidget::dependsOnModel(const QString &modelName, bool unload)
72507255
{
72517256
foreach (QString model, mDependsOnModelsList) {
7252-
if ((model.compare(modelName) == 0)) {
7257+
// when unloading the model we only check if the depends model starts with otherwise we check for exact match
7258+
if (unload) {
7259+
if (model.startsWith(modelName)) {
7260+
return true;
7261+
}
7262+
} else if ((model.compare(modelName) == 0)) {
72537263
return true;
72547264
}
72557265
}
@@ -7282,6 +7292,30 @@ void ModelWidget::updateElementModeButtons()
72827292
}
72837293
}
72847294

7295+
/*!
7296+
* \brief ModelWidget::reDrawModelWidgetHelper
7297+
* Helper function to reDrawModelWidget.
7298+
*/
7299+
void ModelWidget::reDrawModelWidgetHelper()
7300+
{
7301+
// invalidate the simulation options
7302+
mpLibraryTreeItem->mSimulationOptions.setIsValid(false);
7303+
mpLibraryTreeItem->mSimulationOptions.setDataReconciliationInitialized(false);
7304+
// update the icon
7305+
mpLibraryTreeItem->handleIconUpdated();
7306+
// if documentation view is visible and this model is the current active model then update it
7307+
ModelWidget *pModelWidget = mpModelWidgetContainer->getCurrentModelWidget();
7308+
if (pModelWidget && pModelWidget == this && MainWindow::instance()->getDocumentationDockWidget()->isVisible()) {
7309+
MainWindow::instance()->getDocumentationWidget()->showDocumentation(getLibraryTreeItem());
7310+
}
7311+
// Update Element Browser
7312+
if (pModelWidget && pModelWidget->getLibraryTreeItem()) {
7313+
MainWindow::instance()->getElementWidget()->getElementTreeModel()->addElements(pModelWidget->getModelInstance());
7314+
MainWindow::instance()->getElementWidget()->selectDeselectElementItem("", false);
7315+
}
7316+
updateViewButtonsBasedOnAccess();
7317+
}
7318+
72857319
/*!
72867320
* \brief ModelWidget::showIconView
72877321
* \param checked
@@ -8204,26 +8238,28 @@ void ModelWidgetContainer::currentModelWidgetChanged(QMdiSubWindow *pSubWindow)
82048238
}
82058239
mpLastActiveSubWindow = pSubWindow;
82068240
// update the model if its require update flag is set.
8241+
// reDrawModelWidget updates the documentation and element browser so only try to update them in the else
82078242
if (pModelWidget && pModelWidget->requiresUpdate()) {
82088243
pModelWidget->setRequiresUpdate(false);
82098244
pModelWidget->reDrawModelWidget(pModelWidget->createModelInfo());
8210-
}
8211-
/* ticket:4983 Update the documentation browser when a new ModelWidget is selected.
8212-
* Provided that the Documentation Browser is already visible.
8213-
*/
8214-
if (pModelWidget && pModelWidget->getLibraryTreeItem() && MainWindow::instance()->getDocumentationDockWidget()->isVisible()) {
8215-
MainWindow::instance()->getDocumentationWidget()->showDocumentation(pModelWidget->getLibraryTreeItem());
8245+
} else {
8246+
/* ticket:4983 Update the documentation browser when a new ModelWidget is selected.
8247+
* Provided that the Documentation Browser is already visible.
8248+
*/
8249+
if (pModelWidget && pModelWidget->getLibraryTreeItem() && MainWindow::instance()->getDocumentationDockWidget()->isVisible()) {
8250+
MainWindow::instance()->getDocumentationWidget()->showDocumentation(pModelWidget->getLibraryTreeItem());
8251+
}
8252+
// Update Element Browser
8253+
if (pModelWidget && pModelWidget->getLibraryTreeItem()) {
8254+
MainWindow::instance()->getElementWidget()->getElementTreeModel()->addElements(pModelWidget->getModelInstance());
8255+
MainWindow::instance()->getElementWidget()->selectDeselectElementItem("", false);
8256+
}
82168257
}
82178258
// Update the LibraryTreeView to mark the active model
82188259
MainWindow::instance()->getLibraryWidget()->getLibraryTreeView()->viewport()->update();
82198260
if (OptionsDialog::instance()->getGeneralSettingsPage()->getSynchronizeWithModelWidgetCheckBox()->isChecked()) {
82208261
MainWindow::instance()->getLibraryWidget()->scrollToActiveLibraryTreeItem();
82218262
}
8222-
// Update Element Browser
8223-
if (pModelWidget && pModelWidget->getLibraryTreeItem()) {
8224-
MainWindow::instance()->getElementWidget()->getElementTreeModel()->addElements(pModelWidget->getModelInstance());
8225-
MainWindow::instance()->getElementWidget()->selectDeselectElementItem("", false);
8226-
}
82278263
}
82288264

82298265
/*!

0 commit comments

Comments
 (0)