Re-implement math markers logic.

The goal of this patch is to be able to properly remove the space
needed for markers in the case of insets that are inside macros and do
not need these markers. This was attempted at 9a9a6a8, but did not
work reliably.

To this end, the following simplifications are made:

* instead of drawing its own markers, each inset has a virtual method
  marker() which prescribes either NO_MARKER, MARKER (normal bottom
  marker) or MARKER2 (top and bottom marker). All explicit calls to
  (draw|metrics)Markers(|2) are removed.

* the space necessary for the markers is now counted in the
  before/above margins in the row structure. Therefore painting will
  not happen at (x + 1, y), but just (x,y).

* the methods drawDecoration are removed.

* the helper methods InsetMath::(draw|metrics)Markers(|2) are removed
  and replaced by a new function drawMarkers in MathRow.cpp.

Now the marker type is kept in the MathRow::Element object (and set to
NO_MARKER in not editable context) and the marker is accounted for in
MathRow::(metrics|draw).

Moreover, the extra pixel for the marker is taken on the before/After
space if possible. The marker will only require extra space when
before/after is 0.

See comment 168 of #8883 to understand what issues are fixed.
This commit is contained in:
Jean-Marc Lasgouttes 2017-01-06 09:52:10 +01:00
parent 605438f26d
commit 89662a6852
39 changed files with 189 additions and 193 deletions

View File

@ -198,17 +198,19 @@ public:
///
virtual bool showInsetDialog(BufferView *) const;
/// draw inset decoration if necessary.
/// This can use \c drawMarkers() for example.
virtual void drawDecoration(PainterInfo &, int, int) const {}
/// draw four angular markers
void drawMarkers(PainterInfo & pi, int x, int y) const;
// The possible marker types for insets
enum marker_type { NO_MARKER, MARKER2, MARKER };
/// draw two angular markers
void drawMarkers(PainterInfo & pi, int x, int y) const;
/// draw four angular markers
void drawMarkers2(PainterInfo & pi, int x, int y) const;
/// add space for markers
void metricsMarkers(Dimension & dim, int framesize = 1) const;
/// add space for markers
void metricsMarkers2(Dimension & dim, int framesize = 1) const;
/// draw inset decoration if necessary.
/// This can use \c drawMarkers() for example.
virtual void drawDecoration(PainterInfo &, int, int) const {}
/// last metrics computed for the inset
Dimension const dimension(BufferView const &) const;

View File

@ -58,44 +58,21 @@ MathClass InsetMath::mathClass() const
}
InsetMath::marker_type InsetMath::marker() const
{
return nargs() > 0 ? MARKER : NO_MARKER;
}
bool InsetMath::addToMathRow(MathRow & mrow, MetricsInfo & mi) const
{
MathRow::Element e(mi, MathRow::INSET, mathClass());
e.inset = this;
e.marker = mi.base.macro_nesting ? NO_MARKER : marker();
mrow.push_back(e);
return true;
}
void InsetMath::metricsMarkers(MetricsInfo & mi, Dimension & dim,
int framesize) const
{
if (!mi.base.macro_nesting)
Inset::metricsMarkers(dim, framesize);
}
void InsetMath::metricsMarkers2(MetricsInfo & mi, Dimension & dim,
int framesize) const
{
if (!mi.base.macro_nesting)
Inset::metricsMarkers2(dim, framesize);
}
void InsetMath::drawMarkers(PainterInfo & pi, int x, int y) const
{
if (!pi.base.macro_nesting)
Inset::drawMarkers(pi, x, y);
}
void InsetMath::drawMarkers2(PainterInfo & pi, int x, int y) const
{
if (!pi.base.macro_nesting)
Inset::drawMarkers2(pi, x, y);
}
void InsetMath::dump() const
{

View File

@ -114,6 +114,9 @@ public:
/// this is overridden by specific insets
virtual mode_type currentMode() const { return MATH_MODE; }
/// this is overridden by insets with specific edit marker type
virtual marker_type marker() const;
/// the ascent of the inset above the baseline
/// compute the size of the object for text based drawing
virtual void metricsT(TextMetricsInfo const & mi, Dimension & dim) const;
@ -169,15 +172,6 @@ public:
/// Add this inset to a math row. Return true if contents got added
virtual bool addToMathRow(MathRow &, MetricsInfo & mi) const;
/// draw four angular markers
void drawMarkers(PainterInfo & pi, int x, int y) const;
/// draw two angular markers
void drawMarkers2(PainterInfo & pi, int x, int y) const;
/// add space for markers
void metricsMarkers(MetricsInfo & mi, Dimension & dim, int framesize = 1) const;
/// add space for markers
void metricsMarkers2(MetricsInfo & mi, Dimension & dim, int framesize = 1) const;
/// identifies things that can get scripts
virtual bool isScriptable() const { return false; }
/// will this get written as a single block in {..}

View File

@ -53,7 +53,6 @@ void InsetMathBoldSymbol::metrics(MetricsInfo & mi, Dimension & dim) const
Changer dummy = mi.base.changeEnsureMath();
//Changer dummy = mi.base.changeFontSet("mathbf");
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
++dim.wid; // for 'double stroke'
}
@ -62,9 +61,8 @@ void InsetMathBoldSymbol::draw(PainterInfo & pi, int x, int y) const
{
Changer dummy = pi.base.changeEnsureMath();
//Changer dummy = pi.base.changeFontSet("mathbf");
cell(0).draw(pi, x, y);
cell(0).draw(pi, x + 1, y);
cell(0).draw(pi, x + 2, y);
drawMarkers(pi, x, y);
}

