From bdaad03a45276664e65ae4d66ecba8c5d4d91d85 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Wed, 8 Nov 2023 09:17:38 +0100 Subject: [PATCH] Do not accumulate underline changes If an element is underlined in mathed by using the text properties dialog, the changes accumulate. So, for example, to change a single underline to a double one, one would need removing the previous underline first. This commit allows using the text properties dialog and simply replace an underline type with another one. However, this works only if the underlined element is not included in some other inset. For example, given "\uline{\text{abc}}", selecting the 'b' and choosing a double underline produces "\uline{\text{a\uuline{b}c}}". But, given "\text{\uline{abc}}", and operating as before produces "\text{\uline{a}\uuline{b}\uline{c}}". --- src/mathed/InsetMathNest.cpp | 110 +++++++++++++++-------------------- 1 file changed, 47 insertions(+), 63 deletions(-) diff --git a/src/mathed/InsetMathNest.cpp b/src/mathed/InsetMathNest.cpp index d1b033bbd2..944a7d2a98 100644 --- a/src/mathed/InsetMathNest.cpp +++ b/src/mathed/InsetMathNest.cpp @@ -688,76 +688,60 @@ void InsetMathNest::handleFont2(Cursor & cur, docstring const & arg) } InsetMathDecoration const * d = asDecorationInset(); + docstring const name = d ? d->name() : docstring(); - if (font.fontInfo().underbar() == FONT_OFF && d && d->name() == "uline") { - lyxerr << "Remove uline" << endl; - } - if (font.fontInfo().uuline() == FONT_OFF && d && d->name() == "uuline") { - lyxerr << "Remove uuline" << endl; - } - if (font.fontInfo().uwave() == FONT_OFF && d && d->name() == "uwave") { - lyxerr << "Remove uwave" << endl; + if ((font.fontInfo().underbar() == FONT_OFF && name == "uline") || + (font.fontInfo().uuline() == FONT_OFF && name == "uuline") || + (font.fontInfo().uwave() == FONT_OFF && name == "uwave")) { + if (include_previous_change) { + Cursor oldcur = cur; + cur.backwardInset(); + cur.resetAnchor(); + cur = oldcur; + cur.setSelection(); + } + docstring const beg = '\\' + name + '{'; + docstring const end = from_ascii("}"); + docstring const sel2 = cur.selectionAsString(false); + cap::cutSelection(cur, false); + cur.pos() = 0; + cur.setSelection(); + docstring const sel1 = cur.selectionAsString(false); + cur.pos() = cur.lastpos(); + cur.setSelection(); + docstring const sel3 = cur.selectionAsString(false); + cur.mathForward(false); + cur.setSelection(); + cap::cutSelection(cur, false); + MathData ar; + if (!sel1.empty()) { + mathed_parse_cell(ar, beg + sel1 + end); + cur.insert(ar); + } + cur.resetAnchor(); + mathed_parse_cell(ar, sel2); + cur.insert(ar); + if (!sel3.empty()) { + pos_type pos = cur.pos(); + mathed_parse_cell(ar, beg + sel3 + end); + cur.insert(ar); + cur.pos() = pos; + } + cur.setSelection(); + include_previous_change = false; } - switch(font.fontInfo().underbar()) { - case FONT_ON: - if (!d || d->name() != "uline") + if (font.fontInfo().underbar() == FONT_ON) { + if (!d || name != "uline") im = from_ascii("uline"); - break; - case FONT_OFF: - case FONT_TOGGLE: - case FONT_INHERIT: - case FONT_IGNORE: - break; - } - if (!im.empty()) { - if (include_previous_change) { - Cursor oldcur = cur; - cur.backwardInset(); - cur.resetAnchor(); - cur = oldcur; - cur.setSelection(); - } - handleNest(cur, createInsetMath(im, cur.buffer())); - im.clear(); - include_previous_change = true; - } - - switch(font.fontInfo().uuline()) { - case FONT_ON: - if (!d || d->name() != "uuline") + } else if (font.fontInfo().uuline() == FONT_ON) { + if (!d || name != "uuline") im = from_ascii("uuline"); - break; - case FONT_OFF: - case FONT_TOGGLE: - case FONT_INHERIT: - case FONT_IGNORE: - break; - } - if (!im.empty()) { - if (include_previous_change) { - Cursor oldcur = cur; - cur.backwardInset(); - cur.resetAnchor(); - cur = oldcur; - cur.setSelection(); - } - handleNest(cur, createInsetMath(im, cur.buffer())); - im.clear(); - include_previous_change = true; + } else if (font.fontInfo().uwave() == FONT_ON) { + if (!d || name != "uwave") + im = from_ascii("uwave"); } - switch(font.fontInfo().uwave()) { - case FONT_ON: - if (!d || d->name() != "uwave") - im = from_ascii("uwave"); - break; - case FONT_OFF: - case FONT_TOGGLE: - case FONT_INHERIT: - case FONT_IGNORE: - break; - } if (!im.empty()) { if (include_previous_change) { Cursor oldcur = cur;