00001 #include <qlistview.h>
00002
00003 #include <X3DTK/kernel.h>
00004
00005 #include <animal/X3DTK/Qt/mainControllerGUI/MainController.h>
00006
00007 #include <animal/X3DTK/X3D/frameNode/frameNode.h>
00008
00009 #include "X3DTreeQt.h"
00010
00011 namespace X3DTK{
00012 namespace Qt{
00013
00015 X3DTreeQt::X3DTreeQt( QWidget* parent,
00016 const char* name,
00017 WFlags fl)
00018 : X3DTreeDesigner(parent, name, fl)
00019 , mainController(NULL)
00020 , selectedItem(NULL)
00021
00022 , bufferNode(NULL)
00023 {
00024
00025 scene_item = new QListViewItem(X3DListView,QString("X3D Scene"));
00026
00027
00028 insertDeletePopup = new QPopupMenu( this );
00029 Q_CHECK_PTR( insertDeletePopup );
00030 insertDeletePopup->insertItem( "Insert file...", this, SLOT(insertNode()) );
00031 insertDeletePopup->insertItem( "Insert Transform", this, SLOT(insertTransform()) );
00032 insertDeletePopup->insertItem( "Delete node", this, SLOT(deleteNode()) );
00033
00034
00035 QObject::connect(X3DListView, SIGNAL(expanded(QListViewItem*)), this, SLOT(ExpandItemInSceneView(QListViewItem*)));
00036 QObject::connect(X3DListView, SIGNAL(collapsed(QListViewItem*)), this, SLOT(CollapseItemInSceneView(QListViewItem*)));
00037 QObject::connect(X3DListView, SIGNAL(doubleClicked(QListViewItem*)), this, SLOT(DoubleClickeItemInSceneView(QListViewItem*)));
00038 QObject::connect(X3DListView, SIGNAL(selectionChanged(QListViewItem*)), this, SLOT(SelectItemInSceneView(QListViewItem*)));
00039 QObject::connect(X3DListView, SIGNAL(clicked(QListViewItem*)), this, SLOT(SelectItemInSceneView(QListViewItem*)));
00040 QObject::connect(X3DListView, SIGNAL(rightButtonClicked(QListViewItem*,const QPoint&,int)), this, SLOT(insertDeletePopupMenu(QListViewItem *, const QPoint&)));
00041 }
00042
00044 X3DTreeQt::~X3DTreeQt(){}
00045
00047 void X3DTreeQt::setSceneGraphRoot(X3DTK::X3D::Scene * scene)
00048 {
00049 if (!scene)
00050 {
00051 std::cerr<<"Warning X3DTreeQt::setSceneGraphRoot(): the x3d scene is NULL."<<std::endl;
00052 return;
00053 }
00054
00055
00056 QListViewItem * child = scene_item->firstChild();
00057 while( child != NULL )
00058 {
00059 QListViewItem *tmp_child = child->nextSibling();
00060 eraseItemX3DMap(child);
00061 if(child)
00062 {
00063 delete child ;
00064 child = NULL;
00065 }
00066 else
00067 std::cerr<<"Warning X3DTreeQt::setSceneGraphRoot(): impossible to delete child: it is NULL."<<std::endl;
00068 child = tmp_child ;
00069 }
00070
00071
00072 itemX3DMap[scene_item] = scene;
00073
00074 scene_item->setOpen(true);
00075
00076
00077 ExpandChildItemInSceneView(scene_item);
00078
00079
00080 ExpandItemInSceneView(scene_item);
00081
00082
00083 bufferNode = NULL;
00084
00085 }
00086
00088 void X3DTreeQt::setMainController(::MainController * mainController)
00089 {
00090 this->mainController = mainController;
00091
00092 setSceneGraphRoot((mainController->getMainScene())->getX3DScene());
00093 }
00094
00096 QListViewItem * X3DTreeQt::AddSceneNodeItemInListView(QListViewItem * parent, X3DTK::X3D::X3DNode * node)
00097 {
00098 QString s1, s2;
00099
00100
00101 if ( node == NULL )
00102 {
00103 s1 = QString("NULL");
00104 s2 = QString("");
00105 }
00106 else
00107 {
00108
00109 s1 = QString(node->getType()->getName());
00110 s2 = QString(node->getName());
00111
00112 }
00113
00114 QListViewItem * item = new QListViewItem(parent,s1,s2);
00115
00116
00117 itemX3DMap[item] = node;
00118
00119 return item;
00120 }
00121
00123 void X3DTreeQt::CollapseItemInSceneView(QListViewItem *item)
00124 {
00125
00126 QListViewItem * child = item->firstChild();
00127 while( child != NULL )
00128 {
00129 QListViewItem *tmp_child = child->nextSibling();
00130 child->setOpen(false);
00131 child = tmp_child ;
00132 }
00133 }
00134
00136 void X3DTreeQt::ExpandChildItemInSceneView(QListViewItem *item)
00137 {
00138
00139 if(!item) return;
00140
00141
00142 X3DTK::X3D::X3DNode * node = itemX3DMap[item];
00143
00144 if(!node) return;
00145
00146
00147 QListViewItem * child = item->firstChild();
00148 while( child != NULL )
00149 {
00150 QListViewItem *tmp_child = child->nextSibling();
00151 eraseItemX3DMap(child);
00152 if(child)
00153 {
00154 delete child ;
00155 child = NULL;
00156 }
00157 else
00158 std::cerr<<"Warning X3DTreeQt::ExpandChildItemInSceneView(): impossible to delete child: it is NULL."<<std::endl;
00159 child = tmp_child ;
00160 }
00161
00162
00163
00164 MFNode childrenList = node->getChildList();
00165 for(MFNode::iterator it = childrenList.begin(); it != childrenList.end();++it)
00166 AddSceneNodeItemInListView(item,static_cast<X3DTK::X3D::X3DNode*>(*it));
00167 }
00168
00169 void X3DTreeQt::ExpandItemInSceneView(QListViewItem *item)
00170 {
00171 if(!item) return;
00172 for (QListViewItem *cour = item->firstChild();cour != NULL;cour = cour->nextSibling())
00173 ExpandChildItemInSceneView(cour);
00174 }
00175
00176 void X3DTreeQt::DoubleClickeItemInSceneView(QListViewItem *item)
00177 {
00178
00179
00180 if(item == NULL)
00181 return;
00182
00183
00184 X3DTK::X3D::X3DNode * node = itemX3DMap[item];
00185
00186 displayWidget(node);
00187 }
00188
00189 void X3DTreeQt::displayWidget(X3D::X3DNode * node)
00190 {
00191 if (node)
00192 {
00193 QWidget * qwidget;
00194 if ((mainController->getX3DQtMap()).find(node)== (mainController->getX3DQtMap()).end())
00195 qwidget = mainController->createQWidgetController(node);
00196 else
00197 qwidget =(mainController->getX3DQtMap())[node];
00198
00199 if (qwidget)
00200 {
00201 qwidget->raise();
00202 qwidget->show();
00203 }
00204 }
00205 }
00206
00207 void X3DTreeQt::SelectItemInSceneView(QListViewItem *item)
00208 {
00209 selectedItem = item;
00210
00211
00212 X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00213
00214
00215 X3DTK::X3D::X3DBoundedObject * X3DBN = dynamic_cast<X3DTK::X3D::X3DBoundedObject *>(node);
00216
00217 ( mainController->getMainScene() )->setSelectedNode(X3DBN);
00218
00219
00220
00221
00222
00223
00224
00225 updateGL();
00226 }
00227
00228 void X3DTreeQt::insertDeletePopupMenu(QListViewItem * item, const QPoint& point)
00229 {
00230 if (item)
00231 {
00232 insertDeletePopup->move( point );
00233 insertDeletePopup->show();
00234 }
00235 }
00236
00237 void X3DTreeQt::insertNode()
00238 {
00239 if(selectedItem)
00240 {
00241
00242 X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00243
00244
00245 mainController->fileInsert(node);
00246
00247
00248 ExpandChildItemInSceneView(scene_item);
00249
00250
00251 ExpandItemInSceneView(scene_item);
00252
00253 }
00254
00255 }
00256
00257 void X3DTreeQt::insertTransform()
00258 {
00259 if(selectedItem)
00260 {
00261
00262 X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00263 if(!dynamic_cast<X3DTK::X3D::FrameNode *>(node))
00264 {
00265
00266 QListViewItem * parent = selectedItem->parent();
00267 X3DTK::X3D::X3DNode * parentNode = itemX3DMap[parent];
00268
00269
00270 X3D::Transform * transform = new X3D::Transform();
00271 if ( (mainController->getMainScene())->pastNode(transform, parentNode) &&
00272 (mainController->getMainScene())->cutNode(node, parentNode) &&
00273 (mainController->getMainScene())->pastNode(node, transform))
00274 {
00275
00276
00277
00278 ExpandChildItemInSceneView(scene_item);
00279
00280
00281 ExpandItemInSceneView(scene_item);
00282 }
00283 }else
00284 std::cerr<<"Warning X3DTreeQt::insertTransform(): impossible to make a X3DTK::X3D::Transform parent of X3DTK::X3D::FrameNode."<<std::endl;
00285 }
00286
00287 }
00288
00289 void X3DTreeQt::pastNode()
00290 {
00291 if(selectedItem && bufferNode)
00292 {
00293
00294 X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00295
00296
00297 (mainController->getMainScene())->pastNode(bufferNode, node);
00298
00299
00300 QListViewItem * bufferItem = NULL;
00301 for(ItemX3DMap::iterator it= itemX3DMap.begin() ; it!= itemX3DMap.end() ; ++it)
00302 if (bufferNode == (*it).second)
00303 bufferItem = (*it).first;
00304 if (bufferItem)
00305 {
00306
00307
00308 QString s = QString(bufferNode->getName());
00309 bufferItem->setText(1, s);
00310 }
00311
00312
00313 ExpandChildItemInSceneView(scene_item);
00314
00315
00316 ExpandItemInSceneView(scene_item);
00317
00318 updateGL();
00319 }
00320
00321 }
00322
00323 void X3DTreeQt::addNode(X3DTK::X3D::X3DNode * node)
00324 {
00325 if(selectedItem)
00326 {
00327
00328 X3DTK::X3D::X3DNode * parentNode = itemX3DMap[selectedItem];
00329
00330
00331 (mainController->getMainScene())->pastNode(node, parentNode);
00332
00333
00334 ExpandChildItemInSceneView(scene_item);
00335
00336
00337 ExpandItemInSceneView(scene_item);
00338
00339 updateGL();
00340 }
00341
00342 }
00343
00344 void X3DTreeQt::cutNode()
00345 {
00346 if(selectedItem)
00347 {
00348 copyNode();
00349
00350
00351 QListViewItem * parent = selectedItem->parent();
00352 X3DTK::X3D::X3DNode * parentNode = itemX3DMap[parent];
00353
00354
00355
00356 (mainController->getMainScene())->cutNode(bufferNode, parentNode);
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 ExpandChildItemInSceneView(scene_item);
00369
00370
00371 ExpandItemInSceneView(scene_item);
00372
00373
00374 updateGL();
00375 }
00376 }
00377
00378 void X3DTreeQt::copyNode()
00379 {
00380 if(selectedItem)
00381 {
00382 if(!dynamic_cast<X3DTK::X3D::FrameNode *>(itemX3DMap[selectedItem]))
00383 {
00384 releaseBufferNode();
00385
00386 bufferNode = itemX3DMap[selectedItem];
00387 }else
00388 std::cerr<<"Warning X3DTreeQt::copyNode(): impossible to copy a X3DTK::X3D::FrameNode."<<std::endl;
00389 }
00390 }
00391
00392 void X3DTreeQt::deleteNode()
00393 {
00394 if(selectedItem)
00395 {
00396
00397 X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00398
00399
00400 QListViewItem * parent = selectedItem->parent();
00401 X3DTK::X3D::X3DNode * parentNode = itemX3DMap[parent];
00402
00403
00404
00405
00406 (mainController->getMainScene())->deleteNode(node, parentNode);
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419 ExpandChildItemInSceneView(scene_item);
00420
00421
00422 ExpandItemInSceneView(scene_item);
00423
00424
00425
00426 QListViewItem * bufferItem = NULL;
00427
00428 for(ItemX3DMap::iterator it= itemX3DMap.begin() ; it!= itemX3DMap.end() ; ++it)
00429 {
00430 if (bufferNode == (*it).second)
00431 bufferItem = (*it).first;
00432
00433
00434 }
00435 if(!bufferItem)
00436 bufferNode = NULL;
00437
00438
00439
00440 updateGL();
00441 }
00442 }
00443
00444 void X3DTreeQt::keyPressEvent( QKeyEvent *k )
00445 {
00446
00447 if (k->key()== Qt::Key_X && k->state()==Qt::ControlButton)
00448 {
00449 cutNode();
00450
00451 }else if (k->key()== Qt::Key_V && k->state()==Qt::ControlButton)
00452 {
00453 pastNode();
00454 }else if (k->key()== Qt::Key_C && k->state()==Qt::ControlButton)
00455 {
00456 copyNode();
00457 }else
00458 k->ignore();
00459 }
00460
00461 void X3DTreeQt::updateGL()
00462 {
00463
00464 mainController->display();
00465 }
00466
00468 void X3DTreeQt::releaseBufferNode()
00469 {
00470 if (bufferNode)
00471 {
00472
00473 QListViewItem * bufferItem = NULL;
00474 for(ItemX3DMap::iterator it= itemX3DMap.begin() ; it!= itemX3DMap.end() ; ++it)
00475 if (bufferNode == (*it).second)
00476 bufferItem = (*it).first;
00477 if(!bufferItem)
00478 {
00479
00480 (mainController->getMainScene())->deleteNode(bufferNode, NULL);
00481
00482 bufferNode = NULL;
00483 }
00484 }
00485 }
00486
00488 void X3DTreeQt::eraseItemX3DMap(QListViewItem * item)
00489 {
00490 QListViewItem * child = item->firstChild();
00491 while( child != NULL )
00492 {
00493 QListViewItem *tmp_child = child->nextSibling();
00494 eraseItemX3DMap(child);
00495 child = tmp_child ;
00496 }
00497 itemX3DMap.erase(item);
00498 }
00499
00500 }
00501 }