Skip to content

Commit

Permalink
Fix memory issues with OMEdit (#9641)
Browse files Browse the repository at this point in the history
* Fix memory issues with OMEdit

* Delete ModelInstance

* Delete out of scene items

* Delete OriginItem

* Cleanup

* More cleanup

* Delete mpRootLibraryTreeItem instead of top level nodes

* Delete libraries browser widget
  • Loading branch information
adeas31 committed Nov 2, 2022
1 parent 056e47d commit 71f4d77
Show file tree
Hide file tree
Showing 10 changed files with 65 additions and 19 deletions.
2 changes: 1 addition & 1 deletion OMEdit/OMEditLIB/Editors/BaseEditor.cpp
Expand Up @@ -685,7 +685,7 @@ PlainTextEdit::PlainTextEdit(BaseEditor *pBaseEditor)
pCompleterToolTipLayout->addWidget(mpCompleterToolTipLabel);
mpCompleterToolTipWidget->setLayout(pCompleterToolTipLayout);
// intialize the completer with QStandardItemModel
mpStandardItemModel = new QStandardItemModel();
mpStandardItemModel = new QStandardItemModel(this);
// sort the StandardItemModel using QSortFilterProxy
QSortFilterProxyModel *pSortFilterProxyModel = new QSortFilterProxyModel(this);
pSortFilterProxyModel->setSourceModel(mpStandardItemModel);
Expand Down
4 changes: 2 additions & 2 deletions OMEdit/OMEditLIB/Element/ElementProperties.cpp
Expand Up @@ -2019,7 +2019,7 @@ void ElementAttributes::setUpDialog()
pVariabilityGroupBoxLayout->addWidget(mpParameterRadio);
pVariabilityGroupBoxLayout->addWidget(mpDiscreteRadio);
pVariabilityGroupBoxLayout->addWidget(mpDefaultRadio);
mpVariabilityButtonGroup = new QButtonGroup;
mpVariabilityButtonGroup = new QButtonGroup(this);
mpVariabilityButtonGroup->addButton(mpConstantRadio);
mpVariabilityButtonGroup->addButton(mpParameterRadio);
mpVariabilityButtonGroup->addButton(mpDiscreteRadio);
Expand All @@ -2044,7 +2044,7 @@ void ElementAttributes::setUpDialog()
pCausalityGroupBoxLayout->addWidget(mpInputRadio);
pCausalityGroupBoxLayout->addWidget(mpOutputRadio);
pCausalityGroupBoxLayout->addWidget(mpNoneRadio);
mpCausalityButtonGroup = new QButtonGroup;
mpCausalityButtonGroup = new QButtonGroup(this);
mpCausalityButtonGroup->addButton(mpInputRadio);
mpCausalityButtonGroup->addButton(mpOutputRadio);
mpCausalityButtonGroup->addButton(mpNoneRadio);
Expand Down
1 change: 1 addition & 0 deletions OMEdit/OMEditLIB/MainWindow.cpp
Expand Up @@ -590,6 +590,7 @@ void MainWindow::beforeClosingMainWindow()
delete mpOMCProxy;
// delete the OMSProxy object
OMSProxy::destroy();
delete mpLibraryWidget;
delete mpModelWidgetContainer;
// delete the ArchivedSimulationsWidget object
ArchivedSimulationsWidget::destroy();
Expand Down
2 changes: 1 addition & 1 deletion OMEdit/OMEditLIB/Modeling/DocumentationWidget.cpp
Expand Up @@ -289,7 +289,7 @@ DocumentationWidget::DocumentationWidget(QWidget *pParent)
mpJustifyToolButton->setCheckable(true);
connect(mpJustifyToolButton, SIGNAL(clicked()), SLOT(justify()));
// alignment button group
QButtonGroup *pAlignmentButtonGroup = new QButtonGroup;
QButtonGroup *pAlignmentButtonGroup = new QButtonGroup(this);
pAlignmentButtonGroup->setExclusive(true);
pAlignmentButtonGroup->addButton(mpAlignLeftToolButton);
pAlignmentButtonGroup->addButton(mpAlignCenterToolButton);
Expand Down
11 changes: 7 additions & 4 deletions OMEdit/OMEditLIB/Modeling/LibraryTreeWidget.cpp
Expand Up @@ -58,7 +58,8 @@
* \brief LibraryTreeItem::LibraryTreeItem
* Used for creating the root item.
*/
LibraryTreeItem::LibraryTreeItem()
LibraryTreeItem::LibraryTreeItem(QAbstractItemModel *pParent)
: QObject(pParent)
{
mIsRootItem = true;
mpParentLibraryTreeItem = 0;
Expand Down Expand Up @@ -107,7 +108,7 @@ LibraryTreeItem::LibraryTreeItem()
*/
LibraryTreeItem::LibraryTreeItem(LibraryType type, QString text, QString nameStructure, OMCInterface::getClassInformation_res classInformation,
QString fileName, bool isSaved, LibraryTreeItem *pParent)
: mComponentsLoaded(false), mLibraryType(type), mSystemLibrary(false), mpModelWidget(0)
: QObject(pParent), mComponentsLoaded(false), mLibraryType(type), mSystemLibrary(false), mpModelWidget(0)
{
mIsRootItem = false;
mpParentLibraryTreeItem = pParent;
Expand Down Expand Up @@ -147,7 +148,9 @@ LibraryTreeItem::LibraryTreeItem(LibraryType type, QString text, QString nameStr
*/
LibraryTreeItem::~LibraryTreeItem()
{
qDeleteAll(mChildren);
if (mpModelWidget) {
delete mpModelWidget;
}
mChildren.clear();
}

Expand Down Expand Up @@ -1176,7 +1179,7 @@ LibraryTreeModel::LibraryTreeModel(LibraryWidget *pLibraryWidget)
: QAbstractItemModel(pLibraryWidget)
{
mpLibraryWidget = pLibraryWidget;
mpRootLibraryTreeItem = new LibraryTreeItem;
mpRootLibraryTreeItem = new LibraryTreeItem(this);
}

/*!
Expand Down
2 changes: 1 addition & 1 deletion OMEdit/OMEditLIB/Modeling/LibraryTreeWidget.h
Expand Up @@ -75,7 +75,7 @@ class LibraryTreeItem : public QObject
SaveInOneFile,
SaveFolderStructure
};
LibraryTreeItem();
LibraryTreeItem(QAbstractItemModel *pParent);
LibraryTreeItem(LibraryType type, QString text, QString nameStructure, OMCInterface::getClassInformation_res classInformation,
QString fileName, bool isSaved, LibraryTreeItem *pParent = 0);
~LibraryTreeItem();
Expand Down
48 changes: 44 additions & 4 deletions OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.cpp
Expand Up @@ -235,6 +235,35 @@ GraphicsView::GraphicsView(StringHandler::ViewType viewType, ModelWidget *pModel
mAllItems.clear();
}

GraphicsView::~GraphicsView()
{
/* When the scene is deleted it will delete all the items inside it.
* We need to delete the items that are not part of the scene.
*/
foreach (Element *pElement, mOutOfSceneElementsList) {
if (pElement->getOriginItem()) {
delete pElement->getOriginItem();
}
delete pElement;
}

foreach (LineAnnotation *pConnectionLineAnnotation, mOutOfSceneConnectionsList) {
delete pConnectionLineAnnotation;
}

foreach (LineAnnotation *pTransitionLineAnnotation, mOutOfSceneTransitionsList) {
delete pTransitionLineAnnotation;
}

foreach (LineAnnotation *pInitialStateLineAnnotation, mOutOfSceneInitialStatesList) {
delete pInitialStateLineAnnotation;
}

foreach (ShapeAnnotation *pShapeAnnotation, mOutOfSceneShapesList) {
delete pShapeAnnotation;
}
}

void GraphicsView::setIsVisualizationView(bool visualizationView)
{
setItemsFlags(!visualizationView);
Expand Down Expand Up @@ -5423,6 +5452,13 @@ ModelWidget::ModelWidget(LibraryTreeItem* pLibraryTreeItem, ModelWidgetContainer
}
}

ModelWidget::~ModelWidget()
{
if (mpModelInstance) {
delete mpModelInstance;
}
}

/*!
* \brief ModelWidget::getExtendsModifiersMap
* Returns a extends modifier map for extends class
Expand Down Expand Up @@ -5979,7 +6015,7 @@ void ModelWidget::createModelWidgetComponents()
mpDocumentationViewToolButton->setToolTip(Helper::documentationView);
mpDocumentationViewToolButton->setAutoRaise(true);
// view buttons box
mpViewsButtonGroup = new QButtonGroup;
mpViewsButtonGroup = new QButtonGroup(this);
mpViewsButtonGroup->setExclusive(true);
mpViewsButtonGroup->addButton(mpDiagramViewToolButton);
mpViewsButtonGroup->addButton(mpIconViewToolButton);
Expand Down Expand Up @@ -7692,7 +7728,7 @@ void ModelWidget::createUndoStack()
assert(mpUndoStack);
}
} else {
mpUndoStack = new UndoStack;
mpUndoStack = new UndoStack(this);
connect(mpUndoStack, SIGNAL(canUndoChanged(bool)), SLOT(handleCanUndoChanged(bool)));
connect(mpUndoStack, SIGNAL(canRedoChanged(bool)), SLOT(handleCanRedoChanged(bool)));
}
Expand Down Expand Up @@ -8882,7 +8918,10 @@ void ModelWidget::handleCanRedoChanged(bool canRedo)
void ModelWidget::closeEvent(QCloseEvent *event)
{
Q_UNUSED(event);
mpModelWidgetContainer->removeSubWindow(this);
QMdiSubWindow *pMdiSubWindow = mpModelWidgetContainer->getMdiSubWindow(this);
if (pMdiSubWindow) {
mpModelWidgetContainer->removeSubWindow(this);
}
}

/*!
Expand Down Expand Up @@ -9051,8 +9090,9 @@ ModelWidget* ModelWidgetContainer::getModelWidget(const QString& className)
{
foreach (QMdiSubWindow *pSubWindow, subWindowList()) {
ModelWidget *pModelWidget = qobject_cast<ModelWidget*>(pSubWindow->widget());
if (className == pModelWidget->getLibraryTreeItem()->getNameStructure())
if (className == pModelWidget->getLibraryTreeItem()->getNameStructure()) {
return pModelWidget;
}
}
return NULL;
}
Expand Down
2 changes: 2 additions & 0 deletions OMEdit/OMEditLIB/Modeling/ModelWidgetContainer.h
Expand Up @@ -177,6 +177,7 @@ class GraphicsView : public QGraphicsView
QSet<QGraphicsItem*> mAllItems;
public:
GraphicsView(StringHandler::ViewType viewType, ModelWidget *pModelWidget);
~GraphicsView();
bool mSkipBackground; /* Do not draw the background rectangle */
QPointF mContextMenuStartPosition;
bool mContextMenuStartPositionValid;
Expand Down Expand Up @@ -566,6 +567,7 @@ class ModelWidget : public QWidget
Q_OBJECT
public:
ModelWidget(LibraryTreeItem* pLibraryTreeItem, ModelWidgetContainer *pModelWidgetContainer);
~ModelWidget();
ModelWidgetContainer* getModelWidgetContainer() {return mpModelWidgetContainer;}
ModelInstance::Model *getModelInstance() const {return mpModelInstance;}
void setLibraryTreeItem(LibraryTreeItem *pLibraryTreeItem) {mpLibraryTreeItem = pLibraryTreeItem;}
Expand Down
10 changes: 5 additions & 5 deletions OMEdit/OMEditLIB/Options/OptionsDialog.cpp
Expand Up @@ -3671,7 +3671,7 @@ GeneralSettingsPage::GeneralSettingsPage(OptionsDialog *pOptionsDialog)
mpHorizontalViewRadioButton = new QRadioButton(tr("Horizontal View"));
mpHorizontalViewRadioButton->setChecked(true);
mpVerticalViewRadioButton = new QRadioButton(tr("Vertical View"));
QButtonGroup *pWelcomePageViewButtons = new QButtonGroup;
QButtonGroup *pWelcomePageViewButtons = new QButtonGroup(this);
pWelcomePageViewButtons->addButton(mpHorizontalViewRadioButton);
pWelcomePageViewButtons->addButton(mpVerticalViewRadioButton);
// plotting view radio buttons layout
Expand Down Expand Up @@ -5013,7 +5013,7 @@ GraphicalViewsPage::GraphicalViewsPage(OptionsDialog *pOptionsDialog)
mpModelingTabbedViewRadioButton = new QRadioButton(tr("Tabbed View"));
mpModelingTabbedViewRadioButton->setChecked(true);
mpModelingSubWindowViewRadioButton = new QRadioButton(tr("SubWindow View"));
QButtonGroup *pModelingViewModeButtonGroup = new QButtonGroup;
QButtonGroup *pModelingViewModeButtonGroup = new QButtonGroup(this);
pModelingViewModeButtonGroup->addButton(mpModelingTabbedViewRadioButton);
pModelingViewModeButtonGroup->addButton(mpModelingSubWindowViewRadioButton);
// modeling view radio buttons layout
Expand All @@ -5033,7 +5033,7 @@ GraphicalViewsPage::GraphicalViewsPage(OptionsDialog *pOptionsDialog)
mpDiagramViewRadioButton->setChecked(true);
mpTextViewRadioButton = new QRadioButton(Helper::textView);
mpDocumentationViewRadioButton = new QRadioButton(Helper::documentationView);
QButtonGroup *pDefaultViewButtonGroup = new QButtonGroup;
QButtonGroup *pDefaultViewButtonGroup = new QButtonGroup(this);
pDefaultViewButtonGroup->addButton(mpIconViewRadioButton);
pDefaultViewButtonGroup->addButton(mpDiagramViewRadioButton);
pDefaultViewButtonGroup->addButton(mpTextViewRadioButton);
Expand Down Expand Up @@ -5573,7 +5573,7 @@ SimulationPage::SimulationPage(OptionsDialog *pOptionsDialog)
mpStructuredRadioButton->setChecked(true);
mpFormattedTextRadioButton = new QRadioButton(tr("Formatted Text"));
mpFormattedTextRadioButton->setToolTip(tr("Shows the simulation output in the form of formatted text."));
QButtonGroup *pOutputButtonGroup = new QButtonGroup;
QButtonGroup *pOutputButtonGroup = new QButtonGroup(this);
pOutputButtonGroup->addButton(mpStructuredRadioButton);
pOutputButtonGroup->addButton(mpFormattedTextRadioButton);
// output view buttons layout
Expand Down Expand Up @@ -6158,7 +6158,7 @@ PlottingPage::PlottingPage(OptionsDialog *pOptionsDialog)
mpPlottingTabbedViewRadioButton = new QRadioButton(tr("Tabbed View"));
mpPlottingTabbedViewRadioButton->setChecked(true);
mpPlottingSubWindowViewRadioButton = new QRadioButton(tr("SubWindow View"));
QButtonGroup *pPlottingViewModeButtonGroup = new QButtonGroup;
QButtonGroup *pPlottingViewModeButtonGroup = new QButtonGroup(this);
pPlottingViewModeButtonGroup->addButton(mpPlottingTabbedViewRadioButton);
pPlottingViewModeButtonGroup->addButton(mpPlottingSubWindowViewRadioButton);
// plotting view radio buttons layout
Expand Down
2 changes: 1 addition & 1 deletion OMEdit/OMEditLIB/Util/Utilities.cpp
Expand Up @@ -71,7 +71,7 @@ TreeSearchFilters::TreeSearchFilters(QWidget *pParent)
mpFilterTextBox->installEventFilter(this);
connect(this, SIGNAL(clearFilter(QString)), mpFilterTextBox, SIGNAL(textEdited(QString)));
// filter timer
mpFilterTimer = new QTimer;
mpFilterTimer = new QTimer(this);
mpFilterTimer->setSingleShot(true);
mpScrollToActiveButton = new QToolButton;
QString scrollToActiveButtonText = tr("Scroll to Active");
Expand Down

0 comments on commit 71f4d77

Please sign in to comment.