View File

@ -83,7 +83,6 @@ void InsetMathBox::metrics(MetricsInfo & mi, Dimension & dim) const
{
Changer dummy = mi.base.changeFontSet("textnormal");
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
@ -91,12 +90,11 @@ void InsetMathBox::draw(PainterInfo & pi, int x, int y) const
{
Changer dummy = pi.base.changeFontSet("textnormal");
cell(0).draw(pi, x, y);
drawMarkers(pi, x, y);
}
void InsetMathBox::infoize(odocstream & os) const
{
{
os << bformat(_("Box: %1$s"), name_);
}
@ -135,7 +133,10 @@ void InsetMathFBox::metrics(MetricsInfo & mi, Dimension & dim) const
{
Changer dummy = mi.base.changeFontSet("textnormal");
cell(0).metrics(mi, dim);
metricsMarkers2(mi, dim, 3); // 1 pixel space, 1 frame, 1 space
// 1 pixel space, 1 frame, 1 space
dim.wid += 2 * 3;
dim.asc += 3;
dim.des += 3;
}
@ -219,23 +220,23 @@ InsetMathMakebox::InsetMathMakebox(Buffer * buf, bool framebox)
void InsetMathMakebox::metrics(MetricsInfo & mi, Dimension & dim) const
{
Changer dummy = mi.base.changeFontSet("textnormal");
Dimension wdim;
static docstring bracket = from_ascii("[");
metricsStrRedBlack(mi, wdim, bracket);
int w = wdim.wid;
Dimension dim0;
Dimension dim1;
Dimension dim2;
cell(0).metrics(mi, dim0);
cell(1).metrics(mi, dim1);
cell(2).metrics(mi, dim2);
dim.wid = w + dim0.wid + w + w + dim1.wid + w + 2 + dim2.wid;
dim.asc = std::max(std::max(wdim.asc, dim0.asc), std::max(dim1.asc, dim2.asc));
dim.asc = std::max(std::max(wdim.asc, dim0.asc), std::max(dim1.asc, dim2.asc));
dim.des = std::max(std::max(wdim.des, dim0.des), std::max(dim1.des, dim2.des));
if (framebox_) {
dim.wid += 4;
dim.asc += 3;
@ -244,26 +245,22 @@ void InsetMathMakebox::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc += 1;
dim.des += 1;
}
metricsMarkers(mi, dim);
}
void InsetMathMakebox::draw(PainterInfo & pi, int x, int y) const
{
drawMarkers(pi, x, y);
Changer dummy = pi.base.changeFontSet("textnormal");
BufferView const & bv = *pi.base.bv;
int w = mathed_char_width(pi.base.font, '[');
if (framebox_) {
Dimension const dim = dimension(*pi.base.bv);
pi.pain.rectangle(x + 1, y - dim.ascent() + 1,
dim.width() - 2, dim.height() - 2, Color_foreground);
x += 2;
}
drawStrBlack(pi, x, y, from_ascii("["));
x += w;
cell(0).draw(pi, x, y);
@ -359,7 +356,10 @@ InsetMathBoxed::InsetMathBoxed(Buffer * buf)
void InsetMathBoxed::metrics(MetricsInfo & mi, Dimension & dim) const
{
cell(0).metrics(mi, dim);
metricsMarkers2(mi, dim, 3); // 1 pixel space, 1 frame, 1 space
// 1 pixel space, 1 frame, 1 space
dim.wid += 2 * 3;
dim.asc += 3;
dim.des += 3;
}

View File

@ -58,6 +58,8 @@ public:
///
mode_type currentMode() const { return TEXT_MODE; }
///
marker_type marker() const { return NO_MARKER; }
///
void metrics(MetricsInfo & mi, Dimension & dim) const;
///
void draw(PainterInfo & pi, int x, int y) const;
@ -116,6 +118,8 @@ public:
///
InsetMathBoxed(Buffer * buf);
///
marker_type marker() const { return NO_MARKER; }
///
void validate(LaTeXFeatures & features) const;
///
void metrics(MetricsInfo & mi, Dimension & dim) const;

View File

@ -55,7 +55,6 @@ void InsetMathBrace::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc = max(dim0.asc, t.asc);
dim.des = max(dim0.des, t.des);
dim.wid = dim0.width() + 2 * t.wid;
metricsMarkers(mi, dim);
}
@ -70,7 +69,6 @@ void InsetMathBrace::draw(PainterInfo & pi, int x, int y) const
cell(0).draw(pi, x + t.wid, y);
Dimension const & dim0 = cell(0).dimension(*pi.base.bv);
pi.pain.text(x + t.wid + dim0.width(), y, '}', font);
drawMarkers(pi, x, y);
}

View File

@ -39,7 +39,6 @@ void InsetMathCancel::metrics(MetricsInfo & mi, Dimension & dim) const
{
Changer dummy = mi.base.changeEnsureMath();
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
@ -48,7 +47,7 @@ void InsetMathCancel::draw(PainterInfo & pi, int x, int y) const
Changer dummy = pi.base.changeEnsureMath();
// We first draw the text and then an arrow
ColorCode const origcol = pi.base.font.color();
cell(0).draw(pi, x + 1, y);
cell(0).draw(pi, x, y);
Dimension const dim = dimension(*pi.base.bv);
int const t = pi.base.solidLineThickness();
@ -75,8 +74,6 @@ void InsetMathCancel::draw(PainterInfo & pi, int x, int y) const
pi.pain.line(x2, y1, x1, y2, origcol, pi.pain.line_solid, t);
pi.pain.line(x2, y2, x1, y1, origcol, pi.pain.line_solid, t);
}
drawMarkers(pi, x, y);
}

