MetricsInfo::MetricsInfo(BufferView * bv, FontInfo font, int textwidth,
MacroContext const & mc, bool vm, bool tight)
- : base(bv, font, textwidth), macrocontext(mc), vmode(vm), tight_insets(tight)
+ : base(bv, font, textwidth), macrocontext(mc), vmode(vm), tight_insets(tight),
+ extrawidth(0)
{}
par.setBeginOfBody();
Font const bufferfont = buffer.params().getFont();
CoordCache::Insets & insetCache = bv_->coordCache().insets();
+ map <Inset const *, int> extrawidths;
for (auto const & e : par.insetList()) {
// FIXME Doesn't this HAVE to be non-empty?
// position already initialized?
MetricsInfo mi(bv_, font.fontInfo(), w, mc, e.pos == 0, tight_);
mi.base.outer_font = displayFont(pit, e.pos).fontInfo();
e.inset->metrics(mi, dim);
+ /* FIXME: This is a hack. This allows InsetMathHull to state
+ * that it needs some elbow room beyond its width, in order to
+ * fit the numbering and/or the left margin (with left
+ * alignment), which are outside of the inset itself.
+ *
+ * To this end, InsetMathHull::metrics() sets a value in
+ * MetricsInfo::extrawidth and this value is added later to
+ * the width of the row that contains the inset (when this row
+ * is tight or shorter than the max allowed width).
+ *
+ * See ticket #12320 for details.
+ */
+ extrawidths[e.inset] = mi.extrawidth;
+
if (!insetCache.has(e.inset) || insetCache.dim(e.inset) != dim) {
insetCache.add(e.inset, dim);
changed = true;
// Split the row in several rows fitting in available width
pm.rows() = breakParagraph(bigrow);
+ // Add the needed extra width to the rows that contain the insets that request it
+ for (Row & row : pm.rows())
+ for (Row::Element & e : row)
+ if (e.type == Row::INSET && (row.width() < max_width_ || tight_))
+ row.dim().wid += extrawidths[e.inset];
+
/* If there is more than one row, expand the text to the full
* allowable width. This setting here is needed for the
* setRowAlignment() below. We do nothing when tight insets are
if (mi.vmode)
top_display_margin += theFontMetrics(mi.base.font).maxHeight() + 2;
+ int const ind = indent(*mi.base.bv);
+ mi.extrawidth = ind;
+
if (previewState(mi.base.bv)) {
preview_->metrics(mi, dim);
if (previewTooSmall(dim)) {
if (numberedType()) {
BufferParams::MathNumber const math_number = buffer().params().getMathNumber();
int extra_offset = 0;
+ int max_nlwid = 0;
for (row_type row = 0; row < nrows(); ++row) {
rowinfo(row).offset[mi.base.bv] += extra_offset;
docstring const nl = nicelabel(row);
continue;
Dimension dimnl;
mathed_string_dim(mi.base.font, nl, dimnl);
- int const ind = indent(*mi.base.bv);
int const x = ind ? ind : (mi.base.textwidth - dim.wid) / 2;
// for some reason metrics does not trigger at the
// same point as draw, and therefore we use >= instead of >
|| (math_number == BufferParams::RIGHT
&& dimnl.wid >= mi.base.textwidth - x - dim.wid)) {
extra_offset += dimnl.height();
- }
+ } else if (dimnl.wid > max_nlwid)
+ max_nlwid = dimnl.wid;
}
+ mi.extrawidth += max_nlwid;
dim.des += extra_offset;
}