src_js/iconolab-bundle/src/components/editor/ZoomThumbnail.vue
author Alexandre Segura <mex.zktk@gmail.com>
Mon, 15 May 2017 12:38:40 +0200
changeset 502 89dc19ad8073
parent 428 722d8e9e2f6e
permissions -rw-r--r--
Fix zoom positioning / center.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     1
<template>
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
     2
    <div class="zoom-wrapper" v-bind:style="{ width: svgWidth + 'px', height: svgHeight + 'px' }">
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
     3
        <svg ref="svg" v-bind:width="svgWidth" v-bind:height="svgHeight">
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     4
            <image xmlns:xlink="http://www.w3.org/1999/xlink"
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     5
                x="0" y="0"
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
     6
                v-bind:width="svgWidth" v-bind:height="svgHeight"
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     7
                v-bind:xlink:href="image"></image>
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     8
            <rect ref="handler"
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     9
                class="move-handler"
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    10
                v-bind:x="x" v-bind:y="y"
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    11
                v-bind:width="width" v-bind:height="height"
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    12
                style="fill: black; opacity: 0.4"></rect>
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    13
        </svg>
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    14
    </div>
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    15
</template>
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    16
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    17
<script>
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    18
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    19
    import Snap from 'snapsvg'
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    20
428
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    21
    // See http://svg.dabbles.info/snaptut-drag-limit
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    22
    Snap.plugin( function( Snap, Element, Paper, global ) {
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    23
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    24
        Element.prototype.limitDrag = function( params ) {
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    25
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    26
            var onMove = function(dx, dy) {
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    27
                limitMoveDrag.apply(this, arguments);
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    28
                params.onMove.apply(this, arguments);
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    29
            }
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    30
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    31
            this.data('minx', params.minx); this.data('miny', params.miny);
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    32
            this.data('maxx', params.maxx); this.data('maxy', params.maxy);
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    33
            this.data('x', params.x);
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    34
            this.data('y', params.y);
428
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    35
            this.data('ibb', this.getBBox());
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    36
            this.data('ot', this.transform().local);
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    37
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    38
            this.drag(onMove, limitStartDrag, params.onEnd);
428
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    39
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    40
            return this;
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    41
        };
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    42
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    43
        function limitMoveDrag( dx, dy ) {
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    44
            var tdx, tdy;
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    45
            var sInvMatrix = this.transform().globalMatrix.invert();
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    46
            sInvMatrix.e = sInvMatrix.f = 0;
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    47
            tdx = sInvMatrix.x( dx,dy ); tdy = sInvMatrix.y( dx,dy );
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    48
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    49
            this.data('x', +this.data('ox') + tdx);
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    50
            this.data('y', +this.data('oy') + tdy);
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    51
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    52
            if (this.data('x') > this.data('maxx')) {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    53
                this.data('x', this.data('maxx'))
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    54
            };
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    55
            if (this.data('y') > this.data('maxy')) {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    56
                this.data('y', this.data('maxy'))
428
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    57
            };
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    58
            if (this.data('x') < this.data('minx')) {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    59
                this.data('x', this.data('minx'))
428
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    60
            };
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    61
            if (this.data('y') < this.data('miny')) {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    62
                this.data('y', this.data('miny'))
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    63
            };
428
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    64
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    65
            this.transform( this.data('ot') + "t" + [ this.data('x'), this.data('y') ]);
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    66
        };
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    67
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    68
        function limitStartDrag( x, y, ev ) {
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    69
            this.data('ox', this.data('x'));
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    70
            this.data('oy', this.data('y'));
428
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    71
        };
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    72
    });
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
    73
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    74
    export default {
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    75
        props: [
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    76
            'image',
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    77
            'viewport',
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    78
            'parentViewBox',
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    79
            'imageWidth',
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    80
            'imageHeight',
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    81
        ],
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    82
        data() {
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    83
            return {
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    84
                svgWidth: 0,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    85
                svgHeight: 0,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    86
                loaded: false,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    87
                viewBox: [0, 0, 0, 0],
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    88
                ratioX: 1,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    89
                ratioY: 1,
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    90
            }
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    91
        },
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    92
        computed: {
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    93
            x: function() {
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    94
                return this.parentViewBox[0] * this.ratioX
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    95
            },
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    96
            y: function() {
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
    97
                return this.parentViewBox[1] * this.ratioY
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    98
            },
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    99
            width: function() {
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   100
                return this.parentViewBox[2] * this.ratioX
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   101
            },
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   102
            height: function() {
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   103
                return this.parentViewBox[3] * this.ratioY
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   104
            }
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   105
        },
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   106
        methods: {
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   107
            reset: function() {
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   108
                var handler = new Snap(this.$refs.handler);
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   109
                handler.node.removeAttribute('transform');
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   110
            },
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   111
            getCenter: function() {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   112
                const bbox = new Snap(this.$refs.handler).getBBox();
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   113
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   114
                return {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   115
                    x: bbox.cx / this.ratioX,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   116
                    y: bbox.cy / this.ratioY
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   117
                }
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   118
            }
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   119
        },
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   120
        mounted() {
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   121
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   122
            const svg = new Snap(this.$refs.svg);
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   123
            const handler = new Snap(this.$refs.handler);
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   124
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   125
            var img = new Image();
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   126
            img.onload = (e) => {
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   127
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   128
                // The zoom needs to have the same dimensions as the viewport,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   129
                // in order to reflect the position accordingly
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   130
                const imageSize = Math.max(img.width, img.height);
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   131
                const viewportSize = Math.max(this.viewport.width, this.viewport.height);
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   132
                const viewportRatio = imageSize / viewportSize;
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   133
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   134
                const svgWidth = (this.viewport.width * viewportRatio);
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   135
                const svgHeight = (this.viewport.height * viewportRatio);
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   136
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   137
                const viewBox = [0, 0, svgWidth, svgHeight];
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   138
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   139
                const ratioX = (viewBox[2] / this.parentViewBox[2])
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   140
                const ratioY = (viewBox[3] / this.parentViewBox[3])
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   141
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   142
                Object.assign(this, {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   143
                    svgWidth: svgWidth,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   144
                    svgHeight: svgHeight,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   145
                    viewBox: viewBox,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   146
                    ratioX: ratioX,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   147
                    ratioY: ratioY,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   148
                    loaded: true
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   149
                });
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   150
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   151
                svg.attr({
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   152
                    viewBox: viewBox
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   153
                });
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   154
428
722d8e9e2f6e Limit zoom handler to bounds.
Alexandre Segura <mex.zktk@gmail.com>
parents: 355
diff changeset
   155
                var self = this;
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   156
                setTimeout(() => {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   157
                    handler.limitDrag({
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   158
                        x: 0, y: 0,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   159
                        minx: -(svgWidth / 2), miny: -(svgHeight / 2),
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   160
                        maxx: (svgWidth / 2), maxy: (svgHeight / 2),
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   161
                        onMove: function() {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   162
                            self.$emit('move', {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   163
                                x: this.getBBox().x / ratioX,
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   164
                                y: this.getBBox().y / ratioY
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   165
                            });
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   166
                        },
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   167
                        onEnd: function() {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   168
                            this.node.removeAttribute('transform');
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   169
                            self.$emit('moveend')
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   170
                        }
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   171
                    });
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   172
                }, 500);
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   173
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   174
            }
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   175
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   176
            img.src = this.image;
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   177
        }
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   178
    }
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   179
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   180
</script>
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   181
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   182
<style scoped>
502
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   183
.zoom-wrapper {
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   184
    background-color: #fff;
89dc19ad8073 Fix zoom positioning / center.
Alexandre Segura <mex.zktk@gmail.com>
parents: 428
diff changeset
   185
}
335
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   186
.move-handler {
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   187
    cursor: -moz-grab;
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   188
    cursor: -webkit-grab;
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   189
    cursor: grab;
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   190
}
86dbf2cdeeeb Introduce ZoomThumbnail, improve zoom behavior.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   191
</style>