View File

@ -48,7 +48,6 @@ void InsetMathCancelto::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc = max(dim0.ascent() + 2, dim0.ascent() + dim1.ascent()) + 2 + 8;
dim.des = max(dim0.descent() - 2, dim1.descent()) + 2;
dim.wid = dim0.width() + dim1.width() + 10;
metricsMarkers(mi, dim);
}
@ -59,11 +58,11 @@ void InsetMathCancelto::draw(PainterInfo & pi, int x, int y) const
// We first draw the text and then an arrow
Dimension const & dim0 = cell(0).dimension(*pi.base.bv);
cell(0).draw(pi, x + 1, y);
cell(1).draw(pi, x + dim0.wid + 2 + 8, y - dim0.asc - 8);
cell(0).draw(pi, x, y);
cell(1).draw(pi, x + dim0.wid + 1 + 8, y - dim0.asc - 8);
//Dimension const dim = dimension(*pi.base.bv);
// y3____ ___
// /|
// y2_ / |
@ -86,8 +85,6 @@ void InsetMathCancelto::draw(PainterInfo & pi, int x, int y) const
// the arrow bars
pi.pain.line(x3, y3, x2 + 2, y3, origcol);
pi.pain.line(x3, y3, x3 - 2, y2 - 2, origcol);
drawMarkers(pi, x, y);
}

View File

