Skip to content

Commit 7f8d3bd

Browse files
committed
Add Preview Function(LeetCode-OpenSource#132)
Remove unused function Use rem instead of px Use the VS Code embed CSS vars in Preivew Webview Use spaces instead of tabs in package.json Use previewProvider to manage preivew logic
1 parent be596bd commit 7f8d3bd

File tree

7 files changed

+69
-42
lines changed

7 files changed

+69
-42
lines changed

package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
"onCommand:leetcode.createSession",
3434
"onCommand:leetcode.refreshExplorer",
3535
"onCommand:leetcode.showProblem",
36+
"onCommand:leetcode.previewProblem",
3637
"onCommand:leetcode.searchProblem",
3738
"onCommand:leetcode.testSolution",
3839
"onCommand:leetcode.submitSolution",
@@ -94,7 +95,7 @@
9495
"title": "Show Problem",
9596
"category": "LeetCode"
9697
},
97-
{
98+
{
9899
"command": "leetcode.previewProblem",
99100
"title": "Preview Problem",
100101
"category": "LeetCode"
@@ -170,7 +171,7 @@
170171
"when": "view == leetCodeExplorer && viewItem == problem",
171172
"group": "leetcode@1"
172173
},
173-
{
174+
{
174175
"command": "leetcode.previewProblem",
175176
"when": "view == leetCodeExplorer && viewItem == problem",
176177
"group": "leetcode@1"

src/commands/show.ts

+1-20
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,8 @@ import { LeetCodeNode } from "../explorer/LeetCodeNode";
88
import { leetCodeChannel } from "../leetCodeChannel";
99
import { leetCodeExecutor } from "../leetCodeExecutor";
1010
import { leetCodeManager } from "../leetCodeManager";
11-
import { Command, IProblem, IQuickItemEx, IWebViewMessage, languages, ProblemState } from "../shared";
11+
import { IProblem, IQuickItemEx, languages, ProblemState } from "../shared";
1212
import { DialogOptions, DialogType, promptForOpenOutputChannel, promptForSignIn } from "../utils/uiUtils";
13-
import { renderHTML } from "../utils/webviewUtils";
1413
import { selectWorkspaceFolder } from "../utils/workspaceUtils";
1514
import * as wsl from "../utils/wslUtils";
1615
import * as list from "./list";
@@ -136,21 +135,3 @@ async function resolveRelativePath(value: string, node: IProblem, selectedLangua
136135
throw new Error(errorMsg);
137136
}
138137
}
139-
140-
export async function previewProblem(node: IProblem): Promise<void> {
141-
const panelType: string = "previewProblem";
142-
const panelTitle: string = node.name;
143-
const panel: vscode.WebviewPanel = vscode.window.createWebviewPanel(panelType, panelTitle, vscode.ViewColumn.Active, {
144-
enableScripts: true,
145-
enableCommandUris: true,
146-
});
147-
panel.webview.onDidReceiveMessage(async (message: IWebViewMessage) => {
148-
switch (message.command) {
149-
case Command.ShowProblem:
150-
await showProblemInternal(node);
151-
panel.dispose();
152-
return;
153-
}
154-
});
155-
panel.webview.html = await renderHTML(node);
156-
}

src/explorer/LeetCodeNode.ts

-7
Original file line numberDiff line numberDiff line change
@@ -58,11 +58,4 @@ export class LeetCodeNode {
5858
};
5959
}
6060

61-
public get selectedCommand(): Command {
62-
return {
63-
title: "Open Problem",
64-
command: "leetcode.showProblem",
65-
arguments: [this],
66-
};
67-
}
6861
}

src/extension.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { LeetCodeTreeDataProvider } from "./explorer/LeetCodeTreeDataProvider";
1515
import { leetCodeChannel } from "./leetCodeChannel";
1616
import { leetCodeExecutor } from "./leetCodeExecutor";
1717
import { leetCodeManager } from "./leetCodeManager";
18+
import { leetCodePreviewProvider } from "./leetCodePreviewProvider";
1819
import { leetCodeResultProvider } from "./leetCodeResultProvider";
1920
import { leetCodeStatusBarItem } from "./leetCodeStatusBarItem";
2021

@@ -29,11 +30,13 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
2930
});
3031

3132
const leetCodeTreeDataProvider: LeetCodeTreeDataProvider = new LeetCodeTreeDataProvider(context);
33+
leetCodePreviewProvider.initialize(context);
3234
leetCodeResultProvider.initialize(context);
3335

