Code

Use g_base64_encode_step when importing images via drag and drop.
[inkscape.git] / src / seltrans.cpp
index 0fd15593c78ae910c35670e33bc357a6e8354ea5..f3ad2849c4ed802d04397b9f2cd2254b9fe98c37 100644 (file)
@@ -291,7 +291,7 @@ void Inkscape::SelTrans::grab(Geom::Point const &p, gdouble x, gdouble y, bool s
        // but as a snap source we still need some nodes though!
     _snap_points.clear();
        _snap_points = selection->getSnapPoints(&local_snapprefs);
-       std::vector<Geom::Point> snap_points_hull = selection->getSnapPointsConvexHull(&local_snapprefs);
+       std::vector<std::pair<Geom::Point, int> > snap_points_hull = selection->getSnapPointsConvexHull(&local_snapprefs);
        if (_snap_points.size() > 100) {
                /* Snapping a huge number of nodes will take way too long, so limit the number of snappable nodes
                An average user would rarely ever try to snap such a large number of nodes anyway, because
@@ -305,11 +305,11 @@ void Inkscape::SelTrans::grab(Geom::Point const &p, gdouble x, gdouble y, bool s
     // any other special points
     Geom::Rect snap_points_bbox;
     if ( snap_points_hull.empty() == false ) {
-        std::vector<Geom::Point>::iterator i = snap_points_hull.begin();
-        snap_points_bbox = Geom::Rect(*i, *i);
+       std::vector<std::pair<Geom::Point, int> >::iterator i = snap_points_hull.begin();
+        snap_points_bbox = Geom::Rect((*i).first, (*i).first);
         i++;
         while (i != snap_points_hull.end()) {
-            snap_points_bbox.expandTo(*i);
+            snap_points_bbox.expandTo((*i).first);
             i++;
         }
     }
@@ -317,7 +317,7 @@ void Inkscape::SelTrans::grab(Geom::Point const &p, gdouble x, gdouble y, bool s
     _bbox_points.clear();
     if (_bbox) {
        if (m.snapprefs.getSnapModeBBox()) {
-               getBBoxPoints(_bbox, &_bbox_points, true, m.snapprefs.getSnapBBoxEdgeMidpoints(), m.snapprefs.getSnapBBoxMidpoints());
+               getBBoxPoints(_bbox, &_bbox_points, false, true, m.snapprefs.getSnapBBoxEdgeMidpoints(), m.snapprefs.getSnapBBoxMidpoints());
        }
        // There are two separate "opposites" (i.e. opposite w.r.t. the handle being dragged):
         //  - one for snapping the boundingbox, which can be either visual or geometric
@@ -350,7 +350,7 @@ void Inkscape::SelTrans::grab(Geom::Point const &p, gdouble x, gdouble y, bool s
        g_assert(_bbox_points.size() < 2 && _snap_points.size() < 2);
        if (_snap_points.size() == 1 && _bbox_points.size() == 1) { //both vectors can only have either one or zero elements
                // So we have exactly one bbox corner and one node left; now find out which is closest and delete the other one
-               if (Geom::L2(_snap_points.at(0) - p) < Geom::L2(_bbox_points.at(0) - p)) {
+               if (Geom::L2((_snap_points.at(0)).first - p) < Geom::L2((_bbox_points.at(0)).first - p)) {
                        _bbox_points.clear();
                } else {
                        _snap_points.clear();
@@ -359,26 +359,16 @@ void Inkscape::SelTrans::grab(Geom::Point const &p, gdouble x, gdouble y, bool s
 
        // Now either _bbox_points or _snap_points has a single element, the other one has zero..... or both have zero elements
        g_assert((_bbox_points.size() + _snap_points.size()) < 2);
-       if (_bbox_points.size() == 1) {
-               _desktop->snapindicator->set_new_snapsource(_bbox_points.at(0));
-       } else if (_snap_points.size() == 1){
-               _desktop->snapindicator->set_new_snapsource(_snap_points.at(0));
+       if (m.snapprefs.getSnapEnabledGlobally()) {
+                       if (_bbox_points.size() == 1) {
+                               _desktop->snapindicator->set_new_snapsource(_bbox_points.at(0));
+                       } else if (_snap_points.size() == 1){
+                               _desktop->snapindicator->set_new_snapsource(_snap_points.at(0));
+                       }
        }
     }
 
-    // The lines below are useful for debugging any snapping issues, as they'll spit out all points that are considered for snapping
-
-    /*std::cout << "Number of snap points:  " << _snap_points.size() << std::endl;
-    for (std::vector<Geom::Point>::const_iterator i = _snap_points.begin(); i != _snap_points.end(); i++)
-    {
-        std::cout << "    " << *i << std::endl;
-    }
-
-    std::cout << "Number of bbox points:  " << _bbox_points.size() << std::endl;
-    for (std::vector<Geom::Point>::const_iterator i = _bbox_points.begin(); i != _bbox_points.end(); i++)
-    {
-        std::cout << "    " << *i << std::endl;
-    }*/
+       sp_canvas_set_snap_delay_active(_desktop->canvas, true);
 
     if ((x != -1) && (y != -1)) {
         sp_canvas_item_show(_norm);
@@ -432,6 +422,10 @@ void Inkscape::SelTrans::ungrab()
     _grabbed = false;
     _show_handles = true;
 
+    sp_canvas_set_snap_delay_active(_desktop->canvas, false);
+
+    _desktop->snapindicator->remove_snapsource();
+
     Inkscape::Selection *selection = sp_desktop_selection(_desktop);
     _updateVolatileState();
 
@@ -1287,11 +1281,12 @@ gboolean Inkscape::SelTrans::rotateRequest(Geom::Point &pt, guint state)
     return TRUE;
 }
 
+// Move the item's transformation center
 gboolean Inkscape::SelTrans::centerRequest(Geom::Point &pt, guint state)
 {
     SnapManager &m = _desktop->namedview->snap_manager;
     m.setup(_desktop);
-    m.freeSnapReturnByRef(SnapPreferences::SNAPPOINT_NODE, pt);
+    m.freeSnapReturnByRef(SnapPreferences::SNAPPOINT_NODE, pt, Inkscape::SNAPSOURCE_HANDLE);
 
     if (state & GDK_CONTROL_MASK) {
         if ( fabs(_point[Geom::X] - pt[Geom::X]) > fabs(_point[Geom::Y] - pt[Geom::Y]) ) {
@@ -1384,7 +1379,6 @@ void sp_sel_trans_center(Inkscape::SelTrans *seltrans, SPSelTransHandle const &,
 void Inkscape::SelTrans::moveTo(Geom::Point const &xy, guint state)
 {
     SnapManager &m = _desktop->namedview->snap_manager;
-    m.setup(_desktop, true, _items_const);
 
     /* The amount that we've moved by during this drag */
     Geom::Point dxy = xy - _point;
@@ -1399,7 +1393,8 @@ void Inkscape::SelTrans::moveTo(Geom::Point const &xy, guint state)
         ** FIXME: this will snap to more than just the grid, nowadays.
         */
 
-        m.freeSnapReturnByRef(SnapPreferences::SNAPPOINT_NODE, dxy);
+       m.setup(_desktop, true, _items_const);
+       m.freeSnapReturnByRef(SnapPreferences::SNAPPOINT_NODE, dxy, Inkscape::SNAPSOURCE_UNDEFINED);
 
     } else if (!shift) {
 
@@ -1408,7 +1403,9 @@ void Inkscape::SelTrans::moveTo(Geom::Point const &xy, guint state)
         ** pick the smallest.
         */
 
-        /* This will be our list of possible translations */
+       m.setup(_desktop, false, _items_const);
+
+       /* This will be our list of possible translations */
         std::list<Inkscape::SnappedPoint> s;
 
         if (control) {
@@ -1583,15 +1580,15 @@ Geom::Point Inkscape::SelTrans::_calcAbsAffineGeom(Geom::Scale const geom_scale)
     return visual_bbox.min() + visual_bbox.dimensions() * Geom::Scale(_handle_x, _handle_y);
 }
 
-void Inkscape::SelTrans::_keepClosestPointOnly(std::vector<Geom::Point> &points, const Geom::Point &reference)
+void Inkscape::SelTrans::_keepClosestPointOnly(std::vector<std::pair<Geom::Point, int> > &points, const Geom::Point &reference)
 {
        if (points.size() < 2) return;
 
-       Geom::Point closest_point = Geom::Point(NR_HUGE, NR_HUGE);
+       std::pair<Geom::Point, int> closest_point = std::make_pair(Geom::Point(NR_HUGE, NR_HUGE), SNAPSOURCE_UNDEFINED);
        Geom::Coord closest_dist = NR_HUGE;
 
-       for(std::vector<Geom::Point>::const_iterator i = points.begin(); i != points.end(); i++) {
-               Geom::Coord dist = Geom::L2(*i - reference);
+       for(std::vector<std::pair<Geom::Point, int> >::const_iterator i = points.begin(); i != points.end(); i++) {
+               Geom::Coord dist = Geom::L2((*i).first - reference);
                if (i == points.begin() || dist < closest_dist) {
                        closest_point = *i;
                        closest_dist = dist;