diff --git a/src/MPQEditor/MPQCircleSelector.ts b/src/MPQEditor/MPQCircleSelector.ts index 36ccb229..e2542679 100644 --- a/src/MPQEditor/MPQCircleSelector.ts +++ b/src/MPQEditor/MPQCircleSelector.ts @@ -37,7 +37,7 @@ export type MPQSelectionCmdOpenArgs = { }; export type MPQVisqData = { - visqPath: string; + visqJsonData: string[]; }; export type MPQSelectionCmdCloseArgs = { @@ -82,7 +82,7 @@ export class MPQSelectionPanel MPQSelectionPanel.createOrShow( context.extensionUri, args, - "", + [], handler ); } @@ -109,7 +109,7 @@ export class MPQSelectionPanel MPQSelectionPanel.createOrShow( context.extensionUri, args, - visqData.visqPath, + visqData.visqJsonData, handler ); } @@ -125,7 +125,7 @@ export class MPQSelectionPanel public static createOrShow( extensionUri: vscode.Uri, args: MPQSelectionCmdOpenArgs, - visqPath: string, + visqJsonData: string[], handler: MPQSelectionEvent | undefined ) { let column = args.panel.viewColumn; @@ -159,7 +159,7 @@ export class MPQSelectionPanel panel, extensionUri, args, - visqPath, + visqJsonData, handler ); @@ -218,7 +218,7 @@ export class MPQSelectionPanel panel: vscode.WebviewPanel, extensionUri: vscode.Uri, args: MPQSelectionCmdOpenArgs, - visqPath: string, + visqData: string[], handler: MPQSelectionEvent | undefined ) { super(extensionUri, panel.webview); @@ -230,30 +230,17 @@ export class MPQSelectionPanel this._modelPath = args.modelPath; this._mpqEventHandler = handler; this._lastSelected = args.names; - this._visqData = []; + this._visqData = visqData; // Listen for when the panel is disposed // This happens when the user closes the panel or when the panel is closed programmatically this._panel.onDidDispose(() => this.dispose(), null, this._disposables); this.initGraphCtrl(this._modelPath, this); - if (visqPath.length < 1) { + if (this._visqData.length < 1) { this.setMode("selector"); } else { this.setMode("visqselector"); - const visqUri = vscode.Uri.file(visqPath); - vscode.workspace.fs.readFile(visqUri).then((visqData) => { - try { - this._visqData = JSON.parse(visqData.toString()); - } catch (error) { - this.onInvalidVISQData(visqPath); - } - - // check whether _visqData pretend to be valid - if (!("error" in this._visqData) || !("meta" in this._visqData)) { - this.onInvalidVISQData(visqPath); - } - }); } if (this._mpqEventHandler) { this._mpqEventHandler.onOpened(this._ownerPanel); @@ -331,11 +318,4 @@ export class MPQSelectionPanel } this.setSelection(selections); } - - private onInvalidVISQData(_visqPath: string) { - this._visqData = []; - if (this._mpqEventHandler) { - // TODO - } - } } diff --git a/src/MPQEditor/MPQEditor.ts b/src/MPQEditor/MPQEditor.ts index b9d74b5b..118d7489 100644 --- a/src/MPQEditor/MPQEditor.ts +++ b/src/MPQEditor/MPQEditor.ts @@ -666,7 +666,7 @@ export class MPQEditorProvider if (visqPath.length < 1) { this.showCircleModelGraph(document, webviewPanel); } else { - this.showVisqCircleModelGraph(visqPath, document, webviewPanel); + this.processVisqPath(visqPath, document, webviewPanel); } } else { this.closeModelGraphView(document); @@ -677,7 +677,7 @@ export class MPQEditorProvider * @brief Called when it's needed to show visq data in circle-graph */ private showVisqCircleModelGraph( - visqPath: string, + visqJsonData: string[], document: vscode.TextDocument, webviewPanel: vscode.WebviewPanel ) { @@ -689,7 +689,7 @@ export class MPQEditorProvider }; const visqData: MPQVisqData = { - visqPath: visqPath, + visqJsonData: visqJsonData, }; vscode.commands.executeCommand( MPQSelectionPanel.cmdOpenVisq, @@ -700,7 +700,7 @@ export class MPQEditorProvider webviewPanel.webview.postMessage({ type: "VisqFileLoaded", - visqFile: visqPath, + visqFile: this._mpqDataMap[document.uri.toString()].visqPath, }); } @@ -719,10 +719,7 @@ export class MPQEditorProvider // remove invalid path this.removeVisqFile(document, webviewPanel); } else if (path.endsWith(".visq.json")) { - // reload visq - this._mpqDataMap[document.uri.toString()].visqPath = path; - this.closeModelGraphView(document); - this.showVisqCircleModelGraph(path, document, webviewPanel); + this.processVisqPath(path, document, webviewPanel); } } @@ -741,6 +738,40 @@ export class MPQEditorProvider } } + /** + * @brief shows visqPath at selector if it's valid + */ + private processVisqPath( + visqPath: string, + document: vscode.TextDocument, + webviewPanel: vscode.WebviewPanel + ): void { + const visqUri = vscode.Uri.file(visqPath); + vscode.workspace.fs.readFile(visqUri).then((visqData) => { + let visqJsonData = null; + let valid = true; + try { + visqJsonData = JSON.parse(visqData.toString()); + } catch (error) { + valid = false; + } + + // check whether visqData pretend to be valid + valid &&= "error" in visqJsonData && "meta" in visqJsonData; + + if (valid) { + const docUri = document.uri.toString(); + this._mpqDataMap[docUri].visqPath = visqPath; + // close previous view if any + this.closeModelGraphView(document); + // open new view + this.showVisqCircleModelGraph(visqJsonData, document, webviewPanel); + } else { + Balloon.error("Invalid visq file " + visqPath); + } + }); + } + /** * @brief Called when user requests to load visq file from UI */ @@ -759,13 +790,7 @@ export class MPQEditorProvider vscode.window.showOpenDialog(dialogOptions).then((fileUri) => { if (fileUri && fileUri[0]) { const visqPath = fileUri[0].fsPath.toString(); - - const docUri = document.uri.toString(); - this._mpqDataMap[docUri].visqPath = visqPath; - // close previous view if any - this.closeModelGraphView(document); - // open new view - this.showVisqCircleModelGraph(visqPath, document, webviewPanel); + this.processVisqPath(visqPath, document, webviewPanel); } }); }