On Wed, 2005-09-28 at 16:25 +0200, Jean-Marc Lasgouttes wrote:
> >>>>> "Martin" == Martin Vermeer <[EMAIL PROTECTED]> writes:
> 
> Martin> Slowly grasping it... perhaps you'll like the attached more.
> Martin> Note: no change to lyxfunc. Same functionality (I checked)
> 
> This looks much less intrusive indeed. Thanks.
> 
> Could people test this? Bennett, Helge, everyone?
> 
> JMarc

Here's a better one even. Now also delete and backspace are treated in
the same way as selfinsert.

Bennett, does delete feel faster now?

- Martin

Index: ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/ChangeLog,v
retrieving revision 1.2293
diff -u -p -r1.2293 ChangeLog
--- ChangeLog	28 Sep 2005 15:02:45 -0000	1.2293
+++ ChangeLog	29 Sep 2005 09:16:20 -0000
@@ -1,3 +1,15 @@
+2005-09-29  Martin Vermeer  <[EMAIL PROTECTED]>
+
+	* BufferView_pimpl.C (update): choose arguments to update call so
+	that single-par update works most times
+	* text3.C (dispatch): carefully tune updating separately for
+	whole-screen and current-paragraph
+	* rowpainter.C (paintText): 1) replace painting by caching for
+	the two extra paragraphs, because we can;
+	2) suppress greying out of areas below/above drawn area in case of
+	single-par refresh
+	* lyxfunc.C (dispatch): remove superfluous update
+
 2005-09-28  Jürgen Spitzmüller  <[EMAIL PROTECTED]>
 
 	* cursor.C (setSelection): do not open collapsable insets;
