Skip to content

Commit 2ec1301

Browse files
committed
Modified to QTreeView, Add sort button to change sorting strategy
1 parent afc51fe commit 2ec1301

2 files changed

Lines changed: 68 additions & 32 deletions

File tree

include/QtNodes/internal/DataFlowGraphicsScene.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class NODE_EDITOR_PUBLIC DataFlowGraphicsScene
3434
createSceneMenu(QPointF const scenePos) override;
3535

3636
void
37-
sortSceneMenu(bool sort);
37+
sortSceneMenu(bool sortMenu = true);
3838

3939
public Q_SLOTS:
4040
void
@@ -50,7 +50,7 @@ public Q_SLOTS:
5050
private:
5151
DataFlowGraphModel &_graphModel;
5252

53-
bool _sortFlag;
53+
bool _sortMenu;
5454
};
5555

5656
}

src/DataFlowGraphicsScene.cpp

Lines changed: 66 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
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

178214
void
179215
DataFlowGraphicsScene::
180-
sortSceneMenu(bool sort)
216+
sortSceneMenu(bool sortMenu)
181217
{
182-
_sortFlag = sort;
218+
_sortMenu = sortMenu;
183219
}
184220

185221

0 commit comments

Comments
 (0)