Code

Connector tool: make connectors avoid the convex hull of shapes.
[inkscape.git] / src / pen-context.cpp
index 804c736bee91c1af5b30dbf913674810eefa6d43..1447173320c6cfd0b8b578eb168d65b23a824637 100644 (file)
@@ -77,7 +77,6 @@ static SPDrawContextClass *pen_parent_class;
 
 static int pen_next_paraxial_direction(const SPPenContext *const pc, Geom::Point const &pt, Geom::Point const &origin, guint state);
 static void pen_set_to_nearest_horiz_vert(const SPPenContext *const pc, Geom::Point &pt, guint const state);
-static Geom::Point pen_get_intermediate_horiz_vert(const SPPenContext *const pc, Geom::Point const &pt, guint const state);
 
 static int pen_last_paraxial_dir = 0; // last used direction in horizontal/vertical mode; 0 = horizontal, 1 = vertical
 
@@ -209,8 +208,6 @@ sp_pen_context_setup(SPEventContext *ec)
 
     pc = SP_PEN_CONTEXT(ec);
 
-    sp_canvas_set_snap_delay_active(pc->desktop->canvas, true);
-
     if (((SPEventContextClass *) pen_parent_class)->setup) {
         ((SPEventContextClass *) pen_parent_class)->setup(ec);
     }
@@ -266,7 +263,7 @@ sp_pen_context_finish(SPEventContext *ec)
 {
     SPPenContext *pc = SP_PEN_CONTEXT(ec);
 
-    sp_canvas_set_snap_delay_active(pc->desktop->canvas, false);
+    sp_event_context_discard_delayed_snap_event(ec);
 
     if (pc->npoints != 0) {
         pen_cancel (pc);
@@ -472,17 +469,17 @@ static gint pen_handle_button_press(SPPenContext *const pc, GdkEventButton const
                         if (pc->npoints == 0) {
 
                                Geom::Point p;
-                            if (bevent.state & GDK_CONTROL_MASK) {
+                          if ((bevent.state & GDK_CONTROL_MASK) && (pc->polylines_only || pc->polylines_paraxial)) {
                                p = event_dt;
                                if (!(bevent.state & GDK_SHIFT_MASK)) {
                                        SnapManager &m = desktop->namedview->snap_manager;
                                        m.setup(desktop);
-                                                                       m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p);
+                                                                       m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, p, Inkscape::SNAPSOURCE_HANDLE);
                                }
-                                                               spdc_create_single_dot(event_context, p, "/tools/freehand/pen", bevent.state);
-                                                               ret = TRUE;
-                                break;
-                            }
+                              spdc_create_single_dot(event_context, p, "/tools/freehand/pen", bevent.state);
+                              ret = TRUE;
+                              break;
+                          }
 
                             // TODO: Perhaps it would be nicer to rearrange the following case
                             // distinction so that the case of a waiting LPE is treated separately
@@ -541,9 +538,6 @@ static gint pen_handle_button_press(SPPenContext *const pc, GdkEventButton const
                                 p = event_dt;
                                 spdc_endpoint_snap(pc, p, bevent.state); /* Snap node only if not hitting anchor. */
                                 spdc_pen_set_subsequent_point(pc, p, true);
-                                if (pc->polylines_only) {
-                                    spdc_pen_finish_segment(pc, p, bevent.state);
-                                }
                             }
                         }
 
@@ -787,10 +781,8 @@ pen_handle_button_release(SPPenContext *const pc, GdkEventButton const &revent)
                 switch (pc->state) {
                     case SP_PEN_CONTEXT_POINT:
                     case SP_PEN_CONTEXT_CONTROL:
-                        if (!pc->polylines_only) {
-                            spdc_endpoint_snap(pc, p, revent.state);
-                            spdc_pen_finish_segment(pc, p, revent.state);
-                        }
+                        spdc_endpoint_snap(pc, p, revent.state);
+                        spdc_pen_finish_segment(pc, p, revent.state);
                         break;
                     case SP_PEN_CONTEXT_CLOSE:
                         spdc_endpoint_snap(pc, p, revent.state);
@@ -853,7 +845,8 @@ static gint
 pen_handle_2button_press(SPPenContext *const pc, GdkEventButton const &bevent)
 {
     gint ret = FALSE;
-    if (pc->npoints != 0 && bevent.button != 2) {
+    // only end on LMB double click. Otherwise horizontal scrolling causes ending of the path
+    if (pc->npoints != 0 && bevent.button == 1) {
         spdc_pen_finish(pc, FALSE);
         ret = TRUE;
     }
@@ -1042,6 +1035,7 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
             }
             break;
 
+/* TODO: this is not yet enabled?? looks like some traces of the Geometry tool
         case GDK_P:
         case GDK_p:
             if (MOD__SHIFT_ONLY) {
@@ -1073,6 +1067,7 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
                 ret = TRUE;
             }
             break;
+*/
 
         case GDK_U:
         case GDK_u:
@@ -1450,17 +1445,6 @@ void pen_set_to_nearest_horiz_vert(const SPPenContext *const pc, Geom::Point &pt
     }
 }
 
-Geom::Point pen_get_intermediate_horiz_vert(const SPPenContext *const pc, Geom::Point const &pt)
-{
-    Geom::Point const &origin = pc->p[0];
-
-    if (pen_last_paraxial_dir == 0) {
-        return Geom::Point (origin[Geom::X], pt[Geom::Y]);
-    } else {
-        return Geom::Point (pt[Geom::X], origin[Geom::Y]);
-    }
-}
-
 /*
   Local Variables:
   mode:c++