/**
 * Copyright (c) 2018-2021 mol* contributors, licensed under MIT, See LICENSE file for more info.
 *
 * @author Alexander Rose <alexander.rose@weirdbyte.de>
 * @author David Sehnal <david.sehnal@gmail.com>
 */
import { Observable } from 'rxjs';
import { BitFlags } from '../../mol-util';
export declare function getButtons(event: MouseEvent | Touch): number;
export declare function getButton(event: MouseEvent | Touch): number;
export declare function getModifiers(event: MouseEvent | Touch): ModifiersKeys;
export declare const DefaultInputObserverProps: {
    noScroll: boolean;
    noMiddleClickScroll: boolean;
    noContextMenu: boolean;
    noPinchZoom: boolean;
    noTextSelect: boolean;
    preventGestures: boolean;
    mask: (x: number, y: number) => boolean;
    pixelScale: number;
};
export declare type InputObserverProps = Partial<typeof DefaultInputObserverProps>;
export declare type ModifiersKeys = {
    shift: boolean;
    alt: boolean;
    control: boolean;
    meta: boolean;
};
export declare namespace ModifiersKeys {
    const None: ModifiersKeys;
    function areEqual(a: ModifiersKeys, b: ModifiersKeys): boolean;
    function size(a?: ModifiersKeys): number;
    function create(modifierKeys?: Partial<ModifiersKeys>): ModifiersKeys;
}
export declare type ButtonsType = BitFlags<ButtonsType.Flag>;
export declare namespace ButtonsType {
    const has: (btn: ButtonsType, f: Flag) => boolean;
    const create: (fs: Flag) => ButtonsType;
    const enum Flag {
        /** No button or un-initialized */
        None = 0,
        /** Primary button (usually left) */
        Primary = 1,
        /** Secondary button (usually right) */
        Secondary = 2,
        /** Auxilary button (usually middle or mouse wheel button)  */
        Auxilary = 4,
        /** 4th button (typically the "Browser Back" button) */
        Forth = 8,
        /** 5th button (typically the "Browser Forward" button) */
        Five = 16
    }
}
declare type BaseInput = {
    buttons: ButtonsType;
    button: ButtonsType.Flag;
    modifiers: ModifiersKeys;
};
export declare type DragInput = {
    x: number;
    y: number;
    dx: number;
    dy: number;
    pageX: number;
    pageY: number;
    isStart: boolean;
} & BaseInput;
export declare type WheelInput = {
    x: number;
    y: number;
    pageX: number;
    pageY: number;
    dx: number;
    dy: number;
    dz: number;
    spinX: number;
    spinY: number;
} & BaseInput;
export declare type ClickInput = {
    x: number;
    y: number;
    pageX: number;
    pageY: number;
} & BaseInput;
export declare type MoveInput = {
    x: number;
    y: number;
    pageX: number;
    pageY: number;
    inside: boolean;
} & BaseInput;
export declare type PinchInput = {
    delta: number;
    fraction: number;
    fractionDelta: number;
    distance: number;
    isStart: boolean;
} & BaseInput;
export declare type GestureInput = {
    scale: number;
    rotation: number;
    deltaScale: number;
    deltaRotation: number;
    isStart?: boolean;
    isEnd?: boolean;
};
export declare type KeyInput = {
    key: string;
    modifiers: ModifiersKeys;
};
export declare type ResizeInput = {};
interface InputObserver {
    noScroll: boolean;
    noContextMenu: boolean;
    readonly width: number;
    readonly height: number;
    readonly pixelRatio: number;
    readonly drag: Observable<DragInput>;
    readonly interactionEnd: Observable<undefined>;
    readonly wheel: Observable<WheelInput>;
    readonly pinch: Observable<PinchInput>;
    readonly gesture: Observable<GestureInput>;
    readonly click: Observable<ClickInput>;
    readonly move: Observable<MoveInput>;
    readonly leave: Observable<undefined>;
    readonly enter: Observable<undefined>;
    readonly resize: Observable<ResizeInput>;
    readonly modifiers: Observable<ModifiersKeys>;
    readonly key: Observable<KeyInput>;
    dispose: () => void;
}
declare namespace InputObserver {
    function create(props?: InputObserverProps): InputObserver;
    function fromElement(element: Element, props?: InputObserverProps): InputObserver;
}
export { InputObserver };
