TechDraw: Fix child not moving when drag and dropping a view between pages.

This commit is contained in:
PaddleStroke
2024-04-17 17:07:13 +02:00
committed by WandererFan
parent beda33d9e6
commit ffb34ebe54
3 changed files with 24 additions and 6 deletions

View File

@@ -232,7 +232,7 @@ int DrawPage::getOrientation() const
throw Base::RuntimeError("Template not set for Page");
}
int DrawPage::addView(App::DocumentObject* docObj)
int DrawPage::addView(App::DocumentObject* docObj, bool setPosition)
{
if (!docObj->isDerivedFrom<DrawView>()
&& !docObj->isDerivedFrom<App::Link>()) {
@@ -256,7 +256,8 @@ int DrawPage::addView(App::DocumentObject* docObj)
//position all new views without owners in center of Page (exceptDVDimension)
if (!view->claimParent()
&& !docObj->isDerivedFrom<DrawViewDimension>()
&& !docObj->isDerivedFrom<DrawViewBalloon>()) {
&& !docObj->isDerivedFrom<DrawViewBalloon>()
&& setPosition) {
view->X.setValue(getPageWidth() / 2.0);
view->Y.setValue(getPageHeight() / 2.0);
}

View File

@@ -60,7 +60,7 @@ public:
void handleChangedPropertyType(Base::XMLReader& reader, const char* TypeName,
App::Property* prop) override;
int addView(App::DocumentObject* docObj);
int addView(App::DocumentObject* docObj, bool setPosition = true);
int removeView(App::DocumentObject* docObj);
short mustExecute() const override;
boost::signals2::signal<void(const DrawPage*)> signalGuiPaint;

View File

@@ -154,10 +154,27 @@ void ViewProviderPageExtension::dropObject(App::DocumentObject* obj)
if (obj->isDerivedFrom<TechDraw::DrawView>()) {
auto dv = static_cast<TechDraw::DrawView*>(obj);
if (dv->findParentPage()) {
dv->findParentPage()->removeView(dv);
std::vector<App::DocumentObject*> deps;
for (auto* dep : dv->getInList()) {
if (dep && dep->isDerivedFrom<TechDraw::DrawView>()) {
deps.push_back(dep);
}
}
getViewProviderPage()->getDrawPage()->addView(dv);
auto* parentPage = dv->findParentPage();
if (parentPage) {
for (auto* dep : deps) {
parentPage->removeView(dep);
}
parentPage->removeView(dv);
}
getViewProviderPage()->getDrawPage()->addView(dv, false);
for (auto* dep : deps) {
getViewProviderPage()->getDrawPage()->addView(dep, false);
}
//don't run ancestor's method as addView does everything we need
return;
}