diff --git a/common/api/core-frontend.api.md b/common/api/core-frontend.api.md index c3b5f2bfdc21..644ea474532d 100644 --- a/common/api/core-frontend.api.md +++ b/common/api/core-frontend.api.md @@ -11651,7 +11651,7 @@ export class ToolAdmin { // @public (undocumented) export namespace ToolAdmin { // @alpha - export class ActiveSettings { + export interface ActiveSettings { category?: Id64String; model?: Id64String; } diff --git a/common/changes/@itwin/core-frontend/dta-active-settings_2022-03-09-12-59.json b/common/changes/@itwin/core-frontend/dta-active-settings_2022-03-09-12-59.json new file mode 100644 index 000000000000..ac11a63efe7e --- /dev/null +++ b/common/changes/@itwin/core-frontend/dta-active-settings_2022-03-09-12-59.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@itwin/core-frontend", + "comment": "", + "type": "none" + } + ], + "packageName": "@itwin/core-frontend" +} \ No newline at end of file diff --git a/core/frontend/src/tools/ToolAdmin.ts b/core/frontend/src/tools/ToolAdmin.ts index 6dce84806188..4b8abf57d30a 100644 --- a/core/frontend/src/tools/ToolAdmin.ts +++ b/core/frontend/src/tools/ToolAdmin.ts @@ -319,7 +319,7 @@ export class ToolAdmin { * The active settings that placement tools will use. * @alpha */ - public readonly activeSettings = new ToolAdmin.ActiveSettings(); + public readonly activeSettings: ToolAdmin.ActiveSettings = { }; /** The name of the [[PrimitiveTool]] to use as the default tool. Defaults to "Select", referring to [[SelectionTool]]. * @see [[startDefaultTool]] to activate the default tool. @@ -1895,18 +1895,14 @@ export class WheelEventProcessor { * @public */ export namespace ToolAdmin { // eslint-disable-line no-redeclare - - /** - * Active settings that placement tools will use. + /** Active settings that placement tools will use. * @alpha */ - export class ActiveSettings { + export interface ActiveSettings { + /** The category to which newly created elements will be assigned. */ + category?: Id64String; - /** The active category */ - public category?: Id64String; - - /** The target model */ - public model?: Id64String; + /** The model that will contain newly created elements. */ + model?: Id64String; } - } diff --git a/test-apps/display-test-app/src/frontend/IdPicker.ts b/test-apps/display-test-app/src/frontend/IdPicker.ts index f0b38d79107d..0bfdc510ec99 100644 --- a/test-apps/display-test-app/src/frontend/IdPicker.ts +++ b/test-apps/display-test-app/src/frontend/IdPicker.ts @@ -4,7 +4,7 @@ *--------------------------------------------------------------------------------------------*/ import { assert, compareStringsOrUndefined, Id64, Id64Arg } from "@itwin/core-bentley"; import { GeometricModel3dProps, QueryBinder, QueryRowFormat } from "@itwin/core-common"; -import { GeometricModel3dState, ScreenViewport, SpatialViewState, ViewManip } from "@itwin/core-frontend"; +import { GeometricModel3dState, IModelApp, ScreenViewport, SpatialViewState, ViewManip } from "@itwin/core-frontend"; import { CheckBox, ComboBoxEntry, createButton, createCheckBox, createComboBox, createTextBox } from "@itwin/frontend-devtools"; import { ToolBarDropDown } from "./ToolBar"; @@ -18,6 +18,7 @@ export abstract class IdPicker extends ToolBarDropDown { protected readonly _availableIds = new Set(); protected abstract get _elementType(): "Model" | "Category"; + protected get _settingsType(): "model" | "category" { return this._elementType.toLowerCase() as "model" | "category"; } protected get _showIn2d(): boolean { return true; } protected abstract get _enabledIds(): Set; protected abstract changeDisplay(ids: Id64Arg, enabled: boolean): void; @@ -46,6 +47,8 @@ export abstract class IdPicker extends ToolBarDropDown { { name: "Hide Selected", value: "Hide" }, { name: "Hilite Enabled", value: "Hilite" }, { name: "Un-hilite Enabled", value: "Dehilite" }, + // Set ToolAdmin.activeSettings.model/category to first enabled entry. + { name: "Set First Active", value: "SetFirstActive" }, ]; } @@ -157,6 +160,10 @@ export abstract class IdPicker extends ToolBarDropDown { case "Dehilite": this.hiliteEnabled("Hilite" === which); return; + case "SetFirstActive": + const first = Array.from(this._enabledIds)[0]; + IModelApp.toolAdmin.activeSettings[this._settingsType] = first; + return; case "": return; } diff --git a/test-apps/display-test-app/src/frontend/Viewer.ts b/test-apps/display-test-app/src/frontend/Viewer.ts index fc0df27249cd..552b658078b4 100644 --- a/test-apps/display-test-app/src/frontend/Viewer.ts +++ b/test-apps/display-test-app/src/frontend/Viewer.ts @@ -348,20 +348,26 @@ export class Viewer extends Window { private updateActiveSettings(): void { // NOTE: First category/model is fine for testing purposes... const view = this.viewport.view; + const settings = IModelApp.toolAdmin.activeSettings; - IModelApp.toolAdmin.activeSettings.category = undefined; - for (const catId of view.categorySelector.categories) { - IModelApp.toolAdmin.activeSettings.category = catId; - break; + if (undefined === settings.category || !view.viewsCategory(settings.category)) { + settings.category = undefined; + for (const catId of view.categorySelector.categories) { + settings.category = catId; + break; + } } - if (view.is2d()) { - IModelApp.toolAdmin.activeSettings.model = view.baseModelId; - } else if (view.isSpatialView()) { - IModelApp.toolAdmin.activeSettings.model = undefined; - for (const modId of view.modelSelector.models) { - IModelApp.toolAdmin.activeSettings.model = modId; - break; + if (undefined === settings.model || !view.viewsModel(settings.model)) { + settings.model = undefined; + if (view.is2d()) { + settings.model = view.baseModelId; + } else if (view.isSpatialView()) { + settings.model = undefined; + for (const modId of view.modelSelector.models) { + settings.model = modId; + break; + } } } }