From 39a278d43a5278e4243dae27c98b75233c974482 Mon Sep 17 00:00:00 2001
From: kh1 <qt-info@nokia.com>
Date: Tue, 2 Mar 2010 16:48:49 +0100
Subject: [PATCH] Allow multiple docs to be reoved at once, also react on
 Delete key.

Reviewed-by: ck
---
 src/plugins/help/docsettingspage.cpp | 54 ++++++++++++++++++++--------
 src/plugins/help/docsettingspage.h   |  4 +++
 src/plugins/help/docsettingspage.ui  |  6 +++-
 3 files changed, 49 insertions(+), 15 deletions(-)

diff --git a/src/plugins/help/docsettingspage.cpp b/src/plugins/help/docsettingspage.cpp
index 7a911e3e5da..084b516c6b0 100644
--- a/src/plugins/help/docsettingspage.cpp
+++ b/src/plugins/help/docsettingspage.cpp
@@ -30,9 +30,12 @@
 #include "docsettingspage.h"
 #include "helpconstants.h"
 
+#include <QtCore/QCoreApplication>
+
 #include <QtGui/QFileDialog>
+#include <QtGui/QKeyEvent>
 #include <QtGui/QMessageBox>
-#include <QtCore/QCoreApplication>
+
 #include <QtHelp/QHelpEngine>
 
 using namespace Help::Internal;
@@ -73,6 +76,7 @@ QWidget *DocSettingsPage::createPage(QWidget *parent)
     connect(m_ui.removeButton, SIGNAL(clicked()),
             this, SLOT(removeDocumentation()));
 
+    m_ui.docsListWidget->installEventFilter(this);
     m_ui.docsListWidget->addItems(m_helpEngine->registeredDocumentations());
     m_registeredDocs = false;
     m_removeDocs.clear();
@@ -108,19 +112,7 @@ void DocSettingsPage::addDocumentation()
 
 void DocSettingsPage::removeDocumentation()
 {
-    QListWidgetItem *item = m_ui.docsListWidget->currentItem();
-    if (!item)
-        return;
-
-    m_removeDocs.append(item->text());
-    int row = m_ui.docsListWidget->currentRow();
-    m_ui.docsListWidget->takeItem(row);
-    if (row > 0)
-        --row;
-    if (m_ui.docsListWidget->count())
-        m_ui.docsListWidget->setCurrentRow(row);
-
-    delete item;
+    removeDocumentation(m_ui.docsListWidget->selectedItems());
 }
 
 void DocSettingsPage::apply()
@@ -153,3 +145,37 @@ bool DocSettingsPage::applyChanges()
 
     return success;
 }
+
+bool DocSettingsPage::eventFilter(QObject *object, QEvent *event)
+{
+    if (object != m_ui.docsListWidget)
+        return Core::IOptionsPage::eventFilter(object, event);
+
+    if (event->type() == QEvent::KeyPress) {
+        QKeyEvent *ke = static_cast<QKeyEvent*>(event);
+        switch (ke->key()) {
+            case Qt::Key_Delete:
+                removeDocumentation(m_ui.docsListWidget->selectedItems());
+            break;
+            default: break;
+        }
+    }
+
+    return Core::IOptionsPage::eventFilter(object, event);
+}
+
+void DocSettingsPage::removeDocumentation(const QList<QListWidgetItem*> items)
+{
+    if (items.isEmpty())
+        return;
+
+    int row = 0;
+    foreach (QListWidgetItem* item, items) {
+        m_removeDocs.append(item->text());
+        row = m_ui.docsListWidget->row(item);
+        delete m_ui.docsListWidget->takeItem(row);
+    }
+
+    m_ui.docsListWidget->setCurrentRow(qMax(row - 1, 0),
+        QItemSelectionModel::ClearAndSelect);
+}
diff --git a/src/plugins/help/docsettingspage.h b/src/plugins/help/docsettingspage.h
index d744faf0c17..eccd42747b1 100644
--- a/src/plugins/help/docsettingspage.h
+++ b/src/plugins/help/docsettingspage.h
@@ -68,6 +68,10 @@ private slots:
     void addDocumentation();
     void removeDocumentation();
 
+private:
+    bool eventFilter(QObject *object, QEvent *event);
+    void removeDocumentation(const QList<QListWidgetItem*> items);
+
 private:
     QHelpEngine *m_helpEngine;
     bool m_registeredDocs;
diff --git a/src/plugins/help/docsettingspage.ui b/src/plugins/help/docsettingspage.ui
index 8429ce9a1fa..7f7905d8fb3 100644
--- a/src/plugins/help/docsettingspage.ui
+++ b/src/plugins/help/docsettingspage.ui
@@ -18,7 +18,11 @@
      </property>
      <layout class="QHBoxLayout" name="horizontalLayout">
       <item>
-       <widget class="QListWidget" name="docsListWidget"/>
+       <widget class="QListWidget" name="docsListWidget">
+        <property name="selectionMode">
+         <enum>QAbstractItemView::ContiguousSelection</enum>
+        </property>
+       </widget>
       </item>
       <item>
        <layout class="QVBoxLayout" name="_4">
-- 
GitLab