X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/b58a346be96f7d0973ed96e52c4cf95463ba244d..e9b056dcf080a12a09fa1c1a55eab79edb2164b5:/src/kitemviews/kitemlistview.cpp diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 33a341081..afc392810 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -50,9 +50,14 @@ QAccessibleInterface *accessibleInterfaceFactory(const QString &key, QObject *ob Q_UNUSED(key) if (KItemListContainer *container = qobject_cast(object)) { + if (auto controller = container->controller(); controller) { + if (KItemListView *view = controller->view(); view && view->accessibleParent()) { + return view->accessibleParent(); + } + } return new KItemListContainerAccessible(container); } else if (KItemListView *view = qobject_cast(object)) { - return new KItemListViewAccessible(view); + return new KItemListViewAccessible(view, view->accessibleParent()); } return nullptr; @@ -337,6 +342,19 @@ KItemListGroupHeaderCreatorBase *KItemListView::groupHeaderCreator() const return m_groupHeaderCreator; } +#ifndef QT_NO_ACCESSIBILITY +void KItemListView::setAccessibleParentsObject(KItemListContainer *accessibleParentsObject) +{ + Q_ASSERT(!m_accessibleParent); + m_accessibleParent = new KItemListContainerAccessible(accessibleParentsObject); +} +KItemListContainerAccessible *KItemListView::accessibleParent() +{ + Q_CHECK_PTR(m_accessibleParent); // We always want the accessibility tree/hierarchy to be complete. + return m_accessibleParent; +} +#endif + QSizeF KItemListView::itemSize() const { return m_itemSize; @@ -361,7 +379,7 @@ void KItemListView::setGeometry(const QRectF &rect) if (m_headerWidget->automaticColumnResizing()) { applyAutomaticColumnWidths(); } else { - const qreal requiredWidth = columnWidthsSum(); + const qreal requiredWidth = columnWidthsSum() + 2 * m_headerWidget->sidePadding(); const QSizeF dynamicItemSize(qMax(newSize.width(), requiredWidth), m_itemSize.height()); m_layouter->setItemSize(dynamicItemSize); } @@ -384,6 +402,10 @@ qreal KItemListView::verticalPageStep() const std::optional KItemListView::itemAt(const QPointF &pos) const { + if (headerBoundaries().contains(pos)) { + return std::nullopt; + } + QHashIterator it(m_visibleItems); while (it.hasNext()) { it.next(); @@ -519,7 +541,7 @@ bool KItemListView::isElided(int index) const return m_sizeHintResolver->isElided(index); } -void KItemListView::scrollToItem(int index) +void KItemListView::scrollToItem(int index, ViewItemPosition viewItemPosition) { QRectF viewGeometry = geometry(); if (m_headerWidget->isVisible()) { @@ -528,29 +550,89 @@ void KItemListView::scrollToItem(int index) } QRectF currentRect = itemRect(index); - // Fix for Bug 311099 - View the underscore when using Ctrl + PagDown + if (layoutDirection() == Qt::RightToLeft && scrollOrientation() == Qt::Horizontal) { + currentRect.moveLeft(m_layouter->size().width() - currentRect.right()); + } + + // Fix for Bug 311099 - View the underscore when using Ctrl + PageDown currentRect.adjust(-m_styleOption.horizontalMargin, -m_styleOption.verticalMargin, m_styleOption.horizontalMargin, m_styleOption.verticalMargin); - if (!viewGeometry.contains(currentRect)) { - qreal newOffset = scrollOffset(); - if (scrollOrientation() == Qt::Vertical) { - if (currentRect.top() < viewGeometry.top()) { - newOffset += currentRect.top() - viewGeometry.top(); - } else if (currentRect.bottom() > viewGeometry.bottom()) { - newOffset += currentRect.bottom() - viewGeometry.bottom(); + qreal offset = 0; + switch (scrollOrientation()) { + case Qt::Vertical: + if (currentRect.top() < viewGeometry.top() || currentRect.bottom() > viewGeometry.bottom()) { + switch (viewItemPosition) { + case Beginning: + offset = currentRect.top() - viewGeometry.top(); + break; + case Middle: + offset = 0.5 * (currentRect.top() + currentRect.bottom() - (viewGeometry.top() + viewGeometry.bottom())); + break; + case End: + offset = currentRect.bottom() - viewGeometry.bottom(); + break; + case Nearest: + if (currentRect.top() < viewGeometry.top()) { + offset = currentRect.top() - viewGeometry.top(); + } + if (currentRect.bottom() > viewGeometry.bottom() + offset) { + offset += currentRect.bottom() - viewGeometry.bottom() - offset; + } + break; + default: + Q_UNREACHABLE(); } - } else { - if (currentRect.left() < viewGeometry.left()) { - newOffset += currentRect.left() - viewGeometry.left(); - } else if (currentRect.right() > viewGeometry.right()) { - newOffset += currentRect.right() - viewGeometry.right(); + } + break; + case Qt::Horizontal: + if (currentRect.left() < viewGeometry.left() || currentRect.right() > viewGeometry.right()) { + switch (viewItemPosition) { + case Beginning: + if (layoutDirection() == Qt::RightToLeft) { + offset = currentRect.right() - viewGeometry.right(); + } else { + offset = currentRect.left() - viewGeometry.left(); + } + break; + case Middle: + offset = 0.5 * (currentRect.left() + currentRect.right() - (viewGeometry.left() + viewGeometry.right())); + break; + case End: + if (layoutDirection() == Qt::RightToLeft) { + offset = currentRect.left() - viewGeometry.left(); + } else { + offset = currentRect.right() - viewGeometry.right(); + } + break; + case Nearest: + if (layoutDirection() == Qt::RightToLeft) { + if (currentRect.left() < viewGeometry.left()) { + offset = currentRect.left() - viewGeometry.left(); + } + if (currentRect.right() > viewGeometry.right() + offset) { + offset += currentRect.right() - viewGeometry.right() - offset; + } + } else { + if (currentRect.right() > viewGeometry.right()) { + offset = currentRect.right() - viewGeometry.right(); + } + if (currentRect.left() < viewGeometry.left() + offset) { + offset += currentRect.left() - viewGeometry.left() - offset; + } + } + break; + default: + Q_UNREACHABLE(); } } + break; + default: + Q_UNREACHABLE(); + } - if (newOffset != scrollOffset()) { - Q_EMIT scrollTo(newOffset); - return; - } + if (!qFuzzyIsNull(offset)) { + Q_EMIT scrollTo(scrollOffset() + offset); + return; } Q_EMIT scrollingStopped(); @@ -961,6 +1043,18 @@ bool KItemListView::event(QEvent *event) updateFont(); break; + case QEvent::FocusIn: + focusInEvent(static_cast(event)); + event->accept(); + return true; + break; + + case QEvent::FocusOut: + focusOutEvent(static_cast(event)); + event->accept(); + return true; + break; + default: // Forward all other events to the controller and handle them there if (!m_editingRole && m_controller && m_controller->processEvent(event, transform())) { @@ -2265,7 +2359,7 @@ QHash KItemListView::preferredColumnWidths(const KItemRangeLi void KItemListView::applyColumnWidthsFromHeader() { // Apply the new size to the layouter - const qreal requiredWidth = columnWidthsSum() + m_headerWidget->sidePadding(); + const qreal requiredWidth = columnWidthsSum() + 2 * m_headerWidget->sidePadding(); const QSizeF dynamicItemSize(qMax(size().width(), requiredWidth), m_itemSize.height()); m_layouter->setItemSize(dynamicItemSize); @@ -2360,9 +2454,9 @@ void KItemListView::applyAutomaticColumnWidths() qreal firstColumnWidth = m_headerWidget->columnWidth(firstRole); QSizeF dynamicItemSize = m_itemSize; - qreal requiredWidth = columnWidthsSum() + m_headerWidget->sidePadding() - + m_headerWidget->sidePadding(); // Adding the padding a second time so we have the same padding symmetrically on both sides of the view. - // This improves UX, looks better and increases the chances of users figuring out that the padding area can be used for deselecting and dropping files. + qreal requiredWidth = columnWidthsSum() + 2 * m_headerWidget->sidePadding(); // Adding the padding a second time so we have the same padding + // symmetrically on both sides of the view. This improves UX, looks better and increases the chances of users figuring out that the padding + // area can be used for deselecting and dropping files. const qreal availableWidth = size().width(); if (requiredWidth < availableWidth) { // Stretch the first column to use the whole remaining width