From 0c57730cd25f476e9b628b9799b38ec88a6875f5 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Wed, 22 Apr 2020 11:31:47 -0400 Subject: [PATCH] [TD]trap potential crash on app close - avoid possible crash in TD dialogs if app closed while dialog in progress. --- src/Mod/TechDraw/Gui/TaskDetail.cpp | 50 +++++++++++-------- src/Mod/TechDraw/Gui/TaskDetail.ui | 15 +----- .../TechDraw/Gui/ViewProviderDrawingView.cpp | 26 ++++++---- 3 files changed, 45 insertions(+), 46 deletions(-) diff --git a/src/Mod/TechDraw/Gui/TaskDetail.cpp b/src/Mod/TechDraw/Gui/TaskDetail.cpp index f7b1a6214f9d..62526272159b 100644 --- a/src/Mod/TechDraw/Gui/TaskDetail.cpp +++ b/src/Mod/TechDraw/Gui/TaskDetail.cpp @@ -125,7 +125,7 @@ TaskDetail::TaskDetail(TechDraw::DrawViewPart* baseFeat): this, SLOT(onYEdit())); connect(ui->qsbRadius, SIGNAL(editingFinished()), this, SLOT(onRadiusEdit())); - connect(ui->aeReference, SIGNAL(editingFinished()), + connect(ui->leReference, SIGNAL(editingFinished()), this, SLOT(onReferenceEdit())); m_ghost = new QGIGhostHighlight(); @@ -198,7 +198,7 @@ TaskDetail::TaskDetail(TechDraw::DrawViewDetail* detailFeat): this, SLOT(onYEdit())); connect(ui->qsbRadius, SIGNAL(editingFinished()), this, SLOT(onRadiusEdit())); - connect(ui->aeReference, SIGNAL(editingFinished()), + connect(ui->leReference, SIGNAL(editingFinished()), this, SLOT(onReferenceEdit())); m_ghost = new QGIGhostHighlight(); @@ -280,7 +280,7 @@ void TaskDetail::setUiFromFeat() ui->qsbX->setValue(anchor.x); ui->qsbY->setValue(anchor.y); ui->qsbRadius->setValue(radius); - ui->aeReference->setText(ref); + ui->leReference->setText(ref); } //update ui point fields after tracker finishes @@ -295,7 +295,7 @@ void TaskDetail::enableInputFields(bool b) ui->qsbX->setEnabled(b); ui->qsbY->setEnabled(b); ui->qsbRadius->setEnabled(b); - ui->aeReference->setEnabled(b); + ui->leReference->setEnabled(b); } void TaskDetail::onXEdit() @@ -315,7 +315,7 @@ void TaskDetail::onRadiusEdit() void TaskDetail::onReferenceEdit() { - updateDetail(); + updateDetail(); //<<<<< } void TaskDetail::onDraggerClicked(bool b) @@ -430,23 +430,29 @@ void TaskDetail::createDetail() void TaskDetail::updateDetail() { // Base::Console().Message("TD::updateDetail()\n"); - Gui::Command::openCommand("Update Detail"); - double x = ui->qsbX->rawValue(); - double y = ui->qsbY->rawValue(); - Base::Vector3d temp(x, y, 0.0); - TechDraw::DrawViewDetail* detailFeat = getDetailFeat(); - detailFeat->AnchorPoint.setValue(temp); - - double radius = ui->qsbRadius->rawValue(); - detailFeat->Radius.setValue(radius); - QString qRef = ui->aeReference->text(); - std::string ref = Base::Tools::toStdString(qRef); - detailFeat->Reference.setValue(ref); - - detailFeat->recomputeFeature(); - getBaseFeat()->requestPaint(); - Gui::Command::updateActive(); - Gui::Command::commitCommand(); + try { + Gui::Command::openCommand("Update Detail"); + double x = ui->qsbX->rawValue(); + double y = ui->qsbY->rawValue(); + Base::Vector3d temp(x, y, 0.0); + TechDraw::DrawViewDetail* detailFeat = getDetailFeat(); + detailFeat->AnchorPoint.setValue(temp); + + double radius = ui->qsbRadius->rawValue(); + detailFeat->Radius.setValue(radius); + QString qRef = ui->leReference->text(); + std::string ref = Base::Tools::toStdString(qRef); + detailFeat->Reference.setValue(ref); + + detailFeat->recomputeFeature(); + getBaseFeat()->requestPaint(); + Gui::Command::updateActive(); + Gui::Command::commitCommand(); + } + catch (...) { + //this is probably due to appl closing while dialog is still open + Base::Console().Error("Task Detail - detail feature update failed.\n"); + } } //***** Getters **************************************************************** diff --git a/src/Mod/TechDraw/Gui/TaskDetail.ui b/src/Mod/TechDraw/Gui/TaskDetail.ui index 0aa0a2fe2158..6b17e707e119 100644 --- a/src/Mod/TechDraw/Gui/TaskDetail.ui +++ b/src/Mod/TechDraw/Gui/TaskDetail.ui @@ -7,7 +7,7 @@ 0 0 304 - 244 + 253 @@ -214,13 +214,7 @@ - - - Detail identifier - - - 1 - + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter @@ -231,11 +225,6 @@ - - Gui::AccelLineEdit - QLineEdit -
Gui/Widgets.h
-
Gui::QuantitySpinBox QWidget diff --git a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp index f083d784ff83..2235daf354a4 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDrawingView.cpp @@ -184,13 +184,15 @@ QGIView* ViewProviderDrawingView::getQView(void) TechDraw::DrawView* dv = getViewObject(); if (dv) { Gui::Document* guiDoc = Gui::Application::Instance->getDocument(getViewObject()->getDocument()); - Gui::ViewProvider* vp = guiDoc->getViewProvider(getViewObject()->findParentPage()); - ViewProviderPage* dvp = dynamic_cast(vp); - if (dvp) { - if (dvp->getMDIViewPage()) { - if (dvp->getMDIViewPage()->getQGVPage()) { - qView = dynamic_cast(dvp->getMDIViewPage()-> - getQGVPage()->findQViewForDocObj(getViewObject())); + if (guiDoc != nullptr) { + Gui::ViewProvider* vp = guiDoc->getViewProvider(getViewObject()->findParentPage()); + ViewProviderPage* dvp = dynamic_cast(vp); + if (dvp) { + if (dvp->getMDIViewPage()) { + if (dvp->getMDIViewPage()->getQGVPage()) { + qView = dynamic_cast(dvp->getMDIViewPage()-> + getQGVPage()->findQViewForDocObj(getViewObject())); + } } } } @@ -249,10 +251,12 @@ MDIViewPage* ViewProviderDrawingView::getMDIViewPage() const { MDIViewPage* result = nullptr; Gui::Document* guiDoc = Gui::Application::Instance->getDocument(getViewObject()->getDocument()); - Gui::ViewProvider* vp = guiDoc->getViewProvider(getViewObject()->findParentPage()); //if not in page.views, !@#$% - ViewProviderPage* dvp = dynamic_cast(vp); - if (dvp) { - result = dvp->getMDIViewPage(); + if (guiDoc != nullptr) { + Gui::ViewProvider* vp = guiDoc->getViewProvider(getViewObject()->findParentPage()); + ViewProviderPage* dvp = dynamic_cast(vp); + if (dvp) { + result = dvp->getMDIViewPage(); + } } return result; }