X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FCursor.cpp;h=ad46e8c50567e61af367f7b1c90e26133393086d;hb=313d9fa4d056ed213607500076c1bd391a563b6d;hp=074047f4901f634a21ff0ff70d9b25787ac17883;hpb=e7b9aa672f0fcb61676702e90facabbfa900ddec;p=lyx.git diff --git a/src/Cursor.cpp b/src/Cursor.cpp index 074047f490..ad46e8c505 100644 --- a/src/Cursor.cpp +++ b/src/Cursor.cpp @@ -1594,9 +1594,20 @@ bool Cursor::backspace(bool const force) // [|], can not delete from inside return false; } else { - if (inMathed()) - pullArg(); - else + if (inMathed()) { + switch (inset().asInsetMath()->getType()) { + case hullEqnArray: + case hullAlign: + case hullFlAlign: { + FuncRequest cmd(LFUN_CHAR_BACKWARD); + this->dispatch(cmd); + break; + } + default: + pullArg(); + break; + } + } else popBackward(); return true; } @@ -1701,8 +1712,11 @@ void Cursor::handleNest(MathAtom const & a) { idx_type const idx = a.nucleus()->asNestInset()->firstIdx(); //lyxerr << "Cursor::handleNest: " << idx << endl; + InsetMath const * im = selectionBegin().inset().asInsetMath(); + Parse::flags const f = im && im->currentMode() != InsetMath::MATH_MODE + ? Parse::TEXTMODE : Parse::NORMAL; MathAtom t = a; - asArray(cap::grabAndEraseSelection(*this), t.nucleus()->cell(idx)); + asArray(cap::grabAndEraseSelection(*this), t.nucleus()->cell(idx), f); insert(t); editInsertedInset(); } @@ -2026,20 +2040,39 @@ bool Cursor::mathForward(bool word) posForward(); while (pos() < lastpos() && mc == nextMath().mathClass()); } else if (openable(nextAtom())) { + InsetMathScript const * n = nextMath().asScriptInset(); + bool to_brace_deco = n && !n->nuc().empty() + && n->nuc().back()->lyxCode() == MATH_DECORATION_CODE + && n->nuc().back()->mathClass() == MC_OP; // single step: try to enter the next inset pushBackward(nextMath()); inset().idxFirst(*this); + // Make sure the cursor moves directly to an + // \overbrace or \underbrace inset (bug 2264) + if (to_brace_deco) { + pushBackward(nextMath()); + inset().idxFirst(*this); + } } else posForward(); return true; } if (inset().idxForward(*this)) return true; + InsetMath const * m = inset().asInsetMath(); + bool from_brace_deco = m + && m->lyxCode() == MATH_DECORATION_CODE + && m->mathClass() == MC_OP; // try to pop forwards --- but don't pop out of math! leave that to // the FINISH lfuns int s = depth() - 2; - if (s >= 0 && operator[](s).inset().asInsetMath()) - return popForward(); + if (s >= 0 && operator[](s).inset().asInsetMath() && popForward()) { + // Make sure the cursor moves directly to an + // \overbrace or \underbrace inset (bug 2264) + bool to_script = inset().asInsetMath() + && inset().asInsetMath()->asScriptInset(); + return from_brace_deco && to_script ? mathForward(word) : true; + } return false; } @@ -2061,21 +2094,41 @@ bool Cursor::mathBackward(bool word) while (pos() > 0 && mc == prevMath().mathClass()); } } else if (openable(prevAtom())) { + InsetMathScript const * p = prevMath().asScriptInset(); + bool to_brace_deco = p && !p->nuc().empty() + && p->nuc().back()->lyxCode() == MATH_DECORATION_CODE + && p->nuc().back()->mathClass() == MC_OP; // single step: try to enter the preceding inset posBackward(); push(nextMath()); inset().idxLast(*this); + // Make sure the cursor moves directly to an + // \overbrace or \underbrace inset (bug 2264) + if (to_brace_deco) { + posBackward(); + push(nextMath()); + inset().idxLast(*this); + } } else posBackward(); return true; } if (inset().idxBackward(*this)) return true; + InsetMath const * m = inset().asInsetMath(); + bool from_brace_deco = m + && m->lyxCode() == MATH_DECORATION_CODE + && m->mathClass() == MC_OP; // try to pop backwards --- but don't pop out of math! leave that to // the FINISH lfuns int s = depth() - 2; - if (s >= 0 && operator[](s).inset().asInsetMath()) - return popBackward(); + if (s >= 0 && operator[](s).inset().asInsetMath() && popBackward()) { + // Make sure the cursor moves directly to an + // \overbrace or \underbrace inset (bug 2264) + bool to_script = inset().asInsetMath() + && inset().asInsetMath()->asScriptInset(); + return from_brace_deco && to_script ? mathBackward(word) : true; + } return false; }