src_js/iconolab-bundle/src/components/editor/ShapeRect.vue
author Alexandre Segura <mex.zktk@gmail.com>
Fri, 17 Mar 2017 18:17:07 +0100
changeset 449 04ac84f80eb3
parent 425 7bc5febc9933
permissions -rw-r--r--
Improve calculation of stroke width depending on image ratio.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     1
<template>
408
159042869b47 Introduce shadow effect on shapes.
Alexandre Segura <mex.zktk@gmail.com>
parents: 350
diff changeset
     2
<g ref="g" filter="url(#shadow)" v-bind:transform="transform">
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     3
    <rect
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     4
        ref="shape"
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     5
        x="0" y="0"
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
     6
        v-bind:width="width" v-bind:height="height"
449
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
     7
        v-bind:stroke-width="strokeWidth"
350
7c0b98b10e00 Do not show custom cursors when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 342
diff changeset
     8
        class="shape"
418
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
     9
        v-bind:class="{ 'shape--draggable': !readonly }"
449
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    10
        v-bind:style="{ 'outline-width': (strokeWidth / 2) + 'px' }"></rect>
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    11
    <rect
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    12
        ref="topLeft"
342
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    13
        v-show="showResizeHandlers"
449
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    14
        v-bind:x="((strokeWidth * 4) / 2) * -1" v-bind:y="((strokeWidth * 4) / 2) * -1"
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    15
        v-bind:width="strokeWidth * 4" v-bind:height="strokeWidth * 4"
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    16
        v-bind:stroke-width="strokeWidth" class="handler handler-top-left"></rect>
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    17
    <rect
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    18
        ref="bottomRight"
342
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    19
        v-show="showResizeHandlers"
449
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    20
        v-bind:x="width - ((strokeWidth * 4) / 2)" v-bind:y="height - ((strokeWidth * 4) / 2)"
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    21
        v-bind:width="strokeWidth * 4" v-bind:height="strokeWidth * 4"
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    22
        v-bind:stroke-width="strokeWidth" class="handler handler-bottom-right"></rect>
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    23
</g>
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    24
</template>
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    25
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    26
<script>
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    27
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    28
    import Snap from 'snapsvg'
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    29
    import tooltip from './mixins/tooltip'
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    30
    import save from './mixins/save'
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    31
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    32
    export default {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    33
        mixins: [ tooltip, save ],
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    34
        props: [
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    35
            'paper',
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    36
            'original-annotation',
342
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    37
            'tooltip',
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    38
            'readonly',
418
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
    39
            'original-path',
449
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    40
            'stroke-width'
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    41
        ],
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    42
        data() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    43
            return {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    44
                transform: 'translate(0, 0)',
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    45
                isResizing: false,
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    46
                x: 0, y: 0,
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    47
                width: 0, height: 0,
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    48
            }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    49
        },
342
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    50
        computed: {
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    51
            showResizeHandlers: function() {
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    52
                return !this.readonly && (this.width > 0 && this.height > 0);
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    53
            }
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    54
        },
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    55
        mounted() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    56
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    57
            var self = this;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    58
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    59
            var groupEvents = {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    60
                onMove: function(dx, dy) {
342
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    61
                    if (self.isResizing || self.readonly) { return; }
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    62
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    63
                    var snapInvMatrix = this.transform().diffMatrix.invert();
332
1670e5e1ed97 Fix bug when moving rect shape on zoomed image.
Alexandre Segura <mex.zktk@gmail.com>
parents: 323
diff changeset
    64
                    snapInvMatrix.e = snapInvMatrix.f = 0;
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    65
                    var tdx = snapInvMatrix.x(dx, dy);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    66
                    var tdy = snapInvMatrix.y(dx, dy);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    67
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    68
                    var transformValue = this.data('origTransform') + (this.data('origTransform') ? "T" : "t") + [tdx, tdy];
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    69
                    this.transform(transformValue);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    70
                },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    71
                onStart: function() {
342
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    72
                    if (self.readonly) { return; }
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 335
diff changeset
    73
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    74
                    this.data('origTransform', this.transform().local);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    75
                    self.$emit('drag:start');
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    76
                },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    77
                onEnd: () => self.$emit('drag:end')
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    78
            }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    79
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    80
            var g = new Snap(this.$refs.g);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    81
            g.drag(groupEvents.onMove, groupEvents.onStart, groupEvents.onEnd);
