+2004-03-27 Alfredo Braunstein <abraunst@lyx.org>
+
+ * insettext.C (draw): handle the responsability of adding the
+ ouside offset to collapsable. Clean code a bit.
+
+ * insetcollapsable.[Ch] (metrics, draw): handle the derivation
+ from insettext correctly, solve a couple of off-by-one drawing
+ bugs
+
2004-03-25 Angus Leeming <leeming@lyx.org>
* insetcaption.C (draw): squash warning about unused variable.
void InsetCollapsable::metrics(MetricsInfo & mi, Dimension & dim) const
{
+ mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
if (status_ == Inlined) {
InsetText::metrics(mi, dim);
} else {
dimension_collapsed(dim);
if (status_ == Open) {
- Dimension insetdim;
- InsetText::metrics(mi, insetdim);
- openinlined_ = (insetdim.wid + dim.wid <= mi.base.textwidth);
+ InsetText::metrics(mi, textdim_);
+ openinlined_ = (textdim_.wid + dim.wid <= mi.base.textwidth);
if (openinlined_) {
- dim.wid += insetdim.wid;
- dim.des = max(dim.des, insetdim.des);
- dim.asc = max(dim.asc, insetdim.asc);
+ dim.wid += textdim_.wid;
+ dim.des = max(dim.des, textdim_.des);
+ dim.asc = max(dim.asc, textdim_.asc);
} else {
- dim.des += insetdim.height() + TEXT_TO_BOTTOM_OFFSET;
- dim.wid = max(dim.wid, insetdim.wid);
+ dim.des += textdim_.height() + TEXT_TO_BOTTOM_OFFSET;
+ dim.wid = max(dim.wid, textdim_.wid);
}
}
}
+ dim.asc += TEXT_TO_INSET_OFFSET;
+ dim.des += TEXT_TO_INSET_OFFSET;
+ dim.wid += 2 * TEXT_TO_INSET_OFFSET;
+ mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
dim_ = dim;
}
void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
{
- setPosCache(pi, x, y);
+ x += TEXT_TO_INSET_OFFSET;
+ y += TEXT_TO_INSET_OFFSET;
if (status_ == Inlined) {
InsetText::draw(pi, x, y);
button_dim.y1 = y - aa + pi.base.bv->top_y();
button_dim.y2 = y - aa + pi.base.bv->top_y() + dimc.height();
- draw_collapsed(pi, x, y);
+ draw_collapsed(pi, x, y - aa + dimc.asc);
if (status_ == Open) {
- x += scroll();
if (openinlined_)
- InsetText::draw(pi, x + dimc.width(), y - aa + InsetText::ascent());
+ InsetText::draw(pi, x + dimc.width(),
+ y - aa + textdim_.asc);
else
- InsetText::draw(pi, x, y - aa + dimc.height() + InsetText::ascent());
+ InsetText::draw(pi, x, dimc.height()
+ + y - aa + textdim_.asc);
}
}
+ setPosCache(pi, x, y);
}
mutable CollapseStatus status_;
/// a substatus of the Open status, determined automatically in metrics
mutable bool openinlined_;
+ ///
+ mutable Dimension textdim_;
};
#endif
{
//lyxerr << "InsetText::metrics: width: " << mi.base.textwidth << endl;
setViewCache(mi.base.bv);
- mi.base.textwidth -= 2 * TEXT_TO_INSET_OFFSET;
text_.metrics(mi, dim);
- dim.asc += TEXT_TO_INSET_OFFSET;
- dim.des += TEXT_TO_INSET_OFFSET;
- dim.wid += 2 * TEXT_TO_INSET_OFFSET;
- mi.base.textwidth += 2 * TEXT_TO_INSET_OFFSET;
dim_ = dim;
font_ = mi.base.font;
text_.font_ = mi.base.font;
// update our idea of where we are
setPosCache(pi, x, y);
- // repaint the background if needed
- x += TEXT_TO_INSET_OFFSET;
- if (backgroundColor() != LColor::background)
- clearInset(pi.pain, x, y);
-
BufferView * bv = pi.base.bv;
bv->hideCursor();
x += scroll();
- y += bv->top_y() - text_.ascent();
+ y -= text_.ascent();
+
+ // repaint the background if needed
+ if (backgroundColor() != LColor::background)
+ clearInset(pi.pain, x, y);
- text_.draw(pi, x, y);
+ text_.draw(pi, x, y + bv->top_y());
if (drawFrame_ == ALWAYS || drawFrame_ == LOCKED)
- drawFrame(pi.pain, xo_, yo_ - bv->top_y());
+ drawFrame(pi.pain, x, y);
}
void InsetText::drawFrame(Painter & pain, int x, int y) const
{
- int const frame_x = x + TEXT_TO_INSET_OFFSET / 2;
- int const frame_y = y - dim_.asc + TEXT_TO_INSET_OFFSET / 2;
- int const frame_w = text_.width();
- int const frame_h = text_.height();
- pain.rectangle(frame_x, frame_y, frame_w, frame_h, frameColor());
+ int const w = text_.width();
+ int const h = text_.height();
+ pain.rectangle(x, y, w, h, frameColor());
+}
+
+
+void InsetText::clearInset(Painter & pain, int x, int y) const
+{
+ int const w = text_.width();
+ int const h = text_.height();
+ pain.fillRectangle(x, y, w, h, backgroundColor());
}
}
-void InsetText::clearInset(Painter & pain, int x, int y) const
-{
- int w = dim_.wid;
- int h = dim_.asc + dim_.des;
- int ty = y - dim_.asc;
-
- if (ty < 0) {
- h += ty;
- ty = 0;
- }
- if (ty + h > pain.paperHeight())
- h = pain.paperHeight();
- if (xo_ + w > pain.paperWidth())
- w = pain.paperWidth();
- pain.fillRectangle(x + 1, ty + 1, w - 3, h - 1, backgroundColor());
-}
-
-
LyXText * InsetText::getText(int i) const
{
return (i == 0) ? const_cast<LyXText*>(&text_) : 0;