summaryrefslogtreecommitdiff
path: root/src/plugins/qmlprofiler
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@digia.com>2013-11-12 16:12:43 +0100
committerUlf Hermann <ulf.hermann@digia.com>2013-11-13 15:16:39 +0100
commit761fd1198d9c98e25c1fd591bf49518a30c712c0 (patch)
tree5ffad0652e66977b9c06fbdc0a186919c65092c9 /src/plugins/qmlprofiler
parent9e0175d8bb9b532ab83353d2c38b5fd09a013fd3 (diff)
downloadqt-creator-761fd1198d9c98e25c1fd591bf49518a30c712c0.tar.gz
QmlProfiler: Move zoom calculations into QML and simplify them.
The zoom level calculations were much too complex and introduced rounding errors in various places. By moving them all into one place and avoiding circular recalculations of the same thing those problems are mitigated. Task-number: QTCREATORBUG-10635 Change-Id: I7316caad1a590964402056a2e6430c8d059ae097 Reviewed-by: Kai Koehne <kai.koehne@digia.com>
Diffstat (limited to 'src/plugins/qmlprofiler')
-rw-r--r--src/plugins/qmlprofiler/qml/MainView.qml77
-rw-r--r--src/plugins/qmlprofiler/qmlprofilertraceview.cpp23
-rw-r--r--src/plugins/qmlprofiler/qmlprofilertraceview.h2
3 files changed, 34 insertions, 68 deletions
diff --git a/src/plugins/qmlprofiler/qml/MainView.qml b/src/plugins/qmlprofiler/qml/MainView.qml
index 72a3273735..010713130d 100644
--- a/src/plugins/qmlprofiler/qml/MainView.qml
+++ b/src/plugins/qmlprofiler/qml/MainView.qml
@@ -176,45 +176,6 @@ Rectangle {
view.selectPrev();
}
- function updateWindowLength(absoluteFactor) {
- var windowLength = view.endTime - view.startTime;
- if (qmlProfilerModelProxy.traceEndTime() <= qmlProfilerModelProxy.traceStartTime() ||
- windowLength <= 0)
- return;
- var currentFactor = windowLength / qmlProfilerModelProxy.traceDuration();
- updateZoom(absoluteFactor / currentFactor);
- }
-
- function updateZoom(relativeFactor) {
- var min_length = 1e5; // 0.1 ms
- var windowLength = view.endTime - view.startTime;
- if (windowLength < min_length)
- windowLength = min_length;
- var newWindowLength = windowLength * relativeFactor;
-
- if (newWindowLength > qmlProfilerModelProxy.traceDuration()) {
- newWindowLength = qmlProfilerModelProxy.traceDuration();
- relativeFactor = newWindowLength / windowLength;
- }
- if (newWindowLength < min_length) {
- newWindowLength = min_length;
- relativeFactor = newWindowLength / windowLength;
- }
-
- var fixedPoint = (view.startTime + view.endTime) / 2;
-
- if (view.selectedItem !== -1) {
- // center on selected item if it's inside the current screen
- var newFixedPoint = qmlProfilerModelProxy.getStartTime(view.selectedModel, view.selectedItem);
- if (newFixedPoint >= view.startTime && newFixedPoint < view.endTime)
- fixedPoint = newFixedPoint;
- }
-
-
- var startTime = fixedPoint - relativeFactor*(fixedPoint - view.startTime);
- zoomControl.setRange(startTime, startTime + newWindowLength);
- }
-
function updateZoomCentered(centerX, relativeFactor)
{
var min_length = 1e5; // 0.1 ms
@@ -572,10 +533,13 @@ Rectangle {
x: 0
y: 0
- signal zoomLevelChanged(int value)
function toggleEnabled() {enabled = !enabled}
function toggleVisible() {visible = !visible}
- function setZoomLevel(level) {zoomSlider.value = level}
+ function updateZoomLevel() {
+ zoomSlider.externalUpdate = true;
+ zoomSlider.value = Math.pow((view.endTime - view.startTime) / qmlProfilerModelProxy.traceDuration(), 1 / zoomSlider.exponent) * zoomSlider.maximumValue;
+ }
+
Slider {
id: zoomSlider
@@ -584,9 +548,34 @@ Rectangle {
maximumValue: 10000
stepSize: 100
- // For some reason the child may generate a meaningless value
- // change event before the parent is initialized.
- onValueChanged: if (parent) parent.zoomLevelChanged(value)
+ property int exponent: 3
+ property bool externalUpdate: false
+ property int minWindowLength: 1e5 // 0.1 ms
+
+ onValueChanged: {
+ if (externalUpdate || qmlProfilerModelProxy.traceEndTime() <= qmlProfilerModelProxy.traceStartTime()) {
+ // Zoom range is independently updated. We shouldn't mess
+ // with it here as otherwise we might introduce rounding
+ // or arithmetic errors.
+ externalUpdate = false;
+ return;
+ }
+
+ var windowLength = Math.max(
+ Math.pow(value / maximumValue, exponent) * qmlProfilerModelProxy.traceDuration(),
+ minWindowLength);
+
+ var fixedPoint = (view.startTime + view.endTime) / 2;
+ if (view.selectedItem !== -1) {
+ // center on selected item if it's inside the current screen
+ var newFixedPoint = qmlProfilerModelProxy.getStartTime(view.selectedModel, view.selectedItem);
+ if (newFixedPoint >= view.startTime && newFixedPoint < view.endTime)
+ fixedPoint = newFixedPoint;
+ }
+
+ var startTime = Math.max(qmlProfilerModelProxy.traceStartTime(), fixedPoint - windowLength / 2)
+ zoomControl.setRange(startTime, startTime + windowLength);
+ }
}
}
diff --git a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp
index 004c47cd62..c9ea8a5b19 100644
--- a/src/plugins/qmlprofiler/qmlprofilertraceview.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilertraceview.cpp
@@ -59,10 +59,6 @@ using namespace QmlDebug;
namespace QmlProfiler {
namespace Internal {
-const int sliderTicks = 10000;
-const qreal sliderExp = 3;
-
-
/////////////////////////////////////////////////////////
bool MouseWheelResizer::eventFilter(QObject *obj, QEvent *event)
{
@@ -136,7 +132,6 @@ public:
QToolButton *m_buttonRange;
QToolButton *m_buttonLock;
- int m_currentZoomLevel;
};
QmlProfilerTraceView::QmlProfilerTraceView(QWidget *parent, Analyzer::IAnalyzerTool *profilerTool, QmlProfilerViewManager *container, QmlProfilerModelManager *modelManager, QmlProfilerStateManager *profilerState)
@@ -204,7 +199,6 @@ QmlProfilerTraceView::QmlProfilerTraceView(QWidget *parent, Analyzer::IAnalyzerT
// Minimum height: 5 rows of 20 pixels + scrollbar of 50 pixels + 20 pixels margin
setMinimumHeight(170);
- d->m_currentZoomLevel = 0;
}
QmlProfilerTraceView::~QmlProfilerTraceView()
@@ -236,7 +230,6 @@ void QmlProfilerTraceView::reset()
QObject *zoomSlider = rootObject->findChild<QObject*>(QLatin1String("zoomSliderToolBar"));
connect(this, SIGNAL(enableToolbar(bool)), zoomSlider, SLOT(toggleEnabled()));
- connect(zoomSlider, SIGNAL(zoomLevelChanged(int)), this, SLOT(setZoomLevel(int)));
connect(this, SIGNAL(showZoomSlider(bool)), zoomSlider, SLOT(toggleVisible()));
}
@@ -409,15 +402,6 @@ void QmlProfilerTraceView::updateLockButton()
////////////////////////////////////////////////////////
// Zoom control
-void QmlProfilerTraceView::setZoomLevel(int zoomLevel)
-{
- if (d->m_currentZoomLevel != zoomLevel && d->m_mainView->rootObject()) {
- QVariant newFactor = pow(qreal(zoomLevel) / qreal(sliderTicks), sliderExp);
- d->m_currentZoomLevel = zoomLevel;
- QMetaObject::invokeMethod(d->m_mainView->rootObject(), "updateWindowLength", Q_ARG(QVariant, newFactor));
- }
-}
-
void QmlProfilerTraceView::updateRange()
{
if (!d->m_modelManager)
@@ -427,12 +411,7 @@ void QmlProfilerTraceView::updateRange()
return;
if (d->m_modelManager->traceTime()->duration() <= 0)
return;
- int newLevel = pow(duration / d->m_modelManager->traceTime()->duration(), 1/sliderExp) * sliderTicks;
- if (d->m_currentZoomLevel != newLevel) {
- d->m_currentZoomLevel = newLevel;
- emit zoomLevelChanged(newLevel);
- QMetaObject::invokeMethod(d->m_mainView->rootObject()->findChild<QObject*>(QLatin1String("zoomSliderToolBar")), "setZoomLevel", Q_ARG(QVariant, newLevel));
- }
+ QMetaObject::invokeMethod(d->m_mainView->rootObject()->findChild<QObject*>(QLatin1String("zoomSliderToolBar")), "updateZoomLevel");
}
void QmlProfilerTraceView::mouseWheelMoved(int mouseX, int mouseY, int wheelDelta)
diff --git a/src/plugins/qmlprofiler/qmlprofilertraceview.h b/src/plugins/qmlprofiler/qmlprofilertraceview.h
index 1dc517529f..9a956d9fe4 100644
--- a/src/plugins/qmlprofiler/qmlprofilertraceview.h
+++ b/src/plugins/qmlprofiler/qmlprofilertraceview.h
@@ -112,7 +112,6 @@ private slots:
void toggleLockMode(bool);
void updateLockButton();
- void setZoomLevel(int zoomLevel);
void updateRange();
void mouseWheelMoved(int mouseX, int mouseY, int wheelDelta);
@@ -136,7 +135,6 @@ signals:
void rangeModeChanged(bool);
void lockModeChanged(bool);
void enableToolbar(bool);
- void zoomLevelChanged(int);
void showZoomSlider(bool);
void resized();