summaryrefslogtreecommitdiffstats
path: root/src/live_effects/lpe-transform_2pts.cpp
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-02-01 19:37:22 +0000
committerJabiertxof <jtx@jtx.marker.es>2015-02-01 19:37:22 +0000
commitc75f15ce27ce08091e85c1d23b0e3d9bbd9aa13c (patch)
tree3eaec994d96b3cac90e7b3cc539d88e9f8185d1a /src/live_effects/lpe-transform_2pts.cpp
parentupdate to trunk (diff)
downloadinkscape-c75f15ce27ce08091e85c1d23b0e3d9bbd9aa13c.tar.gz
inkscape-c75f15ce27ce08091e85c1d23b0e3d9bbd9aa13c.zip
adde parameter to select knot node position
(bzr r13879.1.4)
Diffstat (limited to 'src/live_effects/lpe-transform_2pts.cpp')
-rw-r--r--src/live_effects/lpe-transform_2pts.cpp108
1 files changed, 98 insertions, 10 deletions
diff --git a/src/live_effects/lpe-transform_2pts.cpp b/src/live_effects/lpe-transform_2pts.cpp
index 142070578..bb126b2bb 100644
--- a/src/live_effects/lpe-transform_2pts.cpp
+++ b/src/live_effects/lpe-transform_2pts.cpp
@@ -33,11 +33,18 @@ LPETransform2Pts::LPETransform2Pts(LivePathEffectObject *lpeobject) :
Effect(lpeobject),
fromOriginalWidth(_("Use bounding box"), _("Use bounding box"), "fromOriginalWidth", &wr, this, false),
start(_("Start"), _("Start point"), "start", &wr, this, "Start point"),
- end(_("End"), _("End point"), "end", &wr, this, "End point")
+ end(_("End"), _("End point"), "end", &wr, this, "End point"),
+ firstKnot(_("First Knot"), _("First Knot"), "firstKnot", &wr, this, 1),
+ lastKnot(_("Last Knot"), _("Last Knot"), "lastKnot", &wr, this, 1)
{
- registerParameter(&fromOriginalWidth);
registerParameter(&start);
registerParameter(&end);
+ registerParameter(&firstKnot);
+ registerParameter(&lastKnot);
+ registerParameter(&fromOriginalWidth);
+
+ firstKnot.param_make_integer(true);
+ lastKnot.param_make_integer(true);
}
LPETransform2Pts::~LPETransform2Pts()
@@ -60,6 +67,8 @@ LPETransform2Pts::doOnApply(SPLPEItem const* lpeitem)
if(!c->is_closed() && c->first_path() == c->last_path()){
A = *(c->first_point());
B = *(c->last_point());
+ int nnodes = (int)c->nodes_in_path();
+ lastKnot.param_set_value((int)c->nodes_in_path());
}
}
start.param_setValue(A);
@@ -73,25 +82,93 @@ LPETransform2Pts::doBeforeEffect (SPLPEItem const* lpeitem)
original_bbox(lpeitem);
SPLPEItem* item = const_cast<SPLPEItem*>(lpeitem);
SPPath *path = dynamic_cast<SPPath *>(item);
- if(fromOriginalWidth || !path ){
- A = Point(boundingbox_X.min(), boundingbox_Y.middle());
- B = Point(boundingbox_X.max(), boundingbox_Y.middle());
- }
+ A = Point(boundingbox_X.min(), boundingbox_Y.middle());
+ B = Point(boundingbox_X.max(), boundingbox_Y.middle());
if(path && !fromOriginalWidth){
SPCurve * c = NULL;
c = path->get_original_curve();
- if(!c->is_closed()){
- A = *(c->first_point());
- B = *(c->last_point());
+ if(!c->is_closed() && c->first_path() == c->last_path()){
+ Geom::PathVector const originalPV = c->get_pathvector();
+ A = originalPV[0][0].initialPoint();
+ if((int)firstKnot > 1){
+ A = originalPV[0][(int)firstKnot-2].finalPoint();
+ }
+ B = originalPV[0][0].initialPoint();
+ if((int)lastKnot > 1){
+ B = originalPV[0][(int)lastKnot-2].finalPoint();
+ }
+ int nnodes = (int)c->nodes_in_path();
+ firstKnot.param_set_range(1, lastKnot-1);
+ lastKnot.param_set_range(firstKnot+1, nnodes);
+ } else {
+ firstKnot.param_set_value(1);
+ lastKnot.param_set_value(2);
+ firstKnot.param_set_range(1,1);
+ lastKnot.param_set_range(2,2);
}
+ } else {
+ firstKnot.param_set_value(1);
+ lastKnot.param_set_value(2);
+ firstKnot.param_set_range(1,1);
+ lastKnot.param_set_range(2,2);
}
item->apply_to_clippath(item);
item->apply_to_mask(item);
}
void
-LPETransform2Pts::reset ()
+LPETransform2Pts::updateIndex()
+{
+ SPPath *path = dynamic_cast<SPPath *>(sp_lpe_item);
+ if(path && !fromOriginalWidth){
+ SPCurve * c = NULL;
+ c = path->get_original_curve();
+ int nnodes = (int)c->nodes_in_path();
+ if(!c->is_closed() && c->first_path() == c->last_path()){
+ c->reset();
+ c = path->getCurve();
+ Geom::PathVector const originalPV = c->get_pathvector();
+ Geom::Point C = originalPV[0][0].initialPoint();
+ Geom::Point D = originalPV[0][0].initialPoint();
+ if((int)firstKnot > 1){
+ C = originalPV[0][(int)firstKnot-2].finalPoint();
+ }
+ if((int)lastKnot > 1){
+ D = originalPV[0][(int)lastKnot-2].finalPoint();
+ }
+ start.param_update_default(C);
+ start.param_set_and_write_default();
+ end.param_update_default(D);
+ end.param_set_and_write_default();
+ start.param_update_default(A);
+ end.param_update_default(B);
+ start.param_set_and_write_default();
+ end.param_set_and_write_default();
+ SPDesktop * desktop = SP_ACTIVE_DESKTOP;
+ tools_switch(desktop, TOOLS_SELECT);
+ tools_switch(desktop, TOOLS_NODES);
+ }
+ }
+}
+
+void
+LPETransform2Pts::reset()
{
+ SPPath *path = dynamic_cast<SPPath *>(sp_lpe_item);
+ A = Geom::Point(boundingbox_X.min(), boundingbox_Y.middle());
+ B = Geom::Point(boundingbox_X.max(), boundingbox_Y.middle());
+ if(path && !fromOriginalWidth){
+ SPCurve * c = NULL;
+ c = path->get_original_curve();
+ int nnodes = (int)c->nodes_in_path();
+ firstKnot.param_set_value(1);
+ lastKnot.param_set_value(nnodes);
+ A = *(c->first_point());
+ B = *(c->last_point());
+ } else {
+ firstKnot.param_set_value(1);
+ lastKnot.param_set_value(2);
+ }
start.param_update_default(A);
end.param_update_default(B);
start.param_set_and_write_default();
@@ -118,6 +195,17 @@ Gtk::Widget *LPETransform2Pts::newWidget()
Parameter *param = *it;
Gtk::Widget *widg = dynamic_cast<Gtk::Widget *>(param->param_newWidget());
Glib::ustring *tip = param->param_getTooltip();
+ if (param->param_key == "firstKnot" || param->param_key == "lastKnot") {
+ Inkscape::UI::Widget::Scalar *widgRegistered = Gtk::manage(dynamic_cast<Inkscape::UI::Widget::Scalar *>(widg));
+ widgRegistered->signal_value_changed().connect(sigc::mem_fun(*this, &LPETransform2Pts::updateIndex));
+ widg = widgRegistered;
+ if (widg) {
+ Gtk::HBox *scalarParameter = dynamic_cast<Gtk::HBox *>(widg);
+ std::vector<Gtk::Widget *> childList = scalarParameter->get_children();
+ Gtk::Entry *entryWidg = dynamic_cast<Gtk::Entry *>(childList[1]);
+ entryWidg->set_width_chars(3);
+ }
+ }
if (widg) {
vbox->pack_start(*widg, true, true, 2);
if (tip) {