Documentation


X3DTreeQt.cpp

Go to the documentation of this file.
00001 #include <qlistview.h>
00002 
00003 #include <X3DTK/kernel.h>
00004 
00005 #include <animal/X3DTK/Qt/mainControllerGUI/MainController.h>
00006 //#include <animal/X3DTK/Qt/x3dTransformGUI/x3dTransformQt.h>
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 //, selectedEngineNode(NULL)
00022 , bufferNode(NULL)
00023 {
00024   // The root item
00025   scene_item = new QListViewItem(X3DListView,QString("X3D Scene"));
00026   
00027   // Popup menu to insert or delete an x3d node
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   // Connection
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   // Delete the existed item children
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   // Update the itemX3DMap
00072   itemX3DMap[scene_item] = scene;
00073 
00074   scene_item->setOpen(true);
00075   
00076   // Update the children of the scene_item
00077   ExpandChildItemInSceneView(scene_item);
00078   
00079   // Expand the scene_item
00080   ExpandItemInSceneView(scene_item);
00081 
00082 //  selectedEngineNode = NULL;
00083   bufferNode = NULL;
00084   
00085 }
00086 
00088 void X3DTreeQt::setMainController(::MainController * mainController)
00089 {
00090   this->mainController = mainController;
00091   // The root node
00092   setSceneGraphRoot((mainController->getMainScene())->getX3DScene());
00093 }
00094 
00096 QListViewItem * X3DTreeQt::AddSceneNodeItemInListView(QListViewItem * parent, X3DTK::X3D::X3DNode * node)
00097 {
00098   QString s1, s2;
00099 
00100   // The item name which is displayed
00101   if ( node == NULL )
00102   {
00103     s1 = QString("NULL");
00104     s2 = QString("");
00105   }
00106   else
00107   {
00108     //X3DTK::SFString tmp = node->getName();
00109     s1 = QString(node->getType()->getName());
00110     s2 = QString(node->getName());
00111     //std::cerr<<node->getTypeName()<<" "<<tmp<<std::endl;
00112   }
00113   // The item
00114   QListViewItem * item = new QListViewItem(parent,s1,s2);
00115   
00116   // Update the itemX3DMap
00117   itemX3DMap[item] = node;
00118 
00119   return item;
00120 }
00121 
00123 void X3DTreeQt::CollapseItemInSceneView(QListViewItem *item)
00124 {
00125      // collapse the existed children
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   // Get the x3d node corresponding to the item
00142   X3DTK::X3D::X3DNode * node = itemX3DMap[item];
00143 
00144   if(!node) return;
00145   
00146   // Delete the existed children
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   // Create the item's children
00163   // Get all the children of the node
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   // This happens because the clicked() signal also calls the select callback with
00179   // NULL as a parameter.
00180   if(item == NULL)
00181      return;
00182 
00183   // Get the x3d node corresponding to the item
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   // Get the x3d node corresponding to the item
00212   X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00213 
00214   // Set the current node in order to draw its bounding box
00215   X3DTK::X3D::X3DBoundedObject * X3DBN = dynamic_cast<X3DTK::X3D::X3DBoundedObject *>(node);
00216   //((mainController->getMainScene())->getRenderer())->setBoundedObject(X3DBN);
00217   ( mainController->getMainScene() )->setSelectedNode(X3DBN);
00218   
00219 //  if (selectedEngineNode && selectedEngineNode->getEngine())
00220 //    selectedEngineNode->getEngine()->drawBBox = false;
00221 //  selectedEngineNode = dynamic_cast<X3DTK::X3D::EngineNode *>(node);
00222 //  if (selectedEngineNode && selectedEngineNode->getEngine())
00223 //    selectedEngineNode->getEngine()->drawBBox = true;
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     // Get the x3d node corresponding to the item
00242     X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00243 
00244     // Insert x3d nodes from a file
00245     mainController->fileInsert(node);
00246 
00247     // Update the children of the scene_item
00248     ExpandChildItemInSceneView(scene_item);
00249 
00250     // Expand the scene_item
00251     ExpandItemInSceneView(scene_item);
00252 
00253   }
00254 
00255 }
00256 
00257 void X3DTreeQt::insertTransform()
00258 {
00259   if(selectedItem)
00260   {
00261     // Get the x3d node corresponding to the item
00262     X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00263     if(!dynamic_cast<X3DTK::X3D::FrameNode *>(node))
00264     {
00265       // Get the item's parent and the corresponding x3d node
00266       QListViewItem * parent = selectedItem->parent();
00267       X3DTK::X3D::X3DNode * parentNode = itemX3DMap[parent];
00268 
00269       // Past a new x3d transform
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         //displayWidget(transform);
00276 
00277         // Update the children of the scene_item
00278         ExpandChildItemInSceneView(scene_item);
00279 
00280         // Expand the scene_item
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     // Get the x3d node corresponding to the item
00294     X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00295 
00296     // Past x3d nodes from the node
00297     (mainController->getMainScene())->pastNode(bufferNode, node);
00298 
00299     // Search if bufferNode is linked
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       // Change the name of the bufferItem
00307       //X3DTK::SFString tmp = bufferNode->getName(bufferNode);
00308       QString s = QString(bufferNode->getName());
00309       bufferItem->setText(1, s);
00310     }
00311 
00312     // Update the children of the scene_item
00313     ExpandChildItemInSceneView(scene_item);
00314 
00315     // Expand the scene_item
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     // Get the x3d node corresponding to the item
00328     X3DTK::X3D::X3DNode * parentNode = itemX3DMap[selectedItem];
00329 
00330     // Past x3d nodes from the node
00331     (mainController->getMainScene())->pastNode(node, parentNode);
00332 
00333     // Update the children of the scene_item
00334     ExpandChildItemInSceneView(scene_item);
00335 
00336     // Expand the scene_item
00337     ExpandItemInSceneView(scene_item);
00338     
00339     updateGL();
00340   }
00341 
00342 }
00343 
00344 void X3DTreeQt::cutNode()
00345 {
00346   if(selectedItem)
00347   {
00348     copyNode();
00349     
00350     // Get the item's parent and the corresponding x3d node
00351     QListViewItem * parent = selectedItem->parent();
00352     X3DTK::X3D::X3DNode * parentNode = itemX3DMap[parent];
00353 
00354     // Cut the x3d node,
00355     // i.e break the link between the node and its current parent node
00356     (mainController->getMainScene())->cutNode(bufferNode, parentNode);
00357 
00358 //    if (selectedItem!=scene_item)
00359 //    {
00360 //      // Update the children of the item's parent
00361 //      ExpandChildItemInSceneView(parent);
00362 //
00363 //      // Expand the item's parent
00364 //      ExpandItemInSceneView(parent);
00365 //    }else
00366 //    {
00367       // Update the children of the scene_item
00368       ExpandChildItemInSceneView(scene_item);
00369 
00370       // Expand the scene_item
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       // Get the x3d node corresponding to the item
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     // Get the x3d node corresponding to the item
00397     X3DTK::X3D::X3DNode * node = itemX3DMap[selectedItem];
00398 
00399     // Get the item's parent and the corresponding x3d node
00400     QListViewItem * parent = selectedItem->parent();
00401     X3DTK::X3D::X3DNode * parentNode = itemX3DMap[parent];
00402 
00403     // Delete the x3d node,
00404     // i.e break the link between the node and its current parent node
00405     // and delete it if there is no more link
00406     (mainController->getMainScene())->deleteNode(node, parentNode);
00407 
00408     // Delete the x3d node QWidget
00409 //    if (selectedItem!=scene_item)
00410 //    {
00411 //      // Update the children of the item's parent
00412 //      ExpandChildItemInSceneView(parent);
00413 //
00414 //      // Expand the item's parent
00415 //      ExpandItemInSceneView(parent);
00416 //    }else
00417 //    {
00418       // Update the children of the scene_item
00419       ExpandChildItemInSceneView(scene_item);
00420 
00421       // Expand the scene_item
00422       ExpandItemInSceneView(scene_item);
00423 //    }
00424 
00425     // Search if bufferNode and selectedEngineNode are linked to an item
00426     QListViewItem * bufferItem = NULL;
00427 //    QListViewItem * selectedEngineItem = NULL;
00428      for(ItemX3DMap::iterator it= itemX3DMap.begin() ; it!= itemX3DMap.end() ; ++it)
00429      {
00430       if (bufferNode == (*it).second)
00431          bufferItem = (*it).first;
00432 //      if (selectedEngineNode == (*it).second)
00433 //         selectedEngineItem = (*it).first;
00434     }
00435     if(!bufferItem)
00436       bufferNode = NULL;
00437 //    if(!selectedEngineItem)
00438 //      selectedEngineNode = NULL;
00439    
00440     updateGL();
00441   }
00442 }
00443 
00444 void X3DTreeQt::keyPressEvent( QKeyEvent *k )
00445 {
00446   // cut a node
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   // Update the viewer
00464   mainController->display();
00465 }
00466 
00468 void X3DTreeQt::releaseBufferNode()
00469 {
00470     if (bufferNode)
00471     {
00472       // Search if bufferNode is linked
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         // Delete the x3d node if there is no more link
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 }// Qt
00501 }// X3DTK

Generated on Thu Dec 23 13:52:27 2004 by doxygen 1.3.6