Skip to content

Commit e84d6ea

Browse files
authored
Inspector v2: Clear the selected item when it is disposed (#16795)
This just uses the instrumentation helpers to hook the `dispose` function on the selected entity to clear the selected item if it is disposed.
1 parent 4d5a38a commit e84d6ea

File tree

1 file changed

+14
-1
lines changed

1 file changed

+14
-1
lines changed

packages/dev/inspector-v2/src/services/selectionService.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
// eslint-disable-next-line import/no-internal-modules
2-
import type { IReadonlyObservable, Nullable } from "core/index";
2+
import type { IDisposable, IReadonlyObservable, Nullable } from "core/index";
33

44
import type { IService, ServiceDefinition } from "../modularity/serviceDefinition";
55

66
import { Observable } from "core/Misc/observable";
7+
import { InterceptFunction } from "../instrumentation/functionInstrumentation";
78

89
export const SelectionServiceIdentity = Symbol("PropertiesService");
910

@@ -28,10 +29,22 @@ export const SelectionServiceDefinition: ServiceDefinition<[ISelectionService],
2829
factory: () => {
2930
let selectedEntityState: Nullable<unknown> = null;
3031
const selectedEntityObservable = new Observable<void>();
32+
let disposedHook: Nullable<IDisposable> = null;
33+
3134
const setSelectedItem = (item: Nullable<unknown>) => {
3235
if (item !== selectedEntityState) {
36+
disposedHook?.dispose();
37+
disposedHook = null;
38+
3339
selectedEntityState = item;
3440
selectedEntityObservable.notifyObservers();
41+
42+
if (item) {
43+
const disposable = item as Partial<IDisposable>;
44+
if (disposable.dispose) {
45+
disposedHook = InterceptFunction(disposable, "dispose", { afterCall: () => setSelectedItem(null) });
46+
}
47+
}
3548
}
3649
};
3750

0 commit comments

Comments
 (0)