diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/text-editing.cpp | 24 | ||||
| -rw-r--r-- | src/text-editing.h | 1 |
2 files changed, 25 insertions, 0 deletions
diff --git a/src/text-editing.cpp b/src/text-editing.cpp index 44450f8fa..d5a53fc49 100644 --- a/src/text-editing.cpp +++ b/src/text-editing.cpp @@ -182,6 +182,30 @@ unsigned sp_text_get_length(SPObject const *item) return length; } +/** Recursively gets the length of all the SPStrings at or below the given +\a item. Also adds 1 for each line break encountered. */ +unsigned sp_text_get_length_upto(SPObject const *item, SPObject const *upto) +{ + unsigned length = 0; + + if (SP_IS_STRING(item)) return SP_STRING(item)->string.length(); + if (is_line_break_object(item)) length++; + for (SPObject const *child = item->firstChild() ; child ; child = SP_OBJECT_NEXT(child)) { + if (child == upto) + return length; + if (SP_IS_STRING(child)) length += SP_STRING(child)->string.length(); + else { + if (child->isAncestorOf(upto)) { + length += sp_text_get_length(child); + return length; + } else { + length += sp_text_get_length(child); + } + } + } + return length; +} + static Inkscape::XML::Node* duplicate_node_without_children(Inkscape::XML::Node const *old_node) { switch (old_node->type()) { diff --git a/src/text-editing.h b/src/text-editing.h index 619bec89f..dba763f75 100644 --- a/src/text-editing.h +++ b/src/text-editing.h @@ -24,6 +24,7 @@ bool sp_te_output_is_empty (SPItem const *item); bool sp_te_input_is_empty (SPObject const *item); unsigned sp_text_get_length(SPObject const *item); +unsigned sp_text_get_length_upto(SPObject const *item, SPObject const *upto); std::vector<NR::Point> sp_te_create_selection_quads(SPItem const *item, Inkscape::Text::Layout::iterator const &start, Inkscape::Text::Layout::iterator const &end, NR::Matrix const &transform); Inkscape::Text::Layout::iterator sp_te_get_position_by_coords (SPItem const *item, NR::Point &i_p); |
