Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
bddf4693
V
vscode
项目概览
xxadev
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
bddf4693
编写于
6月 23, 2018
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
treeModel: setCollapsed
上级
0ddccb55
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
130 addition
and
6 deletion
+130
-6
src/vs/base/browser/ui/tree/treeModel.ts
src/vs/base/browser/ui/tree/treeModel.ts
+59
-6
src/vs/base/test/browser/ui/tree/treeModel.test.ts
src/vs/base/test/browser/ui/tree/treeModel.test.ts
+71
-0
未找到文件。
src/vs/base/browser/ui/tree/treeModel.ts
浏览文件 @
bddf4693
...
...
@@ -37,14 +37,26 @@ function getVisibleCount<T>(nodes: ITreeNode<T>[]): number {
return
nodes
.
reduce
(
visibleCountReducer
,
0
);
}
function
treeElementToNode
<
T
>
(
treeElement
:
ITreeElement
<
T
>
,
depth
:
number
,
visible
:
boolean
,
visibleElements
:
ITreeListElement
<
T
>
[]):
ITreeNode
<
T
>
{
function
getVisibleNodes
<
T
>
(
nodes
:
ITreeNode
<
T
>
[],
result
:
ITreeListElement
<
T
>
[]
=
[]):
ITreeListElement
<
T
>
[]
{
for
(
const
node
of
nodes
)
{
result
.
push
(
node
);
if
(
!
node
.
collapsed
)
{
getVisibleNodes
(
node
.
children
,
result
);
}
}
return
result
;
}
function
treeElementToNode
<
T
>
(
treeElement
:
ITreeElement
<
T
>
,
depth
:
number
,
visible
:
boolean
,
treeListElements
:
ITreeListElement
<
T
>
[]):
ITreeNode
<
T
>
{
const
{
element
,
collapsed
}
=
treeElement
;
if
(
visible
)
{
visible
Elements
.
push
({
element
,
collapsed
,
depth
});
treeList
Elements
.
push
({
element
,
collapsed
,
depth
});
}
const
children
=
collect
(
map
(
treeElement
.
children
,
el
=>
treeElementToNode
(
el
,
depth
+
1
,
visible
&&
!
treeElement
.
collapsed
,
visible
Elements
)));
const
children
=
collect
(
map
(
treeElement
.
children
,
el
=>
treeElementToNode
(
el
,
depth
+
1
,
visible
&&
!
treeElement
.
collapsed
,
treeList
Elements
)));
const
visibleCount
=
1
+
getVisibleCount
(
children
);
return
{
element
,
children
,
depth
,
collapsed
,
visibleCount
};
...
...
@@ -75,20 +87,61 @@ export class TreeModel<T> {
}
const
{
parentNode
,
listIndex
,
visible
}
=
this
.
findParentNode
(
location
);
const
list
ToInsert
:
ITreeListElement
<
T
>
[]
=
[];
const
nodesToInsert
=
collect
(
map
(
toInsert
,
el
=>
treeElementToNode
(
el
,
parentNode
.
depth
+
1
,
visible
,
list
ToInsert
)));
const
treeListElements
ToInsert
:
ITreeListElement
<
T
>
[]
=
[];
const
nodesToInsert
=
collect
(
map
(
toInsert
,
el
=>
treeElementToNode
(
el
,
parentNode
.
depth
+
1
,
visible
,
treeListElements
ToInsert
)));
const
deletedNodes
=
parentNode
.
children
.
splice
(
last
(
location
),
deleteCount
,
...
nodesToInsert
);
const
visibleDeleteCount
=
getVisibleCount
(
deletedNodes
);
parentNode
.
visibleCount
+=
getVisibleCount
(
nodesToInsert
)
-
visibleDeleteCount
;
if
(
visible
)
{
this
.
list
.
splice
(
listIndex
,
visibleDeleteCount
,
list
ToInsert
);
this
.
list
.
splice
(
listIndex
,
visibleDeleteCount
,
treeListElements
ToInsert
);
}
return
map
(
iter
(
deletedNodes
),
treeNodeToElement
);
}
setCollapsed
(
location
:
number
[],
collapsed
:
boolean
):
void
{
const
{
node
,
listIndex
,
visible
}
=
this
.
findNode
(
location
);
if
(
node
.
collapsed
===
collapsed
)
{
return
;
}
node
.
collapsed
=
collapsed
;
if
(
visible
)
{
if
(
collapsed
)
{
const
deleteCount
=
getVisibleCount
(
node
.
children
);
const
{
element
,
depth
}
=
node
;
this
.
list
.
splice
(
listIndex
,
1
+
deleteCount
,
[{
element
,
collapsed
,
depth
}]);
}
else
{
const
toInsert
=
[
node
,
...
getVisibleNodes
(
node
.
children
)];
this
.
list
.
splice
(
listIndex
,
1
,
toInsert
);
}
}
}
isCollapsed
(
location
:
number
[]):
boolean
{
const
{
node
}
=
this
.
findNode
(
location
);
return
node
.
collapsed
;
}
private
findNode
(
location
:
number
[]):
{
node
:
ITreeNode
<
T
>
,
listIndex
:
number
,
visible
:
boolean
}
{
const
{
parentNode
,
listIndex
,
visible
}
=
this
.
findParentNode
(
location
);
const
index
=
last
(
location
);
if
(
index
<
0
||
index
>
parentNode
.
children
.
length
)
{
throw
new
Error
(
'
Invalid tree location
'
);
}
const
node
=
parentNode
.
children
[
index
];
return
{
node
,
listIndex
,
visible
};
}
private
findParentNode
(
location
:
number
[],
node
:
ITreeNode
<
T
>
=
this
.
root
,
listIndex
:
number
=
0
,
visible
=
true
):
{
parentNode
:
ITreeNode
<
T
>
;
listIndex
:
number
;
visible
:
boolean
;
}
{
const
[
index
,
...
rest
]
=
location
;
...
...
src/vs/base/test/browser/ui/tree/treeModel.test.ts
浏览文件 @
bddf4693
...
...
@@ -223,4 +223,75 @@ suite('TreeModel2', () => {
model
.
splice
([
0
,
0
],
2
);
assert
.
deepEqual
(
list
.
length
,
3
);
});
test
(
'
collapse
'
,
()
=>
{
const
list
=
[]
as
ITreeListElement
<
number
>
[];
const
model
=
new
TreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
0
,
collapsed
:
false
,
children
:
iter
([
{
element
:
10
,
collapsed
:
false
,
children
:
iter
([])
},
{
element
:
11
,
collapsed
:
false
,
children
:
iter
([])
},
{
element
:
12
,
collapsed
:
false
,
children
:
iter
([])
},
])
},
{
element
:
1
,
collapsed
:
false
,
children
:
iter
([])
},
{
element
:
2
,
collapsed
:
false
,
children
:
iter
([])
}
]));
assert
.
deepEqual
(
list
.
length
,
6
);
model
.
setCollapsed
([
0
],
true
);
assert
.
deepEqual
(
list
.
length
,
3
);
assert
.
deepEqual
(
list
[
0
].
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
collapsed
,
true
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
,
1
);
assert
.
deepEqual
(
list
[
1
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
1
].
depth
,
1
);
assert
.
deepEqual
(
list
[
2
].
element
,
2
);
assert
.
deepEqual
(
list
[
2
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
2
].
depth
,
1
);
});
test
(
'
expand
'
,
()
=>
{
const
list
=
[]
as
ITreeListElement
<
number
>
[];
const
model
=
new
TreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
0
,
collapsed
:
true
,
children
:
iter
([
{
element
:
10
,
collapsed
:
false
,
children
:
iter
([])
},
{
element
:
11
,
collapsed
:
false
,
children
:
iter
([])
},
{
element
:
12
,
collapsed
:
false
,
children
:
iter
([])
},
])
},
{
element
:
1
,
collapsed
:
false
,
children
:
iter
([])
},
{
element
:
2
,
collapsed
:
false
,
children
:
iter
([])
}
]));
assert
.
deepEqual
(
list
.
length
,
3
);
model
.
setCollapsed
([
0
],
false
);
assert
.
deepEqual
(
list
.
length
,
6
);
assert
.
deepEqual
(
list
[
0
].
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
,
10
);
assert
.
deepEqual
(
list
[
1
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
1
].
depth
,
2
);
assert
.
deepEqual
(
list
[
2
].
element
,
11
);
assert
.
deepEqual
(
list
[
2
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
2
].
depth
,
2
);
assert
.
deepEqual
(
list
[
3
].
element
,
12
);
assert
.
deepEqual
(
list
[
3
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
3
].
depth
,
2
);
assert
.
deepEqual
(
list
[
4
].
element
,
1
);
assert
.
deepEqual
(
list
[
4
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
4
].
depth
,
1
);
assert
.
deepEqual
(
list
[
5
].
element
,
2
);
assert
.
deepEqual
(
list
[
5
].
collapsed
,
false
);
assert
.
deepEqual
(
list
[
5
].
depth
,
1
);
});
});
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录