From 728193eacc71b7c26fab43085e6728e419994215 Mon Sep 17 00:00:00 2001 From: Alfredo Braunstein Date: Sat, 27 Mar 2004 13:29:17 +0000 Subject: [PATCH] fix collapsables drawing problems git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8547 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/insets/ChangeLog | 9 ++++++ src/insets/insetcollapsable.C | 33 ++++++++++++--------- src/insets/insetcollapsable.h | 2 ++ src/insets/insettext.C | 54 ++++++++++++----------------------- 4 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/insets/ChangeLog b/src/insets/ChangeLog index 5a1c607103..136c9003ea 100644 --- a/src/insets/ChangeLog +++ b/src/insets/ChangeLog @@ -1,3 +1,12 @@ +2004-03-27 Alfredo Braunstein + + * 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 * insetcaption.C (draw): squash warning about unused variable. diff --git a/src/insets/insetcollapsable.C b/src/insets/insetcollapsable.C index c9714b04a5..12736bef03 100644 --- a/src/insets/insetcollapsable.C +++ b/src/insets/insetcollapsable.C @@ -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); } diff --git a/src/insets/insetcollapsable.h b/src/insets/insetcollapsable.h index 4b34329e35..ba35c8b29c 100644 --- a/src/insets/insetcollapsable.h +++ b/src/insets/insetcollapsable.h @@ -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 diff --git a/src/insets/insettext.C b/src/insets/insettext.C index 7e88694b8a..a17764b90e 100644 --- a/src/insets/insettext.C +++ b/src/insets/insettext.C @@ -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(&text_) : 0;