From bbc3011084cdd6160b1316e06fc0231eddc9643d Mon Sep 17 00:00:00 2001 From: Vigilans Date: Tue, 16 Apr 2019 20:12:27 +0800 Subject: [PATCH 01/10] Add side mode to webview --- src/commands/show.ts | 6 +++- src/webview/LeetCodeWebview.ts | 11 +++++-- src/webview/leetCodePreviewProvider.ts | 40 +++++++++++++++++++------ src/webview/leetCodeSolutionProvider.ts | 23 ++++++++++---- 4 files changed, 63 insertions(+), 17 deletions(-) diff --git a/src/commands/show.ts b/src/commands/show.ts index 8b9929d5..f30178e8 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -12,6 +12,7 @@ import { IProblem, IQuickItemEx, languages, ProblemState } from "../shared"; import { DialogOptions, DialogType, promptForOpenOutputChannel, promptForSignIn } from "../utils/uiUtils"; import { selectWorkspaceFolder } from "../utils/workspaceUtils"; import * as wsl from "../utils/wslUtils"; +import { leetCodePreviewProvider } from "../webview/leetCodePreviewProvider"; import { leetCodeSolutionProvider } from "../webview/leetCodeSolutionProvider"; import * as list from "./list"; @@ -111,7 +112,10 @@ async function showProblemInternal(node: IProblem): Promise { const originFilePath: string = await leetCodeExecutor.showProblem(node, language, outDir); const filePath: string = wsl.useWsl() ? await wsl.toWinPath(originFilePath) : originFilePath; - await vscode.window.showTextDocument(vscode.Uri.file(filePath), { preview: false, viewColumn: vscode.ViewColumn.One }); + await Promise.all([ + vscode.window.showTextDocument(vscode.Uri.file(filePath), { preview: false, viewColumn: vscode.ViewColumn.One }), + leetCodePreviewProvider.show(node, true), + ]); } catch (error) { await promptForOpenOutputChannel("Failed to show the problem. Please open the output channel for details.", DialogType.error); } diff --git a/src/webview/LeetCodeWebview.ts b/src/webview/LeetCodeWebview.ts index 7b0e9b8d..f42f4690 100644 --- a/src/webview/LeetCodeWebview.ts +++ b/src/webview/LeetCodeWebview.ts @@ -1,7 +1,7 @@ // Copyright (c) jdneo. All rights reserved. // Licensed under the MIT license. -import { ConfigurationChangeEvent, Disposable, ViewColumn, WebviewPanel, window, workspace } from "vscode"; +import { commands, ConfigurationChangeEvent, Disposable, ViewColumn, WebviewPanel, window, workspace } from "vscode"; import { markdownEngine } from "./markdownEngine"; export abstract class LeetCodeWebview implements Disposable { @@ -30,7 +30,14 @@ export abstract class LeetCodeWebview implements Disposable { workspace.onDidChangeConfiguration(this.onDidChangeConfiguration, this, this.listeners); } else { this.panel.title = title; - this.panel.reveal(viewColumn, preserveFocus); + if (viewColumn === ViewColumn.Two) { + // Make sure second group exists. See vscode#71608 issue + commands.executeCommand("workbench.action.focusSecondEditorGroup").then(() => { + this.panel!.reveal(viewColumn, preserveFocus); + }); + } else { + this.panel.reveal(viewColumn, preserveFocus); + } } this.panel.webview.html = this.getWebviewContent(); } diff --git a/src/webview/leetCodePreviewProvider.ts b/src/webview/leetCodePreviewProvider.ts index 9189d769..d69876b3 100644 --- a/src/webview/leetCodePreviewProvider.ts +++ b/src/webview/leetCodePreviewProvider.ts @@ -11,19 +11,40 @@ class LeetCodePreviewProvider extends LeetCodeWebview { private node: IProblem; private description: IDescription; + private sideMode: boolean = false; - public async show(node: IProblem): Promise { + public isSideMode(): boolean { + return this.sideMode; + } + + public async show(node: IProblem, isSideMode: boolean = false): Promise { this.description = this.parseDescription(await leetCodeExecutor.getDescription(node), node); this.node = node; + this.sideMode = isSideMode; this.showWebviewInternal(); + if (this.sideMode) { + // Hide the side bar for better view area + commands.executeCommand("workbench.action.focusSideBar").then(() => { + commands.executeCommand("workbench.action.toggleSidebarVisibility"); + }); + } } protected getWebviewOption(): ILeetCodeWebviewOption { - return { - viewType: "leetcode.preview", - title: `${this.node.name}: Preview`, - viewColumn: ViewColumn.One, - }; + if (!this.sideMode) { + return { + viewType: "leetcode.preview", + title: `${this.node.name}: Preview`, + viewColumn: ViewColumn.One, + }; + } else { + return { + viewType: "leetcode.preview", + title: "Description", + viewColumn: ViewColumn.Two, + preserveFocus: true, + }; + } } protected getWebviewContent(): string { @@ -84,7 +105,7 @@ class LeetCodePreviewProvider extends LeetCodeWebview { ${markdownEngine.getStyles()} - ${button.style} + ${!this.sideMode ? button.style : ""} ${head} @@ -92,10 +113,10 @@ class LeetCodePreviewProvider extends LeetCodeWebview { ${tags} ${companies} ${body} - ${button.element} + ${!this.sideMode ? button.element : ""} @@ -106,6 +127,7 @@ class LeetCodePreviewProvider extends LeetCodeWebview { super.onDidDisposeWebview(); delete this.node; delete this.description; + this.sideMode = false; } protected async onDidReceiveMessage(message: IWebViewMessage): Promise { diff --git a/src/webview/leetCodeSolutionProvider.ts b/src/webview/leetCodeSolutionProvider.ts index b433d5ba..e00207b0 100644 --- a/src/webview/leetCodeSolutionProvider.ts +++ b/src/webview/leetCodeSolutionProvider.ts @@ -3,24 +3,36 @@ import { ViewColumn } from "vscode"; import { IProblem } from "../shared"; +import { leetCodePreviewProvider } from "./leetCodePreviewProvider"; import { ILeetCodeWebviewOption, LeetCodeWebview } from "./LeetCodeWebview"; import { markdownEngine } from "./markdownEngine"; class LeetCodeSolutionProvider extends LeetCodeWebview { private solution: Solution; + private sideMode: boolean = false; public async show(solutionString: string, problem: IProblem): Promise { this.solution = this.parseSolution(solutionString, problem); + this.sideMode = leetCodePreviewProvider.isSideMode(); this.showWebviewInternal(); } protected getWebviewOption(): ILeetCodeWebviewOption { - return { - viewType: "leetcode.solution", - title: `${this.solution.problem}: Solution`, - viewColumn: ViewColumn.One, - }; + if (!this.sideMode) { + return { + viewType: "leetcode.solution", + title: `${this.solution.problem}: Solution`, + viewColumn: ViewColumn.One, + }; + } else { + return { + viewType: "leetcode.solution", + title: "Solution", + viewColumn: ViewColumn.Two, + preserveFocus: true, + }; + } } protected getWebviewContent(): string { @@ -55,6 +67,7 @@ class LeetCodeSolutionProvider extends LeetCodeWebview { protected onDidDisposeWebview(): void { super.onDidDisposeWebview(); delete this.solution; + this.sideMode = false; } private parseSolution(raw: string, problem: IProblem): Solution { From 8aa0614ef2747ddee9c6856ab698550622e3db1a Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sun, 21 Apr 2019 19:25:16 +0800 Subject: [PATCH 02/10] Update vscode-leetcode-cli version --- package-lock.json | 6 +++--- package.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index 92f93c1a..9db2eaa5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1782,9 +1782,9 @@ } }, "vsc-leetcode-cli": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.6.3.tgz", - "integrity": "sha512-o6rR4FRaYFV6JBV3bLEvi/OCgRknxRZyC2MQY/ayS9emDNjS/9wr1LDoWJn6tDIR7JwOFLSSTQcpc3DwMsFtkA==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/vsc-leetcode-cli/-/vsc-leetcode-cli-2.6.4.tgz", + "integrity": "sha512-vHcy2WQmQlcm2jB2m5Z+2RfuW0/4S+WjOhXE7twn2lvMgb9jqq3h+MYVHr1ijxraRwiCb5sGknz0T17zkob3gA==", "requires": { "ansi-styles": "3.2.1", "cheerio": "0.20.0", diff --git a/package.json b/package.json index 1971214b..f559afdf 100644 --- a/package.json +++ b/package.json @@ -338,6 +338,6 @@ "markdown-it": "^8.4.2", "require-from-string": "^2.0.2", "unescape-js": "^1.1.1", - "vsc-leetcode-cli": "2.6.3" + "vsc-leetcode-cli": "2.6.4" } } From 5fff27c5fa256244e4c97c676c39870021442d61 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sun, 21 Apr 2019 19:47:39 +0800 Subject: [PATCH 03/10] Make `viewType` an inheriatble member of webview --- src/webview/LeetCodeWebview.ts | 6 +++--- src/webview/leetCodePreviewProvider.ts | 3 +-- src/webview/leetCodeSolutionProvider.ts | 3 +-- src/webview/leetCodeSubmissionProvider.ts | 2 +- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/webview/LeetCodeWebview.ts b/src/webview/LeetCodeWebview.ts index f42f4690..5ce92495 100644 --- a/src/webview/LeetCodeWebview.ts +++ b/src/webview/LeetCodeWebview.ts @@ -6,6 +6,7 @@ import { markdownEngine } from "./markdownEngine"; export abstract class LeetCodeWebview implements Disposable { + protected viewType: string = "leetcode.webview"; protected panel: WebviewPanel | undefined; private listeners: Disposable[] = []; @@ -16,9 +17,9 @@ export abstract class LeetCodeWebview implements Disposable { } protected showWebviewInternal(): void { - const { viewType, title, viewColumn, preserveFocus } = this.getWebviewOption(); + const { title, viewColumn, preserveFocus } = this.getWebviewOption(); if (!this.panel) { - this.panel = window.createWebviewPanel(viewType, title, { viewColumn, preserveFocus }, { + this.panel = window.createWebviewPanel(this.viewType, title, { viewColumn, preserveFocus }, { enableScripts: true, enableCommandUris: true, enableFindWidget: true, @@ -64,7 +65,6 @@ export abstract class LeetCodeWebview implements Disposable { } export interface ILeetCodeWebviewOption { - viewType: string; title: string; viewColumn: ViewColumn; preserveFocus?: boolean; diff --git a/src/webview/leetCodePreviewProvider.ts b/src/webview/leetCodePreviewProvider.ts index d69876b3..07513c00 100644 --- a/src/webview/leetCodePreviewProvider.ts +++ b/src/webview/leetCodePreviewProvider.ts @@ -9,6 +9,7 @@ import { markdownEngine } from "./markdownEngine"; class LeetCodePreviewProvider extends LeetCodeWebview { + protected viewType: string = "leetcode.preview"; private node: IProblem; private description: IDescription; private sideMode: boolean = false; @@ -33,13 +34,11 @@ class LeetCodePreviewProvider extends LeetCodeWebview { protected getWebviewOption(): ILeetCodeWebviewOption { if (!this.sideMode) { return { - viewType: "leetcode.preview", title: `${this.node.name}: Preview`, viewColumn: ViewColumn.One, }; } else { return { - viewType: "leetcode.preview", title: "Description", viewColumn: ViewColumn.Two, preserveFocus: true, diff --git a/src/webview/leetCodeSolutionProvider.ts b/src/webview/leetCodeSolutionProvider.ts index e00207b0..a07bef6f 100644 --- a/src/webview/leetCodeSolutionProvider.ts +++ b/src/webview/leetCodeSolutionProvider.ts @@ -9,6 +9,7 @@ import { markdownEngine } from "./markdownEngine"; class LeetCodeSolutionProvider extends LeetCodeWebview { + protected viewType: string = "leetcode.solution"; private solution: Solution; private sideMode: boolean = false; @@ -21,13 +22,11 @@ class LeetCodeSolutionProvider extends LeetCodeWebview { protected getWebviewOption(): ILeetCodeWebviewOption { if (!this.sideMode) { return { - viewType: "leetcode.solution", title: `${this.solution.problem}: Solution`, viewColumn: ViewColumn.One, }; } else { return { - viewType: "leetcode.solution", title: "Solution", viewColumn: ViewColumn.Two, preserveFocus: true, diff --git a/src/webview/leetCodeSubmissionProvider.ts b/src/webview/leetCodeSubmissionProvider.ts index d12e6f41..75b03f86 100644 --- a/src/webview/leetCodeSubmissionProvider.ts +++ b/src/webview/leetCodeSubmissionProvider.ts @@ -7,6 +7,7 @@ import { markdownEngine } from "./markdownEngine"; class LeetCodeSubmissionProvider extends LeetCodeWebview { + protected viewType: string = "leetcode.submission"; private result: string; public async show(result: string): Promise { @@ -16,7 +17,6 @@ class LeetCodeSubmissionProvider extends LeetCodeWebview { protected getWebviewOption(): ILeetCodeWebviewOption { return { - viewType: "leetcode.submission", title: "Submission", viewColumn: ViewColumn.Two, }; From 5bb71c87e1902883f542110132459ebf0747a0b9 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sun, 21 Apr 2019 19:49:55 +0800 Subject: [PATCH 04/10] Make `viewType` readonly --- src/webview/LeetCodeWebview.ts | 2 +- src/webview/leetCodePreviewProvider.ts | 2 +- src/webview/leetCodeSolutionProvider.ts | 2 +- src/webview/leetCodeSubmissionProvider.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/webview/LeetCodeWebview.ts b/src/webview/LeetCodeWebview.ts index 5ce92495..adac21e8 100644 --- a/src/webview/LeetCodeWebview.ts +++ b/src/webview/LeetCodeWebview.ts @@ -6,7 +6,7 @@ import { markdownEngine } from "./markdownEngine"; export abstract class LeetCodeWebview implements Disposable { - protected viewType: string = "leetcode.webview"; + protected readonly viewType: string = "leetcode.webview"; protected panel: WebviewPanel | undefined; private listeners: Disposable[] = []; diff --git a/src/webview/leetCodePreviewProvider.ts b/src/webview/leetCodePreviewProvider.ts index 07513c00..905a3dcb 100644 --- a/src/webview/leetCodePreviewProvider.ts +++ b/src/webview/leetCodePreviewProvider.ts @@ -9,7 +9,7 @@ import { markdownEngine } from "./markdownEngine"; class LeetCodePreviewProvider extends LeetCodeWebview { - protected viewType: string = "leetcode.preview"; + protected readonly viewType: string = "leetcode.preview"; private node: IProblem; private description: IDescription; private sideMode: boolean = false; diff --git a/src/webview/leetCodeSolutionProvider.ts b/src/webview/leetCodeSolutionProvider.ts index a07bef6f..a797f966 100644 --- a/src/webview/leetCodeSolutionProvider.ts +++ b/src/webview/leetCodeSolutionProvider.ts @@ -9,7 +9,7 @@ import { markdownEngine } from "./markdownEngine"; class LeetCodeSolutionProvider extends LeetCodeWebview { - protected viewType: string = "leetcode.solution"; + protected readonly viewType: string = "leetcode.solution"; private solution: Solution; private sideMode: boolean = false; diff --git a/src/webview/leetCodeSubmissionProvider.ts b/src/webview/leetCodeSubmissionProvider.ts index 75b03f86..74bdb4f8 100644 --- a/src/webview/leetCodeSubmissionProvider.ts +++ b/src/webview/leetCodeSubmissionProvider.ts @@ -7,7 +7,7 @@ import { markdownEngine } from "./markdownEngine"; class LeetCodeSubmissionProvider extends LeetCodeWebview { - protected viewType: string = "leetcode.submission"; + protected readonly viewType: string = "leetcode.submission"; private result: string; public async show(result: string): Promise { From 51548f0800a5b5ca6f29eac78fba8d95fe6f398d Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sun, 21 Apr 2019 20:18:27 +0800 Subject: [PATCH 05/10] Extract `getDescription` out of `webview.show` & make `webview.show` not an async function --- src/commands/show.ts | 9 +++++++-- src/commands/submit.ts | 2 +- src/commands/test.ts | 2 +- src/extension.ts | 2 +- src/webview/leetCodePreviewProvider.ts | 5 ++--- src/webview/leetCodeSolutionProvider.ts | 2 +- src/webview/leetCodeSubmissionProvider.ts | 2 +- 7 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/commands/show.ts b/src/commands/show.ts index d5d7142e..574a91a5 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -17,6 +17,11 @@ import { leetCodePreviewProvider } from "../webview/leetCodePreviewProvider"; import { leetCodeSolutionProvider } from "../webview/leetCodeSolutionProvider"; import * as list from "./list"; +export async function previewProblem(node: IProblem, isSideMode: boolean = false): Promise { + const descString: string = await leetCodeExecutor.getDescription(node); + leetCodePreviewProvider.show(descString, node, isSideMode); +} + export async function showProblem(node?: LeetCodeNode): Promise { if (!node) { return; @@ -52,7 +57,7 @@ export async function showSolution(node?: LeetCodeNode): Promise { } try { const solution: string = await leetCodeExecutor.showSolution(node, language); - await leetCodeSolutionProvider.show(unescapeJS(solution), node); + leetCodeSolutionProvider.show(unescapeJS(solution), node); } catch (error) { leetCodeChannel.appendLine(error.toString()); await promptForOpenOutputChannel("Failed to fetch the top voted solution. Please open the output channel for details.", DialogType.error); @@ -114,7 +119,7 @@ async function showProblemInternal(node: IProblem): Promise { const filePath: string = wsl.useWsl() ? await wsl.toWinPath(originFilePath) : originFilePath; await Promise.all([ vscode.window.showTextDocument(vscode.Uri.file(filePath), { preview: false, viewColumn: vscode.ViewColumn.One }), - leetCodePreviewProvider.show(node, true), + previewProblem(node, true), ]); } catch (error) { await promptForOpenOutputChannel("Failed to show the problem. Please open the output channel for details.", DialogType.error); diff --git a/src/commands/submit.ts b/src/commands/submit.ts index 2035ec11..f6e2d989 100644 --- a/src/commands/submit.ts +++ b/src/commands/submit.ts @@ -21,7 +21,7 @@ export async function submitSolution(uri?: vscode.Uri): Promise { try { const result: string = await leetCodeExecutor.submitSolution(filePath); - await leetCodeSubmissionProvider.show(result); + leetCodeSubmissionProvider.show(result); } catch (error) { await promptForOpenOutputChannel("Failed to submit the solution. Please open the output channel for details.", DialogType.error); } diff --git a/src/commands/test.ts b/src/commands/test.ts index 558f7409..262f7339 100644 --- a/src/commands/test.ts +++ b/src/commands/test.ts @@ -81,7 +81,7 @@ export async function testSolution(uri?: vscode.Uri): Promise { if (!result) { return; } - await leetCodeSubmissionProvider.show(result); + leetCodeSubmissionProvider.show(result); } catch (error) { await promptForOpenOutputChannel("Failed to test the solution. Please open the output channel for details.", DialogType.error); } diff --git a/src/extension.ts b/src/extension.ts index 60138085..877ff90c 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -51,7 +51,7 @@ export async function activate(context: vscode.ExtensionContext): Promise vscode.commands.registerCommand("leetcode.signout", () => leetCodeManager.signOut()), vscode.commands.registerCommand("leetcode.selectSessions", () => session.selectSession()), vscode.commands.registerCommand("leetcode.createSession", () => session.createSession()), - vscode.commands.registerCommand("leetcode.previewProblem", (node: LeetCodeNode) => leetCodePreviewProvider.show(node)), + vscode.commands.registerCommand("leetcode.previewProblem", (node: LeetCodeNode) => show.previewProblem(node)), vscode.commands.registerCommand("leetcode.showProblem", (node: LeetCodeNode) => show.showProblem(node)), vscode.commands.registerCommand("leetcode.searchProblem", () => show.searchProblem()), vscode.commands.registerCommand("leetcode.showSolution", (node: LeetCodeNode) => show.showSolution(node)), diff --git a/src/webview/leetCodePreviewProvider.ts b/src/webview/leetCodePreviewProvider.ts index 905a3dcb..46195004 100644 --- a/src/webview/leetCodePreviewProvider.ts +++ b/src/webview/leetCodePreviewProvider.ts @@ -2,7 +2,6 @@ // Licensed under the MIT license. import { commands, ViewColumn } from "vscode"; -import { leetCodeExecutor } from "../leetCodeExecutor"; import { IProblem } from "../shared"; import { ILeetCodeWebviewOption, LeetCodeWebview } from "./LeetCodeWebview"; import { markdownEngine } from "./markdownEngine"; @@ -18,8 +17,8 @@ class LeetCodePreviewProvider extends LeetCodeWebview { return this.sideMode; } - public async show(node: IProblem, isSideMode: boolean = false): Promise { - this.description = this.parseDescription(await leetCodeExecutor.getDescription(node), node); + public show(descString: string, node: IProblem, isSideMode: boolean = false): void { + this.description = this.parseDescription(descString, node); this.node = node; this.sideMode = isSideMode; this.showWebviewInternal(); diff --git a/src/webview/leetCodeSolutionProvider.ts b/src/webview/leetCodeSolutionProvider.ts index a797f966..72d22abf 100644 --- a/src/webview/leetCodeSolutionProvider.ts +++ b/src/webview/leetCodeSolutionProvider.ts @@ -13,7 +13,7 @@ class LeetCodeSolutionProvider extends LeetCodeWebview { private solution: Solution; private sideMode: boolean = false; - public async show(solutionString: string, problem: IProblem): Promise { + public show(solutionString: string, problem: IProblem): void { this.solution = this.parseSolution(solutionString, problem); this.sideMode = leetCodePreviewProvider.isSideMode(); this.showWebviewInternal(); diff --git a/src/webview/leetCodeSubmissionProvider.ts b/src/webview/leetCodeSubmissionProvider.ts index 74bdb4f8..6905099e 100644 --- a/src/webview/leetCodeSubmissionProvider.ts +++ b/src/webview/leetCodeSubmissionProvider.ts @@ -10,7 +10,7 @@ class LeetCodeSubmissionProvider extends LeetCodeWebview { protected readonly viewType: string = "leetcode.submission"; private result: string; - public async show(result: string): Promise { + public show(result: string): void { this.result = result; this.showWebviewInternal(); } From cd62633a64cc54ee07f4a637c599f76f6dca5a3f Mon Sep 17 00:00:00 2001 From: Vigilans Date: Sun, 21 Apr 2019 20:38:00 +0800 Subject: [PATCH 06/10] Add `enableSideMode` configuration --- package.json | 6 ++++++ src/commands/show.ts | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f559afdf..ce5e0324 100644 --- a/package.json +++ b/package.json @@ -301,6 +301,12 @@ "scope": "application", "description": "Show the submit and test shortcuts in editor or not." }, + "leetcode.enableSideMode": { + "type": "boolean", + "default": true, + "scope": "application", + "description": "Determine whether to group all webview pages into Column 2 when solving problems." + }, "leetcode.nodePath": { "type": "string", "default": "node", diff --git a/src/commands/show.ts b/src/commands/show.ts index 574a91a5..e0f956fd 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -101,7 +101,7 @@ async function showProblemInternal(node: IProblem): Promise { // SUGGESTION: group config retriving into one file const leetCodeConfig: vscode.WorkspaceConfiguration = vscode.workspace.getConfiguration("leetcode"); let outDir: string = await selectWorkspaceFolder(); - let relativePath: string = (leetCodeConfig.get("outputFolder") || "").trim(); + let relativePath: string = (leetCodeConfig.get("outputFolder", "")).trim(); const matchResult: RegExpMatchArray | null = relativePath.match(/\$\{(.*?)\}/); if (matchResult) { const resolvedPath: string | undefined = await resolveRelativePath(matchResult[1].toLocaleLowerCase(), node, language); @@ -119,7 +119,7 @@ async function showProblemInternal(node: IProblem): Promise { const filePath: string = wsl.useWsl() ? await wsl.toWinPath(originFilePath) : originFilePath; await Promise.all([ vscode.window.showTextDocument(vscode.Uri.file(filePath), { preview: false, viewColumn: vscode.ViewColumn.One }), - previewProblem(node, true), + leetCodeConfig.get("enableSideMode", true) ? previewProblem(node, true) : Promise.resolve(), ]); } catch (error) { await promptForOpenOutputChannel("Failed to show the problem. Please open the output channel for details.", DialogType.error); From d0f5141e5b650fe401a39d4b2b73b3b7dd300f77 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Mon, 22 Apr 2019 12:16:48 +0800 Subject: [PATCH 07/10] Extract `preview.hideSidebar` method --- src/webview/leetCodePreviewProvider.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/webview/leetCodePreviewProvider.ts b/src/webview/leetCodePreviewProvider.ts index 46195004..11b32fc4 100644 --- a/src/webview/leetCodePreviewProvider.ts +++ b/src/webview/leetCodePreviewProvider.ts @@ -23,10 +23,7 @@ class LeetCodePreviewProvider extends LeetCodeWebview { this.sideMode = isSideMode; this.showWebviewInternal(); if (this.sideMode) { - // Hide the side bar for better view area - commands.executeCommand("workbench.action.focusSideBar").then(() => { - commands.executeCommand("workbench.action.toggleSidebarVisibility"); - }); + this.hideSideBar(); // For better view area } } @@ -137,6 +134,11 @@ class LeetCodePreviewProvider extends LeetCodeWebview { } } + private async hideSideBar(): Promise { + await commands.executeCommand("workbench.action.focusSideBar"); + await commands.executeCommand("workbench.action.toggleSidebarVisibility"); + } + private parseDescription(descString: string, problem: IProblem): IDescription { const [ /* title */, , From 99d9b703e77fb1aaaf6683bcaec6c56ea30768ff Mon Sep 17 00:00:00 2001 From: Vigilans Date: Mon, 22 Apr 2019 12:17:39 +0800 Subject: [PATCH 08/10] Update `enableSideMode` description --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ce5e0324..6df14382 100644 --- a/package.json +++ b/package.json @@ -305,7 +305,7 @@ "type": "boolean", "default": true, "scope": "application", - "description": "Determine whether to group all webview pages into Column 2 when solving problems." + "description": "Determine whether to group all webview pages into the second editor column when solving problems." }, "leetcode.nodePath": { "type": "string", From 1e0304ccfbdfecfc4246ebb61ccaf206a1b0678e Mon Sep 17 00:00:00 2001 From: Vigilans Date: Mon, 22 Apr 2019 12:45:41 +0800 Subject: [PATCH 09/10] Side mode modification --- src/commands/show.ts | 10 +++++++++- src/webview/leetCodeSolutionProvider.ts | 5 +---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/commands/show.ts b/src/commands/show.ts index e0f956fd..1f7b7e52 100644 --- a/src/commands/show.ts +++ b/src/commands/show.ts @@ -119,13 +119,21 @@ async function showProblemInternal(node: IProblem): Promise { const filePath: string = wsl.useWsl() ? await wsl.toWinPath(originFilePath) : originFilePath; await Promise.all([ vscode.window.showTextDocument(vscode.Uri.file(filePath), { preview: false, viewColumn: vscode.ViewColumn.One }), - leetCodeConfig.get("enableSideMode", true) ? previewProblem(node, true) : Promise.resolve(), + movePreviewAsideIfNeeded(node), ]); } catch (error) { await promptForOpenOutputChannel("Failed to show the problem. Please open the output channel for details.", DialogType.error); } } +async function movePreviewAsideIfNeeded(node: IProblem): Promise { + if (vscode.workspace.getConfiguration("leetcode").get("enableSideMode", true)) { + return previewProblem(node, true); + } else { + return Promise.resolve(); + } +} + async function parseProblemsToPicks(p: Promise): Promise>> { return new Promise(async (resolve: (res: Array>) => void): Promise => { const picks: Array> = (await p).map((problem: IProblem) => Object.assign({}, { diff --git a/src/webview/leetCodeSolutionProvider.ts b/src/webview/leetCodeSolutionProvider.ts index 72d22abf..952af2cd 100644 --- a/src/webview/leetCodeSolutionProvider.ts +++ b/src/webview/leetCodeSolutionProvider.ts @@ -11,16 +11,14 @@ class LeetCodeSolutionProvider extends LeetCodeWebview { protected readonly viewType: string = "leetcode.solution"; private solution: Solution; - private sideMode: boolean = false; public show(solutionString: string, problem: IProblem): void { this.solution = this.parseSolution(solutionString, problem); - this.sideMode = leetCodePreviewProvider.isSideMode(); this.showWebviewInternal(); } protected getWebviewOption(): ILeetCodeWebviewOption { - if (!this.sideMode) { + if (!leetCodePreviewProvider.isSideMode()) { return { title: `${this.solution.problem}: Solution`, viewColumn: ViewColumn.One, @@ -66,7 +64,6 @@ class LeetCodeSolutionProvider extends LeetCodeWebview { protected onDidDisposeWebview(): void { super.onDidDisposeWebview(); delete this.solution; - this.sideMode = false; } private parseSolution(raw: string, problem: IProblem): Solution { From 0440cddfe50a18e1f18a5b97d28fc5862ea35bf4 Mon Sep 17 00:00:00 2001 From: Vigilans Date: Mon, 22 Apr 2019 14:05:37 +0800 Subject: [PATCH 10/10] Add side mode document --- README.md | 1 + docs/README_zh-CN.md | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index 21b3afaf..7e89a880 100644 --- a/README.md +++ b/README.md @@ -141,6 +141,7 @@ | `leetcode.outputFolder`| Specify the relative path to save the problem files. Besides using customized path, there are also several reserved words which can be used here:
  • `${tag}`: Categorize the problem according to their tags.
  • `${language}`: Categorize the problem according to their language.
  • `${difficulty}`: Categorize the problem according to their difficulty.
