From eebee3311d4b8bba4972613128efa3af816b9f85 Mon Sep 17 00:00:00 2001
From: Petar Perisin <petar.perisin@gmail.com>
Date: Tue, 26 Mar 2013 17:27:17 +0100
Subject: [PATCH] VCS Clean Dialog: Added "Select All" checkbox

Change-Id: I5bff60b1aa1985926efb6b850be958f48d67a029
Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
Reviewed-by: Petar Perisin <petar.perisin@gmail.com>
---
 src/plugins/vcsbase/cleandialog.cpp | 30 +++++++++++++++++++++++++++++
 src/plugins/vcsbase/cleandialog.h   |  2 ++
 src/plugins/vcsbase/cleandialog.ui  | 15 +++++++++++----
 3 files changed, 43 insertions(+), 4 deletions(-)

diff --git a/src/plugins/vcsbase/cleandialog.cpp b/src/plugins/vcsbase/cleandialog.cpp
index bae7480cbb9..fd921e2e2f2 100644
--- a/src/plugins/vcsbase/cleandialog.cpp
+++ b/src/plugins/vcsbase/cleandialog.cpp
@@ -170,6 +170,8 @@ CleanDialog::CleanDialog(QWidget *parent) :
     d->ui.filesTreeView->setRootIsDecorated(false);
     connect(d->ui.filesTreeView, SIGNAL(doubleClicked(QModelIndex)),
             this, SLOT(slotDoubleClicked(QModelIndex)));
+    connect(d->ui.selectAllCheckBox, SIGNAL(clicked(bool)), this, SLOT(selectAllItems(bool)));
+    connect(d->ui.filesTreeView, SIGNAL(clicked(QModelIndex)), this, SLOT(updateSelectAllCheckBox()));
 }
 
 CleanDialog::~CleanDialog()
@@ -193,6 +195,9 @@ void CleanDialog::setFileList(const QString &workingDirectory, const QStringList
 
     for (int c = 0; c < d->m_filesModel->columnCount(); c++)
         d->ui.filesTreeView->resizeColumnToContents(c);
+
+    if (ignoredFiles.isEmpty())
+        d->ui.selectAllCheckBox->setChecked(true);
 }
 
 void CleanDialog::addFile(const QString &workingDirectory, QString fileName, bool checked)
@@ -278,6 +283,31 @@ void CleanDialog::slotDoubleClicked(const QModelIndex &index)
     }
 }
 
+void CleanDialog::selectAllItems(bool checked)
+{
+    if (const int rowCount = d->m_filesModel->rowCount()) {
+        for (int r = 0; r < rowCount; ++r) {
+            QStandardItem *item = d->m_filesModel->item(r, 0);
+            item->setCheckState(checked ? Qt::Checked : Qt::Unchecked);
+        }
+    }
+}
+
+void CleanDialog::updateSelectAllCheckBox()
+{
+    bool checked = true;
+    if (const int rowCount = d->m_filesModel->rowCount()) {
+        for (int r = 0; r < rowCount; ++r) {
+            const QStandardItem *item = d->m_filesModel->item(r, 0);
+            if (item->checkState() == Qt::Unchecked) {
+                checked = false;
+                break;
+            }
+        }
+        d->ui.selectAllCheckBox->setChecked(checked);
+    }
+}
+
 void CleanDialog::changeEvent(QEvent *e)
 {
     QDialog::changeEvent(e);
diff --git a/src/plugins/vcsbase/cleandialog.h b/src/plugins/vcsbase/cleandialog.h
index 3b290932815..374131d0875 100644
--- a/src/plugins/vcsbase/cleandialog.h
+++ b/src/plugins/vcsbase/cleandialog.h
@@ -60,6 +60,8 @@ protected:
 
 private slots:
     void slotDoubleClicked(const QModelIndex &);
+    void selectAllItems(bool checked);
+    void updateSelectAllCheckBox();
 
 private:
     QStringList checkedFiles() const;
diff --git a/src/plugins/vcsbase/cleandialog.ui b/src/plugins/vcsbase/cleandialog.ui
index dc679675e78..8e558dbbb67 100644
--- a/src/plugins/vcsbase/cleandialog.ui
+++ b/src/plugins/vcsbase/cleandialog.ui
@@ -17,6 +17,13 @@
    <item>
     <widget class="QGroupBox" name="groupBox">
      <layout class="QVBoxLayout" name="verticalLayout">
+      <item>
+       <widget class="QCheckBox" name="selectAllCheckBox">
+        <property name="text">
+         <string>Select All</string>
+        </property>
+       </widget>
+      </item>
       <item>
        <widget class="QTreeView" name="filesTreeView"/>
       </item>
@@ -44,8 +51,8 @@
    <slot>accept()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>248</x>
-     <y>254</y>
+     <x>257</x>
+     <y>649</y>
     </hint>
     <hint type="destinationlabel">
      <x>157</x>
@@ -60,8 +67,8 @@
    <slot>reject()</slot>
    <hints>
     <hint type="sourcelabel">
-     <x>316</x>
-     <y>260</y>
+     <x>325</x>
+     <y>649</y>
     </hint>
     <hint type="destinationlabel">
      <x>286</x>
-- 
GitLab