Updates to splitting of consecutive environments.

From Enrico.
This commit is contained in:
Richard Heck 2016-04-21 17:44:14 -04:00
parent 625e7609f0
commit 0e1834f2d9
5 changed files with 26 additions and 12 deletions

View File

@ -2208,9 +2208,14 @@ void BufferView::mouseEventDispatch(FuncRequest const & cmd0)
// inset (depending on cmd.x(), cmd.y()). This is needed for // inset (depending on cmd.x(), cmd.y()). This is needed for
// editing to fix bug 9628, but e.g. the context menu needs a // editing to fix bug 9628, but e.g. the context menu needs a
// cursor in front of the inset. // cursor in front of the inset.
if ((inset->hasSettings() || !inset->contextMenuName().empty()) && if ((inset->hasSettings() || !inset->contextMenuName().empty()
|| inset->lyxCode() == SEPARATOR_CODE) &&
cur.nextInset() != inset && cur.prevInset() == inset) cur.nextInset() != inset && cur.prevInset() == inset)
cur.posBackward(); cur.posBackward();
} else if (cur.inTexted() && cur.pos()
&& cur.paragraph().isEnvSeparator(cur.pos() - 1)) {
// Always place cursor in front of a separator inset.
cur.posBackward();
} }
// Put anchor at the same position. // Put anchor at the same position.
@ -2517,12 +2522,8 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool select)
// FIXME: (2) if we had a working InsetText::notifyCursorLeaves, // FIXME: (2) if we had a working InsetText::notifyCursorLeaves,
// the leftinset bool would not be necessary (badcursor instead). // the leftinset bool would not be necessary (badcursor instead).
bool update = leftinset; bool update = leftinset;
if (!do_selection && d->cursor_.inTexted()) { if (!do_selection && d->cursor_.inTexted())
update |= checkDepm(cur, d->cursor_); update |= checkDepm(cur, d->cursor_);
if (cur.inTexted() && cur.pos()
&& cur.paragraph().isEnvSeparator(cur.pos() - 1))
cur.posBackward();
}
if (!do_selection) if (!do_selection)
d->cursor_.resetAnchor(); d->cursor_.resetAnchor();

View File

@ -66,8 +66,7 @@ double Row::Element::pos2x(pos_type const i) const
double w = 0; double w = 0;
//handle first the two bounds of the element //handle first the two bounds of the element
if (i == endpos && type != VIRTUAL if (i == endpos && type != VIRTUAL)
&& !(inset && inset->lyxCode() == SEPARATOR_CODE))
w = isRTL() ? 0 : full_width(); w = isRTL() ? 0 : full_width();
else if (i == pos || type != STRING) else if (i == pos || type != STRING)
w = isRTL() ? full_width() : 0; w = isRTL() ? full_width() : 0;

View File

@ -1110,7 +1110,7 @@ bool Text::cursorForwardOneWord(Cursor & cur)
Paragraph const & par = cur.paragraph(); Paragraph const & par = cur.paragraph();
// Paragraph boundary is a word boundary // Paragraph boundary is a word boundary
if (pos == lastpos) { if (pos == lastpos || (pos + 1 == lastpos && par.isEnvSeparator(pos))) {
if (pit != cur.lastpit()) if (pit != cur.lastpit())
return setCursor(cur, pit + 1, 0); return setCursor(cur, pit + 1, 0);
else else
@ -1143,6 +1143,10 @@ bool Text::cursorForwardOneWord(Cursor & cur)
++pos; ++pos;
} }
// Don't skip a separator inset at the end of a paragraph
if (pos == lastpos && pos && par.isEnvSeparator(pos - 1))
--pos;
return setCursor(cur, pit, pos); return setCursor(cur, pit, pos);
} }
@ -1156,8 +1160,14 @@ bool Text::cursorBackwardOneWord(Cursor & cur)
Paragraph & par = cur.paragraph(); Paragraph & par = cur.paragraph();
// Paragraph boundary is a word boundary // Paragraph boundary is a word boundary
if (pos == 0 && pit != 0) if (pos == 0 && pit != 0) {
return setCursor(cur, pit - 1, getPar(pit - 1).size()); Paragraph & prevpar = getPar(pit - 1);
pos = prevpar.size();
// Don't stop after an environment separator
if (pos && prevpar.isEnvSeparator(pos - 1))
--pos;
return setCursor(cur, pit - 1, pos);
}
if (lyxrc.mac_like_cursor_movement) { if (lyxrc.mac_like_cursor_movement) {
// Skip through punctuation and spaces. // Skip through punctuation and spaces.

View File

@ -1661,6 +1661,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
tm->setCursorFromCoordinates(cur, cmd.x(), y); tm->setCursorFromCoordinates(cur, cmd.x(), y);
cur.setTargetX(cmd.x()); cur.setTargetX(cmd.x());
// Don't allow selecting a separator inset
if (cur.pos() && cur.paragraph().isEnvSeparator(cur.pos() - 1))
cur.posBackward();
if (cmd.y() >= wh) if (cmd.y() >= wh)
lyx::dispatch(FuncRequest(LFUN_DOWN_SELECT)); lyx::dispatch(FuncRequest(LFUN_DOWN_SELECT));
else if (cmd.y() < 0) else if (cmd.y() < 0)

View File

@ -1594,7 +1594,8 @@ bool TextMetrics::cursorEnd(Cursor & cur)
boundary = true; boundary = true;
else else
--end; --end;
} } else if (cur.paragraph().isEnvSeparator(end-1))
--end;
return text_->setCursor(cur, cur.pit(), end, true, boundary); return text_->setCursor(cur, cur.pit(), end, true, boundary);
} }