summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorStephen Silver <sasilver@yahoo.com>2008-06-30 12:22:10 +0000
committersasilver <sasilver@users.sourceforge.net>2008-06-30 12:22:10 +0000
commitd592e23254943e7406ce83f66dab1c2af09b6b03 (patch)
treec5af65eebc2a4f44dc46cc8f0853c9b2b9d61e1c /src
parentApproximately closed test for path parsing now looks at the absolute coordina... (diff)
downloadinkscape-d592e23254943e7406ce83f66dab1c2af09b6b03.tar.gz
inkscape-d592e23254943e7406ce83f66dab1c2af09b6b03.zip
Prevent 'title', 'desc' and 'metadata' elements being moved to 'defs' when ungrouping (fixes bug 243720).
(bzr r6098)
Diffstat (limited to 'src')
-rw-r--r--src/sp-item-group.cpp6
-rw-r--r--src/xml/repr-util.cpp16
-rw-r--r--src/xml/repr.h2
3 files changed, 22 insertions, 2 deletions
diff --git a/src/sp-item-group.cpp b/src/sp-item-group.cpp
index 556a349ed..9e6333f97 100644
--- a/src/sp-item-group.cpp
+++ b/src/sp-item-group.cpp
@@ -457,8 +457,10 @@ sp_item_group_ungroup (SPGroup *group, GSList **children, bool do_done)
if (objects) {
Inkscape::XML::Node *last_def = SP_OBJECT_REPR(defs)->lastChild();
while (objects) {
- SP_OBJECT_REPR(defs)->addChild((Inkscape::XML::Node *) objects->data, last_def);
- Inkscape::GC::release((Inkscape::XML::Node *) objects->data);
+ Inkscape::XML::Node *repr = (Inkscape::XML::Node *) objects->data;
+ if (!sp_repr_is_meta_element(repr))
+ SP_OBJECT_REPR(defs)->addChild(repr, last_def);
+ Inkscape::GC::release(repr);
objects = g_slist_remove (objects, objects->data);
}
}
diff --git a/src/xml/repr-util.cpp b/src/xml/repr-util.cpp
index 97676bebe..193c1125c 100644
--- a/src/xml/repr-util.cpp
+++ b/src/xml/repr-util.cpp
@@ -446,6 +446,22 @@ sp_repr_lookup_name( Inkscape::XML::Node *repr, gchar const *name, gint maxdepth
}
/**
+ * Determine if the node is a 'title', 'desc' or 'metadata' element.
+ */
+bool
+sp_repr_is_meta_element(const Inkscape::XML::Node *node)
+{
+ if (node == NULL) return false;
+ if (node->type() != Inkscape::XML::ELEMENT_NODE) return false;
+ gchar const *name = node->name();
+ if (name == NULL) return false;
+ if (!std::strcmp(name, "svg:title")) return true;
+ if (!std::strcmp(name, "svg:desc")) return true;
+ if (!std::strcmp(name, "svg:metadata")) return true;
+ return false;
+}
+
+/**
* Parses the boolean value of an attribute "key" in repr and sets val accordingly, or to FALSE if
* the attr is not set.
*
diff --git a/src/xml/repr.h b/src/xml/repr.h
index 162451a0f..f0a1dbeb6 100644
--- a/src/xml/repr.h
+++ b/src/xml/repr.h
@@ -211,6 +211,8 @@ inline void sp_repr_unparent(Inkscape::XML::Node *repr) {
}
}
+bool sp_repr_is_meta_element(const Inkscape::XML::Node *node);
+
/* Convenience */
unsigned sp_repr_get_boolean(Inkscape::XML::Node *repr, gchar const *key, unsigned *val);
unsigned sp_repr_get_int(Inkscape::XML::Node *repr, gchar const *key, int *val);