@ -31,14 +31,12 @@ Inset * InsetMathClass::clone() const
void InsetMathClass::metrics(MetricsInfo & mi, Dimension & dim) const
{
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
void InsetMathClass::draw(PainterInfo & pi, int x, int y) const
{
cell(0).draw(pi, x + 1, y);
drawMarkers(pi, x, y);
cell(0).draw(pi, x, y);
}

View File

@ -49,7 +49,6 @@ Inset * InsetMathColor::clone() const
void InsetMathColor::metrics(MetricsInfo & mi, Dimension & dim) const
{
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
@ -57,9 +56,8 @@ void InsetMathColor::draw(PainterInfo & pi, int x, int y) const
{
ColorCode origcol = pi.base.font.color();
pi.base.font.setColor(lcolor.getFromLaTeXName(to_utf8(color_)));
cell(0).draw(pi, x + 1, y);
cell(0).draw(pi, x, y);
pi.base.font.setColor(origcol);
drawMarkers(pi, x, y);
}

View File

@ -50,14 +50,12 @@ Inset * InsetMathComment::clone() const
void InsetMathComment::metrics(MetricsInfo & mi, Dimension & dim) const
{
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
void InsetMathComment::draw(PainterInfo & pi, int x, int y) const
{
cell(0).draw(pi, x + 1, y);
drawMarkers(pi, x, y);
cell(0).draw(pi, x, y);
}

View File

@ -119,8 +119,6 @@ void InsetMathDecoration::metrics(MetricsInfo & mi, Dimension & dim) const
dy_ = dim.des + 1;
dim.des += dh_ + 2;
}
metricsMarkers(mi, dim);
}
@ -128,14 +126,13 @@ void InsetMathDecoration::draw(PainterInfo & pi, int x, int y) const
{
Changer dummy = pi.base.changeEnsureMath(currentMode());
cell(0).draw(pi, x + 1, y);
cell(0).draw(pi, x, y);
Dimension const & dim0 = cell(0).dimension(*pi.base.bv);
if (wide())
mathed_draw_deco(pi, x + 1, y + dy_, dim0.wid, dh_, key_->name);
else
mathed_draw_deco(pi, x + 1 + (dim0.wid - dw_) / 2,
y + dy_, dw_, dh_, key_->name);
drawMarkers(pi, x, y);
}

View File

@ -40,7 +40,6 @@ void InsetMathEnsureMath::metrics(MetricsInfo & mi, Dimension & dim) const
{
Changer dummy = mi.base.changeEnsureMath();
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
@ -48,7 +47,6 @@ void InsetMathEnsureMath::draw(PainterInfo & pi, int x, int y) const
{
Changer dummy = pi.base.changeEnsureMath();
cell(0).draw(pi, x, y);
drawMarkers(pi, x, y);
}

View File

@ -42,15 +42,13 @@ void InsetMathEnv::metrics(MetricsInfo & mi, Dimension & dim) const
{
Changer dummy = mi.base.changeEnsureMath();
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
void InsetMathEnv::draw(PainterInfo & pi, int x, int y) const
{
Changer dummy = pi.base.changeEnsureMath();
cell(0).draw(pi, x + 1, y);
drawMarkers(pi, x, y);
cell(0).draw(pi, x, y);
}

View File

@ -86,15 +86,13 @@ void InsetMathFont::metrics(MetricsInfo & mi, Dimension & dim) const
{
Changer dummy = mi.base.changeFontSet(font());
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
void InsetMathFont::draw(PainterInfo & pi, int x, int y) const
{
Changer dummy = pi.base.changeFontSet(font());
cell(0).draw(pi, x + 1, y);
drawMarkers(pi, x, y);
cell(0).draw(pi, x, y);
}

View File

@ -62,7 +62,6 @@ void InsetMathFontOld::metrics(MetricsInfo & mi, Dimension & dim) const
Changer dummy = really_change_font ? mi.base.changeFontSet(fontname)
: Changer();
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
@ -79,8 +78,7 @@ void InsetMathFontOld::draw(PainterInfo & pi, int x, int y) const
Changer dummy = really_change_font ? pi.base.changeFontSet(fontname)
: Changer();
cell(0).draw(pi, x + 1, y);
drawMarkers(pi, x, y);
cell(0).draw(pi, x, y);
}

View File

@ -261,7 +261,6 @@ void InsetMathFrac::metrics(MetricsInfo & mi, Dimension & dim) const
dim.des = max(0, dim1.height() + dy/2 - dy + t);
}
} //switch (kind_)
metricsMarkers(mi, dim);
}
@ -278,12 +277,12 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const
// is there an extra cell holding the value being given a dimension?
// (this is \unittwo)
if (nargs() == 2) {
cell(0).draw(pi, x + 1, y);
cell(0).draw(pi, x, y);
xx += dim0.wid + 4;
unit_cell = 1;
}
Changer dummy = pi.base.font.changeShape(UP_SHAPE);
cell(unit_cell).draw(pi, xx + 1, y);
cell(unit_cell).draw(pi, xx, y);
}
break;
@ -295,24 +294,24 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const
// is there an extra cell holding the value being given a dimension?
// (this is \unitfracthree)
if (kind_ == UNITFRAC && nargs() == 3) {
cell(2).draw(pi, x + 1, y);
cell(2).draw(pi, x, y);
xx += cell(2).dimension(*pi.base.bv).wid + 4;
}
Changer dummy = (kind_ == UNITFRAC) ? pi.base.font.changeShape(UP_SHAPE)
: Changer();
// nice fraction
Changer dummy2 = pi.base.changeScript();
cell(0).draw(pi, xx + 2, y - dy);
cell(0).draw(pi, xx, y - dy);
// reference LaTeX code from nicefrac.sty:
// \mkern-2mu/\mkern-1mu
if (latexkeys const * slash = slash_symbol()) {
int mkern = mathed_mu(pi.base.font, 2.0);
mathedSymbolDraw(pi, xx + 2 + dim0.wid - mkern, y, slash);
mathedSymbolDraw(pi, xx + 1 + dim0.wid - mkern, y, slash);
Dimension dimslash;
mathedSymbolDim(pi.base, dimslash, slash);
xx += dimslash.wid - mathed_mu(pi.base.font, 3.0);
}
cell(1).draw(pi, xx + 2 + dim0.wid, y);
cell(1).draw(pi, xx + 1 + dim0.wid, y);
}
break;
@ -339,7 +338,7 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const
int const m = x + dim.wid / 2;
int const xx =
// align left
(kind_ == CFRACLEFT) ? x + 2 :
(kind_ == CFRACLEFT) ? x + 1 :
// align right
(kind_ == CFRACRIGHT) ? x + dim.wid - dim0.wid - 2 :
// center
@ -355,11 +354,10 @@ void InsetMathFrac::draw(PainterInfo & pi, int x, int y) const
cell(1).draw(pi, m - dim1.wid / 2, y + dim1.asc + dy/2 - dy + t);
// horizontal line
if (kind_ != ATOP)
pi.pain.line(x + 1, y - dy, x + dim.wid - 2, y - dy,
pi.pain.line(x, y - dy, x + dim.wid - 2, y - dy,
pi.base.font.color(), pi.pain.line_solid, t);
}
} //switch (kind_)
drawMarkers(pi, x, y);
}
@ -660,7 +658,6 @@ void InsetMathBinom::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc = dim0.height() + 1 + dy/2 + dy;
dim.des = max(0, dim1.height() + 1 + dy/2 - dy);
dim.wid = max(dim0.wid, dim1.wid) + 2 * dw(dim.height()) + 4;
metricsMarkers2(mi, dim);
}
@ -693,7 +690,6 @@ void InsetMathBinom::draw(PainterInfo & pi, int x, int y) const
dim.height(), bra);
mathed_draw_deco(pi, x + dim.width() - dw(dim.height()),
y - dim.ascent(), dw(dim.height()), dim.height(), ket);
drawMarkers2(pi, x, y);
}

View File

@ -125,12 +125,11 @@ public:
/// Generalized fractions are of inner class (see The TeXbook, p.292)
MathClass mathClass() const { return MC_INNER; }
///
marker_type marker() const { return MARKER2; }
///
void metrics(MetricsInfo & mi, Dimension & dim) const;
///
void draw(PainterInfo &, int x, int y) const;
/// draw decorations.
void drawDecoration(PainterInfo & pi, int x, int y) const
{ drawMarkers2(pi, x, y); }
///
bool extraBraces() const;
///

View File

