提交 263575c6 编写于 作者: R Rachel Macfarlane

#34685 Collapse search results one level at a time

上级 a6fc53ef
......@@ -96,10 +96,10 @@ export interface ITree extends Events.IEventEmitter {
/**
* Collapses several elements.
* Provide no arguments and it will recursively collapse all elements in the tree
* Collapses all elements at the greatest tree depth that has expanded elements.
* The returned promise returns a boolean for whether the elements were collapsed or not.
*/
collapseAll(elements?: any[], recursive?: boolean): WinJS.Promise;
collapseDeepestExpandedLevel(): WinJS.Promise;
/**
* Toggles an element's expansion state.
......
......@@ -427,7 +427,7 @@ export class CollapseAllAction extends Action {
return TPromise.as(null); // Global action disabled if user is in edit mode from another action
}
this.viewer.collapseAll();
this.viewer.collapseDeepestExpandedLevel();
this.viewer.clearSelection();
this.viewer.clearFocus();
this.viewer.DOMFocus();
......
......@@ -182,8 +182,8 @@ export class Tree extends Events.EventEmitter implements _.ITree {
return this.model.collapse(element, recursive);
}
public collapseAll(elements: any[] = null, recursive: boolean = false): WinJS.Promise {
return this.model.collapseAll(elements, recursive);
public collapseDeepestExpandedLevel(): WinJS.Promise {
return this.model.collapseDeepestExpandedLevel();
}
public toggleExpansion(element: any, recursive: boolean = false): WinJS.Promise {
......
......@@ -486,6 +486,17 @@ export class Item extends Events.EventEmitter {
return result;
}
public getChildren(): Item[] {
var child = this.firstChild;
var results = [];
while (child) {
results.push(child);
child = child.next;
}
return results;
}
private isAncestorOf(item: Item): boolean {
while (item) {
if (item.id === this.id) {
......@@ -882,18 +893,29 @@ export class TreeModel extends Events.EventEmitter {
return item.collapse(recursive);
}
public collapseAll(elements: any[] = null, recursive: boolean = false): WinJS.Promise {
if (!elements) {
elements = [this.input];
recursive = true;
}
var promises = [];
for (var i = 0, len = elements.length; i < len; i++) {
promises.push(this.collapse(elements[i], recursive));
public collapseDeepestExpandedLevel(): WinJS.Promise {
var levelToCollapse = this.findDeepestExpandedLevel(this.input, 0);
var items = [this.input];
for (var i = 0; i < levelToCollapse; i++) {
items = items
.map(node => node.getChildren())
.reduce((prev, current) => prev.concat(current), []);
}
var promises = items.map(child => this.collapse(child, false));
return WinJS.Promise.join(promises);
}
private findDeepestExpandedLevel(item: Item, currentLevel: number): number {
var expandedChildren = item.getChildren().filter(child => child.isExpanded());
if (!expandedChildren.length) {
return currentLevel;
}
return Math.max(...expandedChildren.map(child => this.findDeepestExpandedLevel(child, currentLevel + 1)));
}
public toggleExpansion(element: any, recursive: boolean = false): WinJS.Promise {
return this.isExpanded(element) ? this.collapse(element, recursive) : this.expand(element);
}
......
......@@ -614,7 +614,7 @@ suite('TreeModel - Expansion', () => {
});
});
test('collapseAll', (done) => {
test('collapseDeepestExpandedLevel', (done) => {
model.setInput(SAMPLE.DEEP2).done(() => {
model.expand(SAMPLE.DEEP2.children[0]).done(() => {
model.expand(SAMPLE.DEEP2.children[0].children[0]).done(() => {
......@@ -622,13 +622,10 @@ suite('TreeModel - Expansion', () => {
assert(model.isExpanded(SAMPLE.DEEP2.children[0]));
assert(model.isExpanded(SAMPLE.DEEP2.children[0].children[0]));
model.collapseAll().done(() => {
assert(!model.isExpanded(SAMPLE.DEEP2.children[0]));
model.expand(SAMPLE.DEEP2.children[0]).done(() => {
assert(!model.isExpanded(SAMPLE.DEEP2.children[0].children[0]));
done();
});
model.collapseDeepestExpandedLevel().done(() => {
assert(model.isExpanded(SAMPLE.DEEP2.children[0]));
assert(!model.isExpanded(SAMPLE.DEEP2.children[0].children[0]));
done();
});
});
});
......@@ -684,22 +681,6 @@ suite('TreeModel - Expansion', () => {
});
});
test('top level collapsed', (done) => {
model.setInput(SAMPLE.AB).done(() => {
model.collapseAll([{ id: 'a' }, { id: 'b' }, { id: 'c' }]);
var nav = model.getNavigator();
assert.equal(nav.next().id, 'a');
assert.equal(nav.next().id, 'b');
assert.equal(nav.next().id, 'c');
assert.equal(nav.previous().id, 'b');
assert.equal(nav.previous().id, 'a');
assert.equal(nav.previous() && false, null);
done();
});
});
test('shouldAutoexpand', (done) => {
// setup
const model = new TreeModel({
......
......@@ -259,12 +259,12 @@ export class ToggleViewletAction extends Action {
export class CollapseAction extends Action {
constructor(viewer: ITree, enabled: boolean, clazz: string) {
super('workbench.action.collapse', nls.localize('collapse', "Collapse All"), clazz, enabled, (context: any) => {
super('workbench.action.collapse', nls.localize('collapse', "Collapse"), clazz, enabled, (context: any) => {
if (viewer.getHighlight()) {
return TPromise.as(null); // Global action disabled if user is in edit mode from another action
}
viewer.collapseAll();
viewer.collapseDeepestExpandedLevel();
viewer.clearSelection();
viewer.clearFocus();
viewer.DOMFocus();
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册