1
1
import { inject , injectable } from '@theia/core/shared/inversify' ;
2
2
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' ;
5
5
import { ArduinoToolbar } from '../toolbar/arduino-toolbar' ;
6
6
import {
7
7
Command ,
@@ -11,96 +11,36 @@ import {
11
11
TabBarToolbarRegistry ,
12
12
CoreServiceContribution ,
13
13
} 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' ;
16
15
import { CurrentSketch } from '../../common/protocol/sketches-service-client-impl' ;
17
16
import type { VerifySketchParams } from './verify-sketch' ;
17
+ import { UserFields } from './user-fields' ;
18
18
19
19
@injectable ( )
20
20
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 readonly cachedUserFields : Map < string , BoardUserField [ ] > = new Map ( ) ;
29
- private readonly menuActionsDisposables = new DisposableCollection ( ) ;
30
-
31
21
private readonly onDidChangeEmitter = new Emitter < void > ( ) ;
32
22
private readonly onDidChange = this . onDidChangeEmitter . event ;
33
23
private uploadInProgress = false ;
34
24
35
- protected override init ( ) : void {
36
- super . init ( ) ;
37
- this . boardsServiceProvider . onBoardsConfigChanged ( async ( ) => {
38
- const userFields =
39
- await this . boardsServiceProvider . selectedBoardUserFields ( ) ;
40
- this . boardRequiresUserFields = userFields . length > 0 ;
41
- this . registerMenus ( this . menuRegistry ) ;
42
- } ) ;
43
- }
44
-
45
- private selectedFqbnAddress ( ) : string {
46
- const { boardsConfig } = this . boardsServiceProvider ;
47
- const fqbn = boardsConfig . selectedBoard ?. fqbn ;
48
- if ( ! fqbn ) {
49
- return '' ;
50
- }
51
- const address =
52
- boardsConfig . selectedBoard ?. port ?. address ||
53
- boardsConfig . selectedPort ?. address ;
54
- if ( ! address ) {
55
- return '' ;
56
- }
57
- return fqbn + '|' + address ;
58
- }
25
+ @inject ( UserFields )
26
+ private readonly userFields : UserFields ;
59
27
60
28
override registerCommands ( registry : CommandRegistry ) : void {
61
29
registry . registerCommand ( UploadSketch . Commands . UPLOAD_SKETCH , {
62
30
execute : async ( ) => {
63
- const key = this . selectedFqbnAddress ( ) ;
64
- if (
65
- this . boardRequiresUserFields &&
66
- key &&
67
- ! this . cachedUserFields . has ( key )
68
- ) {
69
- // Deep clone the array of board fields to avoid editing the cached ones
70
- this . userFieldsDialog . value = (
71
- await this . boardsServiceProvider . selectedBoardUserFields ( )
72
- ) . map ( ( f ) => ( { ...f } ) ) ;
73
- const result = await this . userFieldsDialog . open ( ) ;
74
- if ( ! result ) {
75
- return ;
76
- }
77
- this . cachedUserFields . set ( key , result ) ;
31
+ if ( await this . userFields . checkUserFieldsDialog ( ) ) {
32
+ this . uploadSketch ( ) ;
78
33
}
79
- this . uploadSketch ( ) ;
80
34
} ,
81
35
isEnabled : ( ) => ! this . uploadInProgress ,
82
36
} ) ;
83
37
registry . registerCommand ( UploadSketch . Commands . UPLOAD_WITH_CONFIGURATION , {
84
38
execute : async ( ) => {
85
- const key = this . selectedFqbnAddress ( ) ;
86
- if ( ! key ) {
87
- return ;
88
- }
89
-
90
- const cached = this . cachedUserFields . get ( key ) ;
91
- // Deep clone the array of board fields to avoid editing the cached ones
92
- this . userFieldsDialog . value = (
93
- cached ?? ( await this . boardsServiceProvider . selectedBoardUserFields ( ) )
94
- ) . map ( ( f ) => ( { ...f } ) ) ;
95
-
96
- const result = await this . userFieldsDialog . open ( ) ;
97
- if ( ! result ) {
98
- return ;
39
+ if ( await this . userFields . checkUserFieldsDialog ( true ) ) {
40
+ this . uploadSketch ( ) ;
99
41
}
100
- this . cachedUserFields . set ( key , result ) ;
101
- this . uploadSketch ( ) ;
102
42
} ,
103
- isEnabled : ( ) => ! this . uploadInProgress && this . boardRequiresUserFields ,
43
+ isEnabled : ( ) => ! this . uploadInProgress && this . userFields . isRequired ( ) ,
104
44
} ) ;
105
45
registry . registerCommand (
106
46
UploadSketch . Commands . UPLOAD_SKETCH_USING_PROGRAMMER ,
@@ -120,45 +60,20 @@ export class UploadSketch extends CoreServiceContribution {
120
60
}
121
61
122
62
override registerMenus ( registry : MenuModelRegistry ) : void {
123
- this . menuActionsDisposables . dispose ( ) ;
124
- this . menuActionsDisposables . push (
125
- registry . registerMenuAction ( ArduinoMenus . SKETCH__MAIN_GROUP , {
126
- commandId : UploadSketch . Commands . UPLOAD_SKETCH . id ,
127
- label : nls . localize ( 'arduino/sketch/upload' , 'Upload' ) ,
128
- order : '1' ,
129
- } )
130
- ) ;
131
- if ( this . boardRequiresUserFields ) {
132
- this . menuActionsDisposables . push (
133
- registry . registerMenuAction ( ArduinoMenus . SKETCH__MAIN_GROUP , {
134
- commandId : UploadSketch . Commands . UPLOAD_WITH_CONFIGURATION . id ,
135
- label : UploadSketch . Commands . UPLOAD_WITH_CONFIGURATION . label ,
136
- order : '2' ,
137
- } )
138
- ) ;
139
- } else {
140
- this . menuActionsDisposables . push (
141
- registry . registerMenuNode (
142
- ArduinoMenus . SKETCH__MAIN_GROUP ,
143
- new PlaceholderMenuNode (
144
- ArduinoMenus . SKETCH__MAIN_GROUP ,
145
- // commandId: UploadSketch.Commands.UPLOAD_WITH_CONFIGURATION.id,
146
- UploadSketch . Commands . UPLOAD_WITH_CONFIGURATION . label ,
147
- { order : '2' }
148
- )
149
- )
150
- ) ;
151
- }
152
- this . menuActionsDisposables . push (
153
- registry . registerMenuAction ( ArduinoMenus . SKETCH__MAIN_GROUP , {
154
- commandId : UploadSketch . Commands . UPLOAD_SKETCH_USING_PROGRAMMER . id ,
155
- label : nls . localize (
156
- 'arduino/sketch/uploadUsingProgrammer' ,
157
- 'Upload Using Programmer'
158
- ) ,
159
- order : '3' ,
160
- } )
161
- ) ;
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
+ } ) ;
162
77
}
163
78
164
79
override registerKeybindings ( registry : KeybindingRegistry ) : void {
@@ -215,18 +130,7 @@ export class UploadSketch extends CoreServiceContribution {
215
130
return ;
216
131
}
217
132
218
- // TODO: This does not belong here.
219
- // IDE2 should not do any preliminary checks but let the CLI fail and then toast a user consumable error message.
220
- if (
221
- uploadOptions . userFields . length === 0 &&
222
- this . boardRequiresUserFields
223
- ) {
224
- this . messageService . error (
225
- nls . localize (
226
- 'arduino/sketch/userFieldsNotFoundError' ,
227
- "Can't find user fields for connected board"
228
- )
229
- ) ;
133
+ if ( ! this . userFields . checkUserFieldsForUpload ( ) ) {
230
134
return ;
231
135
}
232
136
@@ -242,6 +146,7 @@ export class UploadSketch extends CoreServiceContribution {
242
146
{ timeout : 3000 }
243
147
) ;
244
148
} catch ( e ) {
149
+ this . userFields . notifyFailedWithError ( e ) ;
245
150
this . handleError ( e ) ;
246
151
} finally {
247
152
this . uploadInProgress = false ;
@@ -258,7 +163,7 @@ export class UploadSketch extends CoreServiceContribution {
258
163
if ( ! CurrentSketch . isValid ( sketch ) ) {
259
164
return undefined ;
260
165
}
261
- const userFields = this . userFields ( ) ;
166
+ const userFields = this . userFields . getUserFields ( ) ;
262
167
const { boardsConfig } = this . boardsServiceProvider ;
263
168
const [ fqbn , { selectedProgrammer : programmer } , verify , verbose ] =
264
169
await Promise . all ( [
@@ -301,10 +206,6 @@ export class UploadSketch extends CoreServiceContribution {
301
206
return port ;
302
207
}
303
208
304
- private userFields ( ) : BoardUserField [ ] {
305
- return this . cachedUserFields . get ( this . selectedFqbnAddress ( ) ) ?? [ ] ;
306
- }
307
-
308
209
/**
309
210
* Converts the `VENDOR:ARCHITECTURE:BOARD_ID[:MENU_ID=OPTION_ID[,MENU2_ID=OPTION_ID ...]]` FQBN to
310
211
* `VENDOR:ARCHITECTURE:BOARD_ID` format.
0 commit comments