[TD]Dim blocks selection of geometry

This commit is contained in:
wandererfan
2020-07-28 09:52:57 -04:00
committed by WandererFan
parent d95527ca50
commit 62a048fa33
3 changed files with 56 additions and 33 deletions

View File

@@ -1029,7 +1029,7 @@ void MDIViewPage::clearSceneSelection()
{
// Base::Console().Message("MDIVP::clearSceneSelection()\n");
blockSelection(true);
qgSceneSelected.clear();
m_qgSceneSelected.clear();
std::vector<QGIView *> 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<QGraphicsItem*> 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<QGraphicsItem*> 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<QGraphicsItem*> dbsceneSel = m_view->scene()->selectedItems();
@@ -1162,8 +1160,7 @@ void MDIViewPage::sceneSelectionChanged()
}
std::vector<Gui::SelectionObject> treeSel = Gui::Selection().getSelectionEx();
// QList<QGraphicsItem*> sceneSel = m_view->scene()->selectedItems();
QList<QGraphicsItem*> sceneSel = qgSceneSelected;
QList<QGraphicsItem*> 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<QGraphicsItem*> sceneSel = m_view->scene()->selectedItems(); //"no particular order"!!!
QList<QGraphicsItem*> sceneSel = qgSceneSelected;
QList<QGraphicsItem*> sceneSel = m_qgSceneSelected;
for (QList<QGraphicsItem*>::iterator it = sceneSel.begin(); it != sceneSel.end(); ++it) {
QGIView *itemView = dynamic_cast<QGIView *>(*it);
if(itemView == 0) {
// Base::Console().Message("MDIVP::setTreeToScene - selection not QGIView - type: %d\n",
// (*it)->type() - QGraphicsItem::UserType);
QGIEdge *edge = dynamic_cast<QGIEdge *>(*it);
if(edge) {
QGraphicsItem*parent = edge->parentItem();
@@ -1260,30 +1253,50 @@ void MDIViewPage::setTreeToSceneSelect(void)
continue;
}
QGIDatumLabel *dimLabel = dynamic_cast<QGIDatumLabel*>(*it);
if(dimLabel) {
QGraphicsItem*dimParent = dimLabel->QGraphicsItem::parentItem();
if(!dimParent)
continue;
QGIView *dimItem = dynamic_cast<QGIView *>(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<void> (Gui::Selection().addSelection(dimObj->getDocument()->getName(),dimObj->getNameInDocument()));
}
QGMText *mText = dynamic_cast<QGMText*>(*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<QGIView *>(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<Gui::SelectionObject> treeSel, QList<QGraphicsItem*> sceneSel)
{
// Base::Console().Message("MDIVP::compareSelections()\n");
bool result = true;
if (treeSel.empty() && sceneSel.empty()) {
@@ -1344,11 +1354,22 @@ bool MDIViewPage::compareSelections(std::vector<Gui::SelectionObject> treeSel, Q
treeCount = treeNames.size();
for (auto sn:sceneSel){
QGIView *itemView = dynamic_cast<QGIView *>(sn); //<<<<<
QGIView *itemView = dynamic_cast<QGIView *>(sn);
if(itemView == 0) {
QGIDatumLabel* dl = dynamic_cast<QGIDatumLabel*>(sn);
QGIPrimPath* pp = dynamic_cast<QGIPrimPath*>(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<QGIViewDimension*>(qgi);
if (vd != nullptr) {
std::string s = vd->getViewNameAsString();
sceneNames.push_back(s);
}
}
}
} else {
std::string s = itemView->getViewNameAsString();

View File

@@ -163,7 +163,7 @@ private:
QPrinter::PaperSize m_paperSize;
ViewProviderPage *m_vpPage;
QList<QGraphicsItem*> qgSceneSelected;
QList<QGraphicsItem*> m_qgSceneSelected; //items in selection order
QList<QGIView *> deleteItems;
};

View File

@@ -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