diff options
Diffstat (limited to 'src/nodepath.h')
| -rw-r--r-- | src/nodepath.h | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/src/nodepath.h b/src/nodepath.h new file mode 100644 index 000000000..84c83be53 --- /dev/null +++ b/src/nodepath.h @@ -0,0 +1,266 @@ +#ifndef __SP_NODEPATH_H__ +#define __SP_NODEPATH_H__ + +/** \file + * Path handler in node edit mode + */ + +/* + * Authors: + * Lauris Kaplinski <lauris@kaplinski.com> + * + * This code is in public domain + */ + +//#include "knot.h" +//#include "sp-path.h" +//#include "desktop-handles.h" +#include "libnr/nr-path-code.h" + +#include <list> + +class SPDesktop; +class SPPath; +class SPKnot; + +namespace Inkscape { +namespace XML { +class Node; +} +} + + +/** + * Radial objects are represented by an angle and a distance from + * 0,0. 0,0 is represented by a == big_num. + */ +class Radial{ + public: +/** Radius */ + double r; +/** Amplitude */ + double a; + Radial() {} + // Radial(NR::Point const &p); // Convert a point to radial coordinates + Radial(Radial &p) : r(p.r),a(p.a) {} + // operator NR::Point() const; + +/** + * Construct Radial from NR::Point. + */ +Radial(NR::Point const &p) +{ + r = NR::L2(p); + if (r > 0) { + a = NR::atan2 (p); + } else { + a = HUGE_VAL; //undefined + } +} + +/** + * Cast Radial to cartesian NR::Point. + */ +operator NR::Point() const +{ + if (a == HUGE_VAL) { + return NR::Point(0,0); + } else { + return r*NR::Point(cos(a), sin(a)); + } +} + +}; + +/** defined in node-context.h */ +class SPNodeContext; + +namespace Inkscape { +namespace NodePath { + +/** + * This is a node on a subpath + */ +class Path; + +/** + * This is a subdivision of a NodePath + */ +class SubPath; + +class NodeSide; + +/** + * This is a node (point) along a subpath + */ +class Node; + + +/** + * This is a collection of subpaths which contain nodes + * + * In the following data model. Nodepaths are made up of subpaths which + * are comprised of nodes. + * + * Nodes are linked thus: + * \verbatim + n other + node -----> nodeside ------> node \endverbatim + */ +class Path { + public: +/** Pointer to the current desktop, for reporting purposes */ + SPDesktop * desktop; +/** The parent path of this nodepath */ + SPPath * path; +/** The context which created this nodepath. Important if this nodepath is deleted */ + SPNodeContext * nodeContext; +/** The subpaths which comprise this NodePath */ + GList * subpaths; +/** A list of nodes which are currently selected */ + GList * selected; +/** Transforms (userspace <---> virtual space? someone please describe ) + njh: I'd be guessing that these are item <-> desktop transforms.*/ + NR::Matrix i2d, d2i; +/** The DOM node which describes this NodePath */ + Inkscape::XML::Node *repr; + //STL compliant method to get the selected nodes + void selection(std::list<Node *> &l); +}; + + +/** + * This is the lowest list item, a simple list of nodes. + */ +class SubPath { + public: +/** The parent of this subpath */ + Path * nodepath; +/** Is this path closed (no endpoints) or not?*/ + gboolean closed; +/** The nodes in this subpath. */ + GList * nodes; +/** The first node of the subpath (does not imply open/closed)*/ + Node * first; +/** The last node of the subpath */ + Node * last; +}; + + + +/** + * What kind of node is this? This is the value for the node->type + * field. NodeType indicates the degree of continuity required for + * the node. I think that the corresponding integer indicates which + * derivate is connected. (Thus 2 means that the node is continuous + * to the second derivative, i.e. has matching endpoints and tangents) + */ +typedef enum { +/** A normal node */ + NODE_NONE, +/** This node non-continuously joins two segments.*/ + NODE_CUSP, +/** This node continuously joins two segments. */ + NODE_SMOOTH, +/** This node is symmetric. */ + NODE_SYMM +} NodeType; + + + +/** + * A NodeSide is a datarecord which may be on either side (n or p) of a node, + * which describes the segment going to the next node. + */ +class NodeSide{ + public: +/** Pointer to the next node, */ + Node * other; +/** Position */ + NR::Point pos; +/** Knots are Inkscape's way of providing draggable points. This + * Knot is the point on the curve representing the control point in a + * bezier curve.*/ + SPKnot * knot; +/** What kind of rendering? */ + SPCanvasItem * line; +/** */ + Radial origin; +}; + +/** + * A node along a NodePath + */ +class Node { + public: +/** The parent subpath of this node */ + SubPath * subpath; +/** Type is selected from NodeType.*/ + guint type : 4; +/** Code refers to which ArtCode is used to represent the segment + * (which segment?).*/ + guint code : 4; +/** Boolean. Am I currently selected or not? */ + guint selected : 1; +/** */ + NR::Point pos; +/** */ + NR::Point origin; +/** Knots are Inkscape's way of providing draggable points. This + * Knot is the point on the curve representing the endpoint.*/ + SPKnot * knot; +/** The NodeSide in the 'next' direction */ + NodeSide n; +/** The NodeSide in the 'previous' direction */ + NodeSide p; + + /** The pointer to the nodeside which we are dragging out with Shift */ + NodeSide *dragging_out; +}; + +} // namespace NodePath +} // namespace Inkscape + +// Do function documentation in nodepath.cpp +Inkscape::NodePath::Path * sp_nodepath_new (SPDesktop * desktop, SPItem * item); +void sp_nodepath_destroy (Inkscape::NodePath::Path * nodepath); +void sp_nodepath_deselect (Inkscape::NodePath::Path *nodepath); +void sp_nodepath_select_all (Inkscape::NodePath::Path *nodepath, bool invert); +void sp_nodepath_select_all_from_subpath(Inkscape::NodePath::Path *nodepath, bool invert); +void sp_nodepath_select_next (Inkscape::NodePath::Path *nodepath); +void sp_nodepath_select_prev (Inkscape::NodePath::Path *nodepath); +void sp_nodepath_select_rect (Inkscape::NodePath::Path * nodepath, NR::Rect const &b, gboolean incremental); +GList *save_nodepath_selection (Inkscape::NodePath::Path *nodepath); +void restore_nodepath_selection (Inkscape::NodePath::Path *nodepath, GList *r); +gboolean nodepath_repr_d_changed (Inkscape::NodePath::Path * np, const char *newd); +gboolean nodepath_repr_typestr_changed (Inkscape::NodePath::Path * np, const char *newtypestr); +gboolean node_key (GdkEvent * event); +void sp_nodepath_update_statusbar (Inkscape::NodePath::Path *nodepath); +void sp_nodepath_selected_align(Inkscape::NodePath::Path *nodepath, NR::Dim2 axis); +void sp_nodepath_selected_distribute(Inkscape::NodePath::Path *nodepath, NR::Dim2 axis); +void sp_nodepath_select_segment_near_point(SPItem * item, NR::Point p, bool toggle); +void sp_nodepath_add_node_near_point(SPItem * item, NR::Point p); +void sp_nodepath_curve_drag(Inkscape::NodePath::Node * e, double t, NR::Point delta, char * key); +Inkscape::NodePath::Node * sp_nodepath_get_node_by_index(int index); +/* possibly private functions */ + +void sp_node_selected_add_node (void); +void sp_node_selected_break (void); +void sp_node_selected_duplicate (void); +void sp_node_selected_join (void); +void sp_node_selected_join_segment (void); +void sp_node_selected_delete (void); +void sp_node_selected_delete_segment (void); +void sp_node_selected_set_type (Inkscape::NodePath::NodeType type); +void sp_node_selected_set_line_type (NRPathcode code); +void sp_node_selected_move (gdouble dx, gdouble dy); +void sp_node_selected_move_screen (gdouble dx, gdouble dy); + +void sp_nodepath_selected_nodes_rotate (Inkscape::NodePath::Path * nodepath, gdouble angle, int which, bool screen); + +void sp_nodepath_selected_nodes_scale (Inkscape::NodePath::Path * nodepath, gdouble grow, int which); +void sp_nodepath_selected_nodes_scale_screen (Inkscape::NodePath::Path * nodepath, gdouble grow, int which); + +void sp_nodepath_flip (Inkscape::NodePath::Path *nodepath, NR::Dim2 axis); + +#endif |
