[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: =?utf-8?q?=5Bveritas=5D_/=3A_Select_tests_to_run_with_checkboxes?=
From: Miha Čančula <miha.cancula () gmail ! com>
Date: 2011-02-28 22:22:47
Message-ID: 20110228222247.6EDBAA60CD () git ! kde ! org
[Download RAW message or body]
Git commit 6a42a65d1988468cf32a975002f72b1fa47c5409 by Miha Čančula.
Committed on 28/02/2011 at 23:18.
Pushed by mihac into branch 'master'.
Select tests to run with checkboxes rather than hover buttons.
M +1 -1 CMakeLists.txt
M +18 -11 internal/runnermodel.cpp
M +2 -15 internal/runnerwindow.cpp
M +0 -1 internal/runnerwindow.h
D +0 -70 internal/selectionmanager.cpp
D +0 -61 internal/selectionmanager.h
M +7 -2 internal/selectionstore.cpp
M +38 -15 internal/test_p.cpp
M +5 -10 internal/test_p.h
M +1 -1 internal/testexecutor.cpp
M +2 -2 test.cpp
http://commits.kde.org/scratch/mihac/veritas/6a42a65d1988468cf32a975002f72b1fa47c5409
diff --git a/CMakeLists.txt b/CMakeLists.txt
index f49b7eb..fdbe620 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -39,7 +39,7 @@ set(veritas_SRCS
internal/runnermodel.cpp
internal/runnerproxymodel.cpp
internal/runnerwindow.cpp
- internal/selectionmanager.cpp
+
internal/overlaymanager.cpp
internal/overlaytoggle.cpp
internal/resultswidget.cpp
diff --git a/internal/runnermodel.cpp b/internal/runnermodel.cpp
index 9e5a8e6..965c2f3 100644
--- a/internal/runnermodel.cpp
+++ b/internal/runnermodel.cpp
@@ -88,12 +88,12 @@ RunnerModel::~RunnerModel()
void RunnerModel::checkAll()
{
- if (m_rootItem) m_rootItem->internal()->check();
+ if (m_rootItem) m_rootItem->internal()->setCheckState(Qt::Checked);
}
void RunnerModel::uncheckAll()
{
- if (m_rootItem) m_rootItem->internal()->unCheck();
+ if (m_rootItem) m_rootItem->internal()->setCheckState(Qt::Unchecked);
}
QVariant RunnerModel::data(const QModelIndex& index, int role) const
@@ -106,10 +106,8 @@ QVariant RunnerModel::data(const QModelIndex& index, int role) \
const return int(Qt::AlignLeft | Qt::AlignTop);
case Qt::DisplayRole :
return testFromIndex(index)->name();
- case Qt::TextColorRole :
- return testFromIndex(index)->internal()->isChecked() ?
- Qt::black :
- Qt::lightGray;
+ case Qt::CheckStateRole :
+ return testFromIndex(index)->internal()->checkState();
case Qt::DecorationRole :
if (index.child(0, 0).isValid()) { // not a leaf test
return computeIconFromChildState(testFromIndex(index));
@@ -173,9 +171,18 @@ QVariant RunnerModel::computeIconFromChildState(Veritas::Test* \
test) const
bool RunnerModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
- Q_UNUSED(index);
- Q_UNUSED(value);
- Q_UNUSED(role);
+ if ( role == Qt::CheckStateRole )
+ {
+ testFromIndex(index)->internal()->setCheckState((Qt::CheckState)value.toInt());
+ QModelIndex parent = index;
+ while (parent.isValid()) {
+ emit dataChanged(parent, parent);
+ parent = parent.parent();
+ }
+ for (int i = 0; i < rowCount(index); ++i) {
+ setData(index.child(i,0), value, Qt::CheckStateRole);
+ }
+ }
return false;
}
@@ -193,7 +200,7 @@ Qt::ItemFlags RunnerModel::flags(const QModelIndex& index) const
if (!index.isValid()) {
return 0;
}
- return Qt::ItemIsEnabled | Qt::ItemIsSelectable;
+ return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsUserCheckable;
}
QModelIndex RunnerModel::index(int row, int column, const QModelIndex& parent) const
@@ -270,7 +277,7 @@ void RunnerModel::countItems()
}
Test* item = testFromIndex(currentIndex); // Have an item.
numTotal++;
- if (item->internal()->isChecked() && !hasChildren(currentIndex)) {
+ if (item->internal()->checkState() == Qt::Checked && \
!hasChildren(currentIndex)) { m_numSelected++;
}
switch (item->state()) {
diff --git a/internal/runnerwindow.cpp b/internal/runnerwindow.cpp
index 5cffb1d..0fb44fc 100644
--- a/internal/runnerwindow.cpp
+++ b/internal/runnerwindow.cpp
@@ -30,8 +30,8 @@
#include "resultsproxymodel.h"
#include "runnermodel.h"
#include "runnerproxymodel.h"
-#include "selectionmanager.h"
#include "overlaytoggle.h"
+#include "overlaymanager.h"
#include "testexecutor.h"
#include <ktexteditor/cursor.h>
@@ -137,10 +137,6 @@ RunnerWindow::RunnerWindow(ResultsModel* rmodel, \
ProjectSelection::IProjectFilte resultsView()->setModel(rproxy);
m_results->setResizeMode();
- m_selection = new SelectionManager(runnerView());
- SelectionToggle* selectionToggle = new \
SelectionToggle(runnerView()->viewport());
- m_selection->setButton(selectionToggle);
-
m_verbose = new OverlayManager(runnerView());
m_verboseToggle = new VerboseToggle(runnerView()->viewport());
connect(m_verboseToggle, SIGNAL(clicked(bool)),SLOT(showVerboseTestOutput()));
@@ -162,9 +158,6 @@ RunnerWindow::RunnerWindow(ResultsModel* rmodel, \
ProjectSelection::IProjectFilte
QPixmap deselect = KIconLoader::global()->loadIcon("list-remove", \
KIconLoader::Small); m_ui->actionUnselectAll->setIcon(deselect);
- connect(runnerView(), SIGNAL(clicked(QModelIndex)),
- SLOT(expandOrCollapse(QModelIndex)));
-
const char* whatsthis = "xTest runner. First select a project from the rightmost \
dropdown box. Next, load the test tree by clicking on the green circular arrow icon. \
Run your tests with a click on the leftmost green arrow icon."; setWhatsThis( \
i18n(whatsthis) ); resultsView()->setWhatsThis( i18n(whatsthis) );
@@ -230,7 +223,7 @@ class SelectedLeafCount
public:
SelectedLeafCount() : result(0) {}
void operator()(Test* t) {
- if ((t->childCount() == 0) && t->internal()->isChecked()) {
+ if ((t->childCount() == 0) && t->internal()->checkState() == Qt::Checked) {
result++;
}
}
@@ -314,7 +307,6 @@ void RunnerWindow::selectAll()
RunnerWindow::~RunnerWindow()
{
// Deleting the model is left to the owner of the model instance.
- if (m_selection) delete m_selection;
if (m_verbose) delete m_verbose;
if (m_executor) {
m_executor->stop();
@@ -390,7 +382,6 @@ void RunnerWindow::connectProgressIndicators(RunnerModel* model)
void RunnerWindow::setModel(RunnerModel* model)
{
m_verbose->reset();
- m_selection->reset();
stopPreviousModel();
if (!model) {
// No user interaction without a model or an empty one
@@ -408,15 +399,11 @@ void RunnerWindow::setModel(RunnerModel* model)
enableItemActions(true);
m_ui->actionStop->setDisabled(true);
- connect(m_selection, SIGNAL(selectionChanged()),
- runnerModel(), SLOT(countItems()));
-
// set top row higlighted
runnerView()->setCurrentIndex(runnerProxyModel()->index(0, 0));
enableToSource();
enableTestSync(true);
m_verbose->makeConnections();
- m_selection->makeConnections();
m_toSource->makeConnections();
runnerView()->resizeColumnToContents(0);
}
diff --git a/internal/runnerwindow.h b/internal/runnerwindow.h
index fe4a17f..6a24daa 100644
--- a/internal/runnerwindow.h
+++ b/internal/runnerwindow.h
@@ -221,7 +221,6 @@ private: // Operations
private:
Ui::RunnerWindow *m_ui; // QtDesigner main object
ResultsWidget* m_results;
- SelectionManager* m_selection; // is responsable for the fade-in out \
selection thingy OverlayManager* m_verbose;
ProjectSelection* m_projectSelection; // a dropdown box to select the \
'current' project QMap<QString, QAction*> m_project2action;
diff --git a/internal/selectionmanager.cpp b/internal/selectionmanager.cpp
deleted file mode 100644
index 55ba046..0000000
--- a/internal/selectionmanager.cpp
+++ /dev/null
@@ -1,70 +0,0 @@
-/***************************************************************************
- * Copyright (C) 2008 by Peter Penz <peter.penz@gmx.at> *
- * modified by Manuel Breugelmans <mbr.nxi@gmail.com> *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
- ***************************************************************************/
-
-#include "selectionmanager.h"
-
-#include "../test.h"
-#include "test_p.h"
-#include "overlaytoggle.h"
-
-#include <QAbstractItemView>
-#include <QModelIndex>
-
-using Veritas::SelectionManager;
-using Veritas::Test;
-using Veritas::OverlayManager;
-using Veritas::OverlayButton;
-
-SelectionManager::SelectionManager(QAbstractItemView* parent) :
- OverlayManager(parent)
-{}
-
-void SelectionManager::setButton(OverlayButton* button)
-{
- connect(button, SIGNAL(clicked(bool)), SLOT(setItemSelected(bool)));
- OverlayManager::setButton(button);
-}
-
-SelectionManager::~SelectionManager()
-{}
-
-
-void SelectionManager::slotEntered(const QModelIndex& index)
-{
- if (index.isValid()) {
- Test* t = index2Test(index);
- Q_ASSERT(t);
- button()->setChecked(t->internal()->isChecked());
- }
- OverlayManager::slotEntered(index);
-}
-
-
-void SelectionManager::setItemSelected(bool selected)
-{
- const QModelIndex index = button()->index();
- if (index.isValid()) {
- selected ? index2Test(index)->internal()->check() : \
index2Test(index)->internal()->unCheck();
- view()->viewport()->update();
- }
- emit selectionChanged();
-}
-
-#include "selectionmanager.moc"
diff --git a/internal/selectionmanager.h b/internal/selectionmanager.h
deleted file mode 100644
index f674bc3..0000000
--- a/internal/selectionmanager.h
+++ /dev/null
@@ -1,61 +0,0 @@
-/***************************************************************************
- * Copyright (C) 2008 by Peter Penz <peter.penz@gmx.at> *
- * modified by Manuel Breugelmans <mbr.nxi@gmail.com> *
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- * This program is distributed in the hope that it will be useful, *
- * but WITHOUT ANY WARRANTY; without even the implied warranty of *
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
- * GNU General Public License for more details. *
- * *
- * You should have received a copy of the GNU General Public License *
- * along with this program; if not, write to the *
- * Free Software Foundation, Inc., *
- * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
- ***************************************************************************/
-
-#ifndef VERITAS_SELECTIONMANAGER_H
-#define VERITAS_SELECTIONMANAGER_H
-
-#include <QObject>
-#include "overlaymanager.h"
-
-class QAbstractItemView;
-class QModelIndex;
-
-namespace Veritas
-{
-
-/*! Whenever a test-item is hovered by the mouse in the runner tree,
- * a toggle button is shown. This allows the user to select/deselect that
- * specific test and it's children. A deselected test is excluded from the
- * test run. Individual Veritas::Test's must set the needSelectionToggle property
- * if they want such a button. */
-class SelectionManager : public OverlayManager
-{
- Q_OBJECT
-
-public:
- SelectionManager(QAbstractItemView* parent);
- virtual ~SelectionManager();
- virtual void setButton(OverlayButton*);
-
-protected slots:
- void slotEntered(const QModelIndex&);
-
-private slots:
- void setItemSelected(bool);
-
-signals:
- /** Is emitted if the selection has been changed by the toggle button. */
- void selectionChanged();
-};
-
-} // namespace Veritas
-
-#endif // VERITAS_SELECTION_MANAGER_H
-
diff --git a/internal/selectionstore.cpp b/internal/selectionstore.cpp
index b78c8cf..fd321f4 100644
--- a/internal/selectionstore.cpp
+++ b/internal/selectionstore.cpp
@@ -47,7 +47,7 @@ public:
void operator()(Test* t) {
Q_ASSERT(m_store);
if (m_store->wasDeselected(t)) {
- t->internal()->unCheckNonRecursive();
+ t->internal()->setCheckState(Qt::Unchecked);
}
}
SelectionStore* m_store;
@@ -58,7 +58,12 @@ public:
void SelectionStore::saveState(Test* test)
{
Q_ASSERT(test);
- if (!test->internal()->isChecked()) {
+ if (test->childCount() > 0)
+ {
+ // We only have to store the state for the leafs
+ return;
+ }
+ if (!test->internal()->checkState() == Qt::Unchecked) {
m_deselected << serialize(test);
}
}
diff --git a/internal/test_p.cpp b/internal/test_p.cpp
index 2301030..e85f439 100644
--- a/internal/test_p.cpp
+++ b/internal/test_p.cpp
@@ -19,6 +19,7 @@
*/
#include "test_p.h"
+#include <KDebug>
using Veritas::Test;
@@ -68,30 +69,52 @@ void Test::Internal::clear()
m_isRunning = false;
}
-bool Test::Internal::isChecked() const
+void Test::Internal::setCheckState(Qt::CheckState state)
{
- return isChecked_;
-}
-
-void Test::Internal::check()
-{
- isChecked_ = true;
- foreach (Test* child, children) {
- child->internal()->check();
+ if (checkState_ != state) {
+ checkState_ = state;
+ if (state != Qt::PartiallyChecked) {
+ foreach (Test* child, children) {
+ child->internal()->setCheckState(state);
+ }
+ }
+ if (self && self->parent()) {
+ self->parent()->internal()->updateCheckState();
+ }
}
}
-void Test::Internal::unCheckNonRecursive()
+Qt::CheckState Test::Internal::checkState() const
{
- isChecked_ = false;
+ return checkState_;
}
-void Test::Internal::unCheck()
+void Test::Internal::updateCheckState()
{
- isChecked_ = false;
- foreach (Test* child, children) {
- child->internal()->unCheck();
+ Qt::CheckState newState = checkState_;
+ if (checkState_ == Qt::PartiallyChecked && children.isEmpty()) {
+ newState = Qt::Checked;
+ }
+ else if (!children.isEmpty()) {
+ bool checkedChildren = false;
+ bool unCheckedChildren = false;
+ foreach (Test* child, children) {
+ child->internal()->updateCheckState();
+ checkedChildren |= child->internal()->checkState() != Qt::Unchecked;
+ unCheckedChildren |= child->internal()->checkState() != Qt::Checked;
+ if (checkedChildren && unCheckedChildren) {
+ newState = Qt::PartiallyChecked;
+ break;
+ }
+ }
+ if (checkedChildren && !unCheckedChildren) {
+ newState = Qt::Checked;
+ }
+ else if (unCheckedChildren && !checkedChildren) {
+ newState = Qt::Unchecked;
+ }
}
+ setCheckState(newState);
}
bool Test::Internal::isRunning() const
diff --git a/internal/test_p.h b/internal/test_p.h
index 1cbc3f2..490d1d0 100644
--- a/internal/test_p.h
+++ b/internal/test_p.h
@@ -46,15 +46,10 @@ public:
QVariant data(int column) const;
void setData(int column, const QVariant& value);
-
- /*! Is this item checked by the user in the tree-runnerview? */
- bool isChecked() const;
- /*! Check this test and all its children */
- void check();
- /*! Recursively lift check state */
- void unCheck();
- /*! Uncheck only this test, not it's children */
- void unCheckNonRecursive();
+
+ void setCheckState(Qt::CheckState state);
+ Qt::CheckState checkState() const;
+ void updateCheckState();
bool isRunning() const;
void setIsRunning(bool);
@@ -66,7 +61,7 @@ private:
QString name;
QModelIndex index_;
TestResult* result;
- bool isChecked_;
+ Qt::CheckState checkState_;
QMap<QString, Test*> childMap;
QList<Test*> children;
QList<QVariant> itemData;
diff --git a/internal/testexecutor.cpp b/internal/testexecutor.cpp
index 5911cd6..e6345cc 100644
--- a/internal/testexecutor.cpp
+++ b/internal/testexecutor.cpp
@@ -58,7 +58,7 @@ public:
void SetupChain::operator()(Test* current)
{
- if (!(current->shouldRun() && current->internal()->isChecked())) {
+ if (!(current->shouldRun() && current->internal()->checkState() == Qt::Checked)) \
{ return; // only run if is an exe and selected
}
if (!m_previous) { // first test in the chain.
diff --git a/test.cpp b/test.cpp
index 5b3843b..fd567fa 100644
--- a/test.cpp
+++ b/test.cpp
@@ -49,7 +49,7 @@ Test::Test(const QList<QVariant>& data, Test* parent)
} else {
d->name.clear();
}
- d->check();
+ d->setCheckState(Qt::Checked);
d->needVerboseToggle = false;
d->needSelectionToggle = false;
}
@@ -64,7 +64,7 @@ Test::Test(const QString& name, Test* parent)
for (int i=0; i < Internal::columnCount; i++) {
d->itemData << QString();
}
- d->check();
+ d->setCheckState(Qt::Checked);
d->needVerboseToggle = false;
d->needSelectionToggle = false;
d->supportsToSource = false;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic