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()));