import '../../../chipper/js/browser/initialize-globals.js';
import '../../../assert/js/assert.js';
import '../../../globals.js';
import NumberProperty from '../../../axon/js/NumberProperty.js';
import Property from '../../../axon/js/Property.js';
import { Node } from '../../../scenery/js/imports.js';
import PhetioObject, { PhetioObjectOptions } from '../../../tandem/js/PhetioObject.js';
import Tandem from '../../../tandem/js/Tandem.js';
import IOType from '../../../tandem/js/types/IOType.js';
import { LocaleProperty } from '../i18n/localeProperty.js';
type CustomPreference = {
    createContent: (parentTandem: Tandem) => Node;
};
type CustomPreferencesOptions = {
    customPreferences?: CustomPreference[];
};
type SimulationPreferencesOptions = CustomPreferencesOptions;
type VisualPreferencesOptions = {
    supportsProjectorMode?: boolean;
    supportsInteractiveHighlights?: boolean;
} & CustomPreferencesOptions;
type AudioPreferencesOptions = {
    supportsVoicing?: boolean;
    supportsSound?: boolean;
    supportsExtraSound?: boolean;
} & CustomPreferencesOptions;
type InputPreferencesOptions = {
    supportsGestureControl?: boolean;
} & CustomPreferencesOptions;
type LocalizationPreferencesOptions = {
    supportsDynamicLocale?: boolean;
    includeLocalePanel?: boolean;
} & CustomPreferencesOptions;
type PreferencesModelSelfOptions = {
    simulationOptions?: SimulationPreferencesOptions;
    visualOptions?: VisualPreferencesOptions;
    audioOptions?: AudioPreferencesOptions;
    inputOptions?: InputPreferencesOptions;
    localizationOptions?: LocalizationPreferencesOptions;
};
export type PreferencesModelOptions = PreferencesModelSelfOptions & PhetioObjectOptions;
type BaseModelType = {
    tandemName: string;
};
export type SimulationModel = BaseModelType & Required<SimulationPreferencesOptions>;
export type VisualModel = BaseModelType & {
    interactiveHighlightsEnabledProperty: Property<boolean>;
    colorProfileProperty: Property<string>;
} & Required<VisualPreferencesOptions>;
export type AudioModel = BaseModelType & {
    audioEnabledProperty: Property<boolean>;
    soundEnabledProperty: Property<boolean>;
    extraSoundEnabledProperty: Property<boolean>;
    voicingEnabledProperty: Property<boolean>;
    voicingMainWindowVoicingEnabledProperty: Property<boolean>;
    voicingObjectResponsesEnabledProperty: Property<boolean>;
    voicingContextResponsesEnabledProperty: Property<boolean>;
    voicingHintResponsesEnabledProperty: Property<boolean>;
    voicePitchProperty: NumberProperty;
    voiceRateProperty: NumberProperty;
    voiceProperty: Property<null | SpeechSynthesisVoice>;
    toolbarEnabledProperty: Property<boolean>;
} & Required<AudioPreferencesOptions>;
export type InputModel = BaseModelType & {
    gestureControlsEnabledProperty: Property<boolean>;
} & Required<InputPreferencesOptions>;
export type LocalizationModel = BaseModelType & {
    localeProperty: LocaleProperty;
} & Required<LocalizationPreferencesOptions>;
export default class PreferencesModel extends PhetioObject {
    readonly simulationModel: SimulationModel;
    readonly visualModel: VisualModel;
    readonly audioModel: AudioModel;
    readonly inputModel: InputModel;
    readonly localizationModel: LocalizationModel;
    constructor(providedOptions?: PreferencesModelOptions);
    /**
     * Set up preferencesStorage for supported PreferencesProperties. Don't include all-sound and all-audio controls
     * because that feel too global to automatically take the last value.
     */
    private registerPreferencesStorage;
    private addPhetioLinkedElementsForModel;
    preferenceModelHasCustom(preferenceModel: Required<CustomPreferencesOptions>): boolean;
    /**
     * Returns true if the SimulationModel supports any preferences that can be changed.
     */
    supportsSimulationPreferences(): boolean;
    /**
     * Returns true if the VisualModel has any preferences that can be changed.
     */
    supportsVisualPreferences(): boolean;
    /**
     * Returns true if the AudioModel has any preferences that can be changed.
     */
    supportsAudioPreferences(): boolean;
    /**
     * Returns true if the InputModel has any preferences that can be changed.
     */
    supportsInputPreferences(): boolean;
    /**
     * Returns true if the LocalizationModel has any preferences that can be changed.
     */
    supportsLocalizationPreferences(): boolean;
    /**
     * Returns true if this model supports any controllable preferences for the dialog. Returns false when the dialog
     * would have nothing to display.
     */
    shouldShowDialog(): boolean;
    static PreferencesModelIO: IOType<PreferencesModel, {
        supportsProjectorMode: boolean;
        supportsInteractiveHighlights: boolean;
        supportsVoicing: boolean;
        supportsSound: boolean;
        supportsExtraSound: boolean;
        supportsGestureControl: boolean;
        supportsDynamicLocale: boolean;
        supportsAudioPreferences: boolean;
        supportsInputPreferences: boolean;
        supportsLocalizationPreferences: boolean;
        supportsSimulationPreferences: boolean;
        supportsVisualPreferences: boolean;
    }, {
        supportsProjectorMode: unknown;
        supportsInteractiveHighlights: unknown;
        supportsVoicing: unknown;
        supportsSound: unknown;
        supportsExtraSound: unknown;
        supportsGestureControl: unknown;
        supportsDynamicLocale: unknown;
        supportsAudioPreferences: unknown;
        supportsInputPreferences: unknown;
        supportsLocalizationPreferences: unknown;
        supportsSimulationPreferences: unknown;
        supportsVisualPreferences: unknown;
    }>;
}
export {};
//# sourceMappingURL=PreferencesModel.d.ts.map