Fix #2888 Crash on Delete View
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user