Some clean-up to markers handling code.

Horizontal space is now added for linearized macros too.

Vertical space handling is done in a separate method.

This is in preparation for handling of 'box' macro editing mode in
MathRow.
This commit is contained in:
Jean-Marc Lasgouttes 2017-02-06 14:11:07 +01:00
parent a1a9e4228c
commit e12b27e16b

View File

@ -80,11 +80,8 @@ MathRow::MathRow(MetricsInfo & mi, MathData const * ar)
for (int i = 1 ; i != static_cast<int>(elements_.size()) ; ++i) {
Element & e = elements_[i];
if (e.mclass == MC_UNKNOWN)
continue;
Element & bef = elements_[before(i)];
if (dospacing) {
if (dospacing && e.mclass != MC_UNKNOWN) {
int spc = class_spacing(bef.mclass, e.mclass, mi.base);
bef.after += spc / 2;
// this is better than spc / 2 to avoid rounding problems
@ -94,8 +91,15 @@ MathRow::MathRow(MetricsInfo & mi, MathData const * ar)
// finally reserve space for markers
if (bef.marker != Inset::NO_MARKER)
bef.after = max(bef.after, 1);
if (e.marker != Inset::NO_MARKER)
if (e.mclass != MC_UNKNOWN && e.marker != Inset::NO_MARKER)
e.before = max(e.before, 1);
// for linearized insets (macros...) too
if (e.type == BEGIN && e.marker != Inset::NO_MARKER)
bef.after = max(bef.after, 1);
if (e.type == END && e.marker != Inset::NO_MARKER) {
Element & aft = elements_[after(i)];
aft.before = max(aft.before, 1);
}
}
// Do not lose spacing allocated to extremities
@ -126,6 +130,27 @@ int MathRow::after(int i) const
}
namespace {
void metricsMarkersVertical(MetricsInfo const & , MathRow::Element const & e,
Dimension & dim)
{
// handle vertical space for markers
switch(e.marker) {
case InsetMath::NO_MARKER:
break;
case InsetMath::MARKER:
++dim.des;
break;
case InsetMath::MARKER2:
++dim.asc;
++dim.des;
}
}
}
void MathRow::metrics(MetricsInfo & mi, Dimension & dim) const
{
dim.asc = 0;
@ -149,6 +174,7 @@ void MathRow::metrics(MetricsInfo & mi, Dimension & dim) const
case BEGIN:
if (e.inset) {
dim_insets.push_back(make_pair(e.inset, Dimension()));
dim_insets.back().second.wid += e.before + e.after;
e.inset->beforeMetrics();
}
if (e.ar)
@ -158,7 +184,10 @@ void MathRow::metrics(MetricsInfo & mi, Dimension & dim) const
if (e.inset) {
e.inset->afterMetrics();
LATTEST(dim_insets.back().first == e.inset);
coords.insets().add(e.inset, dim_insets.back().second);
Dimension & idim = dim_insets.back().second;
metricsMarkersVertical(mi, e, idim);
idim.wid += e.before + e.after;
coords.insets().add(e.inset, idim);
dim_insets.pop_back();
}
if (e.ar) {
@ -179,18 +208,6 @@ 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.
@ -274,12 +291,14 @@ void MathRow::draw(PainterInfo & pi, int x, int const y) const
drawMarkers(pi, e, x, y);
e.inset->beforeDraw(pi);
}
x += e.before + e.after;
if (e.ar)
coords.arrays().add(e.ar, x, y);
break;
case END:
if (e.inset)
e.inset->afterDraw(pi);
x += e.before + e.after;
break;
case BOX: {
if (e.color == Color_none)