Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
vector.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) Johan Engelen 2008 <j.b.c.engelen@utwente.nl>
4 *
5 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
6 */
7
8#include "vector.h"
9
10#include <glibmm/i18n.h>
11
12#include "live_effects/effect.h"
13#include "object/sp-lpe-item.h"
14#include "svg/svg.h"
15#include "svg/stringstream.h"
16#include "ui/icon-names.h"
17#include "ui/pack.h"
18#include "ui/knot/knot-holder.h"
21
22namespace Inkscape {
23namespace LivePathEffect {
24
25VectorParam::VectorParam( const Glib::ustring& label, const Glib::ustring& tip,
26 const Glib::ustring& key, Inkscape::UI::Widget::Registry* wr,
27 Effect* effect, Geom::Point default_vector)
28 : Parameter(label, tip, key, wr, effect),
29 defvalue(default_vector),
30 origin(0.,0.),
31 vector(default_vector)
32{
33}
34
36
37void
43
44void
46{
47 defvalue = default_point;
48}
49
50void
51VectorParam::param_update_default(const gchar * default_point)
52{
53 gchar ** strarray = g_strsplit(default_point, ",", 2);
54 double newx, newy;
55 unsigned int success = sp_svg_number_read_d(strarray[0], &newx);
56 success += sp_svg_number_read_d(strarray[1], &newy);
57 g_strfreev (strarray);
58 if (success == 2) {
59 param_update_default( Geom::Point(newx, newy) );
60 }
61}
62
63bool
64VectorParam::param_readSVGValue(const gchar * strvalue)
65{
66 gchar ** strarray = g_strsplit(strvalue, ",", 4);
67 if (!strarray) {
68 return false;
69 }
70 double val[4];
71 unsigned int i = 0;
72 while (i < 4 && strarray[i]) {
73 if (sp_svg_number_read_d(strarray[i], &val[i]) != 0) {
74 i++;
75 } else {
76 break;
77 }
78 }
79 g_strfreev (strarray);
80 if (i == 4) {
81 setOrigin( Geom::Point(val[0], val[1]) );
82 setVector( Geom::Point(val[2], val[3]) );
83 return true;
84 }
85 return false;
86}
87
88Glib::ustring
90{
92 os << origin << " , " << vector;
93 return os.str();
94}
95
96Glib::ustring
98{
100 os << defvalue;
101 return os.str();
102}
103
104Gtk::Widget *
106{
107 auto const pointwdg = Gtk::make_managed<UI::Widget::RegisteredVector>( param_label,
109 param_key,
110 *param_wr,
113 pointwdg->setPolarCoords();
114 pointwdg->setValue( vector, origin );
115 pointwdg->clearProgrammatically();
116 pointwdg->set_undo_parameters(_("Change vector parameter"), INKSCAPE_ICON("dialog-path-effects"));
117
118 auto const hbox = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
119 UI::pack_start(*hbox, *pointwdg, true, true);
120 return hbox;
121}
122
123void
125{
126 setValues(new_origin, new_vector);
128}
129
130void
132{
134}
135
137{
138 vec_knot_shape = shape;
139 vec_knot_color = color;
140}
141
143{
144 ori_knot_shape = shape;
145 ori_knot_color = color;
146}
147
149{
150 vec_knot_color = color;
151 ori_knot_color = color;
152}
153
154class VectorParamKnotHolderEntity_Origin : public KnotHolderEntity {
155public:
156 VectorParamKnotHolderEntity_Origin(VectorParam *p) : param(p) { }
157 ~VectorParamKnotHolderEntity_Origin() override = default;
158
159 void knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint state) override {
160 Geom::Point const s = snap_knot_position(p, state);
161 param->setOrigin(s);
162 param->set_and_write_new_values(param->origin, param->vector);
163 sp_lpe_item_update_patheffect(cast<SPLPEItem>(item), false, false);
164 };
165 Geom::Point knot_get() const override {
166 return param->origin;
167 };
168 void knot_ungrabbed(Geom::Point const &p, Geom::Point const &origin, guint state) override
169 {
170 param->param_effect->makeUndoDone(_("Move handle"));
171 };
172 void knot_click(guint /*state*/) override{
173 g_message ("This is the origin handle associated to parameter '%s'", param->param_key.c_str());
174 };
175
176private:
177 VectorParam *param;
178};
179
180class VectorParamKnotHolderEntity_Vector : public KnotHolderEntity {
181public:
182 VectorParamKnotHolderEntity_Vector(VectorParam *p) : param(p) { }
183 ~VectorParamKnotHolderEntity_Vector() override = default;
184
185 void knot_set(Geom::Point const &p, Geom::Point const &/*origin*/, guint /*state*/) override {
186 Geom::Point const s = p - param->origin;
188 param->setVector(s);
189 param->set_and_write_new_values(param->origin, param->vector);
190 sp_lpe_item_update_patheffect(cast<SPLPEItem>(item), false, false);
191 };
192 Geom::Point knot_get() const override {
193 return param->origin + param->vector;
194 };
195 void knot_ungrabbed(Geom::Point const &p, Geom::Point const &origin, guint state) override
196 {
197 param->param_effect->makeUndoDone(_("Move handle"));
198 }
199 void knot_click(guint /*state*/) override{
200 g_message ("This is the vector handle associated to parameter '%s'", param->param_key.c_str());
201 };
202
203private:
204 VectorParam *param;
205};
206
207void
209{
211 origin_e->create(nullptr, item, knotholder, Inkscape::CANVAS_ITEM_CTRL_TYPE_LPE, "LPE:Origin",
213 knotholder->add(origin_e);
214
216 vector_e->create(nullptr, item, knotholder, Inkscape::CANVAS_ITEM_CTRL_TYPE_LPE, "LPE:Vector",
218 knotholder->add(vector_e);
219}
220
221} /* namespace LivePathEffect */
222} /* namespace Inkscape */
223
224/*
225 Local Variables:
226 mode:c++
227 c-file-style:"stroustrup"
228 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
229 indent-tabs-mode:nil
230 fill-column:99
231 End:
232*/
233// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
Point origin
Definition aa.cpp:227
3x3 matrix representing an affine transformation.
Definition affine.h:70
Affine withoutTranslation() const
Definition affine.h:169
Two-dimensional point that doubles as a vector.
Definition point.h:66
Inkscape::XML::Node * getRepr()
Definition effect.cpp:1934
Inkscape::UI::Widget::Registry * param_wr
Definition parameter.h:99
void param_write_to_repr(const char *svgd)
Definition parameter.cpp:52
friend class VectorParamKnotHolderEntity_Vector
Definition vector.h:76
void param_update_default(Geom::Point default_point)
Definition vector.cpp:45
bool param_readSVGValue(const gchar *strvalue) override
Definition vector.cpp:64
void param_transform_multiply(Geom::Affine const &postmul, bool set) override
Definition vector.cpp:131
void setVector(Geom::Point const &new_vector)
Definition vector.h:44
const gchar * handleTip() const
Definition vector.h:35
void set_vector_oncanvas_looks(CanvasItemCtrlShape shape, uint32_t color)
Definition vector.cpp:136
void set_oncanvas_color(guint32 color)
Definition vector.cpp:148
void setOrigin(Geom::Point const &new_origin)
Definition vector.h:45
void addKnotHolderEntities(KnotHolder *knotholder, SPItem *item) override
Definition vector.cpp:208
Inkscape::CanvasItemCtrlShape ori_knot_shape
Definition vector.h:72
Glib::ustring param_getDefaultSVGValue() const override
Definition vector.cpp:97
VectorParam(const Glib::ustring &label, const Glib::ustring &tip, const Glib::ustring &key, Inkscape::UI::Widget::Registry *wr, Effect *effect, Geom::Point default_vector=Geom::Point(1, 0))
Definition vector.cpp:25
void set_and_write_new_values(Geom::Point const &new_origin, Geom::Point const &new_vector)
Definition vector.cpp:124
void set_origin_oncanvas_looks(CanvasItemCtrlShape shape, uint32_t color)
Definition vector.cpp:142
friend class VectorParamKnotHolderEntity_Origin
Definition vector.h:75
Gtk::Widget * param_newWidget() override
Definition vector.cpp:105
Inkscape::CanvasItemCtrlShape vec_knot_shape
The looks of the vector and origin knots oncanvas.
Definition vector.h:70
void setValues(Geom::Point const &new_origin, Geom::Point const &new_vector)
Definition vector.h:43
Glib::ustring param_getSVGValue() const override
Definition vector.cpp:89
std::string str() const
KnotHolderEntity definition.
virtual void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned state)=0
Geom::Point snap_knot_position(Geom::Point const &p, unsigned state)
virtual void knot_ungrabbed(Geom::Point const &p, Geom::Point const &origin, unsigned state)=0
virtual void knot_click(unsigned)
void add(KnotHolderEntity *e)
Base class for visual SVG elements.
Definition sp-item.h:109
Macro for icon names used in Inkscape.
SPItem * item
Glib::ustring label
void pack_start(Gtk::Box &box, Gtk::Widget &child, bool const expand, bool const fill, unsigned const padding)
Adds child to box, packed with reference to the start of box.
Definition pack.cpp:141
Helper class to stream background task notifications as a series of messages.
@ CANVAS_ITEM_CTRL_TYPE_LPE
static cairo_user_data_key_t key
Helpers for using Gtk::Boxes, encapsulating large changes between GTK3 & GTK4.
void sp_lpe_item_update_patheffect(SPLPEItem *lpeitem, bool wholetree, bool write, bool with_satellites)
Calls any registered handlers for the update_patheffect action.
Base class for live path effect items.
unsigned int sp_svg_number_read_d(gchar const *str, double *val)
TODO: insert short description here.