@ -588,7 +588,6 @@ void InsetMathGrid::metrics(MetricsInfo & mi, Dimension & dim) const
}
*/
dim.wid += leftMargin() + rightMargin();
metricsMarkers2(mi, dim);
}
@ -653,8 +652,6 @@ void InsetMathGrid::draw(PainterInfo & pi, int x, int y) const
pi.pain.line(xx1, yy, xx2, yy, Color_foreground);
}
}
drawMarkers2(pi, x, y);
}

View File

@ -103,9 +103,6 @@ public:
void metrics(MetricsInfo & mi, Dimension &) const;
///
void draw(PainterInfo & pi, int x, int y) const;
/// draw decorations.
void drawDecoration(PainterInfo & pi, int x, int y) const
{ drawMarkers2(pi, x, y); }
///
void metricsT(TextMetricsInfo const & mi, Dimension & dim) const;
///
@ -248,9 +245,9 @@ protected:
/// Width of cell, taking combined columns into account
int cellWidth(idx_type idx) const;
///
virtual int leftMargin() const { return 1; }
virtual int leftMargin() const { return 0; }
///
virtual int rightMargin() const { return 1; }
virtual int rightMargin() const { return 0; }
/// returns proper 'end of line' code for LaTeX
virtual docstring eolString(row_type row, bool fragile, bool latex,

View File

@ -567,8 +567,9 @@ void InsetMathHull::metrics(MetricsInfo & mi, Dimension & dim) const
dim.wid += 30 + l;
}
if (type_ == hullRegexp)
dim.wid += 2;
// reserve some space for marker.
dim.wid += 2;
// make it at least as high as the current font
int asc = 0;
int des = 0;
@ -644,6 +645,7 @@ void InsetMathHull::draw(PainterInfo & pi, int x, int y) const
: LM_ST_TEXT);
InsetMathGrid::draw(pi, x + 1, y);
drawMarkers2(pi, x, y);
if (numberedType()) {
int const xx = x + colinfo_.back().offset_ + colinfo_.back().width_ + 20;

View File

@ -34,14 +34,12 @@ void InsetMathLefteqn::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc += 2;
dim.des += 2;
dim.wid = 4;
metricsMarkers(mi, dim);
}
void InsetMathLefteqn::draw(PainterInfo & pi, int x, int y) const
{
cell(0).draw(pi, x + 2, y);
drawMarkers(pi, x, y);
cell(0).draw(pi, x + 1, y);
}

View File

@ -48,9 +48,6 @@ public:
void draw(PainterInfo & pi, int x, int y) const;
/// draw selection background
void drawSelection(PainterInfo & pi, int x, int y) const;
/// draw decorations.
void drawDecoration(PainterInfo & pi, int x, int y) const
{ drawMarkers(pi, x, y); }
///
void updateBuffer(ParIterator const &, UpdateType);
/// identifies NestInsets

View File

@ -40,7 +40,6 @@ void InsetMathOverset::metrics(MetricsInfo & mi, Dimension & dim) const
dim.wid = max(dim0.width(), dim1.wid) + 4;
dim.asc = dim1.asc + dim0.height() + 4;
dim.des = dim1.des;
metricsMarkers(mi, dim);
}
@ -55,7 +54,6 @@ void InsetMathOverset::draw(PainterInfo & pi, int x, int y) const
cell(1).draw(pi, m - dim1.wid / 2, y);
Changer dummy = pi.base.changeFrac();
cell(0).draw(pi, m - dim0.width() / 2, yo);
drawMarkers(pi, x, y);
}

View File

@ -40,7 +40,6 @@ void InsetMathPhantom::metrics(MetricsInfo & mi, Dimension & dim) const
{
Changer dummy = mi.base.changeEnsureMath();
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
@ -53,7 +52,7 @@ void InsetMathPhantom::draw(PainterInfo & pi, int x, int y) const
ColorCode const origcol = pi.base.font.color();
if (visibleContents())
pi.base.font.setColor(Color_special);
cell(0).draw(pi, x + 1, y);
cell(0).draw(pi, x, y);
if (visibleContents())
pi.base.font.setColor(origcol);
Dimension const dim = dimension(*pi.base.bv);
@ -247,8 +246,6 @@ void InsetMathPhantom::draw(PainterInfo & pi, int x, int y) const
else
pi.pain.line(x2, y1, x2, y5, Color_added_space);
}
drawMarkers(pi, x, y);
}

View File

@ -48,7 +48,6 @@ void InsetMathRoot::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc = max(dim0.ascent() + 5, dim1.ascent()) + 2;
dim.des = max(dim0.descent() - 5, dim1.descent()) + 2;
dim.wid = dim0.width() + dim1.width() + 10;
metricsMarkers(mi, dim);
}
@ -73,7 +72,6 @@ void InsetMathRoot::draw(PainterInfo & pi, int x, int y) const
xp[2] = x + w - 2; yp[2] = y + (d - a)/2 + 2;
xp[3] = x + w - 5; yp[3] = y + (d - a)/2 + 4;
pi.pain.lines(xp, yp, 4, pi.base.font.color());
drawMarkers(pi, x, y);
}

View File

