fix collapsables drawing problems

git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8547 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
Alfredo Braunstein 2004-03-27 13:29:17 +00:00
parent 3f70e153ee
commit 728193eacc
4 changed files with 49 additions and 49 deletions

View File

@ -1,3 +1,12 @@
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.

View File

@ -119,24 +119,28 @@ void InsetCollapsable::dimension_collapsed(Dimension & dim) const
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;
}
@ -149,7 +153,8 @@ void InsetCollapsable::draw_collapsed(PainterInfo & pi, int x, int y) const
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);
@ -162,15 +167,17 @@ void InsetCollapsable::draw(PainterInfo & pi, int x, int y) const
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);
}

View File

@ -119,6 +119,8 @@ private:
mutable CollapseStatus status_;
/// a substatus of the Open status, determined automatically in metrics
mutable bool openinlined_;
///
mutable Dimension textdim_;
};
#endif

View File

@ -174,12 +174,7 @@ void InsetText::metrics(MetricsInfo & mi, Dimension & dim) const
{
//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;
@ -192,21 +187,20 @@ void InsetText::draw(PainterInfo & pi, int x, int y) const
// 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();
text_.draw(pi, x, y);
// repaint the background if needed
if (backgroundColor() != LColor::background)
clearInset(pi.pain, 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);
}
@ -218,11 +212,17 @@ void InsetText::drawSelection(PainterInfo & pi, int x, int y) const
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());
}
@ -477,24 +477,6 @@ void InsetText::removeNewlines()
}
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;