X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/6c91dfa47ee703b2fbf2f7ad3e0bec6f32a6d5e8..f0749ee42ccb2e0a7caee165b9934de8e61bfcbc:/src/kitemviews/kitemlistcontroller.cpp diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 994812b1f..3d83bc914 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -17,6 +17,7 @@ #include #include +#include #include #include @@ -724,7 +725,7 @@ bool KItemListController::dragMoveEvent(QGraphicsSceneDragDropEvent* event, cons KItemListWidget* oldHoveredWidget = hoveredWidget(); const QPointF pos = transform.map(event->pos()); - KItemListWidget* newHoveredWidget = widgetForPos(pos); + KItemListWidget* newHoveredWidget = widgetForDropPos(pos); if (oldHoveredWidget != newHoveredWidget) { m_autoActivationTimer->stop(); @@ -806,7 +807,12 @@ bool KItemListController::dropEvent(QGraphicsSceneDragDropEvent* event, const QT Q_EMIT aboveItemDropEvent(dropAboveIndex, event); } else if (!event->mimeData()->hasFormat(m_model->blacklistItemDropEventMimeType())) { // Something has been dropped on an item or on an empty part of the view. - Q_EMIT itemDropEvent(m_view->itemAt(pos).value_or(-1), event); + const KItemListWidget *receivingWidget = widgetForDropPos(pos); + if (receivingWidget) { + Q_EMIT itemDropEvent(receivingWidget->index(), event); + } else { + Q_EMIT itemDropEvent(-1, event); + } } QAccessibleEvent accessibilityEvent(view(), QAccessible::DragDropEnd); @@ -1313,10 +1319,11 @@ void KItemListController::startDragging() return; } - QMimeData* data = m_model->createMimeData(selectedItems); + QMimeData *data = m_model->createMimeData(selectedItems); if (!data) { return; } + KUrlMimeData::exportUrlsToPortal(data); // The created drag object will be owned and deleted // by QApplication::activeWindow(). @@ -1364,6 +1371,21 @@ KItemListWidget* KItemListController::widgetForPos(const QPointF& pos) const return nullptr; } +KItemListWidget* KItemListController::widgetForDropPos(const QPointF& pos) const +{ + Q_ASSERT(m_view); + + const auto widgets = m_view->visibleItemListWidgets(); + for (KItemListWidget* widget : widgets) { + const QPointF mappedPos = widget->mapFromItem(m_view, pos); + if (widget->contains(mappedPos)) { + return widget; + } + } + + return nullptr; +} + void KItemListController::updateKeyboardAnchor() { const bool validAnchor = m_keyboardAnchorIndex >= 0 && @@ -1579,6 +1601,7 @@ bool KItemListController::onPress(const QPoint& screenPos, const QPointF& pos, c } if (m_pressedIndex.has_value()) { + // The hover highlight area of an item is being pressed. m_selectionManager->setCurrentItem(m_pressedIndex.value()); const auto row = m_view->m_visibleItems.value(m_pressedIndex.value()); // anything outside of row.contains() will be the empty region of the row rect const bool hitTargetIsRowEmptyRegion = !row->contains(row->mapFromItem(m_view, pos)); @@ -1587,8 +1610,15 @@ bool KItemListController::onPress(const QPoint& screenPos, const QPointF& pos, c bool createRubberBand = (hitTargetIsRowEmptyRegion && m_selectionManager->selectedItems().isEmpty()); if (rightClick && hitTargetIsRowEmptyRegion) { - // we got a right click outside the text rect, default to action on the current url and not the pressed item - Q_EMIT itemContextMenuRequested(m_pressedIndex.value(), screenPos); + // We have a right click outside the icon and text rect but within the hover highlight area + // but it is unclear if this means that a selection rectangle for an item was clicked or the background of the view. + if (m_selectionManager->selectedItems().contains(m_pressedIndex.value())) { + // The selection rectangle for an item was clicked + Q_EMIT itemContextMenuRequested(m_pressedIndex.value(), screenPos); + } else { + row->setHovered(false); // Removes the hover highlight so the context menu doesn't look like it applies to the row. + Q_EMIT viewContextMenuRequested(screenPos); + } return true; }