Application UI Settings
'Application UI Settings' refers to settings that define the state of different parts of the UI, e.g., "dark" or "light" theme, size and location of column sizes, or panel sizes.
AppUiSettings
The AppUiSettings class, which implements the UserSettingsProvider interface, can be instantiated by the IModelApp and registered as an UserSettingsProvider. This is left up to the application so each one can provide default values for the settings maintained by the AppUiSettings
class. Below is an excerpt from application startup code that shows the registration of AppUiSettings
.
public static async initialize() {
await UiFramework.initialize(undefined);
// initialize Presentation
await Presentation.initialize({
activeLocale: IModelApp.i18n.getLanguageList()[0],
});
Presentation.selection.scopes.activeScope = "top-assembly";
// other initialization calls not shown in this example excerpt
// app specific call to register setting pages to display
AppSettingsTabsProvider.initializeAppSettingProvider();
// Create and register the AppUiSettings instance to provide default for ui settings in Redux store
const lastTheme = (window.localStorage&&window.localStorage.getItem("uifw:defaultTheme"))??SYSTEM_PREFERRED_COLOR_THEME;
const defaults = {
colorTheme: lastTheme ?? SYSTEM_PREFERRED_COLOR_THEME,
dragInteraction: false,
frameworkVersion: "2",
widgetOpacity: 0.8,
};
// initialize any settings providers that may need to have defaults set by iModelApp
UiFramework.registerUserSettingsProvider(new AppUiSettings(defaults));
}
FrameworkVersion
The FrameworkVersion component defines the version context that is accessible to any lower level components. The version string is set to the value returned by UiFramework.uiVersion. Version "1" compatible components are deprecated and will be removed in a future release.
Settings Components
Quantity Formatting Settings
The QuantityFormatSettingsPage component provides the UI to set both the PresentationManager.activeUnitSystem and formatting overrides in the QuantityFormatter. This component can be used in the new SettingsContainer UI component. The function getQuantityFormatsSettingsManagerEntry
will return a SettingsTabEntry for use by the SettingsManager.
User Interface Settings
The UiSettingsPage component provides the UI to set general UI settings that effect the look and feel of the App UI user interface. This component can be used in the new SettingsContainer UI component. The function getUiSettingsManagerEntry
will return a SettingsTabEntry for use by the SettingsManager.
Settings stage
UI and Quantity Settings as well as other settings can be present to the user for editing using the stage SettingsModalFrontstage. This stage will display all SettingsTabEntry entries that are provided via SettingsTabsProvider classes. SettingsTabsProvider
classes can be registered with the SettingsManager by the host application, package, or extension loaded into an IModelApp using the App UI user interface. The steps to add a settings stage include.
Adding a backstage item
The [SettingsModalFrontstage.getBackstageActionItem] method can be used to get a BackstageActionItem to construct the backstage. Below is an example of how to set up a backstage menu component to display the 'Settings' entry if SettingsTabEntry
items are provided.
export function AppBackstageComposerComponent() {
const [backstageItems] = React.useState(() => {
return [
BackstageItemUtilities.createStageLauncher(ViewsFrontstage.stageId, 100, 10, IModelApp.i18n.translate("SampleApp:backstage.viewIModel"),
IModelApp.i18n.translate("SampleApp:backstage.iModelStage"), `svg:${stageIconSvg}`),
SettingsModalFrontstage.getBackstageActionItem (100, 20),
];
});
return (
<BackstageComposer items={backstageItems} />
);
}
Defining a SettingsTabsProvider
Below is an example SettingsTabsProvider class that adds two settings pages, one for Units Formatting and the other for UI Settings. In the AppUiSettings
example above the call to the static method [AppSettingsTabsProvider.initializeAppSettingProvider] is called to add this provider with the SettingsManager instance held by UiFramework.
export class AppSettingsTabsProvider implements SettingsTabsProvider {
public readonly id = "AppSettingsTabsProvider";
public getSettingEntries(_stageId: string, _stageUsage: string): ReadonlyArray<SettingsTabEntry> | undefined {
return [
getQuantityFormatsSettingsManagerEntry(10, {availableUnitSystems:new Set(["metric","imperial","usSurvey"])}),
getUiSettingsManagerEntry(20),
];
}
public static initializeAppSettingProvider() {
UiFramework.settingsManager.addSettingsProvider(new AppSettingsTabsProvider());
}
Last Updated: 30 November, 2023