X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/8fea48eb445d893170a62619df8636c5b4c582b7..4addf7949364cf2c3108ed4fa6ffae4cffd007ce:/src/kcategorizedview.cpp diff --git a/src/kcategorizedview.cpp b/src/kcategorizedview.cpp index d612f4b1c..217fef10f 100644 --- a/src/kcategorizedview.cpp +++ b/src/kcategorizedview.cpp @@ -126,15 +126,23 @@ QRect KCategorizedView::Private::visualRectInViewport(const QModelIndex &index) QRect retRect; - if (listView->layoutDirection() == Qt::LeftToRight) + if (listView->flow() == QListView::LeftToRight) { - retRect = QRect(listView->spacing(), listView->spacing() * 2 + - categoryDrawer->categoryHeight(listView->viewOptions()), 0, 0); + if (listView->layoutDirection() == Qt::LeftToRight) + { + retRect = QRect(listView->spacing(), listView->spacing() * 2 + + categoryDrawer->categoryHeight(index, listView->viewOptions()), 0, 0); + } + else + { + retRect = QRect(listView->viewport()->width() - listView->spacing(), listView->spacing() * 2 + + categoryDrawer->categoryHeight(index, listView->viewOptions()), 0, 0); + } } else { - retRect = QRect(listView->viewport()->width() - listView->spacing(), listView->spacing() * 2 + - categoryDrawer->categoryHeight(listView->viewOptions()), 0, 0); + retRect = QRect(listView->spacing(), listView->spacing() * 2 + + categoryDrawer->categoryHeight(index, listView->viewOptions()), 0, 0); } int viewportWidth = listView->viewport()->width() - listView->spacing(); @@ -142,37 +150,61 @@ QRect KCategorizedView::Private::visualRectInViewport(const QModelIndex &index) int itemHeight; int itemWidth; - if (listView->gridSize().isEmpty()) + if (listView->gridSize().isEmpty() && (listView->flow() == QListView::LeftToRight)) { itemHeight = biggestItemSize.height(); itemWidth = biggestItemSize.width(); } - else + else if (listView->flow() == QListView::LeftToRight) { itemHeight = listView->gridSize().height(); itemWidth = listView->gridSize().width(); } + else if (listView->gridSize().isEmpty() && (listView->flow() == QListView::TopToBottom)) + { + itemHeight = biggestItemSize.height(); + itemWidth = listView->viewport()->width() - listView->spacing() * 2; + } + else + { + itemHeight = listView->gridSize().height(); + itemWidth = listView->gridSize().width() - listView->spacing() * 2; + } int itemWidthPlusSeparation = listView->spacing() + itemWidth; + if (!itemWidthPlusSeparation) + itemWidthPlusSeparation++; int elementsPerRow = viewportWidth / itemWidthPlusSeparation; if (!elementsPerRow) elementsPerRow++; - int column = elementsInfo[index.row()].relativeOffsetToCategory % elementsPerRow; - int row = elementsInfo[index.row()].relativeOffsetToCategory / elementsPerRow; + int column; + int row; - if (listView->layoutDirection() == Qt::LeftToRight) + if (listView->flow() == QListView::LeftToRight) { - retRect.setLeft(retRect.left() + column * listView->spacing() + - column * itemWidth); + column = elementsInfo[index.row()].relativeOffsetToCategory % elementsPerRow; + row = elementsInfo[index.row()].relativeOffsetToCategory / elementsPerRow; + + if (listView->layoutDirection() == Qt::LeftToRight) + { + retRect.setLeft(retRect.left() + column * listView->spacing() + + column * itemWidth); + } + else + { + retRect.setLeft(retRect.right() - column * listView->spacing() - + column * itemWidth - itemWidth); + + retRect.setRight(retRect.right() - column * listView->spacing() - + column * itemWidth); + } } else { - retRect.setLeft(retRect.right() - column * listView->spacing() - - column * itemWidth - itemWidth); - - retRect.setRight(retRect.right() - column * listView->spacing() - - column * itemWidth); + elementsPerRow = 1; + column = elementsInfo[index.row()].relativeOffsetToCategory % elementsPerRow; + row = elementsInfo[index.row()].relativeOffsetToCategory / elementsPerRow; } foreach (const QString &category, categories) @@ -189,7 +221,7 @@ QRect KCategorizedView::Private::visualRectInViewport(const QModelIndex &index) retRect.setTop(retRect.top() + (rowsInt * itemHeight) + - categoryDrawer->categoryHeight(listView->viewOptions()) + + categoryDrawer->categoryHeight(index, listView->viewOptions()) + listView->spacing() * 2); if (listView->gridSize().isEmpty()) @@ -225,8 +257,7 @@ QRect KCategorizedView::Private::visualRectInViewport(const QModelIndex &index) return retRect; } -QRect KCategorizedView::Private::visualCategoryRectInViewport(const QString &category) - const +QRect KCategorizedView::Private::visualCategoryRectInViewport(const QString &category) const { QRect retRect(listView->spacing(), listView->spacing(), @@ -260,6 +291,11 @@ QRect KCategorizedView::Private::visualCategoryRectInViewport(const QString &cat if (!elementsPerRow) elementsPerRow++; + if (listView->flow() == QListView::TopToBottom) + { + elementsPerRow = 1; + } + foreach (const QString &itCategory, categories) { if (itCategory == category) @@ -273,7 +309,7 @@ QRect KCategorizedView::Private::visualCategoryRectInViewport(const QString &cat retRect.setTop(retRect.top() + (rowsInt * itemHeight) + - categoryDrawer->categoryHeight(listView->viewOptions()) + + categoryDrawer->categoryHeight(index, listView->viewOptions()) + listView->spacing() * 2); if (listView->gridSize().isEmpty()) @@ -283,7 +319,7 @@ QRect KCategorizedView::Private::visualCategoryRectInViewport(const QString &cat } } - retRect.setHeight(categoryDrawer->categoryHeight(listView->viewOptions())); + retRect.setHeight(categoryDrawer->categoryHeight(index, listView->viewOptions())); return retRect; } @@ -365,19 +401,21 @@ void KCategorizedView::Private::drawNewCategory(const QModelIndex &index, optionCopy.state &= ~QStyle::State_Selected; - if ((category == hoveredCategory) && !mouseButtonPressed) - { - optionCopy.state |= QStyle::State_MouseOver; - } - else if ((category == hoveredCategory) && mouseButtonPressed) - { - QPoint initialPressPosition = listView->viewport()->mapFromGlobal(QCursor::pos()); - initialPressPosition.setY(initialPressPosition.y() + listView->verticalOffset()); - initialPressPosition.setX(initialPressPosition.x() + listView->horizontalOffset()); - - if (initialPressPosition == this->initialPressPosition) + if ((listView->selectionMode() != SingleSelection) && (listView->selectionMode() != NoSelection)) { + if ((category == hoveredCategory) && !mouseButtonPressed) { - optionCopy.state |= QStyle::State_Selected; + optionCopy.state |= QStyle::State_MouseOver; + } + else if ((category == hoveredCategory) && mouseButtonPressed) + { + QPoint initialPressPosition = listView->viewport()->mapFromGlobal(QCursor::pos()); + initialPressPosition.setY(initialPressPosition.y() + listView->verticalOffset()); + initialPressPosition.setX(initialPressPosition.x() + listView->horizontalOffset()); + + if (initialPressPosition == this->initialPressPosition) + { + optionCopy.state |= QStyle::State_Selected; + } } } @@ -394,7 +432,7 @@ void KCategorizedView::Private::updateScrollbars() QModelIndex lastIndex = categoriesIndexes.isEmpty() ? QModelIndex() : categoriesIndexes[categories.last()].last(); int lastItemBottom = cachedRectIndex(lastIndex).top() + - listView->spacing() + (listView->gridSize().isEmpty() ? 0 : listView->gridSize().height()) - listView->viewport()->height(); + listView->spacing() + (listView->gridSize().isEmpty() ? biggestItemSize.height() : listView->gridSize().height()) - listView->viewport()->height(); listView->horizontalScrollBar()->setRange(0, 0); @@ -424,8 +462,7 @@ void KCategorizedView::Private::drawDraggedItems(QPainter *painter) void KCategorizedView::Private::layoutChanged(bool forceItemReload) { - if ((listView->viewMode() == KCategorizedView::IconMode) && proxyModel && - categoryDrawer && proxyModel->isCategorizedModel() && + if (proxyModel && categoryDrawer && proxyModel->isCategorizedModel() && ((forceItemReload || (modelSortRole != proxyModel->sortRole()) || (modelSortColumn != proxyModel->sortColumn()) || @@ -445,8 +482,7 @@ void KCategorizedView::Private::layoutChanged(bool forceItemReload) modelCategorized = proxyModel->isCategorizedModel(); } } - else if ((listView->viewMode() == KCategorizedView::IconMode) && proxyModel && - categoryDrawer && proxyModel->isCategorizedModel()) + else if (proxyModel && categoryDrawer && proxyModel->isCategorizedModel()) { updateScrollbars(); } @@ -483,6 +519,8 @@ KCategorizedView::KCategorizedView(QWidget *parent) : QListView(parent) , d(new Private(this)) { + setHorizontalScrollMode(QAbstractItemView::ScrollPerPixel); + setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); } KCategorizedView::~KCategorizedView() @@ -564,8 +602,7 @@ void KCategorizedView::setModel(QAbstractItemModel *model) QRect KCategorizedView::visualRect(const QModelIndex &index) const { - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) { return QListView::visualRect(index); } @@ -647,8 +684,7 @@ void KCategorizedView::setCategoryDrawer(KCategoryDrawer *categoryDrawer) QModelIndex KCategorizedView::indexAt(const QPoint &point) const { - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) { return QListView::indexAt(point); } @@ -662,8 +698,6 @@ QModelIndex KCategorizedView::indexAt(const QPoint &point) const index = item[0]; } - d->hovered = index; - return index; } @@ -688,8 +722,7 @@ void KCategorizedView::reset() void KCategorizedView::paintEvent(QPaintEvent *event) { - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) { QListView::paintEvent(event); return; @@ -744,7 +777,10 @@ void KCategorizedView::paintEvent(QPaintEvent *event) option.state |= QStyle::State_Editing; } - if ((index == d->hovered) && !d->mouseButtonPressed && (this->state() != QAbstractItemView::DraggingState)) + // we are only interested to give the mouse over feedback when no + // dragging is happening (ereslibre) + if ((index == d->hovered) && !d->mouseButtonPressed && + (this->state() == QAbstractItemView::NoState)) option.state |= QStyle::State_MouseOver; else option.state &= ~QStyle::State_MouseOver; @@ -773,39 +809,42 @@ void KCategorizedView::paintEvent(QPaintEvent *event) else if (intersectedInThePast) { break; // the visible area has been finished, we don't need to keep asking, the rest won't intersect - // this is doable because we know that categories are correctly ordered on the list + // this is doable because we know that categories are correctly ordered on the list } } - if (d->mouseButtonPressed && !d->isDragging) + if ((selectionMode() != SingleSelection) && (selectionMode() != NoSelection)) { - QPoint start, end, initialPressPosition; + if (d->mouseButtonPressed && !d->isDragging) + { + QPoint start, end, initialPressPosition; - initialPressPosition = d->initialPressPosition; + initialPressPosition = d->initialPressPosition; - initialPressPosition.setY(initialPressPosition.y() - verticalOffset()); - initialPressPosition.setX(initialPressPosition.x() - horizontalOffset()); + 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; - } + if (d->initialPressPosition.x() > d->mousePosition.x() || + d->initialPressPosition.y() > d->mousePosition.y()) + { + start = d->mousePosition; + end = initialPressPosition; + } + else + { + start = initialPressPosition; + end = d->mousePosition; + } - QStyleOptionRubberBand yetAnotherOption; - yetAnotherOption.initFrom(this); - yetAnotherOption.shape = QRubberBand::Rectangle; - yetAnotherOption.opaque = false; - yetAnotherOption.rect = QRect(start, end).intersected(viewport()->rect().adjusted(-16, -16, 16, 16)); - painter.save(); - style()->drawControl(QStyle::CE_RubberBand, &yetAnotherOption, &painter); - painter.restore(); + QStyleOptionRubberBand yetAnotherOption; + yetAnotherOption.initFrom(this); + yetAnotherOption.shape = QRubberBand::Rectangle; + yetAnotherOption.opaque = false; + yetAnotherOption.rect = QRect(start, end).intersected(viewport()->rect().adjusted(-16, -16, 16, 16)); + painter.save(); + style()->drawControl(QStyle::CE_RubberBand, &yetAnotherOption, &painter); + painter.restore(); + } } if (d->isDragging && !d->dragLeftViewport) @@ -826,8 +865,7 @@ void KCategorizedView::resizeEvent(QResizeEvent *event) d->categoriesPosition.clear(); d->forcedSelectionPosition = 0; - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) { return; } @@ -838,8 +876,7 @@ void KCategorizedView::resizeEvent(QResizeEvent *event) void KCategorizedView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags flags) { - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) { QListView::setSelection(rect, flags); return; @@ -935,6 +972,8 @@ void KCategorizedView::setSelection(const QRect &rect, } int itemWidthPlusSeparation = spacing() + itemWidth; + if (!itemWidthPlusSeparation) + itemWidthPlusSeparation++; int elementsPerRow = viewportWidth / itemWidthPlusSeparation; if (!elementsPerRow) elementsPerRow++; @@ -980,12 +1019,22 @@ void KCategorizedView::mouseMoveEvent(QMouseEvent *event) { QListView::mouseMoveEvent(event); - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) { return; } + QModelIndexList item = d->intersectionSet(QRect(event->pos(), event->pos())); + + if (item.count() == 1) + { + d->hovered = item[0]; + } + else + { + d->hovered = QModelIndex(); + } + const QString previousHoveredCategory = d->hoveredCategory; d->mousePosition = event->pos(); @@ -1028,7 +1077,10 @@ void KCategorizedView::mouseMoveEvent(QMouseEvent *event) end = d->mousePosition; } - rect = QRect(start, end).intersected(viewport()->rect().adjusted(-16, -16, 16, 16)); + rect = QRect(start, end).adjusted(-16, -16, 16, 16); + rect = rect.united(QRect(start, end).adjusted(16, 16, -16, -16)).intersected(viewport()->rect()); + + viewport()->update(rect); } } @@ -1065,8 +1117,7 @@ void KCategorizedView::mouseReleaseEvent(QMouseEvent *event) QListView::mouseReleaseEvent(event); - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) { return; } @@ -1075,13 +1126,14 @@ void KCategorizedView::mouseReleaseEvent(QMouseEvent *event) initialPressPosition.setY(initialPressPosition.y() + verticalOffset()); initialPressPosition.setX(initialPressPosition.x() + horizontalOffset()); - if (initialPressPosition == d->initialPressPosition) + if ((selectionMode() != SingleSelection) && (selectionMode() != NoSelection) && + (initialPressPosition == d->initialPressPosition)) { foreach(const QString &category, d->categories) { if (d->categoryVisualRect(category).contains(event->pos())) { - QItemSelection selection; + QItemSelection selection = selectionModel()->selection(); QModelIndexList indexList = d->categoriesIndexes[category]; foreach (const QModelIndex &index, indexList) @@ -1091,13 +1143,41 @@ void KCategorizedView::mouseReleaseEvent(QMouseEvent *event) selection << QItemSelectionRange(selectIndex); } - selectionModel()->select(selection, QItemSelectionModel::Select); + selectionModel()->select(selection, QItemSelectionModel::SelectCurrent); break; } } } + QRect rect; + if (!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; + } + + rect = QRect(start, end).adjusted(-16, -16, 16, 16); + rect = rect.united(QRect(start, end).adjusted(16, 16, -16, -16)).intersected(viewport()->rect()); + + viewport()->update(rect); + } + if (d->hovered.isValid()) viewport()->update(visualRect(d->hovered)); else if (!d->hoveredCategory.isEmpty()) @@ -1145,14 +1225,14 @@ void KCategorizedView::dragMoveEvent(QDragMoveEvent *event) d->dragLeftViewport = false; - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) - { #if defined(DOLPHIN_DRAGANDDROP) - QAbstractItemView::dragMoveEvent(event); + QAbstractItemView::dragMoveEvent(event); #else - QListView::dragMoveEvent(event); + QListView::dragMoveEvent(event); #endif + + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + { return; } @@ -1183,26 +1263,14 @@ QModelIndex KCategorizedView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) { if ((viewMode() != KCategorizedView::IconMode) || - !d->proxyModel || - !d->categoryDrawer || - d->categories.isEmpty() || - !d->proxyModel->isCategorizedModel() - ) + !d->proxyModel || + !d->categoryDrawer || + d->categories.isEmpty() || + !d->proxyModel->isCategorizedModel()) { return QListView::moveCursor(cursorAction, modifiers); } - QModelIndex current = selectionModel()->currentIndex(); - - if (!current.isValid()) - { - current = model()->index(0, 0, QModelIndex()); - selectionModel()->select(current, QItemSelectionModel::NoUpdate); - d->forcedSelectionPosition = 0; - - return current; - } - int viewportWidth = viewport()->width() - spacing(); int itemWidth; @@ -1216,10 +1284,34 @@ QModelIndex KCategorizedView::moveCursor(CursorAction cursorAction, } int itemWidthPlusSeparation = spacing() + itemWidth; + if (!itemWidthPlusSeparation) + itemWidthPlusSeparation++; int elementsPerRow = viewportWidth / itemWidthPlusSeparation; if (!elementsPerRow) elementsPerRow++; + QModelIndex current = selectionModel()->currentIndex(); + + if (!current.isValid()) + { + if (cursorAction == MoveEnd) + { + current = model()->index(model()->rowCount() - 1, 0, QModelIndex()); + d->forcedSelectionPosition = d->elementsInfo[current.row()].relativeOffsetToCategory % elementsPerRow; + } + else + { + current = model()->index(0, 0, QModelIndex()); + d->forcedSelectionPosition = 0; + } + + return current; + } + else if (!current.isValid()) + { + return QModelIndex(); + } + QString lastCategory = d->categories.first(); QString theCategory = d->categories.first(); QString afterCategory = d->categories.first(); @@ -1370,8 +1462,7 @@ void KCategorizedView::rowsInserted(const QModelIndex &parent, { QListView::rowsInserted(parent, start, end); - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) { d->forcedSelectionPosition = 0; d->elementsInfo.clear(); @@ -1472,8 +1563,7 @@ void KCategorizedView::rowsRemoved(const QModelIndex &parent, int start, int end) { - if ((viewMode() == KCategorizedView::IconMode) && d->proxyModel && - d->categoryDrawer && d->proxyModel->isCategorizedModel()) + if (d->proxyModel && d->categoryDrawer && d->proxyModel->isCategorizedModel()) { // Force the view to update all elements rowsInsertedArtifficial(QModelIndex(), 0, d->proxyModel->rowCount() - 1); @@ -1482,8 +1572,7 @@ void KCategorizedView::rowsRemoved(const QModelIndex &parent, void KCategorizedView::updateGeometries() { - if ((viewMode() != KCategorizedView::IconMode) || !d->proxyModel || - !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) + if (!d->proxyModel || !d->categoryDrawer || !d->proxyModel->isCategorizedModel()) { QListView::updateGeometries(); return; @@ -1522,11 +1611,14 @@ void KCategorizedView::currentChanged(const QModelIndex ¤t, } int itemWidthPlusSeparation = spacing() + itemWidth; + if (!itemWidthPlusSeparation) + itemWidthPlusSeparation++; int elementsPerRow = viewportWidth / itemWidthPlusSeparation; if (!elementsPerRow) elementsPerRow++; - d->forcedSelectionPosition = d->elementsInfo[current.row()].relativeOffsetToCategory % elementsPerRow; + if (d->mouseButtonPressed || d->rightMouseButtonPressed) + d->forcedSelectionPosition = d->elementsInfo[current.row()].relativeOffsetToCategory % elementsPerRow; QListView::currentChanged(current, previous); }