summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/tool/curve-drag-point.cpp20
-rw-r--r--src/ui/tool/node.cpp5
-rw-r--r--src/ui/tool/path-manipulator.cpp38
3 files changed, 26 insertions, 37 deletions
diff --git a/src/ui/tool/curve-drag-point.cpp b/src/ui/tool/curve-drag-point.cpp
index b83ce1b3c..40dcb5058 100644
--- a/src/ui/tool/curve-drag-point.cpp
+++ b/src/ui/tool/curve-drag-point.cpp
@@ -53,9 +53,12 @@ bool CurveDragPoint::grabbed(GdkEventMotion */*event*/)
// delta is a vector equal 1/3 of distance from first to second
Geom::Point delta = (second->position() - first->position()) / 3.0;
- first->front()->move(first->front()->position() + delta);
- second->back()->move(second->back()->position() - delta);
-
+ //BSpline
+ if(!_pm.isBSpline()){
+ first->front()->move(first->front()->position() + delta);
+ second->back()->move(second->back()->position() - delta);
+ }
+ //BSpline End
_pm.update();
} else {
_segment_was_degenerate = false;
@@ -87,10 +90,13 @@ void CurveDragPoint::dragged(Geom::Point &new_pos, GdkEventMotion *event)
Geom::Point delta = new_pos - position();
Geom::Point offset0 = ((1-weight)/(3*t*(1-t)*(1-t))) * delta;
Geom::Point offset1 = (weight/(3*t*t*(1-t))) * delta;
-
- first->front()->move(first->front()->position() + offset0);
- second->back()->move(second->back()->position() + offset1);
-
+ //BSpline
+ if(!_pm.isBSpline()){
+ first->front()->move(first->front()->position() + offset0);
+ second->back()->move(second->back()->position() + offset1);
+ }else if(weight>=0.8)second->back()->move(new_pos);
+ else if(weight<=0.2)first->front()->move(new_pos);
+ //BSpline End
_pm.update();
}
diff --git a/src/ui/tool/node.cpp b/src/ui/tool/node.cpp
index 1a196c857..c6a2df749 100644
--- a/src/ui/tool/node.cpp
+++ b/src/ui/tool/node.cpp
@@ -142,6 +142,7 @@ void Handle::move(Geom::Point const &new_pos)
Handle *h2 = NULL;
if(_pm().isBSpline()){
isBSpline = true;
+ _parent->_selection.insert(_parent);
//BSpline End
}
@@ -174,6 +175,7 @@ void Handle::move(Geom::Point const &new_pos)
other->setDirection(*node_towards, *_parent);
}
}
+ setPosition(new_pos);
//BSpline
if(isBSpline){
h = this;
@@ -183,7 +185,6 @@ void Handle::move(Geom::Point const &new_pos)
this->other()->setPosition(_pm().BSplineHandleReposition(h2,pos));
}
//BSpline End
- setPosition(new_pos);
return;
}
@@ -580,8 +581,6 @@ void Node::move(Geom::Point const &new_pos)
if(_pm().isBSpline()){
Node *n = this;
pos = _pm().BSplineHandlePosition(n->front());
- if(pos == 0)
- pos = _pm().BSplineHandlePosition(n->back());
}
//BSpline End
setPosition(new_pos);
diff --git a/src/ui/tool/path-manipulator.cpp b/src/ui/tool/path-manipulator.cpp
index c4158931a..ecb8abcf4 100644
--- a/src/ui/tool/path-manipulator.cpp
+++ b/src/ui/tool/path-manipulator.cpp
@@ -1185,21 +1185,18 @@ bool PathManipulator::isBSpline(){
double PathManipulator::BSplineHandlePosition(Handle *h){
double pos = 0;
Node *n = h->parent();
- Geom::D2< Geom::SBasis > SBasisInsideNodes;
SPCurve *lineInsideNodes = new SPCurve();
Node * nextNode = n->nodeToward(h);
if(nextNode){
lineInsideNodes->moveto(n->position());
lineInsideNodes->lineto(nextNode->position());
- SBasisInsideNodes = lineInsideNodes->first_segment()->toSBasis();
pos = Geom::nearest_point(h->position(),*lineInsideNodes->first_segment());
}
return pos;
}
Geom::Point PathManipulator::BSplineHandleReposition(Handle *h){
- double pos = 0;
- pos = this->BSplineHandlePosition(h);
+ double pos = this->BSplineHandlePosition(h);
return BSplineHandleReposition(h,pos);
}
@@ -1208,7 +1205,7 @@ Geom::Point PathManipulator::BSplineHandleReposition(Handle *h,double pos){
Geom::D2< Geom::SBasis > SBasisInsideNodes;
SPCurve *lineInsideNodes = new SPCurve();
Node * nextNode = n->nodeToward(h);
- if(nextNode && pos != 0){
+ if(nextNode){
lineInsideNodes->moveto(n->position());
lineInsideNodes->lineto(nextNode->position());
SBasisInsideNodes = lineInsideNodes->first_segment()->toSBasis();
@@ -1233,50 +1230,37 @@ void PathManipulator::_createGeometryFromControlPoints(bool alert_LPE)
}
NodeList::iterator prev = subpath->begin();
//BSpline
- float pos = NULL;
+ double pos =0;
bool isBSpline = false;
if(this->isBSpline())
isBSpline = true;
if(isBSpline){
pos = BSplineHandlePosition(prev.ptr()->front());
- prev.ptr()->front()->setPosition(BSplineHandleReposition(prev.ptr()->front(),pos));
- if(pos == 0){
- prev.ptr()->setPosition(BSplineHandleReposition(i.ptr()->front(),pos));
- }
+ prev->front()->setPosition(BSplineHandleReposition(prev->front(),pos));
}
//BSpline End
builder.moveTo(prev->position());
for (NodeList::iterator i = ++subpath->begin(); i != subpath->end(); ++i) {
//BSpline
if (isBSpline) {
- pos = BSplineHandlePosition(i.ptr()->front());
- if(pos == 0)
- pos = BSplineHandlePosition(i.ptr()->back());
- i.ptr()->front()->setPosition(BSplineHandleReposition(i.ptr()->front(),pos));
- i.ptr()->back()->setPosition(BSplineHandleReposition(i.ptr()->back(),pos));
- if(pos == 0){
- i.ptr()->setPosition(BSplineHandleReposition(i.ptr()->front(),pos));
- }
+ pos = BSplineHandlePosition(i->back());
+ i->front()->setPosition(BSplineHandleReposition(i->front(),pos));
+ i->back()->setPosition(BSplineHandleReposition(i->back(),pos));
}
//BSpline End
build_segment(builder, prev.ptr(), i.ptr());
prev = i;
}
+
if (subpath->closed()) {
// Here we link the last and first node if the path is closed.
// If the last segment is Bezier, we add it.
//BSpline
if (isBSpline) {
- pos = BSplineHandlePosition(prev.ptr()->front());
- if(pos == 0)
- pos = BSplineHandlePosition(subpath->begin().ptr()->back());
- subpath->begin().ptr()->front()->setPosition(BSplineHandleReposition(subpath->begin().ptr()->front(),pos));
- prev.ptr()->back()->setPosition(BSplineHandleReposition(prev.ptr()->back(),pos));
- if(pos == 0){
- subpath->begin().ptr()->setPosition(BSplineHandleReposition(subpath->begin().ptr()->front(),pos));
- prev.ptr()->setPosition(BSplineHandleReposition(prev.ptr()->back(),pos));
- }
+ pos = BSplineHandlePosition(prev.next()->back());
+ subpath->begin()->front()->setPosition(BSplineHandleReposition(subpath->begin()->front(),pos));
+ prev.next()->back()->setPosition(BSplineHandleReposition(prev.next()->back(),pos));
}
//BSpline End
if (!prev->front()->isDegenerate() || !subpath->begin()->back()->isDegenerate()) {