Skip to content

Commit 9debda7

Browse files
committed
add pic
1 parent ef4cbf9 commit 9debda7

13 files changed

+91
-18
lines changed

package.json

+30-1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414
"onCommand:leetcode.signin",
1515
"onCommand:leetcode.signout",
1616
"onCommand:leetcode.selectSessions",
17+
"onCommand:leetcode.refreshExplorer",
18+
"onCommand:leetcode.showProblem",
19+
"onCommand:leetcode.searchProblem",
1720
"onView:leetCodeExplorer"
1821
],
1922
"main": "./out/src/extension",
@@ -34,10 +37,25 @@
3437
"title": "Select session",
3538
"category": "LeetCode"
3639
},
40+
{
41+
"command": "leetcode.refreshExplorer",
42+
"title": "Refresh",
43+
"category": "LeetCode",
44+
"icon": {
45+
"light": "resources/light/refresh.svg",
46+
"dark": "resources/dark/refresh.svg"
47+
}
48+
},
3749
{
3850
"command": "leetcode.showProblem",
3951
"title": "Solve problem",
4052
"category": "LeetCode"
53+
},
54+
{
55+
"command": "leetcode.searchProblem",
56+
"title": "Search",
57+
"category": "LeetCode",
58+
"icon": "resources/search.png"
4159
}
4260
],
4361
"views": {
@@ -49,7 +67,18 @@
4967
]
5068
},
5169
"menus": {
52-
"view/title": [],
70+
"view/title": [
71+
{
72+
"command": "leetcode.searchProblem",
73+
"when": "view == leetCodeExplorer",
74+
"group": "navigation@1"
75+
},
76+
{
77+
"command": "leetcode.refreshExplorer",
78+
"when": "view == leetCodeExplorer",
79+
"group": "navigation@2"
80+
}
81+
],
5382
"view/item/context": [
5483
{
5584
"command": "leetcode.showProblem",

resources/blank.png

83 Bytes
Loading

resources/check.png

2.99 KB
Loading

resources/dark/refresh.svg

+1
Loading

resources/light/refresh.svg

+1
Loading

resources/search.png

1.31 KB
Loading

src/commands/list.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ export async function listProblems(): Promise<IProblem[]> {
2222
const result: string = await executeCommand("node", [leetCodeBinaryPath, "list", "-q", "L"]);
2323
const problems: IProblem[] = [];
2424
const lines: string[] = result.split("\n");
25-
const reg: RegExp = /(?)\s*\[(\d*)\]\s*(.*)\s*(Easy|Medium|Hard)\s*\((\s*\d+\.\d+ %)\)/;
25+
const reg: RegExp = /(.?)\s*\[\s*(\d*)\]\s*(.*)\s*(Easy|Medium|Hard)\s*\((\s*\d+\.\d+ %)\)/;
2626
for (const line of lines.map((l: string) => l.trim()).filter(Boolean)) {
2727
const match: RegExpMatchArray | null = line.match(reg);
2828
if (match && match.length === 6) {

src/commands/session.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export async function getSessionList(): Promise<ISession[]> {
1414
const result: string = await cp.executeCommand("node", [leetCodeBinaryPath, "session"]);
1515
const lines: string[] = result.split("\n");
1616
const sessions: ISession[] = [];
17-
const reg: RegExp = /(?)\s*(\d+)\s+(.*)\s+(\d+ \(\s*\d+\.\d+ %\))\s+(\d+ \(\s*\d+\.\d+ %\))/;
17+
const reg: RegExp = /(.?)\s*(\d+)\s+(.*)\s+(\d+ \(\s*\d+\.\d+ %\))\s+(\d+ \(\s*\d+\.\d+ %\))/;
1818
for (const line of lines.map((l: string) => l.trim()).filter(Boolean)) {
1919
const match: RegExpMatchArray | null = line.match(reg);
2020
if (match && match.length === 6) {
@@ -32,7 +32,7 @@ export async function getSessionList(): Promise<ISession[]> {
3232

3333
export async function selectSession(): Promise<void> {
3434
const choice: IQuickItemEx<string> | undefined = await vscode.window.showQuickPick(parseSessionsToPicks(getSessionList()));
35-
if (!choice || choice.label.indexOf("✔") > -1) {
35+
if (!choice || choice.description) {
3636
return;
3737
}
3838
try {
@@ -46,8 +46,8 @@ export async function selectSession(): Promise<void> {
4646
async function parseSessionsToPicks(p: Promise<ISession[]>): Promise<Array<IQuickItemEx<string>>> {
4747
return new Promise(async (resolve: (res: Array<IQuickItemEx<string>>) => void): Promise<void> => {
4848
const picks: Array<IQuickItemEx<string>> = (await p).map((s: ISession) => Object.assign({}, {
49-
label: `${s.active ? " " : ""}${s.name}`,
50-
description: `ID: ${s.id}`,
49+
label: `${s.active ? "$(check) " : ""}${s.name}`,
50+
description: s.active ? "Active" : "",
5151
detail: `AC Questions: ${s.acQuestions}, AC Submits: ${s.acSubmits}`,
5252
value: s.id,
5353
}));

src/commands/show.ts

+39-6
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,40 @@
11
"use strict";
22

33
import * as vscode from "vscode";
4-
import { LeetCodeNode } from "../leetCodeExplorer"
5-
import { selectWorkspaceFolder } from "../utils/workspaceUtils";
6-
import { languages, leetCodeBinaryPath } from "../shared";
4+
import { LeetCodeNode } from "../leetCodeExplorer";
5+
import { leetCodeManager } from "../leetCodeManager";
6+
import { IQuickItemEx, languages, leetCodeBinaryPath } from "../shared";
77
import { executeCommand } from "../utils/cpUtils";
88
import { DialogType, promptForOpenOutputChannel } from "../utils/uiUtils";
9+
import { selectWorkspaceFolder } from "../utils/workspaceUtils";
10+
import * as list from "./list";
911

1012
export async function showProblem(node?: LeetCodeNode): Promise<void> {
11-
let id: string;
1213
if (!node) {
1314
return;
14-
} else {
15-
id = node.id;
1615
}
16+
await showProblemInternal(node.id);
17+
}
18+
19+
export async function searchProblem(): Promise<void> {
20+
const signInStatus = leetCodeManager.getUser();
21+
if (!signInStatus) {
22+
return;
23+
}
24+
const choice: IQuickItemEx<string> | undefined = await vscode.window.showQuickPick(
25+
parseProblemsToPicks(list.listProblems()),
26+
{
27+
matchOnDetail: true,
28+
placeHolder: "Select one problem",
29+
},
30+
);
31+
if (!choice) {
32+
return;
33+
}
34+
await showProblemInternal(choice.value);
35+
}
36+
37+
async function showProblemInternal(id: string): Promise<void> {
1738
try {
1839
const language: string | undefined = await vscode.window.showQuickPick(languages, { placeHolder: "Select the language you want to use" });
1940
if (!language) {
@@ -32,3 +53,15 @@ export async function showProblem(node?: LeetCodeNode): Promise<void> {
3253
await promptForOpenOutputChannel("Failed to fetch the problem information. Please open the output channel for details", DialogType.error);
3354
}
3455
}
56+
57+
async function parseProblemsToPicks(p: Promise<list.IProblem[]>): Promise<Array<IQuickItemEx<string>>> {
58+
return new Promise(async (resolve: (res: Array<IQuickItemEx<string>>) => void): Promise<void> => {
59+
const picks: Array<IQuickItemEx<string>> = (await p).map((problem: list.IProblem) => Object.assign({}, {
60+
label: `${problem.solved ? "$(check) " : ""}${problem.id}.${problem.name}`,
61+
description: "",
62+
detail: `AC rate: ${problem.passRate}, Difficulty: ${problem.difficulty}`,
63+
value: problem.id,
64+
}));
65+
resolve(picks);
66+
});
67+
}

src/extension.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,20 @@ import * as vscode from "vscode";
44
import * as session from "./commands/session";
55
import * as show from "./commands/show";
66
import { leetcodeChannel } from "./leetCodeChannel";
7-
import { LeetCodeTreeDataProvider, LeetCodeNode } from "./leetCodeExplorer";
7+
import { LeetCodeNode, LeetCodeTreeDataProvider } from "./leetCodeExplorer";
88
import { leetCodeManager } from "./leetCodeManager";
99
import { leetCodeStatusBarItem } from "./leetCodeStatusBarItem";
1010

1111
export function activate(context: vscode.ExtensionContext) {
1212
leetCodeManager.getLoginStatus();
13-
const leetCodeTreeDataProvider: LeetCodeTreeDataProvider = new LeetCodeTreeDataProvider();
13+
const leetCodeTreeDataProvider: LeetCodeTreeDataProvider = new LeetCodeTreeDataProvider(context);
1414
context.subscriptions.push(
1515
vscode.window.registerTreeDataProvider("leetCodeExplorer", leetCodeTreeDataProvider),
1616
vscode.commands.registerCommand("leetcode.signin", () => leetCodeManager.signIn()),
1717
vscode.commands.registerCommand("leetcode.signout", () => leetCodeManager.signOut()),
1818
vscode.commands.registerCommand("leetcode.selectSessions", () => session.selectSession()),
19-
vscode.commands.registerCommand("leetcode.showProblem", (node?: LeetCodeNode) => show.showProblem(node)),
19+
vscode.commands.registerCommand("leetcode.showProblem", (node: LeetCodeNode) => show.showProblem(node)),
20+
vscode.commands.registerCommand("leetcode.searchProblem", () => show.searchProblem()),
2021
);
2122
leetCodeManager.on("statusChanged", () => {
2223
leetCodeStatusBarItem.updateStatusBar(leetCodeManager.getStatus(), leetCodeManager.getUser());

src/leetCodeExplorer.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"use strict";
22

3+
import * as path from "path";
34
import * as vscode from "vscode";
45
import * as list from "./commands/list";
56

@@ -36,6 +37,8 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
3637
// tslint:disable-next-line:member-ordering
3738
public readonly onDidChangeTreeData: vscode.Event<any> = this.onDidChangeTreeDataEvent.event;
3839

40+
constructor(private context: vscode.ExtensionContext) { }
41+
3942
public async refresh(): Promise<void> {
4043
this.treeData.clear();
4144
await this.getProblemData();
@@ -44,10 +47,15 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider<LeetCod
4447

4548
public getTreeItem(element: LeetCodeNode): vscode.TreeItem | Thenable<vscode.TreeItem> {
4649
return {
47-
label: element.name,
50+
label: element.isProblem ? `[${element.id}] ${element.name}` : element.name,
4851
id: element.id,
4952
collapsibleState: element.isProblem ? vscode.TreeItemCollapsibleState.None : vscode.TreeItemCollapsibleState.Collapsed,
5053
contextValue: element.isProblem ? "problem" : "difficulty",
54+
iconPath: element.isProblem ?
55+
(element.solved ?
56+
this.context.asAbsolutePath(path.join("resources", "check.png"))
57+
: this.context.asAbsolutePath(path.join("resources", "blank.png")))
58+
: "",
5159
};
5260
}
5361
public getChildren(element?: LeetCodeNode | undefined): vscode.ProviderResult<LeetCodeNode[]> {

src/shared.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ export const languages = [
2828
"python3",
2929
"ruby",
3030
"scala",
31-
"swift"
31+
"swift",
3232
];

src/utils/workspaceUtils.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"use strict";
22

3-
import * as vscode from "vscode"
43
import * as os from "os";
4+
import * as vscode from "vscode";
55

66
export async function selectWorkspaceFolder(): Promise<string> {
77
let folder: vscode.WorkspaceFolder | undefined;

0 commit comments

Comments
 (0)