[TD]Dim blocks selection of geometry
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user