]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kitemviews/kitemlistcontainer.cpp
Improve drawing selected items in Compact/Details View and Places Panel
[dolphin.git] / src / kitemviews / kitemlistcontainer.cpp
index 7d7ccb4d8e622e6ae6f2737ab5974a141a4ccdee..8498286c9f68293709b74b5a86301878b86987ee 100644 (file)
@@ -23,7 +23,6 @@
 #include "kitemlistcontainer.h"
 
 #include "kitemlistcontroller.h"
-#include "kitemlistselectionmanager.h"
 #include "kitemlistview.h"
 #include "kitemmodelbase.h"
 
@@ -39,8 +38,6 @@
 
 #include <KDebug>
 
-#include "kitemlistviewaccessible.h"
-
 /**
  * Replaces the default viewport of KItemListContainer by a
  * non-scrollable viewport. The scrolling is done in an optimized
@@ -70,16 +67,6 @@ void KItemListContainerViewport::wheelEvent(QWheelEvent* event)
     event->ignore();
 }
 
-QAccessibleInterface* accessibleContainerFactory(const QString &key, QObject *object)
-{
-    Q_UNUSED(key)
-    if (KItemListContainer*view = qobject_cast<KItemListContainer*>(object))
-        return new KItemListContainerAccessible(view);
-    if (KItemListView *view = qobject_cast<KItemListView*>(object))
-        return new KItemListViewAccessible(view);
-    return 0;
-}
-
 KItemListContainer::KItemListContainer(KItemListController* controller, QWidget* parent) :
     QAbstractScrollArea(parent),
     m_controller(controller),
@@ -106,8 +93,6 @@ KItemListContainer::KItemListContainer(KItemListController* controller, QWidget*
             this, SLOT(slotModelChanged(KItemModelBase*,KItemModelBase*)));
     connect(controller, SIGNAL(viewChanged(KItemListView*,KItemListView*)),
             this, SLOT(slotViewChanged(KItemListView*,KItemListView*)));
-
-    QAccessible::installFactory(accessibleContainerFactory);
 }
 
 KItemListContainer::~KItemListContainer()
@@ -116,8 +101,6 @@ KItemListContainer::~KItemListContainer()
     // the QGraphicsScene might get deleted before the view.
     delete m_controller;
     m_controller = 0;
-
-    QAccessible::removeFactory(accessibleContainerFactory);
 }
 
 KItemListController* KItemListContainer::controller() const
@@ -182,7 +165,6 @@ void KItemListContainer::scrollContentsBy(int dx, int dy)
 {
     m_horizontalSmoothScroller->scrollContentsBy(dx);
     m_verticalSmoothScroller->scrollContentsBy(dy);
-    //QAccessible::updateAccessibility(view(), , );
 }
 
 void KItemListContainer::wheelEvent(QWheelEvent* event)
@@ -275,20 +257,29 @@ void KItemListContainer::updateScrollOffsetScrollBar()
     QScrollBar* scrollOffsetScrollBar = 0;
     int singleStep = 0;
     int pageStep = 0;
+    int maximum = 0;
     if (view->scrollOrientation() == Qt::Vertical) {
         smoothScroller = m_verticalSmoothScroller;
         scrollOffsetScrollBar = verticalScrollBar();
         singleStep = view->itemSize().height();
-        pageStep = view->size().height();
+        // We cannot use view->size().height() because this height might
+        // include the header widget, which is not part of the scrolled area.
+        pageStep = view->verticalPageStep();
+
+        // However, the total height of the view must be considered for the
+        // maximum value of the scroll bar. Note that the view's scrollOffset()
+        // refers to the offset of the top part of the view, which might be
+        // hidden behind the header.
+        maximum = qMax(0, int(view->maximumScrollOffset() - view->size().height()));
     } else {
         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();
-    const int maximum = qMax(0, int(view->maximumScrollOffset() - pageStep));
     if (smoothScroller->requestScrollBarUpdate(maximum)) {
         const bool updatePolicy = (scrollOffsetScrollBar->maximum() > 0 && maximum == 0)
                                   || horizontalScrollBarPolicy() == Qt::ScrollBarAlwaysOn;
@@ -347,31 +338,31 @@ void KItemListContainer::updateGeometries()
     int extra = frameWidth() * 2;
     QStyleOption option;
     option.initFrom(this);
+    int scrollbarSpacing = 0;
     if (style()->styleHint(QStyle::SH_ScrollView_FrameOnlyAroundContents, &option, this)) {
-        extra += style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &option, this);
+        scrollbarSpacing = style()->pixelMetric(QStyle::PM_ScrollView_ScrollBarSpacing, &option, this);
     }
 
     const int widthDec = verticalScrollBar()->isVisible()
-                         ? extra + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
+                         ? extra + scrollbarSpacing + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
                          : extra;
 
     const int heightDec = horizontalScrollBar()->isVisible()
-                          ? extra + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
+                          ? extra + scrollbarSpacing + style()->pixelMetric(QStyle::PM_ScrollBarExtent, &option, this)
                           : extra;
 
-    rect.adjust(0, 0, -widthDec, -heightDec);
-
-    const QRectF newGeometry(0, 0, rect.width(), rect.height());
+    const QRectF newGeometry(0, 0, rect.width() - widthDec,
+                             rect.height() - heightDec);
     if (m_controller->view()->geometry() != newGeometry) {
         m_controller->view()->setGeometry(newGeometry);
 
-        static_cast<KItemListContainerViewport*>(viewport())->scene()->setSceneRect(0, 0, rect.width(), rect.height());
-        static_cast<KItemListContainerViewport*>(viewport())->viewport()->setGeometry(QRect(0, 0, rect.width(), rect.height()));
+        // Get the real geometry of the view again since the scrollbars
+        // visibilities and the view geometry may have changed in re-layout.
+        static_cast<KItemListContainerViewport*>(viewport())->scene()->setSceneRect(m_controller->view()->geometry());
+        static_cast<KItemListContainerViewport*>(viewport())->viewport()->setGeometry(m_controller->view()->geometry().toRect());
 
         updateScrollOffsetScrollBar();
         updateItemOffsetScrollBar();
-        QAccessible::updateAccessibility(m_controller->view(), 0, QAccessible::LocationChanged);
-        QAccessible::updateAccessibility(m_controller->view(), m_controller->selectionManager()->currentItem(), QAccessible::LocationChanged);
     }
 }