diff --git a/src/Mod/TechDraw/Gui/TaskLeaderLine.cpp b/src/Mod/TechDraw/Gui/TaskLeaderLine.cpp index 3f2d464e0c..2128294486 100644 --- a/src/Mod/TechDraw/Gui/TaskLeaderLine.cpp +++ b/src/Mod/TechDraw/Gui/TaskLeaderLine.cpp @@ -86,15 +86,37 @@ TaskLeaderLine::TaskLeaderLine(TechDrawGui::ViewProviderLeader* leadVP) : Base::Console().Error("TaskLeaderLine - bad parameters. Can not proceed.\n"); return; } - ui->setupUi(this); - + m_lineFeat = m_lineVP->getFeature(); - App::DocumentObject* obj = m_lineFeat->LeaderParent.getValue(); - if ( obj->isDerivedFrom(TechDraw::DrawView::getClassTypeId()) ) { - m_baseFeat = static_cast(m_lineFeat->LeaderParent.getValue()); - } m_basePage = m_lineFeat->findParentPage(); + if ( m_basePage == nullptr ) { + Base::Console().Error("TaskRichAnno - bad parameters (2). Can not proceed.\n"); + return; + } + App::DocumentObject* obj = m_lineFeat->LeaderParent.getValue(); + if (obj != nullptr) { + if (obj->isDerivedFrom(TechDraw::DrawView::getClassTypeId()) ) { + m_baseFeat = static_cast(m_lineFeat->LeaderParent.getValue()); + } + } + + Gui::Document* activeGui = Gui::Application::Instance->getDocument(m_basePage->getDocument()); + Gui::ViewProvider* vp = activeGui->getViewProvider(m_basePage); + ViewProviderPage* vpp = static_cast(vp); + + m_qgParent = nullptr; + m_haveMdi = true; + m_mdi = vpp->getMDIViewPage(); + if (m_mdi != nullptr) { + m_scene = m_mdi->m_scene; + m_view = m_mdi->getQGVPage(); + if (m_baseFeat != nullptr) { + m_qgParent = m_view->findQViewForDocObj(m_baseFeat); + } + } else { + m_haveMdi = false; + } //TODO: when/if leaders are allowed to be parented to Page, check for m_baseFeat will be removed if ( (m_lineFeat == nullptr) || @@ -104,11 +126,9 @@ TaskLeaderLine::TaskLeaderLine(TechDrawGui::ViewProviderLeader* leadVP) : return; } - setUiEdit(); + ui->setupUi(this); - m_mdi = m_lineVP->getMDIViewPage(); - m_scene = m_mdi->m_scene; - m_view = m_mdi->getQGVPage(); + setUiEdit(); m_attachPoint = Rez::guiX(Base::Vector3d(m_lineFeat->X.getValue(), -m_lineFeat->Y.getValue(), @@ -123,7 +143,9 @@ TaskLeaderLine::TaskLeaderLine(TechDrawGui::ViewProviderLeader* leadVP) : saveState(); m_trackerMode = QGTracker::TrackerMode::Line; - m_saveContextPolicy = m_mdi->contextMenuPolicy(); + if (m_haveMdi) { + m_saveContextPolicy = m_mdi->contextMenuPolicy(); + } } //ctor for creation @@ -148,14 +170,25 @@ TaskLeaderLine::TaskLeaderLine(TechDraw::DrawView* baseFeat, return; } - ui->setupUi(this); - Gui::Document* activeGui = Gui::Application::Instance->getDocument(m_basePage->getDocument()); Gui::ViewProvider* vp = activeGui->getViewProvider(m_basePage); ViewProviderPage* vpp = static_cast(vp); +// vpp->show(); + + m_qgParent = nullptr; + m_haveMdi = true; m_mdi = vpp->getMDIViewPage(); - m_scene = m_mdi->m_scene; - m_view = m_mdi->getQGVPage(); + if (m_mdi != nullptr) { + m_scene = m_mdi->m_scene; + m_view = m_mdi->getQGVPage(); + if (baseFeat != nullptr) { + m_qgParent = m_view->findQViewForDocObj(baseFeat); + } + } else { + m_haveMdi = false; + } + + ui->setupUi(this); setUiPrimary(); @@ -166,7 +199,9 @@ TaskLeaderLine::TaskLeaderLine(TechDraw::DrawView* baseFeat, ui->pbCancelEdit->setEnabled(false); m_trackerMode = QGTracker::TrackerMode::Line; - m_saveContextPolicy = m_mdi->contextMenuPolicy(); + if (m_haveMdi) { + m_saveContextPolicy = m_mdi->contextMenuPolicy(); + } } @@ -217,9 +252,16 @@ void TaskLeaderLine::setUiPrimary() std::string baseName = m_baseFeat->getNameInDocument(); ui->leBaseView->setText(Base::Tools::fromStdString(baseName)); } + ui->pbTracker->setText(QString::fromUtf8("Pick points")); - ui->pbTracker->setEnabled(true); - ui->pbCancelEdit->setEnabled(true); + if (m_haveMdi) { + ui->pbTracker->setEnabled(true); + ui->pbCancelEdit->setEnabled(true); + } else { + ui->pbTracker->setEnabled(false); + ui->pbCancelEdit->setEnabled(false); + } + int aSize = getPrefArrowStyle() + 1; ui->cboxStartSym->setCurrentIndex(aSize); @@ -251,8 +293,13 @@ void TaskLeaderLine::setUiEdit() ui->cboxStartSym->setCurrentIndex(m_lineFeat->StartSymbol.getValue() + 1); ui->cboxEndSym->setCurrentIndex(m_lineFeat->EndSymbol.getValue() + 1); ui->pbTracker->setText(QString::fromUtf8("Edit points")); - ui->pbTracker->setEnabled(true); - ui->pbCancelEdit->setEnabled(true); + if (m_haveMdi) { + ui->pbTracker->setEnabled(true); + ui->pbCancelEdit->setEnabled(true); + } else { + ui->pbTracker->setEnabled(false); + ui->pbCancelEdit->setEnabled(false); + } } if (m_lineVP != nullptr) { @@ -383,6 +430,11 @@ void TaskLeaderLine::onTrackerClicked(bool b) Q_UNUSED(b); // Base::Console().Message("TTL::onTrackerClicked() m_pbTrackerState: %d\n", // m_pbTrackerState); + if (!m_haveMdi) { + Base::Console().Message("TLL::onTrackerClicked - no Mdi, no Tracker!\n"); + return; + } + if ( (m_pbTrackerState == TRACKERSAVE) && (getCreateMode()) ){ if (m_tracker != nullptr) { @@ -479,6 +531,9 @@ void TaskLeaderLine::onTrackerClicked(bool b) void TaskLeaderLine::startTracker(void) { // Base::Console().Message("TTL::startTracker()\n"); + if (!m_haveMdi) { + return; + } if (m_trackerMode == QGTracker::TrackerMode::None) { return; } @@ -548,6 +603,9 @@ void TaskLeaderLine::onTrackerFinished(std::vector pts, QGIView* qgPare void TaskLeaderLine::removeTracker(void) { // Base::Console().Message("TTL::removeTracker()\n"); + if (!m_haveMdi) { + return; + } if ( (m_tracker != nullptr) && (m_tracker->scene() != nullptr) ) { m_scene->removeItem(m_tracker); @@ -590,6 +648,9 @@ QGIView* TaskLeaderLine::findParentQGIV() void TaskLeaderLine::setEditCursor(QCursor c) { + if (!m_haveMdi) { + return; + } if (m_baseFeat != nullptr) { QGIView* qgivBase = m_view->findQViewForDocObj(m_baseFeat); qgivBase->setCursor(c); @@ -711,7 +772,9 @@ bool TaskLeaderLine::accept() Gui::Command::doCommand(Gui::Command::Gui,"Gui.ActiveDocument.resetEdit()"); - m_mdi->setContextMenuPolicy(m_saveContextPolicy); + if (m_haveMdi) { + m_mdi->setContextMenuPolicy(m_saveContextPolicy); + } return true; } diff --git a/src/Mod/TechDraw/Gui/TaskLeaderLine.h b/src/Mod/TechDraw/Gui/TaskLeaderLine.h index 2c96d635b8..991ff0b0fa 100644 --- a/src/Mod/TechDraw/Gui/TaskLeaderLine.h +++ b/src/Mod/TechDraw/Gui/TaskLeaderLine.h @@ -158,6 +158,8 @@ private: std::vector m_savePoints; double m_saveX; double m_saveY; + + bool m_haveMdi; }; class TaskDlgLeaderLine : public Gui::TaskView::TaskDialog diff --git a/src/Mod/TechDraw/Gui/ViewProviderLeader.cpp b/src/Mod/TechDraw/Gui/ViewProviderLeader.cpp index ab73e140a0..f5b797c315 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderLeader.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderLeader.cpp @@ -27,6 +27,8 @@ #ifndef _PreComp_ #endif +#include + /// Here the FreeCAD includes sorted by Base,App,Gui...... #include #include @@ -96,7 +98,6 @@ bool ViewProviderLeader::setEdit(int ModNum) if (Gui::Control().activeDialog()) { //TaskPanel already open! return false; } - // clear the selection (convenience) Gui::Selection().clearSelection(); Gui::Control().showDialog(new TaskDlgLeaderLine(this)); return true;