From: Alfredo Braunstein Date: Fri, 2 Apr 2004 22:06:21 +0000 (+0000) Subject: fitcursor work X-Git-Tag: 1.6.10~15372 X-Git-Url: https://git.lyx.org/gitweb/?a=commitdiff_plain;h=0d47b55a84b5df680b0c12b43a7b8a9ca09a4d33;p=features.git fitcursor work git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@8591 a592a061-630c-0410-9148-cb99ea01b6c8 --- diff --git a/src/BufferView.C b/src/BufferView.C index e1176d8f32..fff8a99f2b 100644 --- a/src/BufferView.C +++ b/src/BufferView.C @@ -379,23 +379,10 @@ void BufferView::setCursor(ParIterator const & par, lyx::pos_type pos) par[i].inset().edit(cursor(), true); cursor().setCursor(makeDocIterator(par, pos), false); + par[0].text()->redoParagraph(par[0].par()); } -/* -if the fitCursor call refers to some point in never-explored-land, then we -don't have y information in insets there, then we cannot even do an update -to get it (because we need the y infomation for setting top_y first). So -this is solved in putSelectionAt with: - -- setting top_y to the y of the outerPar (that has good info) -- calling update -- calling cursor().updatePos() -- then call fitCursor() - -Ab. -*/ - void BufferView::putSelectionAt(DocIterator const & cur, int length, bool backwards) { @@ -403,15 +390,7 @@ void BufferView::putSelectionAt(DocIterator const & cur, cursor().clearSelection(); - LyXText & text = *cur[0].text(); setCursor(par, cur.pos()); - - // hack for the chicken and egg problem - top_y(text.getPar(par.outerPar()).y); - - update(); - //text.setCursor(cursor(), cur.par(), cur.pos()); - cursor().updatePos(); if (length) { if (backwards) { @@ -424,7 +403,6 @@ void BufferView::putSelectionAt(DocIterator const & cur, } fitCursor(); - update(); } diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index 20fefddfd6..c6fb76957f 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -355,11 +355,14 @@ void BufferView::Pimpl::setBuffer(Buffer * b) lyx::graphics::Previews::get().generateBufferPreviews(*buffer_); } - bool BufferView::Pimpl::fitCursor() { + // this is enough to get the right y cursor info for fitCursor + cursor_.top().text()->redoParagraph(cursor_.top().par()); + if (!screen().fitCursor(bv_)) return false; + updateScrollbar(); return true; } @@ -388,7 +391,6 @@ void BufferView::Pimpl::resizeCurrentBuffer() text->init(bv_); update(); - bv_->cursor().updatePos(); fitCursor(); switchKeyMap(); @@ -892,14 +894,12 @@ bool BufferView::Pimpl::workAreaDispatch(FuncRequest const & cmd0) // If the request was dispatched the temp cursor should have been // in a way to be used as new 'real' cursor. - if (res.dispatched()) + if (res.dispatched()) { bv_->cursor() = cur; - - // Redraw if requested or necessary. - if (res.update()) - update(); - if (fitCursor()) - update(); + // Redraw if requested or necessary. + if (fitCursor() || res.update()) + update(); + } // see workAreaKeyPress cursor_timeout.restart(); diff --git a/src/ChangeLog b/src/ChangeLog index 399e48c7ab..980341cdc0 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,4 +1,18 @@ +2004-04-03 Alfredo Braunstein + + * cursor.[Ch] (LCursor): remove cached_y_ and updatePos + (getDim) remove outdated comment + + * BufferView_pimpl.C (fitCursor): call redoParagraph on the outer + cursor paragraph to obtain good cursor y info + (workAreaDispatch): remove unneeded update call + + * BufferView.C (setCursor): call redoParagraph, as some insets + could have been opened + (putSelectionAt): remove the double update and all that cleverness + (simplified and transfered to fitCursor where it belongs). + 2004-04-01 Alfredo Braunstein * text3.C (getStatus): add LFUN_BEGINNINGBUF diff --git a/src/cursor.C b/src/cursor.C index 5b27a79b7c..d731738c86 100644 --- a/src/cursor.C +++ b/src/cursor.C @@ -84,8 +84,7 @@ void region(CursorSlice const & i1, CursorSlice const & i2, LCursor::LCursor(BufferView & bv) - : DocIterator(), bv_(&bv), - anchor_(), cached_y_(0), x_target_(-1), + : DocIterator(), bv_(&bv), anchor_(), x_target_(-1), selection_(false), mark_(false) {} @@ -95,7 +94,6 @@ void LCursor::reset(InsetBase & inset) clear(); push_back(CursorSlice(inset)); anchor_ = DocIterator(inset); - cached_y_ = 0; clearTargetX(); selection_ = false; mark_ = false; @@ -236,15 +234,6 @@ int LCursor::currentMode() } -void LCursor::updatePos() -{ - BOOST_ASSERT(!empty()); - if (size() > 1) - cached_y_ = bv().top_y() + back().inset().yo(); - //cached_y_ = back().inset().yo(); -} - - void LCursor::getDim(int & asc, int & des) const { if (inMathed()) { @@ -270,16 +259,6 @@ void LCursor::getPos(int & x, int & y) const y = 0; if (!empty()) inset().getCursorPos(back(), x, y); - // getCursorPos gives _screen_ coordinates. We need to add - // top_y to get document coordinates. This is hidden in cached_y_. - //y += cached_y_ - inset().yo(); - // The rest is non-obvious. The reason we have to have these - // extra computation is that the getCursorPos() calls rely - // on the inset's own knowledge of its screen position. - // If we scroll up or down in a big enough increment, - // inset->draw() is not called: this doesn't update - // inset.yo_, so getCursor() returns an old value. - // Ugly as you like. } diff --git a/src/cursor.h b/src/cursor.h index ad3cf1fbb8..a3b0b3e75f 100644 --- a/src/cursor.h +++ b/src/cursor.h @@ -149,8 +149,6 @@ public: CursorSlice & anchor(); /// access to selection anchor CursorSlice const & anchor() const; - /// cache the absolute coordinate from the top inset - void updatePos(); /// sets anchor to cursor position void resetAnchor(); /// access to owning BufferView @@ -187,8 +185,6 @@ public: DispatchResult disp_; private: - /// - int cached_y_; /** * The target x position of the cursor. This is used for when * we have text like : diff --git a/src/frontends/screen.C b/src/frontends/screen.C index 93f30487b8..3317e00f9d 100644 --- a/src/frontends/screen.C +++ b/src/frontends/screen.C @@ -214,7 +214,7 @@ bool LyXScreen::fitCursor(BufferView * bv) bv->cursor().getPos(x, y); bv->cursor().getDim(asc, desc); //lyxerr << "LyXScreen::fitCursor: x: " << x << " y: " << y - // << " top_y: " << top_y << endl; + // << " top_y: " << top_y << endl; bool const big_row = h / 4 < asc + desc && asc + desc < h; diff --git a/src/lyxfunc.C b/src/lyxfunc.C index 550b627fe3..da82260329 100644 --- a/src/lyxfunc.C +++ b/src/lyxfunc.C @@ -1362,7 +1362,6 @@ void LyXFunc::dispatch(FuncRequest const & cmd, bool verbose) if (view()->available()) { view()->fitCursor(); view()->update(); - view()->cursor().updatePos(); // if we executed a mutating lfun, mark the buffer as dirty if (getStatus(cmd).enabled() && !lyxaction.funcHasFlag(cmd.action, LyXAction::NoBuffer) diff --git a/src/text3.C b/src/text3.C index 8fcea9ed27..99c28c9f4d 100644 --- a/src/text3.C +++ b/src/text3.C @@ -1136,9 +1136,6 @@ void LyXText::dispatch(LCursor & cur, FuncRequest & cmd) finishUndo(); cur.x_target() = cursorX(cur.top()); - if (bv->fitCursor()) - selection_possible = false; - // Insert primary selection with middle mouse // if there is a local selection in the current buffer, // insert this