/**
* This file is part of the KDE project
- * Copyright (C) 2007 Rafael Fernández López <ereslibre@gmail.com>
+ * Copyright (C) 2007 Rafael Fernández López <ereslibre@kde.org>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
if (!flags)
return;
- selectionModel()->clear();
-
if (flags & QItemSelectionModel::Clear)
{
- d->lastSelection = QItemSelection();
+ if (!rect.intersects(d->categoryVisualRect(d->hoveredCategory)))
+ {
+ d->lastSelection = QItemSelection();
+ }
}
- QModelIndexList dirtyIndexes = d->intersectionSet(rect);
+ selectionModel()->clear();
- QItemSelection selection;
+ QModelIndexList dirtyIndexes = d->intersectionSet(rect);
if (!dirtyIndexes.count())
{
- if (d->lastSelection.count())
+ if (!d->lastSelection.isEmpty() &&
+ (rect.intersects(d->categoryVisualRect(d->hoveredCategory)) || d->mouseButtonPressed))
{
selectionModel()->select(d->lastSelection, flags);
}
return;
}
+ QItemSelection selection;
+
if (!d->mouseButtonPressed)
{
selection = QItemSelection(dirtyIndexes[0], dirtyIndexes[0]);
selection << QItemSelectionRange(first, last);
}
- if (d->lastSelection.count() && !d->mouseButtonPressed)
- {
- selection.merge(d->lastSelection, flags);
- }
- else if (d->lastSelection.count())
+ if (d->lastSelection.count())
{
- selection.merge(d->lastSelection, QItemSelectionModel::Select);
+ if ((selection.count() == 1) && (selection[0].indexes().count() == 1))
+ selection.merge(d->lastSelection, flags);
+ else
+ selection.merge(d->lastSelection, QItemSelectionModel::Select);
}
selectionModel()->select(selection, flags);
initialPressPosition.setX(initialPressPosition.x() + horizontalOffset());
QItemSelection selection;
+ QItemSelection deselection;
if (initialPressPosition == d->initialPressPosition)
{
{
QModelIndex selectIndex = index.model()->index(index.row(), 0);
- selection << QItemSelectionRange(selectIndex);
+ if (!d->lastSelection.contains(selectIndex))
+ {
+ selection << QItemSelectionRange(selectIndex);
+ }
+ else
+ {
+ deselection << QItemSelectionRange(selectIndex);
+ }
}
selectionModel()->select(selection, QItemSelectionModel::Select);
+ selectionModel()->select(deselection, QItemSelectionModel::Deselect);
break;
}
break;
}
- if (category == d->elementsInfo[d->proxyModel->mapToSource(current).row()].category)
+ if (category == d->elementsInfo[current.row()].category)
{
theCategory = category;
lastCategory = category;
}
}
-// ### FIXME !!!
-#if 0
+
switch (cursorAction)
{
case QAbstractItemView::MoveUp: {
- if (d->elementsInfo[d->proxyModel->mapToSource(current).row()].relativeOffsetToCategory >= elementsPerRow)
+ if (d->elementsInfo[current.row()].relativeOffsetToCategory >= elementsPerRow)
{
- int indexToMove = d->invertedElementDictionary[current.row()].row();
- indexToMove -= qMin(((d->elementsInfo[d->proxyModel->mapToSource(current).row()].relativeOffsetToCategory) + d->forcedSelectionPosition), elementsPerRow - d->forcedSelectionPosition + (d->elementsInfo[d->proxyModel->mapToSource(current).row()].relativeOffsetToCategory % elementsPerRow));
+ int indexToMove = current.row();
+ indexToMove -= qMin(((d->elementsInfo[current.row()].relativeOffsetToCategory) + d->forcedSelectionPosition), elementsPerRow - d->forcedSelectionPosition + (d->elementsInfo[current.row()].relativeOffsetToCategory % elementsPerRow));
- return d->elementDictionary[indexToMove];
+ return d->proxyModel->index(indexToMove, 0);
}
else
{
int lastCategoryLastRow = (d->categoriesIndexes[lastCategory].count() - 1) % elementsPerRow;
- int indexToMove = d->invertedElementDictionary[current.row()].row() - d->elementsInfo[d->proxyModel->mapToSource(current).row()].relativeOffsetToCategory;
+ int indexToMove = current.row() - d->elementsInfo[current.row()].relativeOffsetToCategory;
if (d->forcedSelectionPosition >= lastCategoryLastRow)
{
indexToMove -= qMin((lastCategoryLastRow - d->forcedSelectionPosition + 1), d->forcedSelectionPosition + elementsPerRow + 1);
}
- return d->elementDictionary[indexToMove];
+ return d->proxyModel->index(indexToMove, 0);
}
}
case QAbstractItemView::MoveDown: {
- if (d->elementsInfo[d->proxyModel->mapToSource(current).row()].relativeOffsetToCategory < (d->categoriesIndexes[theCategory].count() - 1 - ((d->categoriesIndexes[theCategory].count() - 1) % elementsPerRow)))
+ if (d->elementsInfo[current.row()].relativeOffsetToCategory < (d->categoriesIndexes[theCategory].count() - 1 - ((d->categoriesIndexes[theCategory].count() - 1) % elementsPerRow)))
{
- int indexToMove = d->invertedElementDictionary[current.row()].row();
- indexToMove += qMin(elementsPerRow, d->categoriesIndexes[theCategory].count() - 1 - d->elementsInfo[d->proxyModel->mapToSource(current).row()].relativeOffsetToCategory);
+ int indexToMove = current.row();
+ indexToMove += qMin(elementsPerRow, d->categoriesIndexes[theCategory].count() - 1 - d->elementsInfo[current.row()].relativeOffsetToCategory);
- return d->elementDictionary[indexToMove];
+ return d->proxyModel->index(indexToMove, 0);
}
else
{
int afterCategoryLastRow = qMin(elementsPerRow, d->categoriesIndexes[afterCategory].count());
- int indexToMove = d->invertedElementDictionary[current.row()].row() + (d->categoriesIndexes[theCategory].count() - d->elementsInfo[d->proxyModel->mapToSource(current).row()].relativeOffsetToCategory);
+ int indexToMove = current.row() + (d->categoriesIndexes[theCategory].count() - d->elementsInfo[current.row()].relativeOffsetToCategory);
if (d->forcedSelectionPosition >= afterCategoryLastRow)
{
indexToMove += qMin(d->forcedSelectionPosition, elementsPerRow);
}
- return d->elementDictionary[indexToMove];
+ return d->proxyModel->index(indexToMove, 0);
}
}
case QAbstractItemView::MoveLeft:
- d->forcedSelectionPosition = d->elementsInfo[d->proxyModel->mapToSource(d->elementDictionary[d->proxyModel->index(d->invertedElementDictionary[current.row()].row() - 1, 0).row()]).row()].relativeOffsetToCategory % elementsPerRow;
+ d->forcedSelectionPosition = d->elementsInfo[current.row() - 1].relativeOffsetToCategory % elementsPerRow;
if (d->forcedSelectionPosition < 0)
d->forcedSelectionPosition = (d->categoriesIndexes[theCategory].count() - 1) % elementsPerRow;
- return d->elementDictionary[d->proxyModel->index(d->invertedElementDictionary[current.row()].row() - 1, 0).row()];
+ return d->proxyModel->index(current.row() - 1, 0);
case QAbstractItemView::MoveRight:
- d->forcedSelectionPosition = d->elementsInfo[d->proxyModel->mapToSource(d->elementDictionary[d->proxyModel->index(d->invertedElementDictionary[current.row()].row() + 1, 0).row()]).row()].relativeOffsetToCategory % elementsPerRow;
+ d->forcedSelectionPosition = d->elementsInfo[current.row() + 1].relativeOffsetToCategory % elementsPerRow;
if (d->forcedSelectionPosition < 0)
d->forcedSelectionPosition = (d->categoriesIndexes[theCategory].count() - 1) % elementsPerRow;
- return d->elementDictionary[d->proxyModel->index(d->invertedElementDictionary[current.row()].row() + 1, 0).row()];
+ return d->proxyModel->index(current.row() + 1, 0);
default:
break;
}
-#endif
+
return QListView::moveCursor(cursorAction, modifiers);
}