13 tree =
new QTreeWidget(
this);
14 tree->setHeaderLabels({
"Name",
"Type" });
15 QHeaderView* header = tree->header();
16 header->setSectionResizeMode(0, QHeaderView::Stretch);
17 header->setSectionResizeMode(1, QHeaderView::Stretch);
18 tree->setContextMenuPolicy(Qt::CustomContextMenu);
19 tree->setEditTriggers(QAbstractItemView::NoEditTriggers);
20 connect(tree, &QTreeWidget::itemDoubleClicked,
this, [
this](QTreeWidgetItem* item,
int column) {
27 QToolButton* addButton =
new QToolButton(
this);
28 addButton->setText(
"Add");
29 addButton->setAutoRaise(
true);
30 addButton->setPopupMode(QToolButton::InstantPopup);
32 QMenu* addMenu =
new QMenu(addButton);
33 QAction* addSceneObject = addMenu->addAction(
"Empty Scene Object");
34 connect(addSceneObject, &QAction::triggered,
this, [
this]() {
37 QAction* addPointMass = addMenu->addAction(
"Point Mass");
38 connect(addPointMass, &QAction::triggered,
this, [
this]() {
41 QAction* addRigidBody = addMenu->addAction(
"Rigid Body");
42 connect(addRigidBody, &QAction::triggered,
this, [
this]() {
45 addButton->setMenu(addMenu);
47 QHBoxLayout* headerLayout =
new QHBoxLayout();
48 headerLayout->addWidget(addButton);
49 headerLayout->addStretch();
50 headerLayout->setContentsMargins(0, 0, 0, 0);
51 headerLayout->setSpacing(0);
53 QVBoxLayout* layout =
new QVBoxLayout(
this);
54 layout->addLayout(headerLayout);
55 layout->addWidget(tree);
56 layout->setContentsMargins(0, 0, 0, 0);
57 layout->setSpacing(0);
66 QMenu contextMenu(
this);
68 QAction* unselectAction = contextMenu.addAction(
"Deselect All");
69 connect(unselectAction, &QAction::triggered, [
this]() {
70 tree->setCurrentItem(
nullptr);
71 tree->clearSelection();
73 contextMenu.addSeparator();
75 if (
SceneObject* obj = getObjectFromItem(tree->itemAt(pos))) {
76 QAction* focusAction = contextMenu.addAction(
"Focus Camera");
77 connect(focusAction, &QAction::triggered, [
this, obj]() {
81 QAction* followAction = contextMenu.addAction(
"Follow Camera");
82 connect(followAction, &QAction::triggered, [
this, obj]() {
86 QAction* clearFollowAction = contextMenu.addAction(
"Stop Camera Follow");
87 connect(clearFollowAction, &QAction::triggered, [
this]() {
91 QAction* renameAction = contextMenu.addAction(
"Rename");
92 connect(renameAction, &QAction::triggered, [
this, pos]() {
93 if (QTreeWidgetItem* item = tree->itemAt(pos)) {
94 tree->editItem(item, 0);
98 contextMenu.addSeparator();
101 QAction* addPmAction = contextMenu.addAction(
"Add Point Mass");
107 contextMenu.exec(tree->mapToGlobal(pos));
124 auto* item =
new QTreeWidgetItem();
125 item->setText(0, QString::fromStdString(obj->
getName()));
126 item->setText(1, typeFor(obj));
127 item->setData(0, Qt::UserRole, QVariant::fromValue<void*>(obj));
128 item->setFlags(item->flags() | Qt::ItemIsEditable);
129 tree->addTopLevelItem(item);
static RigidBodyOptions Box(ObjectOptions base, bool isStatic=false, double mass=1.0, glm::vec3 velocity=glm::vec3(0.0f))