From 10b9229492b9e57648235173998d68c9a14c1610 Mon Sep 17 00:00:00 2001 From: wandererfan Date: Mon, 25 Mar 2024 21:51:47 -0400 Subject: [PATCH] [TD]fix fail on undo of cosmetic delete --- src/Mod/TechDraw/App/CosmeticExtension.cpp | 12 ++- src/Mod/TechDraw/Gui/QGIEdge.cpp | 7 +- src/Mod/TechDraw/Gui/QGIEdge.h | 4 + src/Mod/TechDraw/Gui/QGIPrimPath.cpp | 4 + src/Mod/TechDraw/Gui/QGIView.cpp | 1 + src/Mod/TechDraw/Gui/QGIViewPart.cpp | 80 +++++++++++++++++++- src/Mod/TechDraw/Gui/QGIViewPart.h | 3 + src/Mod/TechDraw/Gui/QGSPage.cpp | 5 ++ src/Mod/TechDraw/Gui/QGVNavStyle.cpp | 6 +- src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.cpp | 1 - src/Mod/TechDraw/Gui/ViewProviderPage.cpp | 1 + 11 files changed, 107 insertions(+), 17 deletions(-) diff --git a/src/Mod/TechDraw/App/CosmeticExtension.cpp b/src/Mod/TechDraw/App/CosmeticExtension.cpp index f2174423a420..db5f6aae504e 100644 --- a/src/Mod/TechDraw/App/CosmeticExtension.cpp +++ b/src/Mod/TechDraw/App/CosmeticExtension.cpp @@ -349,7 +349,7 @@ TechDraw::CosmeticEdge* CosmeticExtension::getCosmeticEdge(const std::string& ta /// used when selecting TechDraw::CosmeticEdge* CosmeticExtension::getCosmeticEdgeBySelection(const std::string& name) const { -// Base::Console().Message("CEx::getCEBySelection(%s)\n", name.c_str()); + // Base::Console().Message("CEx::getCEBySelection(%s)\n", name.c_str()); App::DocumentObject* extObj = const_cast (getExtendedObject()); TechDraw::DrawViewPart* dvp = dynamic_cast(extObj); if (!dvp) { @@ -367,7 +367,7 @@ TechDraw::CosmeticEdge* CosmeticExtension::getCosmeticEdgeBySelection(const std: /// find the cosmetic edge corresponding to the input parameter (the 5 in Edge5) TechDraw::CosmeticEdge* CosmeticExtension::getCosmeticEdgeBySelection(int i) const { -// Base::Console().Message("CEx::getCEBySelection(%d)\n", i); + // Base::Console().Message("CEx::getCEBySelection(%d)\n", i); std::stringstream edgeName; edgeName << "Edge" << i; return getCosmeticEdgeBySelection(edgeName.str()); @@ -376,7 +376,7 @@ TechDraw::CosmeticEdge* CosmeticExtension::getCosmeticEdgeBySelection(int i) con /// remove the cosmetic edge with the given tag from the list property void CosmeticExtension::removeCosmeticEdge(const std::string& delTag) { -// Base::Console().Message("DVP::removeCE(%s)\n", delTag.c_str()); + // Base::Console().Message("DVP::removeCE(%s)\n", delTag.c_str()); std::vector cEdges = CosmeticEdges.getValues(); std::vector newEdges; for (auto& ce: cEdges) { @@ -420,7 +420,6 @@ int CosmeticExtension::add1CLToGE(const std::string& tag) return -1; } TechDraw::BaseGeomPtr scaledGeom = cl->scaledAndRotatedGeometry(getOwner()); -// TechDraw::BaseGeomPtr scaledGeom = cl->scaledGeometry(getOwner()); int iGE = getOwner()->getGeometryObject()->addCenterLine(scaledGeom, tag); return iGE; @@ -429,7 +428,7 @@ int CosmeticExtension::add1CLToGE(const std::string& tag) //update Edge geometry with current CL's void CosmeticExtension::refreshCLGeoms() { - // Base::Console().Message("CE::refreshCLGeoms()\n"); + // Base::Console().Message("CE::refreshCLGeoms()\n"); std::vector gEdges = getOwner()->getEdgeGeometry(); std::vector newGEdges; for (auto& ge : gEdges) { @@ -447,7 +446,6 @@ void CosmeticExtension::addCenterLinesToGeom() // Base::Console().Message("CE::addCenterLinesToGeom()\n"); const std::vector lines = CenterLines.getValues(); for (auto& cl : lines) { -// TechDraw::BaseGeomPtr scaledGeom = cl->scaledGeometry(getOwner()); TechDraw::BaseGeomPtr scaledGeom = cl->scaledAndRotatedGeometry(getOwner()); if (!scaledGeom) { Base::Console().Error("CE::addCenterLinesToGeom - scaledGeometry is null\n"); @@ -536,7 +534,7 @@ TechDraw::CenterLine* CosmeticExtension::getCenterLineBySelection(int i) const void CosmeticExtension::removeCenterLine(const std::string& delTag) { -// Base::Console().Message("DVP::removeCL(%s)\n", delTag.c_str()); + // Base::Console().Message("DVP::removeCL(%s)\n", delTag.c_str()); std::vector cLines = CenterLines.getValues(); std::vector newLines; for (auto& cl: cLines) { diff --git a/src/Mod/TechDraw/Gui/QGIEdge.cpp b/src/Mod/TechDraw/Gui/QGIEdge.cpp index c39c758138cb..a1063ad56676 100644 --- a/src/Mod/TechDraw/Gui/QGIEdge.cpp +++ b/src/Mod/TechDraw/Gui/QGIEdge.cpp @@ -21,9 +21,8 @@ ***************************************************************************/ #include "PreCompiled.h" -#ifndef _PreComp_ -# include +#ifndef _PreComp_ # include # include #endif @@ -34,7 +33,6 @@ #include #include #include -#include #include "QGIEdge.h" #include "PreferencesGui.h" @@ -50,6 +48,9 @@ QGIEdge::QGIEdge(int index) : isHiddenEdge(false), isSmoothEdge(false) { + setFlag(QGraphicsItem::ItemIsFocusable, true); // to get key press events + setFlag(QGraphicsItem::ItemIsSelectable, true); + m_width = 1.0; setCosmetic(isCosmetic); setFill(Qt::NoBrush); diff --git a/src/Mod/TechDraw/Gui/QGIEdge.h b/src/Mod/TechDraw/Gui/QGIEdge.h index 8c76cdf729e7..ff898ec8144f 100644 --- a/src/Mod/TechDraw/Gui/QGIEdge.h +++ b/src/Mod/TechDraw/Gui/QGIEdge.h @@ -55,6 +55,9 @@ class TechDrawGuiExport QGIEdge : public QGIPrimPath void setLinePen(QPen isoPen); + void setSource(int source) { m_source = source; } + int getSource() const { return m_source;} + protected: @@ -71,6 +74,7 @@ class TechDrawGuiExport QGIEdge : public QGIPrimPath Qt::PenStyle getHiddenStyle(); private: + int m_source{0}; }; } diff --git a/src/Mod/TechDraw/Gui/QGIPrimPath.cpp b/src/Mod/TechDraw/Gui/QGIPrimPath.cpp index 27cc9719e866..3220ee5dd02c 100644 --- a/src/Mod/TechDraw/Gui/QGIPrimPath.cpp +++ b/src/Mod/TechDraw/Gui/QGIPrimPath.cpp @@ -53,6 +53,8 @@ QGIPrimPath::QGIPrimPath(): setCacheMode(QGraphicsItem::NoCache); setFlag(QGraphicsItem::ItemIsSelectable, true); setFlag(QGraphicsItem::ItemIsMovable, false); + setFlag(QGraphicsItem::ItemIsFocusable, true); // to get key press events + setFlag(QGraphicsItem::ItemSendsScenePositionChanges, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setAcceptHoverEvents(true); @@ -86,6 +88,7 @@ QVariant QGIPrimPath::itemChange(GraphicsItemChange change, const QVariant &valu if (change == ItemSelectedHasChanged && scene()) { if(isSelected()) { setPrettySel(); + setFocus(); } else { setPrettyNormal(); } @@ -98,6 +101,7 @@ void QGIPrimPath::hoverEnterEvent(QGraphicsSceneHoverEvent *event) if (!isSelected()) { setPrettyPre(); } + setFocus(); QGraphicsPathItem::hoverEnterEvent(event); } diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index 17d801c2614d..5288fb5890ef 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -250,6 +250,7 @@ void QGIView::hoverEnterEvent(QGraphicsSceneHoverEvent *event) // TODO don't like this but only solution at the minute (MLP) if (isSelected()) { m_colCurrent = getSelectColor(); + setFocus(); } else { m_colCurrent = getPreColor(); } diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.cpp b/src/Mod/TechDraw/Gui/QGIViewPart.cpp index d84cbb314cbb..349ee5992abe 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewPart.cpp @@ -25,6 +25,7 @@ #include #include +#include #include #endif// #ifndef _PreComp_ @@ -33,6 +34,7 @@ #include #include #include +#include #include #include #include @@ -83,6 +85,7 @@ QGIViewPart::QGIViewPart() setFlag(QGraphicsItem::ItemIsMovable, true); setFlag(QGraphicsItem::ItemSendsScenePositionChanges, true); setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); + setFlag(QGraphicsItem::ItemIsFocusable, true); showSection = false; m_pathBuilder = new PathBuilder(this); @@ -107,6 +110,77 @@ QVariant QGIViewPart::itemChange(GraphicsItemChange change, const QVariant& valu return QGIView::itemChange(change, value); } +bool QGIViewPart::sceneEventFilter(QGraphicsItem *watched, QEvent *event) +{ + // Base::Console().Message("QGIVP::sceneEventFilter - event: %d watchedtype: %d\n", + // event->type(), watched->type() - QGraphicsItem::UserType); + if (event->type() == QEvent::ShortcutOverride) { + // if we accept this event, we should get a regular keystroke event next + // which will be processed by QGVPage/QGVNavStyle keypress logic, but not forwarded to + // Std_Delete + QKeyEvent *keyEvent = static_cast(event); + if (keyEvent->key() == Qt::Key_Delete) { + bool success = removeSelectedCosmetic(); + if (success) { + updateView(true); + event->accept(); + return true; + } + } + } + + return QGraphicsItem::sceneEventFilter(watched, event); +} + +//! called when a DEL shortcut event is received. If a cosmetic edge or vertex is +//! selected, remove it from the view. +bool QGIViewPart::removeSelectedCosmetic() const +{ + // Base::Console().Message("QGIVP::removeSelectedCosmetic()\n"); + char* defaultDocument{nullptr}; + std::vector selectionAll = Gui::Selection().getSelectionEx( + defaultDocument, TechDraw::DrawViewPart::getClassTypeId(), Gui::ResolveMode::NoResolve); + if (selectionAll.empty()) { + return false; + } + Gui::SelectionObject firstSelection = selectionAll.front(); + App::DocumentObject* firstObject = selectionAll.front().getObject(); + std::vector subElements = selectionAll.front().getSubNames(); + if (subElements.empty()) { + return false; + } + auto dvp = static_cast(firstObject); + auto subelement = subElements.front(); + std::string geomName = DU::getGeomTypeFromName(subelement); + int index = DU::getIndexFromName(subelement); + if (geomName == "Edge") { + TechDraw::BaseGeomPtr base = dvp->getGeomByIndex(index); + if (!base || base->getCosmeticTag().empty()) { + return false; + } + if (base->source() == COSMETICEDGE) { + dvp->removeCosmeticEdge(base->getCosmeticTag()); + dvp->refreshCEGeoms(); + } else if (base->source() == CENTERLINE) { + dvp->removeCenterLine(base->getCosmeticTag()); + dvp->refreshCLGeoms(); + } else { + Base::Console().Message("QGIVP::removeSelectedCosmetic - not a CE or a CL\n"); + return false; + } + } else if (geomName == "Vertex") { + VertexPtr vert = dvp->getProjVertexByIndex(index); + if (!vert || vert->getCosmeticTag().empty() ) { + return false; + } + dvp->removeCosmeticVertex(vert->getCosmeticTag()); + dvp->refreshCVGeoms(); + } + + return true; +} + + //obs? void QGIViewPart::tidy() { @@ -133,7 +207,7 @@ QPainterPath QGIViewPart::drawPainterPath(TechDraw::BaseGeomPtr baseGeom) const void QGIViewPart::updateView(bool update) { - // Base::Console().Message("QGIVP::updateView() - %s\n", getViewObject()->getNameInDocument()); + // Base::Console().Message("QGIVP::updateView() - %s\n", getViewObject()->getNameInDocument()); auto viewPart(dynamic_cast(getViewObject())); if (!viewPart) return; @@ -305,6 +379,7 @@ void QGIViewPart::drawAllEdges() item = new QGIEdge(iEdge); addToGroup(item); //item is created at scene(0, 0), not group(0, 0) item->setPath(drawPainterPath(*itGeom)); + item->setSource((*itGeom)->source()); item->setNormalColor(PreferencesGui::getAccessibleQColor(PreferencesGui::normalQColor())); if ((*itGeom)->getCosmetic()) { @@ -1025,6 +1100,7 @@ QGIViewPart::faceIsGeomHatched(int i, std::vector geom } + void QGIViewPart::dumpPath(const char* text, QPainterPath path) { QPainterPath::Element elem; @@ -1066,8 +1142,6 @@ void QGIViewPart::paint(QPainter* painter, const QStyleOptionGraphicsItem* optio QGIView::paint(painter, &myOption, widget); } - - //QGIViewPart derived classes do not need a rotate view method as rotation is handled on App side. void QGIViewPart::rotateView() {} diff --git a/src/Mod/TechDraw/Gui/QGIViewPart.h b/src/Mod/TechDraw/Gui/QGIViewPart.h index f804e0ca0976..b4054370d176 100644 --- a/src/Mod/TechDraw/Gui/QGIViewPart.h +++ b/src/Mod/TechDraw/Gui/QGIViewPart.h @@ -63,6 +63,7 @@ class TechDrawGuiExport QGIViewPart : public QGIView void paint( QPainter * painter, const QStyleOptionGraphicsItem * option, QWidget * widget = nullptr ) override; + bool sceneEventFilter(QGraphicsItem *watched, QEvent *event) override; void toggleCache(bool state) override; @@ -115,6 +116,8 @@ class TechDrawGuiExport QGIViewPart : public QGIView virtual QGraphicsItem *getQGISubItemByName(const std::string &subName) const; + virtual bool removeSelectedCosmetic() const; + protected: QPainterPath drawPainterPath(TechDraw::BaseGeomPtr baseGeom) const; void drawViewPart(); diff --git a/src/Mod/TechDraw/Gui/QGSPage.cpp b/src/Mod/TechDraw/Gui/QGSPage.cpp index 05199449b234..c7c32bc34d10 100644 --- a/src/Mod/TechDraw/Gui/QGSPage.cpp +++ b/src/Mod/TechDraw/Gui/QGSPage.cpp @@ -393,6 +393,8 @@ QGIView* QGSPage::addViewPart(TechDraw::DrawViewPart* partFeat) viewPart->setViewPartFeature(partFeat); addQView(viewPart); + // we need to install an event filter for any views derived from DrawViewPart + viewPart->installSceneEventFilter(viewPart); return viewPart; } @@ -403,6 +405,7 @@ QGIView* QGSPage::addViewSection(DrawViewSection* sectionFeat) viewSection->setViewPartFeature(sectionFeat); addQView(viewSection); + viewSection->installSceneEventFilter(viewSection); return viewSection; } @@ -413,6 +416,8 @@ QGIView* QGSPage::addProjectionGroup(TechDraw::DrawProjGroup* projGroupFeat) qview->setViewFeature(projGroupFeat); addQView(qview); + qview->installSceneEventFilter(qview); + return qview; } diff --git a/src/Mod/TechDraw/Gui/QGVNavStyle.cpp b/src/Mod/TechDraw/Gui/QGVNavStyle.cpp index e5bb2088a975..e145b30814df 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyle.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyle.cpp @@ -109,7 +109,7 @@ void QGVNavStyle::handleFocusOutEvent(QFocusEvent* event) void QGVNavStyle::handleKeyPressEvent(QKeyEvent* event) { -// Base::Console().Message("QGNS::handleKeyPressEvent(%d)\n", event->key()); + // Base::Console().Message("QGNS::handleKeyPressEvent(%d)\n", event->key()); if (event->modifiers().testFlag(Qt::ControlModifier)) { switch (event->key()) { case Qt::Key_Plus: { @@ -165,11 +165,11 @@ void QGVNavStyle::handleKeyPressEvent(QKeyEvent* event) } } } + event->ignore(); } void QGVNavStyle::handleKeyReleaseEvent(QKeyEvent* event) { - // Q_UNUSED(event); if (event->modifiers().testFlag(Qt::NoModifier)) { switch (event->key()) { case Qt::Key_Shift: { @@ -214,7 +214,7 @@ void QGVNavStyle::handleLeaveEvent(QEvent* event) void QGVNavStyle::handleMousePressEvent(QMouseEvent* event) { - // Base::Console().Message("QGVNS::handleMousePressEvent()\n"); + // Base::Console().Message("QGVNS::handleMousePressEvent()\n"); if (!panningActive && (event->button() == Qt::MiddleButton)) { startPan(event->pos()); event->accept(); diff --git a/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.cpp b/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.cpp index e0867756137a..a294003738a7 100644 --- a/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.cpp +++ b/src/Mod/TechDraw/Gui/QGVNavStyleTouchpad.cpp @@ -46,7 +46,6 @@ QGVNavStyleTouchpad::~QGVNavStyleTouchpad() void QGVNavStyleTouchpad::handleKeyPressEvent(QKeyEvent *event) { -// Q_UNUSED(event) if (event->key() == Qt::Key_PageUp) { zoomIn(); event->accept(); diff --git a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp index ddd5c3dd07d4..488facd56196 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderPage.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderPage.cpp @@ -340,6 +340,7 @@ void ViewProviderPage::createMDIViewPage() m_mdiView->setWindowIcon(Gui::BitmapFactory().pixmap("TechDraw_TreePage")); Gui::getMainWindow()->addWindow(m_mdiView); Gui::getMainWindow()->setActiveWindow(m_mdiView); + m_graphicsView->setFocus(); } //NOTE: removing MDIViewPage (parent) destroys QGVPage (eventually)