summaryrefslogtreecommitdiffstats
path: root/src/snap.cpp
diff options
context:
space:
mode:
authorJohan B. C. Engelen <jbc.engelen@swissonline.ch>2007-04-15 17:05:40 +0000
committerjohanengelen <johanengelen@users.sourceforge.net>2007-04-15 17:05:40 +0000
commit0a7239ba0bd51bac0eabd829f3058721bdf73165 (patch)
treedded619db176e84e3d9015b70074abe6fc02f0e9 /src/snap.cpp
parentRemove some unneeded header includes (diff)
downloadinkscape-0a7239ba0bd51bac0eabd829f3058721bdf73165.tar.gz
inkscape-0a7239ba0bd51bac0eabd829f3058721bdf73165.zip
Removal of old grid code - fully enabled new grid code.
(bzr r2904)
Diffstat (limited to 'src/snap.cpp')
-rw-r--r--src/snap.cpp97
1 files changed, 91 insertions, 6 deletions
diff --git a/src/snap.cpp b/src/snap.cpp
index 4f871e736..1714b6b67 100644
--- a/src/snap.cpp
+++ b/src/snap.cpp
@@ -33,7 +33,6 @@
*/
SnapManager::SnapManager(SPNamedView const *v) :
- grid(v, 0),
guide(v, 0),
object(v, 0),
_named_view(v)
@@ -45,15 +44,28 @@ SnapManager::SnapManager(SPNamedView const *v) :
/**
* \return List of snappers that we use.
*/
-
-SnapManager::SnapperList SnapManager::getSnappers() const
+SnapManager::SnapperList
+SnapManager::getSnappers() const
{
SnapManager::SnapperList s;
- s.push_back(&grid);
s.push_back(&guide);
s.push_back(&object);
- //FIXME: this code should do this: add new grid snappers that are active for this desktop
+ SnapManager::SnapperList gs = getGridSnappers();
+ s.splice(s.begin(), gs);
+
+ return s;
+}
+
+/**
+ * \return List of gridsnappers that we use.
+ */
+SnapManager::SnapperList
+SnapManager::getGridSnappers() const
+{
+ SnapperList s;
+
+ //FIXME: this code should actually do this: add new grid snappers that are active for this desktop. now it just adds all gridsnappers
SPDesktop* desktop = SP_ACTIVE_DESKTOP;
if (desktop && desktop->gridsEnabled()) {
for ( GSList const *l = _named_view->grids; l != NULL; l = l->next) {
@@ -114,9 +126,28 @@ Inkscape::SnappedPoint SnapManager::freeSnap(Inkscape::Snapper::PointType t,
NR::Point const &p,
std::list<SPItem const *> const &it) const
{
+ SnapperList const snappers = getSnappers();
+
+ return freeSnap(t, p, it, snappers);
+}
+
+/**
+ * Try to snap a point to any of the specified snappers.
+ *
+ * \param t Type of point.
+ * \param p Point.
+ * \param it List of items to ignore when snapping.
+ * \param snappers List of snappers to try to snap to
+ * \return Snapped point.
+ */
+
+Inkscape::SnappedPoint SnapManager::freeSnap(Inkscape::Snapper::PointType t,
+ NR::Point const &p,
+ std::list<SPItem const *> const &it,
+ SnapperList const &snappers) const
+{
Inkscape::SnappedPoint r(p, NR_HUGE);
- SnapperList const snappers = getSnappers();
for (SnapperList::const_iterator i = snappers.begin(); i != snappers.end(); i++) {
Inkscape::SnappedPoint const s = (*i)->freeSnap(t, p, it);
if (s.getDistance() < r.getDistance()) {
@@ -127,6 +158,60 @@ Inkscape::SnappedPoint SnapManager::freeSnap(Inkscape::Snapper::PointType t,
return r;
}
+/**
+ * Try to snap a point to any of the specified snappers. Snap always, ignoring the snap-distance
+ *
+ * \param t Type of point.
+ * \param p Point.
+ * \param it Item to ignore when snapping.
+ * \param snappers List of snappers to try to snap to
+ * \return Snapped point.
+ */
+
+Inkscape::SnappedPoint
+SnapManager::freeSnapAlways( Inkscape::Snapper::PointType t,
+ NR::Point const &p,
+ SPItem const *it,
+ SnapperList &snappers )
+{
+ std::list<SPItem const *> lit;
+ lit.push_back(it);
+ return freeSnapAlways(t, p, lit, snappers);
+}
+
+/**
+ * Try to snap a point to any of the specified snappers. Snap always, ignoring the snap-distance
+ *
+ * \param t Type of point.
+ * \param p Point.
+ * \param it List of items to ignore when snapping.
+ * \param snappers List of snappers to try to snap to
+ * \return Snapped point.
+ */
+
+Inkscape::SnappedPoint
+SnapManager::freeSnapAlways( Inkscape::Snapper::PointType t,
+ NR::Point const &p,
+ std::list<SPItem const *> const &it,
+ SnapperList &snappers )
+{
+ Inkscape::SnappedPoint r(p, NR_HUGE);
+
+ for (SnapperList::iterator i = snappers.begin(); i != snappers.end(); i++) {
+ gdouble const curr_gridsnap = (*i)->getDistance();
+ const_cast<Inkscape::Snapper*> (*i)->setDistance(NR_HUGE);
+ Inkscape::SnappedPoint const s = (*i)->freeSnap(t, p, it);
+ const_cast<Inkscape::Snapper*> (*i)->setDistance(curr_gridsnap);
+
+ if (s.getDistance() < r.getDistance()) {
+ r = s;
+ }
+ }
+
+ return r;
+}
+
+
/**
* Try to snap a point to any interested snappers. A snap will only occur along