26 #include <QtConcurrent/qtconcurrentrun.h>
28 #include "../controller/DeselectOperation.h"
29 #include "../controller/RemoveFromGroupOperation.h"
30 #include "../controller/RemoveOperation.h"
38 collisionMeshToggleButton(new QPushButton(this)),
39 rotateManipulatorToggleButton(new QPushButton(this)),
40 translateManipulatorToggleButton(new QPushButton(this)),
41 undoButton(new QPushButton(this)),
42 redoButton(new QPushButton(this)),
43 removeSelectedObjectsButton(new QPushButton(this)),
44 editorToggleButton(new QPushButton(this)),
45 viewerToggleButton(new QPushButton(this)),
46 editorViewerButtonGroup(new QButtonGroup(this)),
47 mainLayout(new QVBoxLayout(this)),
48 leftButtonsSize(30, 30),
49 buttonColor(
"lightgray"),
52 showCollisionMesh(false),
53 showTranslateManipulator(false),
54 showRotateManipulator(false)
58 setObjectName(QString::fromUtf8(
"SceneEditorWidget"));
60 mainLayout->addWidget(sceneGraph);
62 this->setLayout(mainLayout);
64 editorViewerButtonGroup->setExclusive(
true);
66 QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
67 sizePolicy.setHorizontalStretch(0);
68 sizePolicy.setVerticalStretch(0);
70 collisionMeshToggleButton->setObjectName(QString::fromUtf8(
"collisionMeshToggleButton"));
71 sizePolicy.setHeightForWidth(collisionMeshToggleButton->sizePolicy().hasHeightForWidth());
72 collisionMeshToggleButton->setSizePolicy(sizePolicy);
74 icon1.addFile(QString::fromUtf8(
":/images/Collision.png"), QSize(), QIcon::Normal,
QIcon::Off);
75 collisionMeshToggleButton->setIcon(icon1);
76 collisionMeshToggleButton->setToolTip(tr(
"Toggle Collisionmesh"));
77 collisionMeshToggleButton->setIconSize(leftButtonsSize);
78 collisionMeshToggleButton->setCheckable(
true);
79 collisionMeshToggleButton->setFixedSize(leftButtonsSize);
80 collisionMeshToggleButton->setStyleSheet(
"background-color: " + buttonColor);
81 collisionMeshToggleButton->move(margin, margin);
82 collisionMeshToggleButton->show();
84 rotateManipulatorToggleButton->setObjectName(
85 QString::fromUtf8(
"rotateManipulatorToggleButton"));
86 sizePolicy.setHeightForWidth(rotateManipulatorToggleButton->sizePolicy().hasHeightForWidth());
87 rotateManipulatorToggleButton->setSizePolicy(sizePolicy);
89 icon2.addFile(QString::fromUtf8(
":/images/Rotate.png"), QSize(), QIcon::Normal,
QIcon::Off);
90 rotateManipulatorToggleButton->setIcon(icon2);
91 rotateManipulatorToggleButton->setToolTip(tr(
"Toggle Rotationmanipulator"));
92 rotateManipulatorToggleButton->setIconSize(leftButtonsSize);
93 rotateManipulatorToggleButton->setCheckable(
true);
94 rotateManipulatorToggleButton->setFixedSize(leftButtonsSize);
95 rotateManipulatorToggleButton->setStyleSheet(
"background-color: " + buttonColor);
96 rotateManipulatorToggleButton->move(
97 margin, collisionMeshToggleButton->pos().y() + leftButtonsSize.height() + spacing);
98 rotateManipulatorToggleButton->show();
100 translateManipulatorToggleButton->setObjectName(
101 QString::fromUtf8(
"translateManipulatorToggleButton"));
102 sizePolicy.setHeightForWidth(
103 translateManipulatorToggleButton->sizePolicy().hasHeightForWidth());
104 translateManipulatorToggleButton->setSizePolicy(sizePolicy);
106 icon3.addFile(QString::fromUtf8(
":/images/Translate.png"), QSize(), QIcon::Normal,
QIcon::Off);
107 translateManipulatorToggleButton->setIcon(icon3);
108 translateManipulatorToggleButton->setToolTip(tr(
"Toggle Translationmanipulator"));
109 translateManipulatorToggleButton->setIconSize(leftButtonsSize);
110 translateManipulatorToggleButton->setCheckable(
true);
111 translateManipulatorToggleButton->setFixedSize(leftButtonsSize);
112 translateManipulatorToggleButton->setStyleSheet(
"background-color: " + buttonColor);
113 translateManipulatorToggleButton->move(
114 margin, rotateManipulatorToggleButton->pos().y() + leftButtonsSize.height() + spacing);
115 translateManipulatorToggleButton->show();
118 undoButton->setObjectName(QString::fromUtf8(
"undoButton"));
119 sizePolicy.setHeightForWidth(undoButton->sizePolicy().hasHeightForWidth());
120 undoButton->setSizePolicy(sizePolicy);
122 icon4.addFile(QString::fromUtf8(
":/icons/edit-undo-3.svg"), QSize(), QIcon::Normal,
QIcon::Off);
123 undoButton->setIcon(icon4);
124 undoButton->setToolTip(tr(
"Undo last Action"));
125 undoButton->setIconSize(leftButtonsSize);
126 undoButton->setFixedSize(leftButtonsSize);
127 undoButton->setStyleSheet(
"background-color: " + buttonColor);
129 margin, translateManipulatorToggleButton->pos().y() + leftButtonsSize.height() + spacing);
132 redoButton =
new QPushButton(
this);
133 redoButton->setObjectName(QString::fromUtf8(
"redoButton"));
134 sizePolicy.setHeightForWidth(redoButton->sizePolicy().hasHeightForWidth());
135 redoButton->setSizePolicy(sizePolicy);
137 icon5.addFile(QString::fromUtf8(
":/icons/edit-redo-3.svg"), QSize(), QIcon::Normal,
QIcon::Off);
138 redoButton->setIcon(icon5);
139 redoButton->setToolTip(tr(
"Redo last Action"));
140 redoButton->setIconSize(leftButtonsSize);
141 redoButton->setFixedSize(leftButtonsSize);
142 redoButton->setStyleSheet(
"background-color: " + buttonColor);
143 redoButton->move(margin, undoButton->pos().y() + leftButtonsSize.height() + spacing);
146 removeSelectedObjectsButton =
new QPushButton(
this);
147 removeSelectedObjectsButton->setObjectName(QString::fromUtf8(
"removeSelectedObjectsButton"));
148 sizePolicy.setHeightForWidth(removeSelectedObjectsButton->sizePolicy().hasHeightForWidth());
149 removeSelectedObjectsButton->setSizePolicy(sizePolicy);
152 QString::fromUtf8(
":/icons/dialog-close.ico"), QSize(), QIcon::Normal,
QIcon::Off);
153 removeSelectedObjectsButton->setIcon(icon6);
154 removeSelectedObjectsButton->setToolTip(tr(
"Remove selected Objects from scene"));
155 removeSelectedObjectsButton->setIconSize(leftButtonsSize);
156 removeSelectedObjectsButton->setFixedSize(leftButtonsSize);
157 removeSelectedObjectsButton->setStyleSheet(
"background-color: " + buttonColor);
158 removeSelectedObjectsButton->move(margin,
159 redoButton->pos().y() + leftButtonsSize.height() + spacing);
160 removeSelectedObjectsButton->show();
162 viewerToggleButton->setObjectName(QString::fromUtf8(
"viewerToggleButton"));
163 viewerToggleButton->setText(tr(
"Viewer"));
164 viewerToggleButton->setCheckable(
true);
165 viewerToggleButton->adjustSize();
166 viewerToggleButton->setStyleSheet(
"background-color: " + buttonColor);
167 viewerToggleButton->show();
168 editorViewerButtonGroup->addButton(viewerToggleButton, VIEWER_BUTTON_ID);
170 editorToggleButton->setObjectName(QString::fromUtf8(
"editorToggleButton"));
171 editorToggleButton->setText(tr(
"Editor"));
172 editorToggleButton->setCheckable(
true);
173 editorToggleButton->setChecked(
true);
174 editorToggleButton->adjustSize();
175 editorToggleButton->setStyleSheet(
"background-color: " + buttonColor);
176 editorToggleButton->show();
177 editorViewerButtonGroup->addButton(editorToggleButton, EDITOR_BUTTON_ID);
180 connect(undoButton, SIGNAL(released()),
this, SLOT(undoButtonReleased()));
181 connect(redoButton, SIGNAL(released()),
this, SLOT(redoButtonReleased()));
182 connect(removeSelectedObjectsButton,
185 SLOT(removeSelectedObjectsButtonReleased()));
186 connect(collisionMeshToggleButton,
187 SIGNAL(toggled(
bool)),
189 SLOT(collisionMeshToggleButtonToggled(
bool)));
190 connect(rotateManipulatorToggleButton,
191 SIGNAL(toggled(
bool)),
193 SLOT(rotateManipulatorToggleButtonToggled(
bool)));
194 connect(translateManipulatorToggleButton,
195 SIGNAL(toggled(
bool)),
197 SLOT(translateManipulatorToggleButtonToggled(
bool)));
198 connect(editorViewerButtonGroup,
201 SLOT(editorViewerButtonGroupButtonClicked(
int)));
203 std::shared_ptr<gui::ShortcutController> shortcutController =
control->getShortcutController();
205 QPointer<QAction> undoAction(
new OverrideAction(
"Scene: Undo last Action",
this));
206 this->addAction(undoAction);
207 connect(undoAction, SIGNAL(triggered()), undoButton, SLOT(click()));
208 shortcutController->registerAction(undoAction->text(), undoAction);
210 QPointer<QAction> redoAction(
new OverrideAction(
"Scene: Redo last Action",
this));
211 this->addAction(redoAction);
212 connect(redoAction, SIGNAL(triggered()), redoButton, SLOT(click()));
213 shortcutController->registerAction(redoAction->text(), redoAction);
215 QPointer<QAction> removeSelectedObjectsAction(
217 this->addAction(removeSelectedObjectsAction);
218 connect(removeSelectedObjectsAction,
220 removeSelectedObjectsButton,
222 shortcutController->registerAction(removeSelectedObjectsAction->text(),
223 removeSelectedObjectsAction);
225 QPointer<QAction> collisionAction(
new OverrideAction(
"Scene: Toggle Collision Meshes",
this));
226 this->addAction(collisionAction);
227 connect(collisionAction, SIGNAL(triggered()), collisionMeshToggleButton, SLOT(toggle()));
228 shortcutController->registerAction(collisionAction->text(), collisionAction);
230 QPointer<QAction> rotateAction(
new OverrideAction(
"Scene: Toggle Rotation Manipulator",
this));
231 this->addAction(rotateAction);
232 connect(rotateAction, SIGNAL(triggered()), rotateManipulatorToggleButton, SLOT(toggle()));
233 shortcutController->registerAction(rotateAction->text(), rotateAction);
235 QPointer<QAction> translateAction(
236 new OverrideAction(
"Scene: Toggle Translation Manipulator",
this));
237 this->addAction(translateAction);
238 connect(translateAction, SIGNAL(triggered()), translateManipulatorToggleButton, SLOT(toggle()));
239 shortcutController->registerAction(translateAction->text(), translateAction);
241 QPointer<QAction> editorAction(
new OverrideAction(
"Scene: Switch to Editor Mode",
this));
242 this->addAction(editorAction);
243 connect(editorAction, SIGNAL(triggered()), editorToggleButton, SLOT(click()));
244 shortcutController->registerAction(editorAction->text(), editorAction);
246 QPointer<QAction> viewerAction(
new OverrideAction(
"Scene: Switch to Viewer Mode",
this));
247 this->addAction(viewerAction);
248 connect(viewerAction, SIGNAL(triggered()), viewerToggleButton, SLOT(click()));
249 shortcutController->registerAction(viewerAction->text(), viewerAction);
251 QPointer<QAction> switchEditorViewerAction(
252 new OverrideAction(
"Scene: Switch between Editor and Viewer Mode",
this));
253 this->addAction(switchEditorViewerAction);
254 connect(switchEditorViewerAction, SIGNAL(triggered()),
this, SLOT(toggleEditorViewerMode()));
255 shortcutController->registerAction(switchEditorViewerAction->text(), switchEditorViewerAction);
257 emit sizeChanged(this->size());
265 gui::SceneEditorWidget::resizeEvent(QResizeEvent* event)
267 QWidget::resizeEvent(event);
268 emit sizeChangedSignal(event->size());
272 gui::SceneEditorWidget::sizeChanged(QSize newSize)
274 viewerToggleButton->move(newSize.width() - margin - viewerToggleButton->size().width(), margin);
275 editorToggleButton->move(viewerToggleButton->pos().x() - editorToggleButton->size().width(),
280 gui::SceneEditorWidget::undoButtonReleased()
284 sharedController->undo();
289 gui::SceneEditorWidget::redoButtonReleased()
293 sharedController->redo();
298 gui::SceneEditorWidget::removeSelectedObjectsButtonReleased()
302 std::shared_ptr<std::vector<controller::OperationPtr>> operations(
303 new std::vector<controller::OperationPtr>());
304 std::vector<scene3D::SceneObjectPtr> selectedObjects =
305 sharedController->getScene()->getSelectionManager()->getAllSelected();
306 std::vector<scene3D::SceneGroupPtr> groups =
307 sharedController->getScene()->getGroupManager()->getAllGroups();
309 for (
auto it = selectedObjects.rbegin(); it != selectedObjects.rend(); ++it)
313 sharedController->getScene(),
314 (*it)->getObjectId()));
315 operations->push_back(deselectOperation);
317 for (
auto itG = groups.begin(); itG != groups.end(); ++itG)
319 if ((*itG)->contains(*it))
323 sharedController->getMemoryXController(),
324 sharedController->getScene(),
325 (*itG)->getGroupId(),
326 (*it)->getObjectId()));
327 operations->push_back(removeFromGroupOperation);
333 sharedController->getScene(),
334 (*it)->getObjectId()));
335 operations->push_back(removeOperation);
346 gui::SceneEditorWidget::collisionMeshToggleButtonToggled(
bool checked)
351 sharedController->getScene()->getObjectManager()->getAllObjects())
353 object->showCollisionMesh(checked);
359 gui::SceneEditorWidget::rotateManipulatorToggleButtonToggled(
bool checked)
367 if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode() ==
379 if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode() ==
390 sharedController->getScene()->getManipulatorManager()->setManipulatorMode(mode);
395 gui::SceneEditorWidget::translateManipulatorToggleButtonToggled(
bool checked)
403 if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode() ==
415 if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode() ==
426 sharedController->getScene()->getManipulatorManager()->setManipulatorMode(mode);
431 gui::SceneEditorWidget::editorViewerButtonGroupButtonClicked(
int id)
435 if (
id == VIEWER_BUTTON_ID)
437 showCollisionMesh = collisionMeshToggleButton->isChecked();
439 if (showCollisionMesh)
441 collisionMeshToggleButton->click();
444 collisionMeshToggleButton->hide();
445 collisionMeshToggleButton->setEnabled(
false);
446 collisionMeshToggleButton->setCheckable(
false);
447 showRotateManipulator = rotateManipulatorToggleButton->isChecked();
449 if (showRotateManipulator)
451 rotateManipulatorToggleButton->click();
454 rotateManipulatorToggleButton->hide();
455 rotateManipulatorToggleButton->setEnabled(
false);
456 rotateManipulatorToggleButton->setCheckable(
false);
457 showTranslateManipulator = translateManipulatorToggleButton->isChecked();
459 if (showTranslateManipulator)
461 translateManipulatorToggleButton->click();
464 translateManipulatorToggleButton->hide();
465 translateManipulatorToggleButton->setEnabled(
false);
466 translateManipulatorToggleButton->setCheckable(
false);
468 undoButton->setEnabled(
false);
470 redoButton->setEnabled(
false);
471 removeSelectedObjectsButton->hide();
472 removeSelectedObjectsButton->setEnabled(
false);
474 sharedController->getScene()->enterViewerMode();
476 else if (
id == EDITOR_BUTTON_ID)
478 collisionMeshToggleButton->show();
479 collisionMeshToggleButton->setEnabled(
true);
480 collisionMeshToggleButton->setCheckable(
true);
482 if (showCollisionMesh)
484 collisionMeshToggleButton->click();
487 rotateManipulatorToggleButton->show();
488 rotateManipulatorToggleButton->setEnabled(
true);
489 rotateManipulatorToggleButton->setCheckable(
true);
491 if (showRotateManipulator)
493 rotateManipulatorToggleButton->click();
496 translateManipulatorToggleButton->show();
497 translateManipulatorToggleButton->setEnabled(
true);
498 translateManipulatorToggleButton->setCheckable(
true);
500 if (showTranslateManipulator)
502 translateManipulatorToggleButton->click();
506 undoButton->setEnabled(
true);
508 redoButton->setEnabled(
true);
509 removeSelectedObjectsButton->show();
510 removeSelectedObjectsButton->setEnabled(
true);
512 sharedController->getScene()->enterEditorMode();
518 gui::SceneEditorWidget::toggleEditorViewerMode()
520 switch (this->editorViewerButtonGroup->checkedId())
522 case VIEWER_BUTTON_ID:
523 this->editorToggleButton->click();
526 case EDITOR_BUTTON_ID:
527 this->viewerToggleButton->click();
535 collisionMeshToggleButton->setToolTip(tr(
"Toggle Collisionmesh"));
536 rotateManipulatorToggleButton->setToolTip(tr(
"Toggle Rotationmanipulator"));
537 translateManipulatorToggleButton->setToolTip(tr(
"Toggle Translationmanipulator"));
538 undoButton->setToolTip(tr(
"Undo last Action"));
539 redoButton->setToolTip(tr(
"Redo last Action"));
540 removeSelectedObjectsButton->setToolTip(tr(
"Remove selected Objects from scene"));
541 viewerToggleButton->setText(tr(
"Viewer"));
542 editorToggleButton->setText(tr(
"Editor"));
548 sceneGraph->postDocking();