[TD]refix Dim select area problem

This commit is contained in:
wandererfan
2020-01-07 14:01:13 -05:00
committed by WandererFan
parent 72798ac39d
commit 4ac6415828
7 changed files with 174 additions and 83 deletions

View File

@@ -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);

View File

@@ -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<ParameterGrp> hGrp = getParmGroup();
App::Color fcColor;

View File

@@ -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()) {

View File

@@ -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<QGIView *> (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<ParameterGrp> 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<QColor>();
auto dim( dynamic_cast<TechDraw::DrawViewDimension*>(getViewObject()) );
if( dim == nullptr )
return m_colNormal;
auto vp = static_cast<ViewProviderDimension*>(getViewProvider(getViewObject()));
if ( vp == nullptr ) {
// auto dim( dynamic_cast<TechDraw::DrawViewDimension*>(getViewObject()) );
TechDraw::DrawViewDimension* dim = nullptr;
TechDraw::DrawView* dv = getViewObject();
if (dv != nullptr) {
dim = dynamic_cast<TechDraw::DrawViewDimension*>(dv);
if( dim == nullptr ) {
return m_colNormal;
}
} else {
return m_colNormal;
}
m_colNormal = vp->Color.getValue().asValue<QColor>();
ViewProviderDimension* vpDim = nullptr;
Gui::ViewProvider* vp = getViewProvider(dim);
if ( vp != nullptr ) {
vpDim = dynamic_cast<ViewProviderDimension*>(vp);
if (vpDim == nullptr) {
return m_colNormal;
}
} else {
return m_colNormal;
}
fcColor = vpDim->Color.getValue();
m_colNormal = fcColor.asValue<QColor>();
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);

View File

@@ -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

View File

@@ -27,6 +27,8 @@
#ifndef _PreComp_
#endif
#include <QColor>
/// Here the FreeCAD includes sorted by Base,App,Gui......
#include <Base/Console.h>
#include <Base/Parameter.h>
@@ -35,10 +37,11 @@
#include <App/Application.h>
#include <App/Document.h>
#include <App/DocumentObject.h>
#include <App/Material.h>
#include <Mod/TechDraw/App/LineGroup.h>
#include "QGIViewDimension.h"
#include "ViewProviderDimension.h"
using namespace TechDrawGui;
@@ -60,38 +63,21 @@ ViewProviderDimension::ViewProviderDimension()
static const char *group = "Dim Format";
Base::Reference<ParameterGrp> 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<QGIViewDimension*>(qgiv);
if (qgivd != nullptr) {
qgivd->setNormalColorAll();
}
}
}
ViewProviderDrawingView::onChanged(p);
}
@@ -158,3 +154,52 @@ TechDraw::DrawViewDimension* ViewProviderDimension::getViewObject() const
{
return dynamic_cast<TechDraw::DrawViewDimension*>(pcObject);
}
App::Color ViewProviderDimension::prefColor() const
{
Base::Reference<ParameterGrp> 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<ParameterGrp> 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<ParameterGrp> 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<ParameterGrp> 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<ParameterGrp> hGrp = App::GetApplication().GetUserParameter()
.GetGroup("BaseApp")->GetGroup("Preferences")->
GetGroup("Mod/TechDraw/Dimensions");
int standardStyle = hGrp->GetInt("StandardAndStyle", STD_STYLE_ISO_ORIENTED);
return standardStyle;
}

View File

@@ -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[];