From aabb6d353929b7da2436a8c2b7fa6792a857d773 Mon Sep 17 00:00:00 2001 From: Alessandro Portale Date: Mon, 10 May 2021 20:04:30 +0200 Subject: [PATCH] Tracing: Add a manual test A minimal application that displays the tracing view with some dummy data. Change-Id: Ie564a3be017731313659aef7958138613b0bb94d Reviewed-by: Christian Stenger --- tests/manual/widgets/CMakeLists.txt | 1 + tests/manual/widgets/tracing/CMakeLists.txt | 9 + tests/manual/widgets/tracing/tracing.qbs | 16 ++ .../tracing/tst_manual_widgets_tracing.cpp | 175 ++++++++++++++++++ tests/manual/widgets/widgets.qbs | 1 + 5 files changed, 202 insertions(+) create mode 100644 tests/manual/widgets/tracing/CMakeLists.txt create mode 100644 tests/manual/widgets/tracing/tracing.qbs create mode 100644 tests/manual/widgets/tracing/tst_manual_widgets_tracing.cpp diff --git a/tests/manual/widgets/CMakeLists.txt b/tests/manual/widgets/CMakeLists.txt index c7ce793d3ee..9e5a48eb20d 100644 --- a/tests/manual/widgets/CMakeLists.txt +++ b/tests/manual/widgets/CMakeLists.txt @@ -1,3 +1,4 @@ add_subdirectory(crumblepath) add_subdirectory(infolabel) add_subdirectory(manhattanstyle) +add_subdirectory(tracing) diff --git a/tests/manual/widgets/tracing/CMakeLists.txt b/tests/manual/widgets/tracing/CMakeLists.txt new file mode 100644 index 00000000000..0de9edb7e03 --- /dev/null +++ b/tests/manual/widgets/tracing/CMakeLists.txt @@ -0,0 +1,9 @@ +add_qtc_executable(tst_manual_widgets_tracing + CONDITION TARGET Tracing + DEPENDS Tracing Utils Core Qt5::Gui Qt5::Quick + SOURCES + tst_manual_widgets_tracing.cpp + ../common/themeselector.cpp ../common/themeselector.h + ../common/themes.qrc + PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} +) diff --git a/tests/manual/widgets/tracing/tracing.qbs b/tests/manual/widgets/tracing/tracing.qbs new file mode 100644 index 00000000000..06bbc4edd4a --- /dev/null +++ b/tests/manual/widgets/tracing/tracing.qbs @@ -0,0 +1,16 @@ +import "../common/common.qbs" as Common + +CppApplication { + name: "Manual Test Tracing" + + Depends { name: "Qt.quick" } + Depends { name: "Tracing" } + Depends { name: "Utils" } + Depends { name: "Core" } + + files: [ + "tst_manual_widgets_tracing.cpp", + ] + + Common {} +} diff --git a/tests/manual/widgets/tracing/tst_manual_widgets_tracing.cpp b/tests/manual/widgets/tracing/tst_manual_widgets_tracing.cpp new file mode 100644 index 00000000000..baa879dc3ae --- /dev/null +++ b/tests/manual/widgets/tracing/tst_manual_widgets_tracing.cpp @@ -0,0 +1,175 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include "../common/themeselector.h" + +using namespace Timeline; + +static const qint64 oneMs = 1000 * 1000; // in nanoseconds + +class DummyModel : public Timeline::TimelineModel +{ +public: + DummyModel(TimelineModelAggregator *parent) + : TimelineModel(parent) + { + setDisplayName("Dummy Category"); + setCollapsedRowCount(1); + setExpandedRowCount(3); + setTooltip("This is a tool tip"); // Tooltip on the title on the left + setCategoryColor(Qt::yellow); + } + + QRgb color(int index) const override + { + return QColor::fromHsl(index * 20, 96, 128).rgb(); // Red to green + } + + // Called when a range gets selected, requests index of row which a range belongs to + int expandedRow(int index) const override + { + return selectionId(index) % expandedRowCount(); // Distribute selections among rows + } + + // Called when the category gets expanded + QVariantList labels() const override + { + QVariantList result; + + QVariantMap element; + element.insert(QLatin1String("description"), QVariant("Dummy sub category 1")); + element.insert(QLatin1String("id"), 0); + result << element; + + element.clear(); + element.insert(QLatin1String("description"), QVariant("Dummy sub category 2")); + element.insert(QLatin1String("id"), 1); + result << element; + + return result; + } + + // Called when a range (or track) is selected + QVariantMap details(int index) const override + { + QVariantMap result; + result.insert(QLatin1String("displayName"), + QString::fromLatin1("Details for range %1").arg(index)); + result.insert(QLatin1String("Foo A"), QString::fromLatin1("Bar %1a").arg(index)); + result.insert(QLatin1String("Foo B"), QString::fromLatin1("Bar %1b").arg(index)); + return result; + } + + float relativeHeight(int index) const override + { + return 1.0 - (index / 10.0); // Shrink over time + } + + void populateData() + { + // One region per selection + insert(oneMs * 20, oneMs * 20, 0); + insert(oneMs * 100, oneMs * 30, 1); + + // Two regions in the same selection + insert(oneMs * 40, oneMs * 20, 2); + insert(oneMs * 120, oneMs * 30, 2); + + // Three regions in the same selection + insert(oneMs * 60, oneMs * 30, 3); + insert(oneMs * 140, oneMs * 20, 3); + insert(oneMs * 170, oneMs * 20, 3); + + emit contentChanged(); + } +}; + +class TraceView : public QQuickView +{ +public: + TraceView(QWindow *parent = 0) + : QQuickView(parent) + { + setResizeMode(QQuickView::SizeRootObjectToView); + + qmlRegisterType("TimelineRenderer", 1, 0, "TimelineRenderer"); + qmlRegisterType( + "TimelineOverviewRenderer", 1, 0, "TimelineOverviewRenderer"); + qmlRegisterAnonymousType("TimelineZoomControl", 1); + qmlRegisterAnonymousType("TimelineModel", 1); + qmlRegisterAnonymousType("TimelineNotesModel", 1); + + TimelineTheme::setupTheme(engine()); + TimeFormatter::setupTimeFormatter(); + + m_modelAggregator = new TimelineModelAggregator(this); + m_model = new DummyModel(m_modelAggregator); + m_model->populateData(); + m_modelAggregator->setModels({QVariant::fromValue(m_model)}); + rootContext()->setContextProperty(QLatin1String("timelineModelAggregator"), + m_modelAggregator); + + m_zoomControl = new TimelineZoomControl(this); + m_zoomControl->setTrace(0, oneMs * 1000); // Total timeline length + rootContext()->setContextProperty("zoomControl", m_zoomControl); + setSource(QUrl(QLatin1String("qrc:/tracing/MainView.qml"))); + + // Zoom onto first timeline third. Needs to be done after loading setSource. + m_zoomControl->setRange(0, oneMs * 1000 / 3.0); + } + + ~TraceView() override = default; + + DummyModel *m_model; + TimelineModelAggregator *m_modelAggregator; + TimelineZoomControl *m_zoomControl; +}; + +int main(int argc, char *argv[]) +{ + QApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); + + QApplication app(argc, argv); + + ManualTest::ThemeSelector::setTheme(":/themes/flat.creatortheme"); + + auto view = new TraceView; + view->resize(700, 300); + view->show(); + + return app.exec(); +} diff --git a/tests/manual/widgets/widgets.qbs b/tests/manual/widgets/widgets.qbs index fff0c158c0e..2d55a7c3478 100644 --- a/tests/manual/widgets/widgets.qbs +++ b/tests/manual/widgets/widgets.qbs @@ -9,5 +9,6 @@ Project { "crumblepath/crumblepath.qbs", "infolabel/infolabel.qbs", "manhattanstyle/manhattanstyle.qbs", + "tracing/tracing.qbs", ] }