Skip to content

Commit 20c6392

Browse files
authored
Wire up modeling panel empty states (#2915)
1 parent b1df4a4 commit 20c6392

File tree

6 files changed

+65
-38
lines changed

6 files changed

+65
-38
lines changed

extensions/ql-vscode/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1996,7 +1996,7 @@
19961996
"id": "codeQLMethodModeling",
19971997
"type": "webview",
19981998
"name": "CodeQL Method Modeling",
1999-
"when": "config.codeQL.canary && config.codeQL.model.methodModelingView && codeql.modelEditorOpen && !codeql.modelEditorActive"
1999+
"when": "config.codeQL.canary && config.codeQL.model.methodModelingView"
20002000
}
20012001
],
20022002
"codeql-methods-usage": [

extensions/ql-vscode/src/common/interface-types.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,6 +577,11 @@ interface SetModeledMethodMessage {
577577
method: ModeledMethod;
578578
}
579579

580+
interface SetInModelingModeMessage {
581+
t: "setInModelingMode";
582+
inModelingMode: boolean;
583+
}
584+
580585
interface RevealMethodMessage {
581586
t: "revealMethod";
582587
method: Method;
@@ -641,4 +646,5 @@ export type ToMethodModelingMessage =
641646
| SetMethodMessage
642647
| SetModeledMethodMessage
643648
| SetMethodModifiedMessage
644-
| SetSelectedMethodMessage;
649+
| SetSelectedMethodMessage
650+
| SetInModelingModeMessage;

extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,16 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
4646
}
4747

4848
private setInitialState(): void {
49-
const selectedMethod = this.modelingStore.getSelectedMethodDetails();
50-
if (selectedMethod) {
51-
void this.postMessage({
52-
t: "setSelectedMethod",
53-
method: selectedMethod.method,
54-
modeledMethod: selectedMethod.modeledMethod,
55-
isModified: selectedMethod.isModified,
56-
});
49+
if (this.modelingStore.hasStateForActiveDb()) {
50+
const selectedMethod = this.modelingStore.getSelectedMethodDetails();
51+
if (selectedMethod) {
52+
void this.postMessage({
53+
t: "setSelectedMethod",
54+
method: selectedMethod.method,
55+
modeledMethod: selectedMethod.modeledMethod,
56+
isModified: selectedMethod.isModified,
57+
});
58+
}
5759
}
5860
}
5961

@@ -165,5 +167,25 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
165167
}
166168
}),
167169
);
170+
171+
this.push(
172+
this.modelingStore.onDbOpened(async () => {
173+
await this.postMessage({
174+
t: "setInModelingMode",
175+
inModelingMode: true,
176+
});
177+
}),
178+
);
179+
180+
this.push(
181+
this.modelingStore.onDbClosed(async () => {
182+
if (!this.modelingStore.anyDbsBeingModeled()) {
183+
await this.postMessage({
184+
t: "setInModelingMode",
185+
inModelingMode: false,
186+
});
187+
}
188+
}),
189+
);
168190
}
169191
}

extensions/ql-vscode/src/model-editor/model-editor-view.ts

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,6 @@ export class ModelEditorView extends AbstractWebview<
100100
panel.onDidChangeViewState(async () => {
101101
if (panel.active) {
102102
this.modelingStore.setActiveDb(this.databaseItem);
103-
await this.markModelEditorAsActive();
104-
} else {
105-
await this.updateModelEditorActiveContext();
106103
}
107104
});
108105

@@ -126,36 +123,12 @@ export class ModelEditorView extends AbstractWebview<
126123
);
127124
}
128125

129-
private async markModelEditorAsActive(): Promise<void> {
130-
void this.app.commands.execute(
131-
"setContext",
132-
"codeql.modelEditorActive",
133-
true,
134-
);
135-
}
136-
137-
private async updateModelEditorActiveContext(): Promise<void> {
138-
await this.app.commands.execute(
139-
"setContext",
140-
"codeql.modelEditorActive",
141-
this.isAModelEditorActive(),
142-
);
143-
}
144-
145126
private isAModelEditorOpen(): boolean {
146127
return window.tabGroups.all.some((tabGroup) =>
147128
tabGroup.tabs.some((tab) => this.isTabModelEditorView(tab)),
148129
);
149130
}
150131

