// import { CustomElement, CustomEvent, DisplayObjectConfig } from '../../shapes'; // import { deepMix } from '@antv/util'; // import { applyStyle, maybeAppend, select } from '../../util'; // import { DEFAULT_TIMELINE_STYLE } from './constants'; // import { SpeedControlStyleProps } from './types'; // type StyleProps = SpeedControlStyleProps & { // x?: number; // y?: number; // }; // function getOffsetByIndex(index: number, height: number): number { // const OFFSET = [1.43, 2.79, 4.89, 7.57, 11.66]; // return (OFFSET[index] / 11.66) * height; // } // const DEFAULT_STYLE = deepMix({}, DEFAULT_TIMELINE_STYLE.speedControl, { // markerFill: '#8c8c8c', // spacing: 1, // lineStyle: { // stroke: '#bfbfbf', // lineWidth: 1, // }, // }); // export class SpeedControl extends CustomElement { // public static tag = 'speed-control'; // public static defaultOptions: DisplayObjectConfig = { // style: DEFAULT_STYLE, // }; // constructor(options: DisplayObjectConfig) { // super(deepMix({}, SpeedControl.defaultOptions, options)); // } // public update(cfg: Partial = {}): void { // this.attr(deepMix({}, this.attributes, cfg)); // this.render(); // } // private get styles(): Required { // return deepMix({}, SpeedControl.defaultOptions.style, this.attributes); // } // private render() { // const { // initialSpeed, // markerSize, // markerFill, // lineStyle, // speeds, // labelStyle: label, // spacing, // formatter = (v) => `${v}`, // } = this.styles; // let initialSpeedIdx = speeds.indexOf(initialSpeed); // if (initialSpeedIdx === -1) initialSpeedIdx = 0; // const size = markerSize * 2; // const y = getOffsetByIndex(initialSpeedIdx, size * 2); // const r = markerSize * Math.tan(Math.PI / 6) * 2; // maybeAppend(this, '.speed-marker', 'path') // .attr('className', 'speed-marker') // .style('fill', markerFill) // .style('path', [['M', 0, y - r / 2], ['L', markerSize, y], ['L', 0, y + r / 2], ['Z']]); // const x = markerSize - 0.5; // const group = maybeAppend(this, '.line-group', 'rect') // .attr('className', 'line-group') // .style('x', x) // .style('y', 0) // .style('width', size) // .style('height', size * 2) // .style('cursor', 'pointer') // .style('fill', 'transparent') // .node(); // const path = speeds.reduce((arr: any[], _: any, idx: number) => { // const offset = getOffsetByIndex(idx, size * 2); // arr.push(['M', 0, offset], ['L', size, offset]); // return arr; // }, [] as any[]); // maybeAppend(group, '.speed-path', 'path') // .attr('className', 'speed-path') // .style('path', path) // .call(applyStyle, lineStyle); // maybeAppend(this, '.speed-label', 'text') // .attr('className', 'speed-label') // .style('x', x + size + spacing) // .style('y', 2) // .style('text', formatter(speeds[initialSpeedIdx])) // .call(applyStyle, label); // } // private bindEvents() { // const lineGroup = this.querySelector('.line-group')! as any; // lineGroup.addEventListener('pointerdown', (evt: any) => this.onClick(evt)); // // Only for mobile. // lineGroup.addEventListener('touchmove', (evt: any) => this.onClick(evt)); // } // private onClick(evt: any) { // const { speeds, markerSize, formatter = (v) => `${v}` } = this.styles; // const height = markerSize * 2 * 2; // const lineGroup = this.querySelector('.line-group')! as any; // const speedText = select(this).select('.speed-label').node(); // const speedMarker = select(this).select('.speed-marker').node(); // if (evt.currentTarget === lineGroup) { // const diff = evt.y - lineGroup.getBBox().y; // const idx = speeds.findIndex((_: any, idx: number) => { // const offset = getOffsetByIndex(idx, height); // const offset0 = getOffsetByIndex(idx - 1, height); // const offset1 = getOffsetByIndex(idx + 1, height); // if (idx === 0) return diff < offset + (getOffsetByIndex(1, height) - offset) / 2; // if (idx === speeds.length - 1) return diff > offset - (offset - offset0) / 2; // const range = [offset - (offset - offset0) / 2, offset + (offset1 - offset) / 2]; // return diff >= range[0] && diff < range[1]; // }); // if (idx === -1) return; // speedText.setAttribute('text', formatter(speeds[idx])); // speedMarker.setLocalPosition(0, getOffsetByIndex(idx, height) - height / 8); // this.dispatchEvent(new CustomEvent('speedChanged', { detail: { speed: speeds[idx] } })); // } // } // }