src_js/iconolab-bundle/src/components/editor/ShapeFree.vue
author ymh <ymh.work@gmail.com>
Wed, 06 Jun 2018 16:21:54 +0200
changeset 539 08e2513dbc2f
parent 509 efa81cbd61e9
permissions -rw-r--r--
Upgrade webpack to 4, upgrade vue.js, and some style changes
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>
509
efa81cbd61e9 Fix bug on zoom with free shape.
Alexandre Segura <mex.zktk@gmail.com>
parents: 448
diff changeset
     2
    <g>
420
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
     3
        <defs>
437
0aa597a588c1 Pass strokeWidth as prop.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
     4
            <path v-bind:id="annotationHref" ref="path" v-bind:d="path" class="path"></path>
420
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
     5
        </defs>
447
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
     6
        <g ref="g">
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
     7
            <use v-bind:xlink:href="annotationSelector" v-bind:stroke-width="strokeWidth * 2" class="stroke-bg" filter="url(#shadow)" />
437
0aa597a588c1 Pass strokeWidth as prop.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
     8
            <use v-bind:xlink:href="annotationSelector" v-bind:stroke-width="strokeWidth" class="stroke-fg" />
448
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
     9
            <use v-bind:xlink:href="annotationSelector" class="overlay" v-bind:class="{ active: !originalAnnotation }" />
420
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    10
            <circle ref="handlers"
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    11
                v-for="(point, key) in points"
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    12
                :key="key"
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    13
                v-show="!readonly"
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    14
                v-bind:data-key="key"
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    15
                v-bind:cx="point.x"
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    16
                v-bind:cy="point.y"
437
0aa597a588c1 Pass strokeWidth as prop.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    17
                v-bind:r="strokeWidth * 2"
0aa597a588c1 Pass strokeWidth as prop.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    18
                v-bind:stroke-width="strokeWidth"
420
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    19
                v-bind:class="{ handler: true, 'handler--first': key === 0 &amp;&amp; !closed }"></circle>
448
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
    20
            <text ref="text"
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
    21
                v-bind:x="text.x" v-bind:y="text.y"
509
efa81cbd61e9 Fix bug on zoom with free shape.
Alexandre Segura <mex.zktk@gmail.com>
parents: 448
diff changeset
    22
                v-show="!originalAnnotation && !closed && points.length > 3"
efa81cbd61e9 Fix bug on zoom with free shape.
Alexandre Segura <mex.zktk@gmail.com>
parents: 448
diff changeset
    23
                font-family="Open Sans"
448
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
    24
                v-bind:font-size="strokeWidth * 4"
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
    25
                class="text">
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
    26
                Double-cliquez pour fermer la zone
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
    27
            </text>
539
08e2513dbc2f Upgrade webpack to 4, upgrade vue.js, and some style changes
ymh <ymh.work@gmail.com>
parents: 509
diff changeset
    28
        </g>
509
efa81cbd61e9 Fix bug on zoom with free shape.
Alexandre Segura <mex.zktk@gmail.com>
parents: 448
diff changeset
    29
    </g>
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    30
</template>
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
<script>
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    33
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    34
    import Snap from 'snapsvg'
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    35
    import tooltip from './mixins/tooltip'
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    36
    import save from './mixins/save'
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    37
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    38
    export default {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    39
        mixins: [ tooltip, save ],
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    40
        props: [
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    41
            'paper',
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    42
            'original-annotation',
420
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    43
            'original-path',
342
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 323
diff changeset
    44
            'readonly',
437
0aa597a588c1 Pass strokeWidth as prop.
Alexandre Segura <mex.zktk@gmail.com>
parents: 425
diff changeset
    45
            'stroke-width',
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    46
        ],
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    47
        data() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    48
            return {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    49
                path: '',
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    50
                closed: false,
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    51
                points: [],
448
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
    52
                text: { x: 0, y: 0 }
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    53
            }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    54
        },
