#include "mainwindow.h" #include "./ui_mainwindow.h" #include #include #include #include #include #include #include #include #include #include #include #include "common.h" #include "physics/simulation.h" #include "objects/part.h" #include "explorermodel.h" #include "qabstractitemview.h" #include "qevent.h" #include "qnamespace.h" #include "qobject.h" #include "qtreeview.h" class ExplorerEventFilter : public QObject { private: QTreeView* explorerView; ExplorerModel* model; bool keyPress(QObject* object, QKeyEvent *event) { switch (event->key()) { case Qt::Key_Delete: QModelIndexList selectedIndexes = explorerView->selectionModel()->selectedIndexes(); for (QModelIndex index : selectedIndexes) { model->fromIndex(index)->SetParent(std::nullopt); } break; } return QObject::eventFilter(object, event); } bool eventFilter(QObject *object, QEvent *event) { if (event->type() == QEvent::KeyPress) return keyPress(object, dynamic_cast(event)); return QObject::eventFilter(object, event); } public: ExplorerEventFilter(QTreeView* explorerView, ExplorerModel* model): explorerView(explorerView), model(model) {} }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) , explorerModel(ExplorerModel(std::dynamic_pointer_cast(workspace))) { ui->setupUi(this); timer.start(33, this); setMouseTracking(true); ui->explorerView->setModel(&explorerModel); ui->explorerView->setRootIsDecorated(false); ui->explorerView->setDragDropMode(QAbstractItemView::InternalMove); ui->explorerView->setSelectionMode(QAbstractItemView::ExtendedSelection); ui->explorerView->setDragEnabled(true); ui->explorerView->setAcceptDrops(true); ui->explorerView->setDropIndicatorShown(true); ui->explorerView->installEventFilter(new ExplorerEventFilter(ui->explorerView, &explorerModel)); ui->explorerView->setContextMenuPolicy(Qt::CustomContextMenu); explorerMenu.addAction(ui->actionDelete); connect(ui->explorerView, &QTreeView::customContextMenuRequested, this, [&](const QPoint& point) { QModelIndex index = ui->explorerView->indexAt(point); explorerMenu.exec(ui->explorerView->viewport()->mapToGlobal(point)); }); connect(ui->actionDelete, &QAction::triggered, this, [&]() { QModelIndexList selectedIndexes = ui->explorerView->selectionModel()->selectedIndexes(); for (QModelIndex index : selectedIndexes) { explorerModel.fromIndex(index)->SetParent(std::nullopt); } }); simulationInit(); // Baseplate workspace->AddChild(ui->mainWidget->lastPart = Part::New({ .position = glm::vec3(0, -5, 0), .rotation = glm::vec3(0), .scale = glm::vec3(512, 1.2, 512), .material = Material { .diffuse = glm::vec3(0.388235, 0.372549, 0.384314), .specular = glm::vec3(0.5f, 0.5f, 0.5f), .shininess = 32.0f, }, .anchored = true, })); ui->mainWidget->lastPart->name = "Baseplate"; syncPartPhysics(ui->mainWidget->lastPart); workspace->AddChild(ui->mainWidget->lastPart = Part::New({ .position = glm::vec3(0), .rotation = glm::vec3(0), .scale = glm::vec3(4, 1.2, 2), .material = Material { .diffuse = glm::vec3(0.639216f, 0.635294f, 0.647059f), .specular = glm::vec3(0.5f, 0.5f, 0.5f), .shininess = 32.0f, } })); syncPartPhysics(ui->mainWidget->lastPart); } static std::chrono::time_point lastTime = std::chrono::steady_clock::now(); void MainWindow::timerEvent(QTimerEvent* evt) { if (evt->timerId() != timer.timerId()) { QWidget::timerEvent(evt); return; } float deltaTime = std::chrono::duration_cast>(std::chrono::steady_clock::now() - lastTime).count(); lastTime = std::chrono::steady_clock::now(); physicsStep(deltaTime); ui->mainWidget->update(); ui->mainWidget->updateCycle(); } MainWindow::~MainWindow() { delete ui; }