fix: memory leak involving ExplorerModel

This commit is contained in:
maelstrom 2025-03-11 20:42:50 +01:00
parent 12a4ed76b4
commit 45f39c3f49
5 changed files with 14 additions and 10 deletions

View file

@ -83,9 +83,7 @@ MainWindow::MainWindow(QWidget *parent)
if (!path) return; if (!path) return;
std::shared_ptr<DataModel> newModel = DataModel::LoadFromFile(path.value()); std::shared_ptr<DataModel> newModel = DataModel::LoadFromFile(path.value());
dataModel = newModel; dataModel = newModel;
delete ui->explorerView->selectionModel(); ui->explorerView->updateRoot(newModel);
ui->explorerView->reset();
ui->explorerView->setModel(new ExplorerModel(dataModel));
}); });
connect(ui->actionDelete, &QAction::triggered, this, [&]() { connect(ui->actionDelete, &QAction::triggered, this, [&]() {

View file

@ -234,6 +234,12 @@ bool ExplorerModel::dropMimeData(const QMimeData *data, Qt::DropAction action, i
return true; return true;
} }
void ExplorerModel::updateRoot(InstanceRef newRoot) {
beginResetModel();
rootItem = newRoot;
endResetModel();
}
QMimeData* ExplorerModel::mimeData(const QModelIndexList& indexes) const { QMimeData* ExplorerModel::mimeData(const QModelIndexList& indexes) const {
// application/x-openblocks-instance-pointers // application/x-openblocks-instance-pointers
DragDropSlot* slot = new DragDropSlot(); DragDropSlot* slot = new DragDropSlot();

View file

@ -1,18 +1,12 @@
#pragma once #pragma once
#include "objects/base/instance.h" #include "objects/base/instance.h"
#include "objects/part.h"
#include "qabstractitemmodel.h" #include "qabstractitemmodel.h"
#include "qevent.h" #include "qevent.h"
#include "qmenu.h"
#include "qnamespace.h" #include "qnamespace.h"
#include "qtreeview.h"
#include <QOpenGLWidget> #include <QOpenGLWidget>
#include <QWidget> #include <QWidget>
#include <memory>
// #ifndef EXPLORERMODEL_H
// #define EXPLORERMODEL_H
class ExplorerModel : public QAbstractItemModel { class ExplorerModel : public QAbstractItemModel {
Q_OBJECT Q_OBJECT
@ -42,6 +36,8 @@ public:
Qt::DropActions supportedDropActions() const override; Qt::DropActions supportedDropActions() const override;
InstanceRef fromIndex(const QModelIndex index) const; InstanceRef fromIndex(const QModelIndex index) const;
QModelIndex ObjectToIndex(InstanceRef item); QModelIndex ObjectToIndex(InstanceRef item);
void updateRoot(InstanceRef newRoot);
private: private:
InstanceRef rootItem; InstanceRef rootItem;
QModelIndex toIndex(InstanceRef item); QModelIndex toIndex(InstanceRef item);

View file

@ -73,7 +73,6 @@ void ExplorerView::keyPressEvent(QKeyEvent* event) {
} }
} }
void ExplorerView::buildContextMenu() { void ExplorerView::buildContextMenu() {
contextMenu.addAction(M_mainWindow->ui->actionDelete); contextMenu.addAction(M_mainWindow->ui->actionDelete);
contextMenu.addSeparator(); contextMenu.addSeparator();
@ -84,4 +83,8 @@ void ExplorerView::buildContextMenu() {
contextMenu.addSeparator(); contextMenu.addSeparator();
contextMenu.addAction(M_mainWindow->ui->actionSaveModel); contextMenu.addAction(M_mainWindow->ui->actionSaveModel);
contextMenu.addAction(M_mainWindow->ui->actionInsertModel); contextMenu.addAction(M_mainWindow->ui->actionInsertModel);
}
void ExplorerView::updateRoot(InstanceRef newRoot) {
model.updateRoot(newRoot);
} }

View file

@ -22,6 +22,7 @@ public:
// void dropEvent(QDropEvent*) override; // void dropEvent(QDropEvent*) override;
void buildContextMenu(); void buildContextMenu();
void updateRoot(InstanceRef newRoot);
private: private:
ExplorerModel model; ExplorerModel model;
QMenu contextMenu; QMenu contextMenu;