AutoTest: Use TypedTreeItem for TestResultItem

Simplifies code and reduces (visible) static_casts on
the auto test plugin's side.

Change-Id: I31ae3e4f1a32d3e74527ccb36080944848f3b1fa
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Stenger
2019-02-06 08:57:33 +01:00
parent 791d791f2c
commit 7ba74c2ba4
3 changed files with 27 additions and 30 deletions

View File

@@ -148,6 +148,11 @@ public:
}; };
TreeItem::insertOrderedChild(item, cmp0); TreeItem::insertOrderedChild(item, cmp0);
} }
ChildType *reverseFindAnyChild(const std::function<bool(TreeItem *)> &pred) const
{
return static_cast<ChildType *>(TreeItem::reverseFindAnyChild(pred));
}
}; };
class QTCREATOR_UTILS_EXPORT StaticTreeItem : public TreeItem class QTCREATOR_UTILS_EXPORT StaticTreeItem : public TreeItem

View File

@@ -163,7 +163,7 @@ TestResultItem *TestResultItem::intermediateFor(const TestResultItem *item) cons
QTC_ASSERT(item, return nullptr); QTC_ASSERT(item, return nullptr);
const TestResult *otherResult = item->testResult(); const TestResult *otherResult = item->testResult();
for (int row = childCount() - 1; row >= 0; --row) { for (int row = childCount() - 1; row >= 0; --row) {
TestResultItem *child = static_cast<TestResultItem *>(childAt(row)); TestResultItem *child = childAt(row);
const TestResult *testResult = child->testResult(); const TestResult *testResult = child->testResult();
if (testResult->result() != Result::MessageIntermediate) if (testResult->result() != Result::MessageIntermediate)
continue; continue;
@@ -186,7 +186,7 @@ TestResultItem *TestResultItem::createAndAddIntermediateFor(const TestResultItem
/********************************* TestResultModel *****************************************/ /********************************* TestResultModel *****************************************/
TestResultModel::TestResultModel(QObject *parent) TestResultModel::TestResultModel(QObject *parent)
: Utils::TreeModel<>(parent) : Utils::TreeModel<TestResultItem>(new TestResultItem(TestResultPtr()), parent)
{ {
} }
@@ -194,16 +194,15 @@ void TestResultModel::updateParent(const TestResultItem *item)
{ {
QTC_ASSERT(item, return); QTC_ASSERT(item, return);
QTC_ASSERT(item->testResult(), return); QTC_ASSERT(item->testResult(), return);
Utils::TreeItem *parentItem = item->parent(); TestResultItem *parentItem = item->parent();
if (parentItem == rootItem()) // do not update invisible root item if (parentItem == rootItem()) // do not update invisible root item
return; return;
bool changed = false; bool changed = false;
TestResultItem *parentResultItem = static_cast<TestResultItem *>(parentItem); parentItem->updateResult(changed, item->testResult()->result());
parentResultItem->updateResult(changed, item->testResult()->result());
if (!changed) if (!changed)
return; return;
emit dataChanged(parentItem->index(), parentItem->index()); emit dataChanged(parentItem->index(), parentItem->index());
updateParent(parentResultItem); updateParent(parentItem);
} }
void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoExpand) void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoExpand)
@@ -212,7 +211,7 @@ void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoEx
if (testResult->result() == Result::MessageCurrentTest) { if (testResult->result() == Result::MessageCurrentTest) {
// MessageCurrentTest should always be the last top level item // MessageCurrentTest should always be the last top level item
if (lastRow >= 0) { if (lastRow >= 0) {
TestResultItem *current = static_cast<TestResultItem *>(rootItem()->childAt(lastRow)); TestResultItem *current = rootItem()->childAt(lastRow);
const TestResult *result = current->testResult(); const TestResult *result = current->testResult();
if (result && result->result() == Result::MessageCurrentTest) { if (result && result->result() == Result::MessageCurrentTest) {
current->updateDescription(testResult->description()); current->updateDescription(testResult->description());
@@ -235,14 +234,11 @@ void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoEx
if (AutotestPlugin::settings()->displayApplication) { if (AutotestPlugin::settings()->displayApplication) {
const QString application = testResult->id(); const QString application = testResult->id();
if (!application.isEmpty()) { if (!application.isEmpty()) {
for (int row = rootItem()->childCount() - 1; row >= 0; --row) { root = rootItem()->findFirstLevelChild([&application](TestResultItem *child) {
TestResultItem *tmp = static_cast<TestResultItem *>(rootItem()->childAt(row)); QTC_ASSERT(child, return false);
auto tmpTestResult = tmp->testResult(); return child->testResult()->id() == application;
if (tmpTestResult->id() == application) { });
root = tmp;
break;
}
}
if (!root) { if (!root) {
TestResult *tmpAppResult = new TestResult(application, application); TestResult *tmpAppResult = new TestResult(application, application);
tmpAppResult->setResult(Result::Application); tmpAppResult->setResult(Result::Application);
@@ -264,7 +260,7 @@ void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoEx
updateParent(newItem); updateParent(newItem);
} else { } else {
if (lastRow >= 0) { if (lastRow >= 0) {
TestResultItem *current = static_cast<TestResultItem *>(rootItem()->childAt(lastRow)); TestResultItem *current = rootItem()->childAt(lastRow);
const TestResult *result = current->testResult(); const TestResult *result = current->testResult();
if (result && result->result() == Result::MessageCurrentTest) { if (result && result->result() == Result::MessageCurrentTest) {
rootItem()->insertChild(current->index().row(), newItem); rootItem()->insertChild(current->index().row(), newItem);
@@ -278,15 +274,11 @@ void TestResultModel::addTestResult(const TestResultPtr &testResult, bool autoEx
void TestResultModel::removeCurrentTestMessage() void TestResultModel::removeCurrentTestMessage()
{ {
std::vector<Utils::TreeItem *> topLevelItems(rootItem()->begin(), rootItem()->end()); TestResultItem *currentMessageItem = rootItem()->findFirstLevelChild([](TestResultItem *it) {
auto end = topLevelItems.rend(); return (it->testResult()->result() == Result::MessageCurrentTest);
for (auto it = topLevelItems.rbegin(); it != end; ++it) { });
TestResultItem *current = static_cast<TestResultItem *>(*it); if (currentMessageItem)
if (current->testResult()->result() == Result::MessageCurrentTest) { destroyItem(currentMessageItem);
destroyItem(current);
break;
}
}
} }
void TestResultModel::clearTestResults() void TestResultModel::clearTestResults()
@@ -302,7 +294,7 @@ void TestResultModel::clearTestResults()
const TestResult *TestResultModel::testResult(const QModelIndex &idx) const TestResult *TestResultModel::testResult(const QModelIndex &idx)
{ {
if (idx.isValid()) if (idx.isValid())
return static_cast<TestResultItem *>(itemForIndex(idx))->testResult(); return itemForIndex(idx)->testResult();
return nullptr; return nullptr;
} }
@@ -353,7 +345,7 @@ TestResultItem *TestResultModel::findParentItemFor(const TestResultItem *item,
if (root == nullptr && !name.isEmpty()) { if (root == nullptr && !name.isEmpty()) {
for (int row = rootItem()->childCount() - 1; row >= 0; --row) { for (int row = rootItem()->childCount() - 1; row >= 0; --row) {
TestResultItem *tmp = static_cast<TestResultItem *>(rootItem()->childAt(row)); TestResultItem *tmp = rootItem()->childAt(row);
auto tmpTestResult = tmp->testResult(); auto tmpTestResult = tmp->testResult();
if (tmpTestResult->id() == id && tmpTestResult->name() == name) { if (tmpTestResult->id() == id && tmpTestResult->name() == name) {
root = tmp; root = tmp;
@@ -369,7 +361,7 @@ TestResultItem *TestResultModel::findParentItemFor(const TestResultItem *item,
TestResultItem *currentItem = static_cast<TestResultItem *>(it); TestResultItem *currentItem = static_cast<TestResultItem *>(it);
return currentItem->testResult()->isDirectParentOf(result, &needsIntermediate); return currentItem->testResult()->isDirectParentOf(result, &needsIntermediate);
}; };
TestResultItem *parent = static_cast<TestResultItem *>(root->reverseFindAnyChild(predicate)); TestResultItem *parent = root->reverseFindAnyChild(predicate);
if (parent) { if (parent) {
if (needsIntermediate) { if (needsIntermediate) {
// check if the intermediate is present already // check if the intermediate is present already

View File

@@ -37,7 +37,7 @@
namespace Autotest { namespace Autotest {
namespace Internal { namespace Internal {
class TestResultItem : public Utils::TreeItem class TestResultItem : public Utils::TypedTreeItem<TestResultItem, TestResultItem>
{ {
public: public:
explicit TestResultItem(const TestResultPtr &testResult); explicit TestResultItem(const TestResultPtr &testResult);
@@ -53,7 +53,7 @@ private:
TestResultPtr m_testResult; TestResultPtr m_testResult;
}; };
class TestResultModel : public Utils::TreeModel<> class TestResultModel : public Utils::TreeModel<TestResultItem>
{ {
public: public:
explicit TestResultModel(QObject *parent = nullptr); explicit TestResultModel(QObject *parent = nullptr);