]> git.lyx.org Git - features.git/commitdiff
Fix "scroll here" feature of scrollbar (#10311)
authorGuillaume Munch <gm@lyx.org>
Fri, 29 Jul 2016 20:27:13 +0000 (21:27 +0100)
committerGuillaume Munch <gm@lyx.org>
Sun, 31 Jul 2016 17:34:33 +0000 (18:34 +0100)
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).

src/BufferView.cpp
src/frontends/qt4/GuiWorkArea.cpp

index 900114384f738d4f2f4cf8e126f43fd95978e16f..0212b165d1cfd2dd0ed18f06a2886b2a71860872 100644 (file)
@@ -564,6 +564,12 @@ void BufferView::updateScrollbar()
                d->scrollbarParameters_.max -= minVisiblePart();
        else
                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;
 }
 
 
index 9223964e426054b985f033d804bfba52fd83415e..75afebfd02e1e69750cba20c497cb0d37331631f 100644 (file)
@@ -671,10 +671,9 @@ void GuiWorkArea::toggleCursor()
 void GuiWorkArea::Private::updateScrollbar()
 {
        ScrollbarParameters const & scroll_ = buffer_view_->scrollbarParameters();
-       // WARNING: don't touch at the scrollbar value like this:
-       //   verticalScrollBar()->setValue(scroll_.position);
-       // because this would cause a recursive signal/slot calling with
-       // GuiWorkArea::scrollTo
+       // Block signals to prevent setRange() and setSliderPosition from causing
+       // recursive calls via the signal valueChanged. (#10311)
+       QSignalBlocker blocker(p->verticalScrollBar());
        p->verticalScrollBar()->setRange(scroll_.min, scroll_.max);
        p->verticalScrollBar()->setPageStep(scroll_.page_step);
        p->verticalScrollBar()->setSingleStep(scroll_.single_step);