420
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    55
        computed: {
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    56
            annotationHref: function() {
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    57
                if (this.originalAnnotation) {
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    58
                    return 'annotation-path-' + this.originalAnnotation.annotation_guid;
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    59
                } else {
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    60
                    return 'annotation-path-new';
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    61
                }
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    62
            },
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    63
            annotationSelector: function() {
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    64
                return '#' + this.annotationHref;
447
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
    65
            },
420
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
    66
        },
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    67
        mounted() {
447
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
    68
            var g = new Snap(this.$refs.g);
418
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
    69
            if (this.originalPath) {
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
    70
                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
    71
                g.click(() => this.$emit('click'));
447
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
    72
            } else {
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
    73
                g.dblclick(() => this.closePath());
418
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
    74
            }
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    75
        },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    76
        watch: {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    77
            closed: function(closed) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    78
                if (closed) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    79
                    this.path += ' Z';
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    80
                }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    81
            },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    82
            // Redraw the path when the points have changed
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    83
            points: function(points) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    84
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    85
                var path = "M";
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    86
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    87
                if (points.length <= 1) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    88
                    return;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    89
                }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    90
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    91
                path += points[0].x + ',' + points[0].y;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    92
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    93
                for (var i = 0; i < points.length; i++) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    94
                    if (i == 0) continue;
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
                    var pointInfos = points[i];
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    97
                    var lPath = "L" + pointInfos.x + "," + pointInfos.y;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
    98
                    path += " " + lPath;
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
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   101
                if (this.closed) { path += ' Z'; }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   102
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   103
                this.path = path;
448
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   104
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   105
                this.$nextTick(() => {
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   106
                    var group = new Snap(this.$refs.g);
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   107
                    var text = new Snap(this.$refs.text);
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   108
                    this.text = {
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   109
                        x: group.getBBox().x + (group.getBBox().width / 2) - (text.getBBox().width / 2),
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   110
                        y: group.getBBox().y + (group.getBBox().height / 2) - (text.getBBox().height / 2)
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   111
                    }
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   112
                });
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   113
            }
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
        methods: {
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
            addPoint: function(x, y) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   118
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   119
                this.points.push({ x: x, y: y });
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
                // Attach events to last point once DOM has been refreshed
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   122
                // @link https://vuejs.org/v2/guide/reactivity.html
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   123
                this.$nextTick(() => {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   124
                    var handler = this.$refs.handlers[this.$refs.handlers.length - 1];
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   125
                    this.addResizeHandler(handler);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   126
                });
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   127
            },
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
            clear: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   130
                this.destroyTooltip();
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   131
                Object.assign(this, {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   132
                    points: [],
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   133
                    closed: false,
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   134
                    path: ''
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   135
                });
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
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   138
            getTooltipTarget: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   139
                return this.$refs.path;
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
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   142
            fromSVGPath: function(pathString, tooltip) {
320
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 segments = Snap.parsePathString(pathString);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   145
                var points = [];
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   146
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   147
                // Don't use this.addPoint to avoid
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   148
                // race condition when registering events
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   149
                segments.map((segment) => {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   150
                    if (segment[0] !== 'Z') {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   151
                        points.push({ x: segment[1], y: segment[2] });
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   152
                    }
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
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   155
                this.points = points;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   156
                this.closed = true;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   157
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   158
                this.$nextTick(() => {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   159
                    this.addResizeHandlers();
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   160
                    if (tooltip) {
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   161
                        // FIXME Race condition with destroy
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   162
                        setTimeout(() => this.addTooltip(), 250);
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   163
                    }
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   164
                });
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   165
            },
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
            toSVGPath: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   168
                return this.$parent.normalizePath(this.path) + ';FREE'
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   169
            },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   170
447
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
   171
            closePath: function() {
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
   172
                this.closed = true;
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
   173
                this.$nextTick(() => {
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
   174
                    // FIXME Race condition with destroy
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
   175
                    setTimeout(() => this.addTooltip(), 250);
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
   176
                });
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
   177
            },
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
   178
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   179
            addResizeHandler: function(handler) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   180
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   181
                var self = this;
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
                var circle = new Snap(handler);
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
                var isDragged = false;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   186
323
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   187
                circle.click((e) => {
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   188
                    var key = parseInt(circle.attr('data-key'), 10);
55c024fc7c60 Roughly implement annotation navigator.
Alexandre Segura <mex.zktk@gmail.com>
parents: 320
diff changeset
   189
                    if (key === 0 && this.points.length > 2) {
447
3ad8513b751a Close path on double click.
Alexandre Segura <mex.zktk@gmail.com>
parents: 437
diff changeset
   190
                        this.closePath();
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   191
                    }
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
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   194
                // Remove point on double click
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   195
                circle.dblclick((e) => {
448
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   196
                    e.preventDefault();
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   197
                    e.stopPropagation();
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   198
                    var circle = new Snap(e.target);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   199
                    var key = parseInt(circle.attr('data-key'), 10);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   200
                    this.points.splice(key, 1);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   201
                });
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
                var dragEvents = {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   204
                    onMove: function(dx, dy, x, y, e) {
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
                        isDragged = true;
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
                        var offset = self.$parent.computeOffset(e);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   209
                        this.attr({ cx: offset.x, cy: offset.y });
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
                        var key = parseInt(this.attr('data-key'), 10);
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
                        // Must use splice for reactivity to work
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   214
                        // @see https://vuejs.org/v2/guide/list.html#Mutation-Methods
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   215
                        self.points.splice(key, 1, { x: offset.x, y: offset.y });
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   216
                    },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   217
                    onStart: () => this.hideTooltip(),
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   218
                    onEnd: function(e) {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   219
                        if (!isDragged) { return; }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   220
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   221
                        isDragged = false;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   222
                        self.showTooltip();
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   223
                    }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   224
                }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   225
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   226
                circle.drag(dragEvents.onMove, dragEvents.onStart, dragEvents.onEnd);
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   227
            },
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   228
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   229
            addResizeHandlers: function() {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   230
                this.$refs.handlers.forEach((handler) => this.addResizeHandler(handler));
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   231
            }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   232
        }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   233
    }
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   234
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   235
</script>
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   236
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   237
<style scoped>
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   238
.handler {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   239
    fill: #fff;
342
ebec1d59dc74 Disable resize & change drawing mode when readonly.
Alexandre Segura <mex.zktk@gmail.com>
parents: 323
diff changeset
   240
    stroke: #000;
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   241
}
408
159042869b47 Introduce shadow effect on shapes.
Alexandre Segura <mex.zktk@gmail.com>
parents: 342
diff changeset
   242
