Skip to content

Commit 83a6b5a

Browse files
Merge pull request #3439 from github/robertbrignull/modeling-mode
Refactor events to fix the method modeling panel getting stuck showing "start modeling"
2 parents cffecaf + dc08da9 commit 83a6b5a

8 files changed

Lines changed: 113 additions & 93 deletions

File tree

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -698,16 +698,15 @@ interface SetMethodModelingPanelViewStateMessage {
698698
viewState: MethodModelingPanelViewState;
699699
}
700700

701-
interface SetMethodMessage {
702-
t: "setMethod";
703-
method: Method | undefined;
704-
}
705-
706701
interface SetMethodModifiedMessage {
707702
t: "setMethodModified";
708703
isModified: boolean;
709704
}
710705

706+
interface SetNoMethodSelectedMessage {
707+
t: "setNoMethodSelected";
708+
}
709+
711710
interface SetSelectedMethodMessage {
712711
t: "setSelectedMethod";
713712
method: Method;
@@ -719,9 +718,9 @@ interface SetSelectedMethodMessage {
719718

720719
export type ToMethodModelingMessage =
721720
| SetMethodModelingPanelViewStateMessage
722-
| SetMethodMessage
723721
| SetMultipleModeledMethodsMessage
724722
| SetMethodModifiedMessage
723+
| SetNoMethodSelectedMessage
725724
| SetSelectedMethodMessage
726725
| SetInModelingModeMessage
727726
| SetInProgressMessage

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

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,8 @@ import { window } from "vscode";
22
import type { App } from "../../common/app";
33
import { DisposableObject } from "../../common/disposable-object";
44
import { MethodModelingViewProvider } from "./method-modeling-view-provider";
5-
import type { Method } from "../method";
65
import type { ModelingStore } from "../modeling-store";
76
import { ModelConfigListener } from "../../config";
8-
import type { DatabaseItem } from "../../databases/local-databases";
97
import type { ModelingEvents } from "../modeling-events";
108

119
export class MethodModelingPanel extends DisposableObject {
@@ -36,11 +34,4 @@ export class MethodModelingPanel extends DisposableObject {
3634
),
3735
);
3836
}
39-
40-
public async setMethod(
41-
databaseItem: DatabaseItem,
42-
method: Method,
43-
): Promise<void> {
44-
await this.provider.setMethod(databaseItem, method);
45-
}
4637
}

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

Lines changed: 60 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import type { ModelingEvents } from "../modeling-events";
1616
import type { QueryLanguage } from "../../common/query-language";
1717
import { tryGetQueryLanguage } from "../../common/query-language";
1818
import { createModelConfig } from "../languages";
19+
import type { ModeledMethod } from "../modeled-method";
1920

2021
export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
2122
ToMethodModelingMessage,
@@ -37,7 +38,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
3738
}
3839

3940
protected override async onWebViewLoaded(): Promise<void> {
40-
await Promise.all([this.setViewState(), this.setInitialState()]);
41+
await this.setInitialState();
4142
this.registerToModelingEvents();
4243
this.registerToModelConfigEvents();
4344
}
@@ -52,46 +53,60 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
5253
});
5354
}
5455

