Code

Translations. French translation minor update.
[inkscape.git] / src / snap.h
index 5696dcd536a3fe3cac2441c04bcd92ec42174c11..8f8416ee5ad0c2216efb32bfedb3739dab372739 100644 (file)
@@ -10,7 +10,7 @@
  *
  * Copyright (C) 2006-2007 Johan Engelen <johan@shouraizou.nl>
  * Copyright (C) 2000-2002 Lauris Kaplinski
- * Copyright (C) 2000-2009 Authors
+ * Copyright (C) 2000-2010 Authors
  *
  * Released under GNU GPL, read the file 'COPYING' for more information
  */
@@ -66,14 +66,15 @@ class SPNamedView;
 class SnapManager
 {
 public:
-       enum Transformation {
-        TRANSLATION,
+    enum Transformation {
+        TRANSLATE,
         SCALE,
         STRETCH,
-        SKEW
+        SKEW,
+        ROTATE
     };
 
-       SnapManager(SPNamedView const *v);
+    SnapManager(SPNamedView const *v);
 
     typedef std::list<const Inkscape::Snapper*> SnapperList;
 
@@ -81,95 +82,108 @@ public:
     bool gridSnapperMightSnap() const;
 
     void setup(SPDesktop const *desktop,
-                       bool snapindicator = true,
-                       SPItem const *item_to_ignore = NULL,
-                       std::vector<std::pair<Geom::Point, int> > *unselected_nodes = NULL,
-                       SPGuide *guide_to_ignore = NULL);
+            bool snapindicator = true,
+            SPItem const *item_to_ignore = NULL,
+            std::vector<Inkscape::SnapCandidatePoint> *unselected_nodes = NULL,
+            SPGuide *guide_to_ignore = NULL);
 
     void setup(SPDesktop const *desktop,
-               bool snapindicator,
-               std::vector<SPItem const *> const &items_to_ignore,
-               std::vector<std::pair<Geom::Point, int> > *unselected_nodes = NULL,
-               SPGuide *guide_to_ignore = NULL);
+               bool snapindicator,
+               std::vector<SPItem const *> &items_to_ignore,
+               std::vector<Inkscape::SnapCandidatePoint> *unselected_nodes = NULL,
+               SPGuide *guide_to_ignore = NULL);
+
     void setupIgnoreSelection(SPDesktop const *desktop,
                               bool snapindicator = true,
-                              std::vector<std::pair<Geom::Point, int> > *unselected_nodes = NULL,
+                              std::vector<Inkscape::SnapCandidatePoint> *unselected_nodes = NULL,
                               SPGuide *guide_to_ignore = NULL);
 
+    void unSetup() {_rotation_center_source_items = NULL;
+                    _guide_to_ignore = NULL;
+                    _desktop = NULL;
+                    _unselected_nodes = NULL;}
+
+    // If we're dragging a rotation center, then setRotationCenterSource() stores the parent item
+    // of this rotation center; this reference is used to make sure that we do not snap a rotation
+    // center to itself
+    // NOTE: Must be called after calling setup(), not before!
+    void setRotationCenterSource(GSList *items) {_rotation_center_source_items = items;}
+    GSList const *getRotationCenterSource() {return _rotation_center_source_items;}
+
     // freeSnapReturnByRef() is preferred over freeSnap(), because it only returns a
     // point if snapping has occurred (by overwriting p); otherwise p is untouched
-    void freeSnapReturnByRef(Inkscape::SnapPreferences::PointType point_type,
-                                                       Geom::Point &p,
-                                                       Inkscape::SnapSourceType const source_type,
-                                                       bool first_point = true,
-                                                       Geom::OptRect const &bbox_to_snap = Geom::OptRect()) const;
+    void freeSnapReturnByRef(Geom::Point &p,
+                                Inkscape::SnapSourceType const source_type,
+                                Geom::OptRect const &bbox_to_snap = Geom::OptRect()) const;
 
