Code

Warning cleanup.
[inkscape.git] / src / pen-context.cpp
index 9d11df0591a9ccdee9cf6dd3f4dc6eea8a08ab3f..804c736bee91c1af5b30dbf913674810eefa6d43 100644 (file)
@@ -29,7 +29,7 @@
 #include "draw-anchor.h"
 #include "message-stack.h"
 #include "message-context.h"
-#include "prefs-utils.h"
+#include "preferences.h"
 #include "sp-path.h"
 #include "display/curve.h"
 #include "pixmaps/cursor-pen.xpm"
@@ -49,7 +49,7 @@ static void sp_pen_context_dispose(GObject *object);
 
 static void sp_pen_context_setup(SPEventContext *ec);
 static void sp_pen_context_finish(SPEventContext *ec);
-static void sp_pen_context_set(SPEventContext *ec, gchar const *key, gchar const *val);
+static void sp_pen_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val);
 static gint sp_pen_context_root_handler(SPEventContext *ec, GdkEvent *event);
 static gint sp_pen_context_item_handler(SPEventContext *event_context, SPItem *item, GdkEvent *event);
 
@@ -148,7 +148,7 @@ sp_pen_context_init(SPPenContext *pc)
     pc->c1 = NULL;
     pc->cl0 = NULL;
     pc->cl1 = NULL;
-    
+
     pc->events_disabled = 0;
 
     pc->num_clicks = 0;
@@ -193,7 +193,8 @@ sp_pen_context_dispose(GObject *object)
 
 void
 sp_pen_context_set_polyline_mode(SPPenContext *const pc) {
-    guint mode = prefs_get_int_attribute("tools.freehand.pen", "freehand-mode", 0);
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    guint mode = prefs->getInt("/tools/freehand/pen/freehand-mode", 0);
     pc->polylines_only = (mode == 2 || mode == 3);
     pc->polylines_paraxial = (mode == 3);
 }
@@ -208,6 +209,8 @@ 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);
     }
@@ -233,13 +236,14 @@ sp_pen_context_setup(SPEventContext *ec)
 
     sp_pen_context_set_polyline_mode(pc);
 
-    if (prefs_get_int_attribute("tools.freehand.pen", "selcue", 0) != 0) {
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    if (prefs->getBool("/tools/freehand/pen/selcue")) {
         ec->enableSelectionCue();
     }
 }
 
 static void
