From 72eb3a5d829cd6354215257b298172a1c039e031 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Tue, 17 Mar 2020 00:34:32 +1100 Subject: [PATCH] nodeview: worked around qt issue where the selection signal would still be sent after an item was deleted --- app/widget/nodeview/nodeview.cpp | 12 ++---------- app/widget/nodeview/nodeviewscene.cpp | 27 +++++++++++++++++++++++++++ app/widget/nodeview/nodeviewscene.h | 3 +++ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/app/widget/nodeview/nodeview.cpp b/app/widget/nodeview/nodeview.cpp index 2c728acf3..571559926 100644 --- a/app/widget/nodeview/nodeview.cpp +++ b/app/widget/nodeview/nodeview.cpp @@ -104,20 +104,12 @@ void NodeView::DeleteSelected() void NodeView::SelectAll() { - QList all_items = this->items(); - - foreach (QGraphicsItem* i, all_items) { - i->setSelected(true); - } + scene_.SelectAll(); } void NodeView::DeselectAll() { - QList selected_items = scene_.selectedItems(); - - foreach (QGraphicsItem* i, selected_items) { - i->setSelected(false); - } + scene_.DeselectAll(); } void NodeView::Select(const QList &nodes) diff --git a/app/widget/nodeview/nodeviewscene.cpp b/app/widget/nodeview/nodeviewscene.cpp index a514eb898..dffd8702f 100644 --- a/app/widget/nodeview/nodeviewscene.cpp +++ b/app/widget/nodeview/nodeviewscene.cpp @@ -10,6 +10,15 @@ NodeViewScene::NodeViewScene(QObject *parent) : void NodeViewScene::clear() { + // Deselect everything (prevents signals that a selection has changed after deleting an object) + DeselectAll(); + + // HACK: QGraphicsScene contains some sort of internal hashing of the selected items which doesn't update unless + // we call a function like this. That means even though we deselect all items above, QGraphicsScene will + // continue to incorrectly signal selectionChanged() when items that were selected (but are now not) get + // deleted. Calling this function appears to update the internal cache and prevent this. + selectedItems(); + { QHash::const_iterator i; for (i=item_map_.begin();i!=item_map_.end();i++) { @@ -27,6 +36,24 @@ void NodeViewScene::clear() } } +void NodeViewScene::SelectAll() +{ + QList all_items = this->items(); + + foreach (QGraphicsItem* i, all_items) { + i->setSelected(true); + } +} + +void NodeViewScene::DeselectAll() +{ + QList selected_items = this->selectedItems(); + + foreach (QGraphicsItem* i, selected_items) { + i->setSelected(false); + } +} + NodeViewItem *NodeViewScene::NodeToUIObject(Node *n) { return item_map_.value(n); diff --git a/app/widget/nodeview/nodeviewscene.h b/app/widget/nodeview/nodeviewscene.h index 014791759..8a2c22933 100644 --- a/app/widget/nodeview/nodeviewscene.h +++ b/app/widget/nodeview/nodeviewscene.h @@ -16,6 +16,9 @@ public: void clear(); + void SelectAll(); + void DeselectAll(); + /** * @brief Retrieve the graphical widget corresponding to a specific Node *