From e5cb61130f6ecde481822c28fb353480a568469d Mon Sep 17 00:00:00 2001 From: Martin Vermeer Date: Mon, 7 Nov 2005 15:06:42 +0000 Subject: [PATCH] Fix bug 1814 (scrolling) git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@10595 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/BufferView_pimpl.C | 44 ++++++++++++++++++++++++++++-------------- src/BufferView_pimpl.h | 2 ++ src/ChangeLog | 7 ++++++- 3 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/BufferView_pimpl.C b/src/BufferView_pimpl.C index 3902af1d59..419015a796 100644 --- a/src/BufferView_pimpl.C +++ b/src/BufferView_pimpl.C @@ -141,8 +141,8 @@ T * getInsetByCode(LCursor & cur, InsetBase::Code code) BufferView::Pimpl::Pimpl(BufferView & bv, LyXView * owner, int width, int height) - : bv_(&bv), owner_(owner), buffer_(0), cursor_timeout(400), - using_xterm_cursor(false), cursor_(bv) , + : bv_(&bv), owner_(owner), buffer_(0), wh_(0), cursor_timeout(400), + using_xterm_cursor(false), cursor_(bv), anchor_ref_(0), offset_ref_(0) { xsel_cache_.set = false; @@ -439,8 +439,9 @@ void BufferView::Pimpl::updateScrollbar() } LyXText & t = *bv_->text(); - if (anchor_ref_ > int(t.paragraphs().size()) - 1) { - anchor_ref_ = int(t.paragraphs().size()) - 1; + int const parsize = int(t.paragraphs().size() - 1); + if (anchor_ref_ > parsize) { + anchor_ref_ = parsize; offset_ref_ = 0; } @@ -454,21 +455,34 @@ void BufferView::Pimpl::updateScrollbar() // values in [0..1] and divide everything by wh // estimated average paragraph height: - int const wh = workarea().workHeight() / 4; + if (wh_ == 0) + wh_ = workarea().workHeight() / 4; int h = t.getPar(anchor_ref_).height(); + // Normalize anchor/offset (MV): - while (offset_ref_ > h) { + while (offset_ref_ > h && anchor_ref_ < parsize) { anchor_ref_++; offset_ref_ -= h; h = t.getPar(anchor_ref_).height(); } + // Look at paragraph heights on-screen + int sumh = 0; + int nh = 0; + for (lyx::pit_type pit = anchor_ref_; pit <= parsize; ++pit) { + if (sumh > workarea().workHeight()) + break; + int const h2 = t.getPar(pit).height(); + sumh += h2; + nh++; + } + int const hav = sumh / nh; + // More realistic average paragraph height + if (hav > wh_) + wh_ = hav; - // The "+ 2" makes inoculates doc bottom display against - // unrealistic wh values (docs with very large paragraphs) (MV) - workarea().setScrollbarParams((t.paragraphs().size() + 2) * wh, - anchor_ref_ * wh + int(offset_ref_ * wh / float(h)), - int(wh * defaultRowHeight() / float(h))); -// workarea().setScrollbarParams(t.paragraphs().size(), anchor_ref_, 1); + workarea().setScrollbarParams((parsize + 1) * wh_, + anchor_ref_ * wh_ + int(offset_ref_ * wh_ / float(h)), + int(wh_ * defaultRowHeight() / float(h))); } @@ -482,13 +496,13 @@ void BufferView::Pimpl::scrollDocView(int value) screen().hideCursor(); - int const wh = workarea().workHeight() / 4; - LyXText & t = *bv_->text(); - float const bar = value / float(wh * t.paragraphs().size()); + float const bar = value / float(wh_ * t.paragraphs().size()); anchor_ref_ = int(bar * t.paragraphs().size()); + if (anchor_ref_ > int(t.paragraphs().size()) - 1) + anchor_ref_ = int(t.paragraphs().size()) - 1; t.redoParagraph(anchor_ref_); int const h = t.getPar(anchor_ref_).height(); offset_ref_ = int((bar * t.paragraphs().size() - anchor_ref_) * h); diff --git a/src/BufferView_pimpl.h b/src/BufferView_pimpl.h index 73d6d4262d..b55cf924e2 100644 --- a/src/BufferView_pimpl.h +++ b/src/BufferView_pimpl.h @@ -145,6 +145,8 @@ private: boost::scoped_ptr screen_; /// boost::scoped_ptr workarea_; + /// Estimated average par height for scrollbar + int wh_; /// Timeout cursor_timeout; /// diff --git a/src/ChangeLog b/src/ChangeLog index c495f9774c..00f542fc6c 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,8 +1,13 @@ +2005-11-07 Martin Vermeer + + * BufferView_pimpl.[Ch]: Fix bug 1814: better scroll behaviour for + docs containing very large paragraphs. + 2005-11-07 Martin Vermeer * cursor.C (selectionBegin, selectionEnd): * text.C (drawSelection): Fix bug 2115: assertion when anchor and - cursor at different depths + cursor at different depths. 2005-11-03 Jürgen Spitzmüller