@ -337,7 +337,6 @@ void InsetMathScript::metrics(MetricsInfo & mi, Dimension & dim) const
dim.des = max(nd, des);
} else
dim.des = nd;
metricsMarkers(mi, dim);
}
@ -357,7 +356,6 @@ void InsetMathScript::draw(PainterInfo & pi, int x, int y) const
up().draw(pi, x + dx1(bv), y - dy1(bv));
if (hasDown())
down().draw(pi, x + dx0(bv), y + dy0(bv));
drawMarkers(pi, x, y);
}

View File

@ -222,7 +222,6 @@ void InsetMathSideset::metrics(MetricsInfo & mi, Dimension & dim) const
int nd = ndes(bv);
int des = dyb(bv) + max(dimbl.descent(), dimbr.descent());
dim.des = max(nd, des);
metricsMarkers(mi, dim);
}
@ -244,7 +243,6 @@ void InsetMathSideset::draw(PainterInfo & pi, int x, int y) const
br().draw(pi, x + dxr(bv), y + dyb(bv));
tr().draw(pi, x + dxr(bv), y - dyt(bv));
}
drawMarkers(pi, x, y);
}

View File

@ -47,7 +47,6 @@ void InsetMathSize::metrics(MetricsInfo & mi, Dimension & dim) const
Changer dummy2 = mi.base.changeEnsureMath();
Changer dummy = mi.base.font.changeStyle(style_);
cell(0).metrics(mi, dim);
metricsMarkers(mi, dim);
}
@ -55,8 +54,7 @@ void InsetMathSize::draw(PainterInfo & pi, int x, int y) const
{
Changer dummy2 = pi.base.changeEnsureMath();
Changer dummy = pi.base.font.changeStyle(style_);
cell(0).draw(pi, x + 1, y);
drawMarkers(pi, x, y);
cell(0).draw(pi, x, y);
}

View File

@ -42,26 +42,24 @@ void InsetMathSqrt::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc += 4;
dim.des += 2;
dim.wid += 12;
metricsMarkers(mi, dim);
}
void InsetMathSqrt::draw(PainterInfo & pi, int x, int y) const
{
Changer dummy = pi.base.changeEnsureMath();
cell(0).draw(pi, x + 10, y);
cell(0).draw(pi, x + 9, y);
Dimension const dim = dimension(*pi.base.bv);
int const a = dim.ascent();
int const d = dim.descent();
int xp[3];
int yp[3];
pi.pain.line(x + dim.width(), y - a + 1,
x + 8, y - a + 1, pi.base.font.color());
xp[0] = x + 8; yp[0] = y - a + 1;
xp[1] = x + 5; yp[1] = y + d - 1;
x + 7, y - a + 1, pi.base.font.color());
xp[0] = x + 7; yp[0] = y - a + 1;
xp[1] = x + 4; yp[1] = y + d - 1;
xp[2] = x; yp[2] = y + (d - a)/2;
pi.pain.lines(xp, yp, 3, pi.base.font.color());
drawMarkers(pi, x, y);
}

View File

@ -78,7 +78,6 @@ void InsetMathStackrel::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc = dim1.ascent() + dim0.height() + 4;
dim.des = dim1.descent();
}
metricsMarkers(mi, dim);
}
@ -98,7 +97,6 @@ void InsetMathStackrel::draw(PainterInfo & pi, int x, int y) const
int y2 = y + dim1.descent() + dim2.ascent() + 1;
cell(2).draw(pi, m - dim2.width() / 2, y2);
}
drawMarkers(pi, x, y);
}

View File

@ -41,7 +41,6 @@ void InsetMathUnderset::metrics(MetricsInfo & mi, Dimension & dim) const
dim.wid = max(dim0.width(), dim1.width()) + 4;
dim.asc = dim1.ascent();
dim.des = dim1.descent() + dim0.height() + 4;
metricsMarkers(mi, dim);
}
@ -56,7 +55,6 @@ void InsetMathUnderset::draw(PainterInfo & pi, int x, int y) const
cell(1).draw(pi, m - dim1.width() / 2, y);
Changer dummy = pi.base.changeFrac();
cell(0).draw(pi, m - dim0.width() / 2, yo);
drawMarkers(pi, x, y);
}

View File

@ -52,7 +52,6 @@ void InsetMathXArrow::metrics(MetricsInfo & mi, Dimension & dim) const
dim.wid = max(dim0.width(), dim1.width()) + 10;
dim.asc = dim0.height() + 10;
dim.des = dim1.height();
metricsMarkers(mi, dim);
}
@ -66,8 +65,7 @@ void InsetMathXArrow::draw(PainterInfo & pi, int x, int y) const
cell(0).draw(pi, x + dim.width()/2 - dim0.width()/2, y - 10);
Dimension const & dim1 = cell(1).dimension(*pi.base.bv);
cell(1).draw(pi, x + dim.width()/2 - dim1.width()/2, y + dim1.height());
mathed_draw_deco(pi, x + 1, y - 7, dim.wid - 2, 5, name_);
drawMarkers(pi, x, y);
mathed_draw_deco(pi, x, y - 7, dim.wid, 5, name_);
}

View File

