From faaf3186342205fa9175356a830c3f3677baf47b Mon Sep 17 00:00:00 2001 From: Christiaan Janssen <christiaan.janssen@nokia.com> Date: Mon, 27 Jun 2011 18:25:50 +0200 Subject: [PATCH] QmlProfiler: zoom in and out controls Change-Id: I920aae3075269e4f2fd1be15e9ca3cc4e08ac7a7 Reviewed-on: http://codereview.qt.nokia.com/826 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Kai Koehne <kai.koehne@nokia.com> --- src/plugins/qmlprofiler/qml/MainView.qml | 42 ++++++--- src/plugins/qmlprofiler/qml/RangeMover.qml | 89 ++++++++++++------ .../qmlprofiler/qml/magnifier-minus.png | Bin 0 -> 423 bytes .../qmlprofiler/qml/magnifier-plus.png | Bin 0 -> 412 bytes src/plugins/qmlprofiler/qml/qml.qrc | 2 + src/plugins/qmlprofiler/tracewindow.cpp | 10 ++ src/plugins/qmlprofiler/tracewindow.h | 2 + 7 files changed, 103 insertions(+), 42 deletions(-) create mode 100644 src/plugins/qmlprofiler/qml/magnifier-minus.png create mode 100644 src/plugins/qmlprofiler/qml/magnifier-plus.png diff --git a/src/plugins/qmlprofiler/qml/MainView.qml b/src/plugins/qmlprofiler/qml/MainView.qml index 172adb8158d..cdb5cfb6bf3 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 68c528074c7..936ca54c7b0 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 GIT binary patch literal 423 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmP?o3wzqu@r-96VMcOPZ!4!i_>o> zF6?U#5OC$^p4a8|kHKzn7fa{5)d#LDy!eN4WrIz0c;LnUl}>^zZ5Jl&@j03ouetkf zT6o?!HTBBMoyF;D%=KYmvDf+KW3NwKwo<0wo#Bvy%K75#jS)7yA8q>0j~DK^xJ}nl zpyU1T4i2TJ_rF;j6?`uneDz~okQ?nR(Kab{=9#IfGuMP^&#YQLBQ%fUlTU-s-arxG z*K*<2OLu-Ru(<QOEz#gep-yOM?W|?1v^pP0v?Vf3&_A#-SGwW!(?c&ylJ?)fTq=9} ztysg|yyIz`AJ*7KZ_73ATO2xV>6tdsE!V!(_P^e>>~Pgyv-c{VOERUlT;q2MYzg98 z`?YrK)1pkS*SpM?|L0pO;-z`-J%fnr$Hx;aYwpZmq){iE)b#IbQ22Ydq9-gneA<Aa O$l&Sf=d#Wzp$Py%n5}aF literal 0 HcmV?d00001 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 GIT binary patch literal 412 zcmeAS@N?(olHy`uVBq!ia0vp^LLkh+1|-AI^@Rf|#^NA%Cx&(BWL^R}Y)RhkE)4%c zaKYZ?lYt_f1s;*b3=G`DAk4@xYmNj^kiEpy*OmP?o3wzq>F4Bz?LbpxJY5_^EKa|j zw709-L8R4QJUUTfZT^D%#N_<>c6+z_3taL~o_Nmu#N{QMgt`?4SRDPjV$)6ScfXl- zTJFb#a|Q1b-<>%yKlH-3w^@fR-6N-2&Gln=QhBa!KYx#*zVjoCXSzJjX}|WV`v$9e zHmRsgRN>5=wd%Fiw0o)yUuxf<{2UV+`Z6vwRP(fv?p|*Orss3)7a6)uns?t(;K3a3 zY4<8~dm{V4&3(7m_wtGFyoVoXb~%;C+V_NA-`ch4f&mXh6;sdS6Bd0jdg6;Tgcclr z_`rG1R;CiW`FqRnZN64DV_E0xudkdLa<@mvzb~^cjXiGStNm<2|F7CDXVV@_-`@7s z|G((*$AZ~!pFcix{Ez1eTLzCqQNLeL2*3X{zJC{Edw+({=GkkzfI-LL>FVdQ&MBb@ E0RIQBqW}N^ literal 0 HcmV?d00001 diff --git a/src/plugins/qmlprofiler/qml/qml.qrc b/src/plugins/qmlprofiler/qml/qml.qrc index 6f65ff84800..822e2096d02 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 fe41a82daed..817f946ad9a 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 aa39372035c..07e0f8606e2 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; -- GitLab