Skip to content

Commit 4e587aa

Browse files
committed
Modified to QTreeView, Add sort button to change sorting strategy
1 parent 4791f54 commit 4e587aa

File tree

2 files changed

+67
-31
lines changed

2 files changed

+67
-31
lines changed

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: 65 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
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

172208
void
173209
DataFlowGraphicsScene::
174-
sortSceneMenu(bool sort)
210+
sortSceneMenu(bool sortMenu)
175211
{
176-
_sortFlag = sort;
212+
_sortMenu = sortMenu;
177213
}
178214

179215

0 commit comments

Comments
 (0)