diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index b4cdbfe83c..495b9d75f2 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -1029,7 +1029,7 @@ void MDIViewPage::clearSceneSelection() { // Base::Console().Message("MDIVP::clearSceneSelection()\n"); blockSelection(true); - qgSceneSelected.clear(); + m_qgSceneSelected.clear(); std::vector views = m_view->getViews(); @@ -1061,7 +1061,6 @@ void MDIViewPage::clearSceneSelection() //!Update QGIView's selection state based on Selection made outside Drawing Interface void MDIViewPage::selectQGIView(App::DocumentObject *obj, const bool isSelected) { -// Base::Console().Message("MDIVP::selectQGIV(%s) - %d\n", obj->getNameInDocument(), isSelected); QGIView *view = m_view->findQViewForDocObj(obj); blockSelection(true); @@ -1109,35 +1108,35 @@ void MDIViewPage::sceneSelectionManager() QList sceneSel = m_view->scene()->selectedItems(); if (sceneSel.isEmpty()) { - qgSceneSelected.clear(); //TODO: need to signal somebody? Tree? handled elsewhere + m_qgSceneSelected.clear(); //TODO: need to signal somebody? Tree? handled elsewhere //clearSelection return; } - if (qgSceneSelected.isEmpty() && + if (m_qgSceneSelected.isEmpty() && !sceneSel.isEmpty()) { - qgSceneSelected.push_back(sceneSel.front()); + m_qgSceneSelected.push_back(sceneSel.front()); return; } - //add to qgSceneSelected anything that is in q_sceneSel + //add to m_qgSceneSelected anything that is in q_sceneSel for (auto qts: sceneSel) { bool found = false; - for (auto ms: qgSceneSelected) { + for (auto ms: m_qgSceneSelected) { if ( qts == ms ) { found = true; break; } } if (!found) { - qgSceneSelected.push_back(qts); + m_qgSceneSelected.push_back(qts); break; } } - //remove items from qgSceneSelected that are not in q_sceneSel + //remove items from m_qgSceneSelected that are not in q_sceneSel QList m_new; - for (auto m: qgSceneSelected) { + for (auto m: m_qgSceneSelected) { for (auto q: sceneSel) { if (m == q) { m_new.push_back(m); @@ -1145,14 +1144,13 @@ void MDIViewPage::sceneSelectionManager() } } } - qgSceneSelected = m_new; + m_qgSceneSelected = m_new; } //! update Tree Selection from QGraphicsScene selection //triggered by m_view->scene() signal void MDIViewPage::sceneSelectionChanged() { -// Base::Console().Message("MDIVP::sceneSelctionChanged()\n"); sceneSelectionManager(); // QList dbsceneSel = m_view->scene()->selectedItems(); @@ -1162,8 +1160,7 @@ void MDIViewPage::sceneSelectionChanged() } std::vector treeSel = Gui::Selection().getSelectionEx(); -// QList sceneSel = m_view->scene()->selectedItems(); - QList sceneSel = qgSceneSelected; + QList sceneSel = m_qgSceneSelected; //check if really need to change selection bool sameSel = compareSelections(treeSel,sceneSel); @@ -1177,17 +1174,13 @@ void MDIViewPage::sceneSelectionChanged() //Note: Qt says: "no guarantee of selection order"!!! void MDIViewPage::setTreeToSceneSelect(void) { -// Base::Console().Message("MDIVP::setTreeToSceneSelect()\n"); bool saveBlock = blockConnection(true); // block selectionChanged signal from Tree/Observer blockSelection(true); Gui::Selection().clearSelection(); -// QList sceneSel = m_view->scene()->selectedItems(); //"no particular order"!!! - QList sceneSel = qgSceneSelected; + QList sceneSel = m_qgSceneSelected; for (QList::iterator it = sceneSel.begin(); it != sceneSel.end(); ++it) { QGIView *itemView = dynamic_cast(*it); if(itemView == 0) { -// Base::Console().Message("MDIVP::setTreeToScene - selection not QGIView - type: %d\n", -// (*it)->type() - QGraphicsItem::UserType); QGIEdge *edge = dynamic_cast(*it); if(edge) { QGraphicsItem*parent = edge->parentItem(); @@ -1260,30 +1253,50 @@ void MDIViewPage::setTreeToSceneSelect(void) continue; } + QGIDatumLabel *dimLabel = dynamic_cast(*it); + if(dimLabel) { + QGraphicsItem*dimParent = dimLabel->QGraphicsItem::parentItem(); + if(!dimParent) + continue; + + QGIView *dimItem = dynamic_cast(dimParent); + + if(!dimItem) + continue; + + TechDraw::DrawView *dimObj = dimItem->getViewObject(); + if (!dimObj) { + continue; + } + const char* name = dimObj->getNameInDocument(); + if (!name) { //can happen during undo/redo if Dim is selected??? + //Base::Console().Log("INFO - MDIVP::sceneSelectionChanged - dimObj name is null!\n"); + continue; + } + + //bool accepted = + static_cast (Gui::Selection().addSelection(dimObj->getDocument()->getName(),dimObj->getNameInDocument())); + } + QGMText *mText = dynamic_cast(*it); if(mText) { -// Base::Console().Message("MDIVP::setTreeToScene - mTextSelected!\n"); QGraphicsItem* textParent = mText->QGraphicsItem::parentItem(); if(!textParent) { -// Base::Console().Message("MDIVP::setTreeToScene - mText has no parent item\n"); continue; } QGIView *parent = dynamic_cast(textParent); if(!parent) { -// Base::Console().Message("MDIVP::setTreeToScene - mText parent is not QGIV\n"); continue; } TechDraw::DrawView *parentFeat = parent->getViewObject(); if (!parentFeat) { -// Base::Console().Message("MDIVP::setTreeToScene - mText has no parent Feature\n"); continue; } const char* name = parentFeat->getNameInDocument(); if (!name) { //can happen during undo/redo if Dim is selected??? -// Base::Console().Message("INFO - MDIVP::sceneSelectionChanged - parentFeat name is null!\n"); continue; } @@ -1292,8 +1305,6 @@ void MDIViewPage::setTreeToSceneSelect(void) } } else { -// Base::Console().Message("MDIVP::setTreeToScene - selection IS a QGIView - type: %d\n", -// itemView->type() - QGraphicsItem::UserType); TechDraw::DrawView *viewObj = itemView->getViewObject(); if (viewObj && !viewObj->isRemoving()) { @@ -1314,7 +1325,6 @@ void MDIViewPage::setTreeToSceneSelect(void) bool MDIViewPage::compareSelections(std::vector treeSel, QList sceneSel) { -// Base::Console().Message("MDIVP::compareSelections()\n"); bool result = true; if (treeSel.empty() && sceneSel.empty()) { @@ -1344,11 +1354,22 @@ bool MDIViewPage::compareSelections(std::vector treeSel, Q treeCount = treeNames.size(); for (auto sn:sceneSel){ - QGIView *itemView = dynamic_cast(sn); //<<<<< + QGIView *itemView = dynamic_cast(sn); if(itemView == 0) { + QGIDatumLabel* dl = dynamic_cast(sn); QGIPrimPath* pp = dynamic_cast(sn); //count Vertex/Edge/Face if (pp != nullptr) { ppCount++; + } else if (dl != nullptr) { + //get dim associated with this label + QGraphicsItem* qgi = dl->parentItem(); + if (qgi != nullptr) { + QGIViewDimension* vd = dynamic_cast(qgi); + if (vd != nullptr) { + std::string s = vd->getViewNameAsString(); + sceneNames.push_back(s); + } + } } } else { std::string s = itemView->getViewNameAsString(); diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.h b/src/Mod/TechDraw/Gui/MDIViewPage.h index 255595a3b5..8a8648a8e3 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.h +++ b/src/Mod/TechDraw/Gui/MDIViewPage.h @@ -163,7 +163,7 @@ private: QPrinter::PaperSize m_paperSize; ViewProviderPage *m_vpPage; - QList qgSceneSelected; + QList m_qgSceneSelected; //items in selection order QList deleteItems; }; diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp index 5f4a80839e..a666236fc0 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp @@ -104,6 +104,7 @@ QGIDatumLabel::QGIDatumLabel() setFlag(ItemIsMovable, true); setFlag(ItemIsSelectable, true); setAcceptHoverEvents(true); + setFiltersChildEvents(true); m_dimText = new QGCustomText(); m_dimText->setParentItem(this); @@ -124,10 +125,8 @@ QVariant QGIDatumLabel::itemChange(GraphicsItemChange change, const QVariant &va { if (change == ItemSelectedHasChanged && scene()) { if(isSelected()) { - Q_EMIT selected(true); setPrettySel(); } else { - Q_EMIT selected(false); setPrettyNormal(); } update(); @@ -434,6 +433,8 @@ QGIViewDimension::QGIViewDimension() : { setHandlesChildEvents(false); setFlag(QGraphicsItem::ItemIsMovable, false); + setFlag(QGraphicsItem::ItemIsSelectable, false); + setAcceptHoverEvents(false); setCacheMode(QGraphicsItem::NoCache); datumLabel = new QGIDatumLabel(); @@ -485,6 +486,7 @@ QVariant QGIViewDimension::itemChange(GraphicsItemChange change, const QVariant { if (change == ItemSelectedHasChanged && scene()) { if(isSelected()) { + setSelected(false); datumLabel->setSelected(true); } else { datumLabel->setSelected(false); @@ -507,8 +509,8 @@ void QGIViewDimension::setGroupSelection(bool b) void QGIViewDimension::select(bool state) { - setSelected(state); - draw(); +// setSelected(state); +// draw(); } //surrogate for hover enter (true), hover leave (false) events