src_js/iconolab-bundle/src/components/editor/Canvas.vue
changeset 335 86dbf2cdeeeb
parent 334 a0caf91c8374
child 342 ebec1d59dc74
--- a/src_js/iconolab-bundle/src/components/editor/Canvas.vue	Tue Feb 21 16:04:20 2017 +0100
+++ b/src_js/iconolab-bundle/src/components/editor/Canvas.vue	Wed Feb 22 11:04:16 2017 +0100
@@ -17,6 +17,18 @@
                 <button @click="zoomOut" type="button" class="btn btn-default"><i class="fa fa-minus" aria-hidden="true"></i></button>
             </div>
         </div>
+        <div class="zoom-thumbnail">
+            <zoom-thumbnail
+                ref="thumbnail"
+                @change="changeViewBox($event)"
+                @dragstart="hideTooltip"
+                @dragend="showTooltip"
+                v-bind:image="thumbnail"
+                v-bind:viewport="viewport"
+                v-bind:viewBox="viewBox"
+                v-bind:imageWidth="imageWidth"
+                v-bind:imageHeight="imageHeight"></zoom-thumbnail>
+        </div>
         <div class="mode-controls">
             <div class="btn-group" role="group" aria-label="...">
                 <button @click="mode = 'rect'" type="button" v-bind:class="{ btn: true, 'btn-default': true, 'btn-primary': mode === 'rect'}">
@@ -35,10 +47,12 @@
     import Snap from 'snapsvg'
     import ShapeRect from './ShapeRect.vue'
     import ShapeFree from './ShapeFree.vue'
+    import ZoomThumbnail from './ZoomThumbnail.vue'
 
     export default {
         props: {
             image: String,
+            thumbnail: String,
             annotation: {
                 type: Object,
                 default: function () {
@@ -54,7 +68,8 @@
         },
         components: {
             shapeRect: ShapeRect,
-            shapeFree: ShapeFree
+            shapeFree: ShapeFree,
+            zoomThumbnail: ZoomThumbnail,
         },
         data() {
             return {
@@ -105,32 +120,24 @@
                     factor = scale - 1;
                 }
 
-                var center = this.getCenter();
-
-                var viewBoxW = this.imgMinSize - (this.imgMinSize * factor);
-                var viewBoxH = viewBoxW;
+                if (scale === 1) {
+                    this.resetViewBox();
+                } else {
+                    var center = this.getCenter();
 
-                const viewBoxPrev = this.viewBox.slice();
-                const viewBoxNew = [
-                    center.x - viewBoxW / 2,
-                    center.y - viewBoxH / 2,
-                    viewBoxW,
-                    viewBoxH
-                ];
+                    var viewBoxW = this.imgMinSize - (this.imgMinSize * factor);
+                    var viewBoxH = viewBoxW;
 
-                this.$refs.rect.hideTooltip();
-                Snap.animate(
-                    viewBoxPrev, viewBoxNew,
-                    (viewBox) => this.paper.attr({ "viewBox": viewBox }),
-                    350, mina.easeinout,
-                    () => {
-                        this.viewBox = viewBoxNew;
-                        this.$refs.rect.showTooltip();
-                        if (scale === 1) {
-                            this.resetZoom();
-                        }
-                    }
-                );
+                    var viewBox = [
+                        center.x - viewBoxW / 2,
+                        center.y - viewBoxH / 2,
+                        viewBoxW,
+                        viewBoxH
+                    ];
+
+                    this.hideTooltip();
+                    this.animateViewBox(viewBox, () => this.showTooltip());
+                }
             }
         },
         mounted() {
@@ -178,13 +185,30 @@
 
         },
         methods: {
-
+            hideTooltip: function() {
+                if (this.mode === 'free') {
+                    this.$refs.free.hideTooltip();
+                }
+                if (this.mode === 'rect') {
+                    this.$refs.rect.hideTooltip();
+                }
+            },
+            showTooltip: function() {
+                if (this.mode === 'free') {
+                    this.$refs.free.showTooltip();
+                }
+                if (this.mode === 'rect') {
+                    this.$refs.rect.showTooltip();
+                }
+            },
             reset: function() {
                 // Clear shapes
                 this.$refs.rect.clear();
                 this.$refs.free.clear();
 
                 this.removeEventHandlers();
+                this.resetZoom();
+                this.resetViewBox();
 
                 if (this.mode === 'free') {
                     this.handleDrawFree();
@@ -228,10 +252,36 @@
                 }
             },
 
+            changeViewBox: function(e) {
+                const viewBox = this.viewBox.slice();
+
+                viewBox[0] = e.x;
+                viewBox[1] = e.y;
+
+                this.paper.attr({ "viewBox": viewBox });
+            },
+
             resetZoom: function() {
                 this.scale = 1;
-                this.viewBox = [0, 0, this.imageWidth, this.imageHeight];
-                this.paper.attr({ "viewBox": this.viewBox });
+                this.$refs.thumbnail.reset();
+            },
+
+            animateViewBox: function(viewBox, cb) {
+                const viewBoxPrev = this.viewBox.slice();
+
+                Snap.animate(
+                    viewBoxPrev, viewBox,
+                    (viewBox) => this.paper.attr({ "viewBox": viewBox }),
+                    350, mina.easeinout,
+                    () => {
+                        this.viewBox = viewBox;
+                        if (cb) { cb(); }
+                    }
+                );
+            },
+
+            resetViewBox: function() {
+                this.animateViewBox([0, 0, this.imageWidth, this.imageHeight]);
             },
 
             zoomIn: function() {
@@ -430,8 +480,8 @@
 }
 .zoomer {
     position: absolute;
-    bottom: 30px;
-    right: 30px;
+    bottom: 15px;
+    right: 15px;
 }
 .cut-canvas {
     width: 100%;
@@ -448,6 +498,11 @@
     top: 15px;
     left: 15px;
 }
+.zoom-thumbnail {
+    position: absolute;
+    left: 15px;
+    bottom: 15px;
+}
 .mode-controls .btn > svg {
     margin-top: 4px;
 }