From b7190a8b5091d6153c1d294586462a6be8378a1c Mon Sep 17 00:00:00 2001 From: wandererfan Date: Tue, 7 Jan 2020 14:01:13 -0500 Subject: [PATCH] [TD]refix Dim select area problem --- src/Mod/TechDraw/Gui/MDIViewPage.cpp | 7 +- src/Mod/TechDraw/Gui/QGCustomText.cpp | 4 +- src/Mod/TechDraw/Gui/QGIView.cpp | 2 + src/Mod/TechDraw/Gui/QGIViewDimension.cpp | 124 ++++++++++++------ src/Mod/TechDraw/Gui/QGIViewDimension.h | 7 +- .../TechDraw/Gui/ViewProviderDimension.cpp | 107 ++++++++++----- src/Mod/TechDraw/Gui/ViewProviderDimension.h | 6 + 7 files changed, 174 insertions(+), 83 deletions(-) diff --git a/src/Mod/TechDraw/Gui/MDIViewPage.cpp b/src/Mod/TechDraw/Gui/MDIViewPage.cpp index bfc16bc44c..b9939a9ec8 100644 --- a/src/Mod/TechDraw/Gui/MDIViewPage.cpp +++ b/src/Mod/TechDraw/Gui/MDIViewPage.cpp @@ -1055,12 +1055,7 @@ void MDIViewPage::selectQGIView(App::DocumentObject *obj, const bool isSelected) blockSelection(true); if(view) { - bool state = view->isSelected(); - if (!isSelected) { - view->setGroupSelection(false); - } else if (state != isSelected) { - view->setSelected(isSelected); - } + view->setGroupSelection(isSelected); view->updateView(); } blockSelection(false); diff --git a/src/Mod/TechDraw/Gui/QGCustomText.cpp b/src/Mod/TechDraw/Gui/QGCustomText.cpp index 989cade356..aed63cfa83 100644 --- a/src/Mod/TechDraw/Gui/QGCustomText.cpp +++ b/src/Mod/TechDraw/Gui/QGCustomText.cpp @@ -57,7 +57,6 @@ QGCustomText::QGCustomText(QGraphicsItem* parent) : setFlag(QGraphicsItem::ItemIsSelectable, false); setFlag(QGraphicsItem::ItemIsMovable, false); - isHighlighted = false; m_colCurrent = getNormalColor(); m_colNormal = m_colCurrent; } @@ -144,7 +143,7 @@ void QGCustomText::hoverEnterEvent(QGraphicsSceneHoverEvent *event) void QGCustomText::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { - if(!isSelected() && !isHighlighted) { + if(!isSelected()) { setPrettyNormal(); } QGraphicsTextItem::hoverLeaveEvent(event); @@ -187,6 +186,7 @@ void QGCustomText::paint ( QPainter * painter, const QStyleOptionGraphicsItem * QColor QGCustomText::getNormalColor() //preference! { +// Base::Console().Message("QGCT::getNormalColor() - pref\n"); QColor result; Base::Reference hGrp = getParmGroup(); App::Color fcColor; diff --git a/src/Mod/TechDraw/Gui/QGIView.cpp b/src/Mod/TechDraw/Gui/QGIView.cpp index de53984323..403bde8939 100644 --- a/src/Mod/TechDraw/Gui/QGIView.cpp +++ b/src/Mod/TechDraw/Gui/QGIView.cpp @@ -159,6 +159,7 @@ bool QGIView::isVisible(void) } //Set selection state for this and it's children +//required for items like dimensions & balloons void QGIView::setGroupSelection(bool b) { setSelected(b); @@ -268,6 +269,7 @@ void QGIView::mouseReleaseEvent(QGraphicsSceneMouseEvent * event) void QGIView::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { +// Base::Console().Message("QGIV::hoverEnterEvent()\n"); Q_UNUSED(event); // TODO don't like this but only solution at the minute (MLP) if (isSelected()) { diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp index 7be831ef06..c76030adc7 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.cpp +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.cpp @@ -69,6 +69,10 @@ #include "ViewProviderDimension.h" #include "DrawGuiUtil.h" +#define NORMAL 0 +#define PRE 1 +#define SEL 2 + //TODO: hide the Qt coord system (+y down). @@ -91,6 +95,7 @@ QGIDatumLabel::QGIDatumLabel() setFlag(ItemIsMovable, true); setFlag(ItemIsSelectable, true); setAcceptHoverEvents(true); + setFiltersChildEvents(true); m_dimText = new QGCustomText(); m_dimText->setParentItem(this); @@ -111,10 +116,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(); @@ -167,10 +170,6 @@ void QGIDatumLabel::hoverEnterEvent(QGraphicsSceneHoverEvent *event) void QGIDatumLabel::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { - QGIView *view = dynamic_cast (parentItem()); - assert(view != 0); - Q_UNUSED(view); - Q_EMIT hover(false); if (!isSelected()) { setPrettyNormal(); @@ -195,6 +194,9 @@ void QGIDatumLabel::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt QStyleOptionGraphicsItem myOption(*option); myOption.state &= ~QStyle::State_Selected; +// painter->setPen(Qt::blue); +// painter->drawRect(boundingRect()); //good for debugging + if (m_isFramed) { QPen prevPen = painter->pen(); QPen framePen(prevPen); @@ -379,7 +381,7 @@ void QGIDatumLabel::setPrettySel(void) m_tolTextOver->setPrettySel(); m_tolTextUnder->setPrettySel(); m_unitText->setPrettySel(); - update(); + Q_EMIT setPretty(SEL); } void QGIDatumLabel::setPrettyPre(void) @@ -389,6 +391,7 @@ void QGIDatumLabel::setPrettyPre(void) m_tolTextOver->setPrettyPre(); m_tolTextUnder->setPrettyPre(); m_unitText->setPrettyPre(); + Q_EMIT setPretty(PRE); } void QGIDatumLabel::setPrettyNormal(void) @@ -398,10 +401,12 @@ void QGIDatumLabel::setPrettyNormal(void) m_tolTextOver->setPrettyNormal(); m_tolTextUnder->setPrettyNormal(); m_unitText->setPrettyNormal(); + Q_EMIT setPretty(NORMAL); } void QGIDatumLabel::setColor(QColor c) { +// Base::Console().Message("QGIDL::setColor(%s)\n", qPrintable(c.name())); m_colNormal = c; m_dimText->setColor(m_colNormal); m_tolTextOver->setColor(m_colNormal); @@ -414,34 +419,25 @@ QGIViewDimension::QGIViewDimension() : hasHover(false), m_lineWidth(0.0) { - setHandlesChildEvents(false); setFlag(QGraphicsItem::ItemIsMovable, false); + setFlag(QGraphicsItem::ItemIsSelectable, false); + setAcceptHoverEvents(false); setCacheMode(QGraphicsItem::NoCache); datumLabel = new QGIDatumLabel(); // datumLabel->m_parent = this; //for dialog setup eventually addToGroup(datumLabel); - datumLabel->setColor(getNormalColor()); - datumLabel->setPrettyNormal(); dimLines = new QGIDimLines(); addToGroup(dimLines); - dimLines->setNormalColor(getNormalColor()); - dimLines->setPrettyNormal(); aHead1 = new QGIArrow(); addToGroup(aHead1); - aHead1->setNormalColor(getNormalColor()); - aHead1->setFillColor(getNormalColor()); - aHead1->setPrettyNormal(); aHead2 = new QGIArrow(); addToGroup(aHead2); - aHead2->setNormalColor(getNormalColor()); - aHead2->setFillColor(getNormalColor()); - aHead2->setPrettyNormal(); datumLabel->setZValue(ZVALUE::DIMENSION); aHead1->setZValue(ZVALUE::DIMENSION); @@ -452,7 +448,6 @@ QGIViewDimension::QGIViewDimension() : //centerMark = new QGICMark(); //addToGroup(centerMark); - // connecting the needed slots and signals QObject::connect( datumLabel, SIGNAL(dragging(bool)), @@ -470,6 +465,10 @@ QGIViewDimension::QGIViewDimension() : datumLabel, SIGNAL(hover(bool)), this , SLOT (hover(bool))); + QObject::connect( + datumLabel, SIGNAL(setPretty(int)), + this , SLOT (onPrettyChanged(int))); + setZValue(ZVALUE::DIMENSION); //note: this won't paint dimensions over another View if it stacks //above this Dimension's parent view. need Layers? } @@ -478,6 +477,7 @@ QVariant QGIViewDimension::itemChange(GraphicsItemChange change, const QVariant { if (change == ItemSelectedHasChanged && scene()) { if(isSelected()) { + setSelected(false); datumLabel->setSelected(true); } else { datumLabel->setSelected(false); @@ -500,9 +500,13 @@ void QGIViewDimension::setGroupSelection(bool b) void QGIViewDimension::select(bool state) { -// Base::Console().Message("QGIVDim::select(%d)\n", state); - setSelected(state); - draw(); +// Base::Console().Message("QGIVD::select(%d)\n", state); + if (state) { +// setPrettySel(); + } else { +// setPrettyNormal(); + } +// draw(); } //surrogate for hover enter (true), hover leave (false) events @@ -514,6 +518,7 @@ void QGIViewDimension::hover(bool state) void QGIViewDimension::setViewPartFeature(TechDraw::DrawViewDimension *obj) { +// Base::Console().Message("QGIVD::setViewPartFeature()\n"); if(obj == 0) return; @@ -525,10 +530,25 @@ void QGIViewDimension::setViewPartFeature(TechDraw::DrawViewDimension *obj) datumLabel->setPosFromCenter(x, y); + setNormalColorAll(); + setPrettyNormal(); + updateDim(); draw(); } +void QGIViewDimension::setNormalColorAll() +{ + QColor qc = prefNormalColor(); + datumLabel->setColor(qc); + dimLines->setNormalColor(qc); + aHead1->setNormalColor(qc); + aHead1->setFillColor(qc); + aHead2->setNormalColor(qc); + aHead2->setFillColor(qc); +} + + //special handling to prevent unwanted repositioning //clicking on the dimension, but outside the label, should do nothing to position //label will get clicks before QGIVDim @@ -685,8 +705,6 @@ void QGIViewDimension::draw() } m_lineWidth = Rez::guiX(vp->LineWidth.getValue()); - m_colNormal = getNormalColor(); - datumLabel->setRotation(0.0); datumLabel->show(); @@ -720,14 +738,6 @@ void QGIViewDimension::draw() drawArrows(0, nullptr, nullptr, false); } - if (isSelected()) { - setPrettySel(); - } else if (hasHover) { - setPrettyPre(); - } else { - setPrettyNormal(); - } - update(); if (parentItem()) { //TODO: parent redraw still required with new frame/label?? @@ -2044,24 +2054,40 @@ void QGIViewDimension::drawAngle(TechDraw::DrawViewDimension *dimension, ViewPro dimLines->setPath(anglePath); } -QColor QGIViewDimension::getNormalColor() +QColor QGIViewDimension::prefNormalColor() { Base::Reference hGrp = App::GetApplication().GetUserParameter() - .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Dimensions"); + .GetGroup("BaseApp")->GetGroup("Preferences")-> + GetGroup("Mod/TechDraw/Dimensions"); App::Color fcColor; - fcColor.setPackedValue(hGrp->GetUnsigned("Color", 0x00000000)); + fcColor.setPackedValue(hGrp->GetUnsigned("Color", 0x00110000)); m_colNormal = fcColor.asValue(); - auto dim( dynamic_cast(getViewObject()) ); - if( dim == nullptr ) - return m_colNormal; - - auto vp = static_cast(getViewProvider(getViewObject())); - if ( vp == nullptr ) { +// auto dim( dynamic_cast(getViewObject()) ); + TechDraw::DrawViewDimension* dim = nullptr; + TechDraw::DrawView* dv = getViewObject(); + if (dv != nullptr) { + dim = dynamic_cast(dv); + if( dim == nullptr ) { + return m_colNormal; + } + } else { return m_colNormal; } - m_colNormal = vp->Color.getValue().asValue(); + ViewProviderDimension* vpDim = nullptr; + Gui::ViewProvider* vp = getViewProvider(dim); + if ( vp != nullptr ) { + vpDim = dynamic_cast(vp); + if (vpDim == nullptr) { + return m_colNormal; + } + } else { + return m_colNormal; + } + + fcColor = vpDim->Color.getValue(); + m_colNormal = fcColor.asValue(); return m_colNormal; } @@ -2118,6 +2144,18 @@ Base::Vector3d QGIViewDimension::findIsoExt(Base::Vector3d dir) return dirExt; } +void QGIViewDimension::onPrettyChanged(int state) +{ +// Base::Console().Message("QGIVD::onPrettyChange(%d)\n", state); + if (state == NORMAL) { + setPrettyNormal(); + } else if (state == PRE) { + setPrettyPre(); + } else { //if state = SEL + setPrettySel(); + } +} + void QGIViewDimension::setPrettyPre(void) { aHead1->setPrettyPre(); @@ -2209,6 +2247,8 @@ void QGIViewDimension::paint ( QPainter * painter, const QStyleOptionGraphicsIte } else { setPens(); } + +// painter->setPen(Qt::red); // painter->drawRect(boundingRect()); //good for debugging // QGIView::paint (painter, &myOption, widget); diff --git a/src/Mod/TechDraw/Gui/QGIViewDimension.h b/src/Mod/TechDraw/Gui/QGIViewDimension.h index bc8465c4bb..a9ea1ef6f6 100644 --- a/src/Mod/TechDraw/Gui/QGIViewDimension.h +++ b/src/Mod/TechDraw/Gui/QGIViewDimension.h @@ -103,6 +103,7 @@ public: void setLineWidth(double lineWidth) { m_lineWidth = lineWidth; } Q_SIGNALS: + void setPretty(int state); void dragging(bool); void hover(bool state); void selected(bool state); @@ -154,7 +155,7 @@ public: virtual void drawBorder() override; virtual void updateView(bool update = false) override; - virtual QColor getNormalColor(void) override; + virtual QColor prefNormalColor(void); QString getLabelText(void); void setPrettyPre(void); void setPrettySel(void); @@ -163,7 +164,10 @@ public: virtual void setGroupSelection(bool b) override; virtual QGIDatumLabel* getDatumLabel(void) { return datumLabel; } + void setNormalColorAll(void); + public Q_SLOTS: + void onPrettyChanged(int state); void datumLabelDragged(bool ctrl); void datumLabelDragFinished(void); void select(bool state); @@ -248,7 +252,6 @@ protected: virtual void mouseReleaseEvent( QGraphicsSceneMouseEvent * event) override; -protected: bool hasHover; QGIDatumLabel* datumLabel; //dimension text QGIDimLines* dimLines; //dimension lines + extension lines diff --git a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp index 091109ae43..eab2365604 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp +++ b/src/Mod/TechDraw/Gui/ViewProviderDimension.cpp @@ -27,6 +27,8 @@ #ifndef _PreComp_ #endif +#include + /// Here the FreeCAD includes sorted by Base,App,Gui...... #include #include @@ -35,10 +37,11 @@ #include #include #include +#include #include - +#include "QGIViewDimension.h" #include "ViewProviderDimension.h" using namespace TechDrawGui; @@ -60,38 +63,21 @@ ViewProviderDimension::ViewProviderDimension() static const char *group = "Dim Format"; - Base::Reference hGrp = App::GetApplication().GetUserParameter() - .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Labels"); - std::string fontName = hGrp->GetASCII("LabelFont", "osifont"); - - hGrp = App::GetApplication().GetUserParameter() - .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Dimensions"); - double fontSize = hGrp->GetFloat("FontSize", QGIView::DefaultFontSizeInMM); - ADD_PROPERTY_TYPE(Font ,(fontName.c_str()),group,App::Prop_None, "The name of the font to use"); - ADD_PROPERTY_TYPE(Fontsize,(fontSize) ,group,(App::PropertyType)(App::Prop_None),"Dimension text size in units"); - - - hGrp = App::GetApplication().GetUserParameter().GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Decorations"); - std::string lgName = hGrp->GetASCII("LineGroup","FC 0.70mm"); - auto lg = TechDraw::LineGroup::lineGroupFactory(lgName); - double weight = lg->getWeight("Thin"); - delete lg; //Coverity CID 174670 - ADD_PROPERTY_TYPE(LineWidth,(weight) ,group,(App::PropertyType)(App::Prop_None),"Dimension line weight"); - - - hGrp = App::GetApplication().GetUserParameter() - .GetGroup("BaseApp")->GetGroup("Preferences")->GetGroup("Mod/TechDraw/Dimensions"); - App::Color fcColor; - fcColor.setPackedValue(hGrp->GetUnsigned("Color", 0x00000000)); - ADD_PROPERTY_TYPE(Color,(fcColor),group,App::Prop_None,"The color of the Dimension"); - - int standardStyle = hGrp->GetInt("StandardAndStyle", STD_STYLE_ISO_ORIENTED); - ADD_PROPERTY_TYPE(StandardAndStyle, (standardStyle), group, App::Prop_None, "Specifies the standard according to which this dimension is drawn"); + ADD_PROPERTY_TYPE(Font, (prefFont().c_str()), group, App::Prop_None, "The name of the font to use"); + ADD_PROPERTY_TYPE(Fontsize, (prefFontSize()), group, (App::PropertyType)(App::Prop_None), + "Dimension text size in units"); + ADD_PROPERTY_TYPE(LineWidth, (prefWeight()), group, (App::PropertyType)(App::Prop_None), + "Dimension line weight"); + ADD_PROPERTY_TYPE(Color,(prefColor()),group,App::Prop_None,"The color of the Dimension"); + ADD_PROPERTY_TYPE(StandardAndStyle, (prefStandardAndStyle()), group, App::Prop_None, + "Specifies the standard according to which this dimension is drawn"); StandardAndStyle.setEnums(StandardAndStyleEnums); - ADD_PROPERTY_TYPE(RenderingExtent, (REND_EXTENT_NORMAL), group, App::Prop_None,"Select the rendering mode by space requirements"); + ADD_PROPERTY_TYPE(RenderingExtent, (REND_EXTENT_NORMAL), group, App::Prop_None, + "Select the rendering mode by space requirements"); RenderingExtent.setEnums(RenderingExtentEnums); - ADD_PROPERTY_TYPE(FlipArrowheads, (false), group, App::Prop_None,"Reverts the usual direction of dimension line terminators"); + ADD_PROPERTY_TYPE(FlipArrowheads, (false), group, App::Prop_None, + "Reverses the usual direction of dimension line terminators"); } ViewProviderDimension::~ViewProviderDimension() @@ -145,12 +131,22 @@ void ViewProviderDimension::onChanged(const App::Property* p) (p == &StandardAndStyle) || (p == &RenderingExtent) || (p == &FlipArrowheads)) - { + { QGIView* qgiv = getQView(); if (qgiv) { qgiv->updateView(true); } } + if (p == &Color) { + QGIView* qgiv = getQView(); + if (qgiv) { + QGIViewDimension* qgivd = dynamic_cast(qgiv); + if (qgivd != nullptr) { + qgivd->setNormalColorAll(); + } + } + } + ViewProviderDrawingView::onChanged(p); } @@ -158,3 +154,52 @@ TechDraw::DrawViewDimension* ViewProviderDimension::getViewObject() const { return dynamic_cast(pcObject); } + +App::Color ViewProviderDimension::prefColor() const +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")-> + GetGroup("Mod/TechDraw/Dimensions"); + App::Color fcColor; + fcColor.setPackedValue(hGrp->GetUnsigned("Color", 0x00001100)); + return fcColor; +} + +std::string ViewProviderDimension::prefFont() const +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")-> + GetGroup("Mod/TechDraw/Labels"); + std::string fontName = hGrp->GetASCII("LabelFont", "osifont"); + return fontName; +} + +double ViewProviderDimension::prefFontSize() const +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")-> + GetGroup("Mod/TechDraw/Dimensions"); + double fontSize = hGrp->GetFloat("FontSize", QGIView::DefaultFontSizeInMM); + return fontSize; +} + +double ViewProviderDimension::prefWeight() const +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")-> + GetGroup("Mod/TechDraw/Decorations"); + std::string lgName = hGrp->GetASCII("LineGroup","FC 0.70mm"); + auto lg = TechDraw::LineGroup::lineGroupFactory(lgName); + double weight = lg->getWeight("Thin"); + delete lg; //Coverity CID 174670 + return weight; +} + +int ViewProviderDimension::prefStandardAndStyle() const +{ + Base::Reference hGrp = App::GetApplication().GetUserParameter() + .GetGroup("BaseApp")->GetGroup("Preferences")-> + GetGroup("Mod/TechDraw/Dimensions"); + int standardStyle = hGrp->GetInt("StandardAndStyle", STD_STYLE_ISO_ORIENTED); + return standardStyle; +} diff --git a/src/Mod/TechDraw/Gui/ViewProviderDimension.h b/src/Mod/TechDraw/Gui/ViewProviderDimension.h index 3ff80e0d61..b655d73f69 100644 --- a/src/Mod/TechDraw/Gui/ViewProviderDimension.h +++ b/src/Mod/TechDraw/Gui/ViewProviderDimension.h @@ -75,6 +75,12 @@ public: virtual TechDraw::DrawViewDimension* getViewObject() const; + App::Color prefColor() const; + std::string prefFont() const; + double prefFontSize() const; + double prefWeight() const; + int prefStandardAndStyle() const; + private: static const char *StandardAndStyleEnums[];