From 55a9524e9914cff61297ddfbea69808510060b37 Mon Sep 17 00:00:00 2001 From: Abdelrazak Younes Date: Wed, 5 Dec 2007 22:25:07 +0000 Subject: [PATCH] Cleanup Hfill metrics and painting. InsetHFill is now treated almost like any other inset. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@21980 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/TextMetrics.cpp | 42 +++++++++++++++++++++++---------------- src/insets/InsetHFill.cpp | 32 ++++++++++++++++++++++++++--- src/insets/InsetHFill.h | 2 ++ src/rowpainter.cpp | 38 +---------------------------------- src/rowpainter.h | 1 - 5 files changed, 57 insertions(+), 58 deletions(-) diff --git a/src/TextMetrics.cpp b/src/TextMetrics.cpp index 07f5e09995..a3b856dd04 100644 --- a/src/TextMetrics.cpp +++ b/src/TextMetrics.cpp @@ -512,7 +512,6 @@ bool TextMetrics::redoParagraph(pit_type const pit) void TextMetrics::computeRowMetrics(pit_type const pit, Row & row, int width) const { - row.label_hfill = 0; row.hfill = 0; row.separator = 0; @@ -638,6 +637,28 @@ void TextMetrics::computeRowMetrics(pit_type const pit, row.x += row.label_hfill; } } + + pos_type const endpos = row.endpos(); + pos_type body_pos = par.beginOfBody(); + if (body_pos > 0 + && (body_pos > endpos || !par.isLineSeparator(body_pos - 1))) + body_pos = 0; + + ParagraphMetrics & pm = par_metrics_[pit]; + InsetList::const_iterator ii = par.insetList().begin(); + InsetList::const_iterator iend = par.insetList().end(); + for ( ; ii != iend; ++ii) { + if (ii->pos >= endpos || ii->pos < row.pos() + || ii->inset->lyxCode() != HFILL_CODE + || !pm.hfillExpansion(row, ii->pos)) + continue; + + Dimension dim = row.dimension(); + dim.wid = int(ii->pos >= body_pos ? row.hfill : row.label_hfill); + // Cache the inset dimension. + bv_->coordCache().insets().add(ii->inset, dim); + pm.setInsetDimension(ii->inset, dim); + } } @@ -1045,7 +1066,6 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, int const xo = origin_.x_; x -= xo; Paragraph const & par = text_->getPar(pit); - ParagraphMetrics const & pm = par_metrics_[pit]; Bidi bidi; bidi.computeTables(par, buffer, row); @@ -1082,19 +1102,9 @@ pos_type TextMetrics::getColumnNearX(pit_type const pit, tmpx -= singleWidth(pit, body_pos - 1); } - if (pm.hfillExpansion(row, c)) { - tmpx += singleWidth(pit, c); - if (c >= body_pos) - tmpx += row.hfill; - else - tmpx += row.label_hfill; - } else if (par.isSeparator(c)) { - tmpx += singleWidth(pit, c); - if (c >= body_pos) + tmpx += singleWidth(pit, c); + if (par.isSeparator(c) && c >= body_pos) tmpx += row.separator; - } else { - tmpx += singleWidth(pit, c); - } ++vc; } @@ -1512,9 +1522,7 @@ int TextMetrics::cursorX(CursorSlice const & sl, x += pm.singleWidth(pos, font); - if (pm.hfillExpansion(row, pos)) - x += (pos >= body_pos) ? row.hfill : row.label_hfill; - else if (par.isSeparator(pos) && pos >= body_pos) + if (par.isSeparator(pos) && pos >= body_pos) x += row.separator; } diff --git a/src/insets/InsetHFill.cpp b/src/insets/InsetHFill.cpp index c9f392c259..30980f1acd 100644 --- a/src/insets/InsetHFill.cpp +++ b/src/insets/InsetHFill.cpp @@ -11,6 +11,11 @@ #include #include "InsetHFill.h" + +#include "MetricsInfo.h" + +#include "frontends/Painter.h" + #include "support/gettext.h" #include @@ -40,9 +45,30 @@ Inset * InsetHFill::clone() const void InsetHFill::metrics(MetricsInfo &, Dimension & dim) const { - dim.wid = 3; - dim.asc = 3; - dim.des = 3; + // The metrics for this inset are calculated externally in + // \c TextMetrics::computeRowMetrics. Those are dummy value: + dim = Dimension(10, 10, 10); +} + + +void InsetHFill::draw(PainterInfo & pi, int x, int y) const +{ + Dimension const dim = Inset::dimension(*pi.base.bv); + x += 1; + + int const y0 = y + dim.des; + int const y1 = y - dim.asc; + + pi.pain.line(x, y1, x, y0, Color_added_space); + if (dim.wid == 0) + // The HFill is not expanded. + return; + + int const x1 = x + dim.wid; + + pi.pain.line(x, y, x1, y, Color_added_space, + frontend::Painter::line_onoffdash); + pi.pain.line(x1, y1, x1, y0, Color_added_space); } diff --git a/src/insets/InsetHFill.h b/src/insets/InsetHFill.h index 6c015afd47..3c4683cc2d 100644 --- a/src/insets/InsetHFill.h +++ b/src/insets/InsetHFill.h @@ -25,6 +25,8 @@ public: /// void metrics(MetricsInfo &, Dimension &) const; /// + void draw(PainterInfo & pi, int x, int y) const; + /// docstring const getScreenLabel(Buffer const &) const; /// InsetCode lyxCode() const { return HFILL_CODE; } diff --git a/src/rowpainter.cpp b/src/rowpainter.cpp index 9296c49e46..653c9d1276 100644 --- a/src/rowpainter.cpp +++ b/src/rowpainter.cpp @@ -89,36 +89,6 @@ int RowPainter::leftMargin() const row_.pos()); } - -void RowPainter::paintHfill(pos_type const pos, pos_type const body_pos) -{ - x_ += 1; - - int const y0 = yo_; - int const y1 = y0 - defaultRowHeight() / 2; - - pi_.pain.line(int(x_), y1, int(x_), y0, Color_added_space); - - if (pm_.hfillExpansion(row_, pos)) { - int const y2 = (y0 + y1) / 2; - - if (pos >= body_pos) { - pi_.pain.line(int(x_), y2, int(x_ + row_.hfill), y2, - Color_added_space, - Painter::line_onoffdash); - x_ += row_.hfill; - } else { - pi_.pain.line(int(x_), y2, int(x_ + row_.label_hfill), y2, - Color_added_space, - Painter::line_onoffdash); - x_ += row_.label_hfill; - } - pi_.pain.line(int(x_), y1, int(x_), y0, Color_added_space); - } - x_ += 2; -} - - // If you want to debug inset metrics uncomment the following line: //#define DEBUG_METRICS // This draws green lines around each inset. @@ -774,13 +744,7 @@ void RowPainter::paintText() x_ += row_.label_hfill + lwidth - width_pos; } - if (par_.isHfill(pos)) { - Inset const * inset = par_.getInset(pos); - pi_.base.bv->coordCache().insets().add(inset, int(x_), yo_); - paintHfill(pos, body_pos); - ++vpos; - - } else if (par_.isSeparator(pos)) { + if (par_.isSeparator(pos)) { Font const orig_font = text_metrics_.getDisplayFont(pit_, pos); double const orig_x = x_; x_ += width_pos; diff --git a/src/rowpainter.h b/src/rowpainter.h index c9bcafb723..874a28b000 100644 --- a/src/rowpainter.h +++ b/src/rowpainter.h @@ -63,7 +63,6 @@ private: int paintAppendixStart(int y); void paintFromPos(pos_type & vpos); void paintInset(Inset const * inset, pos_type const pos); - void paintHfill(pos_type const pos, pos_type const body_pos); /// return left margin int leftMargin() const;