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