From 942cfd7f1f3b08c66ad12e847c0b1327b26369b5 Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Sun, 1 Sep 2019 19:28:44 +0800 Subject: [PATCH 1/2] feat: Support toggle favorite problem --- package.json | 42 +++++++++++++++++++++-- resources/dark/dislike.png | Bin 0 -> 700 bytes resources/dark/like.png | Bin 0 -> 472 bytes resources/light/dislike.png | Bin 0 -> 599 bytes resources/light/like.png | Bin 0 -> 418 bytes src/commands/star.ts | 26 ++++++++++++++ src/explorer/LeetCodeTreeDataProvider.ts | 4 ++- src/extension.ts | 3 ++ src/leetCodeExecutor.ts | 8 +++++ 9 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 resources/dark/dislike.png create mode 100644 resources/dark/like.png create mode 100644 resources/light/dislike.png create mode 100644 resources/light/like.png create mode 100644 src/commands/star.ts diff --git a/package.json b/package.json index fb8ff548..1e6ce79a 100644 --- a/package.json +++ b/package.json @@ -124,6 +124,24 @@ "title": "Submit to LeetCode", "category": "LeetCode" }, + { + "command": "leetcode.addFavorite", + "title": "Add to Favorite List", + "category": "LeetCode", + "icon": { + "light": "resources/light/like.png", + "dark": "resources/dark/like.png" + } + }, + { + "command": "leetcode.removeFavorite", + "title": "Remove from Favorite List", + "category": "LeetCode", + "icon": { + "light": "resources/light/dislike.png", + "dark": "resources/dark/dislike.png" + } + }, { "command": "leetcode.switchDefaultLanguage", "title": "Switch Default Language", @@ -178,18 +196,28 @@ "view/item/context": [ { "command": "leetcode.previewProblem", - "when": "view == leetCodeExplorer && viewItem == problem", + "when": "view == leetCodeExplorer && viewItem =~ /problem*/", "group": "leetcode@1" }, { "command": "leetcode.showProblem", - "when": "view == leetCodeExplorer && viewItem == problem", + "when": "view == leetCodeExplorer && viewItem =~ /problem*/", "group": "leetcode@2" }, { "command": "leetcode.showSolution", - "when": "view == leetCodeExplorer && viewItem == problem", + "when": "view == leetCodeExplorer && viewItem =~ /problem*/", "group": "leetcode@3" + }, + { + "command": "leetcode.addFavorite", + "when": "view == leetCodeExplorer && viewItem == problem", + "group": "inline" + }, + { + "command": "leetcode.removeFavorite", + "when": "view == leetCodeExplorer && viewItem == problem-favorite", + "group": "inline" } ], "commandPalette": [ @@ -204,6 +232,14 @@ { "command": "leetcode.previewProblem", "when": "never" + }, + { + "command": "leetcode.addFavorite", + "when": "never" + }, + { + "command": "leetcode.removeFavorite", + "when": "never" } ], "explorer/context": [ diff --git a/resources/dark/dislike.png b/resources/dark/dislike.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4fe0202483583ef0d5278b9be337aca5ce2a96 GIT binary patch literal 700 zcmV;t0z>_YP)kdg00002VoOIv0RM-N z%)bBt0(D75K~zY`?Uc())KL`2@A#M`dQn)SnbO}76(uy)qA-Hm^jKCgDyMG+PQqH{mz=Z_xXP*|icGRs9a4mqN9TFh_!&CAC?%kFRWyZ4^YIp=%M zJ;wZB|8i-OoRn_Hn3Es&6{o^wsgrOSr+Li;bByuK9@nBg=C&3W&G^RUh%v^nOH|{fsseL*>k3 z2AMU=shBjNOh*nbWGZ_cOcoQFNQ+8qQER2xLD9T5t!izVGqP8*n+D(+1w9Hce zuAwLsDDP!MZ#jeBpV}+SKzQbtoND=u;_?n){iP;cOP=3m`WjtK!C4uq><#9)GN3m`5{+4HMj4^V6X_PLvG&u=qMVX9jFJOF7 iPiHjf4->hc^8Oc6unZX1>IL=y00006P)kdg00002VoOIv0RM-N z%)bBt0g*{WK~zYI?U1of6j2n0hb_oPgLZTq_BpJ;!fZn#jY^3o0+RRw(h{r?B@p!) zEP#%v*~Z=Toy|5D)C+~nMjNmh2qeG7tPTS+II|in|6AR2&-dMPZxH;?-;7E=?b~!Y z^RM=SnR@x>NxjTNKJtw-x@_5fl~Qo4(ng8Z^SeP11U^MCd19@`*k!zj=n7M!5=wIYJg z*O4E`f(~llDk5M4(TTUKhxqp&!gz$s~XB^&=4=P6@C15CVsUd7oM%?<8OY8M+$$H zR20H5EBg4`+;~zk5FRO5M}&lk^}=|hur)N$?Xki)d}CldQv4DAPx1pRL|@&g-V}fU O0000kdg00002VoOIv0RM-N z%)bBt0uV_=K~zY`?bP3E&2b#Z@yB*JmJAV=8Oz@w#LB@1k>bXWOO&6tB8^KSrCE|o zEsC138)^IjSfaLQWL%ix0<&yu@^*2)JLl}|INQpl&-d!}{(N4~&-?xQ)R+J3pRP)K zwCVNBXAkXFmD{PZ&m&*_((9gGDofexb%-%vpY33WzM`EcmW{Xf2|W&|lUDDj_d+=1 ztPtKgqF!2^L*5A=$090q2oF>j)T*2^B7_l*1>-PVyYRShkljMh7<+bY@ZC4-$JOU} zFYL@0+Ju88gU!g4tREKc=4G!?H>DR_CVa@tVPWQ!05gQ4yzCLyObJlwy0>}RB(zQm zK+3kfSg2pvU)E4vM&Xb!X!Bp~$8}qrQ;WQGs`$voGKk|sc%>%kw@V0(#mCMG!-bP2 z>$DKQ2rtaHKxd-DiOC?c_G9Y25js26)It!x9$NALU@`&?Rp+;Bk_69!+;+(LH?DSp2PfK&r zjmEj$kkCF6fUSmvTQ(XHTHFx&W!x6NS}`$zErx{O!c8eDHxe~TJ8Uv2+%X-bvkdg00002VoOIv0RM-N z%)bBt0b5B#K~zY`?U6lB0#O)64-|xG)Xt8;I;_CL(3oiBPpKw?nz#XNjaG^hh`I&~ zr6cMBH0)uZ5Q#QwGZ09w#Y-Fp7@R?4L3n}+ay<g%VdA(ot?gvboM*d)n;{TAZd ziFHIQ&>xE { + try { + await leetCodeExecutor.toggleFavorite(node, true); + leetCodeTreeDataProvider.refresh(); + } catch (error) { + await promptForOpenOutputChannel("Failed to add the problem to favorite. Please open the output channel for details.", DialogType.error); + } +} + +export async function removeFavorite(node: LeetCodeNode): Promise { + try { + await leetCodeExecutor.toggleFavorite(node, false); + leetCodeTreeDataProvider.refresh(); + } catch (error) { + await promptForOpenOutputChannel("Failed to remove the problem from favorite. Please open the output channel for details.", DialogType.error); + } +} diff --git a/src/explorer/LeetCodeTreeDataProvider.ts b/src/explorer/LeetCodeTreeDataProvider.ts index ac115424..502241e2 100644 --- a/src/explorer/LeetCodeTreeDataProvider.ts +++ b/src/explorer/LeetCodeTreeDataProvider.ts @@ -42,7 +42,9 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider vscode.commands.registerCommand("leetcode.testSolution", (uri?: vscode.Uri) => test.testSolution(uri)), vscode.commands.registerCommand("leetcode.submitSolution", (uri?: vscode.Uri) => submit.submitSolution(uri)), vscode.commands.registerCommand("leetcode.switchDefaultLanguage", () => switchDefaultLanguage()), + vscode.commands.registerCommand("leetcode.addFavorite", (node: LeetCodeNode) => star.addFavorite(node)), + vscode.commands.registerCommand("leetcode.removeFavorite", (node: LeetCodeNode) => star.removeFavorite(node)), ); await leetCodeExecutor.switchEndpoint(plugin.getLeetCodeEndpoint()); diff --git a/src/leetCodeExecutor.ts b/src/leetCodeExecutor.ts index 8bef00fa..04b89013 100644 --- a/src/leetCodeExecutor.ts +++ b/src/leetCodeExecutor.ts @@ -162,6 +162,14 @@ class LeetCodeExecutor implements Disposable { } } + public async toggleFavorite(node: IProblem, addToFavorite: boolean): Promise { + const commandParams: string[] = [await this.getLeetCodeBinaryPath(), "star", node.id]; + if (!addToFavorite) { + commandParams.push("-d"); + } + await this.executeCommandWithProgressEx("Updating the favorite list...", "node", commandParams); + } + public async getCompaniesAndTags(): Promise<{ companies: { [key: string]: string[] }, tags: { [key: string]: string[] } }> { // preprocess the plugin source const companiesTagsPath: string = path.join(await leetCodeExecutor.getLeetCodeRootPath(), "lib", "plugins", "company.js"); From fc0d181229809dc2f2b87ad7d63254dbd294b16a Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Tue, 3 Sep 2019 12:28:48 +0800 Subject: [PATCH 2/2] Address comments --- src/explorer/LeetCodeTreeDataProvider.ts | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/explorer/LeetCodeTreeDataProvider.ts b/src/explorer/LeetCodeTreeDataProvider.ts index 502241e2..69445bbb 100644 --- a/src/explorer/LeetCodeTreeDataProvider.ts +++ b/src/explorer/LeetCodeTreeDataProvider.ts @@ -38,15 +38,20 @@ export class LeetCodeTreeDataProvider implements vscode.TreeDataProvider