Commit 475d6b3a authored by Christian Stenger's avatar Christian Stenger
Browse files

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: default avatarDavid Schulz <david.schulz@theqtcompany.com>
parent 65d3a27d
......@@ -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 {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment