From 94b42da80ae5f364b8d5fd31d01e5ee349040f3c Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 13 May 2015 18:23:38 +0200 Subject: Timeline: Make 0-width events visible again. Events with duration == 0 were erroneously filtered out by the items render pass. Also, we have to give them a very small width in order for the "stretching" mechanism in the vertex shader to work. Change-Id: Icb76168f0831547a3ca55ab79df7161736ed4dc4 Task-number: QTCREATORBUG-14446 Reviewed-by: Eike Ziller Reviewed-by: Joerg Bornemann --- src/libs/timeline/qml/timelineitems.vert | 2 +- src/libs/timeline/timelineitemsrenderpass.cpp | 7 ++++--- .../tst_timelineitemsrenderpass.cpp | 21 +++++++++++++-------- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/libs/timeline/qml/timelineitems.vert b/src/libs/timeline/qml/timelineitems.vert index cea5b49cd4..f8cfb40adb 100644 --- a/src/libs/timeline/qml/timelineitems.vert +++ b/src/libs/timeline/qml/timelineitems.vert @@ -48,7 +48,7 @@ void main() // Make very narrow events somewhat wider so that they don't collapse into 0 pixels float scaledWidth = scale.x * rectSize.x; - float shift = sign(scaledWidth) * max(0.0, 3.0 - abs(scaledWidth)) * 0.0005; + float shift = sign(rectSize.x) * max(0.0, 3.0 - abs(scaledWidth)) * 0.0005; gl_Position.x += shift; // Ditto for events with very small height diff --git a/src/libs/timeline/timelineitemsrenderpass.cpp b/src/libs/timeline/timelineitemsrenderpass.cpp index 41f0a362cd..114cd5983a 100644 --- a/src/libs/timeline/timelineitemsrenderpass.cpp +++ b/src/libs/timeline/timelineitemsrenderpass.cpp @@ -202,7 +202,7 @@ static void updateNodes(int from, int to, const TimelineModel *model, for (int i = from; i < to; ++i) { qint64 start = qMax(parentState->start(), model->startTime(i)); qint64 end = qMin(parentState->end(), model->startTime(i) + model->duration(i)); - if (start >= end) + if (start > end) continue; float itemTop = (1.0 - model->relativeHeight(i)) * defaultRowHeight; @@ -230,7 +230,7 @@ static void updateNodes(int from, int to, const TimelineModel *model, for (int i = from; i < to; ++i) { qint64 start = qMax(parentState->start(), model->startTime(i)); qint64 end = qMin(parentState->end(), model->startTime(i) + model->duration(i)); - if (start >= end) + if (start > end) continue; QColor color = model->color(i); @@ -238,7 +238,8 @@ static void updateNodes(int from, int to, const TimelineModel *model, uchar green = color.green(); uchar blue = color.blue(); - float itemWidth = (end - start) * parentState->scale(); + float itemWidth = end > start ? (end - start) * parentState->scale() : + std::numeric_limits::min(); float itemLeft = (start - parentState->start()) * parentState->scale(); // This has to be the exact same expression as above, to guarantee determinism. diff --git a/tests/auto/timeline/timelineitemsrenderpass/tst_timelineitemsrenderpass.cpp b/tests/auto/timeline/timelineitemsrenderpass/tst_timelineitemsrenderpass.cpp index c2cff9cffb..b7944890af 100644 --- a/tests/auto/timeline/timelineitemsrenderpass/tst_timelineitemsrenderpass.cpp +++ b/tests/auto/timeline/timelineitemsrenderpass/tst_timelineitemsrenderpass.cpp @@ -105,6 +105,8 @@ void DummyModel::loadData() { for (int i = 0; i < 10; ++i) insert(i, 1, 1); + + insert(5, 0, 10); } float DummyModel::relativeHeight(int index) const @@ -139,7 +141,7 @@ void tst_TimelineItemsRenderPass::update() result = inst->update(&renderer, &parentState, 0, 0, 0, true, 1); QCOMPARE(result, nullState); - result = inst->update(&renderer, &parentState, 0, 2, 8, true, 1); + result = inst->update(&renderer, &parentState, 0, 2, 9, true, 1); QVERIFY(result != nullState); QCOMPARE(result->expandedOverlay(), nullNode); QCOMPARE(result->expandedOverlay(), nullNode); @@ -150,10 +152,10 @@ void tst_TimelineItemsRenderPass::update() QSGGeometryNode *node = static_cast(result->expandedRows()[0]->firstChild()); QSGMaterial *material1 = node->material(); QVERIFY(material1 != 0); - QCOMPARE(node->geometry()->vertexCount(), 26); + QCOMPARE(node->geometry()->vertexCount(), 30); node = static_cast(result->collapsedRows()[0]->firstChild()); QSGMaterial *material2 = node->material(); - QCOMPARE(node->geometry()->vertexCount(), 26); + QCOMPARE(node->geometry()->vertexCount(), 30); QVERIFY(material2 != 0); QCOMPARE(material1->type(), material2->type()); QSGMaterialShader *shader1 = material1->createShader(); @@ -165,17 +167,20 @@ void tst_TimelineItemsRenderPass::update() delete shader1; delete shader2; - result = inst->update(&renderer, &parentState, result, 0, 10, true, 1); + result = inst->update(&renderer, &parentState, result, 0, 11, true, 1); QVERIFY(result != nullState); QCOMPARE(result->expandedOverlay(), nullNode); QCOMPARE(result->expandedOverlay(), nullNode); QCOMPARE(result->expandedRows().count(), 1); QCOMPARE(result->collapsedRows().count(), 1); - QCOMPARE(result->expandedRows()[0]->childCount(), 2); - QCOMPARE(result->collapsedRows()[0]->childCount(), 2); - node = static_cast(result->expandedRows()[0]->lastChild()); + + // 0-sized node starting at 8 may also be added. We don't test for this one. + QVERIFY(result->expandedRows()[0]->childCount() > 1); + QVERIFY(result->collapsedRows()[0]->childCount() > 1); + + node = static_cast(result->expandedRows()[0]->childAtIndex(1)); QCOMPARE(node->geometry()->vertexCount(), 8); - node = static_cast(result->collapsedRows()[0]->lastChild()); + node = static_cast(result->collapsedRows()[0]->childAtIndex(1)); QCOMPARE(node->geometry()->vertexCount(), 8); model.setExpanded(true); -- cgit v1.2.3