Code

Merge and cleanup of GSoC C++-ification project.
[inkscape.git] / src / vanishing-point.cpp
index 80f15fc5a7ab1ef0afd17c0818de17cfe79fb212..f8e991623ded868fcd43c373feff2f8311bd04b2 100644 (file)
@@ -1,5 +1,3 @@
-#define __VANISHING_POINT_C__
-
 /*
  * Vanishing point for 3D perspectives
  *
@@ -7,6 +5,7 @@
  *   bulia byak <buliabyak@users.sf.net>
  *   Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
  *   Maximilian Albert <Anhalter42@gmx.de>
+ *   Abhishek Sharma
  *
  * Copyright (C) 2005-2007 authors
  *
 #include "xml/repr.h"
 #include "perspective-line.h"
 #include "shape-editor.h"
+#include "snap.h"
+#include "sp-namedview.h"
+
+using Inkscape::DocumentUndo;
 
 namespace Box3D {
 
@@ -76,7 +79,7 @@ have_VPs_of_same_perspective (VPDragger *dr1, VPDragger *dr2)
 }
 
 static void
-vp_knot_moved_handler (SPKnot */*knot*/, Geom::Point const *ppointer, guint state, gpointer data)
+vp_knot_moved_handler (SPKnot *knot, Geom::Point const *ppointer, guint state, gpointer data)
 {
     VPDragger *dragger = (VPDragger *) data;
     VPDrag *drag = dragger->parent;
@@ -119,8 +122,8 @@ vp_knot_moved_handler (SPKnot */*knot*/, Geom::Point const *ppointer, guint stat
             }
             // FIXME: Do we need to create a new dragger as well?
             dragger->updateZOrders ();
-            SPDocumentUndo::done (sp_desktop_document (inkscape_active_desktop()), SP_VERB_CONTEXT_3DBOX,
-                              _("Split vanishing points"));
+            DocumentUndo::done(sp_desktop_document (inkscape_active_desktop()), SP_VERB_CONTEXT_3DBOX,
+                              _("Split vanishing points"));
             return;
         }
     }
@@ -164,16 +167,26 @@ vp_knot_moved_handler (SPKnot */*knot*/, Geom::Point const *ppointer, guint stat
                 //       deleted according to changes in the svg representation, not based on any user input
                 //       as is currently the case.
 
-                SPDocumentUndo::done (sp_desktop_document (inkscape_active_desktop()), SP_VERB_CONTEXT_3DBOX,
-                                  _("Merge vanishing points"));
+                DocumentUndo::done(sp_desktop_document (inkscape_active_desktop()), SP_VERB_CONTEXT_3DBOX,
+                                  _("Merge vanishing points"));
 
                 return;
             }
         }
-    }
 
+        // We didn't snap to another dragger, so we'll try a regular snap
+        SPDesktop *desktop = inkscape_active_desktop();
+        SnapManager &m = desktop->namedview->snap_manager;
+        m.setup(desktop);
+        Inkscape::SnappedPoint s = m.freeSnap(Inkscape::SnapCandidatePoint(p, Inkscape::SNAPSOURCE_OTHER_HANDLE));
+        m.unSetup();
+        if (s.getSnapped()) {
+            p = s.getPoint();
+            sp_knot_moveto(knot, p);
+        }
+    }
 
-    dragger->point = p; // FIXME: Brauchen wir dragger->point überhaupt?
+    dragger->point = p; // FIXME: Is dragger->point being used at all?
 
     dragger->updateVPs(p);
     dragger->updateBoxDisplays();
@@ -220,8 +233,8 @@ vp_knot_ungrabbed_handler (SPKnot *knot, guint /*state*/, gpointer data)
     // TODO: Undo machinery!!
     g_return_if_fail (dragger->parent);
     g_return_if_fail (dragger->parent->document);
-    SPDocumentUndo::done(dragger->parent->document, SP_VERB_CONTEXT_3DBOX,
-                     _("3D box: Move vanishing point"));
+    DocumentUndo::done(dragger->parent->document, SP_VERB_CONTEXT_3DBOX,
+                      _("3D box: Move vanishing point"));
 }
 
 unsigned int VanishingPoint::global_counter = 0;
@@ -775,4 +788,4 @@ VPDrag::addLine (Geom::Point p1, Geom::Point p2, guint32 rgba)
   fill-column:99
   End:
 */
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :