///
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;
}
+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
{
/// 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;
/// 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 {..}
Changer dummy = mi.base.changeEnsureMath();
//Changer dummy = mi.base.changeFontSet("mathbf");
cell(0).metrics(mi, dim);
- metricsMarkers(mi, dim);
++dim.wid; // for 'double stroke'
}
{
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);
}
{
Changer dummy = mi.base.changeFontSet("textnormal");
cell(0).metrics(mi, dim);
- metricsMarkers(mi, dim);
}
{
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_);
}
{
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;
}
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;
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);
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;
}
///
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;
///
InsetMathBoxed(Buffer * buf);
///
+ marker_type marker() const { return NO_MARKER; }
+ ///
void validate(LaTeXFeatures & features) const;
///
void 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);
}
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);
}
{
Changer dummy = mi.base.changeEnsureMath();
cell(0).metrics(mi, dim);
- metricsMarkers(mi, dim);
}
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();
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);
}
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);
}
// 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_ / |
// 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);
}
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);
}
void InsetMathColor::metrics(MetricsInfo & mi, Dimension & dim) const
{
cell(0).metrics(mi, dim);
- metricsMarkers(mi, dim);
}
{
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);
}
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);
}
dy_ = dim.des + 1;
dim.des += dh_ + 2;
}
-
- metricsMarkers(mi, dim);
}
{
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);
}
{
Changer dummy = mi.base.changeEnsureMath();
cell(0).metrics(mi, dim);
- metricsMarkers(mi, dim);
}
{
Changer dummy = pi.base.changeEnsureMath();
cell(0).draw(pi, x, y);
- drawMarkers(pi, x, y);
}
{
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);
}
{
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);
}
Changer dummy = really_change_font ? mi.base.changeFontSet(fontname)
: Changer();
cell(0).metrics(mi, dim);
- metricsMarkers(mi, dim);
}
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);
}
dim.des = max(0, dim1.height() + dy/2 - dy + t);
}
} //switch (kind_)
- metricsMarkers(mi, dim);
}
// 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;
// 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;
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
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);
}
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);
}
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);
}
/// 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;
///
}
*/
dim.wid += leftMargin() + rightMargin();
- metricsMarkers2(mi, dim);
}
pi.pain.line(xx1, yy, xx2, yy, Color_foreground);
}
}
-
- drawMarkers2(pi, x, y);
}
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;
///
/// 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,
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;
: 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;
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);
}
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
dim.wid = max(dim0.width(), dim1.wid) + 4;
dim.asc = dim1.asc + dim0.height() + 4;
dim.des = dim1.des;
- metricsMarkers(mi, dim);
}
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);
}
{
Changer dummy = mi.base.changeEnsureMath();
cell(0).metrics(mi, dim);
- metricsMarkers(mi, dim);
}
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);
else
pi.pain.line(x2, y1, x2, y5, Color_added_space);
}
-
- drawMarkers(pi, x, y);
}
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);
}
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);
}
dim.des = max(nd, des);
} else
dim.des = nd;
- metricsMarkers(mi, dim);
}
up().draw(pi, x + dx1(bv), y - dy1(bv));
if (hasDown())
down().draw(pi, x + dx0(bv), y + dy0(bv));
- drawMarkers(pi, x, y);
}
int nd = ndes(bv);
int des = dyb(bv) + max(dimbl.descent(), dimbr.descent());
dim.des = max(nd, des);
- metricsMarkers(mi, dim);
}
br().draw(pi, x + dxr(bv), y + dyb(bv));
tr().draw(pi, x + dxr(bv), y - dyt(bv));
}
- drawMarkers(pi, x, y);
}
Changer dummy2 = mi.base.changeEnsureMath();
Changer dummy = mi.base.font.changeStyle(style_);
cell(0).metrics(mi, dim);
- metricsMarkers(mi, dim);
}
{
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);
}
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);
}
dim.asc = dim1.ascent() + dim0.height() + 4;
dim.des = dim1.descent();
}
- metricsMarkers(mi, dim);
}
int y2 = y + dim1.descent() + dim2.ascent() + 1;
cell(2).draw(pi, m - dim2.width() / 2, y2);
}
- drawMarkers(pi, x, y);
}
dim.wid = max(dim0.width(), dim1.width()) + 4;
dim.asc = dim1.ascent();
dim.des = dim1.descent() + dim0.height() + 4;
- metricsMarkers(mi, dim);
}
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);
}
dim.wid = max(dim0.width(), dim1.width()) + 10;
dim.asc = dim0.height() + 10;
dim.des = dim1.height();
- metricsMarkers(mi, dim);
}
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_);
}
///
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
// 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();
}
+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.
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:
dim.asc += 1;
dim.des += 1;
dim.wid += 2;
- metricsMarkers2(mi, dim);
} else {
LBUFERR(d->macro_);
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;
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
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;
dim.height(), Color_mathmacroframe);
} else
d->expanded_.draw(pi, expx, expy);
-
- if (!drawBox)
- drawMarkers(pi, x, y);
-
}
// edit mode changed?
///
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;
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?
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);
}
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)
{}
/* 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;
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.
}
+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();
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);
#ifndef MATH_ROW_H
#define MATH_ROW_H
+#include "InsetMath.h"
#include "MathClass.h"
#include "ColorCode.h"
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