-
-    Inkscape::SnappedPoint freeSnap(Inkscape::SnapPreferences::PointType point_type,
-                                                                       Geom::Point const &p,
-                                                           Inkscape::SnapSourceType const &source_type,
-                                       bool first_point = true,
+    Inkscape::SnappedPoint freeSnap(Inkscape::SnapCandidatePoint const &p,
                                     Geom::OptRect const &bbox_to_snap = Geom::OptRect() ) const;
 
-    Geom::Point multipleOfGridPitch(Geom::Point const &t) const;
+    void preSnap(Inkscape::SnapCandidatePoint const &p);
+
+    Geom::Point multipleOfGridPitch(Geom::Point const &t, Geom::Point const &origin);
 
     // constrainedSnapReturnByRef() is preferred over constrainedSnap(), because it only returns a
     // point, by overwriting p, if snapping has occurred; otherwise p is untouched
-    void constrainedSnapReturnByRef(Inkscape::SnapPreferences::PointType point_type,
-                                                                       Geom::Point &p,
-                                                                       Inkscape::SnapSourceType const source_type,
-                                                                       Inkscape::Snapper::ConstraintLine const &constraint,
-                                                                       bool first_point = true,
-                                                                       Geom::OptRect const &bbox_to_snap = Geom::OptRect()) const;
-
-    Inkscape::SnappedPoint constrainedSnap(Inkscape::SnapPreferences::PointType point_type,
-                                                                                  Geom::Point const &p,
-                                                                                  Inkscape::SnapSourceType const &source_type,
-                                                                                  Inkscape::Snapper::ConstraintLine const &constraint,
-                                                                                  bool first_point = true,
+    void constrainedSnapReturnByRef(Geom::Point &p,
+                                    Inkscape::SnapSourceType const source_type,
+                                    Inkscape::Snapper::SnapConstraint const &constraint,
+                                    Geom::OptRect const &bbox_to_snap = Geom::OptRect()) const;
+
+    Inkscape::SnappedPoint constrainedSnap(Inkscape::SnapCandidatePoint const &p,
+                                           Inkscape::Snapper::SnapConstraint const &constraint,
                                            Geom::OptRect const &bbox_to_snap = Geom::OptRect()) const;
 
+    Inkscape::SnappedPoint multipleConstrainedSnaps(Inkscape::SnapCandidatePoint const &p,
+                                                    std::vector<Inkscape::Snapper::SnapConstraint> const &constraints,
+                                                    bool dont_snap = false,
+                                                    Geom::OptRect const &bbox_to_snap = Geom::OptRect()) const;
+
+    Inkscape::SnappedPoint constrainedAngularSnap(Inkscape::SnapCandidatePoint const &p,
+                                                    boost::optional<Geom::Point> const &p_ref,
+                                                    Geom::Point const &o,
+                                                    unsigned const snaps) const;
+
     void guideFreeSnap(Geom::Point &p, Geom::Point const &guide_normal, SPGuideDragType drag_type) const;
     void guideConstrainedSnap(Geom::Point &p, SPGuide const &guideline) const;
 
-    Inkscape::SnappedPoint freeSnapTranslation(Inkscape::SnapPreferences::PointType point_type,
-                                               std::vector<std::pair<Geom::Point, int> > const &p,
+    Inkscape::SnappedPoint freeSnapTranslate(std::vector<Inkscape::SnapCandidatePoint> const &p,
                                                Geom::Point const &pointer,
-                                               Geom::Point const &tr) const;
+                                               Geom::Point const &tr);
 
-    Inkscape::SnappedPoint constrainedSnapTranslation(Inkscape::SnapPreferences::PointType point_type,
-                                                      std::vector<std::pair<Geom::Point, int> > const &p,
+    Inkscape::SnappedPoint constrainedSnapTranslate(std::vector<Inkscape::SnapCandidatePoint> const &p,
                                                       Geom::Point const &pointer,
-                                                      Inkscape::Snapper::ConstraintLine const &constraint,
-                                                      Geom::Point const &tr) const;
+                                                      Inkscape::Snapper::SnapConstraint const &constraint,
+                                                      Geom::Point const &tr);
 
-    Inkscape::SnappedPoint freeSnapScale(Inkscape::SnapPreferences::PointType point_type,
-                                         std::vector<std::pair<Geom::Point, int> > const &p,
+    Inkscape::SnappedPoint freeSnapScale(std::vector<Inkscape::SnapCandidatePoint> const &p,
                                          Geom::Point const &pointer,
                                          Geom::Scale const &s,
-                                         Geom::Point const &o) const;
+                                         Geom::Point const &o);
 
-    Inkscape::SnappedPoint constrainedSnapScale(Inkscape::SnapPreferences::PointType point_type,
-                                                std::vector<std::pair<Geom::Point, int> > const &p,
+    Inkscape::SnappedPoint constrainedSnapScale(std::vector<Inkscape::SnapCandidatePoint> const &p,
                                                 Geom::Point const &pointer,
                                                 Geom::Scale const &s,
-                                                Geom::Point const &o) const;
+                                                Geom::Point const &o);
 
-    Inkscape::SnappedPoint constrainedSnapStretch(Inkscape::SnapPreferences::PointType point_type,
-                                                  std::vector<std::pair<Geom::Point, int> > const &p,
+    Inkscape::SnappedPoint constrainedSnapStretch(std::vector<Inkscape::SnapCandidatePoint> const &p,
                                                   Geom::Point const &pointer,
                                                   Geom::Coord const &s,
                                                   Geom::Point const &o,
                                                   Geom::Dim2 d,
-                                                  bool uniform) const;
+                                                  bool uniform);
 
-    Inkscape::SnappedPoint constrainedSnapSkew(Inkscape::SnapPreferences::PointType point_type,
-                                               std::vector<std::pair<Geom::Point, int> > const &p,
+    Inkscape::SnappedPoint constrainedSnapSkew(std::vector<Inkscape::SnapCandidatePoint> const &p,
                                                Geom::Point const &pointer,
-                                               Inkscape::Snapper::ConstraintLine const &constraint,
+                                               Inkscape::Snapper::SnapConstraint const &constraint,
                                                Geom::Point const &s, // s[0] = skew factor, s[1] = scale factor
                                                Geom::Point const &o,
-                                               Geom::Dim2 d) const;
+                                               Geom::Dim2 d);
+
+    Inkscape::SnappedPoint constrainedSnapRotate(std::vector<Inkscape::SnapCandidatePoint> const &p,
+                                                    Geom::Point const &pointer,
+                                                    Geom::Coord const &angle,
+                                                    Geom::Point const &o);
 
     Inkscape::GuideSnapper guide;      ///< guide snapper
     Inkscape::ObjectSnapper object;    ///< snapper to other objects
@@ -185,40 +199,38 @@ public:
 
     bool getSnapIndicator() const {return _snapindicator;}
 
+    Inkscape::SnappedPoint findBestSnap(Inkscape::SnapCandidatePoint const &p, SnappedConstraints const &sc, bool constrained, bool noCurves = false, bool allowOffScreen = false) const;
+    void keepClosestPointOnly(std::vector<Inkscape::SnapCandidatePoint> &points, const Geom::Point &reference) const;
+
 protected:
     SPNamedView const *_named_view;
 
 private:
     std::vector<SPItem const *> _items_to_ignore; ///< Items that should not be snapped to, for example the items that are currently being dragged. Set using the setup() method
+    GSList *_rotation_center_source_items; // to avoid snapping a rotation center to itself
     SPGuide *_guide_to_ignore; ///< A guide that should not be snapped to, e.g. the guide that is currently being dragged
     SPDesktop const *_desktop;
     bool _snapindicator; ///< When true, an indicator will be drawn at the position that was being snapped to
-    std::vector<std::pair<Geom::Point, int> > *_unselected_nodes; ///< Nodes of the path that is currently being edited and which have not been selected and which will therefore be stationary. Only these nodes will be considered for snapping to. Of each unselected node both the position (Geom::Point) and the type (Inkscape::SnapTargetType) will be stored
-    //TODO: Make _unselected_nodes type safe; in the line above int is used for Inkscape::SnapTargetType, but if I remember
-    //correctly then in other cases the int is being used for Inkscape::SnapSourceType, or for both. How to make
-    //this type safe?
+    std::vector<Inkscape::SnapCandidatePoint> *_unselected_nodes; ///< Nodes of the path that is currently being edited and which have not been selected and which will therefore be stationary. Only these nodes will be considered for snapping to. Of each unselected node both the position (Geom::Point) and the type (Inkscape::SnapTargetType) will be stored
 
-    Inkscape::SnappedPoint _snapTransformed(Inkscape::SnapPreferences::PointType type,
-                                            std::vector<std::pair<Geom::Point, int> > const &points,
+    Inkscape::SnappedPoint _snapTransformed(std::vector<Inkscape::SnapCandidatePoint> const &points,
                                             Geom::Point const &pointer,
                                             bool constrained,
-                                            Inkscape::Snapper::ConstraintLine const &constraint,
+                                            Inkscape::Snapper::SnapConstraint const &constraint,
                                             Transformation transformation_type,
                                             Geom::Point const &transformation,
                                             Geom::Point const &origin,
                                             Geom::Dim2 dim,
-                                            bool uniform) const;
+                                            bool uniform);
 
-    Geom::Point _transformPoint(std::pair<Geom::Point, int> const &p,
+    Geom::Point _transformPoint(Inkscape::SnapCandidatePoint const &p,
                                             Transformation const transformation_type,
                                             Geom::Point const &transformation,
                                             Geom::Point const &origin,
                                             Geom::Dim2 const dim,
                                             bool const uniform) const;
 
-    void _displaySnapsource(Inkscape::SnapPreferences::PointType point_type, std::pair<Geom::Point, int> const &p) const;
-
-    Inkscape::SnappedPoint findBestSnap(Geom::Point const &p, Inkscape::SnapSourceType const source_type, SnappedConstraints &sc, bool constrained, bool noCurves = false) const;
+    void _displaySnapsource(Inkscape::SnapCandidatePoint const &p) const;
 };
 
 #endif /* !SEEN_SNAP_H */