- QScrollBar* scrollBar = horizontalScrollBar();
- const int value = m_controller->view()->offset();
- const int maximum = qMax(0, int(m_controller->view()->maximumOffset() - size.width()));
- scrollBar->setPageStep(size.width());
- scrollBar->setMinimum(0);
- scrollBar->setMaximum(maximum);
- scrollBar->setValue(value);
- verticalScrollBar()->setMaximum(0);
+ smoothScroller = m_horizontalSmoothScroller;
+ scrollOffsetScrollBar = horizontalScrollBar();
+ singleStep = view->itemSize().width();
+ pageStep = view->size().width();
+ maximum = qMax(0, int(view->maximumScrollOffset() - view->size().width()));
+ }
+
+ const int value = view->scrollOffset();
+ if (smoothScroller->requestScrollBarUpdate(maximum)) {
+ const bool updatePolicy = (scrollOffsetScrollBar->maximum() > 0 && maximum == 0)
+ || horizontalScrollBarPolicy() == Qt::ScrollBarAlwaysOn;
+
+ scrollOffsetScrollBar->setSingleStep(singleStep);
+ scrollOffsetScrollBar->setPageStep(pageStep);
+ scrollOffsetScrollBar->setMinimum(0);
+ scrollOffsetScrollBar->setMaximum(maximum);
+ scrollOffsetScrollBar->setValue(value);
+
+ if (updatePolicy) {
+ // Prevent a potential endless layout loop (see bug #293318).
+ updateScrollOffsetScrollBarPolicy();
+ }
+ }
+}
+
+void KItemListContainer::updateItemOffsetScrollBar()
+{
+ const KItemListView* view = m_controller->view();
+ if (!view) {
+ return;
+ }
+
+ KItemListSmoothScroller* smoothScroller = nullptr;
+ QScrollBar* itemOffsetScrollBar = nullptr;
+ int singleStep = 0;
+ int pageStep = 0;
+ if (view->scrollOrientation() == Qt::Vertical) {
+ smoothScroller = m_horizontalSmoothScroller;
+ itemOffsetScrollBar = horizontalScrollBar();
+ singleStep = view->size().width() / 10;
+ pageStep = view->size().width();
+ } else {
+ smoothScroller = m_verticalSmoothScroller;
+ itemOffsetScrollBar = verticalScrollBar();
+ singleStep = view->size().height() / 10;
+ pageStep = view->size().height();
+ }
+
+ const int value = view->itemOffset();
+ const int maximum = qMax(0, int(view->maximumItemOffset()) - pageStep);
+ if (smoothScroller->requestScrollBarUpdate(maximum)) {
+ itemOffsetScrollBar->setSingleStep(singleStep);
+ itemOffsetScrollBar->setPageStep(pageStep);
+ itemOffsetScrollBar->setMinimum(0);
+ itemOffsetScrollBar->setMaximum(maximum);
+ itemOffsetScrollBar->setValue(value);