X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FRowPainter.cpp;h=e6c6353307d978f470beb4873f2b5277cdabd13d;hb=598f7e4a45dc10232a42db34e5ca887615c5306f;hp=2a25482b34409d5179f9634cf54a0d970be5374c;hpb=b63421b7dc65e0c721f8928d1330b9bb2cff43d8;p=lyx.git diff --git a/src/RowPainter.cpp b/src/RowPainter.cpp index 2a25482b34..e6c6353307 100644 --- a/src/RowPainter.cpp +++ b/src/RowPainter.cpp @@ -62,7 +62,7 @@ RowPainter::RowPainter(PainterInfo & pi, pm_(text_metrics_.parMetrics(pit)), change_(pi_.change_), xo_(x), yo_(y), width_(text_metrics_.width()), solid_line_thickness_(1), solid_line_offset_(1), - dotted_line_thickness_(1), dotted_line_offset_(2) + dotted_line_thickness_(1) { if (lyxrc.zoom >= 200) { // derive the line thickness from zoom factor @@ -77,8 +77,6 @@ RowPainter::RowPainter(PainterInfo & pi, // the zoom is given in percent // (increase thickness at 150%, 250% etc.) dotted_line_thickness_ = (lyxrc.zoom + 50) / 100; - // adjust line_offset_ too - dotted_line_offset_ = 1 + dotted_line_thickness_ / 2; } x_ = row_.left_margin + xo_; @@ -106,42 +104,40 @@ FontInfo RowPainter::labelFont() const // This draws green lines around each inset. -void RowPainter::paintInset(Inset const * inset, Font const & font, - Change const & change, - pos_type const pos) +void RowPainter::paintInset(Row::Element const & e) { // Handle selection bool const pi_selected = pi_.selected; Cursor const & cur = pi_.base.bv->cursor(); if (cur.selection() && cur.text() == &text_ && cur.normalAnchor().text() == &text_) - pi_.selected = row_.sel_beg <= pos && row_.sel_end > pos; + pi_.selected = row_.sel_beg <= e.pos && row_.sel_end > e.pos; - LASSERT(inset, return); + LASSERT(e.inset, return); // Backup full_repaint status because some insets (InsetTabular) // requires a full repaint bool const pi_full_repaint = pi_.full_repaint; bool const pi_do_spellcheck = pi_.do_spellcheck; Change const pi_change = pi_.change_; - pi_.base.font = inset->inheritFont() ? font.fontInfo() : + pi_.base.font = e.inset->inheritFont() ? e.font.fontInfo() : pi_.base.bv->buffer().params().getFont().fontInfo(); - pi_.ltr_pos = !font.isVisibleRightToLeft(); - pi_.change_ = change_.changed() ? change_ : change; - pi_.do_spellcheck &= inset->allowSpellCheck(); + pi_.ltr_pos = !e.font.isVisibleRightToLeft(); + pi_.change_ = change_.changed() ? change_ : e.change; + pi_.do_spellcheck &= e.inset->allowSpellCheck(); int const x1 = int(x_); - pi_.base.bv->coordCache().insets().add(inset, x1, yo_); + pi_.base.bv->coordCache().insets().add(e.inset, x1, yo_); // insets are painted completely. Recursive // FIXME: it is wrong to completely paint the background // if we want to do single row painting. - inset->drawBackground(pi_, x1, yo_); - inset->drawSelection(pi_, x1, yo_); - inset->draw(pi_, x1, yo_); + e.inset->drawBackground(pi_, x1, yo_); + e.inset->drawSelection(pi_, x1, yo_); + e.inset->draw(pi_, x1, yo_); - Dimension const & dim = pm_.insetDimension(inset); + Dimension const & dim = pi_.base.bv->coordCache().insets().dim(e.inset); - paintForeignMark(x_, font.language(), dim.descent()); + paintForeignMark(x_, e.font.language(), dim.descent()); x_ += dim.width(); @@ -183,9 +179,11 @@ void RowPainter::paintMisspelledMark(double const orig_x, { // if changed the misspelled marker gets placed slightly lower than normal // to avoid drawing at the same vertical offset + FontMetrics const & fm = theFontMetrics(e.font); + int const thickness = max(fm.lineWidth(), 2); int const y = yo_ + solid_line_offset_ + solid_line_thickness_ + (e.change.changed() ? solid_line_thickness_ + 1 : 0) - + dotted_line_offset_; + + 1 + thickness / 2; //FIXME: this could be computed only once, it is probably not costly. // check for cursor position @@ -219,16 +217,16 @@ void RowPainter::paintMisspelledMark(double const orig_x, FontMetrics const & fm = theFontMetrics(e.font); int x1 = fm.pos2x(e.str, range.first - e.pos, - e.font.isVisibleRightToLeft(), e.extra); + e.isRTL(), e.extra); int x2 = fm.pos2x(e.str, min(range.last - e.pos + 1, pos_type(e.str.length())), - e.font.isVisibleRightToLeft(), e.extra); + e.isRTL(), e.extra); if (x1 > x2) swap(x1, x2); pi_.pain.line(int(orig_x) + x1, y, int(orig_x) + x2, y, Color_error, - Painter::line_onoffdash, dotted_line_thickness_); + Painter::line_onoffdash, thickness); pos = range.last + 1; } } @@ -243,20 +241,19 @@ void RowPainter::paintStringAndSel(Row::Element const & e) bool const all_sel = (e.pos >= row_.sel_beg && e.endpos < row_.sel_end) || pi_.selected; - if (all_sel) { - Font copy = e.font; - copy.fontInfo().setPaintColor(Color_selectiontext); - pi_.pain.text(int(x_), yo_, e.str, copy, e.extra); - } else if (e.change.changed()) { + if (all_sel || e.change.changed()) { Font copy = e.font; - copy.fontInfo().setPaintColor(e.change.color()); - pi_.pain.text(int(x_), yo_, e.str, copy, e.extra); + Color const col = e.change.changed() ? e.change.color() + : Color_selectiontext; + copy.fontInfo().setPaintColor(col); + pi_.pain.text(int(x_), yo_, e.str, copy, e.extra, e.full_width()); } else if (!some_sel) { - pi_.pain.text(int(x_), yo_, e.str, e.font, e.extra); + pi_.pain.text(int(x_), yo_, e.str, e.font, e.extra, e.full_width()); } else { pi_.pain.text(int(x_), yo_, e.str, e.font, Color_selectiontext, - max(row_.sel_beg, e.pos) - e.pos, - min(row_.sel_end, e.endpos) - e.pos, e.extra); + max(row_.sel_beg, e.pos) - e.pos, + min(row_.sel_end, e.endpos) - e.pos, + e.extra, e.full_width()); } x_ += e.full_width(); } @@ -357,7 +354,7 @@ void RowPainter::paintDepthBar() const } -int RowPainter::paintAppendixStart(int y) const +void RowPainter::paintAppendixStart(int y) const { FontInfo pb_font = sane_font; pb_font.setColor(Color_appendix); @@ -377,8 +374,6 @@ int RowPainter::paintAppendixStart(int y) const pi_.pain.line(int(xo_ + 1), y, text_start, y, Color_appendix); pi_.pain.line(text_end, y, int(xo_ + width_ - 2), y, Color_appendix); - - return 3 * defaultRowHeight(); } @@ -401,40 +396,21 @@ void RowPainter::paintTooLargeMarks(bool const left, bool const right) const void RowPainter::paintFirst() const { - BufferParams const & bparams = pi_.base.bv->buffer().params(); Layout const & layout = par_.layout(); - int y_top = 0; - // start of appendix? if (par_.params().startOfAppendix()) - y_top += paintAppendixStart(yo_ - row_.ascent() + 2 * defaultRowHeight()); - - 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); - } - } - } + paintAppendixStart(yo_ - row_.ascent() + 2 * defaultRowHeight()); bool const is_first = text_.isFirstInSequence(pit_) || !layout.isParagraphGroup(); //lyxerr << "paintFirst: " << par_.id() << " is_seq: " << is_seq << endl; if (layout.labelIsInline() - && (layout.labeltype != LABEL_STATIC || is_first)) { + && (layout.labeltype != LABEL_STATIC || is_first)) paintLabel(); - } else if (is_first && layout.labelIsAbove()) { + else if (is_first && layout.labelIsAbove()) paintTopLevelLabel(); - } } @@ -602,7 +578,6 @@ void RowPainter::paintOnlyInsets() Row::Element const & e = *cit; if (e.type == Row::INSET) { // If outer row has changed, nested insets are repainted completely. - pi_.base.bv->coordCache().insets().add(e.inset, int(x_), yo_); bool const nested_inset = (e.inset->asInsetMath() && !e.inset->asInsetMath()->asMacroTemplate()) || e.inset->asInsetText() || e.inset->asInsetTabular(); @@ -610,7 +585,7 @@ void RowPainter::paintOnlyInsets() x_ += e.full_width(); continue; } - paintInset(e.inset, e.font, e.change, e.pos); + paintInset(e); } else x_ += e.full_width(); } @@ -631,16 +606,13 @@ void RowPainter::paintText() case Row::VIRTUAL: paintStringAndSel(e); - // Paint the spelling mark if needed. - if (lyxrc.spellcheck_continuously && pi_.do_spellcheck - && par_.isMisspelled(e.pos)) { + // Paint the spelling marks if enabled. + if (lyxrc.spellcheck_continuously && pi_.do_spellcheck && pi_.pain.isDrawingEnabled()) paintMisspelledMark(orig_x, e); - } break; case Row::INSET: { - // If outer row has changed, nested insets are repaint completely. - pi_.base.bv->coordCache().insets().add(e.inset, int(x_), yo_); - paintInset(e.inset, e.font, e.change, e.pos); + // If outer row has changed, nested insets are repainted completely. + paintInset(e); foreign_descent = e.dim.descent(); } break;