X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ba6c853219c78e4e2a491d416b94e4e4c1aef591..6b42e7ba3b87af93d17f714d05ff2ddb09d13519:/src/klistview.cpp diff --git a/src/klistview.cpp b/src/klistview.cpp index e484c3fb3..347055df7 100644 --- a/src/klistview.cpp +++ b/src/klistview.cpp @@ -120,7 +120,6 @@ const QModelIndexList &KListView::Private::intersectionSet(const QRect &rect) } } - int j = 0; for (int i = middle; i < proxyModel->rowCount(); i++) { index = elementDictionary[proxyModel->index(i, 0)]; @@ -131,10 +130,9 @@ const QModelIndexList &KListView::Private::intersectionSet(const QRect &rect) // If we passed next item, stop searching for hits if (qMax(rect.bottomRight().y(), rect.topLeft().y()) < - indexVisualRect.topLeft().y()) + qMin(indexVisualRect.topLeft().y(), + indexVisualRect.bottomRight().y())) break; - - j++; } return intersectedIndexes; @@ -333,8 +331,7 @@ void KListView::Private::drawNewCategory(const QString &category, opt.direction = option.direction; opt.text = category; - if (option.rect.contains(listView->viewport()->mapFromGlobal(QCursor::pos())) && - !mouseButtonPressed) + if ((category == hoveredCategory) && !mouseButtonPressed) { const QPalette::ColorGroup group = option.state & QStyle::State_Enabled ? @@ -400,8 +397,8 @@ void KListView::Private::drawDraggedItems(QPainter *painter) option.state &= ~QStyle::State_MouseOver; foreach (const QModelIndex &index, listView->selectionModel()->selectedIndexes()) { - int dx = mousePosition.x() - initialPressPosition.x() + listView->horizontalOffset(); - int dy = mousePosition.y() - initialPressPosition.y() + listView->verticalOffset(); + const int dx = mousePosition.x() - initialPressPosition.x() + listView->horizontalOffset(); + const int dy = mousePosition.y() - initialPressPosition.y() + listView->verticalOffset(); option.rect = visualRect(index); option.rect.adjust(dx, dy, dx, dy); @@ -410,6 +407,30 @@ void KListView::Private::drawDraggedItems(QPainter *painter) } } +void KListView::Private::drawDraggedItems() +{ + int dx; + int dy; + QRect rectToUpdate; + QRect currentRect; + foreach (const QModelIndex &index, listView->selectionModel()->selectedIndexes()) + { + dx = mousePosition.x() - initialPressPosition.x() + listView->horizontalOffset(); + dy = mousePosition.y() - initialPressPosition.y() + listView->verticalOffset(); + + currentRect = visualRect(index); + currentRect.adjust(dx, dy, dx, dy); + + rectToUpdate = rectToUpdate.united(currentRect); + } + + listView->viewport()->update(lastDraggedItemsRect); + + lastDraggedItemsRect = rectToUpdate; + + listView->viewport()->update(rectToUpdate); +} + //============================================================================== @@ -614,19 +635,6 @@ void KListView::paintEvent(QPaintEvent *event) itemDelegate(index)->paint(&painter, option, index); } - // Redraw categories - QStyleOptionViewItem otherOption; - foreach (const QString &category, d->categories) - { - otherOption = option; - otherOption.rect = d->categoryVisualRect(category); - - if (otherOption.rect.intersects(area)) - { - d->drawNewCategory(category, otherOption, &painter); - } - } - if (d->mouseButtonPressed && !d->isDragging) { QPoint start, end, initialPressPosition; @@ -658,6 +666,19 @@ void KListView::paintEvent(QPaintEvent *event) painter.restore(); } + // Redraw categories + QStyleOptionViewItem otherOption; + foreach (const QString &category, d->categories) + { + otherOption = option; + otherOption.rect = d->categoryVisualRect(category); + + if (otherOption.rect.intersects(area)) + { + d->drawNewCategory(category, otherOption, &painter); + } + } + if (d->isDragging && !d->dragLeftViewport) { painter.setOpacity(0.5); @@ -753,14 +774,10 @@ void KListView::setSelection(const QRect &rect, } selectionModel()->select(selection, flags); - - viewport()->update(); } void KListView::mouseMoveEvent(QMouseEvent *event) { - d->mousePosition = event->pos(); - QListView::mouseMoveEvent(event); if ((viewMode() != KListView::IconMode) || !d->proxyModel || @@ -769,9 +786,50 @@ void KListView::mouseMoveEvent(QMouseEvent *event) return; } - event->accept(); + d->mousePosition = event->pos(); + d->hoveredCategory = QString(); - viewport()->update(); + // Redraw categories + foreach (const QString &category, d->categories) + { + if (d->categoryVisualRect(category).intersects(QRect(event->pos(), event->pos()))) + { + d->hoveredCategory = category; + } + + viewport()->update(d->categoryVisualRect(category)); + } + + QRect rect; + if (d->mouseButtonPressed && !d->isDragging) + { + QPoint start, end, initialPressPosition; + + initialPressPosition = d->initialPressPosition; + + initialPressPosition.setY(initialPressPosition.y() - verticalOffset()); + initialPressPosition.setX(initialPressPosition.x() - horizontalOffset()); + + if (d->initialPressPosition.x() > d->mousePosition.x() || + d->initialPressPosition.y() > d->mousePosition.y()) + { + start = d->mousePosition; + end = initialPressPosition; + } + else + { + start = initialPressPosition; + end = d->mousePosition; + } + + viewport()->update(d->lastSelectionRect); + + rect = QRect(start, end).intersected(viewport()->rect().adjusted(-16, -16, 16, 16)); + + viewport()->update(rect); + + d->lastSelectionRect = rect; + } } void KListView::mousePressEvent(QMouseEvent *event) @@ -784,8 +842,6 @@ void KListView::mousePressEvent(QMouseEvent *event) return; } - event->accept(); - d->dragLeftViewport = false; if (event->button() == Qt::LeftButton) @@ -798,8 +854,6 @@ void KListView::mousePressEvent(QMouseEvent *event) d->initialPressPosition.setX(d->initialPressPosition.x() + horizontalOffset()); } - - viewport()->update(); } void KListView::mouseReleaseEvent(QMouseEvent *event) @@ -812,8 +866,6 @@ void KListView::mouseReleaseEvent(QMouseEvent *event) return; } - event->accept(); - d->mouseButtonPressed = false; QPoint initialPressPosition = viewport()->mapFromGlobal(QCursor::pos()); @@ -842,24 +894,24 @@ void KListView::mouseReleaseEvent(QMouseEvent *event) d->lastSelection = selectionModel()->selection(); - viewport()->update(); + if (d->hovered.isValid()) + viewport()->update(d->visualRect(d->hovered)); + else if (!d->hoveredCategory.isEmpty()) + viewport()->update(d->categoryVisualRect(d->hoveredCategory)); } void KListView::leaveEvent(QEvent *event) { QListView::leaveEvent(event); - d->hovered = QModelIndex(); - if ((viewMode() != KListView::IconMode) || !d->proxyModel || !d->itemCategorizer) { return; } - event->accept(); - - viewport()->update(); + d->hovered = QModelIndex(); + d->hoveredCategory = QString(); } void KListView::startDrag(Qt::DropActions supportedActions) @@ -872,16 +924,15 @@ void KListView::startDrag(Qt::DropActions supportedActions) void KListView::dragMoveEvent(QDragMoveEvent *event) { - QListView::dragMoveEvent(event); - - d->mousePosition = event->pos(); - if ((viewMode() != KListView::IconMode) || !d->proxyModel || !d->itemCategorizer) { + QListView::dragMoveEvent(event); return; } + d->mousePosition = event->pos(); + if (d->mouseButtonPressed) { d->isDragging = true; @@ -893,9 +944,7 @@ void KListView::dragMoveEvent(QDragMoveEvent *event) d->dragLeftViewport = false; - event->accept(); - - viewport()->update(); + d->drawDraggedItems(); } void KListView::dragLeaveEvent(QDragLeaveEvent *event) @@ -909,10 +958,6 @@ void KListView::dragLeaveEvent(QDragLeaveEvent *event) } d->dragLeftViewport = true; - - event->accept(); - - viewport()->update(); } QModelIndex KListView::moveCursor(CursorAction cursorAction, @@ -946,6 +991,8 @@ void KListView::rowsInsertedArtifficial(const QModelIndex &parent, int start, int end) { + Q_UNUSED(parent); + d->lastSelection = QItemSelection(); d->elementsInfo.clear(); d->elementsPosition.clear();