You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							235 lines
						
					
					
						
							7.1 KiB
						
					
					
				
			
		
		
	
	
							235 lines
						
					
					
						
							7.1 KiB
						
					
					
				
 | 
						|
/* | 
						|
* Licensed to the Apache Software Foundation (ASF) under one | 
						|
* or more contributor license agreements.  See the NOTICE file | 
						|
* distributed with this work for additional information | 
						|
* regarding copyright ownership.  The ASF licenses this file | 
						|
* to you under the Apache License, Version 2.0 (the | 
						|
* "License"); you may not use this file except in compliance | 
						|
* with the License.  You may obtain a copy of the License at | 
						|
* | 
						|
*   http://www.apache.org/licenses/LICENSE-2.0 | 
						|
* | 
						|
* Unless required by applicable law or agreed to in writing, | 
						|
* software distributed under the License is distributed on an | 
						|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
						|
* KIND, either express or implied.  See the License for the | 
						|
* specific language governing permissions and limitations | 
						|
* under the License. | 
						|
*/ | 
						|
 | 
						|
var echarts = require("../echarts"); | 
						|
 | 
						|
var graphic = require("../util/graphic"); | 
						|
 | 
						|
var _layout = require("../util/layout"); | 
						|
 | 
						|
var getLayoutRect = _layout.getLayoutRect; | 
						|
 | 
						|
/* | 
						|
* Licensed to the Apache Software Foundation (ASF) under one | 
						|
* or more contributor license agreements.  See the NOTICE file | 
						|
* distributed with this work for additional information | 
						|
* regarding copyright ownership.  The ASF licenses this file | 
						|
* to you under the Apache License, Version 2.0 (the | 
						|
* "License"); you may not use this file except in compliance | 
						|
* with the License.  You may obtain a copy of the License at | 
						|
* | 
						|
*   http://www.apache.org/licenses/LICENSE-2.0 | 
						|
* | 
						|
* Unless required by applicable law or agreed to in writing, | 
						|
* software distributed under the License is distributed on an | 
						|
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
						|
* KIND, either express or implied.  See the License for the | 
						|
* specific language governing permissions and limitations | 
						|
* under the License. | 
						|
*/ | 
						|
// Model | 
						|
echarts.extendComponentModel({ | 
						|
  type: 'title', | 
						|
  layoutMode: { | 
						|
    type: 'box', | 
						|
    ignoreSize: true | 
						|
  }, | 
						|
  defaultOption: { | 
						|
    // 一级层叠 | 
						|
    zlevel: 0, | 
						|
    // 二级层叠 | 
						|
    z: 6, | 
						|
    show: true, | 
						|
    text: '', | 
						|
    // 超链接跳转 | 
						|
    // link: null, | 
						|
    // 仅支持self | blank | 
						|
    target: 'blank', | 
						|
    subtext: '', | 
						|
    // 超链接跳转 | 
						|
    // sublink: null, | 
						|
    // 仅支持self | blank | 
						|
    subtarget: 'blank', | 
						|
    // 'center' ¦ 'left' ¦ 'right' | 
						|
    // ¦ {number}(x坐标,单位px) | 
						|
    left: 0, | 
						|
    // 'top' ¦ 'bottom' ¦ 'center' | 
						|
    // ¦ {number}(y坐标,单位px) | 
						|
    top: 0, | 
						|
    // 水平对齐 | 
						|
    // 'auto' | 'left' | 'right' | 'center' | 
						|
    // 默认根据 left 的位置判断是左对齐还是右对齐 | 
						|
    // textAlign: null | 
						|
    // | 
						|
    // 垂直对齐 | 
						|
    // 'auto' | 'top' | 'bottom' | 'middle' | 
						|
    // 默认根据 top 位置判断是上对齐还是下对齐 | 
						|
    // textBaseline: null | 
						|
    backgroundColor: 'rgba(0,0,0,0)', | 
						|
    // 标题边框颜色 | 
						|
    borderColor: '#ccc', | 
						|
    // 标题边框线宽,单位px,默认为0(无边框) | 
						|
    borderWidth: 0, | 
						|
    // 标题内边距,单位px,默认各方向内边距为5, | 
						|
    // 接受数组分别设定上右下左边距,同css | 
						|
    padding: 5, | 
						|
    // 主副标题纵向间隔,单位px,默认为10, | 
						|
    itemGap: 10, | 
						|
    textStyle: { | 
						|
      fontSize: 18, | 
						|
      fontWeight: 'bolder', | 
						|
      color: '#333' | 
						|
    }, | 
						|
    subtextStyle: { | 
						|
      color: '#aaa' | 
						|
    } | 
						|
  } | 
						|
}); // View | 
						|
 | 
						|
