X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Frowpainter.cpp;h=080ef43f648a82ebfda240eee0e8f1da57d998d5;hb=77713af55868140483a1a7f5704dd93b97dbe116;hp=bfc3ea9c839f5b35ac21cfa2242667cfd0797fc3;hpb=d8db0e8515b0d1698264a11811e36ae78c94d353;p=lyx.git diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index bfc3ea9c83..080ef43f64 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -75,7 +75,11 @@ RowPainter::RowPainter(PainterInfo & pi, FontInfo RowPainter::labelFont() const { - return text_.labelFont(par_); + FontInfo f = text_.labelFont(par_); + // selected text? + if (row_.begin_margin_sel || pi_.selected) + f.setPaintColor(Color_selectiontext); + return f; } @@ -224,7 +228,12 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, Change const & change_running = par_.lookupChange(pos); // selected text? - bool const selection = pos >= row_.sel_beg && pos < row_.sel_end; + bool const selection = (pos >= row_.sel_beg && pos < row_.sel_end) + || pi_.selected; + + // spelling correct? + bool const spell_state = + lyxrc.spellcheck_continuously && par_.isMisspelled(pos); char_type prev_char = ' '; // collect as much similar chars as we can @@ -238,6 +247,12 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, // Selection ends or starts here. break; + bool const new_spell_state = + lyxrc.spellcheck_continuously && par_.isMisspelled(pos); + if (new_spell_state != spell_state) + // Spell checker state changed here. + break; + Change const & change = par_.lookupChange(pos); if (!change_running.isSimilarTo(change)) // Track change type or author has changed. @@ -327,14 +342,18 @@ void RowPainter::paintForeignMark(double orig_x, Language const * lang, } -void RowPainter::paintMisspelledMark(double orig_x, int desc) +void RowPainter::paintMisspelledMark(double orig_x, int desc, bool changed) { - int const y = yo_ + desc; - pi_.pain.wavyHorizontalLine(int(orig_x), y, int(x_) - int(orig_x), Color_red); + // 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); + pi_.pain.line(int(orig_x), y, int(x_), y, Color_red, Painter::line_onoffdash, 1.0); } -void RowPainter::paintFromPos(pos_type & vpos) +void RowPainter::paintFromPos(pos_type & vpos, bool changed) { pos_type const pos = bidi_.vis2log(vpos); Font const orig_font = text_metrics_.displayFont(pit_, pos); @@ -349,6 +368,10 @@ void RowPainter::paintFromPos(pos_type & vpos) bool const arabic = lang == "arabic_arabtex" || lang == "arabic_arabi" || lang == "farsi"; + // spelling correct? + bool const misspelled_ = + lyxrc.spellcheck_continuously && par_.isMisspelled(pos); + // draw as many chars as we can if ((!hebrew && !arabic) || (hebrew && !Encodings::isHebrewComposeChar(c)) @@ -362,8 +385,9 @@ void RowPainter::paintFromPos(pos_type & vpos) paintForeignMark(orig_x, orig_font.language()); - if (lyxrc.spellcheck_continuously && orig_font.isMisspelled()) - paintMisspelledMark(orig_x, 3); + if (lyxrc.spellcheck_continuously && misspelled_) { + paintMisspelledMark(orig_x, 2, changed); + } } @@ -475,29 +499,28 @@ int RowPainter::paintAppendixStart(int y) void RowPainter::paintFirst() { - ParagraphParameters const & parparams = par_.params(); + ParagraphParameters const & pparams = par_.params(); + Buffer const & buffer = pi_.base.bv->buffer(); + BufferParams const & bparams = buffer.params(); + Layout const & layout = par_.layout(); int y_top = 0; // start of appendix? - if (parparams.startOfAppendix()) + if (pparams.startOfAppendix()) y_top += paintAppendixStart(yo_ - row_.ascent() + 2 * defaultRowHeight()); - Buffer const & buffer = pi_.base.bv->buffer(); - Layout const & layout = par_.layout(); - - if (buffer.params().paragraph_separation == BufferParams::ParagraphSkipSeparation) { - if (pit_ != 0) { - if (layout.latextype == LATEX_PARAGRAPH - && !par_.getDepth()) { - y_top += buffer.params().getDefSkip().inPixels(*pi_.base.bv); - } else { - Layout const & playout = pars_[pit_ - 1].layout(); - if (playout.latextype == LATEX_PARAGRAPH - && !pars_[pit_ - 1].getDepth()) { - // is it right to use defskip here, too? (AS) - y_top += buffer.params().getDefSkip().inPixels(*pi_.base.bv); - } + if (bparams.paragraph_separation == BufferParams::ParagraphSkipSeparation + && pit_ != 0) { + if (layout.latextype == LATEX_PARAGRAPH + && !par_.getDepth()) { + y_top += bparams.getDefSkip().inPixels(*pi_.base.bv); + } else { + Layout const & playout = pars_[pit_ - 1].layout(); + if (playout.latextype == LATEX_PARAGRAPH + && !pars_[pit_ - 1].getDepth()) { + // is it right to use defskip here, too? (AS) + y_top += bparams.getDefSkip().inPixels(*pi_.base.bv); } } } @@ -524,10 +547,10 @@ void RowPainter::paintFirst() // the top. if (layout.counter == "chapter") { double spacing_val = 1.0; - if (!parparams.spacing().isDefault()) { - spacing_val = parparams.spacing().getValue(); + if (!pparams.spacing().isDefault()) { + spacing_val = pparams.spacing().getValue(); } else { - spacing_val = buffer.params().spacing().getValue(); + spacing_val = bparams.spacing().getValue(); } int const labeladdon = int(fm.maxHeight() * layout.spacing.getValue() * spacing_val); @@ -564,10 +587,10 @@ void RowPainter::paintFirst() docstring const str = par_.labelString(); if (!str.empty()) { double spacing_val = 1.0; - if (!parparams.spacing().isDefault()) - spacing_val = parparams.spacing().getValue(); + if (!pparams.spacing().isDefault()) + spacing_val = pparams.spacing().getValue(); else - spacing_val = buffer.params().spacing().getValue(); + spacing_val = bparams.spacing().getValue(); FontMetrics const & fm = theFontMetrics(font); @@ -640,14 +663,14 @@ void RowPainter::paintLast() Color col = change.color(); pi_.pain.line(int(x_) + 1, yo_ + 2, int(x_) + 1, yo_ + 2 - length, col, - Painter::line_solid, Painter::line_thick); + Painter::line_solid, 3); if (change.deleted()) { pi_.pain.line(int(x_) + 1 - length, yo_ + 2, int(x_) + 1 + length, - yo_ + 2, col, Painter::line_solid, Painter::line_thick); + yo_ + 2, col, Painter::line_solid, 3); } else { pi_.pain.line(int(x_) + 1 - length, yo_ + 2, int(x_) + 1, - yo_ + 2, col, Painter::line_solid, Painter::line_thick); + yo_ + 2, col, Painter::line_solid, 3); } } @@ -820,8 +843,7 @@ void RowPainter::paintText() int const y_bar = change_running.deleted() ? yo_ - fm.maxAscent() / 3 : yo_ + fm.maxAscent() / 6; pi_.pain.line(change_last_x, y_bar, int(x_), y_bar, - change_running.color(), Painter::line_solid, - Painter::line_thin); + change_running.color(), Painter::line_solid, 0.5); // Change might continue with a different author or type if (change.changed() && !highly_editable_inset) { @@ -866,7 +888,7 @@ void RowPainter::paintText() } else { // paint as many characters as possible. - paintFromPos(vpos); + paintFromPos(vpos, change_running.changed()); } // Is the inline completion after character? @@ -881,7 +903,7 @@ void RowPainter::paintText() int const y_bar = change_running.deleted() ? yo_ - fm.maxAscent() / 3 : yo_ + fm.maxAscent() / 6; pi_.pain.line(change_last_x, y_bar, int(x_), y_bar, - change_running.color(), Painter::line_solid, Painter::line_thin); + change_running.color(), Painter::line_solid, 0.5); change_running.setUnchanged(); } }