: listView(listView)
, itemCategorizer(0)
, mouseButtonPressed(false)
+ , isDragging(false)
, proxyModel(0)
, lastIndex(QModelIndex())
{
listView->verticalScrollBar()->setRange(0, lastItemBottom);
}
+void KListView::Private::drawDraggedItems(QPainter *painter)
+{
+ QStyleOptionViewItemV3 option = listView->viewOptions();
+ option.state &= ~QStyle::State_MouseOver;
+ foreach (const QModelIndex &index, listView->selectionModel()->selectedIndexes())
+ {
+ int dx = mousePosition.x() - initialPressPosition.x();
+ int dy = mousePosition.y() - initialPressPosition.y();
+
+ option.rect = visualRect(index);
+ option.rect.adjust(dx, dy, dx, dy);
+
+ listView->itemDelegate(index)->paint(painter, option, index);
+ }
+}
+
//==============================================================================
QRect KListView::visualRect(const QModelIndex &index) const
{
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
return QListView::visualRect(index);
QModelIndex KListView::indexAt(const QPoint &point) const
{
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
return QListView::indexAt(point);
{
QListView::reset();
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
return;
void KListView::paintEvent(QPaintEvent *event)
{
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
QListView::paintEvent(event);
}
}
- if (d->mouseButtonPressed)
+ if (d->mouseButtonPressed && !d->isDragging)
{
QPoint start, end, initialPressPosition;
painter.restore();
}
+ if (d->isDragging)
+ d->drawDraggedItems(&painter);
+
painter.restore();
}
{
QListView::resizeEvent(event);
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
return;
void KListView::setSelection(const QRect &rect,
QItemSelectionModel::SelectionFlags flags)
{
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
QListView::setSelection(rect, flags);
d->mousePosition = event->pos();
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
return;
{
QListView::mousePressEvent(event);
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
return;
d->mouseButtonPressed = false;
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
return;
d->hovered = QModelIndex();
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
return;
void KListView::startDrag(Qt::DropActions supportedActions)
{
+ QListView::startDrag(supportedActions);
+
+ d->isDragging = false;
d->mouseButtonPressed = false;
+}
- QListView::startDrag(supportedActions);
+void KListView::dragMoveEvent(QDragMoveEvent *event)
+{
+ QListView::dragMoveEvent(event);
+
+ d->mousePosition = event->pos();
+
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
+ !d->itemCategorizer)
+ {
+ return;
+ }
+
+ if (d->mouseButtonPressed)
+ {
+ d->isDragging = true;
+ }
+ else
+ {
+ d->isDragging = false;
+ }
+
+ event->accept();
+
+ viewport()->update();
}
void KListView::rowsInserted(const QModelIndex &parent,
{
QListView::rowsInserted(parent, start, end);
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
return;
}
void KListView::rowsInsertedArtifficial(const QModelIndex &parent,
- int start,
- int end)
+ int start,
+ int end)
{
d->elementsInfo.clear();
d->elementsPosition.clear();
void KListView::updateGeometries()
{
- if ((viewMode() == KListView::ListMode) || !d->proxyModel ||
+ if ((viewMode() != KListView::IconMode) || !d->proxyModel ||
!d->itemCategorizer)
{
QListView::updateGeometries();