From: Jean-Marc Lasgouttes Date: Fri, 15 Feb 2019 14:49:53 +0000 (+0100) Subject: DEPM: reorganize a bit (no change intended) X-Git-Tag: lyx-2.4.0dev-acb2ca7b~2574 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=b59b968c3eae5cc0d5ea40444f85cd693751c688;p=features.git DEPM: reorganize a bit (no change intended) Exit early if the cursor has not moved. Place comments where they belong. --- diff --git a/src/Text2.cpp b/src/Text2.cpp index d70dfc15ca..e4c0c2614e 100644 --- a/src/Text2.cpp +++ b/src/Text2.cpp @@ -819,6 +819,10 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur, Paragraph & oldpar = old.paragraph(); bool const trackChanges = cur.buffer()->params().track_changes; + // We do nothing if cursor did not move + if (cur.top() == old.top()) + return false; + // We do not do anything on read-only documents if (cur.buffer()->isReadonly()) return false; @@ -827,6 +831,22 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur, if (oldpar.isFreeSpacing()) return false; + // Find a common inset and the corresponding depth. + size_t depth = 0; + for (; depth < cur.depth(); ++depth) + if (&old.inset() == &cur[depth].inset()) + break; + + // Whether a common inset is found and whether the cursor is still in + // the same paragraph (possibly nested). + bool const same_par = depth < cur.depth() && old.idx() == cur[depth].idx() + && old.pit() == cur[depth].pit(); + + /* + * (1) If the chars around the old cursor were spaces, delete some of + * them, but only if the cursor has really moved. + */ + /* Ok I'll put some comments here about what is missing. There are still some small problems that can lead to double spaces stored in the document file or space at @@ -844,61 +864,48 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur, // delete the LineSeparator. // MISSING - // Find a common inset and the corresponding depth. - size_t depth = 0; - for (; depth < cur.depth(); ++depth) - if (&old.inset() == &cur[depth].inset()) - break; - - // Whether a common inset is found and whether the cursor is still in - // the same paragraph (possibly nested). - bool const same_par = depth < cur.depth() && old.idx() == cur[depth].idx() - && old.pit() == cur[depth].pit(); - bool const same_par_pos = depth == cur.depth() - 1 && same_par - && old.pos() == cur[depth].pos(); - - // If the chars around the old cursor were spaces, delete some of - // them, but only if the cursor has really moved. - if (!same_par_pos) { - // find range of spaces around cursors - pos_type from = old.pos(); - while (from > 0 - && oldpar.isLineSeparator(from - 1) - && !oldpar.isDeleted(from - 1)) - --from; - pos_type to = old.pos(); - while (to < old.lastpos() - && oldpar.isLineSeparator(to) - && !oldpar.isDeleted(to)) - ++to; - - int num_spaces = to - from; - // If we are not at the start of the paragraph, keep one space - if (from != to && from > 0) - --num_spaces; - - // If cursor is inside range, keep one additional space - if (same_par && cur.pos() > from && cur.pos() < to) - --num_spaces; - - // Remove spaces and adapt cursor. - if (num_spaces > 0) { - old.recordUndo(); - int const deleted = - deleteSpaces(oldpar, from, to, num_spaces, trackChanges); - // correct cur position - // FIXME: there can be other cursors pointing there, we should update them - if (same_par) { - if (cur[depth].pos() >= to) - cur[depth].pos() -= deleted; - else if (cur[depth].pos() > from) - cur[depth].pos() = min(from + 1, old.lastpos()); - need_anchor_change = true; - } - return true; + // find range of spaces around cursors + pos_type from = old.pos(); + while (from > 0 + && oldpar.isLineSeparator(from - 1) + && !oldpar.isDeleted(from - 1)) + --from; + pos_type to = old.pos(); + while (to < old.lastpos() + && oldpar.isLineSeparator(to) + && !oldpar.isDeleted(to)) + ++to; + + int num_spaces = to - from; + // If we are not at the start of the paragraph, keep one space + if (from != to && from > 0) + --num_spaces; + + // If cursor is inside range, keep one additional space + if (same_par && cur.pos() > from && cur.pos() < to) + --num_spaces; + + // Remove spaces and adapt cursor. + if (num_spaces > 0) { + old.recordUndo(); + int const deleted = + deleteSpaces(oldpar, from, to, num_spaces, trackChanges); + // correct cur position + // FIXME: there can be other cursors pointing there, we should update them + if (same_par) { + if (cur[depth].pos() >= to) + cur[depth].pos() -= deleted; + else if (cur[depth].pos() > from) + cur[depth].pos() = min(from + 1, old.lastpos()); + need_anchor_change = true; } + return true; } + /* + * (2) If the paragraph where the cursor was is empty, delete it + */ + // only do our other magic if we changed paragraph if (same_par) return false;