Curved path can move by mouse.
--HG-- branch : feature
This commit is contained in:
parent
d6069c9201
commit
f16cccd89f
|
@ -236,6 +236,30 @@ void VSplinePath::setMaxCountPoints(const qint32 &value)
|
||||||
d->maxCountPoints = value;
|
d->maxCountPoints = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
int VSplinePath::Segment(const QPointF &p) const
|
||||||
|
{
|
||||||
|
int index = -1;
|
||||||
|
for (qint32 i = 1; i <= Count(); ++i)
|
||||||
|
{
|
||||||
|
VSpline spl = VSpline(d->path.at(i-1).P(), d->path.at(i).P(), d->path.at(i-1).Angle2(), d->path.at(i).Angle1(),
|
||||||
|
d->path.at(i-1).KAsm2(), d->path.at(i).KAsm1(), d->kCurve);
|
||||||
|
|
||||||
|
const qreal t = spl.ParamT(p);
|
||||||
|
|
||||||
|
if (qFloor(t) == -1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return index;
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
qint32 VSplinePath::CountPoint() const
|
qint32 VSplinePath::CountPoint() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -185,6 +185,8 @@ public:
|
||||||
* @param value max count.
|
* @param value max count.
|
||||||
*/
|
*/
|
||||||
void setMaxCountPoints(const qint32 &value);
|
void setMaxCountPoints(const qint32 &value);
|
||||||
|
|
||||||
|
int Segment(const QPointF &p) const;
|
||||||
private:
|
private:
|
||||||
QSharedDataPointer<VSplinePathData> d;
|
QSharedDataPointer<VSplinePathData> d;
|
||||||
};
|
};
|
||||||
|
|
|
@ -44,7 +44,7 @@ const QString VToolSplinePath::ToolType = QStringLiteral("path");
|
||||||
*/
|
*/
|
||||||
VToolSplinePath::VToolSplinePath(VPattern *doc, VContainer *data, quint32 id, const QString &color,
|
VToolSplinePath::VToolSplinePath(VPattern *doc, VContainer *data, quint32 id, const QString &color,
|
||||||
const Source &typeCreation, QGraphicsItem *parent)
|
const Source &typeCreation, QGraphicsItem *parent)
|
||||||
:VAbstractSpline(doc, data, id, parent)
|
:VAbstractSpline(doc, data, id, parent), oldPosition()
|
||||||
{
|
{
|
||||||
sceneType = SceneObject::SplinePath;
|
sceneType = SceneObject::SplinePath;
|
||||||
|
|
||||||
|
@ -52,6 +52,7 @@ VToolSplinePath::VToolSplinePath(VPattern *doc, VContainer *data, quint32 id, co
|
||||||
this->setPen(QPen(Qt::black, qApp->toPixel(qApp->widthHairLine())/factor));
|
this->setPen(QPen(Qt::black, qApp->toPixel(qApp->widthHairLine())/factor));
|
||||||
this->setFlag(QGraphicsItem::ItemIsSelectable, true);
|
this->setFlag(QGraphicsItem::ItemIsSelectable, true);
|
||||||
this->setFlag(QGraphicsItem::ItemIsFocusable, true);
|
this->setFlag(QGraphicsItem::ItemIsFocusable, true);
|
||||||
|
this->setFlag(QGraphicsItem::ItemIsMovable, true);
|
||||||
this->setAcceptHoverEvents(true);
|
this->setAcceptHoverEvents(true);
|
||||||
|
|
||||||
const QSharedPointer<VSplinePath> splPath = data->GeometricObject<VSplinePath>(id);
|
const QSharedPointer<VSplinePath> splPath = data->GeometricObject<VSplinePath>(id);
|
||||||
|
@ -167,6 +168,7 @@ VToolSplinePath* VToolSplinePath::Create(const quint32 _id, VSplinePath *path, c
|
||||||
connect(spl, &VToolSplinePath::ChoosedTool, scene, &VMainGraphicsScene::ChoosedItem);
|
connect(spl, &VToolSplinePath::ChoosedTool, scene, &VMainGraphicsScene::ChoosedItem);
|
||||||
connect(scene, &VMainGraphicsScene::NewFactor, spl, &VToolSplinePath::SetFactor);
|
connect(scene, &VMainGraphicsScene::NewFactor, spl, &VToolSplinePath::SetFactor);
|
||||||
connect(scene, &VMainGraphicsScene::DisableItem, spl, &VToolSplinePath::Disable);
|
connect(scene, &VMainGraphicsScene::DisableItem, spl, &VToolSplinePath::Disable);
|
||||||
|
connect(scene, &VMainGraphicsScene::EnableToolMove, spl, &VToolSplinePath::EnableToolMove);
|
||||||
doc->AddTool(id, spl);
|
doc->AddTool(id, spl);
|
||||||
return spl;
|
return spl;
|
||||||
}
|
}
|
||||||
|
@ -414,6 +416,121 @@ void VToolSplinePath::SaveOptions(QDomElement &tag, QSharedPointer<VGObject> &ob
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VToolSplinePath::mousePressEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
if (flags() & QGraphicsItem::ItemIsMovable)
|
||||||
|
{
|
||||||
|
if (event->button() == Qt::LeftButton && event->type() != QEvent::GraphicsSceneMouseDoubleClick)
|
||||||
|
{
|
||||||
|
VApplication::setOverrideCursor(cursorArrowCloseHand, 1, 1);
|
||||||
|
oldPosition = event->scenePos();
|
||||||
|
event->accept();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VAbstractSpline::mousePressEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VToolSplinePath::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
if (flags() & QGraphicsItem::ItemIsMovable)
|
||||||
|
{
|
||||||
|
if (event->button() == Qt::LeftButton && event->type() != QEvent::GraphicsSceneMouseDoubleClick)
|
||||||
|
{
|
||||||
|
//Disable cursor-arrow-closehand
|
||||||
|
VApplication::restoreOverrideCursor(cursorArrowCloseHand);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
VAbstractSpline::mouseReleaseEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VToolSplinePath::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
|
||||||
|
{
|
||||||
|
// Don't need check if left mouse button was pressed. According to the Qt documentation "If you do receive this
|
||||||
|
// event, you can be certain that this item also received a mouse press event, and that this item is the current
|
||||||
|
// mouse grabber.".
|
||||||
|
|
||||||
|
VSplinePath oldSplPath = *VAbstractTool::data.GeometricObject<VSplinePath>(id);
|
||||||
|
VSplinePath newSplPath = oldSplPath;
|
||||||
|
int indexSpline = oldSplPath.Segment(oldPosition);
|
||||||
|
if (indexSpline == -1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
VSpline spline = newSplPath.GetSpline(indexSpline);
|
||||||
|
const qreal t = spline.ParamT(oldPosition);
|
||||||
|
|
||||||
|
if (qFloor(t) == -1)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Magic Bezier Drag Equations follow!
|
||||||
|
// "weight" describes how the influence of the drag should be distributed
|
||||||
|
// among the handles; 0 = front handle only, 1 = back handle only.
|
||||||
|
|
||||||
|
double weight;
|
||||||
|
if (t <= 1.0 / 6.0)
|
||||||
|
{
|
||||||
|
weight = 0;
|
||||||
|
}
|
||||||
|
else if (t <= 0.5)
|
||||||
|
{
|
||||||
|
weight = (pow((6 * t - 1) / 2.0, 3)) / 2;
|
||||||
|
}
|
||||||
|
else if (t <= 5.0 / 6.0)
|
||||||
|
{
|
||||||
|
weight = (1 - pow((6 * (1-t) - 1) / 2.0, 3)) / 2 + 0.5;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
weight = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QPointF delta = event->scenePos() - oldPosition;
|
||||||
|
const QPointF offset0 = ((1-weight)/(3*t*(1-t)*(1-t))) * delta;
|
||||||
|
const QPointF offset1 = (weight/(3*t*t*(1-t))) * delta;
|
||||||
|
|
||||||
|
const QPointF p2 = spline.GetP2() + offset0;
|
||||||
|
const QPointF p3 = spline.GetP3() + offset1;
|
||||||
|
|
||||||
|
oldPosition = event->scenePos(); // Now mouse here
|
||||||
|
|
||||||
|
const VSpline spl = VSpline(spline.GetP1(), p2, p3, spline.GetP4(), spline.GetKcurve());
|
||||||
|
|
||||||
|
UpdateControlPoints(spl, newSplPath, indexSpline);
|
||||||
|
|
||||||
|
MoveSplinePath *moveSplPath = new MoveSplinePath(doc, oldSplPath, newSplPath, id, this->scene());
|
||||||
|
connect(moveSplPath, &VUndoCommand::NeedLiteParsing, doc, &VPattern::LiteParseTree);
|
||||||
|
qApp->getUndoStack()->push(moveSplPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VToolSplinePath::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
|
||||||
|
{
|
||||||
|
if (flags() & QGraphicsItem::ItemIsMovable)
|
||||||
|
{
|
||||||
|
VApplication::setOverrideCursor(cursorArrowOpenHand, 1, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
VAbstractSpline::hoverEnterEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
|
void VToolSplinePath::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
|
||||||
|
{
|
||||||
|
if (flags() & QGraphicsItem::ItemIsMovable)
|
||||||
|
{
|
||||||
|
//Disable cursor-arrow-openhand
|
||||||
|
VApplication::restoreOverrideCursor(cursorArrowOpenHand);
|
||||||
|
}
|
||||||
|
|
||||||
|
VAbstractSpline::hoverLeaveEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------------------------------------------------
|
//---------------------------------------------------------------------------------------------------------------------
|
||||||
/**
|
/**
|
||||||
* @brief RefreshGeometry refresh item on scene.
|
* @brief RefreshGeometry refresh item on scene.
|
||||||
|
|
|
@ -79,7 +79,14 @@ protected:
|
||||||
virtual void RemoveReferens();
|
virtual void RemoveReferens();
|
||||||
virtual void SaveDialog(QDomElement &domElement);
|
virtual void SaveDialog(QDomElement &domElement);
|
||||||
virtual void SaveOptions(QDomElement &tag, QSharedPointer<VGObject> &obj);
|
virtual void SaveOptions(QDomElement &tag, QSharedPointer<VGObject> &obj);
|
||||||
|
virtual void mousePressEvent(QGraphicsSceneMouseEvent * event);
|
||||||
|
virtual void mouseReleaseEvent ( QGraphicsSceneMouseEvent * event );
|
||||||
|
virtual void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
|
||||||
|
virtual void hoverEnterEvent ( QGraphicsSceneHoverEvent * event );
|
||||||
|
virtual void hoverLeaveEvent ( QGraphicsSceneHoverEvent * event );
|
||||||
private:
|
private:
|
||||||
|
QPointF oldPosition;
|
||||||
|
|
||||||
void RefreshGeometry();
|
void RefreshGeometry();
|
||||||
static void AddPathPoint(VPattern *doc, QDomElement &domElement, const VSplinePoint &splPoint);
|
static void AddPathPoint(VPattern *doc, QDomElement &domElement, const VSplinePoint &splPoint);
|
||||||
void UpdateControlPoints(const VSpline &spl, VSplinePath &splPath, const qint32 &indexSpline) const;
|
void UpdateControlPoints(const VSpline &spl, VSplinePath &splPath, const qint32 &indexSpline) const;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user