#include "MathSupport.h"
#include "BufferView.h"
+#include "ColorSet.h"
#include "CoordCache.h"
#include "MetricsInfo.h"
int markerMargin(MathRow::Element const & e)
{
- return e.marker == InsetMath::MARKER
- || e.marker == InsetMath::MARKER2;
+ switch(e.marker) {
+ case InsetMath::MARKER:
+ case InsetMath::MARKER2:
+ case InsetMath::BOX_MARKER:
+ return 2;
+ case InsetMath::NO_MARKER:
+ return 0;
+ }
+ // should not happen
+ return 0;
}
if (namewid > dim.wid)
e.after += namewid - dim.wid;
+ ++dim.asc;
dim.des += 3 + namedim.height();
}
}
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 l = x + e.before - (markerMargin(e) > 0 ? 1 : 0);
int const r = x + dim.width() - e.after;
+ // Grey lower box
if (e.marker == InsetMath::BOX_MARKER) {
// draw header and rectangle around
FontInfo font;
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
+ // Color for 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;
+ // If the corners have the same color as the background, do not paint them.
+ if (lcolor.getX11Name(Color_mathbg) == lcolor.getX11Name(pen_color))
+ return;
+ // Lower corners in all cases
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);
+ // Upper corners
+ if (e.marker == InsetMath::BOX_MARKER
+ || e.marker == InsetMath::MARKER2) {
+ 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);
+ }
}
-}
+} // namespace
MathRow::MathRow(MetricsInfo & mi, MathData const * ar)
}
-void MathRow::metrics(MetricsInfo & mi, Dimension & dim)
+bool MathRow::metrics(MetricsInfo & mi, Dimension & dim)
{
- dim.asc = 0;
+ bool has_caret = false;
+
dim.wid = 0;
// In order to compute the dimension of macros and their
// arguments, it is necessary to keep track of them.
d.wid = e.before + e.after;
e.inset->beforeMetrics();
}
- if (e.ar)
+ if (e.ar) {
dim_arrays.push_back(make_pair(e.ar, Dimension()));
+ has_caret |= e.ar->hasCaret(mi.base.bv);
+ }
break;
case END:
if (e.inset) {
dim.wid += mathed_string_width(font, e.compl_text);
}
LATTEST(dim_insets.empty() && dim_arrays.empty());
+ return has_caret;
}
if (!s1.empty()) {
f.setColor(Color_inlinecompletion);
- pi.pain.text(x, y, s1, f);
+ // offset the text by e.after to make sure that the
+ // spacing is after the completion, not before.
+ pi.pain.text(x - e.after, y, s1, f);
x += mathed_string_width(f, s1);
}
if (!s2.empty()) {
f.setColor(Color_nonunique_inlinecompletion);
- pi.pain.text(x, y, s2, f);
+ pi.pain.text(x - e.after, y, s2, f);
x += mathed_string_width(f, s2);
}
}