On Sat, 24 Sep 2005 08:56:58 +0300 (EEST) Martin Vermeer <[EMAIL PROTECTED]> wrote:
> On Fri, 23 Sep 2005 17:26:48 +0200 Jean-Marc Lasgouttes > <[EMAIL PROTECTED]> wrote: > > > Martin Vermeer wrote: > > > I believe the culprit is > > > > > > if (!singlepar || pit1 == cursor_.pit()) > > > > > > which I added several times to BufferView_pimpl.C:s metrics method. > > It > > > tests for being in the paragraph containing the cursor... but I > > believe > > > cursor_.pit() refers to the paragraph iterator _inside_ the inset, > > when > > > what we need to have here is the paragraph iterator in the > > surrounding > > > text which _contains_ this inset (and the cursor). > > > > > > Anybody know how to do that? cursor_[0].pit() ? > > > > Yes, cursor.pit() is really cursor.top().pit(), so this is the > > most-nested cursor slice. > > > > You can also use cursor.bottom().pit() to get the outermost one. But > > zhy > > is this the one you need? > > Just a hunch ;-) > > No, seriously: the screen redraw routine renders the paragraph(s) the > ViewMetricsInfo that the BufferView_pimpl metrics hands it, as _main > text_ > paragraphs -- recursively descending into any insets it contains. If > handed an > inside-inset pit, it will nevertheless interpret it as a main-text pit, > and > things will go haywire _in case we are in SinglePar mode_. > > BTW am I right in understanding that descending into the cursor stack > means > moving from bottom downward to top (tip?), increasing depth all the > time? How > logical... > > Which do you prefer BTW, .bottom() or [0]? > > - Martin I propose to put the attached summarizing patch in, and test and profile again. - Martin
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 06:10:19 -0000 @@ -666,12 +666,14 @@ 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); + if (flags & Update::FitCursor) { + if (fitCursor()) { + forceupdate = true; + vi = metrics(); + } } if (forceupdate) { // Second drawing step @@ -1327,23 +1329,18 @@ 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_; + if (!singlepar || pit == cursor_[0].pit()) // only rebreak cursor para + text->redoParagraph(pit); + int y0 = text->getPar(pit).ascent() - offset_ref_; // Redo paragraphs above cursor if necessary 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(); } @@ -1364,10 +1361,11 @@ ViewMetricsInfo BufferView::Pimpl::metri // Redo paragraphs below cursor if necessary 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_[0].pit()) + text->redoParagraph(pit2); y2 += text->getPar(pit2).ascent(); } @@ -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(); } + 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); Index: lyxfunc.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/lyxfunc.C,v retrieving revision 1.668 diff -u -p -r1.668 lyxfunc.C --- lyxfunc.C 19 Sep 2005 09:55:49 -0000 1.668 +++ lyxfunc.C 24 Sep 2005 06:10:20 -0000 @@ -1556,8 +1556,6 @@ void LyXFunc::dispatch(FuncRequest const // in (at least partially) visible top-level paragraphs. if (update) view()->update(Update::FitCursor | Update::Force); - else - view()->update(Update::FitCursor); // if we executed a mutating lfun, mark the buffer as dirty // FIXME: Why not use flag.enabled() but call getStatus again? Index: text3.C =================================================================== RCS file: /usr/local/lyx/cvsroot/lyx-devel/src/text3.C,v retrieving revision 1.307 diff -u -p -r1.307 text3.C --- text3.C 16 Sep 2005 10:06:09 -0000 1.307 +++ text3.C 24 Sep 2005 06:10:21 -0000 @@ -348,6 +348,7 @@ void LyXText::dispatch(LCursor & cur, Fu needsUpdate = cursorLeftOneWord(cur); else needsUpdate = cursorRightOneWord(cur); + cur.bv().update(Update::Force | Update::FitCursor); finishChange(cur, false); break; @@ -358,6 +359,7 @@ void LyXText::dispatch(LCursor & cur, Fu needsUpdate = cursorRightOneWord(cur); else needsUpdate = cursorLeftOneWord(cur); + cur.bv().update(Update::Force | Update::FitCursor); finishChange(cur, false); break; @@ -419,7 +421,8 @@ void LyXText::dispatch(LCursor & cur, Fu && cur.boundary() == oldBoundary) { cur.undispatched(); cmd = FuncRequest(LFUN_FINISHED_RIGHT); - } + } else + cur.bv().update(Update::Force | Update::FitCursor); break; case LFUN_LEFT: @@ -435,7 +438,8 @@ void LyXText::dispatch(LCursor & cur, Fu && cur.boundary() == oldBoundary) { cur.undispatched(); cmd = FuncRequest(LFUN_FINISHED_LEFT); - } + } else + cur.bv().update(Update::Force | Update::FitCursor); break; case LFUN_UP: @@ -449,7 +453,8 @@ void LyXText::dispatch(LCursor & cur, Fu && cur.boundary() == oldBoundary) { cur.undispatched(); cmd = FuncRequest(LFUN_FINISHED_UP); - } + } else + cur.bv().update(Update::Force | Update::FitCursor); break; case LFUN_DOWN: @@ -463,13 +468,15 @@ void LyXText::dispatch(LCursor & cur, Fu { cur.undispatched(); cmd = FuncRequest(LFUN_FINISHED_DOWN); - } + } else + cur.bv().update(Update::Force | Update::FitCursor); break; case LFUN_UP_PARAGRAPH: if (!cur.mark()) cur.clearSelection(); needsUpdate = cursorUpParagraph(cur); + cur.bv().update(Update::Force | Update::FitCursor); finishChange(cur, false); break; @@ -484,6 +491,7 @@ void LyXText::dispatch(LCursor & cur, Fu if (!cur.mark()) cur.clearSelection(); needsUpdate = cursorDownParagraph(cur); + cur.bv().update(Update::Force | Update::FitCursor); finishChange(cur, false); break; @@ -562,6 +570,7 @@ void LyXText::dispatch(LCursor & cur, Fu cmd = FuncRequest(LFUN_FINISHED_UP); } else { needsUpdate = cursorPrevious(cur); + cur.bv().update(Update::Force | Update::FitCursor); } break; @@ -576,6 +585,7 @@ void LyXText::dispatch(LCursor & cur, Fu cmd = FuncRequest(LFUN_FINISHED_DOWN); } else { needsUpdate = cursorNext(cur); + cur.bv().update(Update::Force | Update::FitCursor); } break; @@ -1117,6 +1127,9 @@ void LyXText::dispatch(LCursor & cur, Fu current_font.setLanguage(lang); real_current_font.setLanguage(lang); + // Remember the old paragraph metric + Dimension olddim = cur.paragraph().dim(); + string::const_iterator cit = cmd.argument.begin(); string::const_iterator end = cmd.argument.end(); for (; cit != end; ++cit) @@ -1125,11 +1138,13 @@ void LyXText::dispatch(LCursor & cur, Fu cur.resetAnchor(); moveCursor(cur, false); - - needsUpdate = redoParagraph(cur.pit()); + needsUpdate = cur.paragraph().dim().asc != olddim.asc || + cur.paragraph().dim().des != olddim.des; if (!needsUpdate) { // update only this paragraph cur.bv().update(Update::SinglePar | Update::Force); + } else { + cur.bv().update(Update::Force | Update::FitCursor); } bv->updateScrollbar(); 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 24 Sep 2005 06:10:22 -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); }