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!
}
}
+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();
if (selRect.isNull()) {
clearSelection();
+ 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;
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 intersectsSelectedRect = currIndexRect.intersects(selRect);
bool needToToggleItem = (currentlySelected && !intersectsSelectedRect) || (!currentlySelected && intersectsSelectedRect);
currIndex.parent() != toggleIndexRangeBegin.parent());
if (commitToggleIndexRange) {
itemsToToggle.select(toggleIndexRangeBegin, lastIndex );
- formingToggleIndexRange = false;
+ // Immediately start a new range with currIndex?
+ if (needToToggleItem) {
+ toggleIndexRangeBegin = currIndex;
+ }
+ formingToggleIndexRange = needToToggleItem;
}
// next item
lastIndex = currIndex;
currIndex = nextIndex;
} while (!allItemsInBoundDone);
-
+
selectionModel()->select(itemsToToggle, QItemSelectionModel::Toggle);
m_band.oldSelectionRect = selRect;