Andre Poenitz wrote: >> So: either we add an insetdim_ member in InsetCollapsable and store the >> InsetText's dimension there, and we continue to overwrite dim_ (I have a >> patch for this), > > InsetCollapsable's dim should be the dimension of the InsetCollapsable. > It could be created by calling InsetText::metrics first and augmenting > it afterwards. If the dim of the InsetText is really needed (why? > There's a cache in LyXText, too...) it should be cached in some separate > variable.
That's what I meant with the paragraph above. > The alternative is the owner_ stuff. The solution now is certainly the > smaller pile of .... Ok. What about the following patch? I took the liberty of cleaning a bit the drawing part (solving effectively a couple of off-by one problems we had for some time now). I... uh... had to remove some parts which I didn't understand, like some astronomical computations using TEXT_TO_INSET_OFFSET/2 and some +1 -2 +3 little games. With the patch we add 1*TTIO on all four sides of the inset, and the responsability to handle it is shifted to insetcollapsable. (I don't think that the insettext on tables need it for instance). Would that be ok? Alfredo
? ChangeLog-old ? PosIterator.C-save ? PosIterator.h-save ? bfri.C ? safe ? textcursor.C-save ? textcursor.h-save ? insets/insetcollapsable-save.C ? insets/insettext-save.C ? insets/safe ? mathed/safe Index: insets/insetcollapsable.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetcollapsable.C,v retrieving revision 1.248 diff -u -p -d -b -u -r1.248 insetcollapsable.C --- insets/insetcollapsable.C 25 Mar 2004 09:16:27 -0000 1.248 +++ insets/insetcollapsable.C 26 Mar 2004 19:27:22 -0000 @@ -119,24 +119,28 @@ void InsetCollapsable::dimension_collaps 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(Pa 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 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); } Index: insets/insetcollapsable.h =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insetcollapsable.h,v retrieving revision 1.172 diff -u -p -d -b -u -r1.172 insetcollapsable.h --- insets/insetcollapsable.h 25 Mar 2004 09:16:28 -0000 1.172 +++ insets/insetcollapsable.h 26 Mar 2004 19:27:22 -0000 @@ -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 Index: insets/insettext.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/insets/insettext.C,v retrieving revision 1.586 diff -u -p -d -b -u -r1.586 insettext.C --- insets/insettext.C 25 Mar 2004 09:16:29 -0000 1.586 +++ insets/insettext.C 26 Mar 2004 19:27:23 -0000 @@ -174,12 +174,7 @@ void InsetText::metrics(MetricsInfo & mi { //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, i // 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(PainterInf 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()); } @@ -474,24 +474,6 @@ void InsetText::removeNewlines() for (int i = 0; i < it->size(); ++i) if (it->isNewline(i)) it->erase(i); -} - - -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()); }