/**
 * @module viw-webgl-viewer
 */
import * as THREE from 'three';
import { Vim } from '../loader/vim';
import { ViewerMaterials } from '../loader/materials/viewerMaterials';
import { GizmoMarker } from './gizmos/markers/gizmoMarker';
import { Object3D } from '../loader/object3D';
export type SelectableObject = Object3D | GizmoMarker;
/**
 * Provides selection behaviour for the viewer
 * Supports multi-selection as long as all objects are from the same vim.
 */
export declare class Selection {
    private _materials;
    private _objects;
    private _focusedObject;
    private _vim;
    private _lastFocusTime;
    private _onValueChanged;
    private _unsub;
    constructor(materials: ViewerMaterials);
    /**
     * Event called when selection changes or is cleared
     */
    get onValueChanged(): import("ste-signals").ISignal;
    /**
     * Returns the Vim instance from which elements are selected.
     * Cross-Vim selection is not supported.
     */
    get vim(): Vim;
    /**
     * Returns selected object as an iterator.
     */
    get objects(): SetIterator<SelectableObject>;
    /**
     * Retrieves the bounding box of the selection. Returns `undefined` if there's no selection.
     * @param {THREE.Box3} [target] Optional parameter to specify a box to use for the result.
     * @returns {THREE.Box3 | undefined} The bounding box of the selection or `undefined` if no selection exists.
     */
    getBoundingBox(target?: THREE.Box3): THREE.Box3 | undefined;
    /**
     * Adds focus highlight to a single object. Pass `undefined` to remove the highlight.
     * @param {IObject | undefined} object The object to focus on, or `undefined` to remove the highlight.
     */
    focus(object: SelectableObject | undefined): void;
    /**
     * Selects the given objects and unselects all other objects.
     * Pass `null`, `undefined`, or an empty array as argument to clear selection.
     * @param {IObject | IObject[] | undefined} object The object or array of objects to select,
     *        or `null`, `undefined`, or an empty array to clear the selection.
     */
    select(object: SelectableObject | SelectableObject[] | undefined): void;
    any(): boolean;
    /**
     * Returns true if the given object is currently selected.
     * @param {IObject} object The object to check for selection.
     * @returns {boolean} True if the object is selected, false otherwise.
     */
    has(object: SelectableObject): boolean;
    /**
     * Returns the current count of selected objects.
     */
    get count(): number;
    /**
     * Adds the given objects to the current selection.
     * @param {...IObject[]} objects The objects to add to the selection.
     */
    add(...objects: SelectableObject[]): void;
    /**
     * Removes the given objects from the current selection.
     * @param {...IObject[]} objects The objects to remove from the selection.
     */
    remove(...objects: SelectableObject[]): void;
    /**
     * Toggles the selection state of the given objects:
     * - Adds unselected elements of the given objects to the selection.
     * - Removes selected elements of the given objects from the selection.
     * @param {...IObject[]} objects The objects to toggle selection for.
     */
    toggle(...objects: SelectableObject[]): void;
    /**
     * Clears the current selection.
     */
    clear(): void;
    /**
     * Disposes of all resources and stops animations.
     */
    dispose(): void;
    private clearOnNewVim;
    update(): void;
}
