diff --git a/src/Mod/TechDraw/Gui/QGILeaderLine.cpp b/src/Mod/TechDraw/Gui/QGILeaderLine.cpp index 27bf726199..a8b6a2867e 100644 --- a/src/Mod/TechDraw/Gui/QGILeaderLine.cpp +++ b/src/Mod/TechDraw/Gui/QGILeaderLine.cpp @@ -71,11 +71,9 @@ using namespace TechDrawGui; //************************************************************** -QGILeaderLine::QGILeaderLine(QGraphicsItem* myParent, - TechDraw::DrawLeaderLine* leader) : - m_parentItem(myParent), +QGILeaderLine::QGILeaderLine() : m_lineColor(Qt::black), -// m_hasHover(false), + m_hasHover(false), m_blockDraw(false) { @@ -90,15 +88,11 @@ QGILeaderLine::QGILeaderLine(QGraphicsItem* myParent, m_line = new QGIPrimPath(); addToGroup(m_line); - m_line->setNormalColor(getNormalColor()); m_line->setFlag(QGraphicsItem::ItemIsSelectable, false); m_line->setAcceptHoverEvents(false); - m_line->setPrettyNormal(); m_line->setPos(0.0,0.0); m_editPath = new QGEPath(this); - m_editPath->setNormalColor(getNormalColor()); - addToGroup(m_editPath); m_editPath->setPos(0.0, 0.0); m_editPath->setFlag(QGraphicsItem::ItemIsSelectable, false); @@ -109,30 +103,34 @@ QGILeaderLine::QGILeaderLine(QGraphicsItem* myParent, m_arrow1 = new QGIArrow(); addToGroup(m_arrow1); - m_arrow1->setNormalColor(getNormalColor()); - m_arrow1->setFillColor(getNormalColor()); - m_arrow1->setPrettyNormal(); m_arrow1->setPos(0.0,0.0); m_arrow1->hide(); m_arrow2 = new QGIArrow(); addToGroup(m_arrow2); - m_arrow2->setNormalColor(getNormalColor()); - m_arrow2->setFillColor(getNormalColor()); - m_arrow2->setPrettyNormal(); m_arrow2->setPos(0.0, 0.0); m_arrow2->hide(); - setParentItem(m_parentItem); - - setViewFeature(leader); - setZValue(ZVALUE::DIMENSION); QObject::connect( m_editPath, SIGNAL(pointsUpdated(QPointF, std::vector)), this , SLOT (onLineEditFinished(QPointF, std::vector)) ); +} +void QGILeaderLine::setLeaderFeature(TechDraw::DrawLeaderLine* feat) +{ +// Base::Console().Message("QGILL::setLeaderFeature()\n"); + setViewFeature(static_cast(feat)); + + float x = Rez::guiX(feat->X.getValue()); + float y = Rez::guiX(-feat->Y.getValue()); + setPos(x,y); + + setNormalColorAll(); + setPrettyNormal(); + + updateView(); } QVariant QGILeaderLine::itemChange(GraphicsItemChange change, const QVariant &value) @@ -173,6 +171,7 @@ void QGILeaderLine::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) void QGILeaderLine::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { // Base::Console().Message("QGILL::hoverEnter() - selected; %d\n",isSelected()); + m_hasHover = true; if (!isSelected()) { setPrettyPre(); } @@ -182,10 +181,10 @@ void QGILeaderLine::hoverEnterEvent(QGraphicsSceneHoverEvent *event) void QGILeaderLine::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { // Base::Console().Message("QGILL::hoverLeave() - selected; %d\n",isSelected()); + m_hasHover = false; if(!isSelected()) { setPrettyNormal(); } - QGIView::hoverLeaveEvent(event); } @@ -203,6 +202,17 @@ void QGILeaderLine::onSourceChange(TechDraw::DrawView* newParent) } } +void QGILeaderLine::setNormalColorAll() +{ +// Base::Console().Message("QGILL::setNormalColorAll - normal color: %s\n", qPrintable(getNormalColor().name())); + m_line->setNormalColor(getNormalColor()); + m_editPath->setNormalColor(getNormalColor()); + m_arrow1->setNormalColor(getNormalColor()); + m_arrow1->setFillColor(getNormalColor()); + m_arrow2->setNormalColor(getNormalColor()); + m_arrow2->setFillColor(getNormalColor()); +} + void QGILeaderLine::setPrettyNormal() { // Base::Console().Message("QGILL::setPrettyNormal()\n"); m_line->setPrettyNormal(); @@ -341,27 +351,22 @@ void QGILeaderLine::draw() { // Base::Console().Message("QGILL::draw()- %s\n", getViewObject()->getNameInDocument()); if (m_blockDraw) { -// Base::Console().Message("QGIL::draw - block draw\n"); return; } if (!isVisible()) { -// Base::Console().Message("QGIL::draw - not visible\n"); return; } TechDraw::DrawLeaderLine* featLeader = getFeature(); if((!featLeader) ) { -// Base::Console().Message("QGIL::draw - no feature\n"); return; } auto vp = static_cast(getViewProvider(getViewObject())); if ( vp == nullptr ) { -// Base::Console().Message("QGIL::draw - no viewprovider\n"); return; } TechDraw::DrawView* parent = featLeader->getBaseView(); if (m_editPath->inEdit()) { -// Base::Console().Message("QGIL::draw - m_editPath in edit\n"); return; } @@ -385,7 +390,6 @@ void QGILeaderLine::draw() m_line->setStyle(m_lineStyle); m_line->setWidth(getLineWidth()); - m_line->setNormalColor(getNormalColor()); m_line->setPos(0,0); //make m_line coords == leader coords std::vector qPoints = getWayPointsFromFeature(); @@ -394,10 +398,18 @@ void QGILeaderLine::draw() p = p * scale; } } - m_line->setPath(makeLeaderPath(qPoints)); - m_line->show(); + setNormalColorAll(); + m_line->setPath(makeLeaderPath(qPoints)); setArrows(qPoints); + + if (isSelected()) { + setPrettySel(); + } else if (m_hasHover) { + setPrettyPre(); + } else { + setPrettyNormal(); + } } QPainterPath QGILeaderLine::makeLeaderPath(std::vector qPoints) @@ -485,6 +497,7 @@ std::vector QGILeaderLine::getWayPointsFromFeature(void) void QGILeaderLine::setArrows(std::vector pathPoints) { +// Base::Console().Message("QGILL::setArrows()\n"); Base::Vector3d stdX(1.0,0.0,0.0); TechDraw::DrawLeaderLine* featLeader = getFeature(); @@ -497,8 +510,6 @@ void QGILeaderLine::setArrows(std::vector pathPoints) m_arrow1->setSize(QGIArrow::getPrefArrowSize()); m_arrow1->setDirMode(true); m_arrow1->setDirection(stdX); - m_arrow1->setNormalColor(getNormalColor()); - m_arrow1->setFillColor(getNormalColor()); if (pathPoints.size() > 1) { auto it = pathPoints.begin(); QPointF s = (*it); @@ -519,8 +530,6 @@ void QGILeaderLine::setArrows(std::vector pathPoints) m_arrow2->setWidth(getLineWidth()); m_arrow2->setDirMode(true); m_arrow2->setDirection(-stdX); - m_arrow2->setNormalColor(getNormalColor()); - m_arrow2->setFillColor(getNormalColor()); if (pathPoints.size() > 1) { auto itr = pathPoints.rbegin(); QPointF s = (*itr); @@ -580,6 +589,7 @@ double QGILeaderLine::getEdgeFuzz(void) const QColor QGILeaderLine::getNormalColor() { +// Base::Console().Message("QGILL::getNormalColor()\n"); Base::Reference hGrp = App::GetApplication().GetUserParameter() .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/LeaderLinens"); App::Color fcColor; @@ -587,11 +597,14 @@ QColor QGILeaderLine::getNormalColor() m_colNormal = fcColor.asValue(); auto lead( dynamic_cast(getViewObject()) ); - if( lead == nullptr ) + if( lead == nullptr ) { +// Base::Console().Message("QGILL::getNormalColor - no feature\n"); return m_colNormal; + } auto vp = static_cast(getViewProvider(getViewObject())); if ( vp == nullptr ) { +// Base::Console().Message("QGILL::getNormalColor - no viewProvider\n"); return m_colNormal; } diff --git a/src/Mod/TechDraw/Gui/QGILeaderLine.h b/src/Mod/TechDraw/Gui/QGILeaderLine.h index fc0767cb1d..8c2269eccb 100644 --- a/src/Mod/TechDraw/Gui/QGILeaderLine.h +++ b/src/Mod/TechDraw/Gui/QGILeaderLine.h @@ -57,8 +57,7 @@ class TechDrawGuiExport QGILeaderLine : public QGIView public: enum {Type = QGraphicsItem::UserType + 232}; - explicit QGILeaderLine(QGraphicsItem* myParent = nullptr, - TechDraw::DrawLeaderLine* lead = nullptr); + explicit QGILeaderLine(); ~QGILeaderLine() = default; int type() const override { return Type;} @@ -92,6 +91,8 @@ public: void setPrettyPre(); void setPrettySel(); + void setLeaderFeature(TechDraw::DrawLeaderLine* feat); + public Q_SLOTS: void onLineEditFinished(QPointF attach, std::vector deltas); //QGEPath is finished editing points virtual void onSourceChange(TechDraw::DrawView* newParent) override; @@ -114,6 +115,7 @@ protected: protected: QColor getNormalColor() override; + void setNormalColorAll(); QGraphicsItem* m_parentItem; QGIPrimPath* m_line; //actual leader line diff --git a/src/Mod/TechDraw/Gui/QGVPage.cpp b/src/Mod/TechDraw/Gui/QGVPage.cpp index 607a5c1742..21cdddcf4d 100644 --- a/src/Mod/TechDraw/Gui/QGVPage.cpp +++ b/src/Mod/TechDraw/Gui/QGVPage.cpp @@ -496,33 +496,30 @@ void QGVPage::addDimToParent(QGIViewDimension* dim, QGIView* parent) QGIView * QGVPage::addViewLeader(TechDraw::DrawLeaderLine *leader) { // Base::Console().Message("QGVP::addViewLeader(%s)\n",leader->getNameInDocument()); - QGILeaderLine* leaderGroup = nullptr; + QGILeaderLine* leaderGroup = new QGILeaderLine(); - App::DocumentObject* parentObj = leader->LeaderParent.getValue(); - TechDraw::DrawView* parentDV = dynamic_cast(parentObj); + auto ourScene( scene() ); + ourScene->addItem(leaderGroup); - //NOTE: if Leaders are ever allowed to not be attached to a View, this next bit will have to change - if (parentDV != nullptr) { - QGIView* parentQV = findQViewForDocObj(parentObj); - if (parentQV != nullptr) { - leaderGroup = new QGILeaderLine(parentQV, leader); - leaderGroup->updateView(true); //this is different from everybody else, - //but it works. - return leaderGroup; - } - } else { - throw Base::TypeError("QGVP::addViewLeader - parent DV has no QGIV"); + leaderGroup->setLeaderFeature(leader); + + QGIView *parent = 0; + parent = findParent(leaderGroup); + + if(parent) { + addLeaderToParent(leaderGroup,parent); } - return nullptr; + + leaderGroup->updateView(true); + + return leaderGroup; } -//assign leader to correct parent if not already so void QGVPage::addLeaderToParent(QGILeaderLine* lead, QGIView* parent) { - QGraphicsItem* qgiParent = lead->parentItem(); - if (qgiParent != parent) { - parent->addToGroup(lead); - } +// Base::Console().Message("QGVP::addLeaderToParent()\n"); + parent->addToGroup(lead); + lead->setZValue(ZVALUE::DIMENSION); } QGIView * QGVPage::addRichAnno(TechDraw::DrawRichAnno* anno) diff --git a/src/Mod/TechDraw/Gui/TaskLeaderLine.cpp b/src/Mod/TechDraw/Gui/TaskLeaderLine.cpp index 2f450a2796..5c03405863 100644 --- a/src/Mod/TechDraw/Gui/TaskLeaderLine.cpp +++ b/src/Mod/TechDraw/Gui/TaskLeaderLine.cpp @@ -210,7 +210,7 @@ void TaskLeaderLine::changeEvent(QEvent *e) void TaskLeaderLine::setUiPrimary() { // Base::Console().Message("TTL::setUiPrimary()\n"); - enableVPUi(false); + enableVPUi(true); setWindowTitle(QObject::tr("New Leader Line")); if (m_baseFeat != nullptr) { @@ -224,6 +224,8 @@ void TaskLeaderLine::setUiPrimary() ui->cboxStartSym->setCurrentIndex(aSize); } +//switch widgets related to ViewProvider on/off +//there is no ViewProvider until some time after feature is created. void TaskLeaderLine::enableVPUi(bool b) { ui->cpLineColor->setEnabled(b); @@ -287,7 +289,19 @@ void TaskLeaderLine::createLeaderFeature(std::vector converted) } commonFeatureUpdate(); } - + + if (m_lineFeat != nullptr) { + Gui::ViewProvider* vp = QGIView::getViewProvider(m_lineFeat); + auto leadVP = dynamic_cast(vp); + if ( leadVP != nullptr ) { + App::Color ac; + ac.setValue(ui->cpLineColor->color()); + leadVP->Color.setValue(ac); + leadVP->LineWidth.setValue(ui->dsbWeight->value()); + leadVP->LineStyle.setValue(ui->cboxStyle->currentIndex()); + } + } + Gui::Command::updateActive(); Gui::Command::commitCommand(); m_lineFeat->requestPaint(); @@ -305,7 +319,12 @@ void TaskLeaderLine::updateLeaderFeature(void) m_lineVP->LineWidth.setValue(ui->dsbWeight->value()); m_lineVP->LineStyle.setValue(ui->cboxStyle->currentIndex()); + Gui::Command::updateActive(); Gui::Command::commitCommand(); + + if (m_baseFeat != nullptr) { + m_baseFeat->requestPaint(); + } m_lineFeat->requestPaint(); }