| N/A | | `leetcode.enableStatusBar` | Specify whether the LeetCode status bar will be shown or not. | `true` | | `leetcode.enableShortcuts` | Specify whether the submit and test shortcuts in editor or not. | `true` | +| `leetcode.enableSideMode` | Specify whether `preview`, `solution` and `submission` tab should be grouped into the second editor column when solving a problem. | `true` | | `leetcode.nodePath` | Specify the `Node.js` executable path. | `node` | ## Want Help? diff --git a/docs/README_zh-CN.md b/docs/README_zh-CN.md index 070f5d61..554103b7 100644 --- a/docs/README_zh-CN.md +++ b/docs/README_zh-CN.md @@ -141,6 +141,7 @@ | `leetcode.outputFolder` | 指定保存文件时所用的相对文件夹路径。除了用户自定义路径外,也可以使用保留项,包括:
  • `${tag}`: 根据题目的类别进行分类。
  • `${language}`: 根据题目的语言进行分类。
  • `${difficulty}`: 根据题目的难度进行分类。
| N/A | | `leetcode.enableStatusBar` | 指定是否在 VS Code 下方显示插件状态栏。 | `true` | | `leetcode.enableShortcuts` | 指定是否在 VS Code 编辑文件下方显示提交和测试的快捷按钮。 | `true` | +| `leetcode.enableSideMode` | 指定在解决一道题时,是否将`问题预览`、`高票答案`与`提交结果`窗口集中在编辑器的第二栏。 | `true` | | `leetcode.nodePath` | 指定 `Node.js` 可执行文件的路径。 | `node` | ## 需要帮助?