X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/25a5a1df171770ea1f6c9665c4f048807d6fc80d..eaf89b6e4edcdf9fc10f116e561ae9186b2ebbf5:/src/kitemviews/kitemlistview.cpp diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 38ec6841a..c56785c36 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -25,6 +25,8 @@ #include "private/kitemlistsizehintresolver.h" #include "private/kitemlistviewlayouter.h" +#include + #include #include #include @@ -104,6 +106,7 @@ KItemListView::KItemListView(QGraphicsWidget *parent) , m_header(nullptr) , m_headerWidget(nullptr) , m_indicatorAnimation(nullptr) + , m_statusBarOffset(0) , m_dropIndicator() , m_sizeHintResolver(nullptr) { @@ -190,7 +193,7 @@ qreal KItemListView::scrollOffset() const qreal KItemListView::maximumScrollOffset() const { - return m_layouter->maximumScrollOffset(); + return m_layouter->maximumScrollOffset() + m_statusBarOffset; } void KItemListView::setItemOffset(qreal offset) @@ -383,7 +386,7 @@ void KItemListView::setGeometry(const QRectF &rect) if (m_headerWidget->automaticColumnResizing()) { applyAutomaticColumnWidths(); } else { - const qreal requiredWidth = columnWidthsSum() + 2 * m_headerWidget->sidePadding(); + const qreal requiredWidth = m_headerWidget->leftPadding() + columnWidthsSum() + m_headerWidget->rightPadding(); const QSizeF dynamicItemSize(qMax(newSize.width(), requiredWidth), m_itemSize.height()); m_layouter->setItemSize(dynamicItemSize); } @@ -552,6 +555,9 @@ void KItemListView::scrollToItem(int index, ViewItemPosition viewItemPosition) const qreal headerHeight = m_headerWidget->size().height(); viewGeometry.adjust(0, headerHeight, 0, 0); } + if (m_statusBarOffset != 0) { + viewGeometry.adjust(0, 0, 0, -m_statusBarOffset); + } QRectF currentRect = itemRect(index); if (layoutDirection() == Qt::RightToLeft && scrollOrientation() == Qt::Horizontal) { @@ -743,6 +749,7 @@ void KItemListView::editRole(int index, const QByteArray &role) } m_editingRole = true; + m_controller->selectionManager()->setCurrentItem(index); widget->setEditedRole(role); connect(widget, &KItemListWidget::roleEditingCanceled, this, &KItemListView::slotRoleEditingCanceled); @@ -826,6 +833,16 @@ void KItemListView::paint(QPainter *painter, const QStyleOptionGraphicsItem *opt } } +void KItemListView::setStatusBarOffset(int offset) +{ + if (m_statusBarOffset != offset) { + m_statusBarOffset = offset; + if (m_layouter) { + m_layouter->setStatusBarOffset(offset); + } + } +} + QVariant KItemListView::itemChange(GraphicsItemChange change, const QVariant &value) { if (change == QGraphicsItem::ItemSceneHasChanged && scene()) { @@ -1244,11 +1261,6 @@ void KItemListView::slotItemsInserted(const KItemRangeList &itemRanges) if (useAlternateBackgrounds()) { updateAlternateBackgrounds(); } -#ifndef QT_NO_ACCESSIBILITY - if (QAccessible::isActive()) { // Announce that the count of items has changed. - static_cast(QAccessible::queryAccessibleInterface(this))->announceDescriptionChange(); - } -#endif } void KItemListView::slotItemsRemoved(const KItemRangeList &itemRanges) @@ -1367,11 +1379,6 @@ void KItemListView::slotItemsRemoved(const KItemRangeList &itemRanges) if (useAlternateBackgrounds()) { updateAlternateBackgrounds(); } -#ifndef QT_NO_ACCESSIBILITY - if (QAccessible::isActive()) { // Announce that the count of items has changed. - static_cast(QAccessible::queryAccessibleInterface(this))->announceDescriptionChange(); - } -#endif } void KItemListView::slotItemsMoved(const KItemRange &itemRange, const QList &movedToIndexes) @@ -1386,9 +1393,20 @@ void KItemListView::slotItemsMoved(const KItemRange &itemRange, const QList const int firstVisibleMovedIndex = qMax(firstVisibleIndex(), itemRange.index); const int lastVisibleMovedIndex = qMin(lastVisibleIndex(), itemRange.index + itemRange.count - 1); + /// Represents an item that was moved while being edited. + struct MovedEditedItem { + int movedToIndex; + QByteArray editedRole; + }; + std::optional movedEditedItem; for (int index = firstVisibleMovedIndex; index <= lastVisibleMovedIndex; ++index) { KItemListWidget *widget = m_visibleItems.value(index); if (widget) { + if (m_editingRole && !widget->editedRole().isEmpty()) { + movedEditedItem = {movedToIndexes[index - itemRange.index], widget->editedRole()}; + disconnectRoleEditingSignals(index); + m_editingRole = false; + } updateWidgetProperties(widget, index); initializeItemListWidget(widget); } @@ -1396,6 +1414,10 @@ void KItemListView::slotItemsMoved(const KItemRange &itemRange, const QList doLayout(NoAnimation); updateSiblingsInformation(); + + if (movedEditedItem) { + editRole(movedEditedItem->movedToIndex, movedEditedItem->editedRole); + } } void KItemListView::slotItemsChanged(const KItemRangeList &itemRanges, const QSet &roles) @@ -1429,15 +1451,7 @@ void KItemListView::slotItemsChanged(const KItemRangeList &itemRanges, const QSe updateVisibleGroupHeaders(); doLayout(NoAnimation); } - -#ifndef QT_NO_ACCESSIBILITY - QAccessibleTableModelChangeEvent ev(this, QAccessibleTableModelChangeEvent::DataChanged); - ev.setFirstRow(itemRange.index); - ev.setLastRow(itemRange.index + itemRange.count); - QAccessible::updateAccessibility(&ev); -#endif } - doLayout(NoAnimation); } @@ -1510,19 +1524,11 @@ void KItemListView::slotCurrentChanged(int current, int previous) KItemListWidget *currentWidget = m_visibleItems.value(current, nullptr); if (currentWidget) { currentWidget->setCurrent(true); - if (hasFocus() || (previousWidget && previousWidget->hasFocus())) { - currentWidget->setFocus(); // Mostly for accessibility, because keyboard events are handled correctly either way. - } } } #ifndef QT_NO_ACCESSIBILITY - if (QAccessible::isActive()) { - if (current >= 0) { - QAccessibleEvent accessibleFocusCurrentItemEvent(this, QAccessible::Focus); - accessibleFocusCurrentItemEvent.setChild(current); - QAccessible::updateAccessibility(&accessibleFocusCurrentItemEvent); - } - static_cast(QAccessible::queryAccessibleInterface(this))->announceDescriptionChange(); + if (current != previous && QAccessible::isActive()) { + static_cast(QAccessible::queryAccessibleInterface(this))->announceCurrentItem(); } #endif } @@ -1544,14 +1550,11 @@ void KItemListView::slotSelectionChanged(const KItemSet ¤t, const KItemSet // Let the screen reader announce "selected" or "not selected" for the active item. const bool wasSelected(previous.contains(index)); if (isSelected != wasSelected) { - QAccessibleEvent accessibleSelectionChangedEvent(this, QAccessible::Selection); + QAccessibleEvent accessibleSelectionChangedEvent(this, QAccessible::SelectionAdd); accessibleSelectionChangedEvent.setChild(index); QAccessible::updateAccessibility(&accessibleSelectionChangedEvent); } } - // Usually the below does not have an effect because the view will not have focus at this moment but one of its list items. Still we announce the - // change of the accessibility description just in case the user manually moved focus up by one. - static_cast(QAccessible::queryAccessibleInterface(this))->announceDescriptionChange(); #else } Q_UNUSED(previous) @@ -2400,7 +2403,7 @@ QHash KItemListView::preferredColumnWidths(const KItemRangeLi void KItemListView::applyColumnWidthsFromHeader() { // Apply the new size to the layouter - const qreal requiredWidth = columnWidthsSum() + 2 * m_headerWidget->sidePadding(); + const qreal requiredWidth = m_headerWidget->leftPadding() + columnWidthsSum() + m_headerWidget->rightPadding(); const QSizeF dynamicItemSize(qMax(size().width(), requiredWidth), m_itemSize.height()); m_layouter->setItemSize(dynamicItemSize); @@ -2417,7 +2420,7 @@ void KItemListView::updateWidgetColumnWidths(KItemListWidget *widget) for (const QByteArray &role : std::as_const(m_visibleRoles)) { widget->setColumnWidth(role, m_headerWidget->columnWidth(role)); } - widget->setSidePadding(m_headerWidget->sidePadding()); + widget->setSidePadding(m_headerWidget->leftPadding(), m_headerWidget->rightPadding()); } void KItemListView::updatePreferredColumnWidths(const KItemRangeList &itemRanges) @@ -2495,9 +2498,9 @@ void KItemListView::applyAutomaticColumnWidths() qreal firstColumnWidth = m_headerWidget->columnWidth(firstRole); QSizeF dynamicItemSize = m_itemSize; - 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. + qreal requiredWidth = m_headerWidget->leftPadding() + columnWidthsSum() + m_headerWidget->rightPadding(); + // By default we want 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