Skip to content

Commit

Permalink
[TD]fix lost parent on undo
Browse files Browse the repository at this point in the history
  • Loading branch information
WandererFan committed Jun 24, 2023
1 parent d5292d7 commit 62a681d
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 23 deletions.
10 changes: 9 additions & 1 deletion src/Mod/TechDraw/Gui/MDIViewPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,6 @@
#include "Rez.h"
#include "ViewProviderPage.h"


using namespace TechDrawGui;
using namespace TechDraw;
namespace bp = boost::placeholders;
Expand Down Expand Up @@ -194,6 +193,7 @@ bool MDIViewPage::onMsg(const char* pMsg, const char**)
else if (strcmp("Undo", pMsg) == 0) {
doc->undo(1);
Gui::Command::updateActive();
fixSceneDependencies(); // check QGraphicsScene item parenting
return true;
}
else if (strcmp("Redo", pMsg) == 0) {
Expand Down Expand Up @@ -246,6 +246,14 @@ void MDIViewPage::setTabText(std::string tabText)
}
}

// advise the page to check QGraphicsScene parent/child relationships after undo
void MDIViewPage::fixSceneDependencies()
{
if (getViewProviderPage()) {
getViewProviderPage()->fixSceneDependencies();
}
}

//**** printing routines

void MDIViewPage::getPaperAttributes()
Expand Down
1 change: 1 addition & 0 deletions src/Mod/TechDraw/Gui/MDIViewPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -116,6 +116,7 @@ class TechDrawGuiExport MDIViewPage : public Gui::MDIView, public Gui::Selection
void contextMenuEvent(QContextMenuEvent *event) override;

void setScene(QGSPage* scene, QGVPage* view);
void fixSceneDependencies();

public Q_SLOTS:
void viewAll() override;
Expand Down
21 changes: 21 additions & 0 deletions src/Mod/TechDraw/Gui/ViewProviderPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
#include "QGVPage.h"
#include "ViewProviderPageExtension.h"
#include "ViewProviderTemplate.h"
#include "ViewProviderViewPart.h"


using namespace TechDrawGui;
Expand Down Expand Up @@ -557,3 +558,23 @@ ViewProviderPageExtension* ViewProviderPage::getVPPExtension() const
}

const char* ViewProviderPage::whoAmI() const { return m_pageName.c_str(); }


void ViewProviderPage::fixSceneDependencies()
{
App::Document* doc = getDrawPage()->getDocument();
std::vector<App::DocumentObject*> docObjs =
doc->getObjectsOfType(TechDraw::DrawViewPart::getClassTypeId());
for (auto& obj : docObjs) {
Gui::ViewProvider* vp = Gui::Application::Instance->getViewProvider(obj);
if (!vp) {
continue;// can't fix this one
}
TechDrawGui::ViewProviderViewPart* vpvp = dynamic_cast<TechDrawGui::ViewProviderViewPart*>(vp);
if (!vpvp) {
continue;// can't fix this one
}
vpvp->fixSceneDependencies();
}

}
3 changes: 3 additions & 0 deletions src/Mod/TechDraw/Gui/ViewProviderPage.h
Original file line number Diff line number Diff line change
Expand Up @@ -126,6 +126,9 @@ class TechDrawGuiExport ViewProviderPage: public Gui::ViewProviderDocumentObject

const char* whoAmI() const;

void fixSceneDependencies();


protected:
bool setEdit(int ModNum) override;
void createMDIViewPage();
Expand Down
61 changes: 42 additions & 19 deletions src/Mod/TechDraw/Gui/ViewProviderViewPart.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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 ) {
Expand Down Expand Up @@ -309,26 +315,16 @@ bool ViewProviderViewPart::onDelete(const std::vector<std::string> &)
auto viewSection = getViewObject()->getSectionRefs();
auto viewDetail = getViewObject()->getDetailRefs();
auto viewLeader = getViewObject()->getLeaders();

if (!viewSection.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()) {
auto viewDimension = getViewObject()->getDimensions();
auto viewBalloon = getViewObject()->getBalloons();

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 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);
Expand Down Expand Up @@ -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);
}
}
}
4 changes: 1 addition & 3 deletions src/Mod/TechDraw/Gui/ViewProviderViewPart.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,16 +69,14 @@ class TechDrawGuiExport ViewProviderViewPart : public ViewProviderDrawingView
bool canDelete(App::DocumentObject* obj) const override;
bool setEdit(int ModNum) override;
bool doubleClicked(void) override;

public:
void onChanged(const App::Property *prop) override;
void handleChangedPropertyType(Base::XMLReader &reader, const char *TypeName, App::Property * prop) override;
App::Color prefSectionColor(void);
App::Color prefHighlightColor(void);
int prefHighlightStyle(void);


std::vector<App::DocumentObject*> claimChildren(void) const override;
void fixSceneDependencies();

TechDraw::DrawViewPart* getViewObject() const override;
TechDraw::DrawViewPart* getViewPart() const;
Expand Down

0 comments on commit 62a681d

Please sign in to comment.