import * as graphic from '../../util/graphic';
import { AxisPointer } from './AxisPointer';
import { AxisBaseModel } from '../../coord/AxisBaseModel';
import ExtensionAPI from '../../core/ExtensionAPI';
import Element from 'zrender/lib/Element';
import { VerticalAlign, HorizontalAlign, CommonAxisPointerOption } from '../../util/types';
import { PathProps } from 'zrender/lib/graphic/Path';
import Model from '../../model/Model';
import { TextProps } from 'zrender/lib/graphic/Text';
interface Transform {
    x: number;
    y: number;
    rotation: number;
}
declare type AxisValue = CommonAxisPointerOption['value'];
declare type AxisPointerModel = Model<CommonAxisPointerOption>;
interface BaseAxisPointer {
    /**
     * Should be implemenented by sub-class if support `handle`.
     */
    getHandleTransform(value: AxisValue, axisModel: AxisBaseModel, axisPointerModel: AxisPointerModel): Transform;
    /**
     * * Should be implemenented by sub-class if support `handle`.
     */
    updateHandleTransform(transform: Transform, delta: number[], axisModel: AxisBaseModel, axisPointerModel: AxisPointerModel): Transform & {
        cursorPoint: number[];
        tooltipOption?: {
            verticalAlign?: VerticalAlign;
            align?: HorizontalAlign;
        };
    };
}
export interface AxisPointerElementOptions {
    graphicKey: string;
    pointer: PathProps & {
        type: 'Line' | 'Rect' | 'Circle' | 'Sector';
    };
    label: TextProps;
}
/**
 * Base axis pointer class in 2D.
 */
declare class BaseAxisPointer implements AxisPointer {
    private _group;
    private _lastGraphicKey;
    private _handle;
    private _dragging;
    private _lastValue;
    private _lastStatus;
    private _payloadInfo;
    /**
     * If have transition animation
     */
    private _moveAnimation;
    private _axisModel;
    private _axisPointerModel;
    private _api;
    /**
     * In px, arbitrary value. Do not set too small,
     * no animation is ok for most cases.
     */
    protected animationThreshold: number;
    /**
     * @implement
     */
    render(axisModel: AxisBaseModel, axisPointerModel: AxisPointerModel, api: ExtensionAPI, forceRender?: boolean): void;
    /**
     * @implement
     */
    remove(api: ExtensionAPI): void;
    /**
     * @implement
     */
    dispose(api: ExtensionAPI): void;
    /**
     * @protected
     */
    determineAnimation(axisModel: AxisBaseModel, axisPointerModel: AxisPointerModel): boolean;
    /**
     * add {pointer, label, graphicKey} to elOption
     * @protected
     */
    makeElOption(elOption: AxisPointerElementOptions, value: AxisValue, axisModel: AxisBaseModel, axisPointerModel: AxisPointerModel, api: ExtensionAPI): void;
    /**
     * @protected
     */
    createPointerEl(group: graphic.Group, elOption: AxisPointerElementOptions, axisModel: AxisBaseModel, axisPointerModel: AxisPointerModel): void;
    /**
     * @protected
     */
    createLabelEl(group: graphic.Group, elOption: AxisPointerElementOptions, axisModel: AxisBaseModel, axisPointerModel: AxisPointerModel): void;
    /**
     * @protected
     */
    updatePointerEl(group: graphic.Group, elOption: AxisPointerElementOptions, updateProps: (el: Element, props: PathProps) => void): void;
    /**
     * @protected
     */
    updateLabelEl(group: graphic.Group, elOption: AxisPointerElementOptions, updateProps: (el: Element, props: PathProps) => void, axisPointerModel: AxisPointerModel): void;
    /**
     * @private
     */
    _renderHandle(value: AxisValue): void;
    private _moveHandleToValue;
    private _onHandleDragMove;
    /**
     * Throttled method.
     */
    _doDispatchAxisPointer(): void;
    private _onHandleDragEnd;
    /**
     * @private
     */
    clear(api: ExtensionAPI): void;
    /**
     * @protected
     */
    doClear(): void;
    buildLabel(xy: number[], wh: number[], xDimIndex: 0 | 1): {
        x: number;
        y: number;
        width: number;
        height: number;
    };
}
export default BaseAxisPointer;
