Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
point.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * Copyright (C) Johan Engelen 2007 <j.b.c.engelen@utwente.nl>
4 *
5 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
6 */
7
8#include "point.h"
9
10#include <utility>
11#include <glibmm/i18n.h>
12#include <gtkmm/box.h>
13#include <sigc++/functors/mem_fun.h>
14
15#include "inkscape.h"
16#include "live_effects/effect.h"
17#include "svg/stringstream.h"
18#include "svg/svg.h"
19#include "ui/controller.h"
20#include "ui/icon-names.h"
22#include "ui/knot/knot-holder.h"
23#include "ui/pack.h"
24#include "ui/widget/point.h"
25
27
28PointParam::PointParam(const Glib::ustring& label, const Glib::ustring& tip,
29 const Glib::ustring& key, Inkscape::UI::Widget::Registry* wr,
30 Effect * const effect, std::optional<Glib::ustring> htip, Geom::Point default_value,
31 bool live_update )
32 : Parameter(label, tip, key, wr, effect)
33 , defvalue{std::move(default_value)}
34 , liveupdate(live_update)
35 , handle_tip{std::move(htip)}
36{
37}
38
45
46void
51
52void
54{
55 liveupdate = live_update;
56}
57
62
63void
68
69void
70PointParam::param_update_default(char const * const default_point)
71{
73 double newx, newy;
74 unsigned int success = sp_svg_number_read_d(strarray[0], &newx);
75 success += sp_svg_number_read_d(strarray[1], &newy);
77 if (success == 2) {
79 }
80}
81
82void
84 if (_knot_entity) {
85 bool update = false;
86 if (hide && _knot_entity->knot->flags & SP_KNOT_VISIBLE) {
87 update = true;
89 } else if(!hide && !(_knot_entity->knot->flags & SP_KNOT_VISIBLE)) {
90 update = true;
92 }
93 if (update) {
95 }
96 }
97}
98
99void
101{
102 *dynamic_cast<Geom::Point *>( this ) = newpoint;
103 if(write){
105 os << newpoint;
106 param_write_to_repr(os.str().c_str());
107 }
110 }
111}
112
113bool
114PointParam::param_readSVGValue(char const * const strvalue)
115{
116 gchar ** strarray = g_strsplit(strvalue, ",", 2);
117 double newx, newy;
118 unsigned int success = sp_svg_number_read_d(strarray[0], &newx);
119 success += sp_svg_number_read_d(strarray[1], &newy);
121 if (success == 2) {
123 return true;
124 }
125 return false;
126}
127
128Glib::ustring
135
136Glib::ustring
138{
140 os << defvalue;
141 return os.str();
142}
143
144void
146{
147 param_setValue( (*this) * postmul, true);
148}
149
150Gtk::Widget *
152{
153 auto const pointwdg = Gtk::make_managed<UI::Widget::RegisteredTransformedPoint>( param_label,
155 param_key,
156 *param_wr,
160 pointwdg->setTransform(transf);
161 pointwdg->setValue( *this );
162 pointwdg->clearProgrammatically();
163 pointwdg->set_undo_parameters(_("Change point parameter"), INKSCAPE_ICON("dialog-path-effects"));
164 pointwdg->signal_x_value_changed().connect(sigc::mem_fun(*this, &PointParam::on_value_changed));
165 pointwdg->signal_y_value_changed().connect(sigc::mem_fun(*this, &PointParam::on_value_changed));
166
167 auto const hbox = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
168 UI::pack_start(*hbox, *pointwdg, true, true);
169 return hbox;
170}
171
176
177void PointParam::set_oncanvas_looks(CanvasItemCtrlShape shape, std::uint32_t const color)
178{
179 knot_shape = shape;
180 knot_color = color;
181}
182
183class PointParamKnotHolderEntity final : public KnotHolderEntity {
184public:
185 PointParamKnotHolderEntity(PointParam * const p) : pparam{p} {}
186 ~PointParamKnotHolderEntity() final { this->pparam->_knot_entity = nullptr;}
187
188 void knot_set(Geom::Point const &p, Geom::Point const &origin, unsigned state) final;
189 Geom::Point knot_get() const final;
190 void knot_ungrabbed(Geom::Point const &p, Geom::Point const &origin, unsigned state) final;
191 void knot_click(unsigned state) final;
192
193private:
194 PointParam *pparam = nullptr;
195};
196
197void
198PointParamKnotHolderEntity::knot_set(Geom::Point const &p, Geom::Point const &origin,
199 unsigned const state)
200{
201 Geom::Point s = snap_knot_position(p, state);
202 if (state & GDK_CONTROL_MASK) {
205 double distanceA = Geom::distance(A,p);
206 double distanceB = Geom::distance(B,p);
207 if(distanceA > distanceB){
208 s = B;
209 } else {
210 s = A;
211 }
212 }
213 if(this->pparam->liveupdate){
214 pparam->param_setValue(s, true);
215 } else {
216 pparam->param_setValue(s);
217 }
218}
219
220void
221PointParamKnotHolderEntity::knot_ungrabbed(Geom::Point const &p, Geom::Point const &origin,
222 unsigned const state)
223{
224 pparam->param_effect->makeUndoDone(_("Move handle"));
225}
226
228PointParamKnotHolderEntity::knot_get() const
229{
230 return *pparam;
231}
232
233void
234PointParamKnotHolderEntity::knot_click(unsigned const state)
235{
236 if (state & GDK_CONTROL_MASK) {
237 if (state & GDK_ALT_MASK) {
238 this->pparam->param_set_default();
239 pparam->param_setValue(*pparam,true);
240 }
241 }
242}
243
244void
246{
247 _knot_entity = new PointParamKnotHolderEntity(this);
248 // TODO: can we ditch handleTip() etc. because we have access to handle_tip etc. itself???
249 _knot_entity->create(nullptr, item, knotholder, Inkscape::CANVAS_ITEM_CTRL_TYPE_LPE, "LPE:Point",
250 handleTip(), knot_color);
251 knotholder->add(_knot_entity);
252}
253
254} // namespace Inkscape::LivePathEffect
255
256/*
257 Local Variables:
258 mode:c++
259 c-file-style:"stroustrup"
260 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
261 indent-tabs-mode:nil
262 fill-column:99
263 End:
264*/
265// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
pair< double, double > Point
Definition parser.cpp:7
Point origin
Definition aa.cpp:227
3x3 matrix representing an affine transformation.
Definition affine.h:70
Two-dimensional point that doubles as a vector.
Definition point.h:66
constexpr Coord x() const noexcept
Definition point.h:104
Inkscape::XML::Node * getRepr()
Definition effect.cpp:1928
Inkscape::UI::Widget::Registry * param_wr
Definition parameter.h:99
void param_write_to_repr(const char *svgd)
Definition parameter.cpp:52
Glib::ustring param_getSVGValue() const final
Definition point.cpp:129
void param_update_default(Geom::Point default_point)
Definition point.cpp:64
Inkscape::CanvasItemCtrlShape knot_shape
Definition point.h:83
PointParam(const Glib::ustring &label, const Glib::ustring &tip, const Glib::ustring &key, Inkscape::UI::Widget::Registry *wr, Effect *effect, std::optional< Glib::ustring > handle_tip={}, Geom::Point default_value=Geom::Point(0, 0), bool live_update=true)
Definition point.cpp:28
void set_oncanvas_looks(Inkscape::CanvasItemCtrlShape shape, std::uint32_t color)
Definition point.cpp:177
bool param_readSVGValue(char const *strvalue) final
Definition point.cpp:114
Geom::Point param_get_default() const
Definition point.cpp:59
void param_setValue(Geom::Point newpoint, bool write=false)
Definition point.cpp:100
Glib::ustring param_getDefaultSVGValue() const final
Definition point.cpp:137
void param_set_liveupdate(bool live_update)
Definition point.cpp:53
void addKnotHolderEntities(KnotHolder *knotholder, SPItem *item) final
Definition point.cpp:245
KnotHolderEntity * _knot_entity
Definition point.h:82
Gtk::Widget * param_newWidget() final
Definition point.cpp:151
void param_transform_multiply(Geom::Affine const &, bool set) final
Definition point.cpp:145
std::string str() const
KnotHolderEntity definition.
Geom::Point snap_knot_position(Geom::Point const &p, unsigned state)
KnotHolder * parent_holder
virtual void update_knot()
void remove(KnotHolderEntity *e)
void add(KnotHolderEntity *e)
Base class for visual SVG elements.
Definition sp-item.h:109
unsigned int flags
Definition knot.h:63
void hide()
Hide knot on its canvas.
Definition knot.cpp:327
void show()
Show knot on its canvas.
Definition knot.cpp:322
Utilities to more easily use Gtk::EventController & subclasses like Gesture.
@ Y
Definition coord.h:48
@ X
Definition coord.h:48
Macro for icon names used in Inkscape.
@ SP_KNOT_VISIBLE
Definition knot-enums.h:30
Glib::ustring label
Various utility functions.
Definition affine.h:22
Angle distance(Angle const &a, Angle const &b)
Definition angle.h:163
Live Path Effects code.
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
@ CANVAS_ITEM_CTRL_TYPE_LPE
STL namespace.
static cairo_user_data_key_t key
Helpers for using Gtk::Boxes, encapsulating large changes between GTK3 & GTK4.
unsigned int sp_svg_number_read_d(gchar const *str, double *val)
TODO: insert short description here.