From d35b638039a96142d74ad3632fe774c0c7c172b6 Mon Sep 17 00:00:00 2001 From: Kacper Donat Date: Sun, 22 Jun 2025 13:12:00 +0200 Subject: [PATCH] Gui: Use proper placement property for Link Links require different placement property (LinkPlacement) to be used, otherwise it breaks the transform. Fixes: #20776 --- src/Gui/ViewProviderDragger.cpp | 18 ++++++++++++++++-- src/Gui/ViewProviderDragger.h | 3 +++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Gui/ViewProviderDragger.cpp b/src/Gui/ViewProviderDragger.cpp index ad7ed97490..a78e890598 100644 --- a/src/Gui/ViewProviderDragger.cpp +++ b/src/Gui/ViewProviderDragger.cpp @@ -170,6 +170,20 @@ bool ViewProviderDragger::forwardToLink() return forwardedViewProvider != nullptr; } +App::PropertyPlacement* ViewProviderDragger::getPlacementProperty() const +{ + auto object = getObject(); + + if (auto linkExtension = object->getExtensionByType()) { + if (auto linkPlacementProp = linkExtension->getLinkPlacementProperty()) { + return linkPlacementProp; + } + + return linkExtension->getPlacementProperty(); + } + + return getObject()->getPropertyByName("Placement"); +} bool ViewProviderDragger::setEdit(int ModNum) { @@ -254,7 +268,7 @@ void ViewProviderDragger::dragMotionCallback(void* data, [[maybe_unused]] SoDrag void ViewProviderDragger::updatePlacementFromDragger(DraggerComponents components) { - const auto placement = getObject()->getPropertyByName("Placement"); + const auto placement = getPlacementProperty(); if (!placement) { return; @@ -379,7 +393,7 @@ void ViewProviderDragger::updateTransformFromDragger() Base::Placement ViewProviderDragger::getObjectPlacement() const { - if (auto placement = getObject()->getPropertyByName("Placement")) { + if (auto placement = getPlacementProperty()) { return placement->getValue(); } diff --git a/src/Gui/ViewProviderDragger.h b/src/Gui/ViewProviderDragger.h index ef1d89654c..6937dec79f 100644 --- a/src/Gui/ViewProviderDragger.h +++ b/src/Gui/ViewProviderDragger.h @@ -120,6 +120,9 @@ protected: bool forwardToLink(); + /// Gets placement property of the object + App::PropertyPlacement* getPlacementProperty() const; + /** * Returns a newly create dialog for the part to be placed in the task view * Must be reimplemented in subclasses.