]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kcategorizedview.cpp
Improve the categorized view for the list mode
[dolphin.git] / src / kcategorizedview.cpp
index d612f4b1c0597635730788098deb56a0d04fbbcb..217fef10fe899f12a86816d04d406d3ce95a25ce 100644 (file)
@@ -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 &current,
     }
 
     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);
 }