PD: Forward transform requests to Body
This commit is contained in:
@@ -382,6 +382,9 @@ void TaskTransform::setSelectionMode(SelectionMode mode)
|
||||
draggerPickStyle->style = SoPickStyle::SHAPE_ON_TOP;
|
||||
draggerPickStyle->setOverride(false);
|
||||
blockSelection(true);
|
||||
|
||||
vp->setTransformOrigin(vp->getTransformOrigin());
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -492,6 +495,11 @@ void TaskTransform::onAlignRotationChanged()
|
||||
|
||||
void TaskTransform::onAlignToOtherObject()
|
||||
{
|
||||
if (selectionMode == SelectionMode::SelectAlignTarget) {
|
||||
setSelectionMode(SelectionMode::None);
|
||||
return;
|
||||
}
|
||||
|
||||
setSelectionMode(SelectionMode::SelectAlignTarget);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -90,6 +90,8 @@ protected:
|
||||
|
||||
void onChanged(const App::Property* prop) override;
|
||||
|
||||
bool forwardToLink();
|
||||
|
||||
/**
|
||||
* Returns a newly create dialog for the part to be placed in the task view
|
||||
* Must be reimplemented in subclasses.
|
||||
@@ -97,6 +99,7 @@ protected:
|
||||
virtual TaskView::TaskDialog* getTransformDialog();
|
||||
|
||||
CoinPtr<SoFCCSysDragger> csysDragger = nullptr;
|
||||
ViewProvider *forwardedViewProvider = nullptr;
|
||||
|
||||
private:
|
||||
static void dragStartCallback(void *data, SoDragger *d);
|
||||
@@ -105,9 +108,6 @@ private:
|
||||
|
||||
void updateDraggerPosition();
|
||||
|
||||
bool checkLink();
|
||||
|
||||
ViewProvider *_linkDragger = nullptr;
|
||||
Base::Placement draggerPlacement { };
|
||||
};
|
||||
|
||||
|
||||
@@ -81,7 +81,16 @@ void ViewProvider::setupContextMenu(QMenu* menu, QObject* receiver, const char*
|
||||
|
||||
bool ViewProvider::setEdit(int ModNum)
|
||||
{
|
||||
if (ModNum == ViewProvider::Default ) {
|
||||
if (ModNum == ViewProvider::Transform) {
|
||||
if (forwardToLink()) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// this is feature so we need to forward the transform to the body
|
||||
forwardedViewProvider = getBodyViewProvider();
|
||||
return forwardedViewProvider->startEditing(ModNum);
|
||||
}
|
||||
else if (ModNum == ViewProvider::Default) {
|
||||
// When double-clicking on the item for this feature the
|
||||
// object unsets and sets its edit mode without closing
|
||||
// the task panel
|
||||
@@ -194,6 +203,22 @@ void ViewProvider::onChanged(const App::Property* prop) {
|
||||
PartGui::ViewProviderPartExt::onChanged(prop);
|
||||
}
|
||||
|
||||
Gui::ViewProvider* ViewProvider::startEditing(int ModNum)
|
||||
{
|
||||
// in case of transform we forward the request to body
|
||||
if (ModNum == Transform) {
|
||||
forwardedViewProvider = nullptr;
|
||||
|
||||
if (!ViewProviderPart::startEditing(ModNum)) {
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
return forwardedViewProvider;
|
||||
}
|
||||
|
||||
return ViewProviderPart::startEditing(ModNum);
|
||||
}
|
||||
|
||||
void ViewProvider::setTipIcon(bool onoff) {
|
||||
isSetTipIcon = onoff;
|
||||
|
||||
|
||||
@@ -55,6 +55,8 @@ public:
|
||||
void updateData(const App::Property*) override;
|
||||
void onChanged(const App::Property* prop) override;
|
||||
|
||||
Gui::ViewProvider* startEditing(int ModNum) override;
|
||||
|
||||
void setTipIcon(bool onoff);
|
||||
|
||||
//body mode means that the object is part of a body and that the body is used to set the
|
||||
|
||||
Reference in New Issue
Block a user