LegendView.js 5.9 KB
Newer Older
L
lang 已提交
1 2
define(function (require) {

3
    var zrUtil = require('zrender/core/util');
L
lang 已提交
4
    var numberUtil = require('../../util/number');
L
lang 已提交
5
    var symbolCreator = require('../../util/symbol');
L
lang 已提交
6 7
    var legendLayout = require('./legendLayout');
    var graphic = require('../../util/graphic');
L
lang 已提交
8

L
lang 已提交
9
    var LEGEND_DISABLE_COLOR = '#ccc';
L
lang 已提交
10

11 12 13 14 15 16 17 18
    function createSelectActionDispatcher(uid, seriesName, api) {
        api.dispatch({
            type: 'legendToggleSelect',
            from: uid,
            seriesName: seriesName
        });
    }

L
Update  
lang 已提交
19
    return require('../../echarts').extendComponentView({
L
lang 已提交
20 21 22

        type: 'legend',

L
lang 已提交
23
        init: function () {
L
lang 已提交
24
            this._symbolTypeStore = {};
L
lang 已提交
25 26
        },

L
Update  
lang 已提交
27
        render: function (legendModel, ecModel, api) {
L
lang 已提交
28
            var selectMode = legendModel.get('selectedMode');
L
lang 已提交
29 30
            var itemWidth = legendModel.get('itemWidth');
            var itemHeight = legendModel.get('itemHeight');
L
lang 已提交
31 32
            var itemAlign = legendModel.get('align');

L
lang 已提交
33
            var group = this.group;
L
lang 已提交
34 35 36
            var x = legendModel.get('x');
            var y = legendModel.get('y');
            var parsePercent = numberUtil.parsePercent;
L
lang 已提交
37
            group.position = [
L
lang 已提交
38 39
                parsePercent(x, api.getWidth()),
                parsePercent(y, api.getHeight())
L
lang 已提交
40
            ];
L
lang 已提交
41
            group.removeAll();
L
lang 已提交
42

L
lang 已提交
43 44 45
            if (itemAlign === 'auto') {
                itemAlign = group.position[0] / api.getWidth() < 0.7 ? 'left' : 'right';
            }
L
lang 已提交
46

L
lang 已提交
47
            var legendDataMap = {};
L
lang 已提交
48 49
            zrUtil.each(legendModel.getData(), function (itemModel) {
                var seriesName = itemModel.get('name');
P
pah100 已提交
50
                var seriesModel = ecModel.getSeriesByName(seriesName, true);
L
lang 已提交
51 52 53

                legendDataMap[seriesName] = true;

L
lang 已提交
54 55 56 57 58
                if (!seriesModel) {
                    // Series not exists
                    return;
                }

L
lang 已提交
59
                var data = seriesModel.getData();
L
lang 已提交
60
                var color = data.getVisual('color');
L
lang 已提交
61

L
lang 已提交
62 63
                if (!legendModel.isSelected(seriesName)) {
                    color = LEGEND_DISABLE_COLOR;
L
lang 已提交
64
                }
L
lang 已提交
65

L
lang 已提交
66 67 68 69 70 71 72 73
                // Using rect symbol defaultly
                var legendSymbolType = data.getVisual('legendSymbol') || 'roundRect';
                var symbolType = data.getVisual('symbol');

                this._createItem(
                    seriesName, legendSymbolType, symbolType,
                    itemWidth, itemHeight, itemAlign, color,
                    selectMode, api
L
lang 已提交
74
                );
L
lang 已提交
75
            }, this);
L
lang 已提交
76

L
lang 已提交
77 78 79 80 81
            ecModel.eachSeries(function (seriesModel) {
                if (seriesModel.legendDataProvider) {
                    var data = seriesModel.legendDataProvider();
                    data.each(function (idx) {
                        var name = data.getName(idx);
L
lang 已提交
82

L
lang 已提交
83 84 85
                        if (!legendDataMap[name]) {
                            return;
                        }
L
lang 已提交
86

L
lang 已提交
87
                        var color = data.getItemVisual(idx, 'color');
L
lang 已提交
88

L
lang 已提交
89 90 91
                        if (!legendModel.isSelected(name)) {
                            color = LEGEND_DISABLE_COLOR;
                        }
L
lang 已提交
92

L
lang 已提交
93 94 95 96 97 98 99 100 101
                        var legendSymbolType = 'roundRect';

                        this._createItem(
                            name, legendSymbolType, null,
                            itemWidth, itemHeight, itemAlign, color,
                            selectMode, api
                        );
                    }, false, this);
                }
L
lang 已提交
102
            }, this);
L
lang 已提交
103

L
lang 已提交
104 105 106 107 108
            legendLayout(group, legendModel);

            this._adjustGroupPosition(group, x, y);
        },

L
lang 已提交
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
        _createItem: function (
            name,
            legendSymbolType, symbolType,
            itemWidth, itemHeight, itemAlign, color,
            selectMode, api
        ) {
            var itemGroup = new graphic.Group();

            legendSymbolType = legendSymbolType;
            itemGroup.add(symbolCreator.createSymbol(
                legendSymbolType, 0, 0, itemWidth, itemHeight, color
            ));

            // Compose symbols
            if (symbolType && symbolType !== legendSymbolType && symbolType != 'none') {
                var size = itemHeight * 0.8;
                // Put symbol in the center
                itemGroup.add(symbolCreator.createSymbol(
                    symbolType, (itemWidth - size) / 2, (itemHeight - size) / 2, size, size, color
                ));
            }

            // Text
            var textX = itemAlign === 'left' ? itemWidth + 5 : -5;
            var textAlign = itemAlign;

            var text = new graphic.Text({
                style: {
                    text: name,
                    x: textX,
                    y: itemHeight / 2,
                    fill: '#000',
                    textAlign: textAlign,
                    textBaseline: 'middle'
                }
            });
            itemGroup.add(text);

            itemGroup.eachChild(function (child) {
                child.silent = !selectMode;
            });

            this.group.add(itemGroup);

            itemGroup.on('click', zrUtil.curry(createSelectActionDispatcher, this.uid, name, api), this);
        },

L
lang 已提交
156 157
        _adjustGroupPosition: function (group, x, y) {

L
lang 已提交
158
            var groupRect = group.getBoundingRect();
L
lang 已提交
159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
            var position = group.position;
            var padding = group.padding;

            switch (x) {
                case 'center':
                    position[0] -= groupRect.width / 2;
                    break;
                case 'right':
                    position[0] -= groupRect.width + groupRect.x + padding[1];
                    break;
            }
            switch (y) {
                case 'center':
                    position[1] -= groupRect.height / 2;
                    break;
                case 'bottom':
                    position[0] -= groupRect.height + groupRect.y + padding[2];
                    break;
            }
L
lang 已提交
178 179 180
        }
    });
});