//Copyright (C) 2006 Dominic Letourneau (Dominic.Letourneau@USherbrooke.ca) #include "QtNodeTreeView.h" #include #include #include #include #include #include #include "Node.h" using namespace std; namespace FD { QtNodeTreeView::QtNodeTreeView(QWidget *parent) : QTreeWidget(parent) { m_root = new QTreeWidgetItem(this); m_root->setText(0,"Nodes"); scanNodeRepository(); setDragEnabled(true); } void QtNodeTreeView::insert(const QTreeWidgetItem* root, const std::vector &path, int level) { if (root) { bool found = false; int childCount = root->childCount(); for (int i =0; i < childCount; i++) { QTreeWidgetItem *child = root->child(i); if (child->text(0).toStdString() == path[level]) { found = true; if (level + 1 < path.size()) { insert(child,path,level + 1); } } } //if not found, insert all nodes if (!found) { QTreeWidgetItem *newroot = const_cast(root); for (int i = level; i < path.size(); i++) { QTreeWidgetItem *item = new QTreeWidgetItem(newroot); item->setText(0,path[i].c_str()); newroot = item; } //Create tooltip NodeInfo* info = UINodeRepository::Find(path.back()); if (info) { newroot->setToolTip(0,info->description.c_str()); } } } } void QtNodeTreeView::scanNodeRepository() { cerr<<"QtNodeTreeView::scanNodeRepository()"< strCategories; while (info != UINodeRepository::End()) { //strCategories.insert(info->second->category); //addType(info->second->category,info->first); vector categories = extractCategory(info->second->category); switch(info->second->kind) { case NodeInfo::builtin: if (Node::getFactoryNamed(info->first)) { //add node name at the end categories.push_back(info->first); insert(m_root,categories,0); } break; case NodeInfo::subnet: break; case NodeInfo::external: //add node name at the end categories.push_back(info->first); insert(m_root,categories,0); break; default: cerr<<"QtNodeTreeView::scanNodeRepository() - Unknown kind : "<second->kind< QtNodeTreeView::extractCategory(const std::string &category) { vector catLevels; string my_string(category); while (!my_string.empty()) { int colonPos = my_string.find(":"); if (colonPos == string::npos) { catLevels.push_back(my_string); my_string.resize(0); } else { catLevels.push_back(my_string.substr(0,colonPos)); my_string.erase(0,colonPos + 1); } } return catLevels; } void QtNodeTreeView::dragEnterEvent(QDragEnterEvent *event) { cerr<<"QtNodeTreeView::dragEnterEvent(QDragEnterEvent *event)"<accept(); } void QtNodeTreeView::dragMoveEvent(QDragMoveEvent *event) { cerr<<"QtNodeTreeView::dragMoveEvent(QDragMoveEvent *event)"<accept(); } void QtNodeTreeView::dropEvent(QDropEvent *event) { cerr<<"tNodeTreeView::dropEvent(QDropEvent *event)"<accept(); } bool QtNodeTreeView::dropMimeData(QTreeWidgetItem *parent, int index, const QMimeData *data, Qt::DropAction action) { cerr<<"QtNodeTreeView::dropMimeData"<buttons() & Qt::LeftButton)) return; // if no item selected, return (else it would crash) if (currentItem() == NULL) return; QDrag *drag = new QDrag(this); QMimeData *mimeData = new QMimeData; // mime stuff mimeData->setText(currentItem()->text(0)); drag->setMimeData(mimeData); // start drag drag->start(Qt::CopyAction | Qt::MoveAction); } }//namespace FD