Index: BufferView_pimpl.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/BufferView_pimpl.C,v
retrieving revision 1.595
diff -u -p -r1.595 BufferView_pimpl.C
--- BufferView_pimpl.C	15 Sep 2005 13:55:45 -0000	1.595
+++ BufferView_pimpl.C	29 Sep 2005 09:16:21 -0000
@@ -666,12 +666,12 @@ void BufferView::Pimpl::update(Update::f
 		theCoords.startUpdating();
 
 		// First drawing step
-		ViewMetricsInfo vi = metrics();
+		ViewMetricsInfo vi = metrics(flags & Update::SinglePar);
 		bool forceupdate(flags & Update::Force);
 
 		if ((flags & Update::FitCursor) && fitCursor()) {
 			forceupdate = true;
-			vi = metrics(flags & Update::SinglePar);
+			vi = metrics();
 		}
 		if (forceupdate) {
 			// Second drawing step
@@ -1327,23 +1327,22 @@ ViewMetricsInfo BufferView::Pimpl::metri
 	int pit2 = pit;
 	size_t const npit = text->paragraphs().size();
 
-	lyxerr[Debug::DEBUG]
-                << BOOST_CURRENT_FUNCTION
-                << " npit: " << npit
-                << " pit1: " << pit1
-                << " pit2: " << pit2
-                << endl;
-
-	// Rebreak anchor par
-	text->redoParagraph(pit);
-	int y0 = text->getPar(pit1).ascent() - offset_ref_;
+	// Rebreak anchor paragraph. In Single Paragraph mode, rebreak only
+	// the (main text, not inset!) paragraph containing the cursor.
+	// (if this paragraph contains insets etc., rebreaking will 
+	// recursively descend)
+	if (!singlepar || pit == cursor_.bottom().pit())
+		text->redoParagraph(pit);
+	int y0 = text->getPar(pit).ascent() - offset_ref_;
 
-	// Redo paragraphs above cursor if necessary
+	// Redo paragraphs above anchor if necessary; again, in Single Par
+	// mode, only if we encounter the (main text) one having the cursor.
 	int y1 = y0;
-	while (!singlepar && y1 > 0 && pit1 > 0) {
+	while (y1 > 0 && pit1 > 0) {
 		y1 -= text->getPar(pit1).ascent();
 		--pit1;
-		text->redoParagraph(pit1);
+		if (!singlepar || pit1 == cursor_.bottom().pit())
+			text->redoParagraph(pit1);
 		y1 -= text->getPar(pit1).descent();
 	}
 
@@ -1362,12 +1361,14 @@ ViewMetricsInfo BufferView::Pimpl::metri
 		anchor_ref_ = 0;
 	}
 
-	// Redo paragraphs below cursor if necessary
+	// Redo paragraphs below the anchor if necessary. Single par mode:
+	// only the one containing the cursor if encountered.
 	int y2 = y0;
-	while (!singlepar && y2 < bv.workHeight() && pit2 < int(npit) - 1) {
+	while (y2 < bv.workHeight() && pit2 < int(npit) - 1) {
 		y2 += text->getPar(pit2).descent();
 		++pit2;
-		text->redoParagraph(pit2);
+		if (!singlepar || pit2 == cursor_.bottom().pit())
+			text->redoParagraph(pit2);
 		y2 += text->getPar(pit2).ascent();
 	}
 
@@ -1379,13 +1380,28 @@ ViewMetricsInfo BufferView::Pimpl::metri
 	for (lyx::pit_type pit = pit1; pit <= pit2; ++pit) {
 		y += text->getPar(pit).ascent();
 		theCoords.parPos()[text][pit] = Point(0, y);
+		if (singlepar && pit == cursor_.bottom().pit()) {
+			// In Single Paragraph mode, collect here the 
+		    	// y1 and y2 of the (one) paragraph the cursor is in
+			y1 = y - text->getPar(pit).ascent();
+			y2 = y + text->getPar(pit).descent();
+		}
 		y += text->getPar(pit).descent();
 	}
 
+	if (singlepar) { // collect cursor paragraph iter bounds
+		pit1 = cursor_.bottom().pit();
+		pit2 = cursor_.bottom().pit();
+	}
+	
 	lyxerr[Debug::DEBUG]
                 << BOOST_CURRENT_FUNCTION
                 << " y1: " << y1
                 << " y2: " << y2
+                << " pit1: " << pit1
+                << " pit2: " << pit2
+                << " npit: " << npit
+                << " singlepar: " << singlepar
                 << endl;
 
 	return ViewMetricsInfo(pit1, pit2, y1, y2, singlepar);
Index: text3.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text3.C,v
retrieving revision 1.308
diff -u -p -r1.308 text3.C
--- text3.C	27 Sep 2005 08:42:28 -0000	1.308
+++ text3.C	29 Sep 2005 09:16:22 -0000
@@ -296,6 +296,9 @@ void LyXText::dispatch(LCursor & cur, Fu
 	bool sel = cur.selection();
 	bool needsUpdate = !lyxaction.funcHasFlag(cmd.action, LyXAction::NoUpdate);
 
+	// Remember the old paragraph metric
+	Dimension olddim = cur.paragraph().dim();
+
 	switch (cmd.action) {
 
 	case LFUN_APPENDIX: {
@@ -1125,13 +1128,6 @@ void LyXText::dispatch(LCursor & cur, Fu
 
 		cur.resetAnchor();
 		moveCursor(cur, false);
-
-		needsUpdate = redoParagraph(cur.pit());
-		if (!needsUpdate) {
-			// update only this paragraph
-			cur.bv().update(Update::SinglePar | Update::Force);
-		}
-
 		bv->updateScrollbar();
 		break;
 	}
@@ -1528,6 +1524,16 @@ void LyXText::dispatch(LCursor & cur, Fu
 		break;
 	}
 
+	if (cmd.action == LFUN_SELFINSERT || cmd.action == LFUN_DELETE ||
+	    cmd.action == LFUN_BACKSPACE) {
+		// Inserting characters changes par height
+		needsUpdate = cur.paragraph().dim().asc != olddim.asc ||
+			      cur.paragraph().dim().des != olddim.des;
+		if (!needsUpdate) {
+			// if not, update _only_ this paragraph
+			cur.bv().update(Update::SinglePar | Update::Force);
+		}
+	}
 	if (!needsUpdate
 	    && &oldTopSlice.inset() == &cur.inset()
 	    && oldTopSlice.idx() == cur.idx()
Index: rowpainter.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/rowpainter.C,v
retrieving revision 1.157
diff -u -p -r1.157 rowpainter.C
--- rowpainter.C	19 Sep 2005 11:18:20 -0000	1.157
+++ rowpainter.C	29 Sep 2005 09:16:22 -0000
@@ -769,30 +769,30 @@ void paintText(BufferView const & bv, Vi
 		yy += text->getPar(pit).descent();
 	}
 
-
-	// paint one paragraph above and one below
+	// Cache one paragraph above and one below
 	// Note MV: this cannot be suppressed even for singlepar.
 	// Try viewing the User Guide Mobius figure
+
 	if (vi.p1 > 0) {
 		text->redoParagraph(vi.p1 - 1);
-		paintPar(pi, *bv.text(), vi.p1 - 1, 0,
-			 vi.y1 -  text->getPar(vi.p1 - 1).descent());
+		theCoords.parPos()[bv.text()][vi.p1 - 1] = 
+			Point(0, vi.y1 - text->getPar(vi.p1 - 1).descent());
 	}
 
 	if (vi.p2 < lyx::pit_type(text->paragraphs().size()) - 1) {
 		text->redoParagraph(vi.p2 + 1);
-		paintPar(pi, *bv.text(), vi.p2 + 1, 0,
-			 vi.y2 + text->getPar(vi.p2 + 1).ascent());
+		theCoords.parPos()[bv.text()][vi.p2 + 1] = 
+			Point(0, vi.y2 + text->getPar(vi.p2 + 1).ascent());
 	}
 
 	// and grey out above (should not happen later)
 //	lyxerr << "par ascent: " << text->getPar(vi.p1).ascent() << endl;
-	if (vi.y1 > 0)
+	if (vi.y1 > 0 && !vi.singlepar)
 		pain.fillRectangle(0, 0, bv.workWidth(), vi.y1, LColor::bottomarea);
 
 	// and possibly grey out below
 //	lyxerr << "par descent: " << text->getPar(vi.p1).ascent() << endl;
-	if (vi.y2 < bv.workHeight())
+	if (vi.y2 < bv.workHeight() && !vi.singlepar)
 		pain.fillRectangle(0, vi.y2, bv.workWidth(), bv.workHeight() - vi.y2, LColor::bottomarea);
 }
 
Index: frontends/qt2/ChangeLog
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/ChangeLog,v
retrieving revision 1.822
diff -u -p -r1.822 ChangeLog
--- frontends/qt2/ChangeLog	26 Sep 2005 18:42:54 -0000	1.822
+++ frontends/qt2/ChangeLog	29 Sep 2005 09:16:26 -0000
@@ -1,3 +1,8 @@
+2005-09-29  Martin Vermeer  <[EMAIL PROTECTED]>
+
+	* QContentPane.C (QContentPane): make times 50 msec instead of 25,
+	will consume less CPU (Thanks Angus profiling)
+
 2005-09-15  Jürgen Spitzmüller  <[EMAIL PROTECTED]>
 
 	* QTabular.C: disable newpageCB when !longtabular.
Index: frontends/qt2/QContentPane.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/frontends/qt2/QContentPane.C,v
retrieving revision 1.35
diff -u -p -r1.35 QContentPane.C
--- frontends/qt2/QContentPane.C	6 Jun 2005 12:34:28 -0000	1.35
+++ frontends/qt2/QContentPane.C	29 Sep 2005 09:16:26 -0000
@@ -104,7 +104,7 @@ QContentPane::QContentPane(QWorkArea * p
 		this, SLOT(scrollBarChanged(int)));
 
 	// Start the timer, one-shot.
-	step_timer_.start(25, true);
+	step_timer_.start(50, true);
 }
 
 

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to