commit 74dd33e3856ada95a55db8480173792801b8ab93
Author: Richard Heck <[email protected]>
Date:   Thu Apr 21 17:44:14 2016 -0400

    Updates to splitting of consecutive environments.
    
    From Enrico.
    
    (cherry picked from commit ee82dd604010d4c1bf250640a3df6d790ea08380)

diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 56ecd94..72b2bd4 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -2203,9 +2203,14 @@ void BufferView::mouseEventDispatch(FuncRequest const & 
cmd0)
                // inset (depending on cmd.x(), cmd.y()). This is needed for
                // editing to fix bug 9628, but e.g. the context menu needs a
                // 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.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.
@@ -2512,12 +2517,8 @@ bool BufferView::mouseSetCursor(Cursor & cur, bool 
select)
        // FIXME: (2) if we had a working InsetText::notifyCursorLeaves,
        // the leftinset bool would not be necessary (badcursor instead).
        bool update = leftinset;
-       if (!do_selection && d->cursor_.inTexted()) {
+       if (!do_selection && d->cursor_.inTexted())
                update |= checkDepm(cur, d->cursor_);
-               if (cur.inTexted() && cur.pos()
-                       && cur.paragraph().isEnvSeparator(cur.pos() - 1))
-                   cur.posBackward();
-       }
 
        if (!do_selection)
                d->cursor_.resetAnchor();
diff --git a/src/Row.cpp b/src/Row.cpp
index 8af6fa9..d0694f7 100644
--- a/src/Row.cpp
+++ b/src/Row.cpp
@@ -66,8 +66,7 @@ double Row::Element::pos2x(pos_type const i) const
 
        double w = 0;
        //handle first the two bounds of the element
-       if (i == endpos && type != VIRTUAL
-               && !(inset && inset->lyxCode() == SEPARATOR_CODE))
+       if (i == endpos && type != VIRTUAL)
                w = isRTL() ? 0 : full_width();
        else if (i == pos || type != STRING)
                w = isRTL() ? full_width() : 0;
diff --git a/src/Text.cpp b/src/Text.cpp
index 29ff6cf..f6c1d39 100644
--- a/src/Text.cpp
+++ b/src/Text.cpp
@@ -1110,7 +1110,7 @@ bool Text::cursorForwardOneWord(Cursor & cur)
        Paragraph const & par = cur.paragraph();
 
        // Paragraph boundary is a word boundary
-       if (pos == lastpos) {
+       if (pos == lastpos || (pos + 1 == lastpos && par.isEnvSeparator(pos))) {
                if (pit != cur.lastpit())
                        return setCursor(cur, pit + 1, 0);
                else
@@ -1143,6 +1143,10 @@ bool Text::cursorForwardOneWord(Cursor & cur)
                             ++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);
 }
 
@@ -1156,8 +1160,14 @@ bool Text::cursorBackwardOneWord(Cursor & cur)
        Paragraph & par = cur.paragraph();
 
        // Paragraph boundary is a word boundary
-       if (pos == 0 && pit != 0)
-               return setCursor(cur, pit - 1, getPar(pit - 1).size());
+       if (pos == 0 && pit != 0) {
+               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) {
                // Skip through punctuation and spaces.
diff --git a/src/Text3.cpp b/src/Text3.cpp
index 15ffb28..49df75e 100644
--- a/src/Text3.cpp
+++ b/src/Text3.cpp
@@ -1661,6 +1661,9 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
 
                tm->setCursorFromCoordinates(cur, cmd.x(), y);
                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)
                        lyx::dispatch(FuncRequest(LFUN_DOWN_SELECT));
                else if (cmd.y() < 0)
diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp
index 52af39a..810b21a 100644
--- a/src/TextMetrics.cpp
+++ b/src/TextMetrics.cpp
@@ -1594,7 +1594,8 @@ bool TextMetrics::cursorEnd(Cursor & cur)
                        boundary = true;
                else
                        --end;
-       }
+       } else if (cur.paragraph().isEnvSeparator(end-1))
+               --end;
        return text_->setCursor(cur, cur.pit(), end, true, boundary);
 }
 

Reply via email to