Code

Pot and Dutch translation update
[inkscape.git] / src / sp-path.cpp
index 16e3bec400b4442bc9a61e28253ba54dbeae1b2b..54d2a201a1480225c438fb778d5ca44d71baa7a1 100644 (file)
 
 #include <glibmm/i18n.h>
 
+#include "live_effects/effect.h"
+#include "live_effects/lpeobject.h"
+#include "live_effects/lpeobject-reference.h"
+#include "sp-lpe-item.h"
+
 #include <display/curve.h>
 #include <libnr/nr-matrix-fns.h>
 #include <2geom/pathvector.h>
@@ -42,7 +47,6 @@
 #include "inkscape.h"
 #include "style.h"
 #include "message-stack.h"
-#include "prefs-utils.h"
 #include "selection.h"
 
 #define noPATH_VERBOSE
@@ -133,9 +137,24 @@ static gchar *
 sp_path_description(SPItem * item)
 {
     int count = sp_nodes_in_path(SP_PATH(item));
-    if (sp_lpe_item_has_path_effect(SP_LPE_ITEM(item))) {
-        return g_strdup_printf(ngettext("<b>Path</b> (%i node, path effect)",
-                                        "<b>Path</b> (%i nodes, path effect)",count), count);
+    if (SP_IS_LPE_ITEM(item) && sp_lpe_item_has_path_effect(SP_LPE_ITEM(item))) {
+
+        Glib::ustring s;
+
+        PathEffectList effect_list =  sp_lpe_item_get_effect_list(SP_LPE_ITEM(item));
+        for (PathEffectList::iterator it = effect_list.begin(); it != effect_list.end(); it++)
+        {
+            LivePathEffectObject *lpeobj = (*it)->lpeobject;
+            if (!lpeobj || !lpeobj->get_lpe())
+                break;
+            if (s.empty())
+                s = lpeobj->get_lpe()->getName();
+            else
+                s = s + ", " + lpeobj->get_lpe()->getName();
+        }
+
+        return g_strdup_printf(ngettext("<b>Path</b> (%i node, path effect: %s)",
+                                        "<b>Path</b> (%i nodes, path effect: %s)",count), count, s.c_str());
     } else {
         return g_strdup_printf(ngettext("<b>Path</b> (%i node)",
                                         "<b>Path</b> (%i nodes)",count), count);
@@ -256,7 +275,6 @@ sp_path_set(SPObject *object, unsigned int key, gchar const *value)
                 object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
             break;
        case SP_ATTR_D:
-            if (!sp_lpe_item_has_path_effect_recursive(SP_LPE_ITEM(path))) {
                 if (value) {
                     Geom::PathVector pv = sp_svg_read_pathv(value);
                     SPCurve *curve = new SPCurve(pv);
@@ -268,7 +286,6 @@ sp_path_set(SPObject *object, unsigned int key, gchar const *value)
                     sp_shape_set_curve((SPShape *) path, NULL, TRUE);
                 }
                 object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
-            }
             break;
         case SP_PROP_MARKER:
         case SP_PROP_MARKER_START:
@@ -278,8 +295,11 @@ sp_path_set(SPObject *object, unsigned int key, gchar const *value)
             object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
             break;
         case SP_ATTR_CONNECTOR_TYPE:
+        case SP_ATTR_CONNECTOR_CURVATURE:
         case SP_ATTR_CONNECTION_START:
         case SP_ATTR_CONNECTION_END:
+        case SP_ATTR_CONNECTION_START_POINT:
+        case SP_ATTR_CONNECTION_END_POINT:
             path->connEndPair.setAttr(key, value);
             break;
         default:
@@ -303,6 +323,9 @@ sp_path_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML:
         repr = xml_doc->createElement("svg:path");
     }
 
+#ifdef PATH_VERBOSE
+g_message("sp_path_write writes 'd' attribute");
+#endif
     if ( shape->curve != NULL ) {
         gchar *str = sp_svg_write_path(shape->curve->get_pathvector());
         repr->setAttribute("d", str);
@@ -311,13 +334,15 @@ sp_path_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML:
         repr->setAttribute("d", NULL);
     }
 
-    SPPath *path = (SPPath *) object;
-    if ( path->original_curve != NULL ) {
-        gchar *str = sp_svg_write_path(path->original_curve->get_pathvector());
-        repr->setAttribute("inkscape:original-d", str);
-        g_free(str);
-    } else {
-        repr->setAttribute("inkscape:original-d", NULL);
+    if (flags & SP_OBJECT_WRITE_EXT) {
+        SPPath *path = (SPPath *) object;
+        if ( path->original_curve != NULL ) {
+            gchar *str = sp_svg_write_path(path->original_curve->get_pathvector());
+            repr->setAttribute("inkscape:original-d", str);
+            g_free(str);
+        } else {
+            repr->setAttribute("inkscape:original-d", NULL);
+        }
     }
 
     SP_PATH(shape)->connEndPair.writeRepr(repr);
@@ -358,8 +383,9 @@ sp_path_set_transform(SPItem *item, Geom::Matrix const &xform)
         return Geom::identity();
     }
 
-    // Transform the original-d path or the (ordinary) path
-    if (path->original_curve) {
+    // Transform the original-d path if this is a valid LPE item, other else the (ordinary) path
+    if (path->original_curve && SP_IS_LPE_ITEM(item) && 
+                                sp_lpe_item_has_path_effect_recursive(SP_LPE_ITEM(item))) {
         path->original_curve->transform(xform);
     } else {
         shape->curve->transform(xform);
@@ -383,34 +409,51 @@ sp_path_set_transform(SPItem *item, Geom::Matrix const &xform)
     return Geom::identity();
 }
 
+
 static void
 sp_path_update_patheffect(SPLPEItem *lpeitem, bool write)
 {
     SPShape * const shape = (SPShape *) lpeitem;
     SPPath * const path = (SPPath *) lpeitem;
+    Inkscape::XML::Node *repr = SP_OBJECT_REPR(shape);
 
-    if (sp_lpe_item_has_path_effect(lpeitem) && sp_lpe_item_path_effects_enabled(lpeitem)) {
-        if (path->original_curve) {
-            SPCurve *curve = path->original_curve->copy();
-            sp_shape_set_curve_insync(shape, curve, TRUE);
-            sp_lpe_item_perform_path_effect(SP_LPE_ITEM(shape), curve);
-            SP_OBJECT(shape)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
-            curve->unref();
-
-            if (write) {
-                // could also do SP_OBJECT(shape)->updateRepr();  but only the d attribute needs updating.
-                Inkscape::XML::Node *repr = SP_OBJECT_REPR(shape);
-                if ( shape->curve != NULL ) {
-                    gchar *str = sp_svg_write_path(shape->curve->get_pathvector());
-                    repr->setAttribute("d", str);
-                    g_free(str);
-                } else {
-                    repr->setAttribute("d", NULL);
+#ifdef PATH_VERBOSE
+g_message("sp_path_update_patheffect");
+#endif
+
+    if (path->original_curve && sp_lpe_item_has_path_effect_recursive(lpeitem)) {
+        SPCurve *curve = path->original_curve->copy();
+        /* if a path does not have an lpeitem applied, then reset the curve to the original_curve.
+         * This is very important for LPEs to work properly! (the bbox might be recalculated depending on the curve in shape)*/
+        sp_shape_set_curve_insync(shape, curve, TRUE);
+
+        bool success = sp_lpe_item_perform_path_effect(SP_LPE_ITEM(shape), curve);
+        if (success && write) {
+            // could also do SP_OBJECT(shape)->updateRepr();  but only the d attribute needs updating.
+#ifdef PATH_VERBOSE
+g_message("sp_path_update_patheffect writes 'd' attribute");
+#endif
+            if ( shape->curve != NULL ) {
+                gchar *str = sp_svg_write_path(shape->curve->get_pathvector());
+                repr->setAttribute("d", str);
+                g_free(str);
+            } else {
+                repr->setAttribute("d", NULL);
+            }
+        } else if (!success) {
+            // LPE was unsuccesfull. Read the old 'd'-attribute.
+            if (gchar const * value = repr->attribute("d")) {
+                Geom::PathVector pv = sp_svg_read_pathv(value);
+                SPCurve *oldcurve = new SPCurve(pv);
+                if (oldcurve) {
+                    sp_shape_set_curve(shape, oldcurve, TRUE);
+                    oldcurve->unref();
                 }
             }
         }
+        SP_OBJECT(shape)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
+        curve->unref();
     }
-    // else: do nothing.
 }
 
 
@@ -458,7 +501,8 @@ sp_path_get_original_curve (SPPath *path)
 SPCurve*
 sp_path_get_curve_for_edit (SPPath *path)
 {
-    if (path->original_curve) {
+    if (path->original_curve && SP_IS_LPE_ITEM(path) && 
+                                sp_lpe_item_has_path_effect_recursive(SP_LPE_ITEM(path))) {
         return sp_path_get_original_curve(path);
     } else {
         return sp_shape_get_curve( (SPShape *) path );
@@ -472,7 +516,8 @@ sp_path_get_curve_for_edit (SPPath *path)
 const SPCurve*
 sp_path_get_curve_reference (SPPath *path)
 {
-    if (path->original_curve) {
+    if (path->original_curve && SP_IS_LPE_ITEM(path) && 
+                                sp_lpe_item_has_path_effect_recursive(SP_LPE_ITEM(path))) {
         return path->original_curve;
     } else {
         return path->curve;