@vertexvis/viewer 0.24.4-canary.2 → 0.24.4-canary.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/cjs/{model-c99dc06a.js → model-eab9e804.js} +17 -5
  2. package/dist/cjs/model-eab9e804.js.map +1 -0
  3. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +1 -1
  4. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js +2 -2
  5. package/dist/cjs/vertex-viewer-pin-label_2.cjs.entry.js.map +1 -1
  6. package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js +9 -4
  7. package/dist/cjs/vertex-viewer-pin-tool.cjs.entry.js.map +1 -1
  8. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js +2 -2
  9. package/dist/collection/components/viewer-pin-label/viewer-pin-label.js.map +1 -1
  10. package/dist/collection/components/viewer-pin-tool/viewer-pin-tool.js +8 -3
  11. package/dist/collection/components/viewer-pin-tool/viewer-pin-tool.js.map +1 -1
  12. package/dist/collection/lib/pins/model.js +16 -4
  13. package/dist/collection/lib/pins/model.js.map +1 -1
  14. package/dist/components/model3.js +16 -4
  15. package/dist/components/model3.js.map +1 -1
  16. package/dist/components/vertex-viewer-pin-tool.js +8 -3
  17. package/dist/components/vertex-viewer-pin-tool.js.map +1 -1
  18. package/dist/components/viewer-pin-label.js +1 -1
  19. package/dist/components/viewer-pin-label.js.map +1 -1
  20. package/dist/esm/{model-6f2014a6.js → model-1c68cf1e.js} +17 -5
  21. package/dist/esm/model-1c68cf1e.js.map +1 -0
  22. package/dist/esm/vertex-viewer-pin-group.entry.js +1 -1
  23. package/dist/esm/vertex-viewer-pin-label_2.entry.js +2 -2
  24. package/dist/esm/vertex-viewer-pin-label_2.entry.js.map +1 -1
  25. package/dist/esm/vertex-viewer-pin-tool.entry.js +9 -4
  26. package/dist/esm/vertex-viewer-pin-tool.entry.js.map +1 -1
  27. package/dist/types/components/viewer-pin-label/viewer-pin-label.d.ts +1 -1
  28. package/dist/types/components.d.ts +1 -1
  29. package/dist/types/lib/pins/model.d.ts +16 -7
  30. package/dist/viewer/{p-258b6bb9.js → p-4637d762.js} +2 -2
  31. package/dist/viewer/p-4637d762.js.map +1 -0
  32. package/dist/viewer/{p-96853d03.entry.js → p-7eea3fb3.entry.js} +2 -2
  33. package/dist/viewer/{p-96853d03.entry.js.map → p-7eea3fb3.entry.js.map} +1 -1
  34. package/dist/viewer/{p-577e8c44.entry.js → p-a5f5d455.entry.js} +2 -2
  35. package/dist/viewer/p-a5f5d455.entry.js.map +1 -0
  36. package/dist/viewer/{p-2624e8f9.entry.js → p-aa96951e.entry.js} +2 -2
  37. package/dist/viewer/viewer.esm.js +1 -1
  38. package/package.json +7 -7
  39. package/dist/cjs/model-c99dc06a.js.map +0 -1
  40. package/dist/esm/model-6f2014a6.js.map +0 -1
  41. package/dist/viewer/p-258b6bb9.js.map +0 -1
  42. package/dist/viewer/p-577e8c44.entry.js.map +0 -1
  43. /package/dist/viewer/{p-2624e8f9.entry.js.map → p-aa96951e.entry.js.map} +0 -0