418
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
    82
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
    83
            if (this.originalPath) {
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
    84
                this.fromSVGPath(this.originalPath, false);
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
    85
                g.click(() => this.$emit('click'))
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
    86
            }
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    87
        },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    88
        watch: {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    89
            x: function (val, oldVal) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    90
                this.transform = 'translate(' + this.x + ', ' + this.y + ')';
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    91
            },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    92
            y: function (val, oldVal) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    93
                this.transform = 'translate(' + this.x + ', ' + this.y + ')';
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    94
            },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    95
        },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    96
        methods: {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    97
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    98
            clear: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    99
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   100
                var shape = new Snap(this.$refs.shape);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   101
                var topLeftHandler = new Snap(this.$refs.topLeft);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   102
                var bottomRightHandler = new Snap(this.$refs.bottomRight);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   103
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   104
                shape.node.removeAttribute('transform');
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   105
                topLeftHandler.node.removeAttribute('transform');
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   106
                bottomRightHandler.node.removeAttribute('transform');
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   107
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   108
                this.destroyTooltip();
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   109
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   110
                Object.assign(this, {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   111
                    transform: 'translate(0, 0)',
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   112
                    x: 0, y: 0,
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   113
                    width: 0, height: 0,
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   114
                });
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   115
            },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   116
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   117
            getTooltipTarget: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   118
                return this.$refs.shape;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   119
            },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   120
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   121
            addResizeHandlers: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   122
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   123
                var self = this;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   124
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   125
                var shape = new Snap(this.$refs.shape);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   126
                var topLeftHandler = new Snap(this.$refs.topLeft);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   127
                var bottomRightHandler = new Snap(this.$refs.bottomRight);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   128
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   129
                var handlerEvents = {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   130
                    onMove: function(dx, dy) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   131
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   132
                        var snapInvMatrix = this.transform().diffMatrix.invert();
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   133
                        snapInvMatrix.e = snapInvMatrix.f = 0;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   134
                        var tdx = snapInvMatrix.x(dx, dy);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   135
                        var tdy = snapInvMatrix.y(dx, dy);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   136
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   137
                        this.transform( "t" + [ tdx, tdy ] + this.data("origTransform") );
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   138
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   139
                        // Update shape
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   140
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   141
                        var newWidth = bottomRightHandler.getBBox().x - topLeftHandler.getBBox().x;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   142
                        var newHeight = bottomRightHandler.getBBox().y - topLeftHandler.getBBox().y;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   143
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   144
                        var attr = {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   145
                            width: newWidth,
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   146
                            height: newHeight
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   147
                        };
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   148
                        if (this === topLeftHandler) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   149
                            attr.transform = shape.data('origTransform') + (shape.data('origTransform') ? "T" : "t") + [tdx, tdy];
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   150
                        }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   151
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   152
                        shape.attr(attr);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   153
                    },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   154
                    onStart: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   155
                        self.isResizing = true;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   156
                        shape.data("origTransform", shape.transform().local);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   157
                        this.data('origTransform', this.transform().local);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   158
                    },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   159
                    onEnd: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   160
                        self.isResizing = false;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   161
                    }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   162
                }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   163
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   164
                topLeftHandler.drag(handlerEvents.onMove, handlerEvents.onStart, handlerEvents.onEnd);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   165
                bottomRightHandler.drag(handlerEvents.onMove, handlerEvents.onStart, handlerEvents.onEnd);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   166
            },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   167
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   168
            fromSVGPath: function(pathString, tooltip) {
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   169
                var bBox = Snap.path.getBBox(pathString);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   170
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   171
                Object.assign(this, {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   172
                    x: bBox.x, y: bBox.y,
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   173
                    width: bBox.width, height: bBox.height
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   174
                });
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   175
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   176
                this.$nextTick(() => {
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   177
                    this.addResizeHandlers();
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   178
                    if (tooltip) {
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   179
                        // FIXME Race condition with destroy
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   180
                        setTimeout(() => this.addTooltip(), 250);
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   181
                    }
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   182
                });
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   183
            },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   184
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   185
            toSVGPath: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   186
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   187
                var shape = new Snap(this.$refs.shape);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   188
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   189
                var shapePath;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   190
                var bBox = shape.getBBox();
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   191
                var transform = shape.transform();
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   192
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   193
                if (!transform.global.length) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   194
                    shapePath = shape.getBBox().path;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   195
                } else {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   196
                    var shapeX = shape.node.getAttribute('x');
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   197
                    var shapeY = shape.node.getAttribute('y');
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   198
                    var transformMatrix = transform.totalMatrix;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   199
                    var fakeShape = this.paper.rect(transformMatrix.x(shapeX, shapeY),transformMatrix.y(shapeX, shapeY), bBox.width, bBox.height);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   200
                    shapePath = fakeShape.getBBox().path;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   201
                    fakeShape.remove();
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   202
                }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   203
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   204
                var path = Snap.path.toAbsolute(shapePath).toString();
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   205
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   206
                return this.$parent.normalizePath(path) + ';RECT';
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   207
            }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   208
        }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   209
    }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   210
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   211
</script>
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   212
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   213
<style scoped>
350
7c0b98b10e00 Do not show custom cursors when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 342
diff changeset
   214
.shape {
408
159042869b47 Introduce shadow effect on shapes.
Alexandre Segura <mex.zktk@gmail.com>
parents: 350
diff changeset
   215
    fill: transparent;
418
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   216
    stroke: #fff;
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   217
    outline-color: #000;
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   218
    outline-style: solid;
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   219
}
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   220
.shape:hover,
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   221
.shape.active {
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   222
    cursor: pointer;
425
7bc5febc9933 Change hover color.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   223
    fill: #c5f2ff;
7bc5febc9933 Change hover color.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   224
    opacity: 0.25;
350
7c0b98b10e00 Do not show custom cursors when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 342
diff changeset
   225
}
7c0b98b10e00 Do not show custom cursors when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 342
diff changeset
   226
.shape--draggable:hover {
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   227
    cursor: move;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   228
}
449
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
   229
.handler {
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
   230
    fill: #fff;
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
   231
    stroke: #000;
04ac84f80eb3 Improve calculation of stroke width depending on image ratio.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
   232
}
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   233
.handler-top-left:hover {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   234
    cursor: nw-resize;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   235
}
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   236
.handler-bottom-right:hover {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   237
    cursor: se-resize;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   238
}
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   239
</style>