1111#include < QtWidgets/QLineEdit>
1212#include < QtWidgets/QTreeWidget>
1313#include < QtWidgets/QWidgetAction>
14+ #include < QtWidgets/QTreeView>
15+ #include < QStandardItem>
16+ #include < QPushButton>
1417
1518#include < QtCore/QBuffer>
1619#include < QtCore/QByteArray>
@@ -35,7 +38,7 @@ DataFlowGraphicsScene(DataFlowGraphModel& graphModel,
3538 QObject* parent)
3639 : BasicGraphicsScene(graphModel, parent)
3740 , _graphModel(graphModel)
38- , _sortFlag (true )
41+ , _sortMenu (true )
3942{
4043 connect (&_graphModel, &DataFlowGraphModel::inPortDataWasSet,
4144 [this ](NodeId const nodeId, PortType const , PortIndex const )
@@ -89,53 +92,85 @@ createSceneMenu(QPointF const scenePos)
8992 modelMenu->addAction (txtBoxAction);
9093
9194 // Add result treeview to the context menu
92- QTreeWidget * treeView = new QTreeWidget (modelMenu);
95+ QTreeView * treeView = new QTreeView (modelMenu);
9396 treeView->header ()->close ();
9497
98+ QStandardItemModel* treeModel = new QStandardItemModel (treeView);
99+
95100 auto * treeViewAction = new QWidgetAction (modelMenu);
96101 treeViewAction->setDefaultWidget (treeView);
97102
98103 // 2.
99104 modelMenu->addAction (treeViewAction);
100105
106+ // Add sort Button
107+ auto * sortButton = new QPushButton (" Sort" );
108+ sortButton->setCheckable (true );
109+
110+ auto * sortButtonAction = new QWidgetAction (modelMenu);
111+ sortButtonAction->setDefaultWidget (sortButton);
112+
113+ // 3.
114+ modelMenu->addAction (sortButtonAction);
115+
101116 auto registry = _graphModel.dataModelRegistry ();
102117
118+ int sortCount = 0 ;
103119 for (auto const & assoc : registry->registeredModelsCategoryAssociation ())
104120 {
105121 // A node must have a parent
106- QList<QTreeWidgetItem *> parentList;
122+ QList<QStandardItem *> parentList;
107123 parentList.clear ();
108- parentList = treeView ->findItems (assoc.second , Qt::MatchExactly);
124+ parentList = treeModel ->findItems (assoc.second , Qt::MatchExactly);
109125
110126 if (parentList.count () <= 0 )
111127 {
112128 // Create a parent if it does not exist
113- auto parentItem = new QTreeWidgetItem (treeView );
114- parentItem->setText ( 0 , assoc. second );
129+ auto parentItem = new QStandardItem (assoc. second );
130+ parentItem->setData (sortCount, Qt::UserRole );
115131 parentItem->setFlags (parentItem->flags () & ~Qt::ItemIsSelectable);
116132 parentList.push_back (parentItem);
133+ treeModel->appendRow (parentItem);
117134 }
118135
119- auto childItem = new QTreeWidgetItem (parentList.first ());
120- childItem->setText (0 , assoc.first );
136+ auto childItem = new QStandardItem (assoc.first );
137+ childItem->setData (sortCount, Qt::UserRole);
138+ parentList.first ()->appendRow (childItem);
139+
140+ sortCount++;
121141 }
122-
142+
143+ treeView->setModel (treeModel);
123144 treeView->expandAll ();
124145
125- if (_sortFlag)
146+ connect (sortButton, &QPushButton::clicked, this ,
147+ [treeModel, treeView](bool checked)
148+ {
149+ if (checked)
150+ treeModel->setSortRole (Qt::DisplayRole);
151+ else
152+ treeModel->setSortRole (Qt::UserRole);
153+ treeView->sortByColumn (0 , Qt::AscendingOrder);
154+ });
155+
156+ if (_sortMenu)
157+ {
158+ sortButton->setChecked (_sortMenu);
126159 treeView->sortByColumn (0 , Qt::AscendingOrder);
160+ }
127161
128- connect (treeView, &QTreeWidget::itemClicked ,
162+ connect (treeView, &QTreeView::clicked ,
129163 [this ,
130164 modelMenu,
131- scenePos](QTreeWidgetItem* item, int )
165+ treeModel,
166+ scenePos](const QModelIndex &index)
132167 {
133- if (!(item->flags () & (Qt::ItemIsSelectable)))
134- {
168+ auto item = treeModel->itemFromIndex (index);
169+
170+ if (item->hasChildren ())
135171 return ;
136- }
137172
138- NodeId nodeId = this ->_graphModel .addNode (item->text (0 ));
173+ NodeId nodeId = this ->_graphModel .addNode (item->text ());
139174
140175 if (nodeId != InvalidNodeId)
141176 {
@@ -149,20 +184,21 @@ createSceneMenu(QPointF const scenePos)
149184
150185 // Setup filtering
151186 connect (txtBox, &QLineEdit::textChanged,
152- [treeView](const QString& text)
187+ [treeView, treeModel ](const QString & text)
153188 {
154- QTreeWidgetItemIterator it (treeView, QTreeWidgetItemIterator::NoChildren);
155- while (*it )
189+ // Is there a better way?
190+ for ( int i = 0 ; i < treeModel-> rowCount (); ++i )
156191 {
157- auto modelName = (*it)->text (0 );
158- const bool match = (modelName.contains (text, Qt::CaseInsensitive));
159- (*it)->setHidden (!match);
160- // if (match)
161- // {
162- // treeView->scrollToItem(*it);
163- // }
164-
165- ++it;
192+ QStandardItem *parent = treeModel->item (i);
193+ for (int j = 0 ; j < parent->rowCount (); ++j)
194+ {
195+ QStandardItem *child = parent->child (j);
196+
197+ const bool match = child->text ().contains (text, Qt::CaseInsensitive);
198+
199+ auto parentIndex = parent->index ();
200+ treeView->setRowHidden (j, parentIndex, !match);
201+ }
166202 }
167203 });
168204
@@ -177,9 +213,9 @@ createSceneMenu(QPointF const scenePos)
177213
178214void
179215DataFlowGraphicsScene::
180- sortSceneMenu (bool sort )
216+ sortSceneMenu (bool sortMenu )
181217{
182- _sortFlag = sort ;
218+ _sortMenu = sortMenu ;
183219}
184220
185221
0 commit comments