Fix #2888 Crash on Delete View

This commit is contained in:
WandererFan
2017-02-05 17:59:20 -05:00
parent 613d8eeda1
commit 75f3566812
6 changed files with 110 additions and 167 deletions

View File

@@ -164,18 +164,29 @@ void QGVPage::drawBackground(QPainter *p, const QRectF &)
p->drawRect(poly.boundingRect());
p->restore();
}
int QGVPage::addView(QGIView *view)
//! retrieve the QGIView objects currently in the scene
std::vector<QGIView *> QGVPage::getViews() const
{
std::vector<QGIView*> result;
QList<QGraphicsItem*> items = scene()->items();
for (auto& v:items) {
QGIView* qv = dynamic_cast<QGIView*>(v);
if (qv != nullptr) {
result.push_back(qv);
}
}
return result;
}
int QGVPage::addQView(QGIView *view)
{
auto ourScene( scene() );
assert(ourScene);
ourScene->addItem(view);
views.push_back(view);
// Find if it belongs to a parent
QGIView *parent = 0;
parent = findParent(view);
@@ -184,78 +195,51 @@ int QGVPage::addView(QGIView *view)
Rez::guiX(view->getViewObject()->Y.getValue() * -1));
if(parent) {
// Transfer the child vierw to the parent
QPointF posRef(0.,0.);
// // Transfer the child vierw to the parent
// QPointF posRef(0.,0.);
QPointF mapPos = view->mapToItem(parent, posRef); //setPos is called later. this doesn't do anything?
view->moveBy(-mapPos.x(), -mapPos.y());
// QPointF mapPos = view->mapToItem(parent, posRef); //setPos is called later. this doesn't do anything?
// view->moveBy(-mapPos.x(), -mapPos.y());
parent->addToGroup(view);
}
view->setPos(viewPos);
return views.size();
return 0;
}
int QGVPage::removeView(QGIView *view)
int QGVPage::removeQView(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 (view != nullptr) {
removeQViewFromScene(view);
delete view;
}
if (qvDel == qviews.end()) { //didn't find view in views
return views.size();
}
removeViewFromScene(view);
qviews.erase(qvDel);
views = qviews;
delete view;
return views.size();
return 0;
}
int QGVPage::removeView(const TechDraw::DrawView* dv)
int QGVPage::removeQViewByDrawView(const TechDraw::DrawView* dv)
{
std::vector<QGIView *> newViews;
QList<QGraphicsItem *> items = scene()->items();
std::vector<QGIView*> items = getViews();
QString qsName = QString::fromUtf8(dv->getNameInDocument());
bool found = false;
QGIView* ourItem = nullptr;
for (auto& i:items) {
if (qsName == i->data(1).toString()) { //is there really a QGIV for this DV in scene?
found = true;
ourItem = static_cast<QGIView*>(i);
ourItem = i;
break;
}
}
if (found) {
for (auto&v :views) {
if (ourItem != v) {
newViews.push_back(v);
}
}
removeViewFromScene(ourItem);
removeQViewFromScene(ourItem);
delete ourItem;
views = newViews;
}
return views.size();
return 0;
}
void QGVPage::removeViewFromScene(QGIView *view)
void QGVPage::removeQViewFromScene(QGIView *view)
{
QGraphicsItemGroup* grp = view->group();
if (grp) {
@@ -278,7 +262,7 @@ QGIView * QGVPage::addViewPart(TechDraw::DrawViewPart *part)
viewPart->setViewPartFeature(part);
addView(viewPart);
addQView(viewPart);
return viewPart;
}
@@ -288,7 +272,7 @@ QGIView * QGVPage::addViewSection(TechDraw::DrawViewPart *part)
viewSection->setViewPartFeature(part);
addView(viewSection);
addQView(viewSection);
return viewSection;
}
@@ -296,7 +280,7 @@ QGIView * QGVPage::addProjectionGroup(TechDraw::DrawProjGroup *view) {
auto qview( new QGIProjGroup );
qview->setViewFeature(view);
addView(qview);
addQView(qview);
return qview;
}
@@ -305,7 +289,7 @@ QGIView * QGVPage::addDrawView(TechDraw::DrawView *view)
auto qview( new QGIView );
qview->setViewFeature(view);
addView(qview);
addQView(qview);
return qview;
}
@@ -314,31 +298,28 @@ QGIView * QGVPage::addDrawViewCollection(TechDraw::DrawViewCollection *view)
auto qview( new QGIViewCollection );
qview->setViewFeature(view);
addView(qview);
addQView(qview);
return qview;
}
// TODO change to (App?) annotation object ??
QGIView * QGVPage::addDrawViewAnnotation(TechDraw::DrawViewAnnotation *view)
{
// This essentially adds a null view feature to ensure view size is consistent
auto qview( new QGIViewAnnotation );
qview->setViewAnnoFeature(view);
addView(qview);
addQView(qview);
return qview;
}
QGIView * QGVPage::addDrawViewSymbol(TechDraw::DrawViewSymbol *view)
{
//QPoint qp(view->X.getValue(),view->Y.getValue());
// This essentially adds a null view feature to ensure view size is consistent
auto qview( new QGIViewSymbol );
qview->setViewFeature(view);
addView(qview);
addQView(qview);
return qview;
}
@@ -349,7 +330,7 @@ QGIView * QGVPage::addDrawViewClip(TechDraw::DrawViewClip *view)
qview->setPosition(Rez::guiX(view->X.getValue()), Rez::guiX(view->Y.getValue()));
qview->setViewFeature(view);
addView(qview);
addQView(qview);
return qview;
}
@@ -359,18 +340,17 @@ QGIView * QGVPage::addDrawViewSpreadsheet(TechDraw::DrawViewSpreadsheet *view)
qview->setViewFeature(view);
addView(qview);
addQView(qview);
return qview;
}
QGIView * QGVPage::addDrawViewImage(TechDraw::DrawViewImage *view)
{
//QPoint qp(view->X.getValue(),view->Y.getValue());
auto qview( new QGIViewImage );
qview->setViewFeature(view);
addView(qview);
addQView(qview);
return qview;
}
@@ -384,12 +364,6 @@ QGIView * QGVPage::addViewDimension(TechDraw::DrawViewDimension *dim)
dimGroup->setViewPartFeature(dim);
// TODO consider changing dimension feature to use another property for label position
// Instead of calling addView - the view must for now be added manually
//Note dimension X,Y is different from other views -> can't use addView
views.push_back(dimGroup);
// Find if it belongs to a parent
QGIView *parent = 0;
parent = findParent(dimGroup);
@@ -412,10 +386,11 @@ void QGVPage::addDimToParent(QGIViewDimension* dim, QGIView* parent)
dim->setZValue(ZVALUE::DIMENSION);
}
QGIView * QGVPage::findView(App::DocumentObject *obj) const
//! find the graphic for a DocumentObject
QGIView * QGVPage::findQViewForDocObj(App::DocumentObject *obj) const
{
if(obj) {
const std::vector<QGIView *> qviews = views;
const std::vector<QGIView *> qviews = getViews();
for(std::vector<QGIView *>::const_iterator it = qviews.begin(); it != qviews.end(); ++it) {
if(strcmp(obj->getNameInDocument(), (*it)->getViewName()) == 0)
return *it;
@@ -424,9 +399,27 @@ QGIView * QGVPage::findView(App::DocumentObject *obj) const
return 0;
}
//! find the graphic for DocumentObject with name
QGIView* QGVPage::getQGIVByName(std::string name)
{
QList<QGraphicsItem*> qgItems = scene()->items();
QList<QGraphicsItem*>::iterator it = qgItems.begin();
for (; it != qgItems.end(); it++) {
QGIView* qv = dynamic_cast<QGIView*>((*it));
if (qv) {
const char* qvName = qv->getViewName();
if(name.compare(qvName) == 0) {
return (qv);
}
}
}
return nullptr;
}
QGIView * QGVPage::findParent(QGIView *view) const
{
const std::vector<QGIView *> qviews = views;
const std::vector<QGIView *> qviews = getViews();
TechDraw::DrawView *myView = view->getViewObject();
//If type is dimension we check references first