On Sat, 24 Sep 2005 10:34:25 +0100 Angus Leeming <[EMAIL PROTECTED]> wrote:

> Martin Vermeer wrote:
> > I propose to put the attached summarizing patch in, and test and
> profile
> > again.
> 
> My comments are those of someone who is entirely ignorant of this part
> of
> the code, so please take them with a pinch of salt. Well meaning
> interference :)
> 
> Angus
 
Taken in that spirit ;-)

 
> Why the two if statements rather than && ?
> Index: BufferView_pimpl.C
> -               if ((flags & Update::FitCursor) && fitCursor()) {
> -                       forceupdate = true;
> -                       vi = metrics(flags & Update::SinglePar);
> +               if (flags & Update::FitCursor) {
> +                       if (fitCursor()) {
> +                               forceupdate = true;
> +                               vi = metrics();
> +                       }

No reason. Result of experimentation that led nowhere.
 

> I think you should comment the code more so that your learning curve
> doesn't have to be repeated. How about:

Yes... right. More people should do that ;-)

...
 
> Why does this need to be inside the loop? Looks to me like "y1" and
> "y2"
> are overwritten on each iteration of the loop and that "y" and "pit"
> are
> available immediately afterwards.
> @@ -1379,13 +1377,27 @@ 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_[0].pit()) {
> +                       // collect cursor paragraph y's
> +                       y1 = y - text->getPar(pit).ascent();
> +                       y2 = y + text->getPar(pit).descent();
> +               }
>                 y += text->getPar(pit).descent();
>         }
> I *think* that the above becomes,
>         lyx::pit_type prevpit = boost::prior(pit);
>         if (singlepar && prevpit == cursor_[0].pit()) {
>                 y1 = y - text->getPar(prevpit).descent();
>                 y2 = y;
>         }

No... look again. I added a clarifying comment.

1) You should separately look at singlepar == true and == false, and 
2) the y1, y2 assignments happen only if singlepar == true, and only
   for *one* value of pit.

I improved the BufferView_pimpl.C part of the patch as follows:


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  24 Sep 2005 13:01:39 -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_[0].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_[0].pit();
+               pit2 = cursor_[0].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);


- Martin
 

Reply via email to