#include "kitemlistview.h"
#include "private/kitemlistsmoothscroller.h"
+#ifndef QT_NO_ACCESSIBILITY
+#include "accessibility/kitemlistviewaccessible.h"
+#endif
#include <QApplication>
#include <QFontMetrics>
#include <QGraphicsScene>
}
}
+void KItemListContainer::contextMenuEvent(QContextMenuEvent *event)
+{
+ // Note copied from the keyPressEvent() method above because the same reasons probably also apply here.
+ // TODO: We should find a better way to handle the context menu events in the view.
+ // The reasons why we need this hack are:
+ // 1. Without reimplementing contextMenuEvent() here, the event would not reach the QGraphicsView.
+ // 2. By default, the KItemListView does not have the keyboard focus in the QGraphicsScene, so
+ // simply sending the event to the QGraphicsView which is the KItemListContainer's viewport
+ // does not work.
+ KItemListView *view = m_controller->view();
+ if (view) {
+ QApplication::sendEvent(view, event);
+ }
+}
+
void KItemListContainer::showEvent(QShowEvent *event)
{
QAbstractScrollArea::showEvent(event);
smoothScroller->handleWheelEvent(event);
}
+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<KItemListViewAccessible *>(QAccessible::queryAccessibleInterface(view))->setAccessibleFocusAndAnnounceAll();
+#endif
+ });
+ }
+}
+
+void KItemListContainer::focusOutEvent(QFocusEvent *event)
+{
+ KItemListView *view = m_controller->view();
+ if (view) {
+ QApplication::sendEvent(view, event);
+ }
+}
+
void KItemListContainer::slotScrollOrientationChanged(Qt::Orientation current, Qt::Orientation previous)
{
Q_UNUSED(previous)
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:
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();
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();
m_horizontalSmoothScroller->setPropertyName("scrollOffset");
m_verticalSmoothScroller->setPropertyName("itemOffset");
}
+
+ const bool isRightToLeft = m_controller->view()->layoutDirection() == Qt::RightToLeft;
+ QScrollBar *hScrollBar = horizontalScrollBar();
+ hScrollBar->setInvertedAppearance(isRightToLeft && orientation == Qt::Vertical);
+ hScrollBar->setInvertedControls(!isRightToLeft || orientation == Qt::Vertical);
}
void KItemListContainer::updateScrollOffsetScrollBarPolicy()