55-
public async setMethod(
56-
databaseItem: DatabaseItem | undefined,
57-
method: Method | undefined,
56+
private async setDatabaseItem(databaseItem: DatabaseItem): Promise<void> {
57+
this.databaseItem = databaseItem;
58+
59+
await this.postMessage({
60+
t: "setInModelingMode",
61+
inModelingMode: true,
62+
});
63+
64+
this.language = tryGetQueryLanguage(databaseItem.language);
65+
await this.setViewState();
66+
}
67+
68+
private async setSelectedMethod(
69+
databaseItem: DatabaseItem,
70+
method: Method,
71+
modeledMethods: readonly ModeledMethod[],
72+
isModified: boolean,
73+
isInProgress: boolean,
74+
processedByAutoModel: boolean,
5875
): Promise<void> {
5976
this.method = method;
6077
this.databaseItem = databaseItem;
61-
this.language = databaseItem && tryGetQueryLanguage(databaseItem.language);
78+
this.language = tryGetQueryLanguage(databaseItem.language);
6279

63-
if (this.isShowingView) {
64-
await this.postMessage({
65-
t: "setMethod",
66-
method,
67-
});
68-
}
80+
await this.postMessage({
81+
t: "setSelectedMethod",
82+
method,
83+
modeledMethods,
84+
isModified,
85+
isInProgress,
86+
processedByAutoModel,
87+
});
6988
}
7089

7190
private async setInitialState(): Promise<void> {
72-
if (this.modelingStore.hasStateForActiveDb()) {
73-
const selectedMethod = this.modelingStore.getSelectedMethodDetails();
74-
if (selectedMethod) {
75-
this.databaseItem = selectedMethod.databaseItem;
76-
this.language = tryGetQueryLanguage(
77-
selectedMethod.databaseItem.language,
78-
);
79-
this.method = selectedMethod.method;
80-
81-
await this.postMessage({
82-
t: "setSelectedMethod",
83-
method: selectedMethod.method,
84-
modeledMethods: selectedMethod.modeledMethods,
85-
isModified: selectedMethod.isModified,
86-
isInProgress: selectedMethod.isInProgress,
87-
processedByAutoModel: selectedMethod.processedByAutoModel,
88-
});
89-
}
91+
await this.setViewState();
92+
93+
const stateForActiveDb = this.modelingStore.getStateForActiveDb();
94+
if (!stateForActiveDb) {
95+
return;
96+
}
97+
98+
await this.setDatabaseItem(stateForActiveDb.databaseItem);
9099

91-
await this.postMessage({
92-
t: "setInModelingMode",
93-
inModelingMode: true,
94-
});
100+
const selectedMethod = this.modelingStore.getSelectedMethodDetails();
101+
if (selectedMethod) {
102+
await this.setSelectedMethod(
103+
stateForActiveDb.databaseItem,
104+
selectedMethod.method,
105+
selectedMethod.modeledMethods,
106+
selectedMethod.isModified,
107+
selectedMethod.isInProgress,
108+
selectedMethod.processedByAutoModel,
109+
);
95110
}
96111
}
97112

@@ -183,33 +198,21 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
183198
this.push(
184199
this.modelingEvents.onSelectedMethodChanged(async (e) => {
185200
if (this.webviewView) {
186-
this.method = e.method;
187-
this.databaseItem = e.databaseItem;
188-
this.language = tryGetQueryLanguage(e.databaseItem.language);
189-
190-
await this.postMessage({
191-
t: "setSelectedMethod",
192-
method: e.method,
193-
modeledMethods: e.modeledMethods,
194-
isModified: e.isModified,
195-
isInProgress: e.isInProgress,
196-
processedByAutoModel: e.processedByAutoModel,
197-
});
201+
await this.setSelectedMethod(
202+
e.databaseItem,
203+
e.method,
204+
e.modeledMethods,
205+
e.isModified,
206+
e.isInProgress,
207+
e.processedByAutoModel,
208+
);
198209
}
199210
}),
200211
);
201212

202213
this.push(
203214
this.modelingEvents.onDbOpened(async (databaseItem) => {
204-
this.databaseItem = databaseItem;
205-
206-
await this.postMessage({
207-
t: "setInModelingMode",
208-
inModelingMode: true,
209-
});
210-
211-
this.language = tryGetQueryLanguage(databaseItem.language);
212-
await this.setViewState();
215+
await this.setDatabaseItem(databaseItem);
213216
}),
214217
);
215218

@@ -223,7 +226,9 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
223226
}
224227

225228
if (dbUri === this.databaseItem?.databaseUri.toString()) {
226-
await this.setMethod(undefined, undefined);
229+
await this.postMessage({
230+
t: "setNoMethodSelected",
231+
});
227232
}
228233
}),
229234
);

extensions/ql-vscode/src/model-editor/methods-usage/methods-usage-panel.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export class MethodsUsagePanel extends DisposableObject {
5757
};
5858
}
5959

60-
public async revealItem(
60+
private async revealItem(
6161
methodSignature: string,
6262
usage: Usage,
6363
): Promise<void> {
@@ -108,6 +108,12 @@ export class MethodsUsagePanel extends DisposableObject {
108108
}
109109
}),
110110
);
111+
112+
this.push(
113+
this.modelingEvents.onSelectedMethodChanged(async (event) => {
114+
await this.revealItem(event.method.signature, event.usage);
115+
}),
116+
);
111117
}
112118

