From 0a0a837b70a8e4736b6b848060b6a893a8578306 Mon Sep 17 00:00:00 2001 From: Richard Heck Date: Tue, 13 Mar 2012 12:08:25 -0400 Subject: [PATCH] Address bug 7975 by changing how toggling works, as suggested by JMarc. --- src/Text.h | 5 ++-- src/Text2.cpp | 66 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 61 insertions(+), 10 deletions(-) diff --git a/src/Text.h b/src/Text.h index c4da020cce..6068025192 100644 --- a/src/Text.h +++ b/src/Text.h @@ -71,7 +71,7 @@ public: * inset that is alowed inside a font change. */ void setInsetFont(BufferView const & bv, pit_type pit, pos_type pos, - Font const & font, bool toggleall = false); + Font const & font); /// what you expect when pressing \ at cursor position /// \param inverse_logic if false, the same layout is set for the @@ -104,8 +104,7 @@ public: void setFont(Cursor & cur, Font const &, bool toggleall = false); /// Set font from \p begin to \p end and rebreak. void setFont(BufferView const & bv, CursorSlice const & begin, - CursorSlice const & end, Font const &, - bool toggleall = false); + CursorSlice const & end, Font const &); /// void toggleFree(Cursor & cur, Font const &, bool toggleall = false); diff --git a/src/Text2.cpp b/src/Text2.cpp index 199790cf2a..184de7b3a9 100644 --- a/src/Text2.cpp +++ b/src/Text2.cpp @@ -163,7 +163,7 @@ void Text::setCharFont(pit_type pit, void Text::setInsetFont(BufferView const & bv, pit_type pit, - pos_type pos, Font const & font, bool toggleall) + pos_type pos, Font const & font) { Inset * const inset = pars_[pit].getInset(pos); LASSERT(inset && inset->resetFontEdit(), /**/); @@ -176,7 +176,7 @@ void Text::setInsetFont(BufferView const & bv, pit_type pit, CursorSlice cellend = cs; cellend.pit() = cellend.lastpit(); cellend.pos() = cellend.lastpos(); - text->setFont(bv, cs, cellend, font, toggleall); + text->setFont(bv, cs, cellend, font); } } } @@ -321,15 +321,67 @@ void Text::setFont(Cursor & cur, Font const & font, bool toggleall) // Ok, we have a selection. cur.recordUndoSelection(); + Font newfont = font; + + if (toggleall) { + // Toggling behaves as follows: We check the first character of the + // selection. If it's (say) got EMPH on, then we set to off; if off, + // then to on. With families and the like, we set it to INHERIT, if + // we already have it. + CursorSlice const & sl = cur.selBegin(); + Text const & text = *sl.text(); + Paragraph const & par = text.getPar(sl.pit()); + + // get font at the position + Font oldfont = par.getFont(cur.bv().buffer().params(), sl.pos(), + text.outerFont(sl.pit())); + FontInfo const & oldfi = oldfont.fontInfo(); + + FontInfo & newfi = newfont.fontInfo(); + + FontFamily newfam = newfi.family(); + if (newfam != INHERIT_FAMILY && newfam != IGNORE_FAMILY && + newfam == oldfi.family()) + newfi.setFamily(INHERIT_FAMILY); + + FontSeries newser = newfi.series(); + if (newser == BOLD_SERIES && oldfi.series() == BOLD_SERIES) + newfi.setSeries(INHERIT_SERIES); + + FontShape newshp = newfi.shape(); + if (newshp != INHERIT_SHAPE && newshp != IGNORE_SHAPE && + newshp == oldfi.shape()) + newfi.setShape(INHERIT_SHAPE); + + ColorCode newcol = newfi.color(); + if (newcol != Color_none && newcol != Color_inherit + && newcol != Color_ignore && newcol == oldfi.color()) + newfi.setColor(Color_none); + + // ON/OFF ones + if (newfi.emph() == FONT_TOGGLE) + newfi.setEmph(oldfi.emph() == FONT_OFF ? FONT_ON : FONT_OFF); + if (newfi.underbar() == FONT_TOGGLE) + newfi.setUnderbar(oldfi.underbar() == FONT_OFF ? FONT_ON : FONT_OFF); + if (newfi.strikeout() == FONT_TOGGLE) + newfi.setStrikeout(oldfi.strikeout() == FONT_OFF ? FONT_ON : FONT_OFF); + if (newfi.uuline() == FONT_TOGGLE) + newfi.setUuline(oldfi.uuline() == FONT_OFF ? FONT_ON : FONT_OFF); + if (newfi.uwave() == FONT_TOGGLE) + newfi.setUwave(oldfi.uwave() == FONT_OFF ? FONT_ON : FONT_OFF); + if (newfi.noun() == FONT_TOGGLE) + newfi.setNoun(oldfi.noun() == FONT_OFF ? FONT_ON : FONT_OFF); + if (newfi.number() == FONT_TOGGLE) + newfi.setNumber(oldfi.number() == FONT_OFF ? FONT_ON : FONT_OFF); + } setFont(cur.bv(), cur.selectionBegin().top(), - cur.selectionEnd().top(), font, toggleall); + cur.selectionEnd().top(), newfont); } void Text::setFont(BufferView const & bv, CursorSlice const & begin, - CursorSlice const & end, Font const & font, - bool toggleall) + CursorSlice const & end, Font const & font) { Buffer const & buffer = bv.buffer(); @@ -347,11 +399,11 @@ void Text::setFont(BufferView const & bv, CursorSlice const & begin, if (inset && inset->resetFontEdit()) { // We need to propagate the font change to all // text cells of the inset (bugs 1973, 6919). - setInsetFont(bv, pit, pos, font, toggleall); + setInsetFont(bv, pit, pos, font); } TextMetrics const & tm = bv.textMetrics(this); Font f = tm.displayFont(pit, pos); - f.update(font, language, toggleall); + f.update(font, language); setCharFont(pit, pos, f, tm.font_); // font change may change language... // spell checker has to know that