SceneEditorWidget.cpp
Go to the documentation of this file.
1/*
2 * This file is part of ArmarX.
3 *
4 * Copyright (C) 2012-2016, High Performance Humanoid Technologies (H2T), Karlsruhe Institute of Technology (KIT), all rights reserved.
5 *
6 * ArmarX is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License version 2 as
8 * published by the Free Software Foundation.
9 *
10 * ArmarX is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program. If not, see <http://www.gnu.org/licenses/>.
17 *
18 * @package MemoryX::gui-plugins::SceneEditor
19 * @date 2015
20 * @copyright http://www.gnu.org/licenses/gpl-2.0.txt
21 * GNU General Public License
22 */
23
24#include "SceneEditorWidget.h"
25
26#include <QtConcurrent/qtconcurrentrun.h>
27
31#include "OverrideAction.h"
32
34 QWidget* parent) :
35 QWidget(parent),
37 sceneGraph(new ScenegraphWidget(control, this)),
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"),
50 margin(20),
51 spacing(10),
52 showCollisionMesh(false),
53 showTranslateManipulator(false),
54 showRotateManipulator(false)
55{
56 setPalette(Qt::transparent);
57
58 setObjectName(QString::fromUtf8("SceneEditorWidget"));
59
60 mainLayout->addWidget(sceneGraph);
61
62 this->setLayout(mainLayout);
63
64 editorViewerButtonGroup->setExclusive(true);
65
66 QSizePolicy sizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
67 sizePolicy.setHorizontalStretch(0);
68 sizePolicy.setVerticalStretch(0);
69
70 collisionMeshToggleButton->setObjectName(QString::fromUtf8("collisionMeshToggleButton"));
71 sizePolicy.setHeightForWidth(collisionMeshToggleButton->sizePolicy().hasHeightForWidth());
72 collisionMeshToggleButton->setSizePolicy(sizePolicy);
73 QIcon icon1;
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();
83
84 rotateManipulatorToggleButton->setObjectName(
85 QString::fromUtf8("rotateManipulatorToggleButton"));
86 sizePolicy.setHeightForWidth(rotateManipulatorToggleButton->sizePolicy().hasHeightForWidth());
87 rotateManipulatorToggleButton->setSizePolicy(sizePolicy);
88 QIcon icon2;
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();
99
100 translateManipulatorToggleButton->setObjectName(
101 QString::fromUtf8("translateManipulatorToggleButton"));
102 sizePolicy.setHeightForWidth(
103 translateManipulatorToggleButton->sizePolicy().hasHeightForWidth());
104 translateManipulatorToggleButton->setSizePolicy(sizePolicy);
105 QIcon icon3;
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();
116
117
118 undoButton->setObjectName(QString::fromUtf8("undoButton"));
119 sizePolicy.setHeightForWidth(undoButton->sizePolicy().hasHeightForWidth());
120 undoButton->setSizePolicy(sizePolicy);
121 QIcon icon4;
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);
128 undoButton->move(
129 margin, translateManipulatorToggleButton->pos().y() + leftButtonsSize.height() + spacing);
130 undoButton->show();
131
132 redoButton = new QPushButton(this);
133 redoButton->setObjectName(QString::fromUtf8("redoButton"));
134 sizePolicy.setHeightForWidth(redoButton->sizePolicy().hasHeightForWidth());
135 redoButton->setSizePolicy(sizePolicy);
136 QIcon icon5;
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);
144 redoButton->show();
145
146 removeSelectedObjectsButton = new QPushButton(this);
147 removeSelectedObjectsButton->setObjectName(QString::fromUtf8("removeSelectedObjectsButton"));
148 sizePolicy.setHeightForWidth(removeSelectedObjectsButton->sizePolicy().hasHeightForWidth());
149 removeSelectedObjectsButton->setSizePolicy(sizePolicy);
150 QIcon icon6;
151 icon6.addFile(
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();
161
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);
169
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);
178
179 connect(this, SIGNAL(sizeChangedSignal(QSize)), this, SLOT(sizeChanged(QSize)));
180 connect(undoButton, SIGNAL(released()), this, SLOT(undoButtonReleased()));
181 connect(redoButton, SIGNAL(released()), this, SLOT(redoButtonReleased()));
182 connect(removeSelectedObjectsButton,
183 SIGNAL(released()),
184 this,
185 SLOT(removeSelectedObjectsButtonReleased()));
186 connect(collisionMeshToggleButton,
187 SIGNAL(toggled(bool)),
188 this,
189 SLOT(collisionMeshToggleButtonToggled(bool)));
190 connect(rotateManipulatorToggleButton,
191 SIGNAL(toggled(bool)),
192 this,
193 SLOT(rotateManipulatorToggleButtonToggled(bool)));
194 connect(translateManipulatorToggleButton,
195 SIGNAL(toggled(bool)),
196 this,
197 SLOT(translateManipulatorToggleButtonToggled(bool)));
198 connect(editorViewerButtonGroup,
199 SIGNAL(buttonClicked(int)),
200 this,
201 SLOT(editorViewerButtonGroupButtonClicked(int)));
202
203 std::shared_ptr<gui::ShortcutController> shortcutController = control->getShortcutController();
204
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);
209
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);
214
215 QPointer<QAction> removeSelectedObjectsAction(
216 new OverrideAction("Scene: Remove the selected Objects", this));
217 this->addAction(removeSelectedObjectsAction);
218 connect(removeSelectedObjectsAction,
219 SIGNAL(triggered()),
220 removeSelectedObjectsButton,
221 SLOT(click()));
222 shortcutController->registerAction(removeSelectedObjectsAction->text(),
223 removeSelectedObjectsAction);
224
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);
229
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);
234
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);
240
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);
245
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);
250
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);
256
257 emit sizeChanged(this->size());
258}
259
263
264void
265gui::SceneEditorWidget::resizeEvent(QResizeEvent* event)
266{
267 QWidget::resizeEvent(event);
268 emit sizeChangedSignal(event->size());
269}
270
271void
272gui::SceneEditorWidget::sizeChanged(QSize newSize)
273{
274 viewerToggleButton->move(newSize.width() - margin - viewerToggleButton->size().width(), margin);
275 editorToggleButton->move(viewerToggleButton->pos().x() - editorToggleButton->size().width(),
276 margin);
277}
278
279void
280gui::SceneEditorWidget::undoButtonReleased()
281{
282 if (controller::ControllerPtr sharedController = control.lock())
283 {
284 sharedController->undo();
285 }
286}
287
288void
289gui::SceneEditorWidget::redoButtonReleased()
290{
291 if (controller::ControllerPtr sharedController = control.lock())
292 {
293 sharedController->redo();
294 }
295}
296
297void
298gui::SceneEditorWidget::removeSelectedObjectsButtonReleased()
299{
300 if (controller::ControllerPtr sharedController = control.lock())
301 {
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();
308
309 for (auto it = selectedObjects.rbegin(); it != selectedObjects.rend(); ++it)
310 {
311 controller::OperationPtr deselectOperation(
312 new controller::DeselectOperation(sharedController->getMemoryXController(),
313 sharedController->getScene(),
314 (*it)->getObjectId()));
315 operations->push_back(deselectOperation);
316
317 for (auto itG = groups.begin(); itG != groups.end(); ++itG)
318 {
319 if ((*itG)->contains(*it))
320 {
321 controller::OperationPtr removeFromGroupOperation(
322 new controller::RemoveFromGroupOperation(
323 sharedController->getMemoryXController(),
324 sharedController->getScene(),
325 (*itG)->getGroupId(),
326 (*it)->getObjectId()));
327 operations->push_back(removeFromGroupOperation);
328 }
329 }
330
331 controller::OperationPtr removeOperation(
332 new controller::RemoveOperation(sharedController->getMemoryXController(),
333 sharedController->getScene(),
334 (*it)->getObjectId()));
335 operations->push_back(removeOperation);
336 }
337
338 sharedController->execute(controller::Controller::EXECUTE_ON_SCENE |
341 operations);
342 }
343}
344
345void
346gui::SceneEditorWidget::collisionMeshToggleButtonToggled(bool checked)
347{
348 if (controller::ControllerPtr sharedController = control.lock())
349 {
350 for (scene3D::SceneObjectPtr object :
351 sharedController->getScene()->getObjectManager()->getAllObjects())
352 {
353 object->showCollisionMesh(checked);
354 }
355 }
356}
357
358void
359gui::SceneEditorWidget::rotateManipulatorToggleButtonToggled(bool checked)
360{
361 if (controller::ControllerPtr sharedController = control.lock())
362 {
364
365 if (checked)
366 {
367 if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode() ==
369 {
371 }
372 else
373 {
375 }
376 }
377 else
378 {
379 if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode() ==
381 {
383 }
384 else
385 {
387 }
388 }
389
390 sharedController->getScene()->getManipulatorManager()->setManipulatorMode(mode);
391 }
392}
393
394void
395gui::SceneEditorWidget::translateManipulatorToggleButtonToggled(bool checked)
396{
397 if (controller::ControllerPtr sharedController = control.lock())
398 {
400
401 if (checked)
402 {
403 if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode() ==
405 {
407 }
408 else
409 {
411 }
412 }
413 else
414 {
415 if (sharedController->getScene()->getManipulatorManager()->getManipulatorMode() ==
417 {
419 }
420 else
421 {
423 }
424 }
425
426 sharedController->getScene()->getManipulatorManager()->setManipulatorMode(mode);
427 }
428}
429
430void
431gui::SceneEditorWidget::editorViewerButtonGroupButtonClicked(int id)
432{
433 if (controller::ControllerPtr sharedController = control.lock())
434 {
435 if (id == VIEWER_BUTTON_ID)
436 {
437 showCollisionMesh = collisionMeshToggleButton->isChecked();
438
439 if (showCollisionMesh)
440 {
441 collisionMeshToggleButton->click();
442 }
443
444 collisionMeshToggleButton->hide();
445 collisionMeshToggleButton->setEnabled(false);
446 collisionMeshToggleButton->setCheckable(false);
447 showRotateManipulator = rotateManipulatorToggleButton->isChecked();
448
449 if (showRotateManipulator)
450 {
451 rotateManipulatorToggleButton->click();
452 }
453
454 rotateManipulatorToggleButton->hide();
455 rotateManipulatorToggleButton->setEnabled(false);
456 rotateManipulatorToggleButton->setCheckable(false);
457 showTranslateManipulator = translateManipulatorToggleButton->isChecked();
458
459 if (showTranslateManipulator)
460 {
461 translateManipulatorToggleButton->click();
462 }
463
464 translateManipulatorToggleButton->hide();
465 translateManipulatorToggleButton->setEnabled(false);
466 translateManipulatorToggleButton->setCheckable(false);
467 undoButton->hide();
468 undoButton->setEnabled(false);
469 redoButton->hide();
470 redoButton->setEnabled(false);
471 removeSelectedObjectsButton->hide();
472 removeSelectedObjectsButton->setEnabled(false);
473
474 sharedController->getScene()->enterViewerMode();
475 }
476 else if (id == EDITOR_BUTTON_ID)
477 {
478 collisionMeshToggleButton->show();
479 collisionMeshToggleButton->setEnabled(true);
480 collisionMeshToggleButton->setCheckable(true);
481
482 if (showCollisionMesh)
483 {
484 collisionMeshToggleButton->click();
485 }
486
487 rotateManipulatorToggleButton->show();
488 rotateManipulatorToggleButton->setEnabled(true);
489 rotateManipulatorToggleButton->setCheckable(true);
490
491 if (showRotateManipulator)
492 {
493 rotateManipulatorToggleButton->click();
494 }
495
496 translateManipulatorToggleButton->show();
497 translateManipulatorToggleButton->setEnabled(true);
498 translateManipulatorToggleButton->setCheckable(true);
499
500 if (showTranslateManipulator)
501 {
502 translateManipulatorToggleButton->click();
503 }
504
505 undoButton->show();
506 undoButton->setEnabled(true);
507 redoButton->show();
508 redoButton->setEnabled(true);
509 removeSelectedObjectsButton->show();
510 removeSelectedObjectsButton->setEnabled(true);
511
512 sharedController->getScene()->enterEditorMode();
513 }
514 }
515}
516
517void
518gui::SceneEditorWidget::toggleEditorViewerMode()
519{
520 switch (this->editorViewerButtonGroup->checkedId())
521 {
522 case VIEWER_BUTTON_ID:
523 this->editorToggleButton->click();
524 break;
525
526 case EDITOR_BUTTON_ID:
527 this->viewerToggleButton->click();
528 break;
529 }
530}
531
532void
534{
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"));
543}
544
545void
547{
548 sceneGraph->postDocking();
549}
static const int UNDOABLE
A flag to save the executed operations to the history.
Definition Controller.h:80
static const int EXECUTE_ON_WM
A Flag to execute operations on the WorkingMemory.
Definition Controller.h:66
static const int EXECUTE_ON_SCENE
A flag to execute operations on the Scene.
Definition Controller.h:73
void sizeChangedSignal(QSize newSize)
Signal emitted when the size of the widget has changed.
void retranslate()
Translates all translatable strings in this dialog.
SceneEditorWidget(const controller::ControllerPtr &control, QWidget *parent=0)
Constructor.
This class provides a widget which holds a scene3D::SceneViewer in which the scene graph is rendered.
This file is part of ArmarX.
std::shared_ptr< Controller > ControllerPtr
std::shared_ptr< Operation > OperationPtr
boost::intrusive_ptr< SceneObject > SceneObjectPtr