@ -67,6 +67,8 @@ public:
///
MathMacro const * owner() { return mathMacro_; }
///
marker_type marker() const { return NO_MARKER; }
///
InsetCode lyxCode() const { return ARGUMENT_PROXY_CODE; }
/// The math data to use for display
MathData const & displayCell(BufferView const * bv) const
@ -301,15 +303,17 @@ bool MathMacro::addToMathRow(MathRow & mrow, MetricsInfo & mi) const
// This is the same as what is done in metrics().
d->editing_[mi.base.bv] = editMode(mi.base.bv);
/// The macro nesting can change display of insets. Change it locally.
Changer chg = make_change(mi.base.macro_nesting, d->nesting_);
if (displayMode() != MathMacro::DISPLAY_NORMAL
|| d->editing_[mi.base.bv])
return InsetMath::addToMathRow(mrow, mi);
/// The macro nesting can change display of insets. Change it locally.
Changer chg = make_change(mi.base.macro_nesting, d->nesting_);
MathRow::Element e_beg(mi, MathRow::BEG_MACRO);
e_beg.inset = this;
e_beg.macro = this;
e_beg.marker = d->nesting_ == 1 ? marker() : NO_MARKER;
mrow.push_back(e_beg);
d->macro_->lock();
@ -430,6 +434,27 @@ bool MathMacro::editMetrics(BufferView const * bv) const
}
Inset::marker_type MathMacro::marker() const
{
switch (d->displayMode_) {
case DISPLAY_INIT:
case DISPLAY_INTERACTIVE_INIT:
return NO_MARKER;
case DISPLAY_UNFOLDED:
return MARKER;
default:
switch (lyxrc.macro_edit_style) {
case LyXRC::MACRO_EDIT_LIST:
return MARKER2;
case LyXRC::MACRO_EDIT_INLINE_BOX:
return NO_MARKER;
default:
return MARKER;
}
}
}
void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
{
/// The macro nesting can change display of insets. Change it locally.
@ -450,7 +475,6 @@ void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
dim.wid += bsdim.width() + 1;
dim.asc = max(bsdim.ascent(), dim.ascent());
dim.des = max(bsdim.descent(), dim.descent());
metricsMarkers(mi, dim);
} else if (lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_LIST
&& d->editing_[mi.base.bv]) {
// Macro will be edited in a old-style list mode here:
@ -490,7 +514,6 @@ void MathMacro::metrics(MetricsInfo & mi, Dimension & dim) const
dim.asc += 1;
dim.des += 1;
dim.wid += 2;
metricsMarkers2(mi, dim);
} else {
LBUFERR(d->macro_);
@ -641,16 +664,15 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
pi.pain.text(x, y, from_ascii("\\"), pi.base.font);
x += mathed_string_width(pi.base.font, from_ascii("\\")) + 1;
cell(0).draw(pi, x, y);
drawMarkers(pi, expx, expy);
} else if (lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_LIST
&& d->editing_[pi.base.bv]) {
&& d->editing_[pi.base.bv]) {
// Macro will be edited in a old-style list mode here:
CoordCache const & coords = pi.base.bv->coordCache();
FontInfo const & labelFont = sane_font;
// markers and box needs two pixels
x += 2;
// box needs one pixel
x += 1;
// get maximal font height
Dimension fontDim;
@ -674,7 +696,7 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
for (idx_type i = 0; i < nargs(); ++i) {
// position of label
Dimension const & cdim = coords.getArrays().dim(&cell(i));
x = expx + 2;
x = expx + 1;
y += max(fontDim.asc, cdim.asc) + 1;
// draw label
@ -691,9 +713,8 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
y += max(fontDim.des, cdim.des);
}
pi.pain.rectangle(expx + 1, expy - dim.asc + 1, dim.wid - 3,
pi.pain.rectangle(expx, expy - dim.asc + 1, dim.wid - 3,
dim.height() - 2, Color_mathmacroframe);
drawMarkers2(pi, expx, expy);
} else {
bool drawBox = lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_INLINE_BOX;
@ -725,10 +746,6 @@ void MathMacro::draw(PainterInfo & pi, int x, int y) const
dim.height(), Color_mathmacroframe);
} else
d->expanded_.draw(pi, expx, expy);
if (!drawBox)
drawMarkers(pi, x, y);
}
// edit mode changed?

View File

@ -37,6 +37,7 @@ public:
///
virtual MathMacro const * asMacro() const { return this; }
///
marker_type marker() const;
/// If the macro is in normal edit mode, dissolve its contents in
/// the row. Otherwise, just insert the inset.
bool addToMathRow(MathRow &, MetricsInfo & mi) const;
@ -44,9 +45,6 @@ public:
void draw(PainterInfo & pi, int x, int y) const;
/// draw selection background
void drawSelection(PainterInfo & pi, int x, int y) const;
/// draw decorations.
void drawDecoration(PainterInfo & pi, int x, int y) const
{ drawMarkers2(pi, x, y); }
///
void metrics(MetricsInfo & mi, Dimension & dim) const;
/// was the macro in edit mode when computing metrics?

View File

@ -269,14 +269,12 @@ Inset * InsetMathWrapper::clone() const
void InsetMathWrapper::metrics(MetricsInfo & mi, Dimension & dim) const
{
value_->metrics(mi, dim);
//metricsMarkers2(mi, dim);
}
void InsetMathWrapper::draw(PainterInfo & pi, int x, int y) const
{
value_->draw(pi, x, y);
//drawMarkers(pi, x, y);
}

View File

