import { ISerializedConfig, IViewerEvent, ThreeViewer, IViewerEventTypes } from './ThreeViewer';
import { Event, EventDispatcher } from 'three';
import { PartialRecord, SerializationMetaType } from '../utils';
import { IViewerPlugin, IViewerPluginAsync } from './IViewerPlugin';
import { UiObjectConfig } from 'uiconfig.js';
/**
 * Base Class for Viewer Plugins
 * @category Viewer
 */
export declare abstract class AViewerPlugin<T extends string = string, TViewer extends ThreeViewer = ThreeViewer, IsSync extends boolean = boolean> extends EventDispatcher<Event, T | 'serialize' | 'deserialize'> implements IViewerPlugin<TViewer, IsSync> {
    ['constructor']: typeof AViewerPlugin;
    static readonly PluginType: string;
    static readonly OldPluginType?: string;
    protected _dirty: boolean;
    uiConfig?: UiObjectConfig;
    protected _viewer?: TViewer;
    abstract enabled: boolean;
    abstract onAdded(viewer: TViewer): IsSync extends false ? Promise<void> : void;
    abstract onRemove(viewer: TViewer): IsSync extends false ? Promise<void> : void;
    dispose(): void;
    toJSON(meta?: SerializationMetaType): ISerializedConfig;
    fromJSON(data: ISerializedConfig, meta?: SerializationMetaType): this | null | Promise<this | null>;
    protected _storeKey(prefix?: string): string;
    exportState(): ISerializedConfig | Record<string, never>;
    importState(state: any): Promise<void>;
    protected _viewerListeners: PartialRecord<IViewerEventTypes, (e: IViewerEvent) => void>;
    protected _onViewerEvent: (e: IViewerEvent) => IViewerEvent;
    private _disabledBy;
    disable: (key: any) => void;
    enable: (key: any) => void;
    isDisabled: () => boolean;
    setDirty?(...args: any[]): any;
    get dirty(): boolean;
    set dirty(value: boolean);
}
/**
 * Base Class for Sync Viewer Plugins
 * @category Viewer
 */
export declare abstract class AViewerPluginSync<T extends string, TViewer extends ThreeViewer = ThreeViewer> extends AViewerPlugin<T, TViewer, true> {
    ['constructor']: (typeof AViewerPluginSync) & (typeof AViewerPlugin);
    onAdded(viewer: TViewer): void;
    onRemove(viewer: TViewer): void;
}
/**
 * Base Class for Async Viewer Plugins
 * @category Viewer
 */
export declare abstract class AViewerPluginAsync<T extends string, TViewer extends ThreeViewer = ThreeViewer> extends AViewerPlugin<T, TViewer, false> implements IViewerPluginAsync<TViewer> {
    ['constructor']: (typeof AViewerPluginAsync) & (typeof AViewerPlugin);
    onAdded(viewer: TViewer): Promise<void>;
    onRemove(viewer: TViewer): Promise<void>;
}
//# sourceMappingURL=AViewerPlugin.d.ts.map