3436
context.subscriptions.push(
3537
leetCodeStatusBarItem,
3638
leetCodeChannel,
39+
leetCodePreviewProvider,
3740
leetCodeResultProvider,
3841
vscode.window.registerTreeDataProvider("leetCodeExplorer", leetCodeTreeDataProvider),
3942
vscode.languages.registerCodeLensProvider({ scheme: "file" }, codeLensProvider),
@@ -43,7 +46,7 @@ export async function activate(context: vscode.ExtensionContext): Promise<void>
4346
vscode.commands.registerCommand("leetcode.signout", () => leetCodeManager.signOut()),
4447
vscode.commands.registerCommand("leetcode.selectSessions", () => session.selectSession()),
4548
vscode.commands.registerCommand("leetcode.createSession", () => session.createSession()),
46-
vscode.commands.registerCommand("leetcode.previewProblem", (node: LeetCodeNode) => show.previewProblem(node)),
49+
vscode.commands.registerCommand("leetcode.previewProblem", (node: LeetCodeNode) => leetCodePreviewProvider.preview(node)),
4750
vscode.commands.registerCommand("leetcode.showProblem", (node: LeetCodeNode) => show.showProblem(node)),
4851
vscode.commands.registerCommand("leetcode.searchProblem", () => show.searchProblem()),
4952
vscode.commands.registerCommand("leetcode.refreshExplorer", () => leetCodeTreeDataProvider.refresh()),

src/leetcodePreviewProvider.ts

+53
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { commands, Disposable, ExtensionContext, ViewColumn, WebviewPanel, window } from "vscode";
2+
import { IProblem, IWebViewMessage } from "./shared";
3+
import { renderHTML } from "./utils/webviewUtils";
4+
5+
class LeetCodePreviewProvider implements Disposable {
6+
7+
private context: ExtensionContext;
8+
private panel: WebviewPanel | undefined;
9+
10+
public initialize(context: ExtensionContext): void {
11+
this.context = context;
12+
}
13+
14+
public async preview(node: IProblem): Promise<void> {
15+
if (!this.panel) {
16+
const panelType: string = "previewProblem";
17+
const panelTitle: string = node.name;
18+
this.panel = window.createWebviewPanel(panelType, panelTitle, ViewColumn.Active, {
19+
enableScripts: true,
20+
enableCommandUris: true,
21+
enableFindWidget: true,
22+
retainContextWhenHidden: true,
23+
});
24+
}
25+
26+
this.panel.onDidDispose(() => {
27+
this.panel = undefined;
28+
}, null, this.context.subscriptions);
29+
30+
31+
this.panel.webview.onDidReceiveMessage(async (message: IWebViewMessage) => {
32+
switch (message.command) {
33+
case 'ShowProblem':
34+
await commands.executeCommand("leetcode.showProblem", node);
35+
this.dispose();
36+
return;
37+
}
38+
});
39+
this.panel.webview.html = await this.provideHtmlContent(node);
40+
}
41+
42+
public dispose(): void {
43+
if (this.panel) {
44+
this.panel.dispose();
45+
}
46+
}
47+
48+
private async provideHtmlContent(node: IProblem): Promise<string> {
49+
return await renderHTML(node)
50+
}
51+
}
52+
53+
export const leetCodePreviewProvider: LeetCodePreviewProvider = new LeetCodePreviewProvider();

src/shared.ts

-4
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,6 @@ export enum Category {
9292
Favorite = "Favorite",
9393
}
9494

95-
export enum Command {
96-
ShowProblem = "ShowProblem",
97-
}
98-
9995
export interface IWebViewMessage {
10096
command: string;
10197
}

src/utils/webviewUtils.ts

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { leetCodeExecutor } from "../leetCodeExecutor";
2-
import { Command, IProblem } from "../shared";
2+
import { IProblem } from "../shared";
33

44
export async function renderHTML(node: IProblem): Promise<string> {
55
const description: string = await leetCodeExecutor.getDescription(node);
@@ -15,16 +15,16 @@ export async function renderHTML(node: IProblem): Promise<string> {
1515
<style>
1616
#solve {
1717
position: fixed;
18-
bottom: 10px;
19-
right: 10px;
18+
bottom: 1rem;
19+
right: 1rem;
2020
border: 0;
21-
margin: 10px 0;
22-
padding: 2px 14px;
21+
margin: 1rem 0;
22+
padding: 0.2rem 1rem;
2323
color: white;
24-
background-color: rgb(14, 99, 156);
24+
background-color: var(--vscode-button-background);
2525
}
2626
#solve:hover {
27-
background-color: rgb(17, 119, 187);
27+
background-color: var(--vscode-button-hoverBackground);
2828
}
2929
#solve:active {
3030
border: 0;
@@ -42,7 +42,7 @@ export async function renderHTML(node: IProblem): Promise<string> {
4242
button.onclick = solveHandler;
4343
function solveHandler() {
4444
vscode.postMessage({
45-
command: '${Command.ShowProblem}',
45+
command: 'ShowProblem',
4646
})
4747
}
4848
}())

0 commit comments

Comments
 (0)