X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/240d33ce17fc531e8bc6638af8f71454fe7c05e6..e57f6215659ee36877c7c36c9e3fcba0ba5d03a0:/src/kitemviews/kitemlistcontainer.cpp diff --git a/src/kitemviews/kitemlistcontainer.cpp b/src/kitemviews/kitemlistcontainer.cpp index 2f9f5d401..3ec56e5f1 100644 --- a/src/kitemviews/kitemlistcontainer.cpp +++ b/src/kitemviews/kitemlistcontainer.cpp @@ -12,6 +12,9 @@ #include "kitemlistview.h" #include "private/kitemlistsmoothscroller.h" +#ifndef QT_NO_ACCESSIBILITY +#include "accessibility/kitemlistviewaccessible.h" +#endif #include #include #include @@ -195,6 +198,17 @@ void KItemListContainer::focusInEvent(QFocusEvent *event) KItemListView *view = m_controller->view(); if (view) { QApplication::sendEvent(view, event); + + // We need to set the focus to the view or accessibility software will only announce the container (which has no information available itself). + // For some reason actively setting the focus to the view needs to be delayed or the focus will immediately go back to this container. + QTimer::singleShot(0, this, [this, view]() { + if (!isAncestorOf(QApplication::focusWidget())) { + view->setFocus(); + } +#ifndef QT_NO_ACCESSIBILITY + static_cast(QAccessible::queryAccessibleInterface(view))->setAccessibleFocusAndAnnounceAll(); +#endif + }); } } @@ -272,20 +286,15 @@ void KItemListContainer::updateScrollOffsetScrollBar() KItemListSmoothScroller *smoothScroller = nullptr; QScrollBar *scrollOffsetScrollBar = nullptr; - int singleStep = 0; int pageStep = 0; int maximum = 0; if (view->scrollOrientation() == Qt::Vertical) { smoothScroller = m_verticalSmoothScroller; + if (smoothScroller->isAnimating()) { + return; + } scrollOffsetScrollBar = verticalScrollBar(); - // Don't scroll super fast when using a wheel mouse: - // We want to consider one "line" to be the text label which has a - // roughly fixed height rather than using the height of the icon which - // may be very tall - const QFontMetrics metrics(font()); - singleStep = metrics.height() * QApplication::wheelScrollLines(); - // 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(); @@ -297,12 +306,15 @@ void KItemListContainer::updateScrollOffsetScrollBar() maximum = qMax(0, int(view->maximumScrollOffset() - view->size().height())); } else { smoothScroller = m_horizontalSmoothScroller; + if (smoothScroller->isAnimating()) { + return; + } scrollOffsetScrollBar = horizontalScrollBar(); - singleStep = view->itemSize().width(); pageStep = view->size().width(); maximum = qMax(0, int(view->maximumScrollOffset() - view->size().width())); } + const int singleStep = view->scrollSingleStep(); const int value = view->scrollOffset(); if (smoothScroller->requestScrollBarUpdate(maximum)) { const bool updatePolicy = (scrollOffsetScrollBar->maximum() > 0 && maximum == 0) || horizontalScrollBarPolicy() == Qt::ScrollBarAlwaysOn; @@ -333,11 +345,17 @@ void KItemListContainer::updateItemOffsetScrollBar() int pageStep = 0; if (view->scrollOrientation() == Qt::Vertical) { smoothScroller = m_horizontalSmoothScroller; + if (smoothScroller->isAnimating()) { + return; + } itemOffsetScrollBar = horizontalScrollBar(); singleStep = view->size().width() / 10; pageStep = view->size().width(); } else { smoothScroller = m_verticalSmoothScroller; + if (smoothScroller->isAnimating()) { + return; + } itemOffsetScrollBar = verticalScrollBar(); singleStep = view->size().height() / 10; pageStep = view->size().height();