import { AViewerPluginSync, ThreeViewer } from '../../viewer';
import { ActionUndoCommand, AnyFunction, JSUndoManager, PrimitiveVal, SetValueUndoCommand, SetValueUndoCommandProps } from 'ts-browser-helpers';
/**
 * UndoManagerPlugin is a plugin for ThreeViewer that provides undo/redo functionality.
 * It uses the JSUndoManager(from ts-browser-helpers) library to maintain a common undo/redo history across the viewer and other plugins.
 */
export declare class UndoManagerPlugin extends AViewerPluginSync {
    static readonly PluginType = "UndoManagerPlugin";
    enabled: boolean;
    undoManager?: JSUndoManager;
    limit: number;
    constructor(enabled?: boolean, limit?: number);
    undo(): void;
    redo(): void;
    protected _refresh(): void;
    toJSON: any;
    onAdded(viewer: ThreeViewer): void;
    onRemove(viewer: ThreeViewer): void;
    undoEditingWaitTime: number;
    recordUndo(com: SetValueUndoCommand | ActionUndoCommand): JSUndoManager | undefined;
    /**
     * Performs an action with undo/redo support.
     * @param targ - the target object to call the action on
     * @param action - a function that returns - 1. an undo function, 2. an object with undo and redo functions (and optional action)
     * @param args - the arguments to pass to the action function
     * @param uid - unique identifier for the command, not really used in actions
     * @param onUndoRedo - optional callback function to be called on undo/redo of the command. Not called on first action execution, only on undo/redo.
     */
    performAction<T extends AnyFunction>(targ: any | undefined, action: T, args: Parameters<T>, uid: any, onUndoRedo?: (c: ActionUndoCommand) => void): Promise<void>;
    /**
     * Sets a value in the target object with undo/redo support.
     * @param binding - a tuple of target object and key to set the value on
     * @param value - the value to set
     * @param props - properties for the undo command, including last, and lastValue(optional)
     * @param uid - unique identifier for the command, used to merge commands
     * @param forceOnChange
     * @param trackUndo - whether to track the undo command or not, defaults to true
     * @param onUndoRedo - optional callback function to be called on undo/redo of the command
     * @returns true if the value was set and the command was recorded, false if the command was not recorded (e.g. if it was not undoable or forceOnChange was false)
     */
    setValue<T extends PrimitiveVal, T1 = any>(binding: [T1, keyof T1], value: T, props: SetValueUndoCommandProps<T>, uid?: any, forceOnChange?: boolean, trackUndo?: boolean, onUndoRedo?: (c: SetValueUndoCommand) => void): boolean;
    setValues(bindings: [any, keyof any][], defs: any[], v: any[], props: SetValueUndoCommandProps<any>, uid?: any, forceOnChange?: boolean, trackUndo?: boolean, onUndoRedo?: (c: SetValueUndoCommand) => void): boolean;
    readonly undoCommandTypes: {
        readonly setValue: "ThreeViewerUM_set";
        readonly action: "ThreeViewerUM_action";
    };
    undoPresets: {
        ThreeViewerUM_set: (c: SetValueUndoCommand) => {
            undo: () => void;
            redo: () => void;
        };
        ThreeViewerUM_action: (c: ActionUndoCommand) => {
            undo: () => Promise<void>;
            redo: () => Promise<void>;
        };
    };
}
/**
 * Creates a proxy for an array of bindings, allowing to access and set values in the target objects by editing the value.
 * Useful for updating multiple properties in a single undo/redo command when dragging.
 * @param bindings
 * @param defs
 */
export declare function createBindingsProxy(bindings: [any, keyof any][], defs: any[]): {
    p: any[];
    value: any[];
};
//# sourceMappingURL=../../src/plugins/interaction/UndoManagerPlugin.d.ts.map