import { Point } from '@vertexvis/geometry';
import { StreamRequestError } from '@vertexvis/stream-api';
import { Disposable, Listener } from '@vertexvis/utils';
import { SceneItemOperationsBuilder, TerminalItemOperationBuilder } from '../scenes';
import { SceneElementQueryExecutor } from '../scenes/queries';
import { VolumeIntersectionQueryModel } from './model';
export type OperationTransform = (builder: SceneItemOperationsBuilder) => TerminalItemOperationBuilder;
export type AdditionalTransform = (executor: SceneElementQueryExecutor) => TerminalItemOperationBuilder;
export interface CompleteExecutionDetails {
    aborted: boolean;
}
export declare class VolumeIntersectionQueryController {
    private model;
    private viewer;
    private previousViewerCameraControls?;
    private operationTransform;
    private additionalTransforms;
    private operationInFlight;
    private operationAborted;
    private executeStarted;
    private executeComplete;
    private executeAborted;
    constructor(model: VolumeIntersectionQueryModel, viewer: HTMLVertexViewerElement);
    setStartPoint(point: Point.Point): void;
    setEndPoint(point: Point.Point): void;
    /**
     * Updates the operation that will be applied based on the volume intersection
     * query. Defaults to `(builder) => builder.select()`, which will select any
     * of the results of the query.
     */
    setOperationTransform(operationTransform: OperationTransform): void;
    /**
     * Updates any additional operations that should be performed independent of
     * the volume intersection query. This can be used to perform an operation on
     * the entirety of the scene prior to the operation on the result of the
     * volume intersection query.
     * Defaults to `[(op) => op.items.where((q) => q.all()).deselect()]`, which will
     * clear any prior selection before the default selection.
     */
    setAdditionalTransforms(additionalTransforms: AdditionalTransform[]): void;
    onExecuteStarted(listener: Listener<void>): Disposable;
    onExecuteComplete(listener: Listener<CompleteExecutionDetails>): Disposable;
    onExecuteAborted(listener: Listener<StreamRequestError>): Disposable;
    execute(): Promise<void>;
}
