| 
/* 
 | 
* 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 * as zrUtil from 'zrender/lib/core/util.js'; 
 | 
import * as graphic from '../../util/graphic.js'; 
 | 
import * as axisPointerModelHelper from './modelHelper.js'; 
 | 
import * as eventTool from 'zrender/lib/core/event.js'; 
 | 
import * as throttleUtil from '../../util/throttle.js'; 
 | 
import { makeInner } from '../../util/model.js'; 
 | 
var inner = makeInner(); 
 | 
var clone = zrUtil.clone; 
 | 
var bind = zrUtil.bind; 
 | 
/** 
 | 
 * Base axis pointer class in 2D. 
 | 
 */ 
 | 
var BaseAxisPointer = /** @class */function () { 
 | 
  function BaseAxisPointer() { 
 | 
    this._dragging = false; 
 | 
    /** 
 | 
     * In px, arbitrary value. Do not set too small, 
 | 
     * no animation is ok for most cases. 
 | 
     */ 
 | 
    this.animationThreshold = 15; 
 | 
  } 
 | 
  /** 
 | 
   * @implement 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.render = function (axisModel, axisPointerModel, api, forceRender) { 
 | 
    var value = axisPointerModel.get('value'); 
 | 
    var status = axisPointerModel.get('status'); 
 | 
    // Bind them to `this`, not in closure, otherwise they will not 
 | 
    // be replaced when user calling setOption in not merge mode. 
 | 
    this._axisModel = axisModel; 
 | 
    this._axisPointerModel = axisPointerModel; 
 | 
    this._api = api; 
 | 
    // Optimize: `render` will be called repeatedly during mouse move. 
 | 
    // So it is power consuming if performing `render` each time, 
 | 
    // especially on mobile device. 
 | 
    if (!forceRender && this._lastValue === value && this._lastStatus === status) { 
 | 
      return; 
 | 
    } 
 | 
    this._lastValue = value; 
 | 
    this._lastStatus = status; 
 | 
    var group = this._group; 
 | 
    var handle = this._handle; 
 | 
    if (!status || status === 'hide') { 
 | 
      // Do not clear here, for animation better. 
 | 
      group && group.hide(); 
 | 
      handle && handle.hide(); 
 | 
      return; 
 | 
    } 
 | 
    group && group.show(); 
 | 
    handle && handle.show(); 
 | 
    // Otherwise status is 'show' 
 | 
    var elOption = {}; 
 | 
    this.makeElOption(elOption, value, axisModel, axisPointerModel, api); 
 | 
    // Enable change axis pointer type. 
 | 
    var graphicKey = elOption.graphicKey; 
 | 
    if (graphicKey !== this._lastGraphicKey) { 
 | 
      this.clear(api); 
 | 
    } 
 | 
    this._lastGraphicKey = graphicKey; 
 | 
    var moveAnimation = this._moveAnimation = this.determineAnimation(axisModel, axisPointerModel); 
 | 
    if (!group) { 
 | 
      group = this._group = new graphic.Group(); 
 | 
      this.createPointerEl(group, elOption, axisModel, axisPointerModel); 
 | 
      this.createLabelEl(group, elOption, axisModel, axisPointerModel); 
 | 
      api.getZr().add(group); 
 | 
    } else { 
 | 
      var doUpdateProps = zrUtil.curry(updateProps, axisPointerModel, moveAnimation); 
 | 
      this.updatePointerEl(group, elOption, doUpdateProps); 
 | 
      this.updateLabelEl(group, elOption, doUpdateProps, axisPointerModel); 
 | 
    } 
 | 
    updateMandatoryProps(group, axisPointerModel, true); 
 | 
    this._renderHandle(value); 
 | 
  }; 
 | 
  /** 
 | 
   * @implement 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.remove = function (api) { 
 | 
    this.clear(api); 
 | 
  }; 
 | 
  /** 
 | 
   * @implement 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.dispose = function (api) { 
 | 
    this.clear(api); 
 | 
  }; 
 | 
  /** 
 | 
   * @protected 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.determineAnimation = function (axisModel, axisPointerModel) { 
 | 
    var animation = axisPointerModel.get('animation'); 
 | 
    var axis = axisModel.axis; 
 | 
    var isCategoryAxis = axis.type === 'category'; 
 | 
    var useSnap = axisPointerModel.get('snap'); 
 | 
    // Value axis without snap always do not snap. 
 | 
    if (!useSnap && !isCategoryAxis) { 
 | 
      return false; 
 | 
    } 
 | 
    if (animation === 'auto' || animation == null) { 
 | 
      var animationThreshold = this.animationThreshold; 
 | 
      if (isCategoryAxis && axis.getBandWidth() > animationThreshold) { 
 | 
        return true; 
 | 
      } 
 | 
      // It is important to auto animation when snap used. Consider if there is 
 | 
      // a dataZoom, animation will be disabled when too many points exist, while 
 | 
      // it will be enabled for better visual effect when little points exist. 
 | 
      if (useSnap) { 
 | 
        var seriesDataCount = axisPointerModelHelper.getAxisInfo(axisModel).seriesDataCount; 
 | 
        var axisExtent = axis.getExtent(); 
 | 
        // Approximate band width 
 | 
        return Math.abs(axisExtent[0] - axisExtent[1]) / seriesDataCount > animationThreshold; 
 | 
      } 
 | 
      return false; 
 | 
    } 
 | 
    return animation === true; 
 | 
  }; 
 | 
  /** 
 | 
   * add {pointer, label, graphicKey} to elOption 
 | 
   * @protected 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.makeElOption = function (elOption, value, axisModel, axisPointerModel, api) { 
 | 
    // Should be implemenented by sub-class. 
 | 
  }; 
 | 
  /** 
 | 
   * @protected 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.createPointerEl = function (group, elOption, axisModel, axisPointerModel) { 
 | 
    var pointerOption = elOption.pointer; 
 | 
    if (pointerOption) { 
 | 
      var pointerEl = inner(group).pointerEl = new graphic[pointerOption.type](clone(elOption.pointer)); 
 | 
      group.add(pointerEl); 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * @protected 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.createLabelEl = function (group, elOption, axisModel, axisPointerModel) { 
 | 
    if (elOption.label) { 
 | 
      var labelEl = inner(group).labelEl = new graphic.Text(clone(elOption.label)); 
 | 
      group.add(labelEl); 
 | 
      updateLabelShowHide(labelEl, axisPointerModel); 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * @protected 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.updatePointerEl = function (group, elOption, updateProps) { 
 | 
    var pointerEl = inner(group).pointerEl; 
 | 
    if (pointerEl && elOption.pointer) { 
 | 
      pointerEl.setStyle(elOption.pointer.style); 
 | 
      updateProps(pointerEl, { 
 | 
        shape: elOption.pointer.shape 
 | 
      }); 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * @protected 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.updateLabelEl = function (group, elOption, updateProps, axisPointerModel) { 
 | 
    var labelEl = inner(group).labelEl; 
 | 
    if (labelEl) { 
 | 
      labelEl.setStyle(elOption.label.style); 
 | 
      updateProps(labelEl, { 
 | 
        // Consider text length change in vertical axis, animation should 
 | 
        // be used on shape, otherwise the effect will be weird. 
 | 
        // TODOTODO 
 | 
        // shape: elOption.label.shape, 
 | 
        x: elOption.label.x, 
 | 
        y: elOption.label.y 
 | 
      }); 
 | 
      updateLabelShowHide(labelEl, axisPointerModel); 
 | 
    } 
 | 
  }; 
 | 
  /** 
 | 
   * @private 
 | 
   */ 
 | 
  BaseAxisPointer.prototype._renderHandle = function (value) { 
 | 
    if (this._dragging || !this.updateHandleTransform) { 
 | 
      return; 
 | 
    } 
 | 
    var axisPointerModel = this._axisPointerModel; 
 | 
    var zr = this._api.getZr(); 
 | 
    var handle = this._handle; 
 | 
    var handleModel = axisPointerModel.getModel('handle'); 
 | 
    var status = axisPointerModel.get('status'); 
 | 
    if (!handleModel.get('show') || !status || status === 'hide') { 
 | 
      handle && zr.remove(handle); 
 | 
      this._handle = null; 
 | 
      return; 
 | 
    } 
 | 
    var isInit; 
 | 
    if (!this._handle) { 
 | 
      isInit = true; 
 | 
      handle = this._handle = graphic.createIcon(handleModel.get('icon'), { 
 | 
        cursor: 'move', 
 | 
        draggable: true, 
 | 
        onmousemove: function (e) { 
 | 
          // For mobile device, prevent screen slider on the button. 
 | 
          eventTool.stop(e.event); 
 | 
        }, 
 | 
        onmousedown: bind(this._onHandleDragMove, this, 0, 0), 
 | 
        drift: bind(this._onHandleDragMove, this), 
 | 
        ondragend: bind(this._onHandleDragEnd, this) 
 | 
      }); 
 | 
      zr.add(handle); 
 | 
    } 
 | 
    updateMandatoryProps(handle, axisPointerModel, false); 
 | 
    // update style 
 | 
    handle.setStyle(handleModel.getItemStyle(null, ['color', 'borderColor', 'borderWidth', 'opacity', 'shadowColor', 'shadowBlur', 'shadowOffsetX', 'shadowOffsetY'])); 
 | 
    // update position 
 | 
    var handleSize = handleModel.get('size'); 
 | 
    if (!zrUtil.isArray(handleSize)) { 
 | 
      handleSize = [handleSize, handleSize]; 
 | 
    } 
 | 
    handle.scaleX = handleSize[0] / 2; 
 | 
    handle.scaleY = handleSize[1] / 2; 
 | 
    throttleUtil.createOrUpdate(this, '_doDispatchAxisPointer', handleModel.get('throttle') || 0, 'fixRate'); 
 | 
    this._moveHandleToValue(value, isInit); 
 | 
  }; 
 | 
  BaseAxisPointer.prototype._moveHandleToValue = function (value, isInit) { 
 | 
    updateProps(this._axisPointerModel, !isInit && this._moveAnimation, this._handle, getHandleTransProps(this.getHandleTransform(value, this._axisModel, this._axisPointerModel))); 
 | 
  }; 
 | 
  BaseAxisPointer.prototype._onHandleDragMove = function (dx, dy) { 
 | 
    var handle = this._handle; 
 | 
    if (!handle) { 
 | 
      return; 
 | 
    } 
 | 
    this._dragging = true; 
 | 
    // Persistent for throttle. 
 | 
    var trans = this.updateHandleTransform(getHandleTransProps(handle), [dx, dy], this._axisModel, this._axisPointerModel); 
 | 
    this._payloadInfo = trans; 
 | 
    handle.stopAnimation(); 
 | 
    handle.attr(getHandleTransProps(trans)); 
 | 
    inner(handle).lastProp = null; 
 | 
    this._doDispatchAxisPointer(); 
 | 
  }; 
 | 
  /** 
 | 
   * Throttled method. 
 | 
   */ 
 | 
  BaseAxisPointer.prototype._doDispatchAxisPointer = function () { 
 | 
    var handle = this._handle; 
 | 
    if (!handle) { 
 | 
      return; 
 | 
    } 
 | 
    var payloadInfo = this._payloadInfo; 
 | 
    var axisModel = this._axisModel; 
 | 
    this._api.dispatchAction({ 
 | 
      type: 'updateAxisPointer', 
 | 
      x: payloadInfo.cursorPoint[0], 
 | 
      y: payloadInfo.cursorPoint[1], 
 | 
      tooltipOption: payloadInfo.tooltipOption, 
 | 
      axesInfo: [{ 
 | 
        axisDim: axisModel.axis.dim, 
 | 
        axisIndex: axisModel.componentIndex 
 | 
      }] 
 | 
    }); 
 | 
  }; 
 | 
  BaseAxisPointer.prototype._onHandleDragEnd = function () { 
 | 
    this._dragging = false; 
 | 
    var handle = this._handle; 
 | 
    if (!handle) { 
 | 
      return; 
 | 
    } 
 | 
    var value = this._axisPointerModel.get('value'); 
 | 
    // Consider snap or categroy axis, handle may be not consistent with 
 | 
    // axisPointer. So move handle to align the exact value position when 
 | 
    // drag ended. 
 | 
    this._moveHandleToValue(value); 
 | 
    // For the effect: tooltip will be shown when finger holding on handle 
 | 
    // button, and will be hidden after finger left handle button. 
 | 
    this._api.dispatchAction({ 
 | 
      type: 'hideTip' 
 | 
    }); 
 | 
  }; 
 | 
  /** 
 | 
   * @private 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.clear = function (api) { 
 | 
    this._lastValue = null; 
 | 
    this._lastStatus = null; 
 | 
    var zr = api.getZr(); 
 | 
    var group = this._group; 
 | 
    var handle = this._handle; 
 | 
    if (zr && group) { 
 | 
      this._lastGraphicKey = null; 
 | 
      group && zr.remove(group); 
 | 
      handle && zr.remove(handle); 
 | 
      this._group = null; 
 | 
      this._handle = null; 
 | 
      this._payloadInfo = null; 
 | 
    } 
 | 
    throttleUtil.clear(this, '_doDispatchAxisPointer'); 
 | 
  }; 
 | 
  /** 
 | 
   * @protected 
 | 
   */ 
 | 
  BaseAxisPointer.prototype.doClear = function () { 
 | 
    // Implemented by sub-class if necessary. 
 | 
  }; 
 | 
  BaseAxisPointer.prototype.buildLabel = function (xy, wh, xDimIndex) { 
 | 
    xDimIndex = xDimIndex || 0; 
 | 
    return { 
 | 
      x: xy[xDimIndex], 
 | 
      y: xy[1 - xDimIndex], 
 | 
      width: wh[xDimIndex], 
 | 
      height: wh[1 - xDimIndex] 
 | 
    }; 
 | 
  }; 
 | 
  return BaseAxisPointer; 
 | 
}(); 
 | 
