diff options
| author | Jabier Arraiza Cenoz <jabier.arraiza@marker.es> | 2015-02-01 19:37:22 +0000 |
|---|---|---|
| committer | Jabiertxof <jtx@jtx.marker.es> | 2015-02-01 19:37:22 +0000 |
| commit | c75f15ce27ce08091e85c1d23b0e3d9bbd9aa13c (patch) | |
| tree | 3eaec994d96b3cac90e7b3cc539d88e9f8185d1a /src/live_effects/lpe-transform_2pts.cpp | |
| parent | update to trunk (diff) | |
| download | inkscape-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.cpp | 108 |
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) { |
