diff options
| author | Tavmjong Bah, Kamalpreet Grewal <> | 2016-07-25 13:40:59 +0000 |
|---|---|---|
| committer | kamalpreetgrewal <grewalkamal005@gmail.com> | 2016-07-25 13:40:59 +0000 |
| commit | 6641c2e8c586612aad47e1296584ca6447e11b15 (patch) | |
| tree | c4a59dec5624aebab6aee2f0b6f3902a9168a7da /src/document.cpp | |
| parent | Merge changes from trunk (diff) | |
| download | inkscape-6641c2e8c586612aad47e1296584ca6447e11b15.tar.gz inkscape-6641c2e8c586612aad47e1296584ca6447e11b15.zip | |
Add robust implementation of _getSelectorVec()
(bzr r14949.1.60)
Diffstat (limited to 'src/document.cpp')
| -rw-r--r-- | src/document.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/document.cpp b/src/document.cpp index 9f408788b..834d54132 100644 --- a/src/document.cpp +++ b/src/document.cpp @@ -1053,6 +1053,60 @@ sigc::connection SPDocument::connectIdChanged(gchar const *id, return priv->id_changed_signals[g_quark_from_string(id)].connect(slot); } +void _getObjectsByClassRecursive(Glib::ustring const &klass, SPObject *parent, std::vector<SPObject *> &objects) +{ + if (parent) { + Glib::ustring class_attribute; + char const *temp = parent->getAttribute("class"); + if (temp) { + class_attribute = temp; + } + + if (class_attribute.find( klass ) != std::string::npos) { + objects.push_back( parent ); + } + + // Check children + for (SPObject *child = parent->children; child; child = child->next) { + _getObjectsByClassRecursive( klass, child, objects ); + } + } +} + +std::vector<SPObject *> SPDocument::getObjectsByClass(Glib::ustring const &klass) const +{ + std::vector<SPObject *> objects; + g_return_val_if_fail(!klass.empty(), objects); + + _getObjectsByClassRecursive(klass, root, objects); + return objects; +} + +void _getObjectsByElementRecursive(Glib::ustring const &element, SPObject *parent, + std::vector<SPObject *> &objects) +{ + if (parent) { + Glib::ustring prefixed = "svg:" + element; + if (parent->getRepr()->name() == prefixed) { + objects.push_back(parent); + } + + // Check children + for (SPObject *child = parent->children; child; child = child->next) { + _getObjectsByElementRecursive(element, child, objects); + } + } +} + +std::vector<SPObject *> SPDocument::getObjectsByElement(Glib::ustring const &element) const +{ + std::vector<SPObject *> objects; + g_return_val_if_fail(!element.empty(), objects); + + _getObjectsByElementRecursive(element, root, objects); + return objects; +} + void SPDocument::bindObjectToRepr(Inkscape::XML::Node *repr, SPObject *object) { if (object) { |
