From 2dc9df4d1ffa16d389d24fe57a6004d681c67db8 Mon Sep 17 00:00:00 2001 From: maelstrom Date: Wed, 23 Apr 2025 19:54:06 +0200 Subject: [PATCH] feat(editor): insert objects from context menu --- core/src/objects/part.cpp | 2 +- editor/panes/explorermodel.cpp | 7 ++++--- editor/panes/explorermodel.h | 3 ++- editor/panes/explorerview.cpp | 22 ++++++++++++++++++++++ 4 files changed, 29 insertions(+), 5 deletions(-) diff --git a/core/src/objects/part.cpp b/core/src/objects/part.cpp index 4d208da..4a6fc38 100644 --- a/core/src/objects/part.cpp +++ b/core/src/objects/part.cpp @@ -61,7 +61,7 @@ const InstanceType* Part::GetClass() { return &TYPE; } -Part::Part(): Part(PartConstructParams { .color = Color3(0.639216f, 0.635294f, 0.647059f) }) { +Part::Part(): Part(PartConstructParams { .size = glm::vec3(2, 1.2, 4), .color = Color3(0.639216f, 0.635294f, 0.647059f) }) { } Part::Part(PartConstructParams params): Instance(&TYPE), cframe(CFrame::FromEulerAnglesXYZ((Vector3)params.rotation) + params.position), diff --git a/editor/panes/explorermodel.cpp b/editor/panes/explorermodel.cpp index 596ca9d..cdcbe75 100644 --- a/editor/panes/explorermodel.cpp +++ b/editor/panes/explorermodel.cpp @@ -1,11 +1,12 @@ #include "explorermodel.h" #include "common.h" +#include #include #include // https://doc.qt.io/qt-6/qtwidgets-itemviews-simpletreemodel-example.html#testing-the-model -std::map instanceIconCache; +std::map instanceIconCache; ExplorerModel::ExplorerModel(InstanceRef dataRoot, QWidget *parent) : QAbstractItemModel(parent) @@ -136,13 +137,13 @@ Qt::ItemFlags ExplorerModel::flags(const QModelIndex &index) const : Qt::NoItemFlags | Qt::ItemIsDropEnabled; } -QImage ExplorerModel::iconOf(const InstanceType* type) const { +QIcon ExplorerModel::iconOf(const InstanceType* type) const { if (instanceIconCache.count(type->className)) return instanceIconCache[type->className]; const InstanceType* currentClass = type; while (currentClass->explorerIcon.empty()) currentClass = currentClass->super; - QImage icon("assets/icons/" + QString::fromStdString(currentClass->explorerIcon)); + QIcon icon("assets/icons/" + QString::fromStdString(currentClass->explorerIcon)); instanceIconCache[type->className] = icon; return icon; } diff --git a/editor/panes/explorermodel.h b/editor/panes/explorermodel.h index 378bee4..4085349 100644 --- a/editor/panes/explorermodel.h +++ b/editor/panes/explorermodel.h @@ -31,12 +31,13 @@ public: Qt::DropActions supportedDropActions() const override; InstanceRef fromIndex(const QModelIndex index) const; QModelIndex ObjectToIndex(InstanceRef item); + + QIcon iconOf(const InstanceType* type) const; void updateRoot(InstanceRef newRoot); private: InstanceRef rootItem; QModelIndex toIndex(InstanceRef item); - QImage iconOf(const InstanceType* type) const; }; // #endif \ No newline at end of file diff --git a/editor/panes/explorerview.cpp b/editor/panes/explorerview.cpp index 19160fb..99c9c69 100644 --- a/editor/panes/explorerview.cpp +++ b/editor/panes/explorerview.cpp @@ -1,6 +1,10 @@ #include "explorerview.h" #include "common.h" #include "../ui_mainwindow.h" +#include "objects/base/instance.h" +#include "objects/meta.h" +#include +#include #define M_mainWindow dynamic_cast(window()) @@ -75,6 +79,24 @@ void ExplorerView::buildContextMenu() { contextMenu.addSeparator(); contextMenu.addAction(M_mainWindow->ui->actionSaveModel); contextMenu.addAction(M_mainWindow->ui->actionInsertModel); + + // Insert Object menu + + QMenu* insertObjectMenu = new QMenu("Insert Object"); + contextMenu.addMenu(insertObjectMenu); + + for (const auto& [_, type] : INSTANCE_MAP) { + if (type->flags & INSTANCE_NOTCREATABLE || !type->constructor) continue; + + QAction* instAction = new QAction(model.iconOf(type), QString::fromStdString(type->className)); + insertObjectMenu->addAction(instAction); + connect(instAction, &QAction::triggered, this, [&]() { + if (getSelection().size() == 0 || getSelection()[0].expired()) return; + std::shared_ptr instParent = getSelection()[0].lock(); + std::shared_ptr newInst = type->constructor(); + newInst->SetParent(instParent); + }); + } } void ExplorerView::updateRoot(InstanceRef newRoot) {