-pen_cancel (SPPenContext *const pc) 
+pen_cancel (SPPenContext *const pc)
 {
     pc->num_clicks = 0;
     pc->state = SP_PEN_CONTEXT_STOP;
@@ -262,6 +266,8 @@ sp_pen_context_finish(SPEventContext *ec)
 {
     SPPenContext *pc = SP_PEN_CONTEXT(ec);
 
+    sp_canvas_set_snap_delay_active(pc->desktop->canvas, false);
+
     if (pc->npoints != 0) {
         pen_cancel (pc);
     }
@@ -275,12 +281,13 @@ sp_pen_context_finish(SPEventContext *ec)
  * Callback that sets key to value in pen context.
  */
 static void
-sp_pen_context_set(SPEventContext *ec, gchar const *key, gchar const *val)
+sp_pen_context_set(SPEventContext *ec, Inkscape::Preferences::Entry *val)
 {
     SPPenContext *pc = SP_PEN_CONTEXT(ec);
+    Glib::ustring name = val->getEntryName();
 
-    if (!strcmp(key, "mode")) {
-        if ( val && !strcmp(val, "drag") ) {
+    if (name == "mode") {
+        if ( val->getString() == "drag" ) {
             pc->mode = SP_PEN_CONTEXT_MODE_DRAG;
         } else {
             pc->mode = SP_PEN_CONTEXT_MODE_CLICK;
@@ -329,7 +336,7 @@ spdc_endpoint_snap_handle(SPPenContext const *const pc, Geom::Point &p, guint co
     }
 }
 
-static gint 
+static gint
 sp_pen_context_item_handler(SPEventContext *ec, SPItem *item, GdkEvent *event)
 {
     SPPenContext *const pc = SP_PEN_CONTEXT(ec);
@@ -414,7 +421,7 @@ static gint pen_handle_button_press(SPPenContext *const pc, GdkEventButton const
     SPDrawContext * const dc = SP_DRAW_CONTEXT(pc);
     SPDesktop * const desktop = SP_EVENT_CONTEXT_DESKTOP(dc);
     Geom::Point const event_w(bevent.x, bevent.y);
-    Geom::Point const event_dt(desktop->w2d(event_w));
+    Geom::Point event_dt(desktop->w2d(event_w));
     SPEventContext *event_context = SP_EVENT_CONTEXT(pc);
 
     gint ret = FALSE;
@@ -450,7 +457,7 @@ static gint pen_handle_button_press(SPPenContext *const pc, GdkEventButton const
                     case SP_PEN_CONTEXT_CLOSE:
                         break;
                     case SP_PEN_CONTEXT_STOP:
-                        /* This is allowed, if we just cancelled curve */
+                        /* This is allowed, if we just canceled curve */
                         pc->state = SP_PEN_CONTEXT_POINT;
                         break;
                     default:
@@ -460,13 +467,20 @@ static gint pen_handle_button_press(SPPenContext *const pc, GdkEventButton const
             case SP_PEN_CONTEXT_MODE_DRAG:
                 switch (pc->state) {
                     case SP_PEN_CONTEXT_STOP:
-                        /* This is allowed, if we just cancelled curve */
+                        /* This is allowed, if we just canceled curve */
                     case SP_PEN_CONTEXT_POINT:
                         if (pc->npoints == 0) {
 
+                               Geom::Point p;
                             if (bevent.state & GDK_CONTROL_MASK) {
-                                spdc_create_single_dot(event_context, event_dt, "tools.freehand.pen", bevent.state);
-                                ret = TRUE;
+                               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);
+                               }
+                                                               spdc_create_single_dot(event_context, p, "/tools/freehand/pen", bevent.state);
+                                                               ret = TRUE;
                                 break;
                             }
 
@@ -475,7 +489,6 @@ static gint pen_handle_button_press(SPPenContext *const pc, GdkEventButton const
 
                             /* Set start anchor */
                             pc->sa = anchor;
-                            Geom::Point p;
                             if (anchor && !sp_pen_context_has_waiting_LPE(pc)) {
                                 /* Adjust point to anchor if needed; if we have a waiting LPE, we need
                                    a fresh path to be created so don't continue an existing one */
@@ -588,7 +601,7 @@ pen_handle_motion_notify(SPPenContext *const pc, GdkEventMotion const &mevent)
         // allow scrolling
         return FALSE;
     }
-   
+
     if (pc->events_disabled) {
         // skip motion events if pen events are disabled
         return FALSE;
@@ -597,9 +610,9 @@ pen_handle_motion_notify(SPPenContext *const pc, GdkEventMotion const &mevent)
     Geom::Point const event_w(mevent.x,
                             mevent.y);
     if (pen_within_tolerance) {
-        gint const tolerance = prefs_get_int_attribute_limited("options.dragtolerance",
-                                                               "value", 0, 0, 100);
-        if ( NR::LInfty( event_w - pen_drag_origin_w ) < tolerance ) {
+        Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+        gint const tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100);
+        if ( Geom::LInfty( event_w - pen_drag_origin_w ) < tolerance ) {
             return FALSE;   // Do not drag if we're within tolerance from origin.
         }
     }
@@ -762,7 +775,7 @@ pen_handle_button_release(SPPenContext *const pc, GdkEventButton const &revent)
                         ret = TRUE;
                         break;
                     case SP_PEN_CONTEXT_STOP:
-                        /* This is allowed, if we just cancelled curve */
+                        /* This is allowed, if we just canceled curve */
                         pc->state = SP_PEN_CONTEXT_POINT;
                         ret = TRUE;
                         break;
@@ -961,8 +974,10 @@ pen_lastpoint_toline (SPPenContext *const pc)
 static gint
 pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
 {
-    gint ret = FALSE;
-    gdouble const nudge = prefs_get_double_attribute_limited("options.nudgedistance", "value", 2, 0, 1000); // in px
+
+       gint ret = FALSE;
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    gdouble const nudge = prefs->getDoubleLimited("/options/nudgedistance/value", 2, 0, 1000); // in px
 
     switch (get_group0_keyval (&event->key)) {
 
@@ -1106,7 +1121,7 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
         case GDK_BackSpace:
         case GDK_Delete:
         case GDK_KP_Delete:
-            if (pc->green_curve->is_empty()) {
+            if ( pc->green_curve->is_empty() || (pc->green_curve->last_segment() == NULL) ) {
                 if (!pc->red_curve->is_empty()) {
                     pen_cancel (pc);
                     ret = TRUE;
@@ -1128,8 +1143,7 @@ pen_handle_key_press(SPPenContext *const pc, GdkEvent *event)
                     break;
                 }
                 // The code below assumes that pc->green_curve has only ONE path !
-                Geom::Path const & path = pc->green_curve->get_pathvector().back();
-                Geom::Curve const * crv = &path.back_default();
+                Geom::Curve const * crv = pc->green_curve->last_segment();
                 pc->p[0] = crv->initialPoint();
                 if ( Geom::CubicBezier const * cubic = dynamic_cast<Geom::CubicBezier const *>(crv)) {
                     pc->p[1] = (*cubic)[1];
@@ -1198,7 +1212,7 @@ spdc_pen_set_initial_point(SPPenContext *const pc, Geom::Point const p)
  * Show the status message for the current line/curve segment.
  * This type of message always shows angle/distance as the last
  * two parameters ("angle %3.2f&#176;, distance %s").
- */ 
+ */
 static void
 spdc_pen_set_angle_distance_status_message(SPPenContext *const pc, Geom::Point const p, int pc_point_to_compare, gchar const *message)
 {
@@ -1208,9 +1222,10 @@ spdc_pen_set_angle_distance_status_message(SPPenContext *const pc, Geom::Point c
 
     SPDesktop *desktop = SP_EVENT_CONTEXT(pc)->desktop;
     Geom::Point rel = p - pc->p[pc_point_to_compare];
-    GString *dist = SP_PX_TO_METRIC_STRING(NR::L2(rel), desktop->namedview->getDefaultMetric());
-    double angle = atan2(rel[NR::Y], rel[NR::X]) * 180 / M_PI;
-    if (prefs_get_int_attribute("options.compassangledisplay", "value", 0) != 0)
+    GString *dist = SP_PX_TO_METRIC_STRING(Geom::L2(rel), desktop->namedview->getDefaultMetric());
+    double angle = atan2(rel[Geom::Y], rel[Geom::X]) * 180 / M_PI;
+    Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+    if (prefs->getBool("/options/compassangledisplay/value", 0) != 0)
         angle = angle_to_compass (angle);
 
     pc->_message_context->setF(Inkscape::IMMEDIATE_MESSAGE, message, angle, dist->str);
@@ -1339,7 +1354,7 @@ spdc_pen_finish(SPPenContext *const pc, gboolean const closed)
     pc->num_clicks = 0;
 
     pen_disable_events(pc);
-    
+
     SPDesktop *const desktop = pc->desktop;
     pc->_message_context->clear();
     desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("Drawing finished"));
@@ -1375,7 +1390,7 @@ pen_disable_events(SPPenContext *const pc) {
 static void
 pen_enable_events(SPPenContext *const pc) {
   g_return_if_fail(pc->events_disabled != 0);
-  
+
   pc->events_disabled--;
 }
 
@@ -1409,8 +1424,8 @@ static int pen_next_paraxial_direction(const SPPenContext *const pc,
      */
     if (pc->num_clicks == 0) {
         // first mouse click
-        double dist_h = fabs(pt[NR::X] - origin[NR::X]);
-        double dist_v = fabs(pt[NR::Y] - origin[NR::Y]);
+        double dist_h = fabs(pt[Geom::X] - origin[Geom::X]);
+        double dist_v = fabs(pt[Geom::Y] - origin[Geom::Y]);
         int ret = (dist_h < dist_v) ? 1 : 0; // 0 = horizontal, 1 = vertical
         pen_last_paraxial_dir = (state & GDK_SHIFT_MASK) ? 1 - ret : ret;
         return pen_last_paraxial_dir;
@@ -1428,10 +1443,10 @@ void pen_set_to_nearest_horiz_vert(const SPPenContext *const pc, Geom::Point &pt
 
     if (next_dir == 0) {
         // line is forced to be horizontal
-        pt[NR::Y] = origin[NR::Y];
+        pt[Geom::Y] = origin[Geom::Y];
     } else {
         // line is forced to be vertical
-        pt[NR::X] = origin[NR::X];
+        pt[Geom::X] = origin[Geom::X];
     }
 }
 
@@ -1440,9 +1455,9 @@ Geom::Point pen_get_intermediate_horiz_vert(const SPPenContext *const pc, Geom::
     Geom::Point const &origin = pc->p[0];
 
     if (pen_last_paraxial_dir == 0) {
-        return Geom::Point (origin[NR::X], pt[NR::Y]);
+        return Geom::Point (origin[Geom::X], pt[Geom::Y]);
     } else {
-        return Geom::Point (pt[NR::X], origin[NR::Y]);
+        return Geom::Point (pt[Geom::X], origin[Geom::Y]);
     }
 }