Code

First GSoC node tool commit to Bazaar
[inkscape.git] / src / shape-editor.h
1 #ifndef __SHAPE_EDITOR_H__
2 #define __SHAPE_EDITOR_H__
4 /*
5  * Inkscape::ShapeEditor
6  *
7  * This is a container class which contains either knotholder (for shapes) or nodepath (for
8  * paths). It is attached to a single item so only one of these is active at a time.
9  *
10  * Authors:
11  *   bulia byak <buliabyak@users.sf.net>
12  *
13  */
15 #include <forward.h>
16 #include <2geom/forward.h>
18 namespace Inkscape { namespace NodePath { class Path; } }
19 namespace Inkscape { namespace XML { class Node; } }
21 class KnotHolder;
22 class SPDesktop;
23 class SPNodeContext;
24 class ShapeEditorsCollective;
25 class LivePathEffectObject;
27 #include "libnr/nr-path-code.h"
28 #include <2geom/point.h>
29 #include <boost/optional.hpp>
30 #include <vector>
32 enum SubType{
33     SH_NODEPATH,
34     SH_KNOTHOLDER
35 };
37 class ShapeEditor {
38 public:
40     ShapeEditor(SPDesktop *desktop);
41     ~ShapeEditor();
43     void set_item (SPItem *item, SubType type, bool keep_knotholder = false);
44     void set_item_lpe_path_parameter(SPItem *item, LivePathEffectObject *lpeobject, const char * key);
45     void unset_item (SubType type, bool keep_knotholder = false);
47     bool has_nodepath (); //((deprecated))
48     void update_knotholder (); //((deprecated))
50     bool has_local_change (SubType type);
51     void decrement_local_change (SubType type);
53     GList *save_nodepath_selection ();
54     void restore_nodepath_selection (GList *saved);
56     void nodepath_destroyed ();
58     void update_statusbar ();
60     bool is_over_stroke (Geom::Point event_p, bool remember);
62     void add_node_near_point(); // uses the shapeeditor's remembered point, if any
64     void select_segment_near_point(bool toggle); // uses the shapeeditor's remembered point, if any
66     void cancel_hit ();
68     bool hits_curve ();
70     void curve_drag (gdouble eventx, gdouble eventy);
72     void finish_drag ();
74     void select_rect (Geom::Rect  const &rect, bool add);
76     bool has_selection ();
77     void deselect ();
79     Inkscape::NodePath::Path *get_nodepath() {return nodepath;} //((deprecated))
80     ShapeEditorsCollective *get_container() {return container;}
82     void add_node();
84     void delete_nodes();
85     void delete_nodes_preserving_shape();
86     void delete_segment();
88     void set_node_type(int type);
90     void break_at_nodes();
91     void join_nodes();
92     void join_segments();
94     void duplicate_nodes();
96     void set_type_of_segments(NRPathcode code);
98     void move_nodes(gdouble dx, gdouble dy);
99     void move_nodes_screen(SPDesktop *desktop, gdouble dx, gdouble dy);
101     void rotate_nodes(gdouble angle, int which, bool screen);
103     void scale_nodes(gdouble const grow, int const which);
104     void scale_nodes_screen(gdouble const grow, int const which);
106     void select_all (bool invert);
107     void select_all_from_subpath (bool invert);
108     void select_next ();
109     void select_prev ();
111     void show_handles (bool show);
112     void show_helperpath (bool show);
114     void flip (Geom::Dim2 axis, boost::optional<Geom::Point> center = boost::optional<Geom::Point>());
116     void distribute (Geom::Dim2 axis);
117     void align (Geom::Dim2 axis);
119     bool nodepath_edits_repr_key(gchar const *name);
121     // this one is only public because it's called from non-C++ repr changed callback
122     void shapeeditor_event_attr_changed(gchar const *name);
124 private:
125     bool has_knotholder ();
126     void reset_item (SubType type, bool keep_knotholder = true);
127     const SPItem *get_item (SubType type);
129     SPDesktop *desktop;
131     Inkscape::NodePath::Path *nodepath;
133     // TODO: std::list<KnotHolder *> knotholders;
134     KnotHolder *knotholder;
136     ShapeEditorsCollective *container;
138     //Inkscape::XML::Node *lidtened_repr;
140     double grab_t;
141     int grab_node; // number of node grabbed by sp_node_context_is_over_stroke
142     bool hit;
143     Geom::Point curvepoint_event; // int coords from event
144     Geom::Point curvepoint_doc; // same, in doc coords
146     Inkscape::XML::Node *knotholder_listener_attached_for;
147     Inkscape::XML::Node *nodepath_listener_attached_for;
148 };
150 #endif
153 /*
154   Local Variables:
155   mode:c++
156   c-file-style:"stroustrup"
157   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
158   indent-tabs-mode:nil
159   fill-column:99
160   End:
161 */
162 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :