6
6
#include " NodeGraphicsObject.hpp"
7
7
#include " UndoCommands.hpp"
8
8
9
+ #include < QGridLayout>
10
+ #include < QPushButton>
11
+ #include < QStandardItem>
9
12
#include < QtWidgets/QFileDialog>
10
13
#include < QtWidgets/QGraphicsSceneMoveEvent>
11
14
#include < QtWidgets/QHeaderView>
12
15
#include < QtWidgets/QLineEdit>
16
+ #include < QtWidgets/QTreeView>
13
17
#include < QtWidgets/QTreeWidget>
14
18
#include < QtWidgets/QWidgetAction>
15
19
@@ -31,6 +35,7 @@ namespace QtNodes {
31
35
DataFlowGraphicsScene::DataFlowGraphicsScene (DataFlowGraphModel &graphModel, QObject *parent)
32
36
: BasicGraphicsScene(graphModel, parent)
33
37
, _graphModel(graphModel)
38
+ , _sortMenu(true )
34
39
{
35
40
connect (&_graphModel,
36
41
&DataFlowGraphModel::inPortDataWasSet,
@@ -61,77 +66,104 @@ QMenu *DataFlowGraphicsScene::createSceneMenu(QPointF const scenePos)
61
66
{
62
67
QMenu *modelMenu = new QMenu ();
63
68
69
+ QWidget *menuWidget = new QWidget ();
70
+ QGridLayout *layout = new QGridLayout (menuWidget);
71
+ layout->setContentsMargins (0 , 0 , 0 , 0 );
72
+ layout->setSpacing (3 );
73
+
64
74
// Add filterbox to the context menu
65
- auto *txtBox = new QLineEdit (modelMenu );
75
+ QLineEdit *txtBox = new QLineEdit ();
66
76
txtBox->setPlaceholderText (QStringLiteral (" Filter" ));
67
77
txtBox->setClearButtonEnabled (true );
78
+ txtBox->setSizePolicy (QSizePolicy::Expanding, QSizePolicy::Expanding);
79
+ layout->addWidget (txtBox, 0 , 0 );
68
80
69
- auto *txtBoxAction = new QWidgetAction (modelMenu);
70
- txtBoxAction->setDefaultWidget (txtBox);
71
-
72
- // 1.
73
- modelMenu->addAction (txtBoxAction);
81
+ // Add sort button
82
+ QPushButton *sortButton = new QPushButton (" Sort" );
83
+ sortButton->setCheckable (true );
84
+ layout->addWidget (sortButton, 0 , 1 );
74
85
75
86
// Add result treeview to the context menu
76
- QTreeWidget *treeView = new QTreeWidget (modelMenu );
87
+ QTreeView *treeView = new QTreeView ( );
77
88
treeView->header ()->close ();
89
+ layout->addWidget (treeView, 1 , 0 , 1 , 2 );
90
+ QStandardItemModel *treeModel = new QStandardItemModel (treeView);
78
91
79
- auto *treeViewAction = new QWidgetAction (modelMenu );
80
- treeViewAction ->setDefaultWidget (treeView );
92
+ auto *menuWidgetAction = new QWidgetAction (menuWidget );
93
+ menuWidgetAction ->setDefaultWidget (menuWidget );
81
94
82
- // 2.
83
- modelMenu->addAction (treeViewAction);
95
+ modelMenu->addAction (menuWidgetAction);
84
96
85
97
auto registry = _graphModel.dataModelRegistry ();
86
98
87
- for (auto const &cat : registry->categories ()) {
88
- auto item = new QTreeWidgetItem (treeView);
89
- item->setText (0 , cat);
90
- item->setFlags (item->flags () & ~Qt::ItemIsSelectable);
91
- }
92
-
99
+ int sortCount = 0 ;
93
100
for (auto const &assoc : registry->registeredModelsCategoryAssociation ()) {
94
- QList<QTreeWidgetItem *> parent = treeView->findItems (assoc.second , Qt::MatchExactly);
101
+ QList<QStandardItem *> parentList;
102
+ parentList.clear ();
103
+ parentList = treeModel->findItems (assoc.second , Qt::MatchExactly);
104
+
105
+ if (parentList.count () <= 0 ) {
106
+ // Create a parent if it does not exist
107
+ auto parentItem = new QStandardItem (assoc.second );
108
+ parentItem->setData (sortCount, Qt::UserRole);
109
+ parentItem->setFlags (parentItem->flags () & ~Qt::ItemIsSelectable);
110
+ parentList.push_back (parentItem);
111
+ treeModel->appendRow (parentItem);
112
+ }
95
113
96
- if (parent.count () <= 0 )
97
- continue ;
114
+ auto childItem = new QStandardItem (assoc.first );
115
+ childItem->setData (sortCount, Qt::UserRole);
116
+ parentList.first ()->appendRow (childItem);
98
117
99
- auto item = new QTreeWidgetItem (parent.first ());
100
- item->setText (0 , assoc.first );
118
+ sortCount++;
101
119
}
102
120
121
+ treeView->setModel (treeModel);
103
122
treeView->expandAll ();
104
123
124
+ if (_sortMenu) {
125
+ sortButton->setChecked (_sortMenu);
126
+ treeView->sortByColumn (0 , Qt::AscendingOrder);
127
+ }
128
+
129
+ connect (sortButton, &QPushButton::clicked, this , [this , treeModel, treeView](bool checked) {
130
+ if (checked)
131
+ treeModel->setSortRole (Qt::DisplayRole);
132
+ else
133
+ treeModel->setSortRole (Qt::UserRole);
134
+
135
+ _sortMenu = checked;
136
+ treeView->sortByColumn (0 , Qt::AscendingOrder);
137
+ });
138
+
105
139
connect (treeView,
106
- &QTreeWidget::itemClicked,
107
- [this , modelMenu, scenePos](QTreeWidgetItem *item, int ) {
108
- if (!(item->flags () & (Qt::ItemIsSelectable))) {
140
+ &QTreeView::clicked,
141
+ [this , modelMenu, treeModel, scenePos](const QModelIndex &index) {
142
+ auto item = treeModel->itemFromIndex (index);
143
+
144
+ if (item->hasChildren ())
109
145
return ;
110
- }
111
146
112
- this ->undoStack ().push (new CreateCommand (this , item->text (0 ), scenePos));
147
+ this ->undoStack ().push (new CreateCommand (this , item->text (), scenePos));
113
148
114
149
modelMenu->close ();
115
150
});
116
151
117
152
// Setup filtering
118
- connect (txtBox, &QLineEdit::textChanged, [treeView](const QString &text) {
119
- QTreeWidgetItemIterator categoryIt (treeView, QTreeWidgetItemIterator::HasChildren);
120
- while (*categoryIt)
121
- (*categoryIt++)->setHidden (true );
122
- QTreeWidgetItemIterator it (treeView, QTreeWidgetItemIterator::NoChildren);
123
- while (*it) {
124
- auto modelName = (*it)->text (0 );
125
- const bool match = (modelName.contains (text, Qt::CaseInsensitive));
126
- (*it)->setHidden (!match);
127
- if (match) {
128
- QTreeWidgetItem *parent = (*it)->parent ();
129
- while (parent) {
130
- parent->setHidden (false );
131
- parent = parent->parent ();
153
+ connect (txtBox, &QLineEdit::textChanged, [treeView, treeModel](const QString &text) {
154
+ QModelIndex treeViewIndex = treeView->rootIndex ();
155
+
156
+ for (int i = 0 ; i < treeModel->rowCount (); ++i) {
157
+ QStandardItem *parent = treeModel->item (i);
158
+ treeView->setRowHidden (i, treeViewIndex, true );
159
+
160
+ for (int j = 0 ; j < parent->rowCount (); ++j) {
161
+ const bool match = parent->child (j)->text ().contains (text, Qt::CaseInsensitive);
162
+ treeView->setRowHidden (j, parent->index (), !match);
163
+ if (match) {
164
+ treeView->setRowHidden (i, treeViewIndex, false );
132
165
}
133
166
}
134
- ++it;
135
167
}
136
168
});
137
169
@@ -144,6 +176,11 @@ QMenu *DataFlowGraphicsScene::createSceneMenu(QPointF const scenePos)
144
176
return modelMenu;
145
177
}
146
178
179
+ void DataFlowGraphicsScene::sortSceneMenu (bool sortMenu)
180
+ {
181
+ _sortMenu = sortMenu;
182
+ }
183
+
147
184
void DataFlowGraphicsScene::save () const
148
185
{
149
186
QString fileName = QFileDialog::getSaveFileName (nullptr ,
0 commit comments