Skip to content

Commit 06798a6

Browse files
committed
[OneExplorer] Targetted refresh on Change/Delete
This commit refreshs only the required nodes on change and delete file. ONE-vscode-DCO-1.0-Signed-off-by: Dayoung Lee <[email protected]>
1 parent 9a5d82e commit 06798a6

File tree

3 files changed

+144
-20
lines changed

3 files changed

+144
-20
lines changed

src/OneExplorer/ConfigObject.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,42 @@ export class ConfigObj {
121121
};
122122
}
123123

124+
static diffBaseModels(
125+
newCfgObj?: ConfigObj,
126+
oldCfgObj?: ConfigObj
127+
): [addedBaseModels: string[], removedBaseModels: string[]] {
128+
const newBaseModels =
129+
newCfgObj?.getBaseModelsExists.map((artifact) => artifact.path) ?? [];
130+
const oldBaseModels =
131+
oldCfgObj?.getBaseModelsExists.map((artifact) => artifact.path) ?? [];
132+
133+
const addedBaseModels =
134+
newBaseModels.filter((path) => !oldBaseModels.includes(path)) ?? [];
135+
136+
const removedBaseModels =
137+
oldBaseModels.filter((path) => !newBaseModels.includes(path)) ?? [];
138+
139+
return [addedBaseModels, removedBaseModels];
140+
}
141+
142+
static diffProducts(
143+
newCfgObj?: ConfigObj,
144+
oldCfgObj?: ConfigObj
145+
): [addedProducts: string[], removedProducts: string[]] {
146+
const newProducts =
147+
newCfgObj?.getProductsExists.map((artifact) => artifact.path) ?? [];
148+
const oldProducts =
149+
oldCfgObj?.getProductsExists.map((artifact) => artifact.path) ?? [];
150+
151+
const addedProducts =
152+
newProducts.filter((path) => !oldProducts.includes(path)) ?? [];
153+
154+
const removedProducts =
155+
oldProducts.filter((path) => !newProducts.includes(path)) ?? [];
156+
157+
return [addedProducts, removedProducts];
158+
}
159+
124160
public updateBaseModelField(
125161
oldpath: string,
126162
newpath: string

src/OneExplorer/OneExplorer.ts

Lines changed: 101 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { CfgEditorPanel } from "../CfgEditor/CfgEditorPanel";
2323
import { obtainWorkspaceRoots } from "../Utils/Helpers";
2424
import { Logger } from "../Utils/Logger";
2525

26+
import { ConfigObj } from "./ConfigObject";
2627
import { ArtifactAttr } from "./ArtifactLocator";
2728
import { OneStorage } from "./OneStorage";
2829

@@ -157,6 +158,21 @@ export abstract class Node {
157158
// Return a NodeType as a string value
158159
return NodeType[this.type];
159160
}
161+
162+
/**
163+
* Match possible node types from the given uri
164+
*/
165+
static matchType(uri: vscode.Uri): NodeType {
166+
if (BaseModelNode.extList.some((ext) => uri.fsPath.endsWith(ext))) {
167+
return NodeType.baseModel;
168+
} else if (ConfigNode.extList.some((ext) => uri.fsPath.endsWith(ext))) {
169+
return NodeType.config;
170+
} else if (ProductNode.extList.some((ext) => uri.fsPath.endsWith(ext))) {
171+
return NodeType.product;
172+
}
173+
174+
return NodeType.directory;
175+
}
160176
}
161177

