GraphView.js 7.2 KB
Newer Older
L
lang 已提交
1

L
lang 已提交
2 3
define(function (require) {

L
lang 已提交
4 5
    var SymbolDraw = require('../helper/SymbolDraw');
    var LineDraw = require('../helper/LineDraw');
L
lang 已提交
6
    var RoamController = require('../../component/helper/RoamController');
L
lang 已提交
7

L
lang 已提交
8
    var modelUtil = require('../../util/model');
L
lang 已提交
9
    var graphic = require('../../util/graphic');
L
lang 已提交
10

L
lang 已提交
11 12 13 14
    require('../../echarts').extendChartView({

        type: 'graph',

L
lang 已提交
15
        init: function (ecModel, api) {
L
lang 已提交
16
            var symbolDraw = new SymbolDraw();
L
lang 已提交
17
            var lineDraw = new LineDraw();
L
lang 已提交
18
            var group = this.group;
L
lang 已提交
19

L
lang 已提交
20 21
            var controller = new RoamController(api.getZr(), group);

L
lang 已提交
22 23
            group.add(symbolDraw.group);
            group.add(lineDraw.group);
L
lang 已提交
24

L
lang 已提交
25
            this._symbolDraw = symbolDraw;
L
lang 已提交
26
            this._lineDraw = lineDraw;
L
lang 已提交
27
            this._controller = controller;
L
lang 已提交
28 29

            this._firstRender = true;
L
lang 已提交
30 31 32
        },

        render: function (seriesModel, ecModel, api) {
L
lang 已提交
33 34 35 36 37 38
            var coordSys = seriesModel.coordinateSystem;
            // Only support view and geo coordinate system
            if (coordSys.type !== 'geo' && coordSys.type !== 'view') {
                return;
            }

L
lang 已提交
39
            var data = seriesModel.getData();
L
lang 已提交
40
            this._model = seriesModel;
L
lang 已提交
41

L
lang 已提交
42 43 44
            var symbolDraw = this._symbolDraw;
            var lineDraw = this._lineDraw;

45
            symbolDraw.updateData(data);
L
lang 已提交
46

L
lang 已提交
47 48
            var edgeData = data.graph.edgeData;
            var rawOption = seriesModel.option;
49
            var formatModel = modelUtil.createDataFormatModel(seriesModel, edgeData);
L
lang 已提交
50 51
            formatModel.formatTooltip = function (dataIndex) {
                var params = this.getDataParams(dataIndex);
L
lang 已提交
52 53 54 55
                var edge = data.graph.getEdgeByIndex(dataIndex);
                var sourceName = data.getName(edge.node1.dataIndex);
                var targetName = data.getName(edge.node2.dataIndex);
                var html = sourceName + ' > ' + targetName;
L
lang 已提交
56
                if (params.value) {
L
lang 已提交
57
                    html += ' : ' + params.value;
L
lang 已提交
58 59 60
                }
                return html;
            };
L
lang 已提交
61

L
lang 已提交
62 63 64
            lineDraw.updateData(edgeData, null, null);
            edgeData.eachItemGraphicEl(function (el) {
                el.traverse(function (child) {
L
lang 已提交
65
                    child.dataModel = formatModel;
L
lang 已提交
66 67 68
                });
            });

L
lang 已提交
69
            // Save the original lineWidth
L
lang 已提交
70 71 72
            // data.graph.eachEdge(function (edge) {
            //     edge.__lineWidth = edge.getModel('lineStyle.normal').get('width');
            // });
L
lang 已提交
73 74

            var group = this.group;
L
lang 已提交
75
            var groupNewProp = {
L
lang 已提交
76 77
                position: coordSys.position,
                scale: coordSys.scale
L
lang 已提交
78 79 80 81 82 83 84
            };
            if (this._firstRender) {
                group.attr(groupNewProp);
            }
            else {
                graphic.updateProps(group, groupNewProp, seriesModel);
            }
L
lang 已提交
85 86

            this._nodeScaleRatio = seriesModel.get('nodeScaleRatio');
L
lang 已提交
87
            // this._edgeScaleRatio = seriesModel.get('edgeScaleRatio');
L
lang 已提交
88 89 90

            this._updateNodeAndLinkScale();

L
lang 已提交
91
            this._updateController(seriesModel, coordSys, api);
L
lang 已提交
92

L
lang 已提交
93
            clearTimeout(this._layoutTimeout);
L
lang 已提交
94
            var forceLayout = seriesModel.forceLayout;
L
lang 已提交
95
            var layoutAnimation = seriesModel.get('force.layoutAnimation');
L
lang 已提交
96
            if (forceLayout) {
L
lang 已提交
97
                this._startForceLayoutIteration(forceLayout, layoutAnimation);
L
lang 已提交
98
            }
L
lang 已提交
99 100 101 102 103 104
            // Update draggable
            data.eachItemGraphicEl(function (el, idx) {
                var draggable = data.getItemModel(idx).get('draggable');
                if (draggable && forceLayout) {
                    el.on('drag', function () {
                        forceLayout.warmUp();
L
lang 已提交
105 106
                        !this._layouting
                            && this._startForceLayoutIteration(forceLayout, layoutAnimation);
L
lang 已提交
107 108 109
                        forceLayout.setFixed(idx);
                        // Write position back to layout
                        data.setItemLayout(idx, el.position);
L
lang 已提交
110
                    }, this).on('dragend', function () {
L
lang 已提交
111
                        forceLayout.setUnfixed(idx);
L
lang 已提交
112
                    }, this);
L
lang 已提交
113 114 115 116 117 118
                }
                else {
                    el.off('drag');
                }
                el.setDraggable(draggable);
            }, this);
L
lang 已提交
119 120

            this._firstRender = false;
L
lang 已提交
121 122
        },

L
lang 已提交
123
        _startForceLayoutIteration: function (forceLayout, layoutAnimation) {
L
lang 已提交
124 125 126 127
            var self = this;
            (function step() {
                forceLayout.step(function (stopped) {
                    self.updateLayout();
L
lang 已提交
128
                    (self._layouting = !stopped) && (
L
lang 已提交
129 130 131 132
                        layoutAnimation
                            ? (self._layoutTimeout = setTimeout(step, 16))
                            : step()
                    );
L
lang 已提交
133 134
                });
            })();
L
lang 已提交
135 136 137
        },

        _updateController: function (seriesModel, coordSys, api) {
L
lang 已提交
138 139 140
            var controller = this._controller;
            controller.rect = coordSys.getViewRect();

L
lang 已提交
141
            controller.enable(seriesModel.get('roam'));
L
lang 已提交
142 143 144 145 146

            controller
                .off('pan')
                .off('zoom')
                .on('pan', function (dx, dy) {
L
lang 已提交
147
                    api.dispatchAction({
P
pah100 已提交
148
                        seriesId: seriesModel.id,
L
lang 已提交
149 150 151 152 153 154
                        type: 'graphRoam',
                        dx: dx,
                        dy: dy
                    });
                })
                .on('zoom', function (zoom, mouseX, mouseY) {
L
lang 已提交
155
                    api.dispatchAction({
P
pah100 已提交
156
                        seriesId: seriesModel.id,
L
lang 已提交
157 158 159 160 161 162 163
                        type: 'graphRoam',
                        zoom:  zoom,
                        originX: mouseX,
                        originY: mouseY
                    });
                })
                .on('zoom', this._updateNodeAndLinkScale, this);
L
lang 已提交
164 165 166 167 168 169 170 171
        },

        _updateNodeAndLinkScale: function () {
            var seriesModel = this._model;
            var data = seriesModel.getData();

            var group = this.group;
            var nodeScaleRatio = this._nodeScaleRatio;
L
lang 已提交
172
            // var edgeScaleRatio = this._edgeScaleRatio;
L
lang 已提交
173 174 175 176 177

            // Assume scale aspect is 1
            var groupScale = group.scale[0];

            var nodeScale = (groupScale - 1) * nodeScaleRatio + 1;
L
lang 已提交
178
            // var edgeScale = (groupScale - 1) * edgeScaleRatio + 1;
L
lang 已提交
179 180 181 182 183
            var invScale = [
                nodeScale / groupScale,
                nodeScale / groupScale
            ];

L
lang 已提交
184
            data.eachItemGraphicEl(function (el, idx) {
L
lang 已提交
185 186
                el.attr('scale', invScale);
            });
L
lang 已提交
187 188 189 190 191 192 193 194
            // data.graph.eachEdge(function (edge) {
            //     var lineGroup = edge.getGraphicEl();
            //     // FIXME
            //     lineGroup.childOfName('line').setStyle(
            //         'lineWidth',
            //         edge.__lineWidth * edgeScale / groupScale
            //     );
            // });
L
lang 已提交
195 196
        },

L
lang 已提交
197 198 199 200
        updateLayout: function (seriesModel, ecModel) {
            this._symbolDraw.updateLayout();
            this._lineDraw.updateLayout();
        },
L
lang 已提交
201

L
lang 已提交
202
        remove: function (ecModel, api) {
L
lang 已提交
203 204
            this._symbolDraw && this._symbolDraw.remove();
            this._lineDraw && this._lineDraw.remove();
L
lang 已提交
205 206 207
        }
    });
});