X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Frowpainter.cpp;h=bcbf6da6fbbb2c4500c90f351b2a01d7dc2025cd;hb=176123afcf4484f1a0859dee515690cfd45bc1b6;hp=c11dc3b0d90d6963aba792df609ab20472cc6a46;hpb=ad76c66e338dfe4f9aae09429a30b205fe00e257;p=lyx.git diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index c11dc3b0d9..bcbf6da6fb 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -38,6 +38,8 @@ #include "insets/InsetText.h" +#include "mathed/InsetMath.h" + #include "support/debug.h" #include "support/gettext.h" #include "support/textutils.h" @@ -61,17 +63,26 @@ RowPainter::RowPainter(PainterInfo & pi, pm_(text_metrics_.parMetrics(pit)), bidi_(bidi), change_(pi_.change_), xo_(x), yo_(y), width_(text_metrics_.width()), - line_thickness_(1.0), line_offset_(2) + solid_line_thickness_(1.0), solid_line_offset_(1), + dotted_line_thickness_(1.0), dotted_line_offset_(2) { bidi_.computeTables(par_, pi_.base.bv->buffer(), row_); + if (lyxrc.zoom >= 200) { + // derive the line thickness from zoom factor + // the zoom is given in percent + // (increase thickness at 250%, 450% etc.) + solid_line_thickness_ = (float)(int((lyxrc.zoom + 50) / 200.0)); + // adjust line_offset_ too + solid_line_offset_ = 1 + int(0.5 * solid_line_thickness_); + } if (lyxrc.zoom >= 100) { // derive the line thickness from zoom factor // the zoom is given in percent // (increase thickness at 150%, 250% etc.) - line_thickness_ = (float)(int((lyxrc.zoom + 50) / 100.0)); + dotted_line_thickness_ = (float)(int((lyxrc.zoom + 50) / 100.0)); // adjust line_offset_ too - line_offset_ = int(2 * line_thickness_) + 1; + dotted_line_offset_ = int(0.5 * dotted_line_thickness_) + 1; } x_ = row_.x + xo_; @@ -114,11 +125,8 @@ void RowPainter::paintInset(Inset const * inset, pos_type const pos) // requires a full repaint bool pi_full_repaint = pi_.full_repaint; - // FIXME: We should always use font, see documentation of - // noFontChange() in Inset.h. - pi_.base.font = inset->noFontChange() ? - pi_.base.bv->buffer().params().getFont().fontInfo() : - font.fontInfo(); + pi_.base.font = inset->inheritFont() ? font.fontInfo() : + pi_.base.bv->buffer().params().getFont().fontInfo(); pi_.ltr_pos = (bidi_.level(pos) % 2 == 0); pi_.change_ = change_.changed() ? change_ : par_.lookupChange(pos); @@ -259,9 +267,9 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, // Maybe a more general fix would be draw character by character // for some predefined fonts on some platform. In arabic and // Hebrew we already do paint this way. - if (prev_char == 'f') + if (prev_char == 'f' || lyxrc.force_paint_single_char) break; - + pos = bidi_.vis2log(vpos); if (pos < font_span.first || pos > font_span.last) break; @@ -360,9 +368,9 @@ void RowPainter::paintForeignMark(double orig_x, Language const * lang, if (lang == pi_.base.bv->buffer().params().language) return; - int const y = yo_ + 1 + desc + int(line_thickness_/2); + int const y = yo_ + solid_line_offset_ + desc + int(solid_line_thickness_/2); pi_.pain.line(int(orig_x), y, int(x_), y, Color_language, - Painter::line_solid, line_thickness_); + Painter::line_solid, solid_line_thickness_); } @@ -370,9 +378,11 @@ void RowPainter::paintMisspelledMark(double orig_x, bool changed) { // if changed the misspelled marker gets placed slightly lower than normal // to avoid drawing at the same vertical offset - int const y = yo_ + (changed ? int(line_thickness_ + 1.0) : 0) + line_offset_; - pi_.pain.line(int(orig_x), y, int(x_), y, Color_error, - Painter::line_onoffdash, line_thickness_); + float const y = yo_ + solid_line_offset_ + solid_line_thickness_ + + (changed ? solid_line_thickness_ + 1 : 0) + + dotted_line_offset_; + pi_.pain.line(int(orig_x), int(y), int(x_), int(y), Color_error, + Painter::line_onoffdash, dotted_line_thickness_); } @@ -392,7 +402,7 @@ void RowPainter::paintFromPos(pos_type & vpos, bool changed) lang == "farsi"; // spelling correct? - bool const misspelled_ = + bool const misspelled = lyxrc.spellcheck_continuously && par_.isMisspelled(pos); // draw as many chars as we can @@ -408,8 +418,23 @@ void RowPainter::paintFromPos(pos_type & vpos, bool changed) paintForeignMark(orig_x, orig_font.language()); - if (lyxrc.spellcheck_continuously && misspelled_) { - paintMisspelledMark(orig_x, changed); + if (lyxrc.spellcheck_continuously && misspelled) { + // check for cursor position + // don't draw misspelled marker for words at cursor position + // we don't want to disturb the process of text editing + BufferView const * bv = pi_.base.bv; + DocIterator const nw = bv->cursor().newWord(); + bool new_word = false; + if (!nw.empty() && par_.id() == nw.paragraph().id()) { + pos_type cpos = nw.pos(); + if (cpos > 0 && cpos == par_.size() && !par_.isWordSeparator(cpos-1)) + --cpos; + else if (cpos > 0 && par_.isWordSeparator(cpos)) + --cpos; + new_word = par_.isSameSpellRange(pos, cpos) ; + } + if (!new_word) + paintMisspelledMark(orig_x, changed); } } @@ -753,7 +778,10 @@ void RowPainter::paintOnlyInsets() // If outer row has changed, nested insets are repaint completely. Inset const * inset = par_.getInset(pos); bool const nested_inset = inset && - (inset->asInsetText() || inset->asInsetTabular()); + ((inset->asInsetMath() && + !inset->asInsetMath()->asMacroTemplate()) + || inset->asInsetText() + || inset->asInsetTabular()); if (!nested_inset) continue; if (x_ > pi_.base.bv->workWidth() @@ -865,10 +893,10 @@ void RowPainter::paintText() // Calculate 1/3 height of the buffer's default font FontMetrics const & fm = theFontMetrics(pi_.base.bv->buffer().params().getFont()); - int const y_bar = change_running.deleted() ? - yo_ - fm.maxAscent() / 3 : yo_ + line_offset_; - pi_.pain.line(change_last_x, y_bar, int(x_), y_bar, - change_running.color(), Painter::line_solid, line_thickness_); + float const y_bar = change_running.deleted() ? + yo_ - fm.maxAscent() / 3 : yo_ + 2 * solid_line_offset_ + solid_line_thickness_; + pi_.pain.line(change_last_x, int(y_bar), int(x_), int(y_bar), + change_running.color(), Painter::line_solid, solid_line_thickness_); // Change might continue with a different author or type if (change.changed() && !highly_editable_inset) { @@ -925,10 +953,10 @@ void RowPainter::paintText() if (change_running.changed()) { FontMetrics const & fm = theFontMetrics(pi_.base.bv->buffer().params().getFont()); - int const y_bar = change_running.deleted() ? - yo_ - fm.maxAscent() / 3 : yo_ + line_offset_; - pi_.pain.line(change_last_x, y_bar, int(x_), y_bar, - change_running.color(), Painter::line_solid, line_thickness_); + float const y_bar = change_running.deleted() ? + yo_ - fm.maxAscent() / 3 : yo_ + 2 * solid_line_offset_ + solid_line_thickness_; + pi_.pain.line(change_last_x, int(y_bar), int(x_), int(y_bar), + change_running.color(), Painter::line_solid, solid_line_thickness_); change_running.setUnchanged(); } }