nodeview: optimized selecting

Rather than responding to every single selection change, the selection operation
can function as-is and then respond to all of them at the end.
This commit is contained in:
itsmattkc
2020-05-09 03:33:36 +10:00
parent 218c63f933
commit 16d4cccdb5
2 changed files with 45 additions and 4 deletions
+41 -4
View File
@@ -45,9 +45,10 @@ NodeView::NodeView(QWidget *parent) :
setRenderHint(QPainter::Antialiasing);
connect(&scene_, &QGraphicsScene::changed, this, &NodeView::ItemsChanged);
connect(&scene_, &QGraphicsScene::selectionChanged, this, &NodeView::SceneSelectionChangedSlot);
connect(this, &NodeView::customContextMenuRequested, this, &NodeView::ShowContextMenu);
ConnectSelectionChangedSignal();
SetFlowDirection(NodeViewCommon::kTopToBottom);
}
@@ -129,12 +130,24 @@ void NodeView::DeleteSelected()
void NodeView::SelectAll()
{
// Optimization: rather than respond to every single item being selected, ignore the signal and
// then handle them all at the end.
DisconnectSelectionChangedSignal();
scene_.SelectAll();
ReconnectSelectionChangedSignal();
}
void NodeView::DeselectAll()
{
// Optimization: rather than respond to every single item being selected, ignore the signal and
// then handle them all at the end.
DisconnectSelectionChangedSignal();
scene_.DeselectAll();
ReconnectSelectionChangedSignal();
}
void NodeView::Select(const QList<Node *> &nodes)
@@ -143,13 +156,19 @@ void NodeView::Select(const QList<Node *> &nodes)
return;
}
DeselectAll();
// Optimization: rather than respond to every single item being selected, ignore the signal and
// then handle them all at the end.
DisconnectSelectionChangedSignal();
scene_.DeselectAll();
foreach (Node* n, nodes) {
NodeViewItem* item = scene_.NodeToUIObject(n);
item->setSelected(true);
}
ReconnectSelectionChangedSignal();
}
void NodeView::SelectWithDependencies(QList<Node *> nodes)
@@ -433,8 +452,10 @@ void NodeView::ShowContextMenu(const QPoint &pos)
} else {
QAction* filters_action = m.addAction(tr("Filters..."));
connect(filters_action, &QAction::triggered, this, &NodeView::ContextMenuShowFiltersDialog);
Menu* filter_menu = new Menu(tr("Filter"), &m);
filter_menu->addAction(tr("Show All"))->setData(NodeViewScene::kFilterShowAll);
filter_menu->addAction(tr("Show Selected Blocks Only"))->setData(NodeViewScene::kFilterShowSelectedBlocks);
m.addSeparator();
@@ -707,4 +728,20 @@ void NodeView::MoveAttachedNodesToCursor(const QPoint& p)
}
}
void NodeView::ConnectSelectionChangedSignal()
{
connect(&scene_, &QGraphicsScene::selectionChanged, this, &NodeView::SceneSelectionChangedSlot);
}
void NodeView::ReconnectSelectionChangedSignal()
{
ConnectSelectionChangedSignal();
SceneSelectionChangedSlot();
}
void NodeView::DisconnectSelectionChangedSignal()
{
disconnect(&scene_, &QGraphicsScene::selectionChanged, this, &NodeView::SceneSelectionChangedSlot);
}
OLIVE_NAMESPACE_EXIT
+4
View File
@@ -94,6 +94,10 @@ private:
void MoveAttachedNodesToCursor(const QPoint &p);
void ConnectSelectionChangedSignal();
void ReconnectSelectionChangedSignal();
void DisconnectSelectionChangedSignal();
NodeGraph* graph_;
struct AttachedItem {