Skip to content

Commit a34f6ff

Browse files
author
Alberto Iannaccone
committed
move user fields logic into own contribution
1 parent bc2ce86 commit a34f6ff

File tree

3 files changed

+180
-150
lines changed

3 files changed

+180
-150
lines changed

Diff for: arduino-ide-extension/src/browser/arduino-ide-frontend-module.ts

+2
Original file line numberDiff line numberDiff line change
@@ -337,6 +337,7 @@ import { CheckForUpdates } from './contributions/check-for-updates';
337337
import { OutputEditorFactory } from './theia/output/output-editor-factory';
338338
import { StartupTaskProvider } from '../electron-common/startup-task';
339339
import { DeleteSketch } from './contributions/delete-sketch';
340+
import { UserFields } from './contributions/user-fields';
340341

341342
const registerArduinoThemes = () => {
342343
const themes: MonacoThemeJson[] = [
@@ -761,6 +762,7 @@ export default new ContainerModule((bind, unbind, isBound, rebind) => {
761762
Contribution.configure(bind, OpenBoardsConfig);
762763
Contribution.configure(bind, SketchFilesTracker);
763764
Contribution.configure(bind, CheckForUpdates);
765+
Contribution.configure(bind, UserFields);
764766
Contribution.configure(bind, DeleteSketch);
765767

766768
bindContributionProvider(bind, StartupTaskProvider);

Diff for: arduino-ide-extension/src/browser/contributions/upload-sketch.ts

+29-150
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { inject, injectable } from '@theia/core/shared/inversify';
22
import { Emitter } from '@theia/core/lib/common/event';
3-
import { BoardUserField, CoreService, Port } from '../../common/protocol';
4-
import { ArduinoMenus, PlaceholderMenuNode } from '../menu/arduino-menus';
3+
import { CoreService, Port } from '../../common/protocol';
4+
import { ArduinoMenus } from '../menu/arduino-menus';
55
import { ArduinoToolbar } from '../toolbar/arduino-toolbar';
66
import {
77
Command,
@@ -11,93 +11,36 @@ import {
1111
TabBarToolbarRegistry,
1212
CoreServiceContribution,
1313
} from './contribution';
14-
import { UserFieldsDialog } from '../dialogs/user-fields/user-fields-dialog';
15-
import { deepClone, DisposableCollection, nls } from '@theia/core/lib/common';
14+
import { deepClone, nls } from '@theia/core/lib/common';
1615
import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl';
1716
import type { VerifySketchParams } from './verify-sketch';
17+
import { UserFields } from './user-fields';
1818

1919
@injectable()
2020
export class UploadSketch extends CoreServiceContribution {
21-
@inject(MenuModelRegistry)
22-
private readonly menuRegistry: MenuModelRegistry;
23-
24-
@inject(UserFieldsDialog)
25-
private readonly userFieldsDialog: UserFieldsDialog;
26-
27-
private boardRequiresUserFields = false;
28-
private userFieldsSet = false;
29-
private readonly cachedUserFields: Map<string, BoardUserField[]> = new Map();
30-
private readonly menuActionsDisposables = new DisposableCollection();
31-
3221
private readonly onDidChangeEmitter = new Emitter<void>();
3322
private readonly onDidChange = this.onDidChangeEmitter.event;
3423
private uploadInProgress = false;
3524

36-
protected override init(): void {
37-
super.init();
38-
this.boardsServiceProvider.onBoardsConfigChanged(async () => {
39-
const userFields =
40-
await this.boardsServiceProvider.selectedBoardUserFields();
41-
this.boardRequiresUserFields = userFields.length > 0;
42-
this.registerMenus(this.menuRegistry);
43-
});
44-
}
45-
46-
private selectedFqbnAddress(): string {
47-
const { boardsConfig } = this.boardsServiceProvider;
48-
const fqbn = boardsConfig.selectedBoard?.fqbn;
49-
if (!fqbn) {
50-
return '';
51-
}
52-
const address =
53-
boardsConfig.selectedBoard?.port?.address ||
54-
boardsConfig.selectedPort?.address;
55-
if (!address) {
56-
return '';
57-
}
58-
return fqbn + '|' + address;
59-
}
25+
@inject(UserFields)
26+
private readonly userFields: UserFields;
6027

6128
override registerCommands(registry: CommandRegistry): void {
6229
registry.registerCommand(UploadSketch.Commands.UPLOAD_SKETCH, {
6330
execute: async () => {
64-
const key = this.selectedFqbnAddress();
65-
/*
66-
If the board requires to be configured with user fields, we want
67-
to show the user fields dialog, but if they weren't already
68-
filled in or if they were filled in, but the previous upload failed.
69-
*/
70-
if (
71-
this.boardRequiresUserFields &&
72-
key &&
73-
(!this.cachedUserFields.has(key) || !this.userFieldsSet)
74-
) {
75-
const userFieldsFilledIn = Boolean(
76-
await this.showUserFieldsDialog(key)
77-
);
78-
if (!userFieldsFilledIn) {
79-
return;
80-
}
31+
if (await this.userFields.checkUserFieldsDialog(false)) {
32+
this.uploadSketch();
8133
}
82-
this.uploadSketch();
8334
},
8435
isEnabled: () => !this.uploadInProgress,
8536
});
8637
registry.registerCommand(UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION, {
8738
execute: async () => {
88-
const key = this.selectedFqbnAddress();
89-
if (!key) {
90-
return;
91-
}
92-
const userFieldsFilledIn = Boolean(
93-
await this.showUserFieldsDialog(key)
94-
);
95-
if (!userFieldsFilledIn) {
96-
return;
39+
if (await this.userFields.checkUserFieldsDialog(true)) {
40+
this.uploadSketch();
9741
}
98-
this.uploadSketch();
9942
},
100-
isEnabled: () => !this.uploadInProgress && this.boardRequiresUserFields,
43+
isEnabled: () => !this.uploadInProgress && this.userFields.isRequired(),
10144
});
10245
registry.registerCommand(
10346
UploadSketch.Commands.UPLOAD_SKETCH_USING_PROGRAMMER,
@@ -117,45 +60,20 @@ export class UploadSketch extends CoreServiceContribution {
11760
}
11861

11962
override registerMenus(registry: MenuModelRegistry): void {
120-
this.menuActionsDisposables.dispose();
121-
this.menuActionsDisposables.push(
122-
registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, {
123-
commandId: UploadSketch.Commands.UPLOAD_SKETCH.id,
124-
label: nls.localize('arduino/sketch/upload', 'Upload'),
125-
order: '1',
126-
})
127-
);
128-
if (this.boardRequiresUserFields) {
129-
this.menuActionsDisposables.push(
130-
registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, {
131-
commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id,
132-
label: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.label,
133-
order: '2',
134-
})
135-
);
136-
} else {
137-
this.menuActionsDisposables.push(
138-
registry.registerMenuNode(
139-
ArduinoMenus.SKETCH__MAIN_GROUP,
140-
new PlaceholderMenuNode(
141-
ArduinoMenus.SKETCH__MAIN_GROUP,
142-
// commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id,
143-
UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.label,
144-
{ order: '2' }
145-
)
146-
)
147-
);
148-
}
149-
this.menuActionsDisposables.push(
150-
registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, {
151-
commandId: UploadSketch.Commands.UPLOAD_SKETCH_USING_PROGRAMMER.id,
152-
label: nls.localize(
153-
'arduino/sketch/uploadUsingProgrammer',
154-
'Upload Using Programmer'
155-
),
156-
order: '3',
157-
})
158-
);
63+
registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, {
64+
commandId: UploadSketch.Commands.UPLOAD_SKETCH.id,
65+
label: nls.localize('arduino/sketch/upload', 'Upload'),
66+
order: '1',
67+
});
68+
69+
registry.registerMenuAction(ArduinoMenus.SKETCH__MAIN_GROUP, {
70+
commandId: UploadSketch.Commands.UPLOAD_SKETCH_USING_PROGRAMMER.id,
71+
label: nls.localize(
72+
'arduino/sketch/uploadUsingProgrammer',
73+
'Upload Using Programmer'
74+
),
75+
order: '3',
76+
});
15977
}
16078

16179
override registerKeybindings(registry: KeybindingRegistry): void {
@@ -212,20 +130,8 @@ export class UploadSketch extends CoreServiceContribution {
212130
return;
213131
}
214132

215-
if (this.boardRequiresUserFields) {
216-
// TODO: This does not belong here.
217-
// IDE2 should not do any preliminary checks but let the CLI fail and then toast a user consumable error message.
218-
if (uploadOptions.userFields.length === 0) {
219-
this.messageService.error(
220-
nls.localize(
221-
'arduino/sketch/userFieldsNotFoundError',
222-
"Can't find user fields for connected board"
223-
)
224-
);
225-
this.userFieldsSet = false;
226-
return;
227-
}
228-
this.userFieldsSet = true;
133+
if (!this.userFields.checkUserFieldsForUpload()) {
134+
return;
229135
}
230136

231137
await this.doWithProgress({
@@ -240,13 +146,7 @@ export class UploadSketch extends CoreServiceContribution {
240146
{ timeout: 3000 }
241147
);
242148
} catch (e) {
243-
if (
244-
this.boardRequiresUserFields &&
245-
typeof e.message === 'string' &&
246-
e.message.startsWith('Upload error:')
247-
) {
248-
this.userFieldsSet = false;
249-
}
149+
this.userFields.notifyFailedWithError(e);
250150
this.handleError(e);
251151
} finally {
252152
this.uploadInProgress = false;
@@ -263,7 +163,7 @@ export class UploadSketch extends CoreServiceContribution {
263163
if (!CurrentSketch.isValid(sketch)) {
264164
return undefined;
265165
}
266-
const userFields = this.userFields();
166+
const userFields = this.userFields.getUserFields();
267167
const { boardsConfig } = this.boardsServiceProvider;
268168
const [fqbn, { selectedProgrammer: programmer }, verify, verbose] =
269169
await Promise.all([
@@ -306,10 +206,6 @@ export class UploadSketch extends CoreServiceContribution {
306206
return port;
307207
}
308208

309-
private userFields(): BoardUserField[] {
310-
return this.cachedUserFields.get(this.selectedFqbnAddress()) ?? [];
311-
}
312-
313209
/**
314210
* Converts the `VENDOR:ARCHITECTURE:BOARD_ID[:MENU_ID=OPTION_ID[,MENU2_ID=OPTION_ID ...]]` FQBN to
315211
* `VENDOR:ARCHITECTURE:BOARD_ID` format.
@@ -322,23 +218,6 @@ export class UploadSketch extends CoreServiceContribution {
322218
const [vendor, arch, id] = fqbn.split(':');
323219
return `${vendor}:${arch}:${id}`;
324220
}
325-
326-
private async showUserFieldsDialog(
327-
key: string
328-
): Promise<BoardUserField[] | undefined> {
329-
const cached = this.cachedUserFields.get(key);
330-
// Deep clone the array of board fields to avoid editing the cached ones
331-
this.userFieldsDialog.value = (
332-
cached ?? (await this.boardsServiceProvider.selectedBoardUserFields())
333-
).map((f) => ({ ...f }));
334-
const result = await this.userFieldsDialog.open();
335-
if (!result) {
336-
return;
337-
}
338-
this.userFieldsSet = true;
339-
this.cachedUserFields.set(key, result);
340-
return result;
341-
}
342221
}
343222

344223
export namespace UploadSketch {

0 commit comments

Comments
 (0)