Code

Connector tool: make connectors avoid the convex hull of shapes.
[inkscape.git] / src / shape-editor.h
index 48d008b1fe103bdbc7b2ca3156f74f26850757b4..98dbb35d7f94c266d5f4ac7899e963971f40c4be 100644 (file)
  */
 
 #include <forward.h>
-#include <libnr/nr-forward.h>
+#include <2geom/forward.h>
 
 namespace Inkscape { namespace NodePath { class Path; } }
-
-#include "libnr/nr-path-code.h"
-#include "libnr/nr-point.h"
-#include "libnr/nr-maybe.h"
-#include <vector>
+namespace Inkscape { namespace XML { class Node; } }
 
 class KnotHolder;
 class SPDesktop;
 class SPNodeContext;
 class ShapeEditorsCollective;
+class LivePathEffectObject;
+
+#include "libnr/nr-path-code.h"
+#include <2geom/point.h>
+#include <boost/optional.hpp>
+#include <vector>
+
+enum SubType{
+    SH_NODEPATH,
+    SH_KNOTHOLDER
+};
 
 class ShapeEditor {
 public:
@@ -33,19 +40,15 @@ public:
     ShapeEditor(SPDesktop *desktop);
     ~ShapeEditor();
 
-    void set_item (SPItem *item);
-    void set_item_lpe_path_parameter(SPItem *item, SPObject *lpeobject, const char * key);
-    void set_knotholder(KnotHolder * knot_holder);
-    void reset_item ();
-    void unset_item ();
+    void set_item (SPItem *item, SubType type, bool keep_knotholder = false);
+    void set_item_lpe_path_parameter(SPItem *item, LivePathEffectObject *lpeobject, const char * key);
+    void unset_item (SubType type, bool keep_knotholder = false);
 
-    SPItem *get_item ();
+    bool has_nodepath (); //((deprecated))
+    void update_knotholder (); //((deprecated))
 
-    bool has_nodepath ();
-    bool has_knotholder ();
-
-    bool has_local_change ();
-    void decrement_local_change ();
+    bool has_local_change (SubType type);
+    void decrement_local_change (SubType type);
 
     GList *save_nodepath_selection ();
     void restore_nodepath_selection (GList *saved);
@@ -54,7 +57,7 @@ public:
 
     void update_statusbar ();
 
-    bool is_over_stroke (NR::Point event_p, bool remember);
+    bool is_over_stroke (Geom::Point event_p, bool remember);
 
     void add_node_near_point(); // uses the shapeeditor's remembered point, if any
 
@@ -68,7 +71,7 @@ public:
 
     void finish_drag ();
 
-    void select_rect (NR::Rect  const &rect, bool add);
+    void select_rect (Geom::Rect  const &rect, bool add);
 
     bool has_selection ();
     void deselect ();
@@ -93,7 +96,7 @@ public:
     void set_type_of_segments(NRPathcode code);
 
     void move_nodes(gdouble dx, gdouble dy);
-    void move_nodes_screen(gdouble dx, gdouble dy);
+    void move_nodes_screen(SPDesktop *desktop, gdouble dx, gdouble dy);
 
     void rotate_nodes(gdouble angle, int which, bool screen);
 
@@ -108,17 +111,26 @@ public:
     void show_handles (bool show);
     void show_helperpath (bool show);
 
-    void flip (NR::Dim2 axis, NR::Maybe<NR::Point> center = NR::Nothing());
+    void flip (Geom::Dim2 axis, boost::optional<Geom::Point> center = boost::optional<Geom::Point>());
 
-    void distribute (NR::Dim2 axis);
-    void align (NR::Dim2 axis);
+    void distribute (Geom::Dim2 axis);
+    void align (Geom::Dim2 axis);
 
     bool nodepath_edits_repr_key(gchar const *name);
 
+    // this one is only public because it's called from non-C++ repr changed callback
+    void shapeeditor_event_attr_changed(gchar const *name);
+
 private:
+    bool has_knotholder ();
+    void reset_item (SubType type, bool keep_knotholder = true);
+    const SPItem *get_item (SubType type);
+
     SPDesktop *desktop;
 
     Inkscape::NodePath::Path *nodepath;
+
+    // TODO: std::list<KnotHolder *> knotholders;
     KnotHolder *knotholder;
 
     ShapeEditorsCollective *container;
@@ -128,8 +140,11 @@ private:
     double grab_t;
     int grab_node; // number of node grabbed by sp_node_context_is_over_stroke
     bool hit;
-    NR::Point curvepoint_event; // int coords from event
-    NR::Point curvepoint_doc; // same, in doc coords
+    Geom::Point curvepoint_event; // int coords from event
+    Geom::Point curvepoint_doc; // same, in doc coords
+
+    Inkscape::XML::Node *knotholder_listener_attached_for;
+    Inkscape::XML::Node *nodepath_listener_attached_for;
 };