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());
 }
 
 

Reply via email to