import { ISignal } from "ste-signals";
import { IVimObject, IVim } from "./vim";
import { THREE } from "../..";
export interface ISelection<T extends IVimObject> {
    select(object: T | T[]): void;
    toggle(object: T | T[]): void;
    add(object: T | T[]): void;
    remove(object: T | T[]): void;
    clear(): void;
    getAll(): T[];
    GetFromVim(vim: IVim<T>): T[];
    removeFromVim(vim: IVim<T>): void;
    getBoundingBox(): Promise<THREE.Box3>;
    count(): number;
    any(): boolean;
    has(object: T): boolean;
    onSelectionChanged: ISignal;
}
export interface ISelectionAdapter<T extends IVimObject> {
    outline(object: T, state: boolean): void;
}
export declare class Selection<T extends IVimObject> implements ISelection<T> {
    private _onSelectionChanged;
    private _selection;
    private _adapter;
    constructor(adapter: ISelectionAdapter<T>);
    has(object: T): boolean;
    count(): number;
    any(): boolean;
    get onSelectionChanged(): ISignal;
    private _dispatchIfChanged;
    select(object: T): void;
    select(objects: T[]): void;
    toggle(object: T): void;
    toggle(objects: T[]): void;
    add(object: T): void;
    add(objects: T[]): void;
    remove(object: T): void;
    remove(objects: T[]): void;
    clear(): void;
    getAll(): T[];
    GetFromVim(vim: IVim<T>): T[];
    removeFromVim(vim: IVim<T>): void;
    getBoundingBox(): Promise<THREE.Box3>;
}