@@ -162,13 +162,19 @@ export class ViewerPinTool {
162
162
  const xOffset = hostStyles
163
163
  .getPropertyValue('--viewer-pin-tool-initial-label-offset-x')
164
164
  .trim();
165
+ const xOffsetAsNumber = Number.isFinite(Number.parseInt(xOffset))
166
+ ? Number.parseInt(xOffset)
167
+ : 20;
165
168
  const yOffset = hostStyles
166
169
  .getPropertyValue('--viewer-pin-tool-initial-label-offset-y')
167
170
  .trim();
171
+ const yOffsetAsNumber = Number.isFinite(Number.parseInt(yOffset))
172
+ ? Number.parseInt(yOffset)
173
+ : 20;
168
174
  this.clearInteractionHandler();
169
175
  if (this.pinController != null) {
170
176
  this.registeredInteractionHandler =
171
- (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.registerInteractionHandler(new PinsInteractionHandler(this.pinController, parseInt(xOffset), parseInt(yOffset)));
177
+ (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.registerInteractionHandler(new PinsInteractionHandler(this.pinController, xOffsetAsNumber, yOffsetAsNumber));
172
178
  }
173
179
  }
174
180
  clearModelListeners() {
@@ -180,8 +186,7 @@ export class ViewerPinTool {
180
186
  (_c = this.resizeObserver) === null || _c === void 0 ? void 0 : _c.disconnect();
181
187
  }
182
188
  updateViewport() {
183
- const rect = getMarkupBoundingClientRect(this.hostEl);
184
- this.elementBounds = rect;
189
+ this.elementBounds = getMarkupBoundingClientRect(this.hostEl);
185
190
  }
186
191
  setDepthBuffers() {
187
192
  if (this.pins.length > 0 &&
@@ -1 +1 @@
1
- {"version":3,"file":"viewer-pin-tool.js","sourceRoot":"","sources":["../../../../../src/components/viewer-pin-tool/viewer-pin-tool.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Matrix4 } from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\n\nimport { PinController } from '../../lib/pins/controller';\nimport { PinsInteractionHandler } from '../../lib/pins/interactions';\nimport {\n Pin,\n PinModel,\n ViewerPinToolMode,\n ViewerPinToolType,\n} from '../../lib/pins/model';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\n\ninterface StateMap {\n shouldClearDepthBuffers?: boolean;\n shouldClearFeatureMaps?: boolean;\n}\n\n@Component({\n tag: 'vertex-viewer-pin-tool',\n styleUrl: 'viewer-pin-tool.css',\n shadow: true,\n})\nexport class ViewerPinTool {\n /**\n * The controller that is responsible for drawing pins and updating the model\n */\n @Prop({ mutable: true })\n public pinController?: PinController;\n\n /**\n * The model that contains the entities and outcomes from performing pin annotations\n */\n @Prop()\n public pinModel: PinModel = new PinModel();\n\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The type of pin.\n *\n * This property will automatically be set.\n */\n @Prop({ mutable: true })\n public tool: ViewerPinToolType = 'pin-icon';\n\n /**\n * The mode of the pin tool\n */\n @Prop({ mutable: true })\n public mode: ViewerPinToolMode = 'view';\n\n /**\n * The primary color for new pins. Setting this will override the primary template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to pin anchors, and borders, etc.\n */\n @Prop({ mutable: true })\n public primaryColor: Color.Color | string | undefined;\n\n /**\n * The accent color for new pins. Setting this will override the accent template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to some background colors, etc\n */\n @Prop({ mutable: true })\n public accentColor: Color.Color | string | undefined;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private pins: Pin[] = [];\n\n @State()\n private selectedPinId?: string;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private projectionViewMatrix?: Matrix4.Matrix4;\n\n private registeredInteractionHandler?: Promise<Disposable>;\n private onEntitiesChangedHandler?: Disposable;\n private onEntityAddedHandler?: Disposable;\n\n private resizeObserver?: ResizeObserver;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected watchModeChange(): void {\n this.pinController?.setToolMode(this.mode);\n this.setupInteractionHandler();\n\n if (this.mode === 'edit') {\n this.setFeatureMaps();\n } else {\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('tool')\n protected watchTypeChange(): void {\n this.pinController?.setToolType(this.tool);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('accentColor')\n protected watchAccentColorChange(): void {\n this.pinController?.setAccentColor(this.accentColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('primaryColor')\n protected watchPrimaryColorChange(): void {\n this.pinController?.setPrimaryColor(this.primaryColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('pins')\n protected watchPinsChange(): void {\n if (this.pins.length > 0) {\n this.setDepthBuffers();\n this.setFeatureMaps();\n } else {\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.setupController();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n this.pinModel.onEntitiesChanged((entities) => {\n this.pins = entities;\n });\n\n this.pinModel.onSelectionChange((selectedId) => {\n this.selectedPinId = selectedId;\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n }\n\n protected componentDidLoad(): void {\n this.resizeObserver = new ResizeObserver(() => this.updateViewport());\n this.resizeObserver.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.clearModelListeners();\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n if (oldViewer != null) {\n oldViewer.removeEventListener(\n 'frameDrawn',\n this.handleSetProjectionMatrix\n );\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleSetProjectionMatrix);\n }\n\n this.handleSetProjectionMatrix();\n }\n\n private handleSetProjectionMatrix = (): void => {\n this.projectionViewMatrix =\n this.viewer?.frame?.scene.camera.projectionViewMatrix;\n };\n\n protected render(): JSX.Element {\n return (\n <Host>\n <vertex-viewer-dom-renderer viewer={this.viewer} drawMode=\"2d\">\n {this.pins.map((pin) => {\n return (\n <vertex-viewer-pin-group\n id={`pin-group-${pin.id}`}\n data-is-dom-group-element={true}\n pin={pin}\n elementBounds={this.elementBounds}\n pinModel={this.pinModel}\n pinController={this.pinController}\n projectionViewMatrix={this.projectionViewMatrix}\n selected={this.selectedPinId === pin.id}\n ></vertex-viewer-pin-group>\n );\n })}\n </vertex-viewer-dom-renderer>\n </Host>\n );\n }\n\n private setupController(): void {\n const attributes =\n this.accentColor || this.primaryColor\n ? {\n accentColor: this.accentColor,\n primaryColor: this.primaryColor,\n }\n : undefined;\n this.pinController = new PinController(\n this.pinModel,\n this.mode,\n this.tool,\n attributes\n );\n }\n\n private clearInteractionHandler(): void {\n this.registeredInteractionHandler?.then((handler) => handler.dispose());\n this.registeredInteractionHandler = undefined;\n }\n\n private setupInteractionHandler(): void {\n const hostStyles = window.getComputedStyle(this.hostEl);\n const xOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-x')\n .trim();\n const yOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-y')\n .trim();\n\n this.clearInteractionHandler();\n\n if (this.pinController != null) {\n this.registeredInteractionHandler =\n this.viewer?.registerInteractionHandler(\n new PinsInteractionHandler(\n this.pinController,\n parseInt(xOffset),\n parseInt(yOffset)\n )\n );\n }\n }\n\n private clearModelListeners(): void {\n this.onEntitiesChangedHandler?.dispose();\n this.onEntitiesChangedHandler = undefined;\n this.onEntityAddedHandler?.dispose();\n this.onEntityAddedHandler = undefined;\n this.resizeObserver?.disconnect();\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private setDepthBuffers(): void {\n if (\n this.pins.length > 0 &&\n this.viewer != null &&\n this.viewer.depthBuffers == null\n ) {\n this.stateMap.shouldClearDepthBuffers = true;\n this.viewer.depthBuffers = 'final';\n }\n }\n\n private resetDepthBuffers(): void {\n if (this.stateMap.shouldClearDepthBuffers && this.viewer != null) {\n this.viewer.depthBuffers = undefined;\n this.stateMap.shouldClearDepthBuffers = undefined;\n }\n }\n\n private setFeatureMaps(): void {\n if (\n (this.pins.length > 0 || this.mode === 'edit') &&\n this.viewer != null &&\n this.viewer.featureMaps == null\n ) {\n this.stateMap.shouldClearFeatureMaps = true;\n this.viewer.featureMaps = 'final';\n }\n }\n\n private resetFeatureMaps(): void {\n if (this.stateMap.shouldClearFeatureMaps && this.viewer != null) {\n this.viewer.featureMaps = undefined;\n this.stateMap.shouldClearFeatureMaps = undefined;\n }\n }\n}\n"]}
1
+ {"version":3,"file":"viewer-pin-tool.js","sourceRoot":"","sources":["../../../../../src/components/viewer-pin-tool/viewer-pin-tool.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Matrix4 } from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\n\nimport { PinController } from '../../lib/pins/controller';\nimport { PinsInteractionHandler } from '../../lib/pins/interactions';\nimport {\n Pin,\n PinModel,\n ViewerPinToolMode,\n ViewerPinToolType,\n} from '../../lib/pins/model';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\n\ninterface StateMap {\n shouldClearDepthBuffers?: boolean;\n shouldClearFeatureMaps?: boolean;\n}\n\n@Component({\n tag: 'vertex-viewer-pin-tool',\n styleUrl: 'viewer-pin-tool.css',\n shadow: true,\n})\nexport class ViewerPinTool {\n /**\n * The controller that is responsible for drawing pins and updating the model\n */\n @Prop({ mutable: true })\n public pinController?: PinController;\n\n /**\n * The model that contains the entities and outcomes from performing pin annotations\n */\n @Prop()\n public pinModel: PinModel = new PinModel();\n\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The type of pin.\n *\n * This property will automatically be set.\n */\n @Prop({ mutable: true })\n public tool: ViewerPinToolType = 'pin-icon';\n\n /**\n * The mode of the pin tool\n */\n @Prop({ mutable: true })\n public mode: ViewerPinToolMode = 'view';\n\n /**\n * The primary color for new pins. Setting this will override the primary template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to pin anchors, and borders, etc.\n */\n @Prop({ mutable: true })\n public primaryColor: Color.Color | string | undefined;\n\n /**\n * The accent color for new pins. Setting this will override the accent template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to some background colors, etc\n */\n @Prop({ mutable: true })\n public accentColor: Color.Color | string | undefined;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private pins: Pin[] = [];\n\n @State()\n private selectedPinId?: string;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private projectionViewMatrix?: Matrix4.Matrix4;\n\n private registeredInteractionHandler?: Promise<Disposable>;\n private onEntitiesChangedHandler?: Disposable;\n private onEntityAddedHandler?: Disposable;\n\n private resizeObserver?: ResizeObserver;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected watchModeChange(): void {\n this.pinController?.setToolMode(this.mode);\n this.setupInteractionHandler();\n\n if (this.mode === 'edit') {\n this.setFeatureMaps();\n } else {\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('tool')\n protected watchTypeChange(): void {\n this.pinController?.setToolType(this.tool);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('accentColor')\n protected watchAccentColorChange(): void {\n this.pinController?.setAccentColor(this.accentColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('primaryColor')\n protected watchPrimaryColorChange(): void {\n this.pinController?.setPrimaryColor(this.primaryColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('pins')\n protected watchPinsChange(): void {\n if (this.pins.length > 0) {\n this.setDepthBuffers();\n this.setFeatureMaps();\n } else {\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.setupController();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n this.pinModel.onEntitiesChanged((entities) => {\n this.pins = entities;\n });\n\n this.pinModel.onSelectionChange((selectedId) => {\n this.selectedPinId = selectedId;\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n }\n\n protected componentDidLoad(): void {\n this.resizeObserver = new ResizeObserver(() => this.updateViewport());\n this.resizeObserver.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.clearModelListeners();\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n if (oldViewer != null) {\n oldViewer.removeEventListener(\n 'frameDrawn',\n this.handleSetProjectionMatrix\n );\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleSetProjectionMatrix);\n }\n\n this.handleSetProjectionMatrix();\n }\n\n private handleSetProjectionMatrix = (): void => {\n this.projectionViewMatrix =\n this.viewer?.frame?.scene.camera.projectionViewMatrix;\n };\n\n protected render(): JSX.Element {\n return (\n <Host>\n <vertex-viewer-dom-renderer viewer={this.viewer} drawMode=\"2d\">\n {this.pins.map((pin) => {\n return (\n <vertex-viewer-pin-group\n id={`pin-group-${pin.id}`}\n data-is-dom-group-element={true}\n pin={pin}\n elementBounds={this.elementBounds}\n pinModel={this.pinModel}\n pinController={this.pinController}\n projectionViewMatrix={this.projectionViewMatrix}\n selected={this.selectedPinId === pin.id}\n ></vertex-viewer-pin-group>\n );\n })}\n </vertex-viewer-dom-renderer>\n </Host>\n );\n }\n\n private setupController(): void {\n const attributes =\n this.accentColor || this.primaryColor\n ? {\n accentColor: this.accentColor,\n primaryColor: this.primaryColor,\n }\n : undefined;\n this.pinController = new PinController(\n this.pinModel,\n this.mode,\n this.tool,\n attributes\n );\n }\n\n private clearInteractionHandler(): void {\n this.registeredInteractionHandler?.then((handler) => handler.dispose());\n this.registeredInteractionHandler = undefined;\n }\n\n private setupInteractionHandler(): void {\n const hostStyles = window.getComputedStyle(this.hostEl);\n\n const xOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-x')\n .trim();\n const xOffsetAsNumber = Number.isFinite(Number.parseInt(xOffset))\n ? Number.parseInt(xOffset)\n : 20;\n\n const yOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-y')\n .trim();\n const yOffsetAsNumber = Number.isFinite(Number.parseInt(yOffset))\n ? Number.parseInt(yOffset)\n : 20;\n\n this.clearInteractionHandler();\n\n if (this.pinController != null) {\n this.registeredInteractionHandler =\n this.viewer?.registerInteractionHandler(\n new PinsInteractionHandler(\n this.pinController,\n xOffsetAsNumber,\n yOffsetAsNumber\n )\n );\n }\n }\n\n private clearModelListeners(): void {\n this.onEntitiesChangedHandler?.dispose();\n this.onEntitiesChangedHandler = undefined;\n this.onEntityAddedHandler?.dispose();\n this.onEntityAddedHandler = undefined;\n this.resizeObserver?.disconnect();\n }\n\n private updateViewport(): void {\n this.elementBounds = getMarkupBoundingClientRect(this.hostEl);\n }\n\n private setDepthBuffers(): void {\n if (\n this.pins.length > 0 &&\n this.viewer != null &&\n this.viewer.depthBuffers == null\n ) {\n this.stateMap.shouldClearDepthBuffers = true;\n this.viewer.depthBuffers = 'final';\n }\n }\n\n private resetDepthBuffers(): void {\n if (this.stateMap.shouldClearDepthBuffers && this.viewer != null) {\n this.viewer.depthBuffers = undefined;\n this.stateMap.shouldClearDepthBuffers = undefined;\n }\n }\n\n private setFeatureMaps(): void {\n if (\n (this.pins.length > 0 || this.mode === 'edit') &&\n this.viewer != null &&\n this.viewer.featureMaps == null\n ) {\n this.stateMap.shouldClearFeatureMaps = true;\n this.viewer.featureMaps = 'final';\n }\n }\n\n private resetFeatureMaps(): void {\n if (this.stateMap.shouldClearFeatureMaps && this.viewer != null) {\n this.viewer.featureMaps = undefined;\n this.stateMap.shouldClearFeatureMaps = undefined;\n }\n }\n}\n"]}
@@ -26,6 +26,7 @@ export class PinModel {
26
26
  constructor() {
27
27
  this.entities = {};
28
28
  this.entityAdded = new EventDispatcher();
29
+ this.entityUpdated = new EventDispatcher();
29
30
  this.entitiesChanged = new EventDispatcher();
30
31
  this.selectionChanged = new EventDispatcher();
31
32
  }
@@ -113,16 +114,17 @@ export class PinModel {
113
114
  return true;
114
115
  }
115
116
  /**
116
- * Sets the set of entities to be placed with the model.
117
+ * Updates a pin in the model.
117
118
  *
118
- * @param pin A pin to set
119
- * @returns `true` if the entity has been set
119
+ * @param pin A pin to update
120
+ * @returns `true` if the entity has been updated
120
121
  */
121
122
  updatePin(pin) {
122
123
  const pinById = this.getPinById(pin.id);
123
124
  if (pinById != null) {
124
125
  this.entities = Object.assign(Object.assign({}, this.entities), { [pin.id]: pin });
125
126
  this.entitiesChanged.emit(this.getPins());
127
+ this.entityUpdated.emit(pin);
126
128
  return true;
127
129
  }
128
130
  return false;
@@ -147,6 +149,16 @@ export class PinModel {
147
149
  onEntityAdded(listener) {
148
150
  return this.entityAdded.on(listener);
149
151
  }
152
+ /**
153
+ * Registers an event listener that will be invoked when a pin
154
+ * is updated in the model.
155
+ *
156
+ * @param listener The listener to add.
157
+ * @returns A disposable that can be used to remove the listener.
158
+ */
159
+ onEntityUpdated(listener) {
160
+ return this.entityUpdated.on(listener);
161
+ }
150
162
  /**
151
163
  * Registers an event listener that will be invoked when the model's
152
164
  * pin selection changes
@@ -158,7 +170,7 @@ export class PinModel {
158
170
  return this.selectionChanged.on(listener);
159
171
  }
160
172
  /**
161
- * Sets the selected pin Id
173
+ * Sets the selected pin id
162
174
  * @param pinId
163
175
  */
164
176
  setSelectedPin(pinId) {
@@ -1 +1 @@
1
- {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../../src/lib/pins/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Color, Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\n/**\n * The types of pins that can be performed by this tool.\n */\nexport type ViewerPinToolType = 'pin-icon' | 'pin-text';\n\n/**\n * The mode of the pin tool\n */\nexport type ViewerPinToolMode = 'edit' | 'view';\n\n/**\n * A model representing the state of pins.\n *\n */\n\nimport { Point, Vector3 } from '@vertexvis/geometry';\n\ninterface BasePinAttributes {\n style?: PinStyleAttributes;\n}\n\ninterface BasePin {\n id: string;\n worldPosition: Vector3.Vector3;\n partId?: string;\n attributes?: BasePinAttributes;\n}\n\nexport interface TextPin extends BasePin {\n type: 'text';\n label: PinLabel;\n}\n\n// Future: Support custom icons.\nexport interface IconPin extends BasePin {\n type: 'icon';\n}\n\nexport type Pin = IconPin | TextPin;\n\nexport interface PinLabel {\n point: Point.Point;\n text?: string;\n}\n\nexport function isTextPin(pin?: Pin): pin is TextPin {\n return pin?.type === 'text';\n}\n\nexport interface PinStyleAttributes {\n primaryColor?: Color.Color | string;\n accentColor?: Color.Color | string;\n}\n\nexport function isIconPin(pin?: Pin): pin is Pin {\n return pin?.type === 'icon';\n}\n\nfunction convertColorToString(color: Color.Color | string): string {\n return typeof color === 'string' ? color : Color.toHexString(color);\n}\nexport function getPinColors(pin?: Pin): {\n primaryColor?: string;\n accentColor?: string;\n} {\n return {\n primaryColor:\n pin?.attributes?.style?.primaryColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.primaryColor),\n accentColor:\n pin?.attributes?.style?.accentColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.accentColor),\n };\n}\n\nexport class PinModel {\n private entities: Record<string, Pin> = {};\n private selectedPinId?: string;\n\n private entityAdded = new EventDispatcher<Pin>();\n private entitiesChanged = new EventDispatcher<Pin[]>();\n private selectionChanged = new EventDispatcher<string | undefined>();\n\n /**\n * Registers an entity to be drawn in the canvas\n *\n * @param pin A pin entity to draw.\n * @returns `true` if the entity has been added.\n */\n public addPin(pin: Pin, suppressEvent = false): boolean {\n if (this.entities[pin.id] == null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n if (!suppressEvent) {\n this.entitiesChanged.emit(this.getPins());\n this.entityAdded.emit(pin);\n }\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Clears all registered entities from the model.\n */\n public clearPins(): void {\n this.getPins().forEach((e) => this.removePin(e));\n }\n\n /**\n * Returns all the entities registered with the model.\n */\n public getPins(): Pin[] {\n return Object.keys(this.entities).map((key) => this.entities[key]);\n }\n\n /**\n * Returns single entity by id if present in the model.\n */\n public getPinById(id: string): Pin | undefined {\n return this.entities[id];\n }\n\n public getSelectedPinId(): string | undefined {\n return this.selectedPinId;\n }\n\n /**\n * Unregisters an entity from the model.\n *\n * @param entity The entity to remove.\n * @returns `true` if the entity was removed.\n */\n public removePin(entity: Pin): boolean {\n if (this.entities[entity.id] != null) {\n delete this.entities[entity.id];\n this.entitiesChanged.emit(this.getPins());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param entities A set of entities to draw.\n * @returns `true` if the entity has been added.\n */\n public setPins(pins: Set<Pin>): boolean {\n this.clearPins();\n pins.forEach((e) => this.addPin(e, true));\n this.entitiesChanged.emit(this.getPins());\n\n return true;\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been set\n */\n public setPin(pin: Pin): boolean {\n const isNewPin = this.entities[pin.id] == null;\n\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n this.entitiesChanged.emit(this.getPins());\n if (isNewPin) {\n this.entityAdded.emit(pin);\n }\n\n return true;\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been set\n */\n public updatePin(pin: Pin): boolean {\n const pinById = this.getPinById(pin.id);\n if (pinById != null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n this.entitiesChanged.emit(this.getPins());\n\n return true;\n }\n return false;\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin entities change.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntitiesChanged(listener: Listener<Pin[]>): Disposable {\n return this.entitiesChanged.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a new pin\n * is added to the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityAdded(listener: Listener<Pin>): Disposable {\n return this.entityAdded.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin selection changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onSelectionChange(listener: Listener<string | undefined>): Disposable {\n return this.selectionChanged.on(listener);\n }\n\n /**\n * Sets the selected pin Id\n * @param pinId\n */\n public setSelectedPin(pinId?: string): void {\n this.selectedPinId = pinId;\n this.selectionChanged.emit(this.selectedPinId);\n }\n}\n"]}
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../../../src/lib/pins/model.ts"],"names":[],"mappings":"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","sourcesContent":["import { Color, Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\n/**\n * The types of pins that can be performed by this tool.\n */\nexport type ViewerPinToolType = 'pin-icon' | 'pin-text';\n\n/**\n * The mode of the pin tool\n */\nexport type ViewerPinToolMode = 'edit' | 'view';\n\n/**\n * A model representing the state of pins.\n *\n */\n\nimport { Point, Vector3 } from '@vertexvis/geometry';\n\ninterface BasePinAttributes {\n style?: PinStyleAttributes;\n}\n\ninterface BasePin {\n id: string;\n worldPosition: Vector3.Vector3;\n partId?: string;\n attributes?: BasePinAttributes;\n}\n\nexport interface TextPin extends BasePin {\n type: 'text';\n label: PinLabel;\n}\n\n// Future: Support custom icons.\nexport interface IconPin extends BasePin {\n type: 'icon';\n}\n\nexport type Pin = IconPin | TextPin;\n\nexport interface PinLabel {\n point: Point.Point;\n text?: string;\n}\n\nexport function isTextPin(pin?: Pin): pin is TextPin {\n return pin?.type === 'text';\n}\n\nexport interface PinStyleAttributes {\n primaryColor?: Color.Color | string;\n accentColor?: Color.Color | string;\n}\n\nexport function isIconPin(pin?: Pin): pin is Pin {\n return pin?.type === 'icon';\n}\n\nfunction convertColorToString(color: Color.Color | string): string {\n return typeof color === 'string' ? color : Color.toHexString(color);\n}\nexport function getPinColors(pin?: Pin): {\n primaryColor?: string;\n accentColor?: string;\n} {\n return {\n primaryColor:\n pin?.attributes?.style?.primaryColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.primaryColor),\n accentColor:\n pin?.attributes?.style?.accentColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.accentColor),\n };\n}\n\nexport class PinModel {\n private entities: Record<string, Pin> = {};\n private selectedPinId?: string;\n\n private readonly entityAdded = new EventDispatcher<Pin>();\n private readonly entityUpdated = new EventDispatcher<Pin>();\n private readonly entitiesChanged = new EventDispatcher<Pin[]>();\n private readonly selectionChanged = new EventDispatcher<string | undefined>();\n\n /**\n * Registers an entity to be drawn in the canvas\n *\n * @param pin A pin entity to draw.\n * @returns `true` if the entity has been added.\n */\n public addPin(pin: Pin, suppressEvent = false): boolean {\n if (this.entities[pin.id] == null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n if (!suppressEvent) {\n this.entitiesChanged.emit(this.getPins());\n this.entityAdded.emit(pin);\n }\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Clears all registered entities from the model.\n */\n public clearPins(): void {\n this.getPins().forEach((e) => this.removePin(e));\n }\n\n /**\n * Returns all the entities registered with the model.\n */\n public getPins(): Pin[] {\n return Object.keys(this.entities).map((key) => this.entities[key]);\n }\n\n /**\n * Returns single entity by id if present in the model.\n */\n public getPinById(id: string): Pin | undefined {\n return this.entities[id];\n }\n\n public getSelectedPinId(): string | undefined {\n return this.selectedPinId;\n }\n\n /**\n * Unregisters an entity from the model.\n *\n * @param entity The entity to remove.\n * @returns `true` if the entity was removed.\n */\n public removePin(entity: Pin): boolean {\n if (this.entities[entity.id] != null) {\n delete this.entities[entity.id];\n this.entitiesChanged.emit(this.getPins());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param entities A set of entities to draw.\n * @returns `true` if the entity has been added.\n */\n public setPins(pins: Set<Pin>): boolean {\n this.clearPins();\n pins.forEach((e) => this.addPin(e, true));\n this.entitiesChanged.emit(this.getPins());\n\n return true;\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been set\n */\n public setPin(pin: Pin): boolean {\n const isNewPin = this.entities[pin.id] == null;\n\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n this.entitiesChanged.emit(this.getPins());\n if (isNewPin) {\n this.entityAdded.emit(pin);\n }\n\n return true;\n }\n\n /**\n * Updates a pin in the model.\n *\n * @param pin A pin to update\n * @returns `true` if the entity has been updated\n */\n public updatePin(pin: Pin): boolean {\n const pinById = this.getPinById(pin.id);\n if (pinById != null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n this.entitiesChanged.emit(this.getPins());\n this.entityUpdated.emit(pin);\n\n return true;\n }\n return false;\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin entities change.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntitiesChanged(listener: Listener<Pin[]>): Disposable {\n return this.entitiesChanged.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a new pin\n * is added to the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityAdded(listener: Listener<Pin>): Disposable {\n return this.entityAdded.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a pin\n * is updated in the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityUpdated(listener: Listener<Pin>): Disposable {\n return this.entityUpdated.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin selection changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onSelectionChange(listener: Listener<string | undefined>): Disposable {\n return this.selectionChanged.on(listener);\n }\n\n /**\n * Sets the selected pin id\n * @param pinId\n */\n public setSelectedPin(pinId?: string): void {\n this.selectedPinId = pinId;\n this.selectionChanged.emit(this.selectedPinId);\n }\n}\n"]}
@@ -27,6 +27,7 @@ class PinModel {
27
27
  constructor() {
28
28
  this.entities = {};
29
29
  this.entityAdded = new EventDispatcher();
30
+ this.entityUpdated = new EventDispatcher();
30
31
  this.entitiesChanged = new EventDispatcher();
31
32
  this.selectionChanged = new EventDispatcher();
32
33
  }
@@ -114,16 +115,17 @@ class PinModel {
114
115
  return true;
115
116
  }
116
117
  /**
117
- * Sets the set of entities to be placed with the model.
118
+ * Updates a pin in the model.
118
119
  *
119
- * @param pin A pin to set
120
- * @returns `true` if the entity has been set
120
+ * @param pin A pin to update
121
+ * @returns `true` if the entity has been updated
121
122
  */
122
123
  updatePin(pin) {
123
124
  const pinById = this.getPinById(pin.id);
124
125
  if (pinById != null) {
125
126
  this.entities = Object.assign(Object.assign({}, this.entities), { [pin.id]: pin });
126
127
  this.entitiesChanged.emit(this.getPins());
128
+ this.entityUpdated.emit(pin);
127
129
  return true;
128
130
  }
129
131
  return false;
@@ -148,6 +150,16 @@ class PinModel {
148
150
  onEntityAdded(listener) {
149
151
  return this.entityAdded.on(listener);
150
152
  }
153
+ /**
154
+ * Registers an event listener that will be invoked when a pin
155
+ * is updated in the model.
156
+ *
157
+ * @param listener The listener to add.
158
+ * @returns A disposable that can be used to remove the listener.
159
+ */
160
+ onEntityUpdated(listener) {
161
+ return this.entityUpdated.on(listener);
162
+ }
151
163
  /**
152
164
  * Registers an event listener that will be invoked when the model's
153
165
  * pin selection changes
@@ -159,7 +171,7 @@ class PinModel {
159
171
  return this.selectionChanged.on(listener);
160
172
  }
161
173
  /**
162
- * Sets the selected pin Id
174
+ * Sets the selected pin id
163
175
  * @param pinId
164
176
  */
165
177
  setSelectedPin(pinId) {
@@ -1 +1 @@
1
- {"file":"model3.js","mappings":"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","names":["color","Color"],"sources":["./src/lib/pins/model.ts"],"sourcesContent":["import { Color, Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\n/**\n * The types of pins that can be performed by this tool.\n */\nexport type ViewerPinToolType = 'pin-icon' | 'pin-text';\n\n/**\n * The mode of the pin tool\n */\nexport type ViewerPinToolMode = 'edit' | 'view';\n\n/**\n * A model representing the state of pins.\n *\n */\n\nimport { Point, Vector3 } from '@vertexvis/geometry';\n\ninterface BasePinAttributes {\n style?: PinStyleAttributes;\n}\n\ninterface BasePin {\n id: string;\n worldPosition: Vector3.Vector3;\n partId?: string;\n attributes?: BasePinAttributes;\n}\n\nexport interface TextPin extends BasePin {\n type: 'text';\n label: PinLabel;\n}\n\n// Future: Support custom icons.\nexport interface IconPin extends BasePin {\n type: 'icon';\n}\n\nexport type Pin = IconPin | TextPin;\n\nexport interface PinLabel {\n point: Point.Point;\n text?: string;\n}\n\nexport function isTextPin(pin?: Pin): pin is TextPin {\n return pin?.type === 'text';\n}\n\nexport interface PinStyleAttributes {\n primaryColor?: Color.Color | string;\n accentColor?: Color.Color | string;\n}\n\nexport function isIconPin(pin?: Pin): pin is Pin {\n return pin?.type === 'icon';\n}\n\nfunction convertColorToString(color: Color.Color | string): string {\n return typeof color === 'string' ? color : Color.toHexString(color);\n}\nexport function getPinColors(pin?: Pin): {\n primaryColor?: string;\n accentColor?: string;\n} {\n return {\n primaryColor:\n pin?.attributes?.style?.primaryColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.primaryColor),\n accentColor:\n pin?.attributes?.style?.accentColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.accentColor),\n };\n}\n\nexport class PinModel {\n private entities: Record<string, Pin> = {};\n private selectedPinId?: string;\n\n private entityAdded = new EventDispatcher<Pin>();\n private entitiesChanged = new EventDispatcher<Pin[]>();\n private selectionChanged = new EventDispatcher<string | undefined>();\n\n /**\n * Registers an entity to be drawn in the canvas\n *\n * @param pin A pin entity to draw.\n * @returns `true` if the entity has been added.\n */\n public addPin(pin: Pin, suppressEvent = false): boolean {\n if (this.entities[pin.id] == null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n if (!suppressEvent) {\n this.entitiesChanged.emit(this.getPins());\n this.entityAdded.emit(pin);\n }\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Clears all registered entities from the model.\n */\n public clearPins(): void {\n this.getPins().forEach((e) => this.removePin(e));\n }\n\n /**\n * Returns all the entities registered with the model.\n */\n public getPins(): Pin[] {\n return Object.keys(this.entities).map((key) => this.entities[key]);\n }\n\n /**\n * Returns single entity by id if present in the model.\n */\n public getPinById(id: string): Pin | undefined {\n return this.entities[id];\n }\n\n public getSelectedPinId(): string | undefined {\n return this.selectedPinId;\n }\n\n /**\n * Unregisters an entity from the model.\n *\n * @param entity The entity to remove.\n * @returns `true` if the entity was removed.\n */\n public removePin(entity: Pin): boolean {\n if (this.entities[entity.id] != null) {\n delete this.entities[entity.id];\n this.entitiesChanged.emit(this.getPins());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param entities A set of entities to draw.\n * @returns `true` if the entity has been added.\n */\n public setPins(pins: Set<Pin>): boolean {\n this.clearPins();\n pins.forEach((e) => this.addPin(e, true));\n this.entitiesChanged.emit(this.getPins());\n\n return true;\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been set\n */\n public setPin(pin: Pin): boolean {\n const isNewPin = this.entities[pin.id] == null;\n\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n this.entitiesChanged.emit(this.getPins());\n if (isNewPin) {\n this.entityAdded.emit(pin);\n }\n\n return true;\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been set\n */\n public updatePin(pin: Pin): boolean {\n const pinById = this.getPinById(pin.id);\n if (pinById != null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n this.entitiesChanged.emit(this.getPins());\n\n return true;\n }\n return false;\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin entities change.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntitiesChanged(listener: Listener<Pin[]>): Disposable {\n return this.entitiesChanged.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a new pin\n * is added to the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityAdded(listener: Listener<Pin>): Disposable {\n return this.entityAdded.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin selection changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onSelectionChange(listener: Listener<string | undefined>): Disposable {\n return this.selectionChanged.on(listener);\n }\n\n /**\n * Sets the selected pin Id\n * @param pinId\n */\n public setSelectedPin(pinId?: string): void {\n this.selectedPinId = pinId;\n this.selectionChanged.emit(this.selectedPinId);\n }\n}\n"],"version":3}
1
+ {"file":"model3.js","mappings":"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","names":["color","Color"],"sources":["./src/lib/pins/model.ts"],"sourcesContent":["import { Color, Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\n/**\n * The types of pins that can be performed by this tool.\n */\nexport type ViewerPinToolType = 'pin-icon' | 'pin-text';\n\n/**\n * The mode of the pin tool\n */\nexport type ViewerPinToolMode = 'edit' | 'view';\n\n/**\n * A model representing the state of pins.\n *\n */\n\nimport { Point, Vector3 } from '@vertexvis/geometry';\n\ninterface BasePinAttributes {\n style?: PinStyleAttributes;\n}\n\ninterface BasePin {\n id: string;\n worldPosition: Vector3.Vector3;\n partId?: string;\n attributes?: BasePinAttributes;\n}\n\nexport interface TextPin extends BasePin {\n type: 'text';\n label: PinLabel;\n}\n\n// Future: Support custom icons.\nexport interface IconPin extends BasePin {\n type: 'icon';\n}\n\nexport type Pin = IconPin | TextPin;\n\nexport interface PinLabel {\n point: Point.Point;\n text?: string;\n}\n\nexport function isTextPin(pin?: Pin): pin is TextPin {\n return pin?.type === 'text';\n}\n\nexport interface PinStyleAttributes {\n primaryColor?: Color.Color | string;\n accentColor?: Color.Color | string;\n}\n\nexport function isIconPin(pin?: Pin): pin is Pin {\n return pin?.type === 'icon';\n}\n\nfunction convertColorToString(color: Color.Color | string): string {\n return typeof color === 'string' ? color : Color.toHexString(color);\n}\nexport function getPinColors(pin?: Pin): {\n primaryColor?: string;\n accentColor?: string;\n} {\n return {\n primaryColor:\n pin?.attributes?.style?.primaryColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.primaryColor),\n accentColor:\n pin?.attributes?.style?.accentColor == null\n ? undefined\n : convertColorToString(pin?.attributes?.style?.accentColor),\n };\n}\n\nexport class PinModel {\n private entities: Record<string, Pin> = {};\n private selectedPinId?: string;\n\n private readonly entityAdded = new EventDispatcher<Pin>();\n private readonly entityUpdated = new EventDispatcher<Pin>();\n private readonly entitiesChanged = new EventDispatcher<Pin[]>();\n private readonly selectionChanged = new EventDispatcher<string | undefined>();\n\n /**\n * Registers an entity to be drawn in the canvas\n *\n * @param pin A pin entity to draw.\n * @returns `true` if the entity has been added.\n */\n public addPin(pin: Pin, suppressEvent = false): boolean {\n if (this.entities[pin.id] == null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n if (!suppressEvent) {\n this.entitiesChanged.emit(this.getPins());\n this.entityAdded.emit(pin);\n }\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Clears all registered entities from the model.\n */\n public clearPins(): void {\n this.getPins().forEach((e) => this.removePin(e));\n }\n\n /**\n * Returns all the entities registered with the model.\n */\n public getPins(): Pin[] {\n return Object.keys(this.entities).map((key) => this.entities[key]);\n }\n\n /**\n * Returns single entity by id if present in the model.\n */\n public getPinById(id: string): Pin | undefined {\n return this.entities[id];\n }\n\n public getSelectedPinId(): string | undefined {\n return this.selectedPinId;\n }\n\n /**\n * Unregisters an entity from the model.\n *\n * @param entity The entity to remove.\n * @returns `true` if the entity was removed.\n */\n public removePin(entity: Pin): boolean {\n if (this.entities[entity.id] != null) {\n delete this.entities[entity.id];\n this.entitiesChanged.emit(this.getPins());\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param entities A set of entities to draw.\n * @returns `true` if the entity has been added.\n */\n public setPins(pins: Set<Pin>): boolean {\n this.clearPins();\n pins.forEach((e) => this.addPin(e, true));\n this.entitiesChanged.emit(this.getPins());\n\n return true;\n }\n\n /**\n * Sets the set of entities to be placed with the model.\n *\n * @param pin A pin to set\n * @returns `true` if the entity has been set\n */\n public setPin(pin: Pin): boolean {\n const isNewPin = this.entities[pin.id] == null;\n\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n\n this.entitiesChanged.emit(this.getPins());\n if (isNewPin) {\n this.entityAdded.emit(pin);\n }\n\n return true;\n }\n\n /**\n * Updates a pin in the model.\n *\n * @param pin A pin to update\n * @returns `true` if the entity has been updated\n */\n public updatePin(pin: Pin): boolean {\n const pinById = this.getPinById(pin.id);\n if (pinById != null) {\n this.entities = {\n ...this.entities,\n [pin.id]: pin,\n };\n this.entitiesChanged.emit(this.getPins());\n this.entityUpdated.emit(pin);\n\n return true;\n }\n return false;\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin entities change.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntitiesChanged(listener: Listener<Pin[]>): Disposable {\n return this.entitiesChanged.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a new pin\n * is added to the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityAdded(listener: Listener<Pin>): Disposable {\n return this.entityAdded.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when a pin\n * is updated in the model.\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onEntityUpdated(listener: Listener<Pin>): Disposable {\n return this.entityUpdated.on(listener);\n }\n\n /**\n * Registers an event listener that will be invoked when the model's\n * pin selection changes\n *\n * @param listener The listener to add.\n * @returns A disposable that can be used to remove the listener.\n */\n public onSelectionChange(listener: Listener<string | undefined>): Disposable {\n return this.selectionChanged.on(listener);\n }\n\n /**\n * Sets the selected pin id\n * @param pinId\n */\n public setSelectedPin(pinId?: string): void {\n this.selectedPinId = pinId;\n this.selectionChanged.emit(this.selectedPinId);\n }\n}\n"],"version":3}
@@ -365,13 +365,19 @@ const ViewerPinTool = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement
365
365
  const xOffset = hostStyles
366
366
  .getPropertyValue('--viewer-pin-tool-initial-label-offset-x')
367
367
  .trim();
368
+ const xOffsetAsNumber = Number.isFinite(Number.parseInt(xOffset))
369
+ ? Number.parseInt(xOffset)
370
+ : 20;
368
371
  const yOffset = hostStyles
369
372
  .getPropertyValue('--viewer-pin-tool-initial-label-offset-y')
370
373
  .trim();
374
+ const yOffsetAsNumber = Number.isFinite(Number.parseInt(yOffset))
375
+ ? Number.parseInt(yOffset)
376
+ : 20;
371
377
  this.clearInteractionHandler();
372
378
  if (this.pinController != null) {
373
379
  this.registeredInteractionHandler =
374
- (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.registerInteractionHandler(new PinsInteractionHandler(this.pinController, parseInt(xOffset), parseInt(yOffset)));
380
+ (_a = this.viewer) === null || _a === void 0 ? void 0 : _a.registerInteractionHandler(new PinsInteractionHandler(this.pinController, xOffsetAsNumber, yOffsetAsNumber));
375
381
  }
376
382
  }
377
383
  clearModelListeners() {
@@ -383,8 +389,7 @@ const ViewerPinTool = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement
383
389
  (_c = this.resizeObserver) === null || _c === void 0 ? void 0 : _c.disconnect();
384
390
  }
385
391
  updateViewport() {
386
- const rect = getMarkupBoundingClientRect(this.hostEl);
387
- this.elementBounds = rect;
392
+ this.elementBounds = getMarkupBoundingClientRect(this.hostEl);
388
393
  }
389
394
  setDepthBuffers() {
390
395
  if (this.pins.length > 0 &&
@@ -1 +1 @@
1
- {"file":"vertex-viewer-pin-tool.js","mappings":"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","names":["Point","UUID"],"sources":["./src/lib/pins/interactions.ts","./src/components/viewer-pin-tool/viewer-pin-tool.css?tag=vertex-viewer-pin-tool&encapsulation=shadow","./src/components/viewer-pin-tool/viewer-pin-tool.tsx"],"sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable, UUID } from '@vertexvis/utils';\n\nimport { translatePointToRelative } from '../../components/viewer-pin-tool/utils';\nimport { Cursor, labelPinCursor, pinCursor } from '../cursors';\nimport { getMouseClientPosition } from '../dom';\nimport { ElementRectObserver } from '../elementRectObserver';\nimport { InteractionApi, InteractionHandler } from '../interactions';\nimport { EntityType } from '../types/entities';\nimport { Draggable, PinController } from './controller';\nimport { Pin } from './model';\n\nexport class PinsInteractionHandler implements InteractionHandler {\n private controller: PinController;\n private element?: HTMLElement;\n private api?: InteractionApi;\n\n private cursor?: Disposable;\n\n private xOffset?: number;\n private yOffset?: number;\n\n private rectObserver = new ElementRectObserver();\n\n private droppableSurfaces: EntityType[] = [\n EntityType.PRECISE_SURFACE,\n EntityType.IMPRECISE_SURFACE,\n EntityType.GENERIC_GEOMETRY,\n ];\n\n private get elementRect(): DOMRect | undefined {\n return this.rectObserver.rect;\n }\n\n public constructor(\n controller: PinController,\n xOffset: number,\n yOffset: number\n ) {\n this.controller = controller;\n this.xOffset = xOffset;\n this.yOffset = yOffset;\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n this.rectObserver.observe(element);\n\n element.addEventListener('pointermove', this.handlePointerMove);\n element.addEventListener('pointerdown', this.handlePointerDown);\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n\n public dispose(): void {\n this.rectObserver.disconnect();\n this.clearCursor();\n this.element?.removeEventListener('pointermove', this.handlePointerMove);\n this.element?.removeEventListener('pointerdown', this.handlePointerDown);\n window.removeEventListener('pointerup', this.handlePointerUp);\n\n this.element = undefined;\n this.api = undefined;\n }\n\n public async getWorldPositionForPoint(\n pt: Point.Point\n ): Promise<Vector3.Vector3 | undefined> {\n return this.ifInitialized(async ({ api }) => {\n const vector3 = await api.getWorldPointFromViewport(pt);\n\n return vector3;\n });\n }\n\n public async handlePlacePin(\n pt: Point.Point,\n existingPin?: Pin\n ): Promise<void> {\n this.ifInitialized(async ({ api }) => {\n const [hit] = await api.hitItems(pt);\n\n if (hit?.hitPoint != null && this.elementRect != null) {\n if (\n hit?.hitPoint != null &&\n hit?.hitPoint.x != null &&\n hit?.hitPoint.y != null &&\n hit?.hitPoint.z != null\n ) {\n const pinId = existingPin != null ? existingPin.id : UUID.create();\n\n const attributes =\n this.controller.getStyleAttributes() != null\n ? {\n style: this.controller.getStyleAttributes(),\n }\n : undefined;\n\n switch (this.controller.getToolType()) {\n case 'pin-icon':\n this.controller.setPin({\n type: 'icon',\n id: pinId,\n worldPosition: {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n partId: hit?.itemId?.hex ?? undefined,\n attributes,\n });\n break;\n case 'pin-text':\n const isNewPin = existingPin == null;\n const relativePoint = translatePointToRelative(\n pt,\n this.elementRect,\n isNewPin,\n this.xOffset,\n this.yOffset\n );\n this.controller.setPin({\n type: 'text',\n id: pinId,\n worldPosition: {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n partId: hit?.itemId?.hex ?? undefined,\n label: {\n point: relativePoint,\n },\n attributes,\n });\n this.controller.setSelectedPinId(pinId);\n break;\n }\n }\n } else {\n this.controller.setSelectedPinId();\n }\n });\n }\n\n private handlePointerMove = async (event: PointerEvent): Promise<void> => {\n const isDroppableSurface = await this.isDroppableSurface(event);\n const draggable = this.controller.getDraggable();\n if (draggable != null && isDroppableSurface) {\n this.handleDrag(draggable, event);\n }\n\n if (\n this.controller.getDraggable() == null &&\n this.controller.getToolMode() === 'edit' &&\n isDroppableSurface\n ) {\n this.addCursor(this.getCursorType());\n } else {\n this.clearCursor();\n }\n };\n\n private getCursorType(): Cursor {\n switch (this.controller.getToolType()) {\n case 'pin-icon':\n return pinCursor;\n case 'pin-text':\n return labelPinCursor;\n }\n }\n\n private handleDrag = async (\n draggable: Draggable,\n event: PointerEvent\n ): Promise<void> => {\n const pt = getMouseClientPosition(event, this.elementRect);\n const worldPosition = await this.getWorldPositionForPoint(pt);\n\n if (worldPosition != null) {\n this.controller.updateDraggable(\n {\n ...draggable,\n lastPoint: pt,\n },\n worldPosition\n );\n }\n };\n\n private handlePointerDown = async (\n pointerDown: PointerEvent\n ): Promise<Disposable> => {\n const pointerUp = (pointerUp: PointerEvent): void => {\n const distanceBetweenStartAndEndPoint = Point.distance(\n Point.create(pointerDown.clientX, pointerUp.clientY),\n Point.create(pointerUp.clientX, pointerUp.clientY)\n );\n\n if (distanceBetweenStartAndEndPoint <= 2 && pointerDown.buttons !== 2) {\n if (this.controller.getToolMode() === 'edit') {\n const pt = getMouseClientPosition(pointerDown, this.elementRect);\n\n this.handlePlacePin(pt);\n }\n }\n\n dispose();\n };\n\n const dispose = (): void => {\n window.removeEventListener('pointerup', pointerUp);\n };\n\n window.addEventListener('pointerup', pointerUp);\n\n return {\n dispose,\n };\n };\n\n private handlePointerUp = async (): Promise<void> => {\n const draggable = this.controller.getDraggable();\n const lastPoint = draggable?.lastPoint;\n\n this.controller.setDraggable(undefined);\n\n if (lastPoint != null && draggable != null) {\n this.ifInitialized(async ({ api }) => {\n const [hit] = await api.hitItems(lastPoint);\n\n if (\n hit?.hitPoint != null &&\n hit?.hitPoint?.x != null &&\n hit?.hitPoint?.y != null &&\n hit?.hitPoint?.z != null\n ) {\n this.controller.updateDraggable(\n {\n ...draggable,\n lastPoint,\n },\n {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n hit?.partId?.hex ?? undefined\n );\n }\n });\n }\n };\n\n private addCursor(cursor: Cursor): void {\n this.clearCursor();\n this.cursor = this.ifInitialized(({ api }) => api.addCursor(cursor));\n }\n\n private async isDroppableSurface(event: PointerEvent): Promise<boolean> {\n const pt = getMouseClientPosition(event, this.elementRect);\n const type = await this.api?.getEntityTypeAtPoint(pt);\n\n return type != null && this.droppableSurfaces.includes(type);\n }\n\n protected ifInitialized<R>(\n f: (data: { element: HTMLElement; api: InteractionApi }) => R\n ): R {\n if (this.element != null && this.api != null) {\n return f({ element: this.element, api: this.api });\n } else {\n throw new Error('Pins interaction handler not initialized.');\n }\n }\n\n private clearCursor(): void {\n this.cursor?.dispose();\n this.cursor = undefined;\n }\n}\n",":host {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: hidden;\n pointer-events: none;\n\n /**\n * @prop --viewer-pin-tool-initial-label-offset-x: The number of pixels to offset\n the label in the x direction. Defaults to 20.\n */\n --viewer-pin-tool-initial-label-offset-x: 20;\n\n /**\n * @prop --viewer-pin-tool-initial-label-offset-y: The number of pixels to offset\n the label in the y direction. Defaults to 20.\n */\n --viewer-pin-tool-initial-label-offset-y: 20;\n}\n","import {\n Component,\n Element,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Matrix4 } from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\n\nimport { PinController } from '../../lib/pins/controller';\nimport { PinsInteractionHandler } from '../../lib/pins/interactions';\nimport {\n Pin,\n PinModel,\n ViewerPinToolMode,\n ViewerPinToolType,\n} from '../../lib/pins/model';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\n\ninterface StateMap {\n shouldClearDepthBuffers?: boolean;\n shouldClearFeatureMaps?: boolean;\n}\n\n@Component({\n tag: 'vertex-viewer-pin-tool',\n styleUrl: 'viewer-pin-tool.css',\n shadow: true,\n})\nexport class ViewerPinTool {\n /**\n * The controller that is responsible for drawing pins and updating the model\n */\n @Prop({ mutable: true })\n public pinController?: PinController;\n\n /**\n * The model that contains the entities and outcomes from performing pin annotations\n */\n @Prop()\n public pinModel: PinModel = new PinModel();\n\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The type of pin.\n *\n * This property will automatically be set.\n */\n @Prop({ mutable: true })\n public tool: ViewerPinToolType = 'pin-icon';\n\n /**\n * The mode of the pin tool\n */\n @Prop({ mutable: true })\n public mode: ViewerPinToolMode = 'view';\n\n /**\n * The primary color for new pins. Setting this will override the primary template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to pin anchors, and borders, etc.\n */\n @Prop({ mutable: true })\n public primaryColor: Color.Color | string | undefined;\n\n /**\n * The accent color for new pins. Setting this will override the accent template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to some background colors, etc\n */\n @Prop({ mutable: true })\n public accentColor: Color.Color | string | undefined;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private pins: Pin[] = [];\n\n @State()\n private selectedPinId?: string;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private projectionViewMatrix?: Matrix4.Matrix4;\n\n private registeredInteractionHandler?: Promise<Disposable>;\n private onEntitiesChangedHandler?: Disposable;\n private onEntityAddedHandler?: Disposable;\n\n private resizeObserver?: ResizeObserver;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected watchModeChange(): void {\n this.pinController?.setToolMode(this.mode);\n this.setupInteractionHandler();\n\n if (this.mode === 'edit') {\n this.setFeatureMaps();\n } else {\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('tool')\n protected watchTypeChange(): void {\n this.pinController?.setToolType(this.tool);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('accentColor')\n protected watchAccentColorChange(): void {\n this.pinController?.setAccentColor(this.accentColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('primaryColor')\n protected watchPrimaryColorChange(): void {\n this.pinController?.setPrimaryColor(this.primaryColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('pins')\n protected watchPinsChange(): void {\n if (this.pins.length > 0) {\n this.setDepthBuffers();\n this.setFeatureMaps();\n } else {\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.setupController();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n this.pinModel.onEntitiesChanged((entities) => {\n this.pins = entities;\n });\n\n this.pinModel.onSelectionChange((selectedId) => {\n this.selectedPinId = selectedId;\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n }\n\n protected componentDidLoad(): void {\n this.resizeObserver = new ResizeObserver(() => this.updateViewport());\n this.resizeObserver.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.clearModelListeners();\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n if (oldViewer != null) {\n oldViewer.removeEventListener(\n 'frameDrawn',\n this.handleSetProjectionMatrix\n );\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleSetProjectionMatrix);\n }\n\n this.handleSetProjectionMatrix();\n }\n\n private handleSetProjectionMatrix = (): void => {\n this.projectionViewMatrix =\n this.viewer?.frame?.scene.camera.projectionViewMatrix;\n };\n\n protected render(): JSX.Element {\n return (\n <Host>\n <vertex-viewer-dom-renderer viewer={this.viewer} drawMode=\"2d\">\n {this.pins.map((pin) => {\n return (\n <vertex-viewer-pin-group\n id={`pin-group-${pin.id}`}\n data-is-dom-group-element={true}\n pin={pin}\n elementBounds={this.elementBounds}\n pinModel={this.pinModel}\n pinController={this.pinController}\n projectionViewMatrix={this.projectionViewMatrix}\n selected={this.selectedPinId === pin.id}\n ></vertex-viewer-pin-group>\n );\n })}\n </vertex-viewer-dom-renderer>\n </Host>\n );\n }\n\n private setupController(): void {\n const attributes =\n this.accentColor || this.primaryColor\n ? {\n accentColor: this.accentColor,\n primaryColor: this.primaryColor,\n }\n : undefined;\n this.pinController = new PinController(\n this.pinModel,\n this.mode,\n this.tool,\n attributes\n );\n }\n\n private clearInteractionHandler(): void {\n this.registeredInteractionHandler?.then((handler) => handler.dispose());\n this.registeredInteractionHandler = undefined;\n }\n\n private setupInteractionHandler(): void {\n const hostStyles = window.getComputedStyle(this.hostEl);\n const xOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-x')\n .trim();\n const yOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-y')\n .trim();\n\n this.clearInteractionHandler();\n\n if (this.pinController != null) {\n this.registeredInteractionHandler =\n this.viewer?.registerInteractionHandler(\n new PinsInteractionHandler(\n this.pinController,\n parseInt(xOffset),\n parseInt(yOffset)\n )\n );\n }\n }\n\n private clearModelListeners(): void {\n this.onEntitiesChangedHandler?.dispose();\n this.onEntitiesChangedHandler = undefined;\n this.onEntityAddedHandler?.dispose();\n this.onEntityAddedHandler = undefined;\n this.resizeObserver?.disconnect();\n }\n\n private updateViewport(): void {\n const rect = getMarkupBoundingClientRect(this.hostEl);\n this.elementBounds = rect;\n }\n\n private setDepthBuffers(): void {\n if (\n this.pins.length > 0 &&\n this.viewer != null &&\n this.viewer.depthBuffers == null\n ) {\n this.stateMap.shouldClearDepthBuffers = true;\n this.viewer.depthBuffers = 'final';\n }\n }\n\n private resetDepthBuffers(): void {\n if (this.stateMap.shouldClearDepthBuffers && this.viewer != null) {\n this.viewer.depthBuffers = undefined;\n this.stateMap.shouldClearDepthBuffers = undefined;\n }\n }\n\n private setFeatureMaps(): void {\n if (\n (this.pins.length > 0 || this.mode === 'edit') &&\n this.viewer != null &&\n this.viewer.featureMaps == null\n ) {\n this.stateMap.shouldClearFeatureMaps = true;\n this.viewer.featureMaps = 'final';\n }\n }\n\n private resetFeatureMaps(): void {\n if (this.stateMap.shouldClearFeatureMaps && this.viewer != null) {\n this.viewer.featureMaps = undefined;\n this.stateMap.shouldClearFeatureMaps = undefined;\n }\n }\n}\n"],"version":3}
1
+ {"file":"vertex-viewer-pin-tool.js","mappings":"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","names":["Point","UUID"],"sources":["./src/lib/pins/interactions.ts","./src/components/viewer-pin-tool/viewer-pin-tool.css?tag=vertex-viewer-pin-tool&encapsulation=shadow","./src/components/viewer-pin-tool/viewer-pin-tool.tsx"],"sourcesContent":["import { Point, Vector3 } from '@vertexvis/geometry';\nimport { Disposable, UUID } from '@vertexvis/utils';\n\nimport { translatePointToRelative } from '../../components/viewer-pin-tool/utils';\nimport { Cursor, labelPinCursor, pinCursor } from '../cursors';\nimport { getMouseClientPosition } from '../dom';\nimport { ElementRectObserver } from '../elementRectObserver';\nimport { InteractionApi, InteractionHandler } from '../interactions';\nimport { EntityType } from '../types/entities';\nimport { Draggable, PinController } from './controller';\nimport { Pin } from './model';\n\nexport class PinsInteractionHandler implements InteractionHandler {\n private controller: PinController;\n private element?: HTMLElement;\n private api?: InteractionApi;\n\n private cursor?: Disposable;\n\n private xOffset?: number;\n private yOffset?: number;\n\n private rectObserver = new ElementRectObserver();\n\n private droppableSurfaces: EntityType[] = [\n EntityType.PRECISE_SURFACE,\n EntityType.IMPRECISE_SURFACE,\n EntityType.GENERIC_GEOMETRY,\n ];\n\n private get elementRect(): DOMRect | undefined {\n return this.rectObserver.rect;\n }\n\n public constructor(\n controller: PinController,\n xOffset: number,\n yOffset: number\n ) {\n this.controller = controller;\n this.xOffset = xOffset;\n this.yOffset = yOffset;\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n this.rectObserver.observe(element);\n\n element.addEventListener('pointermove', this.handlePointerMove);\n element.addEventListener('pointerdown', this.handlePointerDown);\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n\n public dispose(): void {\n this.rectObserver.disconnect();\n this.clearCursor();\n this.element?.removeEventListener('pointermove', this.handlePointerMove);\n this.element?.removeEventListener('pointerdown', this.handlePointerDown);\n window.removeEventListener('pointerup', this.handlePointerUp);\n\n this.element = undefined;\n this.api = undefined;\n }\n\n public async getWorldPositionForPoint(\n pt: Point.Point\n ): Promise<Vector3.Vector3 | undefined> {\n return this.ifInitialized(async ({ api }) => {\n const vector3 = await api.getWorldPointFromViewport(pt);\n\n return vector3;\n });\n }\n\n public async handlePlacePin(\n pt: Point.Point,\n existingPin?: Pin\n ): Promise<void> {\n this.ifInitialized(async ({ api }) => {\n const [hit] = await api.hitItems(pt);\n\n if (hit?.hitPoint != null && this.elementRect != null) {\n if (\n hit?.hitPoint != null &&\n hit?.hitPoint.x != null &&\n hit?.hitPoint.y != null &&\n hit?.hitPoint.z != null\n ) {\n const pinId = existingPin != null ? existingPin.id : UUID.create();\n\n const attributes =\n this.controller.getStyleAttributes() != null\n ? {\n style: this.controller.getStyleAttributes(),\n }\n : undefined;\n\n switch (this.controller.getToolType()) {\n case 'pin-icon':\n this.controller.setPin({\n type: 'icon',\n id: pinId,\n worldPosition: {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n partId: hit?.itemId?.hex ?? undefined,\n attributes,\n });\n break;\n case 'pin-text':\n const isNewPin = existingPin == null;\n const relativePoint = translatePointToRelative(\n pt,\n this.elementRect,\n isNewPin,\n this.xOffset,\n this.yOffset\n );\n this.controller.setPin({\n type: 'text',\n id: pinId,\n worldPosition: {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n partId: hit?.itemId?.hex ?? undefined,\n label: {\n point: relativePoint,\n },\n attributes,\n });\n this.controller.setSelectedPinId(pinId);\n break;\n }\n }\n } else {\n this.controller.setSelectedPinId();\n }\n });\n }\n\n private handlePointerMove = async (event: PointerEvent): Promise<void> => {\n const isDroppableSurface = await this.isDroppableSurface(event);\n const draggable = this.controller.getDraggable();\n if (draggable != null && isDroppableSurface) {\n this.handleDrag(draggable, event);\n }\n\n if (\n this.controller.getDraggable() == null &&\n this.controller.getToolMode() === 'edit' &&\n isDroppableSurface\n ) {\n this.addCursor(this.getCursorType());\n } else {\n this.clearCursor();\n }\n };\n\n private getCursorType(): Cursor {\n switch (this.controller.getToolType()) {\n case 'pin-icon':\n return pinCursor;\n case 'pin-text':\n return labelPinCursor;\n }\n }\n\n private handleDrag = async (\n draggable: Draggable,\n event: PointerEvent\n ): Promise<void> => {\n const pt = getMouseClientPosition(event, this.elementRect);\n const worldPosition = await this.getWorldPositionForPoint(pt);\n\n if (worldPosition != null) {\n this.controller.updateDraggable(\n {\n ...draggable,\n lastPoint: pt,\n },\n worldPosition\n );\n }\n };\n\n private handlePointerDown = async (\n pointerDown: PointerEvent\n ): Promise<Disposable> => {\n const pointerUp = (pointerUp: PointerEvent): void => {\n const distanceBetweenStartAndEndPoint = Point.distance(\n Point.create(pointerDown.clientX, pointerUp.clientY),\n Point.create(pointerUp.clientX, pointerUp.clientY)\n );\n\n if (distanceBetweenStartAndEndPoint <= 2 && pointerDown.buttons !== 2) {\n if (this.controller.getToolMode() === 'edit') {\n const pt = getMouseClientPosition(pointerDown, this.elementRect);\n\n this.handlePlacePin(pt);\n }\n }\n\n dispose();\n };\n\n const dispose = (): void => {\n window.removeEventListener('pointerup', pointerUp);\n };\n\n window.addEventListener('pointerup', pointerUp);\n\n return {\n dispose,\n };\n };\n\n private handlePointerUp = async (): Promise<void> => {\n const draggable = this.controller.getDraggable();\n const lastPoint = draggable?.lastPoint;\n\n this.controller.setDraggable(undefined);\n\n if (lastPoint != null && draggable != null) {\n this.ifInitialized(async ({ api }) => {\n const [hit] = await api.hitItems(lastPoint);\n\n if (\n hit?.hitPoint != null &&\n hit?.hitPoint?.x != null &&\n hit?.hitPoint?.y != null &&\n hit?.hitPoint?.z != null\n ) {\n this.controller.updateDraggable(\n {\n ...draggable,\n lastPoint,\n },\n {\n x: hit?.hitPoint?.x,\n y: hit?.hitPoint.y,\n z: hit?.hitPoint.z,\n },\n hit?.partId?.hex ?? undefined\n );\n }\n });\n }\n };\n\n private addCursor(cursor: Cursor): void {\n this.clearCursor();\n this.cursor = this.ifInitialized(({ api }) => api.addCursor(cursor));\n }\n\n private async isDroppableSurface(event: PointerEvent): Promise<boolean> {\n const pt = getMouseClientPosition(event, this.elementRect);\n const type = await this.api?.getEntityTypeAtPoint(pt);\n\n return type != null && this.droppableSurfaces.includes(type);\n }\n\n protected ifInitialized<R>(\n f: (data: { element: HTMLElement; api: InteractionApi }) => R\n ): R {\n if (this.element != null && this.api != null) {\n return f({ element: this.element, api: this.api });\n } else {\n throw new Error('Pins interaction handler not initialized.');\n }\n }\n\n private clearCursor(): void {\n this.cursor?.dispose();\n this.cursor = undefined;\n }\n}\n",":host {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n overflow: hidden;\n pointer-events: none;\n\n /**\n * @prop --viewer-pin-tool-initial-label-offset-x: The number of pixels to offset\n the label in the x direction. Defaults to 20.\n */\n --viewer-pin-tool-initial-label-offset-x: 20;\n\n /**\n * @prop --viewer-pin-tool-initial-label-offset-y: The number of pixels to offset\n the label in the y direction. Defaults to 20.\n */\n --viewer-pin-tool-initial-label-offset-y: 20;\n}\n","import {\n Component,\n Element,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Matrix4 } from '@vertexvis/geometry';\nimport { Color, Disposable } from '@vertexvis/utils';\n\nimport { PinController } from '../../lib/pins/controller';\nimport { PinsInteractionHandler } from '../../lib/pins/interactions';\nimport {\n Pin,\n PinModel,\n ViewerPinToolMode,\n ViewerPinToolType,\n} from '../../lib/pins/model';\nimport { getMarkupBoundingClientRect } from '../viewer-markup/dom';\n\ninterface StateMap {\n shouldClearDepthBuffers?: boolean;\n shouldClearFeatureMaps?: boolean;\n}\n\n@Component({\n tag: 'vertex-viewer-pin-tool',\n styleUrl: 'viewer-pin-tool.css',\n shadow: true,\n})\nexport class ViewerPinTool {\n /**\n * The controller that is responsible for drawing pins and updating the model\n */\n @Prop({ mutable: true })\n public pinController?: PinController;\n\n /**\n * The model that contains the entities and outcomes from performing pin annotations\n */\n @Prop()\n public pinModel: PinModel = new PinModel();\n\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The type of pin.\n *\n * This property will automatically be set.\n */\n @Prop({ mutable: true })\n public tool: ViewerPinToolType = 'pin-icon';\n\n /**\n * The mode of the pin tool\n */\n @Prop({ mutable: true })\n public mode: ViewerPinToolMode = 'view';\n\n /**\n * The primary color for new pins. Setting this will override the primary template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to pin anchors, and borders, etc.\n */\n @Prop({ mutable: true })\n public primaryColor: Color.Color | string | undefined;\n\n /**\n * The accent color for new pins. Setting this will override the accent template color, and will be used for any new\n * pins created with this `vertex-viewer-pin-tool`. This styling applies to some background colors, etc\n */\n @Prop({ mutable: true })\n public accentColor: Color.Color | string | undefined;\n\n @Element()\n private hostEl!: HTMLElement;\n\n @State()\n private pins: Pin[] = [];\n\n @State()\n private selectedPinId?: string;\n\n @State()\n private elementBounds?: DOMRect;\n\n @State()\n private projectionViewMatrix?: Matrix4.Matrix4;\n\n private registeredInteractionHandler?: Promise<Disposable>;\n private onEntitiesChangedHandler?: Disposable;\n private onEntityAddedHandler?: Disposable;\n\n private resizeObserver?: ResizeObserver;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected watchModeChange(): void {\n this.pinController?.setToolMode(this.mode);\n this.setupInteractionHandler();\n\n if (this.mode === 'edit') {\n this.setFeatureMaps();\n } else {\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('tool')\n protected watchTypeChange(): void {\n this.pinController?.setToolType(this.tool);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('accentColor')\n protected watchAccentColorChange(): void {\n this.pinController?.setAccentColor(this.accentColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('primaryColor')\n protected watchPrimaryColorChange(): void {\n this.pinController?.setPrimaryColor(this.primaryColor);\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n @Watch('pins')\n protected watchPinsChange(): void {\n if (this.pins.length > 0) {\n this.setDepthBuffers();\n this.setFeatureMaps();\n } else {\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateViewport();\n this.setupController();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n this.pinModel.onEntitiesChanged((entities) => {\n this.pins = entities;\n });\n\n this.pinModel.onSelectionChange((selectedId) => {\n this.selectedPinId = selectedId;\n });\n\n this.handleViewerChanged(this.viewer, undefined);\n }\n\n protected componentDidLoad(): void {\n this.resizeObserver = new ResizeObserver(() => this.updateViewport());\n this.resizeObserver.observe(this.hostEl);\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.clearModelListeners();\n this.resetDepthBuffers();\n this.resetFeatureMaps();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(\n newViewer?: HTMLVertexViewerElement,\n oldViewer?: HTMLVertexViewerElement\n ): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n this.setFeatureMaps();\n\n if (oldViewer != null) {\n oldViewer.removeEventListener(\n 'frameDrawn',\n this.handleSetProjectionMatrix\n );\n }\n\n if (newViewer != null) {\n newViewer.addEventListener('frameDrawn', this.handleSetProjectionMatrix);\n }\n\n this.handleSetProjectionMatrix();\n }\n\n private handleSetProjectionMatrix = (): void => {\n this.projectionViewMatrix =\n this.viewer?.frame?.scene.camera.projectionViewMatrix;\n };\n\n protected render(): JSX.Element {\n return (\n <Host>\n <vertex-viewer-dom-renderer viewer={this.viewer} drawMode=\"2d\">\n {this.pins.map((pin) => {\n return (\n <vertex-viewer-pin-group\n id={`pin-group-${pin.id}`}\n data-is-dom-group-element={true}\n pin={pin}\n elementBounds={this.elementBounds}\n pinModel={this.pinModel}\n pinController={this.pinController}\n projectionViewMatrix={this.projectionViewMatrix}\n selected={this.selectedPinId === pin.id}\n ></vertex-viewer-pin-group>\n );\n })}\n </vertex-viewer-dom-renderer>\n </Host>\n );\n }\n\n private setupController(): void {\n const attributes =\n this.accentColor || this.primaryColor\n ? {\n accentColor: this.accentColor,\n primaryColor: this.primaryColor,\n }\n : undefined;\n this.pinController = new PinController(\n this.pinModel,\n this.mode,\n this.tool,\n attributes\n );\n }\n\n private clearInteractionHandler(): void {\n this.registeredInteractionHandler?.then((handler) => handler.dispose());\n this.registeredInteractionHandler = undefined;\n }\n\n private setupInteractionHandler(): void {\n const hostStyles = window.getComputedStyle(this.hostEl);\n\n const xOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-x')\n .trim();\n const xOffsetAsNumber = Number.isFinite(Number.parseInt(xOffset))\n ? Number.parseInt(xOffset)\n : 20;\n\n const yOffset = hostStyles\n .getPropertyValue('--viewer-pin-tool-initial-label-offset-y')\n .trim();\n const yOffsetAsNumber = Number.isFinite(Number.parseInt(yOffset))\n ? Number.parseInt(yOffset)\n : 20;\n\n this.clearInteractionHandler();\n\n if (this.pinController != null) {\n this.registeredInteractionHandler =\n this.viewer?.registerInteractionHandler(\n new PinsInteractionHandler(\n this.pinController,\n xOffsetAsNumber,\n yOffsetAsNumber\n )\n );\n }\n }\n\n private clearModelListeners(): void {\n this.onEntitiesChangedHandler?.dispose();\n this.onEntitiesChangedHandler = undefined;\n this.onEntityAddedHandler?.dispose();\n this.onEntityAddedHandler = undefined;\n this.resizeObserver?.disconnect();\n }\n\n private updateViewport(): void {\n this.elementBounds = getMarkupBoundingClientRect(this.hostEl);\n }\n\n private setDepthBuffers(): void {\n if (\n this.pins.length > 0 &&\n this.viewer != null &&\n this.viewer.depthBuffers == null\n ) {\n this.stateMap.shouldClearDepthBuffers = true;\n this.viewer.depthBuffers = 'final';\n }\n }\n\n private resetDepthBuffers(): void {\n if (this.stateMap.shouldClearDepthBuffers && this.viewer != null) {\n this.viewer.depthBuffers = undefined;\n this.stateMap.shouldClearDepthBuffers = undefined;\n }\n }\n\n private setFeatureMaps(): void {\n if (\n (this.pins.length > 0 || this.mode === 'edit') &&\n this.viewer != null &&\n this.viewer.featureMaps == null\n ) {\n this.stateMap.shouldClearFeatureMaps = true;\n this.viewer.featureMaps = 'final';\n }\n }\n\n private resetFeatureMaps(): void {\n if (this.stateMap.shouldClearFeatureMaps && this.viewer != null) {\n this.viewer.featureMaps = undefined;\n this.stateMap.shouldClearFeatureMaps = undefined;\n }\n }\n}\n"],"version":3}
@@ -258,7 +258,7 @@ const VertexPinLabel = /*@__PURE__*/ proxyCustomElement(class extends HTMLElemen
258
258
  this.value = this.getPinText();
259
259
  }
260
260
  /**
261
- * Gives focus to the the component's internal text input.
261
+ * Gives focus to the component's internal text input.
262
262
  */
263
263
  async setFocus() {
264
264
  var _a, _b, _c;