echarts.extendComponentView({ | 
						|
  type: 'title', | 
						|
  render: function (titleModel, ecModel, api) { | 
						|
    this.group.removeAll(); | 
						|
 | 
						|
    if (!titleModel.get('show')) { | 
						|
      return; | 
						|
    } | 
						|
 | 
						|
    var group = this.group; | 
						|
    var textStyleModel = titleModel.getModel('textStyle'); | 
						|
    var subtextStyleModel = titleModel.getModel('subtextStyle'); | 
						|
    var textAlign = titleModel.get('textAlign'); | 
						|
    var textBaseline = titleModel.get('textBaseline'); | 
						|
    var textEl = new graphic.Text({ | 
						|
      style: graphic.setTextStyle({}, textStyleModel, { | 
						|
        text: titleModel.get('text'), | 
						|
        textFill: textStyleModel.getTextColor() | 
						|
      }, { | 
						|
        disableBox: true | 
						|
      }), | 
						|
      z2: 10 | 
						|
    }); | 
						|
    var textRect = textEl.getBoundingRect(); | 
						|
    var subText = titleModel.get('subtext'); | 
						|
    var subTextEl = new graphic.Text({ | 
						|
      style: graphic.setTextStyle({}, subtextStyleModel, { | 
						|
        text: subText, | 
						|
        textFill: subtextStyleModel.getTextColor(), | 
						|
        y: textRect.height + titleModel.get('itemGap'), | 
						|
        textVerticalAlign: 'top' | 
						|
      }, { | 
						|
        disableBox: true | 
						|
      }), | 
						|
      z2: 10 | 
						|
    }); | 
						|
    var link = titleModel.get('link'); | 
						|
    var sublink = titleModel.get('sublink'); | 
						|
    var triggerEvent = titleModel.get('triggerEvent', true); | 
						|
    textEl.silent = !link && !triggerEvent; | 
						|
    subTextEl.silent = !sublink && !triggerEvent; | 
						|
 | 
						|
    if (link) { | 
						|
      textEl.on('click', function () { | 
						|
        window.open(link, '_' + titleModel.get('target')); | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    if (sublink) { | 
						|
      subTextEl.on('click', function () { | 
						|
        window.open(sublink, '_' + titleModel.get('subtarget')); | 
						|
      }); | 
						|
    } | 
						|
 | 
						|
    textEl.eventData = subTextEl.eventData = triggerEvent ? { | 
						|
      componentType: 'title', | 
						|
      componentIndex: titleModel.componentIndex | 
						|
    } : null; | 
						|
    group.add(textEl); | 
						|
    subText && group.add(subTextEl); // If no subText, but add subTextEl, there will be an empty line. | 
						|
 | 
						|
    var groupRect = group.getBoundingRect(); | 
						|
    var layoutOption = titleModel.getBoxLayoutParams(); | 
						|
    layoutOption.width = groupRect.width; | 
						|
    layoutOption.height = groupRect.height; | 
						|
    var layoutRect = getLayoutRect(layoutOption, { | 
						|
      width: api.getWidth(), | 
						|
      height: api.getHeight() | 
						|
    }, titleModel.get('padding')); // Adjust text align based on position | 
						|
 | 
						|
    if (!textAlign) { | 
						|
      // Align left if title is on the left. center and right is same | 
						|
      textAlign = titleModel.get('left') || titleModel.get('right'); | 
						|
 | 
						|
      if (textAlign === 'middle') { | 
						|
        textAlign = 'center'; | 
						|
      } // Adjust layout by text align | 
						|
 | 
						|
 | 
						|
      if (textAlign === 'right') { | 
						|
        layoutRect.x += layoutRect.width; | 
						|
      } else if (textAlign === 'center') { | 
						|
        layoutRect.x += layoutRect.width / 2; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    if (!textBaseline) { | 
						|
      textBaseline = titleModel.get('top') || titleModel.get('bottom'); | 
						|
 | 
						|
      if (textBaseline === 'center') { | 
						|
        textBaseline = 'middle'; | 
						|
      } | 
						|
 | 
						|
      if (textBaseline === 'bottom') { | 
						|
        layoutRect.y += layoutRect.height; | 
						|
      } else if (textBaseline === 'middle') { | 
						|
        layoutRect.y += layoutRect.height / 2; | 
						|
      } | 
						|
 | 
						|
      textBaseline = textBaseline || 'top'; | 
						|
    } | 
						|
 | 
						|
    group.attr('position', [layoutRect.x, layoutRect.y]); | 
						|
    var alignStyle = { | 
						|
      textAlign: textAlign, | 
						|
      textVerticalAlign: textBaseline | 
						|
    }; | 
						|
    textEl.setStyle(alignStyle); | 
						|
    subTextEl.setStyle(alignStyle); // Render background | 
						|
    // Get groupRect again because textAlign has been changed | 
						|
 | 
						|
    groupRect = group.getBoundingRect(); | 
						|
    var padding = layoutRect.margin; | 
						|
    var style = titleModel.getItemStyle(['color', 'opacity']); | 
						|
    style.fill = titleModel.get('backgroundColor'); | 
						|
    var rect = new graphic.Rect({ | 
						|
      shape: { | 
						|
        x: groupRect.x - padding[3], | 
						|
        y: groupRect.y - padding[0], | 
						|
        width: groupRect.width + padding[1] + padding[3], | 
						|
        height: groupRect.height + padding[0] + padding[2], | 
						|
        r: titleModel.get('borderRadius') | 
						|
      }, | 
						|
      style: style, | 
						|
      silent: true | 
						|
    }); | 
						|
    graphic.subPixelOptimizeRect(rect); | 
						|
    group.add(rect); | 
						|
  } | 
						|
}); |