commit 61188464b4a31ad105a75cb5124a8d7eb3cfd882 Author: Jean-Marc Lasgouttes <lasgout...@lyx.org> Date: Mon Jul 18 12:17:01 2016 +0200
Simplify display of InsetQuote The code that specializes for double elements in the display string does not trigger anymore: displayString() returns a single unicode value, plus some space for french guillemets. Use a thin space for these french quotes instead of a plain space and remove special case in metrics(). --- src/insets/InsetQuotes.cpp | 38 ++++++++++---------------------------- 1 files changed, 10 insertions(+), 28 deletions(-) diff --git a/src/insets/InsetQuotes.cpp b/src/insets/InsetQuotes.cpp index 84e004b..1a6c925 100644 --- a/src/insets/InsetQuotes.cpp +++ b/src/insets/InsetQuotes.cpp @@ -178,20 +178,23 @@ void InsetQuotes::parseString(string const & s) } +// FIXME: should we add a language or a font parameter member? docstring InsetQuotes::displayString() const { - Language const * loclang = + Language const * loclang = isBufferValid() ? buffer().params().language : 0; int const index = quote_index[side_][language_]; docstring retdisp = docstring(1, display_quote_char[times_][index]); - // in french, spaces are added inside double quotes + // in french, thin spaces are added inside double quotes // FIXME: this should be done by a separate quote type. if (times_ == DoubleQuotes && loclang && prefixIs(loclang->code(), "fr")) { + // THIN SPACE (U+2009) + char_type const thin_space = 0x2009; if (side_ == LeftQuote) - retdisp += ' '; + retdisp += thin_space; else - retdisp.insert(size_t(0), 1, ' '); + retdisp = thin_space + retdisp; } return retdisp; @@ -201,39 +204,18 @@ docstring InsetQuotes::displayString() const void InsetQuotes::metrics(MetricsInfo & mi, Dimension & dim) const { FontInfo & font = mi.base.font; - frontend::FontMetrics const & fm = - theFontMetrics(font); + frontend::FontMetrics const & fm = theFontMetrics(font); dim.asc = fm.maxAscent(); dim.des = fm.maxDescent(); - dim.wid = 0; - - // FIXME: should we add a language or a font parameter member? - docstring const text = displayString(); - for (string::size_type i = 0; i < text.length(); ++i) { - if (text[i] == ' ') - dim.wid += fm.width('i'); - else if (i == 0 || text[i] != text[i - 1]) - dim.wid += fm.width(text[i]); - else - dim.wid += fm.width(','); - } + dim.wid = fm.width(displayString()); } void InsetQuotes::draw(PainterInfo & pi, int x, int y) const { - // FIXME: should we add a language or a font parameter member? - docstring const text = displayString(); FontInfo font = pi.base.font; font.setPaintColor(pi.textColor(font.realColor())); - if (text.length() == 2 && text[0] == text[1]) { - pi.pain.text(x, y, text[0], font); - int const t = theFontMetrics(font) - .width(','); - pi.pain.text(x + t, y, text[0], font); - } else { - pi.pain.text(x, y, text, font); - } + pi.pain.text(x, y, displayString(), font); }