From 6fa4722020bd74ef4b6b9937bb33b2635d9ac228 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Mon, 19 Dec 2016 11:29:40 +0100 Subject: [PATCH] Timeline: Use formatTime also from QML Change-Id: I14c8e8a216008c2dafaa2d42bd3237d33cc2b781 Reviewed-by: Christian Kandeler --- src/libs/timeline/qml/MainView.qml | 1 + .../timeline/qml/SelectionRangeDetails.qml | 24 +++++---------- src/libs/timeline/qml/TimeDisplay.qml | 29 ++----------------- src/libs/timeline/timelineformattime.cpp | 15 ++++++++++ src/libs/timeline/timelineformattime.h | 13 +++++++++ .../qmlprofiler/qmlprofilertraceview.cpp | 2 ++ 6 files changed, 41 insertions(+), 43 deletions(-) diff --git a/src/libs/timeline/qml/MainView.qml b/src/libs/timeline/qml/MainView.qml index 51a51e80855..ca19e81e337 100644 --- a/src/libs/timeline/qml/MainView.qml +++ b/src/libs/timeline/qml/MainView.qml @@ -341,6 +341,7 @@ Rectangle { startTime: zoomControl.selectionStart duration: zoomControl.selectionDuration endTime: zoomControl.selectionEnd + referenceDuration: zoomControl.rangeDuration showDuration: selectionRange.rangeWidth > 1 hasContents: selectionRangeMode && selectionRange.creationState !== selectionRange.creationInactive diff --git a/src/libs/timeline/qml/SelectionRangeDetails.qml b/src/libs/timeline/qml/SelectionRangeDetails.qml index 83cbb2b25f6..458e5cf7ad4 100644 --- a/src/libs/timeline/qml/SelectionRangeDetails.qml +++ b/src/libs/timeline/qml/SelectionRangeDetails.qml @@ -25,6 +25,7 @@ import QtQuick 2.1 import TimelineTheme 1.0 +import TimelineTimeFormatter 1.0 Item { id: selectionRangeDetails @@ -32,9 +33,10 @@ Item { signal recenter signal close - property string startTime - property string endTime - property string duration + property double startTime + property double endTime + property double duration + property double referenceDuration property bool showDuration property bool hasContents @@ -48,16 +50,6 @@ Item { onHeightChanged: fitInView(); } - function detailedPrintTime( t ) - { - if (t <= 0) return "0"; - if (t<1000) return t+" ns"; - t = Math.floor(t/1000); - if (t<1000) return t+" μs"; - if (t<1e6) return (t/1000) + " ms"; - return (t/1e6) + " s"; - } - function fitInView() { // don't reposition if it does not fit if (parent.width < width || parent.height < height) @@ -108,11 +100,11 @@ Item { id: details property var contents: [ qsTr("Start") + ":", - detailedPrintTime(startTime), + TimeFormatter.format(startTime, referenceDuration), (qsTr("End") + ":"), - detailedPrintTime(endTime), + TimeFormatter.format(endTime, referenceDuration), (qsTr("Duration") + ":"), - detailedPrintTime(duration) + TimeFormatter.format(duration, referenceDuration) ] model: showDuration ? 6 : 2 diff --git a/src/libs/timeline/qml/TimeDisplay.qml b/src/libs/timeline/qml/TimeDisplay.qml index b671aa0a58f..3dd3a4df053 100644 --- a/src/libs/timeline/qml/TimeDisplay.qml +++ b/src/libs/timeline/qml/TimeDisplay.qml @@ -25,6 +25,7 @@ import QtQuick 2.1 import TimelineTheme 1.0 +import TimelineTimeFormatter 1.0 Item { id: timeDisplay @@ -48,32 +49,6 @@ Item { property int contentX property int offsetX: contentX + Math.round((windowStart % timePerBlock) * spacing) - readonly property var timeUnits: ["μs", "ms", "s"] - function prettyPrintTime(t, rangeDuration) { - if (rangeDuration < 1) - return "" - - var round = 1; - var barrier = 1; - - for (var i = 0; i < timeUnits.length; ++i) { - barrier *= 1000; - if (rangeDuration < barrier) - round *= 1000; - else if (rangeDuration < barrier * 10) - round *= 100; - else if (rangeDuration < barrier * 100) - round *= 10; - if (t < barrier * 1000) - return Math.floor(t / (barrier / round)) / round + timeUnits[i]; - } - - t /= barrier; - var m = Math.floor(t / 60); - var s = Math.floor((t - m * 60) * round) / round; - return m + "m" + s + "s"; - } - Rectangle { anchors.left: parent.left anchors.right: parent.right @@ -121,7 +96,7 @@ Item { font.pixelSize: timeDisplay.fontSize anchors.leftMargin: timeDisplay.textMargin verticalAlignment: Text.AlignVCenter - text: prettyPrintTime(column.blockStartTime, timeDisplay.rangeDuration) + text: TimeFormatter.format(column.blockStartTime, timeDisplay.rangeDuration) visible: width > 0 color: Theme.color(Theme.PanelTextColorLight) } diff --git a/src/libs/timeline/timelineformattime.cpp b/src/libs/timeline/timelineformattime.cpp index f365319319d..4dd9ec36bb4 100644 --- a/src/libs/timeline/timelineformattime.cpp +++ b/src/libs/timeline/timelineformattime.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "timelineformattime.h" +#include namespace Timeline { @@ -100,4 +101,18 @@ QString formatTime(qint64 timestamp, qint64 reference) } } +static QObject *createFormatter(QQmlEngine *engine, QJSEngine *scriptEngine) +{ + Q_UNUSED(engine); + Q_UNUSED(scriptEngine); + return new TimeFormatter; +} + +void TimeFormatter::setupTimeFormatter() +{ + static const int typeIndex = qmlRegisterSingletonType( + "TimelineTimeFormatter", 1, 0, "TimeFormatter", createFormatter); + Q_UNUSED(typeIndex); +} + } diff --git a/src/libs/timeline/timelineformattime.h b/src/libs/timeline/timelineformattime.h index 9e9f2367dde..d4f568ae0d2 100644 --- a/src/libs/timeline/timelineformattime.h +++ b/src/libs/timeline/timelineformattime.h @@ -26,9 +26,22 @@ #include "timeline_global.h" #include +#include #include namespace Timeline { QString TIMELINE_EXPORT formatTime(qint64 timestamp, qint64 reference = std::numeric_limits::max()); + +class TIMELINE_EXPORT TimeFormatter : public QObject { + Q_OBJECT +public: + Q_INVOKABLE QString format(qint64 timestamp, qint64 reference) + { + return formatTime(timestamp, reference); + } + + static void setupTimeFormatter(); +}; + } diff --git a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp index f8d9734ae14..d861dd4927c 100644 --- a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp +++ b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp @@ -47,6 +47,7 @@ #include "timeline/timelinerenderer.h" #include "timeline/timelineoverviewrenderer.h" #include "timeline/timelinetheme.h" +#include "timeline/timelineformattime.h" #include // Needed for the load&save actions in the context menu @@ -166,6 +167,7 @@ QmlProfilerTraceView::QmlProfilerTraceView(QWidget *parent, QmlProfilerViewManag setMinimumHeight(170); Timeline::TimelineTheme::setupTheme(d->m_mainView->engine()); + Timeline::TimeFormatter::setupTimeFormatter(); d->m_mainView->rootContext()->setContextProperty(QLatin1String("timelineModelAggregator"), d->m_modelProxy);