From 378e95327fe14410e11c8e3f6abadeef58f16ec9 Mon Sep 17 00:00:00 2001 From: pjcreath Date: Mon, 10 Nov 2025 12:03:05 -0500 Subject: [PATCH] Gui: Fix crash in placement window after closing a document. (#25110) Fixes #18156 --- src/Gui/ExpressionBinding.cpp | 10 ++++++++++ src/Gui/ExpressionBinding.h | 2 ++ 2 files changed, 12 insertions(+) diff --git a/src/Gui/ExpressionBinding.cpp b/src/Gui/ExpressionBinding.cpp index 4e9c9785c8..b5f8912b46 100644 --- a/src/Gui/ExpressionBinding.cpp +++ b/src/Gui/ExpressionBinding.cpp @@ -57,6 +57,7 @@ void ExpressionBinding::unbind() { expressionchanged.disconnect(); objectdeleted.disconnect(); + documentdeleted.disconnect(); path = App::ObjectIdentifier(); } @@ -106,6 +107,8 @@ void ExpressionBinding::bind(const App::ObjectIdentifier &_path) expressionchanged = docObj->ExpressionEngine.expressionChanged.connect(std::bind(&ExpressionBinding::expressionChange, this, sp::_1)); App::Document* doc = docObj->getDocument(); objectdeleted = doc->signalDeletedObject.connect(std::bind(&ExpressionBinding::objectDeleted, this, sp::_1)); + documentdeleted = App::GetApplication().signalDeleteDocument.connect( + std::bind(&ExpressionBinding::onDocumentDeleted, this, sp::_1)); //NOLINTEND } } @@ -272,6 +275,13 @@ void ExpressionBinding::objectDeleted(const App::DocumentObject& obj) } } +void ExpressionBinding::onDocumentDeleted(const App::Document& doc) +{ + if (path.getOwner() && path.getOwner()->getDocument() == &doc) { + unbind(); + } +} + // ---------------------------------------------------------------------------- ExpressionWidget::ExpressionWidget() = default; diff --git a/src/Gui/ExpressionBinding.h b/src/Gui/ExpressionBinding.h index 7e99888298..1301102981 100644 --- a/src/Gui/ExpressionBinding.h +++ b/src/Gui/ExpressionBinding.h @@ -76,8 +76,10 @@ private: protected: void expressionChange(const App::ObjectIdentifier& id); void objectDeleted(const App::DocumentObject&); + void onDocumentDeleted(const App::Document&); boost::signals2::scoped_connection expressionchanged; boost::signals2::scoped_connection objectdeleted; + boost::signals2::scoped_connection documentdeleted; bool m_autoApply{false}; };