PD: Forward transform requests to Body

This commit is contained in:
Kacper Donat
2024-12-11 23:39:04 +01:00
parent 46372a54d3
commit d7aa1bb2ef
5 changed files with 52 additions and 16 deletions

View File

@@ -49,6 +49,7 @@
#include "ViewProviderDragger.h"
#include "Utilities.h"
#include <ViewProviderLink.h>
#include <App/DocumentObjectGroup.h>
#include <Base/Tools.h>
@@ -123,15 +124,17 @@ void ViewProviderDragger::setupContextMenu(QMenu* menu, QObject* receiver, const
ViewProvider* ViewProviderDragger::startEditing(int mode)
{
_linkDragger = nullptr;
forwardedViewProvider = nullptr;
auto ret = ViewProviderDocumentObject::startEditing(mode);
if (!ret) {
return ret;
}
return _linkDragger ? _linkDragger : ret;
return forwardedViewProvider ? forwardedViewProvider : ret;
}
bool ViewProviderDragger::checkLink()
bool ViewProviderDragger::forwardToLink()
{
// Trying to detect if the editing request is forwarded by a link object,
// usually by doubleClicked(). If so, we route the request back. There shall
@@ -150,26 +153,24 @@ bool ViewProviderDragger::checkLink()
return false;
}
auto sobj = vpParent->getObject()->getSubObject(subname.c_str());
if (!sobj || sobj == getObject() || sobj->getLinkedObject(true) != getObject()) {
if (vpParent == this) {
return false;
}
auto vp = Application::Instance->getViewProvider(sobj);
if (!vp) {
if (!vpParent->isDerivedFrom<ViewProviderLink>()) {
return false;
}
_linkDragger = vp->startEditing(ViewProvider::Transform);
forwardedViewProvider = vpParent->startEditing(ViewProvider::Transform);
return _linkDragger != nullptr;
return forwardedViewProvider != nullptr;
}
bool ViewProviderDragger::setEdit(int ModNum)
{
Q_UNUSED(ModNum);
if (checkLink()) {
if (forwardToLink()) {
return true;
}
@@ -208,8 +209,8 @@ void ViewProviderDragger::setEditViewer(Gui::View3DInventorViewer* viewer, int M
if (csysDragger && viewer) {
csysDragger->setUpAutoScale(viewer->getSoRenderManager()->getCamera());
auto mat = viewer->getDocument()->getEditingTransform();
mat *= getObjectPlacement().inverse().toMatrix();
auto originPlacement = App::GeoFeature::getGlobalPlacement(getObject()) * getObjectPlacement().inverse();
auto mat = originPlacement.toMatrix();
viewer->getDocument()->setEditingTransform(mat);
viewer->setupEditingRoot(csysDragger, &mat);