DEPM: reorganize a bit (no change intended)

Exit early if the cursor has not moved.

Place comments where they belong.
This commit is contained in:
Jean-Marc Lasgouttes 2019-02-15 15:49:53 +01:00
parent 2dc62d0405
commit b59b968c3e

View File

@ -819,6 +819,10 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
Paragraph & oldpar = old.paragraph(); Paragraph & oldpar = old.paragraph();
bool const trackChanges = cur.buffer()->params().track_changes; 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 // We do not do anything on read-only documents
if (cur.buffer()->isReadonly()) if (cur.buffer()->isReadonly())
return false; return false;
@ -827,6 +831,22 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
if (oldpar.isFreeSpacing()) if (oldpar.isFreeSpacing())
return false; 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. /* Ok I'll put some comments here about what is missing.
There are still some small problems that can lead to There are still some small problems that can lead to
double spaces stored in the document file or space at double spaces stored in the document file or space at
@ -844,61 +864,48 @@ bool Text::deleteEmptyParagraphMechanism(Cursor & cur,
// delete the LineSeparator. // delete the LineSeparator.
// MISSING // MISSING
// Find a common inset and the corresponding depth. // find range of spaces around cursors
size_t depth = 0; pos_type from = old.pos();
for (; depth < cur.depth(); ++depth) while (from > 0
if (&old.inset() == &cur[depth].inset()) && oldpar.isLineSeparator(from - 1)
break; && !oldpar.isDeleted(from - 1))
--from;
pos_type to = old.pos();
while (to < old.lastpos()
&& oldpar.isLineSeparator(to)
&& !oldpar.isDeleted(to))
++to;
// Whether a common inset is found and whether the cursor is still in int num_spaces = to - from;
// the same paragraph (possibly nested). // If we are not at the start of the paragraph, keep one space
bool const same_par = depth < cur.depth() && old.idx() == cur[depth].idx() if (from != to && from > 0)
&& old.pit() == cur[depth].pit(); --num_spaces;
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 // If cursor is inside range, keep one additional space
// them, but only if the cursor has really moved. if (same_par && cur.pos() > from && cur.pos() < to)
if (!same_par_pos) { --num_spaces;
// 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; // Remove spaces and adapt cursor.
// If we are not at the start of the paragraph, keep one space if (num_spaces > 0) {
if (from != to && from > 0) old.recordUndo();
--num_spaces; int const deleted =
deleteSpaces(oldpar, from, to, num_spaces, trackChanges);
// If cursor is inside range, keep one additional space // correct cur position
if (same_par && cur.pos() > from && cur.pos() < to) // FIXME: there can be other cursors pointing there, we should update them
--num_spaces; if (same_par) {
if (cur[depth].pos() >= to)
// Remove spaces and adapt cursor. cur[depth].pos() -= deleted;
if (num_spaces > 0) { else if (cur[depth].pos() > from)
old.recordUndo(); cur[depth].pos() = min(from + 1, old.lastpos());
int const deleted = need_anchor_change = true;
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;
} }
return true;
} }
/*
* (2) If the paragraph where the cursor was is empty, delete it
*/
// only do our other magic if we changed paragraph // only do our other magic if we changed paragraph
if (same_par) if (same_par)
return false; return false;