summaryrefslogtreecommitdiffstats
path: root/src/live_effects
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2017-12-07 20:47:44 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2017-12-07 20:47:44 +0000
commit075a88fc7edbec8682bcd672de325ec1bedf129f (patch)
tree33d64f8ddc366a96e2c480b672224d44fc0e6355 /src/live_effects
parentUpdate to trunk (diff)
parentFix bug 1733422 - Bezier and pencil tool don't work form: from clipboard (diff)
downloadinkscape-075a88fc7edbec8682bcd672de325ec1bedf129f.tar.gz
inkscape-075a88fc7edbec8682bcd672de325ec1bedf129f.zip
Mege trunk into powerpencilII
Diffstat (limited to 'src/live_effects')
-rw-r--r--src/live_effects/lpe-bendpath.cpp47
-rw-r--r--src/live_effects/lpe-bendpath.h3
-rw-r--r--src/live_effects/lpe-knot.cpp8
-rw-r--r--src/live_effects/lpe-patternalongpath.cpp44
-rw-r--r--src/live_effects/lpe-patternalongpath.h3
-rw-r--r--src/live_effects/parameter/parameter.cpp11
-rw-r--r--src/live_effects/parameter/parameter.h2
-rw-r--r--src/live_effects/parameter/point.cpp6
-rw-r--r--src/live_effects/parameter/point.h1
-rw-r--r--src/live_effects/parameter/random.cpp7
-rw-r--r--src/live_effects/parameter/random.h1
11 files changed, 91 insertions, 42 deletions
diff --git a/src/live_effects/lpe-bendpath.cpp b/src/live_effects/lpe-bendpath.cpp
index ff5f738eb..dcbf5efd0 100644
--- a/src/live_effects/lpe-bendpath.cpp
+++ b/src/live_effects/lpe-bendpath.cpp
@@ -9,6 +9,7 @@
#include "sp-item-group.h"
#include "knot-holder-entity.h"
#include "knotholder.h"
+#include "display/curve.h"
// TODO due to internal breakage in glibmm headers, this must be last:
#include <glibmm/i18n.h>
@@ -39,7 +40,6 @@ first) but I think we can first forget about them.
namespace Inkscape {
namespace LivePathEffect {
-Geom::PathVector bp_helper_path;
namespace BeP {
class KnotHolderEntityWidthBendPath : public LPEKnotHolderEntity {
public:
@@ -55,16 +55,19 @@ LPEBendPath::LPEBendPath(LivePathEffectObject *lpeobject) :
original_height(0.0),
prop_scale(_("_Width:"), _("Width of the path"), "prop_scale", &wr, this, 1.0),
scale_y_rel(_("W_idth in units of length"), _("Scale the width of the path in units of its length"), "scale_y_rel", &wr, this, false),
- vertical_pattern(_("_Original path is vertical"), _("Rotates the original 90 degrees, before bending it along the bend path"), "vertical", &wr, this, false)
+ vertical_pattern(_("_Original path is vertical"), _("Rotates the original 90 degrees, before bending it along the bend path"), "vertical", &wr, this, false),
+ hide_knot(_("Hide width knot"), _("Hide width knot"),"hide_knot", &wr, this, false)
{
registerParameter( &bend_path );
registerParameter( &prop_scale);
registerParameter( &scale_y_rel);
registerParameter( &vertical_pattern);
+ registerParameter(&hide_knot);
prop_scale.param_set_digits(3);
prop_scale.param_set_increments(0.01, 0.10);
-
+
+ knot_entity = NULL;
_provides_knotholder_entities = true;
apply_to_clippath_and_mask = true;
concatenate_before_pwd2 = true;
@@ -81,6 +84,15 @@ LPEBendPath::doBeforeEffect (SPLPEItem const* lpeitem)
// get the item bounding box
original_bbox(lpeitem);
original_height = boundingbox_Y.max() - boundingbox_Y.min();
+ if (knot_entity) {
+ if (hide_knot) {
+ helper_path.clear();
+ knot_entity->knot->hide();
+ } else {
+ knot_entity->knot->show();
+ }
+ knot_entity->update_knot();
+ }
}
Geom::Piecewise<Geom::D2<Geom::SBasis> >
@@ -162,15 +174,19 @@ LPEBendPath::transform_multiply(Geom::Affine const& postmul, bool set)
void
LPEBendPath::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
{
- hp_vec.push_back(bp_helper_path);
+ hp_vec.push_back(helper_path);
}
void
LPEBendPath::addKnotHolderEntities(KnotHolder *knotholder, SPItem *item)
{
- KnotHolderEntity *e = new BeP::KnotHolderEntityWidthBendPath(this);
- e->create(NULL, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _("Change the width"), SP_KNOT_SHAPE_CIRCLE);
- knotholder->add(e);
+ knot_entity = new BeP::KnotHolderEntityWidthBendPath(this);
+ knot_entity->create(NULL, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _("Change the width"), SP_KNOT_SHAPE_CIRCLE);
+ knotholder->add(knot_entity);
+ if (hide_knot) {
+ knot_entity->knot->hide();
+ knot_entity->update_knot();
+ }
}
namespace BeP {
@@ -208,7 +224,6 @@ Geom::Point
KnotHolderEntityWidthBendPath::knot_get() const
{
LPEBendPath *lpe = dynamic_cast<LPEBendPath *> (_effect);
-
Geom::Path path_in = lpe->bend_path.get_pathvector().pathAt(Geom::PathVectorTime(0, 0, 0.0));
Geom::Point ptA = path_in.pointAt(Geom::PathTime(0, 0.0));
Geom::Point B = path_in.pointAt(Geom::PathTime(1, 0.0));
@@ -216,17 +231,17 @@ KnotHolderEntityWidthBendPath::knot_get() const
Geom::CubicBezier const *cubic = dynamic_cast<Geom::CubicBezier const *>(&*first_curve);
Geom::Ray ray(ptA, B);
if (cubic) {
- ray.setPoints(ptA,(*cubic)[1]);
+ ray.setPoints(ptA, (*cubic)[1]);
}
ray.setAngle(ray.angle() + Geom::rad_from_deg(90));
Geom::Point result_point = Geom::Point::polar(ray.angle(), (lpe->original_height/2.0) * lpe->prop_scale) + ptA;
-
- bp_helper_path.clear();
- Geom::Path hp(result_point);
- hp.appendNew<Geom::LineSegment>(ptA);
- bp_helper_path.push_back(hp);
- hp.clear();
-
+ lpe->helper_path.clear();
+ if (!lpe->hide_knot) {
+ Geom::Path hp(result_point);
+ hp.appendNew<Geom::LineSegment>(ptA);
+ lpe->helper_path.push_back(hp);
+ hp.clear();
+ }
return result_point;
}
} // namespace BeP
diff --git a/src/live_effects/lpe-bendpath.h b/src/live_effects/lpe-bendpath.h
index f232687ce..74892201d 100644
--- a/src/live_effects/lpe-bendpath.h
+++ b/src/live_effects/lpe-bendpath.h
@@ -58,6 +58,9 @@ protected:
private:
BoolParam scale_y_rel;
BoolParam vertical_pattern;
+ BoolParam hide_knot;
+ KnotHolderEntity *knot_entity;
+ Geom::PathVector helper_path;
Geom::Piecewise<Geom::D2<Geom::SBasis> > uskeleton;
Geom::Piecewise<Geom::D2<Geom::SBasis> > n;
diff --git a/src/live_effects/lpe-knot.cpp b/src/live_effects/lpe-knot.cpp
index b21181ffc..b3918b6ab 100644
--- a/src/live_effects/lpe-knot.cpp
+++ b/src/live_effects/lpe-knot.cpp
@@ -510,12 +510,7 @@ collectPathsAndWidths (SPLPEItem const *lpeitem, Geom::PathVector &paths, std::v
}
}
else if (SP_IS_SHAPE(lpeitem)) {
- SPCurve * c = NULL;
- if (SP_IS_PATH(lpeitem)) {
- c = SP_PATH(lpeitem)->get_curve_for_edit();
- } else {
- c = SP_SHAPE(lpeitem)->getCurve();
- }
+ SPCurve * c = SP_SHAPE(lpeitem)->getCurve();
if (c) {
Geom::PathVector subpaths = pathv_to_linear_and_cubic_beziers(c->get_pathvector());
for (unsigned i=0; i<subpaths.size(); i++){
@@ -524,6 +519,7 @@ collectPathsAndWidths (SPLPEItem const *lpeitem, Geom::PathVector &paths, std::v
stroke_widths.push_back(lpeitem->style->stroke_width.computed);
}
}
+ c->unref();
}
}
diff --git a/src/live_effects/lpe-patternalongpath.cpp b/src/live_effects/lpe-patternalongpath.cpp
index 4aa172161..5be88a2b7 100644
--- a/src/live_effects/lpe-patternalongpath.cpp
+++ b/src/live_effects/lpe-patternalongpath.cpp
@@ -42,7 +42,6 @@ first) but I think we can first forget about them.
namespace Inkscape {
namespace LivePathEffect {
-Geom::PathVector pap_helper_path;
namespace WPAP {
class KnotHolderEntityWidthPatternAlongPath : public LPEKnotHolderEntity {
@@ -82,6 +81,7 @@ LPEPatternAlongPath::LPEPatternAlongPath(LivePathEffectObject *lpeobject) :
"prop_units", &wr, this, false),
vertical_pattern(_("Pattern is _vertical"), _("Rotate pattern 90 deg before applying"),
"vertical_pattern", &wr, this, false),
+ hide_knot(_("Hide width knot"), _("Hide width knot"),"hide_knot", &wr, this, false),
fuse_tolerance(_("_Fuse nearby ends:"), _("Fuse ends closer than this number. 0 means don't fuse."),
"fuse_tolerance", &wr, this, 0)
{
@@ -94,10 +94,11 @@ LPEPatternAlongPath::LPEPatternAlongPath(LivePathEffectObject *lpeobject) :
registerParameter(&tang_offset);
registerParameter(&prop_units);
registerParameter(&vertical_pattern);
+ registerParameter(&hide_knot);
registerParameter(&fuse_tolerance);
prop_scale.param_set_digits(3);
prop_scale.param_set_increments(0.01, 0.10);
-
+ knot_entity = NULL;
_provides_knotholder_entities = true;
}
@@ -115,6 +116,15 @@ LPEPatternAlongPath::doBeforeEffect (SPLPEItem const* lpeitem)
if (bbox) {
original_height = (*bbox)[Geom::Y].max() - (*bbox)[Geom::Y].min();
}
+ if (knot_entity) {
+ if (hide_knot) {
+ helper_path.clear();
+ knot_entity->knot->hide();
+ } else {
+ knot_entity->knot->show();
+ }
+ knot_entity->update_knot();
+ }
}
Geom::Piecewise<Geom::D2<Geom::SBasis> >
@@ -272,16 +282,20 @@ LPEPatternAlongPath::transform_multiply(Geom::Affine const& postmul, bool set)
void
LPEPatternAlongPath::addCanvasIndicators(SPLPEItem const */*lpeitem*/, std::vector<Geom::PathVector> &hp_vec)
{
- hp_vec.push_back(pap_helper_path);
+ hp_vec.push_back(helper_path);
}
void
LPEPatternAlongPath::addKnotHolderEntities(KnotHolder *knotholder, SPItem *item)
{
- KnotHolderEntity *e = new WPAP::KnotHolderEntityWidthPatternAlongPath(this);
- e->create(NULL, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _("Change the width"), SP_KNOT_SHAPE_CIRCLE);
- knotholder->add(e);
+ knot_entity = new WPAP::KnotHolderEntityWidthPatternAlongPath(this);
+ knot_entity->create(NULL, item, knotholder, Inkscape::CTRL_TYPE_UNKNOWN, _("Change the width"), SP_KNOT_SHAPE_CIRCLE);
+ knotholder->add(knot_entity);
+ if (hide_knot) {
+ knot_entity->knot->hide();
+ knot_entity->update_knot();
+ }
}
namespace WPAP {
@@ -290,7 +304,7 @@ void
KnotHolderEntityWidthPatternAlongPath::knot_set(Geom::Point const &p, Geom::Point const& /*origin*/, guint state)
{
LPEPatternAlongPath *lpe = dynamic_cast<LPEPatternAlongPath *> (_effect);
-
+
Geom::Point const s = snap_knot_position(p, state);
SPShape const *sp_shape = dynamic_cast<SPShape const *>(SP_LPE_ITEM(item));
if (sp_shape) {
@@ -325,7 +339,6 @@ Geom::Point
KnotHolderEntityWidthPatternAlongPath::knot_get() const
{
LPEPatternAlongPath *lpe = dynamic_cast<LPEPatternAlongPath *> (_effect);
-
SPShape const *sp_shape = dynamic_cast<SPShape const *>(SP_LPE_ITEM(item));
if (sp_shape) {
SPCurve *curve_before = sp_shape->getCurveBeforeLPE();
@@ -341,13 +354,14 @@ KnotHolderEntityWidthPatternAlongPath::knot_get() const
}
ray.setAngle(ray.angle() + Geom::rad_from_deg(90));
Geom::Point result_point = Geom::Point::polar(ray.angle(), (lpe->original_height/2.0) * lpe->prop_scale) + ptA;
-
- pap_helper_path.clear();
- Geom::Path hp(result_point);
- hp.appendNew<Geom::LineSegment>(ptA);
- pap_helper_path.push_back(hp);
- hp.clear();
- curve_before->unref();
+ lpe->helper_path.clear();
+ if (!lpe->hide_knot) {
+ Geom::Path hp(result_point);
+ hp.appendNew<Geom::LineSegment>(ptA);
+ lpe->helper_path.push_back(hp);
+ hp.clear();
+ }
+ curve_before->unref();
return result_point;
}
}
diff --git a/src/live_effects/lpe-patternalongpath.h b/src/live_effects/lpe-patternalongpath.h
index c34a9a15d..ded875a8b 100644
--- a/src/live_effects/lpe-patternalongpath.h
+++ b/src/live_effects/lpe-patternalongpath.h
@@ -60,7 +60,10 @@ private:
ScalarParam tang_offset;
BoolParam prop_units;
BoolParam vertical_pattern;
+ BoolParam hide_knot;
ScalarParam fuse_tolerance;
+ KnotHolderEntity *knot_entity;
+ Geom::PathVector helper_path;
void on_pattern_pasted();
LPEPatternAlongPath(const LPEPatternAlongPath&);
diff --git a/src/live_effects/parameter/parameter.cpp b/src/live_effects/parameter/parameter.cpp
index 319ab3fe8..497113e03 100644
--- a/src/live_effects/parameter/parameter.cpp
+++ b/src/live_effects/parameter/parameter.cpp
@@ -129,9 +129,6 @@ ScalarParam::param_update_default(const gchar * default_value)
void
ScalarParam::param_set_value(gdouble val)
{
- if (value != val) {
- param_effect->upd_params = true;
- }
value = val;
if (integer)
value = round(value);
@@ -180,7 +177,7 @@ ScalarParam::param_set_undo(bool set_undo)
Gtk::Widget *
ScalarParam::param_newWidget()
{
- if(widget_is_visible){
+ if (widget_is_visible) {
Inkscape::UI::Widget::RegisteredScalar *rsu = Gtk::manage( new Inkscape::UI::Widget::RegisteredScalar(
param_label, param_tooltip, param_key, *param_wr, param_effect->getRepr(), param_effect->getSPDoc() ) );
@@ -192,6 +189,7 @@ ScalarParam::param_newWidget()
if (add_slider) {
rsu->addSlider();
}
+ rsu->signal_button_release_event().connect(sigc::mem_fun (*this, &ScalarParam::on_button_release));
if(_set_undo){
rsu->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change scalar parameter"));
}
@@ -201,6 +199,11 @@ ScalarParam::param_newWidget()
}
}
+bool ScalarParam::on_button_release(GdkEventButton* button_event) {
+ param_effect->upd_params = true;
+ return false;
+}
+
void
ScalarParam::param_set_digits(unsigned digits)
{
diff --git a/src/live_effects/parameter/parameter.h b/src/live_effects/parameter/parameter.h
index 1586ef346..aa4212f15 100644
--- a/src/live_effects/parameter/parameter.h
+++ b/src/live_effects/parameter/parameter.h
@@ -141,6 +141,8 @@ protected:
bool _set_undo;
private:
+ bool on_button_release(GdkEventButton* button_event);
+
ScalarParam(const ScalarParam&);
ScalarParam& operator=(const ScalarParam&);
};
diff --git a/src/live_effects/parameter/point.cpp b/src/live_effects/parameter/point.cpp
index da6edf812..ff5f59ce2 100644
--- a/src/live_effects/parameter/point.cpp
+++ b/src/live_effects/parameter/point.cpp
@@ -146,6 +146,7 @@ PointParam::param_newWidget()
pointwdg->setValue( *this );
pointwdg->clearProgrammatically();
pointwdg->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change point parameter"));
+ pointwdg->signal_button_release_event().connect(sigc::mem_fun (*this, &PointParam::on_button_release));
Gtk::HBox * hbox = Gtk::manage( new Gtk::HBox() );
static_cast<Gtk::HBox*>(hbox)->pack_start(*pointwdg, true, true);
@@ -153,6 +154,11 @@ PointParam::param_newWidget()
return dynamic_cast<Gtk::Widget *> (hbox);
}
+bool PointParam::on_button_release(GdkEventButton* button_event) {
+ param_effect->upd_params = true;
+ return false;
+}
+
void
PointParam::set_oncanvas_looks(SPKnotShapeType shape, SPKnotModeType mode, guint32 color)
{
diff --git a/src/live_effects/parameter/point.h b/src/live_effects/parameter/point.h
index 03256f6d0..6c5f8df65 100644
--- a/src/live_effects/parameter/point.h
+++ b/src/live_effects/parameter/point.h
@@ -57,6 +57,7 @@ public:
private:
PointParam(const PointParam&);
PointParam& operator=(const PointParam&);
+ bool on_button_release(GdkEventButton* button_event);
Geom::Point defvalue;
bool liveupdate;
KnotHolder *knoth;
diff --git a/src/live_effects/parameter/random.cpp b/src/live_effects/parameter/random.cpp
index c2c1b5440..4afa43c6e 100644
--- a/src/live_effects/parameter/random.cpp
+++ b/src/live_effects/parameter/random.cpp
@@ -103,7 +103,6 @@ RandomParam::param_update_default(const gchar * default_value){
void
RandomParam::param_set_value(gdouble val, long newseed)
{
- param_effect->upd_params = true;
value = val;
if (integer)
value = round(value);
@@ -154,12 +153,18 @@ RandomParam::param_newWidget()
}
regrandom->setRange(min, max);
regrandom->setProgrammatically = false;
+ regrandom->signal_button_release_event().connect(sigc::mem_fun (*this, &RandomParam::on_button_release));
regrandom->set_undo_parameters(SP_VERB_DIALOG_LIVE_PATH_EFFECT, _("Change random parameter"));
return dynamic_cast<Gtk::Widget *> (regrandom);
}
+bool RandomParam::on_button_release(GdkEventButton* button_event) {
+ param_effect->upd_params = true;
+ return false;
+}
+
RandomParam::operator gdouble()
{
return rand() * value;
diff --git a/src/live_effects/parameter/random.h b/src/live_effects/parameter/random.h
index c10473e85..a2c3712a1 100644
--- a/src/live_effects/parameter/random.h
+++ b/src/live_effects/parameter/random.h
@@ -57,6 +57,7 @@ protected:
gdouble defvalue;
private:
+ bool on_button_release(GdkEventButton* button_event);
long setup_seed(long);
gdouble rand();