162178
class NodeFactory {
@@ -516,6 +532,16 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
516532
readonly onDidChangeTreeData: vscode.Event<Node | undefined | void> =
517533
this._onDidChangeTreeData.event;
518534

535+
private _onDidChangeConfig: vscode.EventEmitter<vscode.Uri> =
536+
new vscode.EventEmitter<vscode.Uri>();
537+
readonly onDidChangeConfig: vscode.Event<vscode.Uri> =
538+
this._onDidChangeConfig.event;
539+
540+
private _onDidDeleteProduct: vscode.EventEmitter<vscode.Uri> =
541+
new vscode.EventEmitter<vscode.Uri>();
542+
readonly onDidDeleteProduct: vscode.Event<vscode.Uri> =
543+
this._onDidDeleteProduct.event;
544+
519545
private fileWatcher = vscode.workspace.createFileSystemWatcher(`**/*`);
520546

521547
private _tree: Node[] | undefined;
@@ -543,30 +569,85 @@ export class OneTreeDataProvider implements vscode.TreeDataProvider<Node> {
543569
provider.refresh();
544570
}),
545571
provider.fileWatcher.onDidChange((uri: vscode.Uri) => {
546-
if (
547-
[
548-
...BaseModelNode.extList,
549-
...ConfigNode.extList,
550-
...ProductNode.extList,
551-
].includes(path.parse(uri.path).ext)
552-
) {
553-
Logger.info(
554-
"OneExploer",
555-
`Refresh explorer view on a file change in '${uri.path}'`
556-
);
557-
// TODO Handle by each node types
558-
provider.refresh();
572+
switch (Node.matchType(uri)) {
573+
case NodeType.config:
574+
provider._onDidChangeConfig.fire(uri);
575+
break;
576+
case NodeType.baseModel:
577+
case NodeType.product:
578+
default:
579+
// Do nothing
580+
break;
559581
}
560582
}),
583+
provider.onDidChangeConfig((uri: vscode.Uri) => {
584+
let nodesChanged: Node[] = [];
585+
586+
const oldCfgObj = OneStorage.getCfgObj(uri.fsPath);
587+
const newCfgObj = ConfigObj.createConfigObj(uri)!;
588+
589+
const [adopters, droppers] = ConfigObj.diffBaseModels(
590+
newCfgObj,
591+
oldCfgObj
592+
);
593+
594+
// Create new config node
595+
adopters
596+
.map((adopter) => OneStorage.getBaseModelNode(adopter))
597+
.forEach((adopterNode) => {
598+
OneStorage.insert(
599+
NodeFactory.create(NodeType.config, uri.fsPath, adopterNode)
600+
);
601+
adopterNode.resetChildren();
602+
adopterNode.getChildren();
603+
nodesChanged.push(adopterNode);
604+
});
605+
606+
// Remove old config node
607+
OneStorage.getNodes(uri.fsPath).forEach((node) => {
608+
if (droppers.some((dropper) => dropper === node?.parent?.path)) {
609+
OneStorage.delete(node, true);
610+
}
611+
});
612+
613+
droppers
614+
.map((dropper) => OneStorage.getBaseModelNode(dropper))
615+
.forEach((dropperNode) => {
616+
dropperNode.resetChildren();
617+
dropperNode.getChildren();
618+
nodesChanged.push(dropperNode);
619+
});
620+
621+
nodesChanged.forEach((node) => {
622+
provider._onDidChangeTreeData.fire(node);
623+
});
624+
}),
561625
provider.fileWatcher.onDidDelete((uri: vscode.Uri) => {
562-
const nodes = OneStorage.getNodes(uri.fsPath);
563-
if (nodes.length === 0) {
564-
return;
626+
switch (Node.matchType(uri)) {
627+
case NodeType.product:
628+
provider._onDidDeleteProduct.fire(uri);
629+
break;
630+
case NodeType.directory:
631+
case NodeType.config:
632+
case NodeType.baseModel:
633+
OneStorage.getNodes(uri.fsPath).forEach((node) => {
634+
OneStorage.delete(node, true);
635+
provider._onDidChangeTreeData.fire(node.parent);
636+
});
637+
break;
638+
default:
639+
// Do nothing
640+
break;
565641
}
566-
567-
nodes.forEach((node) => {
568-
OneStorage.delete(node, true);
569-
provider.refresh(node.parent);
642+
}),
643+
provider.onDidDeleteProduct((uri: vscode.Uri) => {
644+
OneStorage.getNodes(uri.fsPath).forEach((node) => {
645+
OneStorage.delete(node);
646+
647+
const dropper = node.parent;
648+
dropper!.resetChildren();
649+
dropper!.getChildren();
650+
provider._onDidChangeTreeData.fire(dropper);
570651
});
571652
}),
572653
vscode.workspace.onDidChangeWorkspaceFolders(() => {

src/OneExplorer/OneStorage.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,13 @@ export class OneStorage {
280280
return OneStorage.get()._nodeMap.get(fsPath);
281281
}
282282

283+
public static getBaseModelNode(fsPath: string): Node {
284+
const nodes = OneStorage.get()._nodeMap.get(fsPath);
285+
assert.ok(nodes.length === 1);
286+
assert.ok(nodes[0].type === NodeType.baseModel);
287+
return nodes[0];
288+
}
289+
283290
public static insert(node: Node) {
284291
const inst = OneStorage.get();
285292

0 commit comments

Comments
 (0)