m_selectionManager(0),
m_font(),
m_decorationSize(),
- m_band()
+ m_band(),
+ m_ignoreScrollTo(false)
{
const DetailsModeSettings* settings = DolphinSettings::instance().detailsModeSettings();
Q_ASSERT(settings != 0);
clearSelection();
}
- // restore the current index, other columns are handled as viewport area
+ // restore the current index, other columns are handled as viewport area.
+ // setCurrentIndex(...) implicitly calls scrollTo(...), which we want to ignore.
+ m_ignoreScrollTo = true;
selectionModel()->setCurrentIndex(current, QItemSelectionModel::Current);
-
+ m_ignoreScrollTo = false;
if ((event->button() == Qt::LeftButton) && !m_expandingTogglePressed) {
// Inform Qt about what we are doing - otherwise it starts dragging items around!
const QPoint scrollPos(horizontalScrollBar()->value(), verticalScrollBar()->value());
m_band.origin = event->pos() + pos + scrollPos;
m_band.destination = m_band.origin;
+ m_band.originalSelection = selectionModel()->selection();
}
}
}
}
}
+void DolphinDetailsView::scrollTo(const QModelIndex & index, ScrollHint hint)
+{
+ if (m_ignoreScrollTo)
+ return;
+ QTreeView::scrollTo(index, hint);
+}
+
void DolphinDetailsView::setSortIndicatorSection(DolphinView::Sorting sorting)
{
QHeaderView* headerView = header();
const int nameColumnX = header()->sectionPosition(DolphinModel::Name);
const int nameColumnWidth = header()->sectionSize(DolphinModel::Name);
QRect selRect = elasticBandRect().normalized();
- QRect nameColumnRect(nameColumnX, selRect.y(), nameColumnWidth, selRect.height());
- selRect = nameColumnRect.intersect(selRect).normalized();
+ QRect nameColumnArea(nameColumnX, selRect.y(), nameColumnWidth, selRect.height());
+ selRect = nameColumnArea.intersect(selRect).normalized();
if (selRect.isNull()) {
- clearSelection();
+ selectionModel()->select(m_band.originalSelection, QItemSelectionModel::ClearAndSelect);
+ m_band.ignoreOldInfo = true;
return;
}
if (!m_band.ignoreOldInfo) {
// Do some quick checks to see if we can rule out the need to
// update the selection.
- bool coveringSameRows = true;
Q_ASSERT(uniformRowHeights());
QModelIndex dummyIndex = model()->index(0, 0);
if (!dummyIndex.isValid()) {
// No items in the model presumably.
return;
}
- const int rowHeight = QTreeView::rowHeight(dummyIndex);
// If the elastic band does not cover the same rows as before, we'll
// need to re-check, and also invalidate the old item distances.
- if (selRect.top() / rowHeight != m_band.oldSelectionRect.top() / rowHeight) {
- coveringSameRows = false;
- } else if (selRect.bottom() / rowHeight != m_band.oldSelectionRect.bottom() / rowHeight) {
- coveringSameRows = false;
- }
-
+ const int rowHeight = QTreeView::rowHeight(dummyIndex);
+ const bool coveringSameRows =
+ (selRect.top() / rowHeight == m_band.oldSelectionRect.top() / rowHeight) &&
+ (selRect.bottom() / rowHeight == m_band.oldSelectionRect.bottom() / rowHeight);
if (coveringSameRows) {
// Covering the same rows, but have we moved far enough horizontally
// that we might have (de)selected some other items?
((selRect.right() < oldSelRect.right()) &&
(selRect.left() >= m_band.insideNearestRightEdge)) ||
((selRect.right() > oldSelRect.right()) &&
- (selRect.right() >= m_band.outsideNearestRightEdge));
+ (selRect.right() >= m_band.outsideNearestRightEdge));
if (!itemSelectionChanged) {
return;
}
// Do the selection from scratch. Force a update of the horizontal distances info.
- m_band.insideNearestLeftEdge = nameColumnX + nameColumnWidth + 1;;
+ m_band.insideNearestLeftEdge = nameColumnX + nameColumnWidth + 1;
m_band.insideNearestRightEdge = nameColumnX - 1;
m_band.outsideNearestLeftEdge = nameColumnX - 1;
m_band.outsideNearestRightEdge = nameColumnX + nameColumnWidth + 1;
} else {
startIndex = model()->index(startIndex.row(), KDirModel::Name);
}
+ if (!startIndex.isValid()) {
+ selectionModel()->select(m_band.originalSelection, QItemSelectionModel::ClearAndSelect);
+ m_band.ignoreOldInfo = true;
+ return;
+ }
// Go through all indexes between the top and bottom of boundingRect, and
// update the selection.
QModelIndex toggleIndexRangeBegin = QModelIndex();
do {
- QRect currIndexRect = visualRect(currIndex);
- const QString name = m_controller->itemForIndex(currIndex).name();
- currIndexRect.setWidth(DolphinFileItemDelegate::nameColumnWidth(name, viewOptions()));
+ QRect currIndexRect = nameColumnRect(currIndex);
// Update some optimisation info as we go.
const int cr = currIndexRect.right();
const int cl = currIndexRect.left();
const int sl = selRect.left();
const int sr = selRect.right();
- // "The right edge of the name is outside of the rect but nearer than m_outsideNearestLeft", etc
+ // "The right edge of the name is outside of the rect but nearer than m_outsideNearestLeft", etc
if ((cr < sl && cr > m_band.outsideNearestLeftEdge)) {
m_band.outsideNearestLeftEdge = cr;
}
if ((cr >= sl && cr <= sr && cr < m_band.insideNearestLeftEdge)) {
m_band.insideNearestLeftEdge = cr;
}
-
+
bool currentlySelected = selectionModel()->isSelected(currIndex);
+ bool originallySelected = m_band.originalSelection.contains(currIndex);
bool intersectsSelectedRect = currIndexRect.intersects(selRect);
- bool needToToggleItem = (currentlySelected && !intersectsSelectedRect) || (!currentlySelected && intersectsSelectedRect);
+ bool shouldBeSelected = (intersectsSelectedRect && !originallySelected) || (!intersectsSelectedRect && originallySelected);
+ bool needToToggleItem = (currentlySelected && !shouldBeSelected) || (!currentlySelected && shouldBeSelected);
if (needToToggleItem && !formingToggleIndexRange) {
toggleIndexRangeBegin = currIndex;
formingToggleIndexRange = true;
allItemsInBoundDone ||
currIndex.parent() != toggleIndexRangeBegin.parent());
if (commitToggleIndexRange) {
- itemsToToggle.select(toggleIndexRangeBegin, lastIndex );
- formingToggleIndexRange = false;
+ if (!allItemsInBoundDone) {
+ itemsToToggle.select(toggleIndexRangeBegin, lastIndex);
+ // Need to start a new range immediately with currIndex?
+ if (needToToggleItem)
+ toggleIndexRangeBegin = currIndex;
+ }
+ else {
+ // Final item in the bounds. Is it also the beginning of a range?
+ if (toggleIndexRangeBegin == currIndex) {
+ itemsToToggle.select(currIndex, currIndex);
+ }
+ else {
+ itemsToToggle.select(toggleIndexRangeBegin, lastIndex);
+ }
+ }
+ formingToggleIndexRange = needToToggleItem;
}
// next item
lastIndex = currIndex;
currIndex = nextIndex;
} while (!allItemsInBoundDone);
-
+
selectionModel()->select(itemsToToggle, QItemSelectionModel::Toggle);
m_band.oldSelectionRect = selRect;
QRect rect = visualRect(index);
const KFileItem item = m_controller->itemForIndex(index);
if (!item.isNull()) {
- const int width = DolphinFileItemDelegate::nameColumnWidth(item.name(), viewOptions());
+ const int width = DolphinFileItemDelegate::nameColumnWidth(item.text(), viewOptions());
rect.setWidth(width);
}