| 
/* 
 | 
* 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. 
 | 
*/ 
 | 
  
 | 
  
 | 
/** 
 | 
 * AUTO-GENERATED FILE. DO NOT MODIFY. 
 | 
 */ 
 | 
  
 | 
/* 
 | 
* 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. 
 | 
*/ 
 | 
import { __extends } from "tslib"; 
 | 
import * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
import * as textContain from 'zrender/lib/contain/text.js'; 
 | 
import * as graphic from '../../util/graphic.js'; 
 | 
import { enterEmphasis, leaveEmphasis } from '../../util/states.js'; 
 | 
import Model from '../../model/Model.js'; 
 | 
import DataDiffer from '../../data/DataDiffer.js'; 
 | 
import * as listComponentHelper from '../helper/listComponent.js'; 
 | 
import ComponentView from '../../view/Component.js'; 
 | 
import { ToolboxFeature, getFeature } from './featureManager.js'; 
 | 
import { getUID } from '../../util/component.js'; 
 | 
import ZRText from 'zrender/lib/graphic/Text.js'; 
 | 
import { getFont } from '../../label/labelStyle.js'; 
 | 
var ToolboxView = /** @class */function (_super) { 
 | 
  __extends(ToolboxView, _super); 
 | 
  function ToolboxView() { 
 | 
    return _super !== null && _super.apply(this, arguments) || this; 
 | 
  } 
 | 
  ToolboxView.prototype.render = function (toolboxModel, ecModel, api, payload) { 
 | 
    var group = this.group; 
 | 
    group.removeAll(); 
 | 
    if (!toolboxModel.get('show')) { 
 | 
      return; 
 | 
    } 
 | 
    var itemSize = +toolboxModel.get('itemSize'); 
 | 
    var isVertical = toolboxModel.get('orient') === 'vertical'; 
 | 
    var featureOpts = toolboxModel.get('feature') || {}; 
 | 
    var features = this._features || (this._features = {}); 
 | 
    var featureNames = []; 
 | 
    zrUtil.each(featureOpts, function (opt, name) { 
 | 
      featureNames.push(name); 
 | 
    }); 
 | 
    new DataDiffer(this._featureNames || [], featureNames).add(processFeature).update(processFeature).remove(zrUtil.curry(processFeature, null)).execute(); 
 | 
    // Keep for diff. 
 | 
    this._featureNames = featureNames; 
 | 
    function processFeature(newIndex, oldIndex) { 
 | 
      var featureName = featureNames[newIndex]; 
 | 
      var oldName = featureNames[oldIndex]; 
 | 
      var featureOpt = featureOpts[featureName]; 
 | 
      var featureModel = new Model(featureOpt, toolboxModel, toolboxModel.ecModel); 
 | 
      var feature; 
 | 
      // FIX#11236, merge feature title from MagicType newOption. TODO: consider seriesIndex ? 
 | 
      if (payload && payload.newTitle != null && payload.featureName === featureName) { 
 | 
        featureOpt.title = payload.newTitle; 
 | 
      } 
 | 
      if (featureName && !oldName) { 
 | 
        // Create 
 | 
        if (isUserFeatureName(featureName)) { 
 | 
          feature = { 
 | 
            onclick: featureModel.option.onclick, 
 | 
            featureName: featureName 
 | 
          }; 
 | 
        } else { 
 | 
          var Feature = getFeature(featureName); 
 | 
          if (!Feature) { 
 | 
            return; 
 | 
          } 
 | 
          feature = new Feature(); 
 | 
        } 
 | 
        features[featureName] = feature; 
 | 
      } else { 
 | 
        feature = features[oldName]; 
 | 
        // If feature does not exist. 
 | 
        if (!feature) { 
 | 
          return; 
 | 
        } 
 | 
      } 
 | 
      feature.uid = getUID('toolbox-feature'); 
 | 
      feature.model = featureModel; 
 | 
      feature.ecModel = ecModel; 
 | 
      feature.api = api; 
 | 
      var isToolboxFeature = feature instanceof ToolboxFeature; 
 | 
      if (!featureName && oldName) { 
 | 
        isToolboxFeature && feature.dispose && feature.dispose(ecModel, api); 
 | 
        return; 
 | 
      } 
 | 
      if (!featureModel.get('show') || isToolboxFeature && feature.unusable) { 
 | 
        isToolboxFeature && feature.remove && feature.remove(ecModel, api); 
 | 
        return; 
 | 
      } 
 | 
      createIconPaths(featureModel, feature, featureName); 
 | 
      featureModel.setIconStatus = function (iconName, status) { 
 | 
        var option = this.option; 
 | 
        var iconPaths = this.iconPaths; 
 | 
        option.iconStatus = option.iconStatus || {}; 
 | 
        option.iconStatus[iconName] = status; 
 | 
        if (iconPaths[iconName]) { 
 | 
          (status === 'emphasis' ? enterEmphasis : leaveEmphasis)(iconPaths[iconName]); 
 | 
        } 
 | 
      }; 
 | 
      if (feature instanceof ToolboxFeature) { 
 | 
        if (feature.render) { 
 | 
          feature.render(featureModel, ecModel, api, payload); 
 | 
        } 
 | 
      } 
 | 
    } 
 | 
    function createIconPaths(featureModel, feature, featureName) { 
 | 
      var iconStyleModel = featureModel.getModel('iconStyle'); 
 | 
      var iconStyleEmphasisModel = featureModel.getModel(['emphasis', 'iconStyle']); 
 | 
      // If one feature has multiple icons, they are organized as 
 | 
      // { 
 | 
      //     icon: { 
 | 
      //         foo: '', 
 | 
      //         bar: '' 
 | 
      //     }, 
 | 
      //     title: { 
 | 
      //         foo: '', 
 | 
      //         bar: '' 
 | 
      //     } 
 | 
      // } 
 | 
      var icons = feature instanceof ToolboxFeature && feature.getIcons ? feature.getIcons() : featureModel.get('icon'); 
 | 
      var titles = featureModel.get('title') || {}; 
 | 
      var iconsMap; 
 | 
      var titlesMap; 
 | 
      if (zrUtil.isString(icons)) { 
 | 
        iconsMap = {}; 
 | 
        iconsMap[featureName] = icons; 
 | 
      } else { 
 | 
        iconsMap = icons; 
 | 
      } 
 | 
      if (zrUtil.isString(titles)) { 
 | 
        titlesMap = {}; 
 | 
        titlesMap[featureName] = titles; 
 | 
      } else { 
 | 
        titlesMap = titles; 
 | 
      } 
 | 
      var iconPaths = featureModel.iconPaths = {}; 
 | 
      zrUtil.each(iconsMap, function (iconStr, iconName) { 
 | 
        var path = graphic.createIcon(iconStr, {}, { 
 | 
          x: -itemSize / 2, 
 | 
          y: -itemSize / 2, 
 | 
          width: itemSize, 
 | 
          height: itemSize 
 | 
        }); // TODO handling image 
 | 
        path.setStyle(iconStyleModel.getItemStyle()); 
 | 
        var pathEmphasisState = path.ensureState('emphasis'); 
 | 
        pathEmphasisState.style = iconStyleEmphasisModel.getItemStyle(); 
 | 
        // Text position calculation 
 | 
        // TODO: extract `textStyle` from `iconStyle` and use `createTextStyle` 
 | 
        var textContent = new ZRText({ 
 | 
          style: { 
 | 
            text: titlesMap[iconName], 
 | 
            align: iconStyleEmphasisModel.get('textAlign'), 
 | 
            borderRadius: iconStyleEmphasisModel.get('textBorderRadius'), 
 | 
            padding: iconStyleEmphasisModel.get('textPadding'), 
 | 
            fill: null, 
 | 
            font: getFont({ 
 | 
              fontStyle: iconStyleEmphasisModel.get('textFontStyle'), 
 | 
              fontFamily: iconStyleEmphasisModel.get('textFontFamily'), 
 | 
              fontSize: iconStyleEmphasisModel.get('textFontSize'), 
 | 
              fontWeight: iconStyleEmphasisModel.get('textFontWeight') 
 | 
            }, ecModel) 
 | 
          }, 
 | 
          ignore: true 
 | 
        }); 
 | 
        path.setTextContent(textContent); 
 | 
        graphic.setTooltipConfig({ 
 | 
          el: path, 
 | 
          componentModel: toolboxModel, 
 | 
          itemName: iconName, 
 | 
          formatterParamsExtra: { 
 | 
            title: titlesMap[iconName] 
 | 
          } 
 | 
        }); 
 | 
        path.__title = titlesMap[iconName]; 
 | 
        path.on('mouseover', function () { 
 | 
          // Should not reuse above hoverStyle, which might be modified. 
 | 
          var hoverStyle = iconStyleEmphasisModel.getItemStyle(); 
 | 
          var defaultTextPosition = isVertical ? toolboxModel.get('right') == null && toolboxModel.get('left') !== 'right' ? 'right' : 'left' : toolboxModel.get('bottom') == null && toolboxModel.get('top') !== 'bottom' ? 'bottom' : 'top'; 
 | 
          textContent.setStyle({ 
 | 
            fill: iconStyleEmphasisModel.get('textFill') || hoverStyle.fill || hoverStyle.stroke || '#000', 
 | 
            backgroundColor: iconStyleEmphasisModel.get('textBackgroundColor') 
 | 
          }); 
 | 
          path.setTextConfig({ 
 | 
            position: iconStyleEmphasisModel.get('textPosition') || defaultTextPosition 
 | 
          }); 
 | 
          textContent.ignore = !toolboxModel.get('showTitle'); 
 | 
          // Use enterEmphasis and leaveEmphasis provide by ec. 
 | 
          // There are flags managed by the echarts. 
 | 
          api.enterEmphasis(this); 
 | 
        }).on('mouseout', function () { 
 | 
          if (featureModel.get(['iconStatus', iconName]) !== 'emphasis') { 
 | 
            api.leaveEmphasis(this); 
 | 
          } 
 | 
          textContent.hide(); 
 | 
        }); 
 | 
        (featureModel.get(['iconStatus', iconName]) === 'emphasis' ? enterEmphasis : leaveEmphasis)(path); 
 | 
        group.add(path); 
 | 
        path.on('click', zrUtil.bind(feature.onclick, feature, ecModel, api, iconName)); 
 | 
        iconPaths[iconName] = path; 
 | 
      }); 
 | 
    } 
 | 
    listComponentHelper.layout(group, toolboxModel, api); 
 | 
    // Render background after group is layout 
 | 
    // FIXME 
 | 
    group.add(listComponentHelper.makeBackground(group.getBoundingRect(), toolboxModel)); 
 | 
    // Adjust icon title positions to avoid them out of screen 
 | 
    isVertical || group.eachChild(function (icon) { 
 | 
      var titleText = icon.__title; 
 | 
      // const hoverStyle = icon.hoverStyle; 
 | 
      // TODO simplify code? 
 | 
      var emphasisState = icon.ensureState('emphasis'); 
 | 
      var emphasisTextConfig = emphasisState.textConfig || (emphasisState.textConfig = {}); 
 | 
      var textContent = icon.getTextContent(); 
 | 
      var emphasisTextState = textContent && textContent.ensureState('emphasis'); 
 | 
      // May be background element 
 | 
      if (emphasisTextState && !zrUtil.isFunction(emphasisTextState) && titleText) { 
 | 
        var emphasisTextStyle = emphasisTextState.style || (emphasisTextState.style = {}); 
 | 
        var rect = textContain.getBoundingRect(titleText, ZRText.makeFont(emphasisTextStyle)); 
 | 
        var offsetX = icon.x + group.x; 
 | 
        var offsetY = icon.y + group.y + itemSize; 
 | 
        var needPutOnTop = false; 
 | 
        if (offsetY + rect.height > api.getHeight()) { 
 | 
          emphasisTextConfig.position = 'top'; 
 | 
          needPutOnTop = true; 
 | 
        } 
 | 
        var topOffset = needPutOnTop ? -5 - rect.height : itemSize + 10; 
 | 
        if (offsetX + rect.width / 2 > api.getWidth()) { 
 | 
          emphasisTextConfig.position = ['100%', topOffset]; 
 | 
          emphasisTextStyle.align = 'right'; 
 | 
        } else if (offsetX - rect.width / 2 < 0) { 
 | 
          emphasisTextConfig.position = [0, topOffset]; 
 | 
          emphasisTextStyle.align = 'left'; 
 | 
        } 
 | 
      } 
 | 
    }); 
 | 
  }; 
 | 
  ToolboxView.prototype.updateView = function (toolboxModel, ecModel, api, payload) { 
 | 
    zrUtil.each(this._features, function (feature) { 
 | 
      feature instanceof ToolboxFeature && feature.updateView && feature.updateView(feature.model, ecModel, api, payload); 
 | 
    }); 
 | 
  }; 
 | 
  // updateLayout(toolboxModel, ecModel, api, payload) { 
 | 
  //     zrUtil.each(this._features, function (feature) { 
 | 
  //         feature.updateLayout && feature.updateLayout(feature.model, ecModel, api, payload); 
 | 
  //     }); 
 | 
  // }, 
 | 
  ToolboxView.prototype.remove = function (ecModel, api) { 
 | 
    zrUtil.each(this._features, function (feature) { 
 | 
      feature instanceof ToolboxFeature && feature.remove && feature.remove(ecModel, api); 
 | 
    }); 
 | 
    this.group.removeAll(); 
 | 
  }; 
 | 
  ToolboxView.prototype.dispose = function (ecModel, api) { 
 | 
    zrUtil.each(this._features, function (feature) { 
 | 
      feature instanceof ToolboxFeature && feature.dispose && feature.dispose(ecModel, api); 
 | 
    }); 
 | 
  }; 
 | 
  ToolboxView.type = 'toolbox'; 
 | 
  return ToolboxView; 
 | 
}(ComponentView); 
 | 
function isUserFeatureName(featureName) { 
 | 
  return featureName.indexOf('my') === 0; 
 | 
} 
 | 
export default ToolboxView; 
 |