[TD]fix lost parent on undo
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user