Skip to content

Commit 165510c

Browse files
authored
Merge pull request #2 from ahmed-dj/main
[Features] - adds support to open a selection of files
2 parents a2c6e10 + 8e7f3ea commit 165510c

File tree

6 files changed

+84
-46
lines changed

6 files changed

+84
-46
lines changed

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ Simply call the `Start Protein Viewer command`, enter a PDB accession code & awa
2020

2121
Right-click on the `.pdb` file in the file editor and select `Launch Protein Viewer from File`
2222

23+
### Loading a Local Folder
24+
25+
![Local folder usage gif](img/local_folder.gif)
26+
27+
Right-click on the folder in the file explorer and select `Launch Protein Viewer from Folder`
28+
2329
**Supported Formats**
2430

2531
* `.pdb`

out/extension.js

Lines changed: 7 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

out/panels/ProteinViewerPanel.js

Lines changed: 19 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,11 @@
4343
"chemistry",
4444
"cheminformatics",
4545
"computational chemistry"
46-
],
46+
],
4747
"activationEvents": [
4848
"onCommand:protein-viewer.start",
49-
"onCommand:protein-viewer.activateFromFile"
49+
"onCommand:protein-viewer.activateFromFile",
50+
"onCommand:protein-viewer.activateFromFolder"
5051
],
5152
"main": "./out/extension.js",
5253
"contributes": {
@@ -58,16 +59,27 @@
5859
{
5960
"command": "protein-viewer.activateFromFile",
6061
"title": "Launch Protein Viewer from File"
62+
},
63+
{
64+
"command": "protein-viewer.activateFromFolder",
65+
"title": "Launch Protein Viewer from Folder"
6166
}
6267
],
6368
"menus": {
64-
"explorer/context": [{
69+
"explorer/context": [
70+
{
6571
"when": "resourceExtname == .pdb || resourceExtname == .PDB || resourceExtname == .mol2 || resourceExtname == .MOL2 || resourceExtname == .sdf || resourceExtname == .SDF || resourceExtname == .mmCIF || resourceExtname == .mmcif || resourceExtname == .Mol || resourceExtname == .mol || resourceExtname == .MOL || resourceExtname == .xyz || resourceExtname == .XYZ || resourceExtname == .ent || resourceExtname == .ENT || resourceExtname == .pdbqt || resourceExtname == .PDBQT || resourceExtname == .cif || resourceExtname == .CIF || resourceExtname == .mcif || resourceExtname == .MCIF || resourceExtname == .gro || resourceExtname == .GRO",
6672
"command": "protein-viewer.activateFromFile",
6773
"group": "navigation"
68-
}]
69-
}
70-
},
74+
},
75+
{
76+
"when": "explorerResourceIsFolder",
77+
"command": "protein-viewer.activateFromFolder",
78+
"group": "navigation"
79+
}
80+
]
81+
}
82+
},
7183
"scripts": {
7284
"vscode:prepublish": "npm run compile",
7385
"compile": "tsc -p ./",
@@ -92,4 +104,4 @@
92104
"dependencies": {
93105
"molstar": "^2.4.1"
94106
}
95-
}
107+
}

src/extension.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,20 @@ export function activate(context: vscode.ExtensionContext) {
1313
});
1414
});
1515

