[TD]fix lost parent on undo

This commit is contained in:
wandererfan
2023-06-24 14:36:19 -04:00
committed by WandererFan
parent 542223f5b6
commit cb25671863
6 changed files with 76 additions and 22 deletions

View File

@@ -52,6 +52,10 @@
#include "QGIView.h"
#include "TaskDetail.h"
#include "ViewProviderViewPart.h"
#include "ViewProviderPage.h"
#include "QGIViewDimension.h"
#include "QGIViewBalloon.h"
#include "QGSPage.h"
using namespace TechDrawGui;
using namespace TechDraw;
@@ -167,6 +171,7 @@ void ViewProviderViewPart::onChanged(const App::Property* prop)
void ViewProviderViewPart::attach(App::DocumentObject *pcFeat)
{
// Base::Console().Message("VPVP::attach(%s)\n", pcFeat->getNameInDocument());
TechDraw::DrawViewMulti* dvm = dynamic_cast<TechDraw::DrawViewMulti*>(pcFeat);
TechDraw::DrawViewDetail* dvd = dynamic_cast<TechDraw::DrawViewDetail*>(pcFeat);
if (dvm) {
@@ -222,6 +227,7 @@ std::vector<App::DocumentObject*> ViewProviderViewPart::claimChildren() const
return std::vector<App::DocumentObject*>();
}
}
bool ViewProviderViewPart::setEdit(int ModNum)
{
if (ModNum != ViewProvider::Default ) {
@@ -309,26 +315,16 @@ bool ViewProviderViewPart::onDelete(const std::vector<std::string> &)
auto viewSection = getViewObject()->getSectionRefs();
auto viewDetail = getViewObject()->getDetailRefs();
auto viewLeader = getViewObject()->getLeaders();
auto viewDimension = getViewObject()->getDimensions();
auto viewBalloon = getViewObject()->getBalloons();
if (!viewSection.empty()) {
if (!viewDimension.empty() ||
!viewBalloon.empty() ||
!viewSection.empty() ||
!viewDetail.empty() ||
!viewLeader.empty()) {
bodyMessageStream << qApp->translate("Std_Delete",
"You cannot delete this view because it has a section view that would become broken.");
QMessageBox::warning(Gui::getMainWindow(),
qApp->translate("Std_Delete", "Object dependencies"), bodyMessage,
QMessageBox::Ok);
return false;
}
else if (!viewDetail.empty()) {
bodyMessageStream << qApp->translate("Std_Delete",
"You cannot delete this view because it has a detail view that would become broken.");
QMessageBox::warning(Gui::getMainWindow(),
qApp->translate("Std_Delete", "Object dependencies"), bodyMessage,
QMessageBox::Ok);
return false;
}
else if (!viewLeader.empty()) {
bodyMessageStream << qApp->translate("Std_Delete",
"You cannot delete this view because it has a leader line that would become broken.");
"You cannot delete this view because it has one or more dependent objects that would become broken.");
QMessageBox::warning(Gui::getMainWindow(),
qApp->translate("Std_Delete", "Object dependencies"), bodyMessage,
QMessageBox::Ok);
@@ -364,4 +360,31 @@ int ViewProviderViewPart::prefHighlightStyle()
return Preferences::getPreferenceGroup("Decorations")->GetInt("HighlightStyle", 2);
}
// it can happen that Dimensions/Balloons/etc can lose their parent item if the
// the parent is deleted, then undo is invoked. The linkages on the App side are
// handled by the undo mechanism, but the QGraphicsScene parentage is not reset.
// TODO: does this need to be implemented for Leaderlines and ???? others?
void ViewProviderViewPart::fixSceneDependencies()
{
// Base::Console().Message("VPVP::fixSceneDependencies()\n");
auto scene = getViewProviderPage()->getQGSPage();
auto partQView = getQView();
auto dimensions = getViewPart()->getDimensions();
for (auto& dim : dimensions) {
auto dimQView = dynamic_cast<QGIViewDimension *>(scene->findQViewForDocObj(dim));
if (dimQView && dimQView->parentItem() != partQView) {
// need to add the dim QView to this QGIViewPart
scene->addDimToParent(dimQView, partQView);
}
}
auto balloons = getViewPart()->getBalloons();
for (auto& bal : balloons) {
auto balQView = dynamic_cast<QGIViewBalloon*>(scene->findQViewForDocObj(bal));
if (balQView && balQView->parentItem() != partQView) {
// need to add the balloon QView to this QGIViewPart
scene->addBalloonToParent(balQView, partQView);
}
}
}