#include <QPropertyAnimation>
#include <QScrollBar>
#include <QStyle>
+#include <QStyleOption>
#include <KDebug>
QGraphicsScene* scene = static_cast<QGraphicsView*>(viewport())->scene();
if (previous) {
scene->removeItem(previous);
- disconnect(current, SIGNAL(scrollOrientationChanged(Qt::Orientation,Qt::Orientation)), this, SLOT(slotScrollOrientationChanged(Qt::Orientation,Qt::Orientation)));
+ disconnect(previous, SIGNAL(scrollOrientationChanged(Qt::Orientation,Qt::Orientation)), this, SLOT(slotScrollOrientationChanged(Qt::Orientation,Qt::Orientation)));
disconnect(previous, SIGNAL(scrollOffsetChanged(qreal,qreal)), this, SLOT(updateScrollOffsetScrollBar()));
disconnect(previous, SIGNAL(maximumScrollOffsetChanged(qreal,qreal)), this, SLOT(updateScrollOffsetScrollBar()));
disconnect(previous, SIGNAL(itemOffsetChanged(qreal,qreal)), this, SLOT(updateItemOffsetScrollBar()));
const int value = view->scrollOffset();
const int maximum = qMax(0, int(view->maximumScrollOffset() - pageStep));
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();
+ }
}
}
{
QRect rect = geometry();
+ int extra = frameWidth() * 2;
+ QStyleOption option;
+ option.initFrom(this);
+ if (style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, &option, this)) {
+ extra += style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &option, this);
+ }
+
const int widthDec = verticalScrollBar()->isVisible()
- ? frameWidth() + style()->pixelMetric(QStyle::PM_ScrollBarExtent)
- : frameWidth() * 2;
+ ? extra + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
+ : extra;
const int heightDec = horizontalScrollBar()->isVisible()
- ? frameWidth() + style()->pixelMetric(QStyle::PM_ScrollBarExtent)
- : frameWidth() * 2;
+ ? extra + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
+ : extra;
rect.adjust(0, 0, -widthDec, -heightDec);
}
}
+void KItemListContainer::updateScrollOffsetScrollBarPolicy()
+{
+ const KItemListView* view = m_controller->view();
+ Q_ASSERT(view);
+ const bool vertical = (view->scrollOrientation() == Qt::Vertical);
+
+ QStyleOption option;
+ option.initFrom(this);
+ const int scrollBarInc = style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this);
+
+ QSizeF newViewSize = m_controller->view()->size();
+ if (vertical) {
+ newViewSize.rwidth() += scrollBarInc;
+ } else {
+ newViewSize.rheight() += scrollBarInc;
+ }
+
+ const Qt::ScrollBarPolicy policy = view->scrollBarRequired(newViewSize)
+ ? Qt::ScrollBarAlwaysOn : Qt::ScrollBarAsNeeded;
+ if (vertical) {
+ setVerticalScrollBarPolicy(policy);
+ } else {
+ setHorizontalScrollBarPolicy(policy);
+ }
+}
+
void KItemListContainer::initialize()
{
- if (!m_controller) {
+ if (m_controller) {
+ if (m_controller->model()) {
+ slotModelChanged(m_controller->model(), 0);
+ }
+ if (m_controller->view()) {
+ slotViewChanged(m_controller->view(), 0);
+ }
+ } else {
m_controller = new KItemListController(this);
}