>>>>> "Jean-Marc" == Jean-Marc Lasgouttes <[EMAIL PROTECTED]> writes:

Jean-Marc> This is because the rowpainter code sets Wide() on these
Jean-Marc> insets, because they are alone on a row. The following
Jean-Marc> patches test additionally that the inset is not the last
Jean-Marc> element of the paragraph. It seems to work for me, but I am
Jean-Marc> not sure it is the right condition to test.

Here is an updated version of these patches. What is new here is

- I decreased the right margin from 30 to 10 (this is independent and
  can go in now, I think).

- openinlined_ can only be set to true when the inset contains only
  one row. This was a cause for some strange behaviors.

What I _really_ wanted to do is to force the text inset width to be
mi.base.textwidth_ when openinlined_ is false (the width is currently
the natural width of the inset, and I do not like that, since it
changes when typing). However, I failed to find how this can be done.
I am sure it is possible (the main text inset enforces its width, for
example). Martin, do you know how to do that?

I'd really appreciate testing of this patches.

JMarc

Index: src/insets/insetcollapsable.C
===================================================================
--- src/insets/insetcollapsable.C	(revision 14252)
+++ src/insets/insetcollapsable.C	(working copy)
@@ -138,7 +138,9 @@ void InsetCollapsable::metrics(MetricsIn
 		dim = dimensionCollapsed();
 		if (status() == Open) {
 			InsetText::metrics(mi, textdim_);
-			openinlined_ = textdim_.wid + 2 * dim.wid <= mi.base.textwidth;
+			bool const hasOneRow = text_.paragraphs().size() == 1
+				&& text_.paragraphs().front().rows().size() == 1;
+			openinlined_ = hasOneRow && textdim_.wid + 2 * dim.wid <= mi.base.textwidth;
 			if (openinlined_) {
 				// Correct for button width, and re-fit
 				mi.base.textwidth -= dim.wid;
Index: src/rowpainter.C
===================================================================
--- src/rowpainter.C	(revision 14252)
+++ src/rowpainter.C	(working copy)
@@ -763,8 +763,9 @@ bool CursorOnRow(PainterInfo & pi, pit_t
 bool innerCursorOnRow(PainterInfo & pi, pit_type pit, 
 	RowList::const_iterator rit, LyXText const & text)
 {
-	// Is there a cursor inside an inset on this row, and is this inset
-	// the only "character" on this row
+	// Is there a cursor inside an inset on this row, and is this
+	// inset the only "character" on this row, but not the last of
+	// the paragraph.
 	LCursor & cur = pi.base.bv->cursor();
 	if (rit->pos() + 1 != rit->endpos())
 		return false;
@@ -772,7 +773,8 @@ bool innerCursorOnRow(PainterInfo & pi, 
 		CursorSlice const & sl = cur[d];
 		if (sl.text() == &text
 		    && sl.pit() == pit 
-		    && sl.pos() == rit->pos())
+		    && sl.pos() == rit->pos()
+		    && sl.pos() < sl.lastpos() - 1)
 			return d < cur.depth() - 1;
 	}
 	return false;
Index: src/rowpainter.h
===================================================================
--- src/rowpainter.h	(revision 14252)
+++ src/rowpainter.h	(working copy)
@@ -35,7 +35,7 @@ inline int nestMargin() { return 15; }
 inline int changebarMargin() { return 10; }
 
 /// right margin
-inline int rightMargin() { return 30; }
+inline int rightMargin() { return 10; }
 
 
 #endif // ROWPAINTER_H
Index: src/insets/insetcollapsable.C
===================================================================
--- src/insets/insetcollapsable.C	(revision 14252)
+++ src/insets/insetcollapsable.C	(working copy)
@@ -138,7 +138,11 @@ void InsetCollapsable::metrics(MetricsIn
 		dim = dimensionCollapsed();
 		if (status() == Open) {
 			InsetText::metrics(mi, textdim_);
-			openinlined_ = textdim_.wid + 2 * dim.wid <= mi.base.textwidth;
+			bool const hasOneRow = text_.paragraphs().size() == 1
+				&& text_.paragraphs().front().rows().size() == 1;
+			openinlined_ = hasOneRow 
+				&& textdim_.wid + 2 * dim.wid <= mi.base.textwidth;
+
 			if (openinlined_) {
 				// Correct for button width, and re-fit
 				mi.base.textwidth -= dim.wid;
Index: src/rowpainter.C
===================================================================
--- src/rowpainter.C	(revision 14252)
+++ src/rowpainter.C	(working copy)
@@ -766,8 +766,9 @@ bool CursorOnRow(PainterInfo & pi, pit_t
 bool innerCursorOnRow(PainterInfo & pi, pit_type pit,
 	RowList::const_iterator rit, LyXText const & text)
 {
-	// Is there a cursor inside an inset on this row, and is this inset
-	// the only "character" on this row
+	// Is there a cursor inside an inset on this row, and is this
+	// inset the only "character" on this row, but not the last of
+	// the paragraph.
 	LCursor & cur = pi.base.bv->cursor();
 	if (rit->pos() + 1 != rit->endpos())
 		return false;
@@ -775,7 +776,8 @@ bool innerCursorOnRow(PainterInfo & pi, 
 		CursorSlice const & sl = cur[d];
 		if (sl.text() == &text
 		    && sl.pit() == pit
-		    && sl.pos() == rit->pos())
+		    && sl.pos() == rit->pos()
+		    && sl.pos() < sl.lastpos() - 1)
 			return d < cur.depth() - 1;
 	}
 	return false;
Index: src/rowpainter.h
===================================================================
--- src/rowpainter.h	(revision 14252)
+++ src/rowpainter.h	(working copy)
@@ -35,7 +35,7 @@ inline int nestMargin() { return 15; }
 inline int changebarMargin() { return 10; }
 
 /// right margin
-inline int rightMargin() { return 30; }
+inline int rightMargin() { return 10; }
 
 
 #endif // ROWPAINTER_H

Reply via email to