]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/kcategorizedview.cpp
Fix selections problems (like flickering). Click on category select/deselects all...
[dolphin.git] / src / kcategorizedview.cpp
index 7bc0055aed7b189527f08f1dd233be796b61c579..e1597849a4914519098d0c7ab689f98216f49409 100644 (file)
@@ -357,10 +357,23 @@ void KCategorizedView::Private::drawNewCategory(const QModelIndex &index,
     QStyleOption optionCopy = option;
     const QString category = proxyModel->data(index, KCategorizedSortFilterProxyModel::CategoryRole).toString();
 
+    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)
+        {
+            optionCopy.state |= QStyle::State_Selected;
+        }
+    }
 
     categoryDrawer->drawCategory(index,
                                  sortRole,
@@ -755,20 +768,22 @@ void KCategorizedView::setSelection(const QRect &rect,
     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);
         }
@@ -776,6 +791,8 @@ void KCategorizedView::setSelection(const QRect &rect,
         return;
     }
 
+    QItemSelection selection;
+
     if (!d->mouseButtonPressed)
     {
         selection = QItemSelection(dirtyIndexes[0], dirtyIndexes[0]);
@@ -803,13 +820,12 @@ void KCategorizedView::setSelection(const QRect &rect,
             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);
@@ -891,6 +907,8 @@ void KCategorizedView::mousePressEvent(QMouseEvent *event)
     }
 
     QListView::mousePressEvent(event);
+
+    viewport()->update(d->categoryVisualRect(d->hoveredCategory));
 }
 
 void KCategorizedView::mouseReleaseEvent(QMouseEvent *event)
@@ -910,6 +928,7 @@ void KCategorizedView::mouseReleaseEvent(QMouseEvent *event)
     initialPressPosition.setX(initialPressPosition.x() + horizontalOffset());
 
     QItemSelection selection;
+    QItemSelection deselection;
 
     if (initialPressPosition == d->initialPressPosition)
     {
@@ -921,10 +940,18 @@ void KCategorizedView::mouseReleaseEvent(QMouseEvent *event)
                 {
                     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;
             }