diff --git a/src/plugins/qmlprofiler/qml/MainView.qml b/src/plugins/qmlprofiler/qml/MainView.qml index 172adb8158dd76916db02bf26a9116f483e68385..cdb5cfb6bf3b12fa68637316fa8a0300fa850f0a 100644 --- a/src/plugins/qmlprofiler/qml/MainView.qml +++ b/src/plugins/qmlprofiler/qml/MainView.qml @@ -81,9 +81,9 @@ Rectangle { var startTime = Plotter.ranges[0].start; if (rangeMover.value + startTime> event.start) { rangeMover.x = Math.max(0, - Math.floor((event.start - startTime) / xs - canvas.canvasWindow.x - rangeMover.width/2) ); - } else if (rangeMover.value + startTime + rangeMover.width * xs < event.start + event.duration) { - rangeMover.x = Math.floor((event.start + event.duration - startTime) / xs - canvas.canvasWindow.x - rangeMover.width/2); + Math.floor((event.start - startTime) / xs - canvas.canvasWindow.x - rangeMover.zoomWidth/2) ); + } else if (rangeMover.value + startTime + rangeMover.zoomWidth * xs < event.start + event.duration) { + rangeMover.x = Math.floor((event.start + event.duration - startTime) / xs - canvas.canvasWindow.x - rangeMover.zoomWidth/2); } } } @@ -104,6 +104,30 @@ Rectangle { } } + function zoomIn() { + // 10% + var newZoom = rangeMover.zoomWidth / 1.1; + + // 0.1 ms minimum zoom + if (newZoom * Plotter.xScale(canvas) > 100000) { + hideRangeDetails(); + rangeMover.zoomWidth = newZoom + rangeMover.updateZoomControls(); + } + } + + function zoomOut() { + hideRangeDetails(); + // 10% + var newZoom = rangeMover.zoomWidth * 1.1; + if (newZoom > canvas.width) + newZoom = canvas.width; + if (newZoom + rangeMover.x > canvas.width) + rangeMover.x = canvas.width - newZoom; + rangeMover.zoomWidth = newZoom; + rangeMover.updateZoomControls(); + } + //handle debug data coming from C++ Connections { target: connection @@ -173,7 +197,7 @@ Rectangle { anchors.left: flick.left anchors.right: flick.right startTime: rangeMover.x * Plotter.xScale(canvas); - endTime: (rangeMover.x + rangeMover.width) * Plotter.xScale(canvas); + endTime: (rangeMover.x + rangeMover.zoomWidth) * Plotter.xScale(canvas); } function hideRangeDetails() { @@ -227,13 +251,7 @@ Rectangle { flick.contentX = startX } startTime: rangeMover.value - - property real prevXStep: -1 - property real possibleEndTime: startTime + (rangeMover.width*Plotter.xScale(canvas)) - onPossibleEndTimeChanged: { - prevXStep = canvas.canvasWindow.x; - endTime = possibleEndTime - } + endTime: startTime + (rangeMover.zoomWidth*Plotter.xScale(canvas)) onEndTimeChanged: updateTimeline() delegate: Rectangle { @@ -413,7 +431,7 @@ Rectangle { MouseArea { anchors.fill: canvas //### ideally we could press to position then immediately drag - onPressed: rangeMover.x = mouse.x - rangeMover.width/2 + onPressed: rangeMover.x = mouse.x - rangeMover.zoomWidth/2 } RangeMover { diff --git a/src/plugins/qmlprofiler/qml/RangeMover.qml b/src/plugins/qmlprofiler/qml/RangeMover.qml index 68c528074c7e32cf053ac3ca38e90dfd66cd78c3..936ca54c7b0ef0f7efbfe6b94a66d4dc4395902c 100644 --- a/src/plugins/qmlprofiler/qml/RangeMover.qml +++ b/src/plugins/qmlprofiler/qml/RangeMover.qml @@ -37,60 +37,80 @@ import Monitor 1.0 Item { id: rangeMover - width: rect.width; height: 50 - - property real prevXStep: -1 - property real possibleValue: (canvas.canvasWindow.x + x) * Plotter.xScale(canvas) - onPossibleValueChanged: { - prevXStep = canvas.canvasWindow.x; - if (value != possibleValue) - value = possibleValue; + + + property color lighterColor:"#cc80b2f6" + property color darkerColor:"#cc6da1e8" + property real value: (canvas.canvasWindow.x + x) * Plotter.xScale(canvas) + property real zoomWidth: 20 + + function updateZoomControls() { + rightRange.x = rangeMover.width; } + onXChanged: updateZoomControls(); - property real value + width: Math.max(rangeMover.zoomWidth, 20); height: 50 MouseArea { anchors.fill: parent drag.target: rangeMover drag.axis: "XAxis" drag.minimumX: 0 - drag.maximumX: canvas.width - rangeMover.width //### + drag.maximumX: canvas.width - rangeMover.zoomWidth //### + } + + Rectangle { + id: frame + color:"transparent" + border.width: 1 + border.color: darkerColor + anchors.fill: parent + anchors.rightMargin: 1 + anchors.bottomMargin: 1 } Rectangle { id: rect - color: "#cc80b2f6" - width: 20 + color: lighterColor + width: parent.zoomWidth height: parent.height } + + Rectangle { id: leftRange property int currentX: rangeMover.x - property int currentWidth : rect.width + property int currentWidth : rangeMover.zoomWidth + x: -width height: parent.height - width: 5 - color: Qt.darker(rect.color); - opacity: 0.3 + width: 15 + color: darkerColor + + Text { + anchors.centerIn: parent + text:"<" + } + MouseArea { anchors.fill: parent drag.target: leftRange drag.axis: "XAxis" drag.minimumX: -parent.currentX - drag.maximumX: parent.currentWidth - 20 + drag.maximumX: parent.currentWidth - width - 1 onPressed: { parent.currentX = rangeMover.x; - parent.currentWidth = rect.width; + parent.currentWidth = rangeMover.zoomWidth; } } onXChanged: { - if (x!=0) { - rect.width = currentWidth - x; - rangeMover.x = currentX + x; - x = 0; + if (x + width != 0) { + rangeMover.zoomWidth = currentWidth - x - width; + rangeMover.x = currentX + x + width; + x = -width; } } } @@ -98,23 +118,32 @@ Item { Rectangle { id: rightRange property int currentX: rangeMover.x + property int widthSpace: rangeMover.width - rangeMover.zoomWidth height: parent.height - width: 5 - anchors.right: parent.right - color: Qt.darker(rect.color); - opacity: 0.3 + width: 15 + x: rangeMover.width + color: darkerColor; + + Text { + anchors.centerIn: parent + text:">" + } MouseArea { anchors.fill: parent drag.target: rightRange drag.axis: "XAxis" - drag.minimumX: 15 + drag.minimumX: 1 + parent.widthSpace drag.maximumX: canvas.width - parent.currentX; - onPressed: parent.currentX = rangeMover.x; + onPressed: { + parent.currentX = rangeMover.x; + parent.widthSpace = rangeMover.width - rangeMover.zoomWidth; + } + onReleased: rightRange.x = rangeMover.width; } onXChanged: { - if (x != rect.width - width) { - rect.width = x + width; + if (x != rangeMover.width) { + rangeMover.zoomWidth = x - widthSpace; } } } diff --git a/src/plugins/qmlprofiler/qml/magnifier-minus.png b/src/plugins/qmlprofiler/qml/magnifier-minus.png new file mode 100644 index 0000000000000000000000000000000000000000..3bfcea0ff7603225f0a7f9e9b1ff01bb71cbdbb8 Binary files /dev/null and b/src/plugins/qmlprofiler/qml/magnifier-minus.png differ diff --git a/src/plugins/qmlprofiler/qml/magnifier-plus.png b/src/plugins/qmlprofiler/qml/magnifier-plus.png new file mode 100644 index 0000000000000000000000000000000000000000..51bed6844d305c253e12c204befa32a11a0fb2f9 Binary files /dev/null and b/src/plugins/qmlprofiler/qml/magnifier-plus.png differ diff --git a/src/plugins/qmlprofiler/qml/qml.qrc b/src/plugins/qmlprofiler/qml/qml.qrc index 6f65ff84800abcd50e0f8682e71706a255b0a403..822e2096d029961de8dfa3f1230ae178ee09680a 100644 --- a/src/plugins/qmlprofiler/qml/qml.qrc +++ b/src/plugins/qmlprofiler/qml/qml.qrc @@ -14,5 +14,7 @@ <file>prev.png</file> <file>next.png</file> <file>toolbarbg.png</file> + <file>magnifier-minus.png</file> + <file>magnifier-plus.png</file> </qresource> </RCC> diff --git a/src/plugins/qmlprofiler/tracewindow.cpp b/src/plugins/qmlprofiler/tracewindow.cpp index fe41a82daed18b1f1ebccafea804d5785658f048..817f946ad9acd7554c56f3491b64f01ff2ef6de7 100644 --- a/src/plugins/qmlprofiler/tracewindow.cpp +++ b/src/plugins/qmlprofiler/tracewindow.cpp @@ -295,8 +295,16 @@ TraceWindow::TraceWindow(QWidget *parent) QToolButton *buttonNext= new QToolButton; buttonNext->setIcon(QIcon(":/qmlprofiler/next.png")); connect(buttonNext, SIGNAL(clicked()), this, SIGNAL(jumpToNext())); + QToolButton *buttonZoomIn = new QToolButton; + buttonZoomIn->setIcon(QIcon(":/qmlprofiler/magnifier-plus.png")); + connect(buttonZoomIn, SIGNAL(clicked()), this, SIGNAL(zoomIn())); + QToolButton *buttonZoomOut = new QToolButton; + buttonZoomOut->setIcon(QIcon(":/qmlprofiler/magnifier-minus.png")); + connect(buttonZoomOut, SIGNAL(clicked()), this, SIGNAL(zoomOut())); toolBarLayout->addWidget(buttonPrev); toolBarLayout->addWidget(buttonNext); + toolBarLayout->addWidget(buttonZoomIn); + toolBarLayout->addWidget(buttonZoomOut); m_view->setResizeMode(QDeclarativeView::SizeRootObjectToView); m_view->setFocus(); @@ -330,6 +338,8 @@ void TraceWindow::reset(QDeclarativeDebugConnection *conn) connect(m_view->rootObject(), SIGNAL(updateTimer()), this, SLOT(updateTimer())); connect(this, SIGNAL(jumpToPrev()), m_view->rootObject(), SLOT(prevEvent())); connect(this, SIGNAL(jumpToNext()), m_view->rootObject(), SLOT(nextEvent())); + connect(this, SIGNAL(zoomIn()), m_view->rootObject(), SLOT(zoomIn())); + connect(this, SIGNAL(zoomOut()), m_view->rootObject(), SLOT(zoomOut())); connect(this, SIGNAL(internalClearDisplay()), m_view->rootObject(), SLOT(clearAll())); } diff --git a/src/plugins/qmlprofiler/tracewindow.h b/src/plugins/qmlprofiler/tracewindow.h index aa39372035c85a1b01b3c75801444a24f0d5e77f..07e0f8606e2c2e24652f11e6e875ecf5ba00eab8 100644 --- a/src/plugins/qmlprofiler/tracewindow.h +++ b/src/plugins/qmlprofiler/tracewindow.h @@ -78,6 +78,8 @@ signals: void internalClearDisplay(); void jumpToPrev(); void jumpToNext(); + void zoomIn(); + void zoomOut(); private: QWeakPointer<TracePlugin> m_plugin;