Fix "scroll here" feature of scrollbar (#10311)

Prevent setRange() from causing a recursive call to scrollTo(). Reduces three
calls of scrollTo() to one call for all scrolling functions of the scroll bar
(e.g. clicking on the arrow, dragging, or clicking somewhere on the scrollbar).
This commit is contained in:
Guillaume Munch 2016-07-29 21:27:13 +01:00
parent bc8eb059db
commit 4d7b912ca1
2 changed files with 9 additions and 4 deletions

View File

@ -564,6 +564,12 @@ void BufferView::updateScrollbar()
d->scrollbarParameters_.max -= minVisiblePart(); d->scrollbarParameters_.max -= minVisiblePart();
else else
d->scrollbarParameters_.max -= d->scrollbarParameters_.page_step; d->scrollbarParameters_.max -= d->scrollbarParameters_.page_step;
// 0 must be inside the range as it denotes the current position
if (d->scrollbarParameters_.max < 0)
d->scrollbarParameters_.max = 0;
if (d->scrollbarParameters_.min > 0)
d->scrollbarParameters_.min = 0;
} }

View File

@ -671,10 +671,9 @@ void GuiWorkArea::toggleCursor()
void GuiWorkArea::Private::updateScrollbar() void GuiWorkArea::Private::updateScrollbar()
{ {
ScrollbarParameters const & scroll_ = buffer_view_->scrollbarParameters(); ScrollbarParameters const & scroll_ = buffer_view_->scrollbarParameters();
// WARNING: don't touch at the scrollbar value like this: // Block signals to prevent setRange() and setSliderPosition from causing
// verticalScrollBar()->setValue(scroll_.position); // recursive calls via the signal valueChanged. (#10311)
// because this would cause a recursive signal/slot calling with QSignalBlocker blocker(p->verticalScrollBar());
// GuiWorkArea::scrollTo
p->verticalScrollBar()->setRange(scroll_.min, scroll_.max); p->verticalScrollBar()->setRange(scroll_.min, scroll_.max);
p->verticalScrollBar()->setPageStep(scroll_.page_step); p->verticalScrollBar()->setPageStep(scroll_.page_step);
p->verticalScrollBar()->setSingleStep(scroll_.single_step); p->verticalScrollBar()->setSingleStep(scroll_.single_step);