151-
private isAModelEditorActive(): boolean {
152-
return window.tabGroups.all.some((tabGroup) =>
153-
tabGroup.tabs.some(
154-
(tab) => this.isTabModelEditorView(tab) && tab.isActive,
155-
),
156-
);
157-
}
158-
159132
private isTabModelEditorView(tab: Tab): boolean {
160133
if (!(tab.input instanceof TabInputWebview)) {
161134
return false;

extensions/ql-vscode/src/model-editor/modeling-store.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ interface SelectedMethodChangedEvent {
4949

5050
export class ModelingStore extends DisposableObject {
5151
public readonly onActiveDbChanged: AppEvent<void>;
52+
public readonly onDbOpened: AppEvent<string>;
5253
public readonly onDbClosed: AppEvent<string>;
5354
public readonly onMethodsChanged: AppEvent<MethodsChangedEvent>;
5455
public readonly onHideModeledMethodsChanged: AppEvent<HideModeledMethodsChangedEvent>;
@@ -60,6 +61,7 @@ export class ModelingStore extends DisposableObject {
6061
private activeDb: string | undefined;
6162

6263
private readonly onActiveDbChangedEventEmitter: AppEventEmitter<void>;
64+
private readonly onDbOpenedEventEmitter: AppEventEmitter<string>;
6365
private readonly onDbClosedEventEmitter: AppEventEmitter<string>;
6466
private readonly onMethodsChangedEventEmitter: AppEventEmitter<MethodsChangedEvent>;
6567
private readonly onHideModeledMethodsChangedEventEmitter: AppEventEmitter<HideModeledMethodsChangedEvent>;
@@ -79,6 +81,9 @@ export class ModelingStore extends DisposableObject {
7981
);
8082
this.onActiveDbChanged = this.onActiveDbChangedEventEmitter.event;
8183

84+
this.onDbOpenedEventEmitter = this.push(app.createEventEmitter<string>());
85+
this.onDbOpened = this.onDbOpenedEventEmitter.event;
86+
8287
this.onDbClosedEventEmitter = this.push(app.createEventEmitter<string>());
8388
this.onDbClosed = this.onDbClosedEventEmitter.event;
8489

@@ -123,6 +128,8 @@ export class ModelingStore extends DisposableObject {
123128
selectedMethod: undefined,
124129
selectedUsage: undefined,
125130
});
131+
132+
this.onDbOpenedEventEmitter.fire(dbUri);
126133
}
127134

128135
public setActiveDb(databaseItem: DatabaseItem) {
@@ -154,6 +161,14 @@ export class ModelingStore extends DisposableObject {
154161
return this.state.get(this.activeDb);
155162
}
156163

164+
public hasStateForActiveDb(): boolean {
165+
return !!this.getStateForActiveDb();
166+
}
167+
168+
public anyDbsBeingModeled(): boolean {
169+
return this.state.size > 0;
170+
}
171+
157172
public setMethods(dbItem: DatabaseItem, methods: Method[]) {
158173
const dbState = this.getState(dbItem);
159174
const dbUri = dbItem.databaseUri.toString();

extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ import { ToMethodModelingMessage } from "../../common/interface-types";
77
import { assertNever } from "../../common/helpers-pure";
88
import { ModeledMethod } from "../../model-editor/modeled-method";
99
import { vscode } from "../vscode-api";
10+
import { NotInModelingMode } from "./NotInModelingMode";
11+
import { NoMethodSelected } from "./NoMethodSelected";
1012

1113
export function MethodModelingView(): JSX.Element {
14+
const [inModelingMode, setInModelingMode] = useState<boolean>(false);
15+
1216
const [method, setMethod] = useState<Method | undefined>(undefined);
1317

1418
const [modeledMethod, setModeledMethod] = React.useState<
@@ -27,6 +31,9 @@ export function MethodModelingView(): JSX.Element {
2731
if (evt.origin === window.origin) {
2832
const msg: ToMethodModelingMessage = evt.data;
2933
switch (msg.t) {
34+
case "setInModelingMode":
35+
setInModelingMode(msg.inModelingMode);
36+
break;
3037
case "setMethod":
3138
setMethod(msg.method);
3239
break;
@@ -57,8 +64,12 @@ export function MethodModelingView(): JSX.Element {
5764
};
5865
}, []);
5966

67+
if (!inModelingMode) {
68+
return <NotInModelingMode />;
69+
}
70+
6071
if (!method) {
61-
return <>Select method to model</>;
72+
return <NoMethodSelected />;
6273
}
6374

6475
const onChange = (modeledMethod: ModeledMethod) => {

0 commit comments

Comments
 (0)