commit 4d7b912ca1890b5b0b3ed29568b7091a7e7baef0
Author: Guillaume Munch <[email protected]>
Date:   Fri Jul 29 21:27:13 2016 +0100

    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).
---
 src/BufferView.cpp                |    6 ++++++
 src/frontends/qt4/GuiWorkArea.cpp |    7 +++----
 2 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/src/BufferView.cpp b/src/BufferView.cpp
index 9001143..0212b16 100644
--- a/src/BufferView.cpp
+++ b/src/BufferView.cpp
@@ -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;
 }
 
 
diff --git a/src/frontends/qt4/GuiWorkArea.cpp 
b/src/frontends/qt4/GuiWorkArea.cpp
index 9223964..75afebf 100644
--- a/src/frontends/qt4/GuiWorkArea.cpp
+++ b/src/frontends/qt4/GuiWorkArea.cpp
@@ -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);

Reply via email to