Correct handling of deleted Features in QGraphicsScene

This commit is contained in:
WandererFan 2017-01-06 09:12:54 -05:00
parent c0c4569546
commit 1738107590
6 changed files with 60 additions and 1 deletions

View File

@ -318,6 +318,11 @@ bool MDIViewPage::attachView(App::DocumentObject *obj)
return (qview != nullptr);
}
void MDIViewPage::removeView(QGIView *view)
{
(void) m_view->removeView(view);
}
void MDIViewPage::updateTemplate(bool forceUpdate)

View File

@ -65,7 +65,8 @@ public:
void attachTemplate(TechDraw::DrawTemplate *obj);
void updateTemplate(bool force = false);
void updateDrawing(bool force = false);
void removeView(QGIView *view);
bool onMsg(const char* pMsg,const char** ppReturn);
bool onHasMsg(const char* pMsg) const;
void onRelabel(Gui::Document *pDoc);

View File

@ -198,6 +198,46 @@ int QGVPage::addView(QGIView *view)
return views.size();
}
int QGVPage::removeView(QGIView *view)
{
std::vector<QGIView *> qviews = views;
std::vector<QGIView *> newViews;
std::vector<QGIView *>::iterator qvit = qviews.begin();
std::vector<QGIView *>::iterator qvDel = qviews.end();
for (; qvit != qviews.end(); qvit++) {
if ((*qvit) == view) {
qvDel = qvit;
break;
}
}
if (qvDel == qviews.end()) { //didn't find view in views
return views.size();
}
QGraphicsItemGroup* grp = view->group();
if (grp) {
grp->removeFromGroup(view);
}
if (view->parentItem()) { //not top level
view->setParentItem(0);
}
if (view->scene()) {
view->scene()->removeItem(view);
}
qviews.erase(qvDel);
views = qviews;
delete view;
return views.size();
}
QGIView * QGVPage::addViewPart(TechDraw::DrawViewPart *part)
{
auto viewPart( new QGIViewPart );

View File

@ -79,6 +79,7 @@ public:
void addDimToParent(QGIViewDimension* dim, QGIView* parent);
const std::vector<QGIView *> & getViews() const { return views; }
int addView(QGIView * view);
int removeView(QGIView *view);
void setViews(const std::vector<QGIView *> &view) {views = view; }
void setPageTemplate(TechDraw::DrawTemplate *pageTemplate);

View File

@ -202,6 +202,17 @@ void ViewProviderDrawingView::unsetEdit(int ModNum)
}
}
bool ViewProviderDrawingView::onDelete(const std::vector<std::string> &items)
{
QGIView* qv = getQView();
if (qv != nullptr) {
MDIViewPage* mdi = getMDIViewPage();
mdi->removeView(qv);
}
return ViewProviderDocumentObject::onDelete(items);
}
MDIViewPage* ViewProviderDrawingView::getMDIViewPage() const
{

View File

@ -60,6 +60,7 @@ public:
virtual void onChanged(const App::Property *prop);
virtual void updateData(const App::Property*);
virtual void unsetEdit(int ModNum);
virtual bool onDelete(const std::vector<std::string> &items);
QGIView* getQView(void);
MDIViewPage* getMDIViewPage() const;