.path {
420
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   243
    stroke: inherit;
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   244
    stroke-width: inherit;
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   245
    fill: inherit;
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   246
    transform: inherit;
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   247
}
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   248
.stroke-fg {
408
159042869b47 Introduce shadow effect on shapes.
Alexandre Segura <mex.zktk@gmail.com>
parents: 342
diff changeset
   249
    stroke: #000;
418
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   250
    fill: transparent;
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   251
}
448
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   252
.overlay {
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   253
    fill: transparent;
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   254
}
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   255
.overlay.active,
1c07ea9abcd5 Display help text in SVG path.
Alexandre Segura <mex.zktk@gmail.com>
parents: 447
diff changeset
   256
.overlay:hover {
418
a04c55054afe Introduce display of all annotations at the same time.
Alexandre Segura <mex.zktk@gmail.com>
parents: 408
diff changeset
   257
    cursor: pointer;
425
7bc5febc9933 Change hover color.
Alexandre Segura <mex.zktk@gmail.com>
parents: 420
diff changeset
   258
    fill: #c5f2ff;
7bc5febc9933 Change hover color.
Alexandre Segura <mex.zktk@gmail.com>
parents: 420
diff changeset
   259
    opacity: 0.25;
420
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   260
    stroke-opacity: 1;
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   261
}
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   262
.stroke-bg {
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   263
    stroke: #fff;
0a4779c0e445 Use xlinks to display stroke.
Alexandre Segura <mex.zktk@gmail.com>
parents: 418
diff changeset
   264
    fill: transparent;
408
159042869b47 Introduce shadow effect on shapes.
Alexandre Segura <mex.zktk@gmail.com>
parents: 342
diff changeset
   265
}
320
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   266
.handler--first {
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   267
    fill: yellow;
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   268
}
81945eedc63f Introduce refactored components using Vue.js.
Alexandre Segura <mex.zktk@gmail.com>
parents:
diff changeset
   269
</style>