///
MathMacro const * owner() { return mathMacro_; }
///
- marker_type marker() const { return NO_MARKER; }
+ marker_type marker(BufferView const *) const { return NO_MARKER; }
///
InsetCode lyxCode() const { return ARGUMENT_PROXY_CODE; }
/// The math data to use for display
// - editing with parameter list
// - editing with box around macro
if (displayMode() != MathMacro::DISPLAY_NORMAL
- || (d->editing_[mi.base.bv] && lyxrc.macro_edit_style != LyXRC::MACRO_EDIT_INLINE))
+ || (d->editing_[mi.base.bv] && lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_LIST))
return InsetMath::addToMathRow(mrow, mi);
/// The macro nesting can change display of insets. Change it locally.
MathRow::Element e_beg(mi, MathRow::BEGIN);
e_beg.inset = this;
- e_beg.marker = (d->nesting_ == 1 && nargs()) ? marker() : NO_MARKER;
+ e_beg.marker = (d->nesting_ == 1) ? marker(mi.base.bv) : NO_MARKER;
mrow.push_back(e_beg);
d->macro_->lock();
MathRow::Element e_end(mi, MathRow::END);
e_end.inset = this;
+ e_end.marker = (d->nesting_ == 1) ? marker(mi.base.bv) : NO_MARKER;
mrow.push_back(e_end);
return has_contents;
}
-Inset::marker_type MathMacro::marker() const
+InsetMath::marker_type MathMacro::marker(BufferView const * bv) const
{
+ if (nargs() == 0)
+ return NO_MARKER;
+
switch (d->displayMode_) {
case DISPLAY_INIT:
case DISPLAY_INTERACTIVE_INIT:
return NO_MARKER;
case DISPLAY_UNFOLDED:
return MARKER;
- default:
+ case DISPLAY_NORMAL:
switch (lyxrc.macro_edit_style) {
+ case LyXRC::MACRO_EDIT_INLINE:
+ return MARKER;
+ case LyXRC::MACRO_EDIT_INLINE_BOX:
+ return d->editing_[bv] ? BOX_MARKER : NO_MARKER;
case LyXRC::MACRO_EDIT_LIST:
return MARKER2;
- case LyXRC::MACRO_EDIT_INLINE_BOX:
- return NO_MARKER;
- default:
- return MARKER;
}
}
+ // please gcc 4.6
+ return NO_MARKER;
}
dim.des += 1;
dim.wid += 2;
} else {
- LBUFERR(d->macro_);
-
- // calculate metrics, hoping that all cells are seen
- d->macro_->lock();
- d->expanded_.metrics(mi, dim);
-
- // otherwise do a manual metrics call
- CoordCache & coords = mi.base.bv->coordCache();
- for (idx_type i = 0; i < nargs(); ++i) {
- if (!coords.getArrays().hasDim(&cell(i))) {
- Dimension tdim;
- cell(i).metrics(mi, tdim);
- }
- }
- d->macro_->unlock();
-
- // calculate dimension with label while editing
- if (lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_INLINE_BOX
- && d->editing_[mi.base.bv]) {
- FontInfo font;
- font.setSize(FONT_SIZE_TINY);
- Dimension namedim;
- mathed_string_dim(font, name(), namedim);
-#if 0
- dim.wid += 2 + namedim.wid + 2 + 2;
- dim.asc = max(dim.asc, namedim.asc) + 2;
- dim.des = max(dim.des, namedim.des) + 2;
-#endif
- dim.wid = max(1 + namedim.wid + 1, 2 + dim.wid + 2);
- dim.asc += 1 + namedim.height() + 1;
- dim.des += 2;
- }
+ // We should not be here, since the macro is linearized in this case.
+ LBUFERR(false);
}
}
pi.pain.rectangle(expx, expy - dim.asc + 1, dim.wid - 1,
dim.height() - 2, Color_mathmacroframe);
} else {
- bool drawBox = lyxrc.macro_edit_style == LyXRC::MACRO_EDIT_INLINE_BOX
- && d->editing_[pi.base.bv];
-
- // warm up cells
- for (size_t i = 0; i < nargs(); ++i)
- cell(i).setXY(*pi.base.bv, x, y);
-
- if (drawBox) {
- // draw header and rectangle around
- FontInfo font;
- font.setSize(FONT_SIZE_TINY);
- font.setColor(Color_mathmacrolabel);
- Dimension namedim;
- mathed_string_dim(font, name(), namedim);
-
- pi.pain.fillRectangle(x, y - dim.asc, dim.wid, 1 + namedim.height() + 1, Color_mathmacrobg);
- pi.pain.text(x + 1, y - dim.asc + namedim.asc + 2, name(), font);
- expx += (dim.wid - d->expanded_.dimension(*pi.base.bv).width()) / 2;
- }
-
- beforeDraw(pi);
- d->expanded_.draw(pi, expx, expy);
- afterDraw(pi);
-
- if (drawBox)
- pi.pain.rectangle(x, y - dim.asc, dim.wid,
- dim.height(), Color_mathmacroframe);
+ // We should not be here, since the macro is linearized in this case.
+ LBUFERR(false);
}
// edit mode changed?
{}
+namespace {
+
+// Helper functions for markers
+
+int markerMargin(MathRow::Element const & e)
+{
+ return e.marker == InsetMath::MARKER
+ || e.marker == InsetMath::MARKER2;
+}
+
+
+void afterMetricsMarkers(MetricsInfo const & , MathRow::Element & 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;
+ break;
+ case InsetMath::BOX_MARKER:
+ FontInfo font;
+ font.setSize(FONT_SIZE_TINY);
+ Dimension namedim;
+ mathed_string_dim(font, e.inset->name(), namedim);
+ int const namewid = 1 + namedim.wid + 1;
+
+ if (namewid > dim.wid)
+ e.after += namewid - dim.wid;
+ dim.des += 3 + namedim.height();
+ }
+}
+
+
+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. Necessary space has been reserved already.
+ int const l = x + e.before - markerMargin(e);
+ int const r = x + dim.width() - e.after;
+
+ if (e.marker == InsetMath::BOX_MARKER) {
+ // draw header and rectangle around
+ FontInfo font;
+ font.setSize(FONT_SIZE_TINY);
+ font.setColor(Color_mathmacrolabel);
+ Dimension namedim;
+ mathed_string_dim(font, e.inset->name(), namedim);
+ pi.pain.fillRectangle(l, y + dim.des - namedim.height() - 2,
+ dim.wid, namedim.height() + 2, Color_mathmacrobg);
+ pi.pain.text(l, y + dim.des - namedim.des - 1, e.inset->name(), font);
+ return;
+ }
+
+ // Now markers with corners
+ bool const highlight = e.inset->mouseHovered(pi.base.bv)
+ || e.inset->editing(pi.base.bv);
+ ColorCode const pen_color = highlight ? 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);
+}
+
+}
+
+
MathRow::MathRow(MetricsInfo & mi, MathData const * ar)
{
// First there is a dummy element of type "open"
}
// finally reserve space for markers
- if (bef.marker != Inset::NO_MARKER)
- bef.after = max(bef.after, 1);
- if (e.mclass != MC_UNKNOWN && e.marker != Inset::NO_MARKER)
- e.before = max(e.before, 1);
+ bef.after = max(bef.after, markerMargin(bef));
+ if (e.mclass != MC_UNKNOWN)
+ e.before = max(e.before, markerMargin(e));
// 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) {
+ if (e.type == BEGIN)
+ bef.after = max(bef.after, markerMargin(e));
+ if (e.type == END && e.marker != InsetMath::NO_MARKER) {
Element & aft = elements_[after(i)];
- aft.before = max(aft.before, 1);
+ aft.before = max(aft.before, markerMargin(e));
}
}
}
-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
+void MathRow::metrics(MetricsInfo & mi, Dimension & dim)
{
dim.asc = 0;
dim.wid = 0;
vector<pair<InsetMath const *, Dimension>> dim_insets;
vector<pair<MathData const *, Dimension>> dim_arrays;
CoordCache & coords = mi.base.bv->coordCache();
- for (Element const & e : elements_) {
+ for (Element & e : elements_) {
mi.base.macro_nesting = e.macro_nesting;
Dimension d;
switch (e.type) {
if (e.inset) {
dim_insets.push_back(make_pair(e.inset, Dimension()));
dim_insets.back().second.wid += e.before + e.after;
+ d.wid = e.before + e.after;
e.inset->beforeMetrics();
}
if (e.ar)
if (e.inset) {
e.inset->afterMetrics();
LATTEST(dim_insets.back().first == e.inset);
- Dimension & idim = dim_insets.back().second;
- metricsMarkersVertical(mi, e, idim);
- idim.wid += e.before + e.after;
- coords.insets().add(e.inset, idim);
+ d = dim_insets.back().second;
+ afterMetricsMarkers(mi, e, d);
+ d.wid += e.before + e.after;
+ coords.insets().add(e.inset, d);
dim_insets.pop_back();
+ // We do not want to count the width again, but the
+ // padding and the vertical dimension are meaningful.
+ d.wid = e.before + e.after;
}
if (e.ar) {
LATTEST(dim_arrays.back().first == e.ar);
// allow for one pixel before/after the box.
d.wid += e.before + e.after + 2;
} else {
- // hide the box, but give it some height
+ // hide the box, but keep its height
d.wid = 0;
}
break;
}
-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();