1212#include < QtWidgets/QLineEdit>
1313#include < QtWidgets/QTreeWidget>
1414#include < QtWidgets/QWidgetAction>
15+ #include < QtWidgets/QTreeView>
16+ #include < QStandardItem>
17+ #include < QPushButton>
1518
1619#include < QtCore/QBuffer>
1720#include < QtCore/QByteArray>
@@ -36,7 +39,7 @@ DataFlowGraphicsScene(DataFlowGraphModel& graphModel,
3639 QObject* parent)
3740 : BasicGraphicsScene(graphModel, parent)
3841 , _graphModel(graphModel)
39- , _sortFlag (true )
42+ , _sortMenu (true )
4043{
4144 connect (&_graphModel, &DataFlowGraphModel::inPortDataWasSet,
4245 [this ](NodeId const nodeId, PortType const , PortIndex const )
@@ -90,51 +93,83 @@ createSceneMenu(QPointF const scenePos)
9093 modelMenu->addAction (txtBoxAction);
9194
9295 // Add result treeview to the context menu
93- QTreeWidget * treeView = new QTreeWidget (modelMenu);
96+ QTreeView * treeView = new QTreeView (modelMenu);
9497 treeView->header ()->close ();
9598
99+ QStandardItemModel* treeModel = new QStandardItemModel (treeView);
100+
96101 auto * treeViewAction = new QWidgetAction (modelMenu);
97102 treeViewAction->setDefaultWidget (treeView);
98103
99104 // 2.
100105 modelMenu->addAction (treeViewAction);
101106
107+ // Add sort Button
108+ auto * sortButton = new QPushButton (" Sort" );
109+ sortButton->setCheckable (true );
110+
111+ auto * sortButtonAction = new QWidgetAction (modelMenu);
112+ sortButtonAction->setDefaultWidget (sortButton);
113+
114+ // 3.
115+ modelMenu->addAction (sortButtonAction);
116+
102117 auto registry = _graphModel.dataModelRegistry ();
103118
119+ int sortCount = 0 ;
104120 for (auto const & assoc : registry->registeredModelsCategoryAssociation ())
105121 {
106122 // A node must have a parent
107- QList<QTreeWidgetItem *> parentList;
123+ QList<QStandardItem *> parentList;
108124 parentList.clear ();
109- parentList = treeView ->findItems (assoc.second , Qt::MatchExactly);
125+ parentList = treeModel ->findItems (assoc.second , Qt::MatchExactly);
110126
111127 if (parentList.count () <= 0 )
112128 {
113129 // Create a parent if it does not exist
114- auto parentItem = new QTreeWidgetItem (treeView );
115- parentItem->setText ( 0 , assoc. second );
130+ auto parentItem = new QStandardItem (assoc. second );
131+ parentItem->setData (sortCount, Qt::UserRole );
116132 parentItem->setFlags (parentItem->flags () & ~Qt::ItemIsSelectable);
117133 parentList.push_back (parentItem);
134+ treeModel->appendRow (parentItem);
118135 }
119136
120- auto childItem = new QTreeWidgetItem (parentList.first ());
121- childItem->setText (0 , assoc.first );
137+ auto childItem = new QStandardItem (assoc.first );
138+ childItem->setData (sortCount, Qt::UserRole);
139+ parentList.first ()->appendRow (childItem);
140+
141+ sortCount++;
122142 }
123-
143+
144+ treeView->setModel (treeModel);
124145 treeView->expandAll ();
125146
126- if (_sortFlag)
147+ connect (sortButton, &QPushButton::clicked, this ,
148+ [treeModel, treeView](bool checked)
149+ {
150+ if (checked)
151+ treeModel->setSortRole (Qt::DisplayRole);
152+ else
153+ treeModel->setSortRole (Qt::UserRole);
154+ treeView->sortByColumn (0 , Qt::AscendingOrder);
155+ });
156+
157+ if (_sortMenu)
158+ {
159+ sortButton->setChecked (_sortMenu);
127160 treeView->sortByColumn (0 , Qt::AscendingOrder);
161+ }
128162
129- connect (treeView, &QTreeWidget::itemClicked ,
163+ connect (treeView, &QTreeView::clicked ,
130164 [this ,
131165 modelMenu,
132- scenePos](QTreeWidgetItem* item, int )
166+ treeModel,
167+ scenePos](const QModelIndex &index)
133168 {
134- if (!(item->flags () & (Qt::ItemIsSelectable)))
135- {
169+ auto item = treeModel->itemFromIndex (index);
170+
171+ if (item->hasChildren ())
136172 return ;
137- }
138173
139174 this ->undoStack ().push (new CreateCommand (this , item->text (0 ), scenePos));
140175
@@ -143,20 +178,21 @@ createSceneMenu(QPointF const scenePos)
143178
144179 // Setup filtering
145180 connect (txtBox, &QLineEdit::textChanged,
146- [treeView](const QString& text)
181+ [treeView, treeModel ](const QString & text)
147182 {
148- QTreeWidgetItemIterator it (treeView, QTreeWidgetItemIterator::NoChildren);
149- while (*it )
183+ // Is there a better way?
184+ for ( int i = 0 ; i < treeModel-> rowCount (); ++i )
150185 {
151- auto modelName = (*it)->text (0 );
152- const bool match = (modelName.contains (text, Qt::CaseInsensitive));
153- (*it)->setHidden (!match);
154- // if (match)
155- // {
156- // treeView->scrollToItem(*it);
157- // }
158-
159- ++it;
186+ QStandardItem *parent = treeModel->item (i);
187+ for (int j = 0 ; j < parent->rowCount (); ++j)
188+ {
189+ QStandardItem *child = parent->child (j);
190+
191+ const bool match = child->text ().contains (text, Qt::CaseInsensitive);
192+
193+ auto parentIndex = parent->index ();
194+ treeView->setRowHidden (j, parentIndex, !match);
195+ }
160196 }
161197 });
162198
@@ -171,9 +207,9 @@ createSceneMenu(QPointF const scenePos)
171207
172208void
173209DataFlowGraphicsScene::
174- sortSceneMenu (bool sort )
210+ sortSceneMenu (bool sortMenu )
175211{
176- _sortFlag = sort ;
212+ _sortMenu = sortMenu ;
177213}
178214
179215
0 commit comments