From 6b08ff6bc4f11c1f5910d48ee92b8c5ff0ecafa0 Mon Sep 17 00:00:00 2001 From: Ulf Hermann Date: Wed, 26 Nov 2014 16:53:42 +0100 Subject: [PATCH] QmlProfiler: Use Flickable's pixelAligned property This is much cleaner than manually casting contentX and contentWidth to int. Also, it actually forwards the int-aligned dimensions to the TimelineRenderer. Change-Id: I7dad8eeabf1f3b70c5e725a82a2926b3db6f1b16 Reviewed-by: Kai Koehne --- src/plugins/qmlprofiler/qml/MainView.qml | 33 +++++++++---------- src/plugins/qmlprofiler/qml/Overview.qml | 13 +++++--- .../qmlprofiler/qml/SelectionRange.qml | 2 +- 3 files changed, 25 insertions(+), 23 deletions(-) diff --git a/src/plugins/qmlprofiler/qml/MainView.qml b/src/plugins/qmlprofiler/qml/MainView.qml index 171e4c11706..cbe60da9b48 100644 --- a/src/plugins/qmlprofiler/qml/MainView.qml +++ b/src/plugins/qmlprofiler/qml/MainView.qml @@ -98,7 +98,6 @@ Rectangle { function clear() { flick.contentY = 0; flick.contentX = 0; - flick.contentWidth = 0; timelineView.clearChildren(); rangeDetails.hide(); selectionRangeMode = false; @@ -353,9 +352,9 @@ Rectangle { Flickable { id: flick contentHeight: categoryContent.height - contentWidth: zoomControl.windowDuration * width / Math.max(1, zoomControl.rangeDuration) flickableDirection: Flickable.HorizontalAndVerticalFlick boundsBehavior: Flickable.StopAtBounds + pixelAligned: true // ScrollView will try to deinteractivate it. We don't want that // as the horizontal flickable is interactive, too. We do occasionally @@ -365,22 +364,22 @@ Rectangle { onStayInteractiveChanged: interactive = stayInteractive property bool recursionGuard: false - property int intX: contentX - property int intWidth: scroller.width + // Update the zoom control on srolling. - onIntXChanged: { + onContentXChanged: { if (recursionGuard) return; recursionGuard = true; - var newStartTime = intX * zoomControl.rangeDuration / intWidth + + var newStartTime = contentX * zoomControl.rangeDuration / scroller.width + zoomControl.windowStart; - if (Math.abs(newStartTime - zoomControl.rangeStart) >= 1) { - var newEndTime = (intX + intWidth) * zoomControl.rangeDuration / intWidth + - zoomControl.windowStart; - zoomControl.setRange(newStartTime, newEndTime); + if (isFinite(newStartTime) && Math.abs(newStartTime - zoomControl.rangeStart) >= 1) { + var newEndTime = (contentX + scroller.width) * zoomControl.rangeDuration / + scroller.width + zoomControl.windowStart; + if (isFinite(newEndTime)) + zoomControl.setRange(newStartTime, newEndTime); } recursionGuard = false; } @@ -389,19 +388,17 @@ Rectangle { function updateWindow() { if (recursionGuard || zoomControl.rangeDuration <= 0) return; - recursionGuard = true; - // This triggers an unwanted automatic change in contentX. We ignore that by - // checking recursionGuard in this function and in updateZoomControl. - flick.contentWidth = zoomControl.windowDuration * intWidth / + var newWidth = zoomControl.windowDuration * scroller.width / zoomControl.rangeDuration; + if (isFinite(newWidth) && Math.abs(newWidth - contentWidth) >= 1) + contentWidth = newWidth; - var newStartX = (zoomControl.rangeStart - zoomControl.windowStart) * intWidth / + var newStartX = (zoomControl.rangeStart - zoomControl.windowStart) * scroller.width / zoomControl.rangeDuration; - - if (isFinite(newStartX) && Math.abs(newStartX - flick.contentX) >= 1) - flick.contentX = newStartX; + if (isFinite(newStartX) && Math.abs(newStartX - contentX) >= 1) + contentX = newStartX; recursionGuard = false; } diff --git a/src/plugins/qmlprofiler/qml/Overview.qml b/src/plugins/qmlprofiler/qml/Overview.qml index 924b6bcc0de..d1db5814729 100644 --- a/src/plugins/qmlprofiler/qml/Overview.qml +++ b/src/plugins/qmlprofiler/qml/Overview.qml @@ -63,11 +63,14 @@ Canvas { function updateRange() { if (recursionGuard) return; - var newStartTime = Math.round(rangeMover.rangeLeft * zoomControl.traceDuration / width) + + recursionGuard = true; + var newStartTime = rangeMover.rangeLeft * zoomControl.traceDuration / width + zoomControl.traceStart; - var newEndTime = Math.max(Math.round(rangeMover.rangeRight * zoomControl.traceDuration / - width) + zoomControl.traceStart, newStartTime + 500); - zoomControl.setRange(newStartTime, newEndTime); + var newEndTime = rangeMover.rangeRight * zoomControl.traceDuration / width + + zoomControl.traceStart; + if (isFinite(newStartTime) && isFinite(newEndTime) && newEndTime - newStartTime > 500) + zoomControl.setRange(newStartTime, newEndTime); + recursionGuard = false; } function clamp(val, min, max) { @@ -78,6 +81,8 @@ Canvas { Connections { target: zoomControl onRangeChanged: { + if (recursionGuard) + return; recursionGuard = true; var newRangeX = (zoomControl.rangeStart - zoomControl.traceStart) * width / zoomControl.traceDuration; diff --git a/src/plugins/qmlprofiler/qml/SelectionRange.qml b/src/plugins/qmlprofiler/qml/SelectionRange.qml index 583c562e3ac..84a5d389fe1 100644 --- a/src/plugins/qmlprofiler/qml/SelectionRange.qml +++ b/src/plugins/qmlprofiler/qml/SelectionRange.qml @@ -51,7 +51,7 @@ RangeMover { target: zoomControl onRangeChanged: { var oldTimePerPixel = selectionRange.viewTimePerPixel; - selectionRange.viewTimePerPixel = zoomControl.rangeDuration / flick.intWidth; + selectionRange.viewTimePerPixel = zoomControl.rangeDuration / scroller.width; if (creationState === 3 && oldTimePerPixel != selectionRange.viewTimePerPixel) { var newWidth = rangeWidth * oldTimePerPixel / viewTimePerPixel; rangeLeft = rangeLeft * oldTimePerPixel / viewTimePerPixel;