diff --git a/src/meshlabplugins/edit_select/edit_select.cpp b/src/meshlabplugins/edit_select/edit_select.cpp index 988a013e8..2e580dfb3 100644 --- a/src/meshlabplugins/edit_select/edit_select.cpp +++ b/src/meshlabplugins/edit_select/edit_select.cpp @@ -43,13 +43,27 @@ const QString ExtraMeshEditPlugin::Info() { return tr("Interactive selection of faces inside a dragged rectangle in screen space"); } +void ExtraMeshEditPlugin::keyReleaseEvent (QKeyEvent *, MeshModel &/*m*/, GLArea *gla) +{ + gla->setCursor(QCursor(QPixmap(":/images/sel_rect.png"),1,1)); +} -void ExtraMeshEditPlugin::mousePressEvent(QMouseEvent * event, MeshModel &m, GLArea * gla) +void ExtraMeshEditPlugin::keyPressEvent (QKeyEvent *event, MeshModel &/*m*/, GLArea *gla) +{ + + if(QApplication::keyboardModifiers() == Qt::AltModifier) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_eye.png"),1,1)); + if(QApplication::keyboardModifiers() == Qt::ControlModifier) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_plus.png"),1,1)); + if(QApplication::keyboardModifiers() == Qt::ShiftModifier) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_minus.png"),1,1)); + if(QApplication::keyboardModifiers() == (Qt::AltModifier+Qt::ControlModifier)) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_plus_eye.png"),1,1)); + if(QApplication::keyboardModifiers() == (Qt::AltModifier+Qt::ShiftModifier)) gla->setCursor(QCursor(QPixmap(":/images/sel_rect_minus_eye.png"),1,1)); +} + +void ExtraMeshEditPlugin::mousePressEvent(QMouseEvent * event, MeshModel &m, GLArea *) { LastSel.clear(); - if(event->modifiers() == Qt::ControlModifier || - event->modifiers() == Qt::ShiftModifier ) + if((event->modifiers() & Qt::ControlModifier) || + (event->modifiers() & Qt::ShiftModifier) ) { CMeshO::FaceIterator fi; for(fi=m.cm.face.begin();fi!=m.cm.face.end();++fi) @@ -58,8 +72,11 @@ void ExtraMeshEditPlugin::mousePressEvent(QMouseEvent * event, MeshModel &m, GLA } selMode=SMClear; - if(event->modifiers()==Qt::ControlModifier) selMode=SMAdd; - if(event->modifiers()==Qt::ShiftModifier) selMode=SMSub; + if(event->modifiers() & Qt::ControlModifier) selMode=SMAdd; + if(event->modifiers() & Qt::ShiftModifier) selMode=SMSub; + + if(event->modifiers() & Qt::AltModifier) selectFrontFlag=true; + else selectFrontFlag=false; start=event->pos(); cur=start; @@ -149,40 +166,26 @@ void ExtraMeshEditPlugin::mousePressEvent(QMouseEvent * event, MeshModel &m, GLA if(wid.x()<0) wid.setX(-wid.x()); if(wid.y()<0) wid.setY(-wid.y()); - /* CMeshO::FaceIterator fi; - for(fi=m.cm.face.begin(),fpi=NewSel.begin();fpi!=NewSel.end();++fi) - if(!(*fi).IsD()) { - if(&(*fi)!=*fpi) (*fpi)->ClearS(); - else { - (*fpi)->SetS(); - ++fpi; - } - } - - for(;fi!=m.cm.face.end();++fi) - if(!(*fi).IsD()) (*fi).ClearS(); - -*/ - - CMeshO::FaceIterator fi; - for(fi=m.cm.face.begin();fi!=m.cm.face.end();++fi) - if(!(*fi).IsD()) (*fi).ClearS(); - glPushMatrix(); glMultMatrix(m.cm.Tr); - GLPickTri::PickFace(mid.x(), mid.y(), m.cm, NewSel, wid.x(), wid.y()); + if(selectFrontFlag) GLPickTri::PickFaceVisible(mid.x(), mid.y(), m.cm, NewSel, wid.x(), wid.y()); + else GLPickTri::PickFace(mid.x(), mid.y(), m.cm, NewSel, wid.x(), wid.y()); + qDebug("Pickface: rect %i %i - %i %i",mid.x(),mid.y(),wid.x(),wid.y()); qDebug("Pickface: Got %i on %i",int(NewSel.size()),int(m.cm.face.size())); glPopMatrix(); - switch(selMode) + tri::UpdateSelection::ClearFace(m.cm); + switch(selMode) { - case SMSub : // Subtract mode + case SMSub : // Subtract mode : The faces in the rect must be de-selected if(connectedMode) { for(fpi=NewSel.begin();fpi!=NewSel.end();++fpi) (*fpi)->SetS(); - NewSel.clear(); tri::UpdateSelection::FaceConnectedFF(m.cm); + + CMeshO::FaceIterator fi; + NewSel.clear(); for(fi=m.cm.face.begin();fi!=m.cm.face.end();++fi) if(!(*fi).IsD() && (*fi).IsS()) NewSel.push_back(&*fi); } @@ -219,5 +222,7 @@ void ExtraMeshEditPlugin::StartEdit(MeshModel &m, GLArea *gla ) connect(this, SIGNAL(setSelectionRendering(bool)),gla,SLOT(setSelectionRendering(bool)) ); setSelectionRendering(true); - m.updateDataMask(MeshModel::MM_FACEFACETOPO); + + if(connectedMode) + m.updateDataMask(MeshModel::MM_FACEFACETOPO); } diff --git a/src/meshlabplugins/edit_select/edit_select.h b/src/meshlabplugins/edit_select/edit_select.h index c4adb5c2d..5b01c69cb 100644 --- a/src/meshlabplugins/edit_select/edit_select.h +++ b/src/meshlabplugins/edit_select/edit_select.h @@ -47,6 +47,8 @@ public: virtual void mousePressEvent(QMouseEvent *event, MeshModel &/*m*/, GLArea * ); virtual void mouseMoveEvent(QMouseEvent *event, MeshModel &/*m*/, GLArea * ); virtual void mouseReleaseEvent(QMouseEvent *event, MeshModel &/*m*/, GLArea * ); + virtual void keyReleaseEvent (QKeyEvent *, MeshModel &/*m*/, GLArea *); + virtual void keyPressEvent (QKeyEvent *, MeshModel &/*m*/, GLArea *); QPoint start; QPoint cur; @@ -61,6 +63,7 @@ signals: private: typedef enum {SMAdd, SMClear,SMSub} SelMode; SelMode selMode; + bool selectFrontFlag; void DrawXORRect(GLArea * gla, bool doubleDraw); }; diff --git a/src/meshlabplugins/edit_select/edit_select.qrc b/src/meshlabplugins/edit_select/edit_select.qrc index 71e8f4cf6..71b4b6fb9 100644 --- a/src/meshlabplugins/edit_select/edit_select.qrc +++ b/src/meshlabplugins/edit_select/edit_select.qrc @@ -4,7 +4,10 @@ images/select_face_connected.png images/select_vertex.png images/sel_rect.png + images/sel_rect_eye.png images/sel_rect_plus.png images/sel_rect_minus.png + images/sel_rect_plus_eye.png + images/sel_rect_minus_eye.png diff --git a/src/meshlabplugins/edit_select/images/sel_rect.png b/src/meshlabplugins/edit_select/images/sel_rect.png index a2a28a25f..2fa9b8387 100644 Binary files a/src/meshlabplugins/edit_select/images/sel_rect.png and b/src/meshlabplugins/edit_select/images/sel_rect.png differ diff --git a/src/meshlabplugins/edit_select/images/sel_rect_eye.png b/src/meshlabplugins/edit_select/images/sel_rect_eye.png new file mode 100644 index 000000000..20e5eb481 Binary files /dev/null and b/src/meshlabplugins/edit_select/images/sel_rect_eye.png differ diff --git a/src/meshlabplugins/edit_select/images/sel_rect_minus.png b/src/meshlabplugins/edit_select/images/sel_rect_minus.png index bbfb389b9..253fcd290 100644 Binary files a/src/meshlabplugins/edit_select/images/sel_rect_minus.png and b/src/meshlabplugins/edit_select/images/sel_rect_minus.png differ diff --git a/src/meshlabplugins/edit_select/images/sel_rect_minus_eye.png b/src/meshlabplugins/edit_select/images/sel_rect_minus_eye.png new file mode 100644 index 000000000..0724e7a7c Binary files /dev/null and b/src/meshlabplugins/edit_select/images/sel_rect_minus_eye.png differ diff --git a/src/meshlabplugins/edit_select/images/sel_rect_plus.png b/src/meshlabplugins/edit_select/images/sel_rect_plus.png index 26d6ccac4..66e5b9f58 100644 Binary files a/src/meshlabplugins/edit_select/images/sel_rect_plus.png and b/src/meshlabplugins/edit_select/images/sel_rect_plus.png differ diff --git a/src/meshlabplugins/edit_select/images/sel_rect_plus_eye.png b/src/meshlabplugins/edit_select/images/sel_rect_plus_eye.png new file mode 100644 index 000000000..16304d2cc Binary files /dev/null and b/src/meshlabplugins/edit_select/images/sel_rect_plus_eye.png differ