Skip to content

Commit 90d600a

Browse files
committed
Try multiple edition but it doesn't work
1 parent 146c623 commit 90d600a

File tree

1 file changed

+49
-18
lines changed

1 file changed

+49
-18
lines changed

src/OneExplorer/OneExplorer.ts

+49-18
Original file line numberDiff line numberDiff line change
@@ -442,6 +442,7 @@ export class OneNode extends vscode.TreeItem {
442442
super(node.name, collapsibleState);
443443

444444
this.id = node.id;
445+
this.node = node;
445446
this.resourceUri = node.uri;
446447
this.description = true;
447448
this.tooltip = `${this.node.path}`;
@@ -483,6 +484,7 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
483484
public static didHideExtra: boolean = false;
484485

485486
public static hasSelectedCfg: boolean = false;
487+
public static selectedCfgs: Node[] = [];
486488

487489
public static register(context: vscode.ExtensionContext) {
488490
const provider = new OneTreeDataProvider(context.extension.extensionKind);
@@ -492,7 +494,16 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
492494
showCollapseAll: true,
493495
canSelectMany: true,
494496
});
495-
provider._treeView.onDidChangeSelection(() => {
497+
498+
provider._treeView.onDidChangeSelection((event) => {
499+
const selectedItems = event.selection;
500+
OneTreeDataProvider.hasSelectedCfg = selectedItems.some(
501+
(item) => item.type === NodeType.config
502+
);
503+
OneTreeDataProvider.selectedCfgs = selectedItems.filter(
504+
(item) => item.type === NodeType.config
505+
);
506+
496507
provider.refreshCfgSelection();
497508
});
498509

@@ -588,20 +599,26 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
588599
provider.delete(node)
589600
),
590601
vscode.commands.registerCommand("one.explorer.rename", async () => {
591-
if (provider.getSelectedCfg()?.length !== 1) {
592-
// Delete is only supported for single selection
593-
// Do not show an error or warning message for UI's sake
594-
// TODO: handle for multiple selection
602+
const nodes = provider.getSelectedCfg();
603+
if(nodes === undefined) {
595604
return;
596-
} else {
597-
const node = provider.getSelectedCfg()![0];
598-
Logger.info("OneExplorer", "Shortcut", `Rename ${node.uri.fsPath}`);
599-
600-
await provider.rename(node);
601-
// TODO: handle for multiple selection
602-
// TODO: improve refresh performance
603-
provider.refresh(node.parent);
604605
}
606+
//await Promise.all(nodes.map((node) => this.renameSingleFile(node)));
607+
608+
609+
await provider.renameCfgFiles(nodes);
610+
// assert.ok(nodes.length > 0);
611+
// assert.ok(nodes.every((node) => node.type === NodeType.config));
612+
613+
614+
// Rename the files one-by-one
615+
// const promises = nodes.map(async (cfg) => {
616+
// Logger.info("ONE Explorer", "Shortcut", `rename ${cfg.uri.fsPath}`);
617+
// await provider.renameSingleFile(cfg);
618+
// await provider.refresh(cfg.parent);
619+
// return;
620+
// });
621+
// promises.reduce((prev, curr) => prev.then(() => curr), Promise.resolve());
605622
}),
606623
vscode.commands.registerCommand("one.explorer.refactor", (node: Node) =>
607624
provider.refactor(node)
@@ -761,7 +778,7 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
761778
*/
762779
private askNewName = (node: Node) => {
763780
return vscode.window.showInputBox({
764-
title: "Enter a file name:",
781+
title: `Renaming '${path.basename(node.uri.fsPath)}':`,
765782
value: `${path.basename(node.uri.fsPath)}`,
766783
valueSelection: [
767784
0,
@@ -800,26 +817,40 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
800817
};
801818

802819
/**
803-
* Rename a file
820+
* Rename a multiple cfg files
804821
* @note Renaming is only allowed for config files as it has no impact on the explorer view.
805822
* @command one.explorer.rename
823+
* @assumption All nodes are config files
824+
* @todo prohibit special characters from new name for security ('..', '*', etc)
825+
*/
826+
async renameCfgFiles(nodes: Node[]): Promise<void> {
827+
assert.ok(nodes.length > 0);
828+
assert.ok(nodes.every((node) => node.type === NodeType.config));
829+
830+
await Promise.all(nodes.map(async (node) => await this.renameSingleFile(node).then(async ()=>await this.refresh(node.parent))));
831+
}
832+
833+
834+
/**
835+
* Rename a single file
836+
* @note Renaming is only allowed for config files as it has no impact on the explorer view.
806837
* @todo prohibit special characters from new name for security ('..', '*', etc)
807838
*/
808-
async rename(node: Node): Promise<void> {
839+
async renameSingleFile(node: Node): Promise<void> {
809840
assert.ok(node.type === NodeType.config);
810841

811842
if (node.type !== NodeType.config) {
812843
return;
813844
}
814845

815-
return this.askNewName(node).then((newname) => {
846+
await this.askNewName(node).then(async (newname) => {
816847
if (newname) {
817848
const dirpath = path.dirname(node.uri.fsPath);
818849
const newpath = `${dirpath}/${newname}`;
819850

820851
const edit = new vscode.WorkspaceEdit();
821852
edit.renameFile(node.uri, vscode.Uri.file(newpath));
822-
vscode.workspace.applyEdit(edit);
853+
await vscode.workspace.applyEdit(edit);
823854
}
824855
});
825856
}

0 commit comments

Comments
 (0)