X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2Frowpainter.cpp;h=5c8f694b505117316ad526b4838715663641ab5f;hb=4594b1425b484138fcae28996f460312d810b8d5;hp=0a097ed9f257edd0308bae09e473db4025b64e4d;hpb=7382c55fd7295031928a31bed35e26c08bf343d4;p=lyx.git diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index 0a097ed9f2..5c8f694b50 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -60,7 +60,7 @@ RowPainter::RowPainter(PainterInfo & pi, pars_(text.paragraphs()), row_(row), pit_(pit), par_(text.paragraphs()[pit]), pm_(text_metrics_.parMetrics(pit)), - bidi_(bidi), erased_(pi_.erased_), + bidi_(bidi), change_(pi_.change_), xo_(x), yo_(y), width_(text_metrics_.width()) { bidi_.computeTables(par_, pi_.base.bv->buffer(), row_); @@ -106,11 +106,14 @@ void RowPainter::paintInset(Inset const * inset, pos_type const pos) pi_.base.bv->buffer().params().getFont().fontInfo() : font.fontInfo(); pi_.ltr_pos = (bidi_.level(pos) % 2 == 0); - pi_.erased_ = erased_ || par_.isDeleted(pos); - pi_.base.bv->coordCache().insets().add(inset, int(x_), yo_); + pi_.change_ = change_.changed() ? change_ : par_.lookupChange(pos); + + int const x1 = int(x_); + pi_.base.bv->coordCache().insets().add(inset, x1, yo_); // insets are painted completely. Recursive - inset->drawSelection(pi_, int(x_), yo_); - inset->draw(pi_, int(x_), yo_); + inset->drawBackground(pi_, x1, yo_); + inset->drawSelection(pi_, x1, yo_); + inset->draw(pi_, x1, yo_); Dimension const & dim = pm_.insetDimension(inset); @@ -122,28 +125,6 @@ void RowPainter::paintInset(Inset const * inset, pos_type const pos) pi_.full_repaint = pi_full_repaint; #ifdef DEBUG_METRICS - int const x1 = int(x_ - dim.width()); - Dimension dim2; - LASSERT(max_witdh_ > 0, /**/); - int right_margin = text_metrics_.rightMargin(pm_); - int const w = max_witdh_ - leftMargin() - right_margin; - MetricsInfo mi(pi_.base.bv, font.fontInfo(), w); - inset->metrics(mi, dim2); - if (dim.wid != dim2.wid) - lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) - << " draw width " << dim.width() - << "> metrics width " << dim2.wid << "." << endl; - if (dim->asc != dim2.asc) - lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) - << " draw ascent " << dim.ascent() - << "> metrics ascent " << dim2.asc << "." << endl; - if (dim2.descent() != dim.des) - lyxerr << "Error: inset " << to_ascii(inset->getInsetName()) - << " draw ascent " << dim.descent() - << "> metrics descent " << dim2.des << "." << endl; - LASSERT(dim2.wid == dim.wid, /**/); - LASSERT(dim2.asc == dim.asc, /**/); - LASSERT(dim2.des == dim.des, /**/); int const x2 = x1 + dim.wid; int const y1 = yo_ + dim.des; int const y2 = yo_ - dim.asc; @@ -324,9 +305,9 @@ void RowPainter::paintChars(pos_type & vpos, FontInfo const & font, FontInfo copy = font; if (change_running.changed()) - copy.setColor(change_running.color()); + copy.setPaintColor(change_running.color()); else if (selection) - copy.setColor(Color_selectiontext); + copy.setPaintColor(Color_selectiontext); x_ += pi_.pain.text(int(x_), yo_, s, copy); } @@ -347,6 +328,13 @@ void RowPainter::paintForeignMark(double orig_x, Language const * lang, } +void RowPainter::paintMisspelledMark(double orig_x, int desc) +{ + int const y = yo_ + desc; + pi_.pain.wavyHorizontalLine(int(orig_x), y, int(x_) - int(orig_x), Color_red); +} + + void RowPainter::paintFromPos(pos_type & vpos) { pos_type const pos = bidi_.vis2log(vpos); @@ -374,6 +362,9 @@ void RowPainter::paintFromPos(pos_type & vpos) } paintForeignMark(orig_x, orig_font.language()); + + if (orig_font.isMisspelled()) + paintMisspelledMark(orig_x, 3); } @@ -615,7 +606,7 @@ void RowPainter::paintLast() FontMetrics const & fm = theFontMetrics(pi_.base.bv->buffer().params().getFont()); int const length = fm.maxAscent() / 2; - ColorCode col = change.color(); + 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); @@ -674,16 +665,25 @@ void RowPainter::paintLast() void RowPainter::paintOnlyInsets() { + CoordCache const & cache = pi_.base.bv->coordCache(); pos_type const end = row_.endpos(); 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) continue; - if (x_ > pi_.base.bv->workWidth()) + if (x_ > pi_.base.bv->workWidth() + || !cache.getInsets().has(inset)) continue; - x_ = pi_.base.bv->coordCache().getInsets().x(inset); + x_ = cache.getInsets().x(inset); + + bool const pi_selected = pi_.selected; + Cursor const & cur = pi_.base.bv->cursor(); + if (cur.selection() && cur.text() == &text_ + && cur.anchor().text() == &text_) + pi_.selected = row_.sel_beg <= pos && row_.sel_end > pos; paintInset(inset, pos); + pi_.selected = pi_selected; } } @@ -772,7 +772,7 @@ void RowPainter::paintText() Inset const * inset = par_.getInset(pos); bool const highly_editable_inset = inset - && inset->editable() == Inset::HIGHLY_EDITABLE; + && inset->editable(); // If we reach the end of a change or if the author changes, paint it. // We also don't paint across things like tables @@ -818,7 +818,14 @@ void RowPainter::paintText() } else if (inset) { // If outer row has changed, nested insets are repaint completely. pi_.base.bv->coordCache().insets().add(inset, int(x_), yo_); + + bool const pi_selected = pi_.selected; + Cursor const & cur = pi_.base.bv->cursor(); + if (cur.selection() && cur.text() == &text_ + && cur.anchor().text() == &text_) + pi_.selected = row_.sel_beg <= pos && row_.sel_end > pos; paintInset(inset, pos); + pi_.selected = pi_selected; ++vpos; } else {