X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ae1980442d70aa04b1699fbba1c3503fdab58e6d..d9c11ee99906558ae853fc3b42167e884d2a940e:/src/kitemviews/kitemlistview.cpp diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 6c60ed648..cf1483659 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; @@ -231,7 +236,7 @@ void KItemListView::setVisibleRoles(const QList &roles) if (!m_headerWidget->automaticColumnResizing()) { // The column-width of new roles are still 0. Apply the preferred // column-width as default with. - for (const QByteArray &role : qAsConst(m_visibleRoles)) { + for (const QByteArray &role : std::as_const(m_visibleRoles)) { if (m_headerWidget->columnWidth(role) == 0) { const qreal width = m_headerWidget->preferredColumnWidth(role); m_headerWidget->setColumnWidth(role, width); @@ -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); } @@ -519,7 +537,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 +546,65 @@ void KItemListView::scrollToItem(int index) } QRectF currentRect = itemRect(index); - // Fix for Bug 311099 - View the underscore when using Ctrl + PagDown + // 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) { + qreal newOffset = scrollOffset(); + if (scrollOrientation() == Qt::Vertical && (currentRect.top() < viewGeometry.top() || currentRect.bottom() > viewGeometry.bottom())) { + switch (viewItemPosition) { + case Beginning: + newOffset += currentRect.top() - viewGeometry.top(); + break; + case Middle: + newOffset += 0.5 * (currentRect.top() + currentRect.bottom() - (viewGeometry.top() + viewGeometry.bottom())); + break; + case End: + newOffset += currentRect.bottom() - viewGeometry.bottom(); + break; + case Nearest: if (currentRect.top() < viewGeometry.top()) { newOffset += currentRect.top() - viewGeometry.top(); - } else if (currentRect.bottom() > viewGeometry.bottom()) { + } else { newOffset += currentRect.bottom() - viewGeometry.bottom(); } - } else { + break; + default: + Q_UNREACHABLE(); + } + } else if (scrollOrientation() == Qt::Horizontal && (currentRect.left() < viewGeometry.left() || currentRect.right() > viewGeometry.right())) { + switch (viewItemPosition) { + case Beginning: + if (layoutDirection() == Qt::RightToLeft) { + newOffset += currentRect.right() - viewGeometry.right(); + } else { + newOffset += currentRect.left() - viewGeometry.left(); + } + break; + case Middle: + newOffset += 0.5 * (currentRect.left() + currentRect.right() - (viewGeometry.left() + viewGeometry.right())); + break; + case End: + if (layoutDirection() == Qt::RightToLeft) { + newOffset += currentRect.left() - viewGeometry.left(); + } else { + newOffset += currentRect.right() - viewGeometry.right(); + } + break; + case Nearest: if (currentRect.left() < viewGeometry.left()) { newOffset += currentRect.left() - viewGeometry.left(); - } else if (currentRect.right() > viewGeometry.right()) { + } else { newOffset += currentRect.right() - viewGeometry.right(); } + break; + default: + Q_UNREACHABLE(); } + } - if (newOffset != scrollOffset()) { - Q_EMIT scrollTo(newOffset); - return; - } + if (newOffset != scrollOffset()) { + Q_EMIT scrollTo(newOffset); + return; } Q_EMIT scrollingStopped(); @@ -669,7 +723,7 @@ void KItemListView::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt { QGraphicsWidget::paint(painter, option, widget); - for (auto animation : qAsConst(m_rubberBandAnimations)) { + for (auto animation : std::as_const(m_rubberBandAnimations)) { QRectF rubberBandRect = animation->property(RubberPropertyName).toRectF(); const QPointF topLeft = rubberBandRect.topLeft(); @@ -961,6 +1015,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())) { @@ -1220,7 +1286,7 @@ void KItemListView::slotItemsRemoved(const KItemRangeList &itemRanges) // after the deleted items. It is important to update them in ascending // order to prevent overlaps when setting the new index. std::sort(itemsToMove.begin(), itemsToMove.end()); - for (int i : qAsConst(itemsToMove)) { + for (int i : std::as_const(itemsToMove)) { KItemListWidget *widget = m_visibleItems.value(i); Q_ASSERT(widget); const int newIndex = i - count; @@ -1846,7 +1912,7 @@ void KItemListView::doLayout(LayoutAnimationHint hint, int changedIndex, int cha } // Delete invisible KItemListWidget instances that have not been reused - for (int index : qAsConst(reusableItems)) { + for (int index : std::as_const(reusableItems)) { recycleWidget(m_visibleItems.value(index)); } @@ -2222,7 +2288,7 @@ QHash KItemListView::preferredColumnWidths(const KItemRangeLi const QFontMetricsF fontMetrics(m_headerWidget->font()); const int gripMargin = m_headerWidget->style()->pixelMetric(QStyle::PM_HeaderGripMargin); const int headerMargin = m_headerWidget->style()->pixelMetric(QStyle::PM_HeaderMargin); - for (const QByteArray &visibleRole : qAsConst(m_visibleRoles)) { + for (const QByteArray &visibleRole : std::as_const(m_visibleRoles)) { const QString headerText = m_model->roleDescription(visibleRole); const qreal headerWidth = fontMetrics.horizontalAdvance(headerText) + gripMargin + headerMargin * 2; widths.insert(visibleRole, headerWidth); @@ -2238,7 +2304,7 @@ QHash KItemListView::preferredColumnWidths(const KItemRangeLi const int endIndex = startIndex + itemRange.count - 1; for (int i = startIndex; i <= endIndex; ++i) { - for (const QByteArray &visibleRole : qAsConst(m_visibleRoles)) { + for (const QByteArray &visibleRole : std::as_const(m_visibleRoles)) { qreal maxWidth = widths.value(visibleRole, 0); const qreal width = creator->preferredRoleColumnWidth(visibleRole, i, this); maxWidth = qMax(width, maxWidth); @@ -2265,7 +2331,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); @@ -2279,7 +2345,7 @@ void KItemListView::applyColumnWidthsFromHeader() void KItemListView::updateWidgetColumnWidths(KItemListWidget *widget) { - for (const QByteArray &role : qAsConst(m_visibleRoles)) { + for (const QByteArray &role : std::as_const(m_visibleRoles)) { widget->setColumnWidth(role, m_headerWidget->columnWidth(role)); } widget->setSidePadding(m_headerWidget->sidePadding()); @@ -2296,7 +2362,7 @@ void KItemListView::updatePreferredColumnWidths(const KItemRangeList &itemRanges if (itemCount == rangesItemCount) { const QHash preferredWidths = preferredColumnWidths(itemRanges); - for (const QByteArray &role : qAsConst(m_visibleRoles)) { + for (const QByteArray &role : std::as_const(m_visibleRoles)) { m_headerWidget->setPreferredColumnWidth(role, preferredWidths.value(role)); } } else { @@ -2351,7 +2417,7 @@ void KItemListView::applyAutomaticColumnWidths() // size does not use the available view-size the size of the // first role will get stretched. - for (const QByteArray &role : qAsConst(m_visibleRoles)) { + for (const QByteArray &role : std::as_const(m_visibleRoles)) { const qreal preferredWidth = m_headerWidget->preferredColumnWidth(role); m_headerWidget->setColumnWidth(role, preferredWidth); } @@ -2360,9 +2426,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 @@ -2400,7 +2466,7 @@ void KItemListView::applyAutomaticColumnWidths() qreal KItemListView::columnWidthsSum() const { qreal widthsSum = 0; - for (const QByteArray &role : qAsConst(m_visibleRoles)) { + for (const QByteArray &role : std::as_const(m_visibleRoles)) { widthsSum += m_headerWidget->columnWidth(role); } return widthsSum;