explorer: load roots sequentally

fixes #34738
This commit is contained in:
isidor 2017-10-05 16:33:44 +02:00
parent 2129f4220a
commit 8a3b716868

View file

@ -734,11 +734,7 @@ export class ExplorerView extends ViewsViewletPanel {
} }
private doRefresh(targetsToExpand: URI[] = []): TPromise<any> { private doRefresh(targetsToExpand: URI[] = []): TPromise<any> {
const targetsToResolve: { root: FileStat, resource: URI, options: { resolveTo: URI[] } }[] = []; const targetsToResolve = this.model.roots.map(root => ({ root, resource: root.resource, options: { resolveTo: [] } }));
this.model.roots.forEach(root => {
const rootAndTargets = { root, resource: root.resource, options: { resolveTo: [] } };
targetsToResolve.push(rootAndTargets);
});
// First time refresh: Receive target through active editor input or selection and also include settings from previous session // First time refresh: Receive target through active editor input or selection and also include settings from previous session
if (!this.isCreated) { if (!this.isCreated) {
@ -768,24 +764,11 @@ export class ExplorerView extends ViewsViewletPanel {
} }
// Load Root Stat with given target path configured // Load Root Stat with given target path configured
const promise = this.fileService.resolveFiles(targetsToResolve).then(results => { const promise = TPromise.join(targetsToResolve.map((target, index) => this.fileService.resolveFile(target.resource, target.options).then(result => {
// Convert to model // Convert to model
const modelStats = results.map((result, index) => { const modelStat = FileStat.create(result, target.root, target.options.resolveTo);
if (result.success) {
return FileStat.create(result.stat, targetsToResolve[index].root, targetsToResolve[index].options.resolveTo);
}
return FileStat.create({
resource: targetsToResolve[index].resource,
name: resources.basenameOrAuthority(targetsToResolve[index].resource),
mtime: 0,
etag: undefined,
isDirectory: true,
hasChildren: false
}, targetsToResolve[index].root);
});
// Subsequent refresh: Merge stat into our local model and refresh tree // Subsequent refresh: Merge stat into our local model and refresh tree
modelStats.forEach((modelStat, index) => FileStat.mergeLocalWithDisk(modelStat, this.model.roots[index])); FileStat.mergeLocalWithDisk(modelStat, this.model.roots[index]);
const input = this.contextService.getWorkbenchState() === WorkbenchState.FOLDER ? this.model.roots[0] : this.model; const input = this.contextService.getWorkbenchState() === WorkbenchState.FOLDER ? this.model.roots[0] : this.model;
let statsToExpand: FileStat[] = this.explorerViewer.getExpandedElements().concat(targetsToExpand.map(target => this.model.findClosest(target))); let statsToExpand: FileStat[] = this.explorerViewer.getExpandedElements().concat(targetsToExpand.map(target => this.model.findClosest(target)));
@ -793,7 +776,6 @@ export class ExplorerView extends ViewsViewletPanel {
return this.explorerViewer.refresh().then(() => sequence(statsToExpand.map(e => () => this.explorerViewer.expand(e)))); return this.explorerViewer.refresh().then(() => sequence(statsToExpand.map(e => () => this.explorerViewer.expand(e))));
} }
// Display roots only when multi folder workspace // Display roots only when multi folder workspace
// Make sure to expand all folders that where expanded in the previous session // Make sure to expand all folders that where expanded in the previous session
if (input === this.model) { if (input === this.model) {
@ -801,7 +783,14 @@ export class ExplorerView extends ViewsViewletPanel {
statsToExpand = this.model.roots.concat(statsToExpand); statsToExpand = this.model.roots.concat(statsToExpand);
} }
return this.explorerViewer.setInput(input).then(() => sequence(statsToExpand.map(e => () => this.explorerViewer.expand(e)))); return this.explorerViewer.setInput(input).then(() => sequence(statsToExpand.map(e => () => this.explorerViewer.expand(e))));
}, e => TPromise.wrapError(e)); }, e => FileStat.create({
resource: target.resource,
name: resources.basenameOrAuthority(target.resource),
mtime: 0,
etag: undefined,
isDirectory: true,
hasChildren: false
}, target.root))));
this.progressService.showWhile(promise, this.partService.isCreated() ? 800 : 3200 /* less ugly initial startup */); this.progressService.showWhile(promise, this.partService.isCreated() ? 800 : 3200 /* less ugly initial startup */);