Code

Fix behavior when loading a document
[inkscape.git] / src / live_effects / lpe-tangent_to_curve.cpp
index b46b602c3bbdc15e953e6d6cf42c652d8f053450..b43fd8b36788a43210b65e13692a0d0392657628 100644 (file)
@@ -19,7 +19,6 @@
 //        There must be a more convenient way to achieve this.
 #include "sp-path.h"
 #include "display/curve.h"
-#include "libnr/n-art-bpath-2geom.h"
 
 #include <2geom/path.h>
 #include <2geom/transforms.h>
@@ -29,31 +28,25 @@ namespace LivePathEffect {
 
 namespace TtC {
 
-class KnotHolderEntityAttachPt : public KnotHolderEntity
+class KnotHolderEntityAttachPt : public LPEKnotHolderEntity
 {
 public:
-    virtual bool isLPEParam() { return true; }
-
-    virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual NR::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
 };
 
-class KnotHolderEntityLeftEnd : public KnotHolderEntity
+class KnotHolderEntityLeftEnd : public LPEKnotHolderEntity
 {
 public:
-    virtual bool isLPEParam() { return true; }
-
-    virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual NR::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
 };
 
-class KnotHolderEntityRightEnd : public KnotHolderEntity
+class KnotHolderEntityRightEnd : public LPEKnotHolderEntity
 {
 public:
-    virtual bool isLPEParam() { return true; }
-
-    virtual void knot_set(NR::Point const &p, NR::Point const &origin, guint state);
-    virtual NR::Point knot_get();
+    virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, guint state);
+    virtual Geom::Point knot_get();
 };
 
 } // namespace TtC
@@ -65,14 +58,16 @@ LPETangentToCurve::LPETangentToCurve(LivePathEffectObject *lpeobject) :
     length_left(_("Length left"), _("Specifies the left end of the tangent"), "length-left", &wr, this, 150),
     length_right(_("Length right"), _("Specifies the right end of the tangent"), "length-right", &wr, this, 150)
 {
+    show_orig_path = true;
+
     registerParameter( dynamic_cast<Parameter *>(&angle) );
     registerParameter( dynamic_cast<Parameter *>(&t_attach) );
     registerParameter( dynamic_cast<Parameter *>(&length_left) );
     registerParameter( dynamic_cast<Parameter *>(&length_right) );
 
-    registerKnotHolderHandle(new TtC::KnotHolderEntityAttachPt(), _("Adjust the \"left\" end of the tangent"));
-    registerKnotHolderHandle(new TtC::KnotHolderEntityLeftEnd(), _("Adjust the \"right\" end of the tangent"));
-    registerKnotHolderHandle(new TtC::KnotHolderEntityRightEnd(), _("Adjust the point of attachment of the tangent"));
+    registerKnotHolderHandle(new TtC::KnotHolderEntityAttachPt(), _("Adjust the point of attachment of the tangent"));
+    registerKnotHolderHandle(new TtC::KnotHolderEntityLeftEnd(), _("Adjust the \"left\" end of the tangent"));
+    registerKnotHolderHandle(new TtC::KnotHolderEntityRightEnd(), _("Adjust the \"right\" end of the tangent"));
 }
 
 LPETangentToCurve::~LPETangentToCurve()
@@ -115,11 +110,13 @@ get_effect(SPItem *item)
 }
 
 void
-KnotHolderEntityAttachPt::knot_set(NR::Point const &p, NR::Point const &origin, guint state)
+KnotHolderEntityAttachPt::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
 {
-     using namespace Geom;
-     LPETangentToCurve* lpe = get_effect(item);
+    using namespace Geom;
+
+    LPETangentToCurve* lpe = get_effect(item);
+
+    Geom::Point const s = snap_knot_position(p);
 
     // FIXME: There must be a better way of converting the path's SPCurve* to pwd2.
     SPCurve *curve = sp_path_get_curve_for_edit (SP_PATH(item));
@@ -129,7 +126,7 @@ KnotHolderEntityAttachPt::knot_set(NR::Point const &p, NR::Point const &origin,
         pwd2.concat(pathv[i].toPwSb());
     }
 
-    double t0 = nearest_point(p.to_2geom(), pwd2);
+    double t0 = nearest_point(s, pwd2);
     lpe->t_attach.param_set_value(t0);
 
     // FIXME: this should not directly ask for updating the item. It should write to SVG, which triggers updating.
@@ -137,42 +134,46 @@ KnotHolderEntityAttachPt::knot_set(NR::Point const &p, NR::Point const &origin,
 }
 
 void
-KnotHolderEntityLeftEnd::knot_set(NR::Point const &p, NR::Point const &origin, guint state)
+KnotHolderEntityLeftEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
 {
     LPETangentToCurve *lpe = get_effect(item);
-    
-    double lambda = Geom::nearest_point(p.to_2geom(), lpe->ptA, lpe->derivA);
+
+    Geom::Point const s = snap_knot_position(p);
+
+    double lambda = Geom::nearest_point(s, lpe->ptA, lpe->derivA);
     lpe->length_left.param_set_value(-lambda);
 
-    sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);    
+    sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
 }
 
 void
-KnotHolderEntityRightEnd::knot_set(NR::Point const &p, NR::Point const &origin, guint state)
+KnotHolderEntityRightEnd::knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/)
 {
     LPETangentToCurve *lpe = get_effect(item);
     
-    double lambda = Geom::nearest_point(p.to_2geom(), lpe->ptA, lpe->derivA);
+    Geom::Point const s = snap_knot_position(p);
+
+    double lambda = Geom::nearest_point(s, lpe->ptA, lpe->derivA);
     lpe->length_right.param_set_value(lambda);
 
-    sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);    
+    sp_lpe_item_update_patheffect (SP_LPE_ITEM(item), false, true);
 }
 
-NR::Point
+Geom::Point
 KnotHolderEntityAttachPt::knot_get()
 {
     LPETangentToCurve* lpe = get_effect(item);
     return lpe->ptA;
 }
 
-NR::Point
+Geom::Point
 KnotHolderEntityLeftEnd::knot_get()
 {
     LPETangentToCurve *lpe = get_effect(item);
     return lpe->C;
 }
 
-NR::Point
+Geom::Point
 KnotHolderEntityRightEnd::knot_get()
 {
     LPETangentToCurve *lpe = get_effect(item);