summaryrefslogtreecommitdiff
path: root/plugins/autotest/testtreeview.cpp
diff options
context:
space:
mode:
authorChristian Stenger <christian.stenger@digia.com>2014-10-07 12:30:54 +0200
committerChristian Stenger <christian.stenger@theqtcompany.com>2014-12-04 13:52:14 +0100
commit2f4139e5d313902683a3a4a98f9ef012afff8734 (patch)
tree5e1c10378f5a4d9ca2e45dd39b2a6f4dba06d6ee /plugins/autotest/testtreeview.cpp
downloadqt-creator-2f4139e5d313902683a3a4a98f9ef012afff8734.tar.gz
Initial commit
Diffstat (limited to 'plugins/autotest/testtreeview.cpp')
-rw-r--r--plugins/autotest/testtreeview.cpp204
1 files changed, 204 insertions, 0 deletions
diff --git a/plugins/autotest/testtreeview.cpp b/plugins/autotest/testtreeview.cpp
new file mode 100644
index 0000000000..04b2ffb60f
--- /dev/null
+++ b/plugins/autotest/testtreeview.cpp
@@ -0,0 +1,204 @@
+/****************************************************************************
+**
+** Copyright (C) 2014 Digia Plc
+** All rights reserved.
+** For any questions to Digia, please use contact form at http://qt.digia.com
+**
+** This file is part of the Qt Creator Enterprise Auto Test Add-on.
+**
+** Licensees holding valid Qt Enterprise licenses may use this file in
+** accordance with the Qt Enterprise License Agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.
+**
+** If you have questions regarding the use of this file, please use
+** contact form at http://qt.digia.com
+**
+****************************************************************************/
+
+#include "autotestconstants.h"
+#include "testcodeparser.h"
+#include "testtreeitem.h"
+#include "testtreemodel.h"
+#include "testtreeview.h"
+
+#include <coreplugin/icore.h>
+
+#include <cpptools/cppmodelmanager.h>
+
+#include <projectexplorer/project.h>
+#include <projectexplorer/session.h>
+
+#include <texteditor/texteditor.h>
+
+#include <QToolButton>
+#include <QVBoxLayout>
+
+namespace Autotest {
+namespace Internal {
+
+TestTreeViewWidget::TestTreeViewWidget(QWidget *parent) :
+ QWidget(parent)
+{
+ setWindowTitle(tr("Tests"));
+ m_model = TestTreeModel::instance();
+ m_view = new TestTreeView(this);
+ m_view->setModel(m_model);
+
+ QVBoxLayout *layout = new QVBoxLayout;
+ layout->setMargin(0);
+ layout->setSpacing(0);
+ layout->addWidget(m_view);
+ setLayout(layout);
+
+ TestCodeParser *parser = m_model->parser();
+ ProjectExplorer::SessionManager *sm = static_cast<ProjectExplorer::SessionManager *>(
+ ProjectExplorer::SessionManager::instance());
+ connect(sm, &ProjectExplorer::SessionManager::startupProjectChanged,
+ parser, &TestCodeParser::updateTestTree);
+
+ CppTools::CppModelManager *cppMM = CppTools::CppModelManager::instance();
+ connect(cppMM, &CppTools::CppModelManager::documentUpdated,
+ parser, &TestCodeParser::onDocumentUpdated, Qt::QueuedConnection);
+
+ connect(cppMM, &CppTools::CppModelManager::aboutToRemoveFiles,
+ parser, &TestCodeParser::removeFiles, Qt::QueuedConnection);
+
+ connect(m_view, &TestTreeView::activated, this, &TestTreeViewWidget::onItemActivated);
+}
+
+void TestTreeViewWidget::contextMenuEvent(QContextMenuEvent *event)
+{
+ bool hasTests = m_model->hasTests();
+ QMenu menu;
+ QAction *runAll = new QAction(tr("Run All Tests"), &menu);
+ QAction *runSelected = new QAction(tr("Run Selected Tests"), &menu);
+ QAction *selectAll = new QAction(tr("Select All"), &menu);
+ QAction *deselectAll = new QAction(tr("Deselect All"), &menu);
+ // TODO remove?
+ QAction *rescan = new QAction(tr("Rescan"), &menu);
+
+ connect(selectAll, &QAction::triggered, m_view, &TestTreeView::selectAll);
+ connect(deselectAll, &QAction::triggered, m_view, &TestTreeView::deselectAll);
+ connect(rescan, &QAction::triggered,
+ TestTreeModel::instance()->parser(), &TestCodeParser::updateTestTree);
+
+ runAll->setEnabled(hasTests);
+ runSelected->setEnabled(hasTests);
+ selectAll->setEnabled(hasTests);
+ deselectAll->setEnabled(hasTests);
+
+ menu.addAction(runAll);
+ menu.addAction(runSelected);
+ menu.addSeparator();
+ menu.addAction(selectAll);
+ menu.addAction(deselectAll);
+ menu.addSeparator();
+ menu.addAction(rescan);
+
+ menu.exec(mapToGlobal(event->pos()));
+}
+
+QList<QToolButton *> TestTreeViewWidget::createToolButtons()
+{
+ QList<QToolButton *> list;
+
+ m_sort = new QToolButton(this);
+ m_sort->setIcon((QIcon(QLatin1String(":/images/sort.png"))));
+ m_sort->setToolTip(tr("Sort Alphabetically (not implemented yet)")); // TODO
+ m_sort->setCheckable(true);
+ m_sort->setChecked(true);
+
+ QToolButton *expand = new QToolButton(this);
+ expand->setIcon(QIcon(QLatin1String(":/images/expand.png")));
+ expand->setToolTip(tr("Expand All"));
+
+ QToolButton *collapse = new QToolButton(this);
+ collapse->setIcon(QIcon(QLatin1String(":/images/collapse.png")));
+ collapse->setToolTip(tr("Collapse All"));
+
+ connect(expand, &QToolButton::clicked, m_view, &TestTreeView::expandAll);
+ connect(collapse, &QToolButton::clicked, m_view, &TestTreeView::collapseAll);
+// connect(m_sort, &QToolButton::toggled, m_view, &TestTreeView::onSortToggled); // TODO
+
+ list << m_sort << expand << collapse;
+ return list;
+}
+
+void TestTreeViewWidget::onItemActivated(const QModelIndex &index)
+{
+ const TextEditor::TextEditorWidget::Link link
+ = index.data(LinkRole).value<TextEditor::TextEditorWidget::Link>();
+ if (link.hasValidTarget()) {
+ Core::EditorManager::openEditorAt(link.targetFileName,
+ link.targetLine,
+ link.targetColumn);
+ }
+}
+
+TestViewFactory::TestViewFactory()
+{
+ setDisplayName(tr("Tests"));
+ setId(Autotest::Constants::AUTOTEST_ID);
+ setPriority(666);
+}
+
+Core::NavigationView TestViewFactory::createWidget()
+{
+ TestTreeViewWidget *treeView = new TestTreeViewWidget;
+ Core::NavigationView view;
+ view.widget = treeView;
+ view.dockToolBarWidgets = treeView->createToolButtons();
+ return view;
+}
+
+TestTreeView::TestTreeView(QWidget *parent)
+ : NavigationTreeView(parent),
+ m_context(new Core::IContext(this))
+{
+ setExpandsOnDoubleClick(false);
+ m_context->setWidget(this);
+ m_context->setContext(Core::Context(Constants::AUTOTEST_CONTEXT));
+ Core::ICore::addContextObject(m_context);
+}
+
+void TestTreeView::selectAll()
+{
+ selectOrDeselectAll(Qt::Checked);
+}
+
+void TestTreeView::deselectAll()
+{
+ selectOrDeselectAll(Qt::Unchecked);
+}
+
+// this avoids the re-evaluation of parent nodes when modifying the child nodes (setData())
+void TestTreeView::selectOrDeselectAll(const Qt::CheckState checkState)
+{
+ TestTreeModel *model = TestTreeModel::instance();
+ QModelIndex autoTestsIndex = model->index(0, 0, rootIndex());
+ if (!autoTestsIndex.isValid())
+ return;
+ int count = model->rowCount(autoTestsIndex);
+ QModelIndex last;
+ for (int i = 0; i < count; ++i) {
+ QModelIndex classesIndex = model->index(i, 0, autoTestsIndex);
+ int funcCount = model->rowCount(classesIndex);
+ TestTreeItem *item = static_cast<TestTreeItem *>(classesIndex.internalPointer());
+ if (item) {
+ item->setChecked(checkState);
+ if (!item->childCount())
+ last = classesIndex;
+ }
+ for (int j = 0; j < funcCount; ++j) {
+ last = model->index(j, 0, classesIndex);
+ TestTreeItem *item = static_cast<TestTreeItem *>(last.internalPointer());
+ if (item)
+ item->setChecked(checkState);
+ }
+ }
+ emit dataChanged(autoTestsIndex, last);
+}
+
+} // namespace Internal
+} // namespace Autotest