X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Frowpainter.cpp;h=47ab84d3a2b5e7130eb47cebc276b3ebc8dae163;hb=e2982037d9f981a6070c3cf90148bde33edbfdc9;hp=a63c7ea143e9b6964972a2f06ee8917504efd3cb;hpb=5f08562026b6298023e86861d8b09b82bf38b966;p=lyx.git diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index a63c7ea143..47ab84d3a2 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" @@ -60,9 +62,20 @@ RowPainter::RowPainter(PainterInfo & pi, row_(row), pit_(pit), par_(text.paragraphs()[pit]), pm_(text_metrics_.parMetrics(pit)), bidi_(bidi), change_(pi_.change_), - xo_(x), yo_(y), width_(text_metrics_.width()) + xo_(x), yo_(y), width_(text_metrics_.width()), + line_thickness_(1.0), line_offset_(2) { bidi_.computeTables(par_, pi_.base.bv->buffer(), row_); + + 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)); + // adjust line_offset_ too + line_offset_ = int(2 * line_thickness_) + 1; + } + x_ = row_.x + xo_; //lyxerr << "RowPainter: x: " << x_ << " xo: " << xo_ << " yo: " << yo_ << endl; @@ -349,20 +362,19 @@ void RowPainter::paintForeignMark(double orig_x, Language const * lang, if (lang == pi_.base.bv->buffer().params().language) return; - int const y = yo_ + 1 + desc; - pi_.pain.line(int(orig_x), y, int(x_), y, Color_language); + int const y = yo_ + 1 + desc + int(line_thickness_/2); + pi_.pain.line(int(orig_x), y, int(x_), y, Color_language, + Painter::line_solid, line_thickness_); } -void RowPainter::paintMisspelledMark(double orig_x, int desc, bool changed) +void RowPainter::paintMisspelledMark(double orig_x, bool changed) { - // derive the offset from zoom factor specified by user in percent // if changed the misspelled marker gets placed slightly lower than normal // to avoid drawing at the same vertical offset - int const offset = int(1.5 * lyxrc.zoom / 100.0); // [percent] - int const y = yo_ + desc + (changed ? offset : 0) + 1; + 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, 2.0); + Painter::line_onoffdash, line_thickness_); } @@ -382,7 +394,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 @@ -398,8 +410,23 @@ void RowPainter::paintFromPos(pos_type & vpos, bool changed) paintForeignMark(orig_x, orig_font.language()); - if (lyxrc.spellcheck_continuously && misspelled_) { - paintMisspelledMark(orig_x, 2, 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); } } @@ -742,7 +769,12 @@ void RowPainter::paintOnlyInsets() for (pos_type pos = row_.pos(); pos != end; ++pos) { // If outer row has changed, nested insets are repaint completely. Inset const * inset = par_.getInset(pos); - if (!inset || !inset->asInsetText()) + bool const nested_inset = inset && + ((inset->asInsetMath() && + !inset->asInsetMath()->asMacroTemplate()) + || inset->asInsetText() + || inset->asInsetTabular()); + if (!nested_inset) continue; if (x_ > pi_.base.bv->workWidth() || !cache.getInsets().has(inset)) @@ -854,9 +886,9 @@ void RowPainter::paintText() FontMetrics const & fm = theFontMetrics(pi_.base.bv->buffer().params().getFont()); int const y_bar = change_running.deleted() ? - yo_ - fm.maxAscent() / 3 : yo_ + fm.maxAscent() / 6; + 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, 0.5); + change_running.color(), Painter::line_solid, line_thickness_); // Change might continue with a different author or type if (change.changed() && !highly_editable_inset) { @@ -914,9 +946,9 @@ void RowPainter::paintText() FontMetrics const & fm = theFontMetrics(pi_.base.bv->buffer().params().getFont()); int const y_bar = change_running.deleted() ? - yo_ - fm.maxAscent() / 3 : yo_ + fm.maxAscent() / 6; + 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, 0.5); + change_running.color(), Painter::line_solid, line_thickness_); change_running.setUnchanged(); } }