Code

Make click-select work in geometry tool
[inkscape.git] / src / sp-feoffset.cpp
index b4a50679ed18fcec7280c5df422c4ce3b35caca2..228424c70297539ca24be6e671866861ae463396 100644 (file)
@@ -21,6 +21,7 @@
 #include "attributes.h"
 #include "svg/svg.h"
 #include "sp-feoffset.h"
+#include "helper-fns.h"
 #include "xml/repr.h"
 #include "display/nr-filter-offset.h"
 
@@ -33,7 +34,7 @@ static void sp_feOffset_build(SPObject *object, SPDocument *document, Inkscape::
 static void sp_feOffset_release(SPObject *object);
 static void sp_feOffset_set(SPObject *object, unsigned int key, gchar const *value);
 static void sp_feOffset_update(SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_feOffset_write(SPObject *object, Inkscape::XML::Node *repr, guint flags);
+static Inkscape::XML::Node *sp_feOffset_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
 static void sp_feOffset_build_renderer(SPFilterPrimitive *primitive, NR::Filter *filter);
 
 static SPFilterPrimitiveClass *feOffset_parent_class;
@@ -109,18 +110,6 @@ sp_feOffset_release(SPObject *object)
         ((SPObjectClass *) feOffset_parent_class)->release(object);
 }
 
-double sp_feOffset_read_number(gchar const *value) {
-    char *end;
-    double ret = g_ascii_strtod(value, &end);
-    if (*end) {
-        g_warning("Unable to convert \"%s\" to number", value);
-        // We could leave this out, too. If strtod can't convert
-        // anything, it will return zero.
-        ret = 0;
-    }
-    return ret;
-}
-
 /**
  * Sets a specific value in the SPFeOffset.
  */
@@ -129,14 +118,21 @@ sp_feOffset_set(SPObject *object, unsigned int key, gchar const *value)
 {
     SPFeOffset *feOffset = SP_FEOFFSET(object);
 
+    double read_num;
     switch(key) {
         case SP_ATTR_DX:
-            feOffset->dx = sp_feOffset_read_number(value);
-            object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+            read_num = helperfns_read_number(value);
+            if (read_num != feOffset->dx) {
+                feOffset->dx = read_num;
+                object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+            }
             break;
         case SP_ATTR_DY:
-            feOffset->dy = sp_feOffset_read_number(value);
-            object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+            read_num = helperfns_read_number(value);
+            if (read_num != feOffset->dy) {
+                feOffset->dy = read_num;
+                object->parent->requestModified(SP_OBJECT_MODIFIED_FLAG);
+            }
             break;
             
        /*DEAL WITH SETTING ATTRIBUTES HERE*/
@@ -168,7 +164,7 @@ sp_feOffset_update(SPObject *object, SPCtx *ctx, guint flags)
  * Writes its settings to an incoming repr object, if any.
  */
 static Inkscape::XML::Node *
-sp_feOffset_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)
+sp_feOffset_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags)
 {
     // Inkscape-only object, not copied during an "plain SVG" dump:
     if (flags & SP_OBJECT_WRITE_EXT) {
@@ -177,12 +173,12 @@ sp_feOffset_write(SPObject *object, Inkscape::XML::Node *repr, guint flags)
             // Not. Causes coredumps.
             // repr->mergeFrom(SP_OBJECT_REPR(object), "id");
         } else {
-            repr = SP_OBJECT_REPR(object)->duplicate(NULL); // FIXME
+            repr = SP_OBJECT_REPR(object)->duplicate(doc);
         }
     }
 
     if (((SPObjectClass *) feOffset_parent_class)->write) {
-        ((SPObjectClass *) feOffset_parent_class)->write(object, repr, flags);
+        ((SPObjectClass *) feOffset_parent_class)->write(object, doc, repr, flags);
     }
 
     return repr;