on xenial help sign in
Updated behaviour for zoomable image, workaround for sourcesize Fixes: 1333187
86da29fAndrea Cimitan
qml/Components/ZoomableImage.qml+17−14
@@ -26,16 +26,15 @@ import "../Components"
26
26
27Item {
27Item {
28 id: root
28 id: root
29− property alias source: lazyImage.source
29+ property alias source: imageRenderer.source
30 property var zoomable: false
30 property var zoomable: false
31− property alias imageState: lazyImage.state
31+ property alias imageStatus: imageRenderer.status
32− property alias scaleTo: lazyImage.scaleTo
33− property alias asynchronous: lazyImage.asynchronous
32+ property alias asynchronous: imageRenderer.asynchronous
34
33
35 Flickable {
34 Flickable {
36 id: flickable
35 id: flickable
37 objectName: "flickable"
36 objectName: "flickable"
38− clip: true
37+ clip: true // FIXME maybe we can remove this, or just not clip in few cases
39 contentHeight: imageContainer.height
38 contentHeight: imageContainer.height
40 contentWidth: imageContainer.width
39 contentWidth: imageContainer.width
41
40
@@ -52,30 +51,34 @@ Item {
52 Item {
51 Item {
53 id: image
52 id: image
54 objectName: "image"
53 objectName: "image"
55− property alias imageState: lazyImage.state
54+ property alias imageStatus: imageRenderer.status
56 property var prevScale
55 property var prevScale
57 anchors.centerIn: parent
56 anchors.centerIn: parent
58
57
59 signal imageReloaded
58 signal imageReloaded
60
59
61− LazyImage {
60+ Image {
62− id: lazyImage
61+ id: imageRenderer
63− objectName: "lazyImage"
62+ objectName: "imageRenderer"
64 smooth: !flickable.movingVertically
63 smooth: !flickable.movingVertically
65 anchors.fill: parent
64 anchors.fill: parent
66 fillMode: Image.PreserveAspectFit
65 fillMode: Image.PreserveAspectFit
67− scaleTo: "fit"
68
66
69− onStateChanged: {
67+ readonly property int sourceSizeMultiplier: 3
70− if (state == "ready") {
68+
69+ sourceSize.width: root.width * sourceSizeMultiplier <= root.height * sourceSizeMultiplier ? root.width * sourceSizeMultiplier : 0
70+ sourceSize.height: root.height * sourceSizeMultiplier <= root.width * sourceSizeMultiplier ? root.height * sourceSizeMultiplier : 0
71+
72+ onStatusChanged: {
73+ if (status === Image.Ready) {
71 image.imageReloaded();
74 image.imageReloaded();
72 }
75 }
73 }
76 }
74 }
77 }
75
78
76 onImageReloaded: {
79 onImageReloaded: {
77− image.height = lazyImage.sourceImage.implicitHeight
80+ image.height = imageRenderer.implicitHeight
78− image.width = lazyImage.sourceImage.implicitWidth
81+ image.width = imageRenderer.implicitWidth
79 image.resetScale();
82 image.resetScale();
80 }
83 }
81
84
qml/Dash/Previews/PreviewImageGallery.qml+13−80
@@ -65,46 +65,26 @@ PreviewWidget {
65 id: mouseArea
65 id: mouseArea
66 anchors.fill: parent
66 anchors.fill: parent
67 onClicked: {
67 onClicked: {
68− slideShowListView.currentIndex = index;
68+ overlay.delegateItem.currentIndex = index;
69− slideShow.initialX = rootItem.mapFromItem(parent, 0, 0).x
69+ overlay.initialX = rootItem.mapFromItem(parent, 0, 0).x;
70− slideShow.initialY = rootItem.mapFromItem(parent, 0, 0).y
70+ overlay.initialY = rootItem.mapFromItem(parent, 0, 0).y;
71− slideShow.visible = true;
71+ overlay.show();
72 }
72 }
73 }
73 }
74 }
74 }
75 }
75 }
76
76
77− Rectangle {
77+ PreviewOverlay {
78− id: slideShow
78+ id: overlay
79− objectName: "slideShow"
79+ objectName: "overlay"
80−
81− readonly property real initialScale: previewImageListView.height / rootItem.height
82− readonly property real scaleProgress: (scale - initialScale) / (1.0 - initialScale)
83− property real initialX: 0
84− property real initialY: 0
85−
86 parent: rootItem
80 parent: rootItem
87 width: parent.width
81 width: parent.width
88 height: parent.height
82 height: parent.height
89− visible: false
83+ initialScale: previewImageListView.height / rootItem.height
90− clip: visible && scale < 1.0
91− scale: visible ? 1.0 : initialScale
92− transformOrigin: Item.TopLeft
93− transform: Translate {
94− x: slideShow.initialX - slideShow.initialX * slideShow.scaleProgress
95− y: slideShow.initialY - slideShow.initialY * slideShow.scaleProgress
96− }
97− color: "black"
98− radius: units.gu(1) - units.gu(1) * slideShow.scaleProgress
99
84
100− Behavior on scale {
101− enabled: !slideShow.visible
102− UbuntuNumberAnimation { duration: UbuntuAnimation.FastDuration }
103− }
104−
105− ListView {
85+ delegate: ListView {
106− id: slideShowListView
86+ id: overlayListView
107− objectName: "slideShowListView"
87+ objectName: "overlayListView"
108 anchors.fill: parent
88 anchors.fill: parent
109 orientation: ListView.Horizontal
89 orientation: ListView.Horizontal
110 highlightRangeMode: ListView.StrictlyEnforceRange
90 highlightRangeMode: ListView.StrictlyEnforceRange
@@ -119,7 +99,7 @@ PreviewWidget {
119 top: parent.top
99 top: parent.top
120 bottom: parent.bottom
100 bottom: parent.bottom
121 }
101 }
122− width: slideShow.width
102+ width: overlay.width
123 source: modelData ? modelData : ""
103 source: modelData ? modelData : ""
124 fillMode: Image.PreserveAspectFit
104 fillMode: Image.PreserveAspectFit
125 sourceSize { width: screenshot.width; height: screenshot.height }
105 sourceSize { width: screenshot.width; height: screenshot.height }
@@ -127,54 +107,7 @@ PreviewWidget {
127
107
128 MouseArea {
108 MouseArea {
129 anchors.fill: parent
109 anchors.fill: parent
130− onClicked: slideShowHeader.shown = !slideShowHeader.shown
110+ onClicked: overlay.headerShown = !overlay.headerShown
131− }
132− }
133−
134− Rectangle {
135− id: slideShowHeader
136−
137− property bool shown: true
138−
139− anchors {
140− left: parent.left
141− right: parent.right
142− }
143− height: units.gu(7)
144− visible: opacity > 0
145− opacity: slideShow.scaleProgress > 0.6 && shown ? 0.8 : 0
146− color: "black"
147−
148− Behavior on opacity {
149− UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
150− }
151−
152− AbstractButton {
153− id: slideShowCloseButton
154− objectName: "slideShowCloseButton"
155− anchors {
156− top: parent.top
157− bottom: parent.bottom
158− }
159− width: units.gu(8)
160− height: width
161−
162− onClicked: slideShow.visible = false
163−
164− Rectangle {
165− anchors.fill: parent
166− color: Qt.rgba(1.0, 1.0, 1.0, 0.3)
167− visible: slideShowCloseButton.pressed
168− }
169−
170− Icon {
171− id: icon
172− anchors.centerIn: parent
173− width: units.gu(2.5)
174− height: width
175− color: Theme.palette.normal.foregroundText
176− name: "close"
177− }
178 }
111 }
179 }
112 }
180 }
113 }
qml/Dash/Previews/PreviewOverlay.qmlnew file+115
@@ -0,0 +1,115 @@
1+/*
2+ * Copyright (C) 2014 Canonical, Ltd.
3+ *
4+ * This program is free software; you can redistribute it and/or modify
5+ * it under the terms of the GNU General Public License as published by
6+ * the Free Software Foundation; version 3.
7+ *
8+ * This program is distributed in the hope that it will be useful,
9+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
10+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11+ * GNU General Public License for more details.
12+ *
13+ * You should have received a copy of the GNU General Public License
14+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
15+ */
16+
17+import QtQuick 2.0
18+import Ubuntu.Components 1.1
19+import "../../Components"
20+
21+Rectangle {
22+ id: overlay
23+ objectName: "overlay"
24+
25+ readonly property real scaleProgress: (scale - initialScale) / (1.0 - initialScale)
26+
27+ property alias delegate: loader.sourceComponent
28+ property alias delegateItem: loader.item
29+ property alias headerShown: overlayHeader.shown
30+ property bool shown: false
31+ property bool opening: false
32+ property real initialX: 0
33+ property real initialY: 0
34+ property real initialScale: 0
35+
36+ visible: scale > initialScale
37+ clip: visible && scale < 1.0
38+ scale: shown ? 1.0 : initialScale
39+ transformOrigin: Item.TopLeft
40+ transform: Translate {
41+ x: overlay.initialX - overlay.initialX * overlay.scaleProgress
42+ y: overlay.initialY - overlay.initialY * overlay.scaleProgress
43+ }
44+ color: Qt.rgba(0, 0, 0, scaleProgress)
45+ radius: units.gu(1) - units.gu(1) * scaleProgress
46+
47+ function show() {
48+ opening = true;
49+ shown = true;
50+ }
51+
52+ function hide() {
53+ opening = false;
54+ shown = false;
55+ }
56+
57+ Behavior on scale {
58+ UbuntuNumberAnimation {
59+ duration: overlay.opening ? UbuntuAnimation.FastDuration :
60+ UbuntuAnimation.FastDuration / 2
61+ }
62+ }
63+
64+ Loader {
65+ id: loader
66+ anchors.fill: parent
67+ }
68+
69+ Rectangle {
70+ id: overlayHeader
71+
72+ property bool shown: true
73+
74+ anchors {
75+ left: parent.left
76+ right: parent.right
77+ }
78+ height: units.gu(7)
79+ visible: opacity > 0
80+ opacity: overlay.scaleProgress > 0.6 && shown ? 0.8 : 0
81+ color: "black"
82+
83+ Behavior on opacity {
84+ UbuntuNumberAnimation { duration: UbuntuAnimation.SnapDuration }
85+ }
86+
87+ AbstractButton {
88+ id: overlayCloseButton
89+ objectName: "overlayCloseButton"
90+ anchors {
91+ top: parent.top
92+ bottom: parent.bottom
93+ }
94+ width: units.gu(8)
95+ height: width
96+
97+ onClicked: overlay.hide()
98+
99+ Rectangle {
100+ anchors.fill: parent
101+ color: Qt.rgba(1.0, 1.0, 1.0, 0.3)
102+ visible: overlayCloseButton.pressed
103+ }
104+
105+ Icon {
106+ id: icon
107+ anchors.centerIn: parent
108+ width: units.gu(2.5)
109+ height: width
110+ color: Theme.palette.normal.foregroundText
111+ name: "close"
112+ }
113+ }
114+ }
115+}
qml/Dash/Previews/PreviewZoomableImage.qml+38−5
@@ -28,11 +28,44 @@ PreviewWidget {
28 id: root
28 id: root
29 implicitHeight: units.gu(22)
29 implicitHeight: units.gu(22)
30
30
31− ZoomableImage {
31+ property Item rootItem: QuickUtils.rootItem(root)
32− id: image
32+
33+ LazyImage {
34+ id: lazyImage
33− objectName: "image"
35+ objectName: "lazyImage"
36+ anchors {
37+ top: parent.top
38+ bottom: parent.bottom
39+ horizontalCenter: parent.horizontalCenter
40+ }
41+ scaleTo: "height"
34 source: widgetData["source"]
42 source: widgetData["source"]
43+
44+ borderSource: mouseArea.pressed ? "radius_pressed.sci" : "radius_idle.sci"
45+
46+ MouseArea {
47+ id: mouseArea
48+ anchors.fill: parent
49+ onClicked: {
50+ overlay.initialX = rootItem.mapFromItem(parent, 0, 0).x;
51+ overlay.initialY = rootItem.mapFromItem(parent, 0, 0).y;
52+ overlay.show();
53+ }
54+ }
55+ }
56+
57+ PreviewOverlay {
58+ id: overlay
59+ objectName: "overlay"
60+ parent: rootItem
61+ width: parent.width
62+ height: parent.height
63+ initialScale: lazyImage.height / rootItem.height
64+
65+ delegate: ZoomableImage {
66+ anchors.fill: parent
67+ source: widgetData["source"]
35− zoomable: widgetData["zoomable"] ? widgetData["zoomable"] : false
68+ zoomable: widgetData["zoomable"] ? widgetData["zoomable"] : false
36− anchors.fill: parent
69+ }
37 }
70 }
38}
71}
tests/qmltests/Components/tst_ZoomableImage.qml+21−21
@@ -56,23 +56,23 @@ Rectangle {
56 when: windowShown
56 when: windowShown
57
57
58 function test_loadImage() {
58 function test_loadImage() {
59− var lazyImage = findChild(zoomableImage, "lazyImage");
59+ var imageRenderer = findChild(zoomableImage, "imageRenderer");
60
60
61 zoomableImage.source = widgetData0["source"];
61 zoomableImage.source = widgetData0["source"];
62 zoomableImage.zoomable = widgetData0["zoomable"];
62 zoomableImage.zoomable = widgetData0["zoomable"];
63 waitForRendering(zoomableImage);
63 waitForRendering(zoomableImage);
64− tryCompare(zoomableImage, "imageState", "default");
64+ tryCompare(zoomableImage, "imageStatus", Image.Null);
65
65
66− signalSpy.signalName = "onStateChanged";
66+ signalSpy.signalName = "onStatusChanged";
67− signalSpy.target = lazyImage;
67+ signalSpy.target = imageRenderer;
68 signalSpy.clear();
68 signalSpy.clear();
69
69
70 zoomableImage.source = widgetData1["source"];
70 zoomableImage.source = widgetData1["source"];
71 zoomableImage.zoomable = widgetData1["zoomable"];
71 zoomableImage.zoomable = widgetData1["zoomable"];
72− waitForRendering(lazyImage);
72+ waitForRendering(imageRenderer);
73− tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(widgetData1["source"]); }, true);
73+ tryCompareFunction(function() { return get_filename(imageRenderer.source.toString()) === get_filename(widgetData1["source"]); }, true);
74 waitForRendering(zoomableImage);
74 waitForRendering(zoomableImage);
75− tryCompare(zoomableImage, "imageState", "ready");
75+ tryCompare(zoomableImage, "imageStatus", Image.Ready);
76 compare (signalSpy.count, 1);
76 compare (signalSpy.count, 1);
77 }
77 }
78
78
@@ -84,15 +84,15 @@ Rectangle {
84
84
85 function test_mousewheel() {
85 function test_mousewheel() {
86 var image = findChild(zoomableImage, "image");
86 var image = findChild(zoomableImage, "image");
87− var lazyImage = findChild(zoomableImage, "lazyImage");
87+ var imageRenderer = findChild(zoomableImage, "imageRenderer");
88 var flickable = findChild(zoomableImage, "flickable");
88 var flickable = findChild(zoomableImage, "flickable");
89
89
90 zoomableImage.source = widgetData2["source"];
90 zoomableImage.source = widgetData2["source"];
91 zoomableImage.zoomable = true;
91 zoomableImage.zoomable = true;
92 waitForRendering(zoomableImage);
92 waitForRendering(zoomableImage);
93
93
94− tryCompare(zoomableImage, "imageState", "ready");
94+ tryCompare(zoomableImage, "imageStatus", Image.Ready);
95− tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(widgetData2["source"]); }, true);
95+ tryCompareFunction(function() { return get_filename(imageRenderer.source.toString()) === get_filename(widgetData2["source"]); }, true);
96 waitForRendering(image);
96 waitForRendering(image);
97
97
98 // move mouse to center
98 // move mouse to center
@@ -105,16 +105,16 @@ Rectangle {
105 for (var i=0; i<10; i++) {
105 for (var i=0; i<10; i++) {
106 mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, 10);
106 mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, 10);
107 tryCompare(image, "scale", oldScale + (i + 1) * 0.1);
107 tryCompare(image, "scale", oldScale + (i + 1) * 0.1);
108− compare(flickable.contentWidth, Math.max(lazyImage.width * image.scale, flickable.width));
108+ compare(flickable.contentWidth, Math.max(imageRenderer.width * image.scale, flickable.width));
109− compare(flickable.contentHeight, Math.max(lazyImage.height * image.scale, flickable.height));
109+ compare(flickable.contentHeight, Math.max(imageRenderer.height * image.scale, flickable.height));
110 }
110 }
111
111
112 // zoom out
112 // zoom out
113 for (var i=0; i<10; i++) {
113 for (var i=0; i<10; i++) {
114 mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, -10);
114 mouseWheel(zoomableImage, zoomableImage.width / 2, zoomableImage.height / 2, 0, -10);
115 tryCompare(image, "scale", oldScale + 1.0 - (i + 1) * 0.1);
115 tryCompare(image, "scale", oldScale + 1.0 - (i + 1) * 0.1);
116− compare(flickable.contentWidth, Math.max(lazyImage.width * image.scale, flickable.width));
116+ compare(flickable.contentWidth, Math.max(imageRenderer.width * image.scale, flickable.width));
117− compare(flickable.contentHeight, Math.max(lazyImage.height * image.scale, flickable.height));
117+ compare(flickable.contentHeight, Math.max(imageRenderer.height * image.scale, flickable.height));
118 }
118 }
119 }
119 }
120 }
120 }
@@ -135,7 +135,7 @@ Rectangle {
135
135
136 function test_pinch(data) {
136 function test_pinch(data) {
137 var image = findChild(zoomableImage, "image");
137 var image = findChild(zoomableImage, "image");
138− var lazyImage = findChild(zoomableImage, "lazyImage");
138+ var imageRenderer = findChild(zoomableImage, "imageRenderer");
139 var flickable = findChild(zoomableImage, "flickable");
139 var flickable = findChild(zoomableImage, "flickable");
140
140
141 signalSpy.signalName = "onScaleChanged";
141 signalSpy.signalName = "onScaleChanged";
@@ -146,8 +146,8 @@ Rectangle {
146 zoomableImage.zoomable = data.zoomable;
146 zoomableImage.zoomable = data.zoomable;
147 waitForRendering(zoomableImage);
147 waitForRendering(zoomableImage);
148
148
149− tryCompare(zoomableImage, "imageState", "ready");
149+ tryCompare(zoomableImage, "imageStatus", Image.Ready);
150− tryCompareFunction(function() { return get_filename(lazyImage.source.toString()) === get_filename(data.source); }, true);
150+ tryCompareFunction(function() { return get_filename(imageRenderer.source.toString()) === get_filename(data.source); }, true);
151 waitForRendering(image);
151 waitForRendering(image);
152
152
153 var x1Start = zoomableImage.width * 2 / 6;
153 var x1Start = zoomableImage.width * 2 / 6;
@@ -179,15 +179,15 @@ Rectangle {
179 compare(newScale > oldScale, data.answer2, "scale factor didn't changed");
179 compare(newScale > oldScale, data.answer2, "scale factor didn't changed");
180 compare(signalSpy.count == 0, data.answer3, "scale signal count error");
180 compare(signalSpy.count == 0, data.answer3, "scale signal count error");
181 compare(image.scale, newScale, "scale factor error");
181 compare(image.scale, newScale, "scale factor error");
182− compare(flickable.contentWidth, Math.max(lazyImage.width * image.scale, flickable.width));
182+ compare(flickable.contentWidth, Math.max(imageRenderer.width * image.scale, flickable.width));
183− compare(flickable.contentHeight, Math.max(lazyImage.height * image.scale, flickable.height));
183+ compare(flickable.contentHeight, Math.max(imageRenderer.height * image.scale, flickable.height));
184
184
185 wait(3000); // have to delay between two consequent pinch event.
185 wait(3000); // have to delay between two consequent pinch event.
186 // pinch zoom-out
186 // pinch zoom-out
187 touchPinch(zoomableImage, x1End, y1End, x1Start, y1Start, x2End, y2End, x2Start, y2Start);
187 touchPinch(zoomableImage, x1End, y1End, x1Start, y1Start, x2End, y2End, x2Start, y2Start);
188 tryCompare(image, "scale", oldScale);
188 tryCompare(image, "scale", oldScale);
189− compare(flickable.contentWidth, Math.max(lazyImage.width * image.scale, flickable.width));
189+ compare(flickable.contentWidth, Math.max(imageRenderer.width * image.scale, flickable.width));
190− compare(flickable.contentHeight, Math.max(lazyImage.height * image.scale, flickable.height));
190+ compare(flickable.contentHeight, Math.max(imageRenderer.height * image.scale, flickable.height));
191 }
191 }
192 }
192 }
193 }
193 }
tests/qmltests/Dash/Previews/tst_PreviewImageGallery.qml+25−24
@@ -48,12 +48,13 @@ Rectangle {
48 name: "PreviewImageGalleryTest"
48 name: "PreviewImageGalleryTest"
49 when: windowShown
49 when: windowShown
50
50
51− property Item slideShow: findChild(imageGallery.rootItem, "slideShow")
51+ property Item overlay: findChild(imageGallery.rootItem, "overlay")
52− property Item slideShowCloseButton: findChild(slideShow, "slideShowCloseButton")
52+ property Item overlayCloseButton: findChild(overlay, "overlayCloseButton")
53− property Item slideShowListView: findChild(slideShow, "slideShowListView")
53+ property Item overlayListView: findChild(overlay, "overlayListView")
54
54
55 function cleanup() {
55 function cleanup() {
56+ overlay.hide();
56− slideShow.visible = false;
57+ tryCompare(overlay, "visible", false);
57 imageGallery.widgetData = sourcesModel1;
58 imageGallery.widgetData = sourcesModel1;
58 waitForRendering(imageGallery);
59 waitForRendering(imageGallery);
59 }
60 }
@@ -64,29 +65,29 @@ Rectangle {
64 compare(placeholderScreenshot.visible, true);
65 compare(placeholderScreenshot.visible, true);
65 }
66 }
66
67
67− function test_slideShowOpenClose() {
68+ function test_overlayOpenClose() {
68 var image0 = findChild(imageGallery, "previewImage0");
69 var image0 = findChild(imageGallery, "previewImage0");
69 mouseClick(image0, image0.width / 2, image0.height / 2);
70 mouseClick(image0, image0.width / 2, image0.height / 2);
70− tryCompare(slideShow, "visible", true);
71+ tryCompare(overlay, "visible", true);
71− tryCompare(slideShow, "scale", 1.0);
72+ tryCompare(overlay, "scale", 1.0);
72− tryCompare(slideShowCloseButton, "visible", true);
73+ tryCompare(overlayCloseButton, "visible", true);
73− mouseClick(slideShowCloseButton, slideShowCloseButton.width / 2, slideShowCloseButton.height / 2);
74+ mouseClick(overlayCloseButton, overlayCloseButton.width / 2, overlayCloseButton.height / 2);
74− tryCompare(slideShow, "visible", false);
75+ tryCompare(overlay, "visible", false);
75 }
76 }
76
77
77− function test_slideShowShowHideHeader() {
78+ function test_overlayShowHideHeader() {
78 var image0 = findChild(imageGallery, "previewImage0");
79 var image0 = findChild(imageGallery, "previewImage0");
79 mouseClick(image0, image0.width / 2, image0.height / 2);
80 mouseClick(image0, image0.width / 2, image0.height / 2);
80− tryCompare(slideShow, "visible", true);
81+ tryCompare(overlay, "visible", true);
81− tryCompare(slideShow, "scale", 1.0);
82+ tryCompare(overlay, "scale", 1.0);
82− tryCompare(slideShowCloseButton, "visible", true);
83+ tryCompare(overlayCloseButton, "visible", true);
83− mouseClick(slideShow, slideShow.width / 2, slideShow.height / 2);
84+ mouseClick(overlay, overlay.width / 2, overlay.height / 2);
84− tryCompare(slideShowCloseButton, "visible", false);
85+ tryCompare(overlayCloseButton, "visible", false);
85− mouseClick(slideShow, slideShow.width / 2, slideShow.height / 2);
86+ mouseClick(overlay, overlay.width / 2, overlay.height / 2);
86− tryCompare(slideShowCloseButton, "visible", true);
87+ tryCompare(overlayCloseButton, "visible", true);
87 }
88 }
88
89
89− function test_slideShowOpenCorrectImage_data() {
90+ function test_overlayOpenCorrectImage_data() {
90 return [
91 return [
91 { tag: "Image 0", index: 0 },
92 { tag: "Image 0", index: 0 },
92 { tag: "Image 1", index: 1 },
93 { tag: "Image 1", index: 1 },
@@ -94,13 +95,13 @@ Rectangle {
94 ];
95 ];
95 }
96 }
96
97
97− function test_slideShowOpenCorrectImage(data) {
98+ function test_overlayOpenCorrectImage(data) {
98 var image = findChild(imageGallery, "previewImage" + data.index);
99 var image = findChild(imageGallery, "previewImage" + data.index);
99 mouseClick(image, image.width / 2, image.height / 2);
100 mouseClick(image, image.width / 2, image.height / 2);
100− tryCompare(slideShow, "visible", true);
101+ tryCompare(overlay, "visible", true);
101− tryCompare(slideShow, "scale", 1.0);
102+ tryCompare(overlay, "scale", 1.0);
102− tryCompare(slideShowListView, "currentIndex", data.index);
103+ tryCompare(overlayListView, "currentIndex", data.index);
103− verify(image.source === slideShowListView.currentItem.source);
104+ verify(image.source === overlayListView.currentItem.source);
104 }
105 }
105 }
106 }
106}
107}
tests/qmltests/Dash/Previews/tst_PreviewZoomableImage.qml+30−8
@@ -36,26 +36,48 @@ Rectangle {
36
36
37 PreviewZoomableImage {
37 PreviewZoomableImage {
38 id: zoomableImage
38 id: zoomableImage
39− anchors.fill: parent
39+ anchors.centerIn: parent
40− widgetData: widgetData1
40+ widgetData: widgetData0
41 }
41 }
42
42
43 UT.UnityTestCase {
43 UT.UnityTestCase {
44 name: "PreviewZoomableImageTest"
44 name: "PreviewZoomableImageTest"
45 when: windowShown
45 when: windowShown
46
46
47+ property Item lazyImage: findChild(zoomableImage, "lazyImage");
48+ property Item overlay: findChild(zoomableImage.rootItem, "overlay");
49+
47− function test_loadImage() {
50+ function init() {
48− var image = findChild(zoomableImage, "image");
51+ waitForRendering(zoomableImage);
52+ waitForRendering(overlay);
53+ }
54+
55+ function cleanup() {
56+ overlay.hide();
57+ tryCompare(overlay, "visible", false);
58+ zoomableImage.widgetData = widgetData0;
59+ }
49
60
61+ function test_loadImage() {
50 zoomableImage.widgetData = widgetData0;
62 zoomableImage.widgetData = widgetData0;
51 waitForRendering(zoomableImage);
63 waitForRendering(zoomableImage);
52− waitForRendering(image);
64+ waitForRendering(lazyImage);
53− tryCompare(image, "imageState", "ready");
65+ tryCompare(lazyImage, "state", "ready");
54
66
55 zoomableImage.widgetData = widgetData1;
67 zoomableImage.widgetData = widgetData1;
56 waitForRendering(zoomableImage);
68 waitForRendering(zoomableImage);
57− waitForRendering(image);
69+ waitForRendering(lazyImage);
58− tryCompare(image, "imageState", "default");
70+ tryCompare(lazyImage, "state", "default");
71+ }
72+
73+ function test_zoomableImageOpenClose() {
74+ var overlayCloseButton = findChild(overlay, "overlayCloseButton");
75+ mouseClick(lazyImage, lazyImage.width / 2, lazyImage.height / 2);
76+ tryCompare(overlay, "visible", true);
77+ tryCompare(overlay, "scale", 1.0);
78+ tryCompare(overlayCloseButton, "visible", true);
79+ mouseClick(overlayCloseButton, overlayCloseButton.width / 2, overlayCloseButton.height / 2);
80+ tryCompare(overlay, "visible", false);
59 }
81 }
60 }
82 }
61}
83}