113119
private async handleStateChangeEvent(): Promise<void> {

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

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,6 @@ export class ModelEditorModule extends DisposableObject {
3737
private readonly queryStorageDir: string;
3838
private readonly modelingStore: ModelingStore;
3939
private readonly modelingEvents: ModelingEvents;
40-
private readonly methodsUsagePanel: MethodsUsagePanel;
41-
private readonly methodModelingPanel: MethodModelingPanel;
4240
private readonly modelConfig: ModelConfigListener;
4341

4442
private constructor(
@@ -53,10 +51,10 @@ export class ModelEditorModule extends DisposableObject {
5351
this.queryStorageDir = join(baseQueryStorageDir, "model-editor-results");
5452
this.modelingEvents = new ModelingEvents(app);
5553
this.modelingStore = new ModelingStore(this.modelingEvents);
56-
this.methodsUsagePanel = this.push(
54+
this.push(
5755
new MethodsUsagePanel(this.modelingStore, this.modelingEvents, cliServer),
5856
);
59-
this.methodModelingPanel = this.push(
57+
this.push(
6058
new MethodModelingPanel(app, this.modelingStore, this.modelingEvents),
6159
);
6260
this.modelConfig = this.push(new ModelConfigListener());
@@ -107,7 +105,11 @@ export class ModelEditorModule extends DisposableObject {
107105
private registerToModelingEvents(): void {
108106
this.push(
109107
this.modelingEvents.onSelectedMethodChanged(async (event) => {
110-
await this.showMethod(event.databaseItem, event.method, event.usage);
108+
await showResolvableLocation(
109+
event.usage.url,
110+
event.databaseItem,
111+
this.app.logger,
112+
);
111113
}),
112114
);
113115

@@ -126,16 +128,6 @@ export class ModelEditorModule extends DisposableObject {
126128
);
127129
}
128130

129-
private async showMethod(
130-
databaseItem: DatabaseItem,
131-
method: Method,
132-
usage: Usage,
133-
): Promise<void> {
134-
await this.methodsUsagePanel.revealItem(method.signature, usage);
135-
await this.methodModelingPanel.setMethod(databaseItem, method);
136-
await showResolvableLocation(usage.url, databaseItem, this.app.logger);
137-
}
138-
139131
private async openModelEditor(): Promise<void> {
140132
{
141133
const db = this.databaseManager.currentDatabaseItem;

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,19 @@ export function MethodModelingView({
5353
case "setInModelingMode":
5454
setInModelingMode(msg.inModelingMode);
5555
break;
56-
case "setMethod":
57-
setMethod(msg.method);
58-
break;
5956
case "setMultipleModeledMethods":
6057
setModeledMethods(msg.modeledMethods);
6158
break;
6259
case "setMethodModified":
6360
setIsMethodModified(msg.isModified);
6461
break;
62+
case "setNoMethodSelected":
63+
setMethod(undefined);
64+
setModeledMethods([]);
65+
setIsMethodModified(false);
66+
setIsModelingInProgress(false);
67+
setIsProcessedByAutoModel(false);
68+
break;
6569
case "setSelectedMethod":
6670
setMethod(msg.method);
6771
setModeledMethods(msg.modeledMethods);

extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import type { ModelingEvents } from "../../../src/model-editor/modeling-events";
44
export function createMockModelingEvents({
55
onActiveDbChanged = jest.fn(),
66
onDbClosed = jest.fn(),
7+
onSelectedMethodChanged = jest.fn(),
78
onMethodsChanged = jest.fn(),
89
onHideModeledMethodsChanged = jest.fn(),
910
onModeChanged = jest.fn(),
@@ -16,6 +17,7 @@ export function createMockModelingEvents({
1617
}: {
1718
onActiveDbChanged?: ModelingEvents["onActiveDbChanged"];
1819
onDbClosed?: ModelingEvents["onDbClosed"];
20+
onSelectedMethodChanged?: ModelingEvents["onSelectedMethodChanged"];
1921
onMethodsChanged?: ModelingEvents["onMethodsChanged"];
2022
onHideModeledMethodsChanged?: ModelingEvents["onHideModeledMethodsChanged"];
2123
onModeChanged?: ModelingEvents["onModeChanged"];
@@ -29,6 +31,7 @@ export function createMockModelingEvents({
2931
return mockedObject<ModelingEvents>({
3032
onActiveDbChanged,
3133
onDbClosed,
34+
onSelectedMethodChanged,
3235
onMethodsChanged,
3336
onHideModeledMethodsChanged,
3437
onModeChanged,

0 commit comments

Comments
 (0)