On Thu, Sep 29, 2005 at 09:00:47PM +0200, Helge Hafting wrote:
> The patch did not apply well to todays CVS.
> 
> Helge Hafting

OK, here's a fresh patch.

- 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 19:37:44 -0000
@@ -1,3 +1,16 @@
+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
+       * LyXAction.[Ch]: introduce SingleParUpdate
+                               
 2005-09-28  J�rgen Spitzm�ller  <[EMAIL PROTECTED]>
 
        * cursor.C (setSelection): do not open collapsable insets;
Index: LyXAction.C
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/LyXAction.C,v
retrieving revision 1.207
diff -u -p -r1.207 LyXAction.C
--- LyXAction.C 25 Jun 2005 15:57:15 -0000      1.207
+++ LyXAction.C 29 Sep 2005 19:37:44 -0000
@@ -136,9 +136,9 @@ void LyXAction::init()
                { LFUN_COPY, "copy", ReadOnly },
                { LFUN_CUT, "cut", Noop },
                { LFUN_DATE_INSERT, "date-insert", Noop },
-               { LFUN_BACKSPACE, "delete-backward", Noop },
+               { LFUN_BACKSPACE, "delete-backward", SingleParUpdate },
                { LFUN_BACKSPACE_SKIP, "delete-backward-skip", Noop },
-               { LFUN_DELETE, "delete-forward", Noop },
+               { LFUN_DELETE, "delete-forward", SingleParUpdate },
                { LFUN_DELETE_SKIP, "delete-forward-skip", Noop },
                { LFUN_DEPTH_MIN, "depth-decrement", Noop },
                { LFUN_DEPTH_PLUS, "depth-increment", Noop },
@@ -257,7 +257,7 @@ void LyXAction::init()
                { LFUN_PRIOR, "screen-up", ReadOnly | NoUpdate},
                { LFUN_PRIORSEL, "screen-up-select", ReadOnly },
                { LFUN_SCROLL_INSET, "inset-scroll", ReadOnly },
-               { LFUN_SELFINSERT, "self-insert", Noop },
+               { LFUN_SELFINSERT, "self-insert", SingleParUpdate },
                { LFUN_SPACE_INSERT, "space-insert", Noop },
                { LFUN_CHARATCURSOR, "server-char-after", ReadOnly },
                { LFUN_GETFONT, "server-get-font", ReadOnly },
Index: LyXAction.h
===================================================================
RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/LyXAction.h,v
retrieving revision 1.29
diff -u -p -r1.29 LyXAction.h
--- LyXAction.h 8 Feb 2005 02:06:34 -0000       1.29
+++ LyXAction.h 29 Sep 2005 19:37:44 -0000
@@ -51,7 +51,8 @@ public:
                ReadOnly = 1, //< can be used in RO mode (perhaps this should 
change)
                NoBuffer = 2, //< Can be used when there is no document open
                Argument = 4, //< Requires argument
-               NoUpdate = 8 //< Does not (usually) require update
+               NoUpdate = 8, //< Does not (usually) require update
+               SingleParUpdate = 16 //< Usually only requires this par updated
        };
 
        LyXAction();
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 19:37:45 -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 19:37:46 -0000
@@ -294,7 +294,15 @@ void LyXText::dispatch(LCursor & cur, Fu
        CursorSlice oldTopSlice = cur.top();
        bool oldBoundary = cur.boundary();
        bool sel = cur.selection();
-       bool needsUpdate = !lyxaction.funcHasFlag(cmd.action, 
LyXAction::NoUpdate);
+       // Signals that, even if needsUpdate == false, an update of the
+       // cursor paragraph is required
+       bool singleParUpdate = lyxaction.funcHasFlag(cmd.action,
+               LyXAction::SingleParUpdate);
+       // Signals that a full-screen update is required
+       bool needsUpdate = !(lyxaction.funcHasFlag(cmd.action, 
+               LyXAction::NoUpdate) || singleParUpdate);
+       // Remember the old paragraph metric
+       Dimension olddim = cur.paragraph().dim();
 
        switch (cmd.action) {
 
@@ -1125,13 +1133,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 +1529,14 @@ void LyXText::dispatch(LCursor & cur, Fu
                break;
        }
 
+       if (singleParUpdate)
+               // Inserting characters does not change par height
+               if (cur.paragraph().dim().asc == olddim.asc
+                && cur.paragraph().dim().des == olddim.des) {
+                       // if so, update _only_ this paragraph
+                       cur.bv().update(Update::SinglePar | Update::Force);
+               } else
+                       needsUpdate = true;
        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 19:37:46 -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 19:37:49 -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 19:37:49 -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: pgpNBVmBisRvs.pgp
Description: PGP signature

Reply via email to