24        auto scenePos = this->mapToScene(this->mapFromGlobal(QPoint(pos.x(), pos.y())));
 
   27        std::set<QString> categoryFiltered;
 
   28        std::unordered_map<QString, QString> registeredModelsCategoryFiltered;
 
   30        auto outData = n.nodeDataModel()->outData(index);
 
   31        for (
auto const& assoc : scene()->registry().registeredModelsCategoryAssociation())
 
   33            auto modelName = QString(assoc.first);
 
   35            auto type = scene()->registry().create(modelName);
 
   41                for (
uint i = 0; i < num; i++)
 
   43                    if (type->tryInData(i, outData))
 
   45                        categoryFiltered.insert(assoc.second);
 
   46                        registeredModelsCategoryFiltered[modelName] = assoc.second;
 
   55        auto* txtBox = 
new QLineEdit(&modelMenu);
 
   56        txtBox->grabKeyboard();
 
   58        txtBox->setPlaceholderText(QStringLiteral(
"Filter"));
 
   59        txtBox->setClearButtonEnabled(
true);
 
   61        auto* txtBoxAction = 
new QWidgetAction(&modelMenu);
 
   62        txtBoxAction->setDefaultWidget(txtBox);
 
   64        modelMenu.addAction(txtBoxAction);
 
   65        modelMenu.addSeparator();
 
   67        auto skipText = QStringLiteral(
"skip me");
 
   72            auto* treeView = 
new QTreeWidget(&modelMenu);
 
   73            treeView->header()->close();
 
   75            auto* treeViewAction = 
new QWidgetAction(&modelMenu);
 
   76            treeViewAction->setDefaultWidget(treeView);
 
   78            modelMenu.addAction(treeViewAction);
 
   80            QMap<QString, QTreeWidgetItem*> topLevelItems;
 
   81            for (
auto const& cat : categoryFiltered)
 
   83                auto item = 
new QTreeWidgetItem(treeView);
 
   84                item->setText(0, cat);
 
   85                item->setData(0, Qt::UserRole, skipText);
 
   86                topLevelItems[cat] = item;
 
   89            for (
auto const& assoc : registeredModelsCategoryFiltered)
 
   91                auto parent = topLevelItems[assoc.second];
 
   92                auto item = 
new QTreeWidgetItem(parent);
 
   93                item->setText(0, assoc.first);
 
   94                item->setData(0, Qt::UserRole, assoc.first);
 
   97            treeView->expandAll();
 
   99            connect(treeView, &QTreeWidget::itemClicked, [&](QTreeWidgetItem* item, 
int)
 
  101                    QString modelName = item->data(0, Qt::UserRole).toString();
 
  103                    if (modelName == skipText)
 
  108                    auto type = scene()->registry().create(modelName);
 
  112                        auto& node = scene()->createNode(std::move(type));
 
  114                        node.nodeGraphicsObject().setPos(scenePos);
 
  116                        scene()->nodePlaced(node);
 
  122                            for (
uint i = 0; i < num; i++)
 
  125                                if (node.nodeDataModel()->tryInData(i, outData))
 
  127                                    scene()->createConnection(node, i, n, index);
 
  135                        qDebug() << 
"Model not found";
 
  142            connect(txtBox, &QLineEdit::textChanged, [&](
const QString& text)
 
  144                    for (
auto& topLvlItem : topLevelItems)
 
  146                        bool topItemMatch = 
false;
 
  147                        for (
int i = 0; i < topLvlItem->childCount(); ++i)
 
  149                            auto child = topLvlItem->child(i);
 
  150                            auto modelName = child->data(0, Qt::UserRole).toString();
 
  151                            const bool match = (modelName.contains(text, Qt::CaseInsensitive));
 
  152                            child->setHidden(!match);
 
  154                            topItemMatch |= match;
 
  157                        topLvlItem->setHidden(!topItemMatch);
 
  164            categoryFiltered.clear();
 
  165            registeredModelsCategoryFiltered.clear();
 
  167            modelMenu.exec(QPoint(pos.x(), pos.y()));