Skip to content

Commit

Permalink
[TD]Dim blocks selection of geometry
Browse files Browse the repository at this point in the history
  • Loading branch information
WandererFan committed Jul 28, 2020
1 parent 4bfa602 commit 980ecc8
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 33 deletions.
77 changes: 49 additions & 28 deletions src/Mod/TechDraw/Gui/MDIViewPage.cpp
Expand Up @@ -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();

Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -1109,50 +1108,49 @@ 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);
break;
}
}
}
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();
Expand All @@ -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);
Expand All @@ -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();
Expand Down Expand Up @@ -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;
}

Expand All @@ -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()) {
Expand All @@ -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()) {
Expand Down Expand Up @@ -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();
Expand Down
2 changes: 1 addition & 1 deletion src/Mod/TechDraw/Gui/MDIViewPage.h
Expand Up @@ -163,7 +163,7 @@ public Q_SLOTS:
QPrinter::PaperSize m_paperSize;
ViewProviderPage *m_vpPage;

QList<QGraphicsItem*> qgSceneSelected;
QList<QGraphicsItem*> m_qgSceneSelected; //items in selection order
QList<QGIView *> deleteItems;
};

Expand Down
10 changes: 6 additions & 4 deletions src/Mod/TechDraw/Gui/QGIViewDimension.cpp
Expand Up @@ -104,6 +104,7 @@ QGIDatumLabel::QGIDatumLabel()
setFlag(ItemIsMovable, true);
setFlag(ItemIsSelectable, true);
setAcceptHoverEvents(true);
setFiltersChildEvents(true);

m_dimText = new QGCustomText();
m_dimText->setParentItem(this);
Expand All @@ -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();
Expand Down Expand Up @@ -434,6 +433,8 @@ QGIViewDimension::QGIViewDimension() :
{
setHandlesChildEvents(false);
setFlag(QGraphicsItem::ItemIsMovable, false);
setFlag(QGraphicsItem::ItemIsSelectable, false);
setAcceptHoverEvents(false);
setCacheMode(QGraphicsItem::NoCache);

datumLabel = new QGIDatumLabel();
Expand Down Expand Up @@ -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);
Expand All @@ -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
Expand Down

0 comments on commit 980ecc8

Please sign in to comment.