16-
const activateFromFile = vscode.commands.registerCommand("protein-viewer.activateFromFile", (file_uri: vscode.Uri) => {
17-
ProteinViewerPanel.renderFromFile(context.extensionUri, file_uri);
16+
const activateFromFile = vscode.commands.registerCommand("protein-viewer.activateFromFile", (file_uri: vscode.Uri) => {
17+
ProteinViewerPanel.renderFromFiles(context.extensionUri, [file_uri]);
18+
});
19+
20+
const activateFromFolder = vscode.commands.registerCommand("protein-viewer.activateFromFolder", (folder_uri: vscode.Uri) => {
21+
vscode.workspace.findFiles(`${vscode.workspace.asRelativePath(folder_uri)}/*.pdb`).then((files_uri) => {
22+
ProteinViewerPanel.renderFromFiles(context.extensionUri, files_uri)
23+
});
1824
});
1925

2026
//context.subscriptions.push(...[helloCommand, activateFromFile]);
2127
context.subscriptions.push(helloCommand);
2228
context.subscriptions.push(activateFromFile);
29+
context.subscriptions.push(activateFromFolder);
2330
}
2431

2532
// this method is called when your extension is deactivated

src/panels/ProteinViewerPanel.ts

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ export class ProteinViewerPanel {
55
private readonly _panel: vscode.WebviewPanel;
66
private _disposables: vscode.Disposable[] = [];
77

8-
private constructor(panel: vscode.WebviewPanel, extensionUri: vscode.Uri, accession: string | undefined, clickedFile: vscode.Uri | undefined) {
8+
private constructor(panel: vscode.WebviewPanel, extensionUri: vscode.Uri, accession: string | undefined, clickedFiles: vscode.Uri[] | undefined) {
99
this._panel = panel;
1010
this._panel.onDidDispose(this.dispose, null, this._disposables);
1111
if (accession != undefined) {
1212
this._panel.webview.html = this._getWebviewContent(panel.webview, extensionUri, accession);
1313
};
1414

15-
if (clickedFile != undefined) {
16-
this._panel.webview.html = this._getWebviewContentForFile(panel.webview, extensionUri, clickedFile);
15+
if (clickedFiles != undefined) {
16+
this._panel.webview.html = this._getWebviewContentForFiles(panel.webview, extensionUri, clickedFiles);
1717
};
1818

1919
}
@@ -26,18 +26,17 @@ export class ProteinViewerPanel {
2626
});
2727

2828
ProteinViewerPanel.currentPanel = new ProteinViewerPanel(panel, extensionUri, accession, undefined);
29-
}
29+
}
3030

31-
public static renderFromFile(extensionUri: vscode.Uri, clickedFile: vscode.Uri) {
32-
const fname = clickedFile.path.split('/').pop();
33-
const windowName = "Protein Viewer - " + fname;
34-
const panel = vscode.window.createWebviewPanel("proteinviewer", windowName, vscode.ViewColumn.One, {
35-
enableScripts: true,
36-
retainContextWhenHidden: true
37-
});
31+
public static renderFromFiles(extensionUri: vscode.Uri, clickedFiles: vscode.Uri[]) {
32+
const fnames = clickedFiles.map((clickedFile) => clickedFile.path.split('/').pop());
33+
const windowName = "Protein Viewer - " + fnames.join(" - ");
34+
const panel = vscode.window.createWebviewPanel("proteinviewer", windowName, vscode.ViewColumn.One, {
35+
enableScripts: true,
36+
retainContextWhenHidden: true
37+
});
3838

39-
ProteinViewerPanel.currentPanel = new ProteinViewerPanel(panel, extensionUri, undefined, clickedFile);
40-
//}
39+
ProteinViewerPanel.currentPanel = new ProteinViewerPanel(panel, extensionUri, undefined, clickedFiles);
4140
}
4241

4342
public dispose() {
@@ -102,16 +101,19 @@ export class ProteinViewerPanel {
102101
`;
103102
}
104103

105-
private _getWebviewContentForFile(webview: vscode.Webview, extensionUri: vscode.Uri, clickedFile: vscode.Uri) {
106-
//console.log(clickedFile);
107-
104+
private _getWebviewContentForFiles(webview: vscode.Webview, extensionUri: vscode.Uri, clickedFiles: vscode.Uri[]) {
108105
const cssUri = webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'node_modules', 'molstar', 'build/viewer', 'molstar.css'));
109106
const jsUri = webview.asWebviewUri(vscode.Uri.joinPath(extensionUri, 'node_modules', 'molstar', 'build/viewer', 'molstar.js'));
110-
const pdb_contents = webview.asWebviewUri(clickedFile);
111-
const extension = clickedFile.path.split('.').pop();
112-
113-
console.log(pdb_contents);
114-
console.log(extension);
107+
const pdbContents = clickedFiles.map((clickedFile) => webview.asWebviewUri(clickedFile));
108+
const extensions = clickedFiles.map((clickedFile) => clickedFile.path.split('.').pop());
109+
let loadCommands: String[] = [];
110+
for (let i = 0; i < pdbContents.length; i++) {
111+
const pdbContent = pdbContents[i];
112+
const extension = extensions[i];
113+
loadCommands.push(
114+
`viewer.loadStructureFromUrl('${pdbContent}', format='${extension}');`
115+
);
116+
}
115117
// Tip: Install the es6-string-html VS Code extension to enable code highlighting below
116118
return /*html*/ `
117119
<!DOCTYPE html>
@@ -149,7 +151,7 @@ export class ProteinViewerPanel {
149151
pdbProvider: 'rcsb',
150152
emdbProvider: 'rcsb',
151153
});
152-
viewer.loadStructureFromUrl('${pdb_contents}', format='${extension}');
154+
${loadCommands.join("")}
153155
// viewer.loadAllModelsOrAssemblyFromUrl('https://cs.litemol.org/5ire/full', 'mmcif', false, { representationParams: { theme: { globalName: 'operator-name' } } })
154156
</script>
155157
</body>

0 commit comments

Comments
 (0)