forked from qt-creator/qt-creator
Move data handling almost from model to item
Part of preparing to re-use QC's TreeModel/TreeItem for TestTreeModel/TestTreeItem. Change-Id: I3752d800d836a5cd9067cacfcd181d93ec957095 Reviewed-by: David Schulz <david.schulz@theqtcompany.com>
This commit is contained in:
@@ -17,10 +17,16 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "autotestconstants.h"
|
||||||
#include "testtreeitem.h"
|
#include "testtreeitem.h"
|
||||||
|
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
|
#include <QIcon>
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
#include <texteditor/texteditor.h>
|
||||||
|
|
||||||
namespace Autotest {
|
namespace Autotest {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
@@ -78,6 +84,85 @@ void TestTreeItem::appendChild(TestTreeItem *child)
|
|||||||
m_children.append(child);
|
m_children.append(child);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QIcon testTreeIcon(TestTreeItem::Type type)
|
||||||
|
{
|
||||||
|
static QIcon icons[] = {
|
||||||
|
QIcon(),
|
||||||
|
QIcon(QLatin1String(":/images/class.png")),
|
||||||
|
QIcon(QLatin1String(":/images/func.png")),
|
||||||
|
QIcon(QLatin1String(":/images/data.png"))
|
||||||
|
};
|
||||||
|
if (type >= sizeof(icons))
|
||||||
|
return icons[2];
|
||||||
|
return icons[type];
|
||||||
|
}
|
||||||
|
|
||||||
|
QVariant TestTreeItem::data(int /*column*/, int role) const
|
||||||
|
{
|
||||||
|
switch (role) {
|
||||||
|
case Qt::DisplayRole:
|
||||||
|
if (m_type == ROOT && childCount() == 0)
|
||||||
|
return QString(m_name + QObject::tr(" (none)"));
|
||||||
|
else if (m_name.isEmpty())
|
||||||
|
return QObject::tr(Constants::UNNAMED_QUICKTESTS);
|
||||||
|
else
|
||||||
|
return m_name;
|
||||||
|
case Qt::ToolTipRole:
|
||||||
|
if (m_type == TEST_CLASS && m_name.isEmpty()) {
|
||||||
|
return QObject::tr("<p>Give all test cases a name to ensure correct behavior "
|
||||||
|
"when running test cases and to be able to select them.</p>");
|
||||||
|
}
|
||||||
|
return m_filePath;
|
||||||
|
case Qt::DecorationRole:
|
||||||
|
return testTreeIcon(m_type);
|
||||||
|
case Qt::CheckStateRole:
|
||||||
|
switch (m_type) {
|
||||||
|
case ROOT:
|
||||||
|
case TEST_DATAFUNCTION:
|
||||||
|
case TEST_SPECIALFUNCTION:
|
||||||
|
return QVariant();
|
||||||
|
case TEST_CLASS:
|
||||||
|
return m_name.isEmpty() ? QVariant() : checked();
|
||||||
|
case TEST_FUNCTION:
|
||||||
|
if (m_parent && m_parent->name().isEmpty())
|
||||||
|
return QVariant();
|
||||||
|
return checked();
|
||||||
|
default:
|
||||||
|
return checked();
|
||||||
|
}
|
||||||
|
case LinkRole: {
|
||||||
|
QVariant itemLink;
|
||||||
|
itemLink.setValue(TextEditor::TextEditorWidget::Link(m_filePath, m_line, m_column));
|
||||||
|
return itemLink;
|
||||||
|
}
|
||||||
|
case ItalicRole:
|
||||||
|
switch (m_type) {
|
||||||
|
case TEST_DATAFUNCTION:
|
||||||
|
case TEST_SPECIALFUNCTION:
|
||||||
|
return true;
|
||||||
|
case TEST_CLASS:
|
||||||
|
return m_name.isEmpty();
|
||||||
|
case TEST_FUNCTION:
|
||||||
|
return m_parent ? m_parent->name().isEmpty() : false;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
case TypeRole:
|
||||||
|
return m_type;
|
||||||
|
}
|
||||||
|
return QVariant();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool TestTreeItem::setData(int /*column*/, const QVariant &data, int role)
|
||||||
|
{
|
||||||
|
if (role == Qt::CheckStateRole) {
|
||||||
|
Qt::CheckState old = checked();
|
||||||
|
setChecked((Qt::CheckState)data.toInt());
|
||||||
|
return checked() != old;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
int TestTreeItem::row() const
|
int TestTreeItem::row() const
|
||||||
{
|
{
|
||||||
if (m_parent)
|
if (m_parent)
|
||||||
|
@@ -24,6 +24,18 @@
|
|||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QMetaType>
|
#include <QMetaType>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
class QVariant;
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
enum ItemRole {
|
||||||
|
LinkRole = Qt::UserRole + 2, // can be removed if AnnotationRole comes back
|
||||||
|
ItalicRole, // used only inside the delegate
|
||||||
|
TypeRole
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
namespace Autotest {
|
namespace Autotest {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
@@ -48,6 +60,8 @@ public:
|
|||||||
TestTreeItem *child(int row) const;
|
TestTreeItem *child(int row) const;
|
||||||
TestTreeItem *parent() const;
|
TestTreeItem *parent() const;
|
||||||
void appendChild(TestTreeItem *child);
|
void appendChild(TestTreeItem *child);
|
||||||
|
QVariant data(int column, int role) const;
|
||||||
|
bool setData(int column, const QVariant &data, int role);
|
||||||
int row() const;
|
int row() const;
|
||||||
int childCount() const;
|
int childCount() const;
|
||||||
void removeChildren();
|
void removeChildren();
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include "testtreeitem.h"
|
||||||
#include "testtreeitemdelegate.h"
|
#include "testtreeitemdelegate.h"
|
||||||
#include "testtreemodel.h"
|
#include "testtreemodel.h"
|
||||||
|
|
||||||
|
@@ -33,8 +33,6 @@
|
|||||||
|
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
#include <QIcon>
|
|
||||||
|
|
||||||
namespace Autotest {
|
namespace Autotest {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
@@ -176,19 +174,6 @@ int TestTreeModel::columnCount(const QModelIndex &) const
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QIcon testTreeIcon(TestTreeItem::Type type)
|
|
||||||
{
|
|
||||||
static QIcon icons[] = {
|
|
||||||
QIcon(),
|
|
||||||
QIcon(QLatin1String(":/images/class.png")),
|
|
||||||
QIcon(QLatin1String(":/images/func.png")),
|
|
||||||
QIcon(QLatin1String(":/images/data.png"))
|
|
||||||
};
|
|
||||||
if (type >= sizeof(icons) / sizeof(icons[0]))
|
|
||||||
return icons[2];
|
|
||||||
return icons[type];
|
|
||||||
}
|
|
||||||
|
|
||||||
QVariant TestTreeModel::data(const QModelIndex &index, int role) const
|
QVariant TestTreeModel::data(const QModelIndex &index, int role) const
|
||||||
{
|
{
|
||||||
if (!index.isValid())
|
if (!index.isValid())
|
||||||
@@ -198,73 +183,7 @@ QVariant TestTreeModel::data(const QModelIndex &index, int role) const
|
|||||||
if (!item)
|
if (!item)
|
||||||
return QVariant();
|
return QVariant();
|
||||||
|
|
||||||
if (role == Qt::DisplayRole) {
|
return item->data(index.column(), role);
|
||||||
if ((item == m_autoTestRootItem && m_autoTestRootItem->childCount() == 0)
|
|
||||||
|| (item == m_quickTestRootItem && m_quickTestRootItem->childCount() == 0)) {
|
|
||||||
return QString(item->name() + tr(" (none)"));
|
|
||||||
} else {
|
|
||||||
if (item->name().isEmpty() && item->type() == TestTreeItem::TEST_CLASS)
|
|
||||||
return tr(Constants::UNNAMED_QUICKTESTS);
|
|
||||||
return item->name();
|
|
||||||
}
|
|
||||||
|
|
||||||
return QVariant(); // TODO ?
|
|
||||||
}
|
|
||||||
switch(role) {
|
|
||||||
case Qt::ToolTipRole:
|
|
||||||
if (item->type() == TestTreeItem::TEST_CLASS && item->name().isEmpty())
|
|
||||||
return tr("<p>Give all test cases a name to ensure correct behavior "
|
|
||||||
"when running test cases and to be able to select them.</p>");
|
|
||||||
return item->filePath();
|
|
||||||
case Qt::DecorationRole:
|
|
||||||
return testTreeIcon(item->type());
|
|
||||||
case Qt::CheckStateRole:
|
|
||||||
switch (item->type()) {
|
|
||||||
case TestTreeItem::ROOT:
|
|
||||||
case TestTreeItem::TEST_DATATAG:
|
|
||||||
case TestTreeItem::TEST_DATAFUNCTION:
|
|
||||||
case TestTreeItem::TEST_SPECIALFUNCTION:
|
|
||||||
return QVariant();
|
|
||||||
case TestTreeItem::TEST_CLASS:
|
|
||||||
if (item->name().isEmpty())
|
|
||||||
return QVariant();
|
|
||||||
else
|
|
||||||
return item->checked();
|
|
||||||
case TestTreeItem::TEST_FUNCTION:
|
|
||||||
if (TestTreeItem *parent = item->parent())
|
|
||||||
return parent->name().isEmpty() ? QVariant() : item->checked();
|
|
||||||
else
|
|
||||||
return item->checked();
|
|
||||||
default:
|
|
||||||
return item->checked();
|
|
||||||
}
|
|
||||||
case LinkRole: {
|
|
||||||
QVariant itemLink;
|
|
||||||
TextEditor::TextEditorWidget::Link link(item->filePath(), item->line(), item->column());
|
|
||||||
itemLink.setValue(link);
|
|
||||||
return itemLink;
|
|
||||||
}
|
|
||||||
case ItalicRole:
|
|
||||||
switch (item->type()) {
|
|
||||||
case TestTreeItem::TEST_DATAFUNCTION:
|
|
||||||
case TestTreeItem::TEST_SPECIALFUNCTION:
|
|
||||||
return true;
|
|
||||||
case TestTreeItem::TEST_CLASS:
|
|
||||||
return item->name().isEmpty();
|
|
||||||
case TestTreeItem::TEST_FUNCTION:
|
|
||||||
if (TestTreeItem *parent = item->parent())
|
|
||||||
return parent->name().isEmpty();
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
case TypeRole:
|
|
||||||
return item->type();
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO ?
|
|
||||||
return QVariant();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TestTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
bool TestTreeModel::setData(const QModelIndex &index, const QVariant &value, int role)
|
||||||
@@ -272,27 +191,23 @@ bool TestTreeModel::setData(const QModelIndex &index, const QVariant &value, int
|
|||||||
if (!index.isValid())
|
if (!index.isValid())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (role == Qt::CheckStateRole) {
|
|
||||||
TestTreeItem *item = static_cast<TestTreeItem *>(index.internalPointer());
|
TestTreeItem *item = static_cast<TestTreeItem *>(index.internalPointer());
|
||||||
Qt::CheckState old = item->checked();
|
if (item && item->setData(index.column(), value, role)) {
|
||||||
item->setChecked((Qt::CheckState)value.toInt());
|
|
||||||
if (item->checked() != old) {
|
|
||||||
switch(item->type()) {
|
|
||||||
case TestTreeItem::TEST_CLASS:
|
|
||||||
emit dataChanged(index, index);
|
emit dataChanged(index, index);
|
||||||
if (item->childCount() > 0) {
|
if (role == Qt::CheckStateRole) {
|
||||||
|
switch (item->type()) {
|
||||||
|
case TestTreeItem::TEST_CLASS:
|
||||||
|
if (item->childCount() > 0)
|
||||||
emit dataChanged(index.child(0, 0), index.child(item->childCount() - 1, 0));
|
emit dataChanged(index.child(0, 0), index.child(item->childCount() - 1, 0));
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case TestTreeItem::TEST_FUNCTION:
|
case TestTreeItem::TEST_FUNCTION:
|
||||||
emit dataChanged(index, index);
|
|
||||||
emit dataChanged(index.parent(), index.parent());
|
emit dataChanged(index.parent(), index.parent());
|
||||||
break;
|
break;
|
||||||
default: // avoid warning regarding unhandled enum member
|
default: // avoid warning regarding unhandled enum member
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@@ -27,15 +27,6 @@
|
|||||||
#include <QAbstractItemModel>
|
#include <QAbstractItemModel>
|
||||||
#include <QSortFilterProxyModel>
|
#include <QSortFilterProxyModel>
|
||||||
|
|
||||||
namespace {
|
|
||||||
enum ItemRole {
|
|
||||||
// AnnotationRole = Qt::UserRole + 1,
|
|
||||||
LinkRole = Qt::UserRole + 2, // can be removed if AnnotationRole comes back
|
|
||||||
ItalicRole, // used only inside the delegate
|
|
||||||
TypeRole
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace Autotest {
|
namespace Autotest {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user