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 <utils/qtcassert.h>
|
||||
|
||||
#include <QIcon>
|
||||
#include <QVariant>
|
||||
|
||||
#include <texteditor/texteditor.h>
|
||||
|
||||
namespace Autotest {
|
||||
namespace Internal {
|
||||
|
||||
@@ -78,6 +84,85 @@ void TestTreeItem::appendChild(TestTreeItem *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
|
||||
{
|
||||
if (m_parent)
|
||||
|
@@ -24,6 +24,18 @@
|
||||
#include <QString>
|
||||
#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 Internal {
|
||||
|
||||
@@ -48,6 +60,8 @@ public:
|
||||
TestTreeItem *child(int row) const;
|
||||
TestTreeItem *parent() const;
|
||||
void appendChild(TestTreeItem *child);
|
||||
QVariant data(int column, int role) const;
|
||||
bool setData(int column, const QVariant &data, int role);
|
||||
int row() const;
|
||||
int childCount() const;
|
||||
void removeChildren();
|
||||
|
@@ -17,6 +17,7 @@
|
||||
**
|
||||
****************************************************************************/
|
||||
|
||||
#include "testtreeitem.h"
|
||||
#include "testtreeitemdelegate.h"
|
||||
#include "testtreemodel.h"
|
||||
|
||||
|
@@ -33,8 +33,6 @@
|
||||
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
#include <QIcon>
|
||||
|
||||
namespace Autotest {
|
||||
namespace Internal {
|
||||
|
||||
@@ -176,19 +174,6 @@ int TestTreeModel::columnCount(const QModelIndex &) const
|
||||
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
|
||||
{
|
||||
if (!index.isValid())
|
||||
@@ -198,73 +183,7 @@ QVariant TestTreeModel::data(const QModelIndex &index, int role) const
|
||||
if (!item)
|
||||
return QVariant();
|
||||
|
||||
if (role == Qt::DisplayRole) {
|
||||
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();
|
||||
return item->data(index.column(), 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())
|
||||
return false;
|
||||
|
||||
if (role == Qt::CheckStateRole) {
|
||||
TestTreeItem *item = static_cast<TestTreeItem *>(index.internalPointer());
|
||||
Qt::CheckState old = item->checked();
|
||||
item->setChecked((Qt::CheckState)value.toInt());
|
||||
if (item->checked() != old) {
|
||||
switch(item->type()) {
|
||||
TestTreeItem *item = static_cast<TestTreeItem *>(index.internalPointer());
|
||||
if (item && item->setData(index.column(), value, role)) {
|
||||
emit dataChanged(index, index);
|
||||
if (role == Qt::CheckStateRole) {
|
||||
switch (item->type()) {
|
||||
case TestTreeItem::TEST_CLASS:
|
||||
emit dataChanged(index, index);
|
||||
if (item->childCount() > 0) {
|
||||
if (item->childCount() > 0)
|
||||
emit dataChanged(index.child(0, 0), index.child(item->childCount() - 1, 0));
|
||||
}
|
||||
break;
|
||||
case TestTreeItem::TEST_FUNCTION:
|
||||
emit dataChanged(index, index);
|
||||
emit dataChanged(index.parent(), index.parent());
|
||||
break;
|
||||
default: // avoid warning regarding unhandled enum member
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
@@ -27,15 +27,6 @@
|
||||
#include <QAbstractItemModel>
|
||||
#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 Internal {
|
||||
|
||||
|
Reference in New Issue
Block a user