mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-10 20:04:46 +00:00
Fix bug 1814 (scrolling)
git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@10595 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
4288e62d08
commit
e5cb61130f
@ -141,7 +141,7 @@ 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),
|
||||
: bv_(&bv), owner_(owner), buffer_(0), wh_(0), cursor_timeout(400),
|
||||
using_xterm_cursor(false), cursor_(bv),
|
||||
anchor_ref_(0), offset_ref_(0)
|
||||
{
|
||||
@ -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);
|
||||
|
@ -145,6 +145,8 @@ private:
|
||||
boost::scoped_ptr<LyXScreen> screen_;
|
||||
///
|
||||
boost::scoped_ptr<WorkArea> workarea_;
|
||||
/// Estimated average par height for scrollbar
|
||||
int wh_;
|
||||
///
|
||||
Timeout cursor_timeout;
|
||||
///
|
||||
|
@ -1,8 +1,13 @@
|
||||
2005-11-07 Martin Vermeer <martin.vermeer@hut.fi>
|
||||
|
||||
* BufferView_pimpl.[Ch]: Fix bug 1814: better scroll behaviour for
|
||||
docs containing very large paragraphs.
|
||||
|
||||
2005-11-07 Martin Vermeer <martin.vermeer@hut.fi>
|
||||
|
||||
* 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 <j.spitzmueller@gmx.de>
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user