@ -38,7 +38,8 @@ namespace lyx {
MathRow::Element::Element(MetricsInfo const & mi, Type t, MathClass mc)
: type(t), mclass(mc), before(0), after(0), macro_nesting(mi.base.macro_nesting),
inset(0), compl_unique_to(0), macro(0), color(Color_red)
marker(InsetMath::NO_MARKER), inset(0), compl_unique_to(0),
macro(0), color(Color_red)
{}
@ -64,28 +65,40 @@ MathRow::MathRow(MetricsInfo & mi, MathData const * ar)
/* Do spacing only in math mode. This test is a bit clumsy,
* but it is used in other places for guessing the current mode.
*/
if (!isMathFont(mi.base.fontname))
return;
bool const dospacing = isMathFont(mi.base.fontname);
// update classes
for (int i = 1 ; i != static_cast<int>(elements_.size()) - 1 ; ++i) {
if (elements_[i].mclass == MC_UNKNOWN)
continue;
update_class(elements_[i].mclass, elements_[before(i)].mclass,
elements_[after(i)].mclass);
if (dospacing) {
for (int i = 1 ; i != static_cast<int>(elements_.size()) - 1 ; ++i) {
if (elements_[i].mclass != MC_UNKNOWN)
update_class(elements_[i].mclass, elements_[before(i)].mclass,
elements_[after(i)].mclass);
}
}
// set spacing
// We go to the end to handle spacing at the end of equation
for (int i = 1 ; i != static_cast<int>(elements_.size()) ; ++i) {
if (elements_[i].mclass == MC_UNKNOWN)
Element & e = elements_[i];
if (e.mclass == MC_UNKNOWN)
continue;
Element & bef = elements_[before(i)];
int spc = class_spacing(bef.mclass, elements_[i].mclass, mi.base);
bef.after = spc / 2;
// this is better than spc / 2 to avoid rounding problems
elements_[i].before = spc - spc / 2;
if (dospacing) {
int spc = class_spacing(bef.mclass, e.mclass, mi.base);
bef.after += spc / 2;
// this is better than spc / 2 to avoid rounding problems
e.before += spc - spc / 2;
}
// finally reserve space for markers
if (bef.marker != Inset::NO_MARKER)
bef.after = max(bef.after, 1);
if (e.marker != Inset::NO_MARKER)
e.before = max(e.before, 1);
}
// Do not lose spacing allocated to extremities
if (!elements_.empty()) {
elements_[after(0)].before += elements_.front().after;
@ -166,6 +179,18 @@ void MathRow::metrics(MetricsInfo & mi, Dimension & dim) const
break;
}
// handle vertical space for markers
switch(e.marker) {
case InsetMath::NO_MARKER:
break;
case InsetMath::MARKER:
++d.des;
break;
case InsetMath::MARKER2:
++d.asc;
++d.des;
}
if (!d.empty()) {
dim += d;
// Now add the dimension to current macros and arguments.
@ -185,6 +210,43 @@ void MathRow::metrics(MetricsInfo & mi, Dimension & dim) const
}
namespace {
void drawMarkers(PainterInfo const & pi, MathRow::Element const & e, int const x, int const y)
{
if (e.marker == InsetMath::NO_MARKER)
return;
CoordCache const & coords = pi.base.bv->coordCache();
Dimension const dim = coords.getInsets().dim(e.inset);
// the marker is before/after the inset. Normally some space has been reserved already.
int const l = x + e.before - 1;
int const r = x + dim.width() - e.after;
// Duplicated from Inset.cpp and adapted. It is believed that the
// Inset version should die eventually
ColorCode pen_color = e.inset->mouseHovered(pi.base.bv) || e.inset->editing(pi.base.bv)?
Color_mathframe : Color_mathcorners;
int const d = y + dim.descent();
pi.pain.line(l, d - 3, l, d, pen_color);
pi.pain.line(r, d - 3, r, d, pen_color);
pi.pain.line(l, d, l + 3, d, pen_color);
pi.pain.line(r - 3, d, r, d, pen_color);
if (e.marker == InsetMath::MARKER)
return;
int const a = y - dim.ascent();
pi.pain.line(l, a + 3, l, a, pen_color);
pi.pain.line(r, a + 3, r, a, pen_color);
pi.pain.line(l, a, l + 3, a, pen_color);
pi.pain.line(r - 3, a, r, a, pen_color);
}
}
void MathRow::draw(PainterInfo & pi, int x, int const y) const
{
CoordCache & coords = pi.base.bv->coordCache();
@ -202,11 +264,14 @@ void MathRow::draw(PainterInfo & pi, int x, int const y) const
e.inset->draw(pi, x + e.before, y);
coords.insets().add(e.inset, x, y);
coords.insets().add(e.inset, d);
drawMarkers(pi, e, x, y);
x += d.wid;
break;
}
case BEG_MACRO:
coords.insets().add(e.macro, x, y);
drawMarkers(pi, e, x, y);
break;
case BEG_ARG:
coords.arrays().add(e.ar, x, y);

View File

@ -12,6 +12,7 @@
#ifndef MATH_ROW_H
#define MATH_ROW_H
#include "InsetMath.h"
#include "MathClass.h"
#include "ColorCode.h"
@ -69,6 +70,8 @@ public:
int before, after;
/// count wether the current mathdata is nested in macro(s)
int macro_nesting;
/// Marker type
InsetMath::marker_type marker;
/// When type is INSET
/// the math inset