function updateProps(animationModel, moveAnimation, el, props) { 
 | 
  // Animation optimize. 
 | 
  if (!propsEqual(inner(el).lastProp, props)) { 
 | 
    inner(el).lastProp = props; 
 | 
    moveAnimation ? graphic.updateProps(el, props, animationModel) : (el.stopAnimation(), el.attr(props)); 
 | 
  } 
 | 
} 
 | 
function propsEqual(lastProps, newProps) { 
 | 
  if (zrUtil.isObject(lastProps) && zrUtil.isObject(newProps)) { 
 | 
    var equals_1 = true; 
 | 
    zrUtil.each(newProps, function (item, key) { 
 | 
      equals_1 = equals_1 && propsEqual(lastProps[key], item); 
 | 
    }); 
 | 
    return !!equals_1; 
 | 
  } else { 
 | 
    return lastProps === newProps; 
 | 
  } 
 | 
} 
 | 
function updateLabelShowHide(labelEl, axisPointerModel) { 
 | 
  labelEl[axisPointerModel.get(['label', 'show']) ? 'show' : 'hide'](); 
 | 
} 
 | 
function getHandleTransProps(trans) { 
 | 
  return { 
 | 
    x: trans.x || 0, 
 | 
    y: trans.y || 0, 
 | 
    rotation: trans.rotation || 0 
 | 
  }; 
 | 
} 
 | 
function updateMandatoryProps(group, axisPointerModel, silent) { 
 | 
  var z = axisPointerModel.get('z'); 
 | 
  var zlevel = axisPointerModel.get('zlevel'); 
 | 
  group && group.traverse(function (el) { 
 | 
    if (el.type !== 'group') { 
 | 
      z != null && (el.z = z); 
 | 
      zlevel != null && (el.zlevel = zlevel); 
 | 
      el.silent = silent; 
 | 
    } 
 | 
  }); 
 | 
} 
 | 
export default BaseAxisPointer; 
 |