Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
dd5e23bf
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,发现更多精彩内容 >>
提交
dd5e23bf
编写于
6月 22, 2018
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
CollapsibleTreeModel
上级
28e21308
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
122 addition
and
14 deletion
+122
-14
src/vs/base/browser/ui/list/treeModel.ts
src/vs/base/browser/ui/list/treeModel.ts
+44
-9
src/vs/base/common/iterator.ts
src/vs/base/common/iterator.ts
+2
-4
src/vs/base/common/tree.ts
src/vs/base/common/tree.ts
+15
-0
src/vs/base/test/browser/ui/list/treeModel.test.ts
src/vs/base/test/browser/ui/list/treeModel.test.ts
+61
-1
未找到文件。
src/vs/base/browser/ui/list/treeModel.ts
浏览文件 @
dd5e23bf
...
...
@@ -7,6 +7,8 @@
import
{
ISpliceable
}
from
'
vs/base/common/sequence
'
;
import
{
IIterator
,
map
,
collect
,
forEach
,
iter
}
from
'
vs/base/common/iterator
'
;
import
{
last
}
from
'
vs/base/common/arrays
'
;
import
{
Tree
}
from
'
vs/base/common/tree
'
;
/**
* TODO:
...
...
@@ -73,10 +75,10 @@ class TreeNode<T> implements ITreeListElement<T> {
}
}
function
asTreeElement
<
T
>
(
node
:
TreeNode
<
T
>
):
ITreeElement
<
T
>
{
function
createTreeElementFromTreeNode
<
T
>
(
node
:
TreeNode
<
T
>
):
ITreeElement
<
T
>
{
return
{
element
:
node
.
element
,
children
:
map
(
iter
(
node
.
children
),
asTreeElement
)
children
:
map
(
iter
(
node
.
children
),
createTreeElementFromTreeNode
)
};
}
...
...
@@ -86,18 +88,18 @@ export class TreeModel<T> {
constructor
(
private
spliceable
:
ISpliceable
<
ITreeListElement
<
T
>>
)
{
}
splice
(
start
:
number
[],
deleteCount
:
number
,
toInsert
:
IIterator
<
ITreeElement
<
T
>>
):
IIterator
<
ITreeElement
<
T
>>
{
if
(
start
.
length
===
0
)
{
splice
(
location
:
number
[],
deleteCount
:
number
,
toInsert
:
IIterator
<
ITreeElement
<
T
>>
):
IIterator
<
ITreeElement
<
T
>>
{
if
(
location
.
length
===
0
)
{
throw
new
Error
(
'
Invalid tree location
'
);
}
const
{
parentNode
,
parentListIndex
}
=
this
.
findParentNode
(
start
);
const
lastIndex
=
start
[
start
.
length
-
1
]
;
const
{
listDeleteCount
,
listElements
,
deletedNodes
}
=
parentNode
.
splice
(
lastI
ndex
,
deleteCount
,
toInsert
);
const
{
parentNode
,
parentListIndex
}
=
this
.
findParentNode
(
location
);
const
index
=
last
(
location
)
;
const
{
listDeleteCount
,
listElements
,
deletedNodes
}
=
parentNode
.
splice
(
i
ndex
,
deleteCount
,
toInsert
);
this
.
spliceable
.
splice
(
parentListIndex
+
lastI
ndex
,
listDeleteCount
,
listElements
);
this
.
spliceable
.
splice
(
parentListIndex
+
i
ndex
,
listDeleteCount
,
listElements
);
return
map
(
iter
(
deletedNodes
),
asTreeElement
);
return
map
(
iter
(
deletedNodes
),
createTreeElementFromTreeNode
);
}
private
findParentNode
(
location
:
number
[],
node
:
TreeNode
<
T
>
=
this
.
root
,
listIndex
:
number
=
0
):
{
parentNode
:
TreeNode
<
T
>
;
parentListIndex
:
number
}
{
...
...
@@ -116,3 +118,36 @@ export class TreeModel<T> {
return
this
.
findParentNode
(
rest
,
node
.
children
[
i
],
listIndex
+
1
);
}
}
interface
ICollapsibleElement
<
T
>
{
collapsed
:
boolean
;
element
:
T
;
}
export
type
ICollapsibleTreeElement
<
T
>
=
ITreeElement
<
ICollapsibleElement
<
T
>>
;
export
type
ICollapsibleTreeListElement
<
T
>
=
ITreeListElement
<
ICollapsibleElement
<
T
>>
;
export
class
CollapsibleTreeModel
<
T
>
{
private
model
=
new
Tree
<
ICollapsibleElement
<
T
>>
();
private
viewModel
:
TreeModel
<
ICollapsibleElement
<
T
>>
;
constructor
(
spliceable
:
ISpliceable
<
ICollapsibleTreeListElement
<
T
>>
)
{
this
.
viewModel
=
new
TreeModel
(
spliceable
);
}
splice
(
location
:
number
[],
deleteCount
:
number
,
toInsert
:
IIterator
<
ICollapsibleTreeElement
<
T
>>
):
IIterator
<
ICollapsibleTreeElement
<
T
>>
{
let
length
=
0
;
toInsert
=
map
(
toInsert
,
el
=>
{
length
++
;
return
el
;
});
const
result
=
this
.
model
.
splice
(
location
,
deleteCount
,
toInsert
);
const
[
ancestors
,
elementsToInsert
]
=
this
.
model
.
getElementRange
(
location
,
length
);
const
isVisible
=
ancestors
.
every
(
el
=>
!
el
.
collapsed
);
if
(
isVisible
)
{
this
.
viewModel
.
splice
(
location
,
deleteCount
,
elementsToInsert
);
}
return
result
;
}
}
src/vs/base/common/iterator.ts
浏览文件 @
dd5e23bf
...
...
@@ -14,12 +14,10 @@ export interface IIterator<T> {
next
():
IIteratorResult
<
T
>
;
}
export
function
iter
<
T
>
(
array
:
T
[]):
IIterator
<
T
>
{
let
index
=
0
;
export
function
iter
<
T
>
(
array
:
T
[],
index
=
0
,
length
=
array
.
length
):
IIterator
<
T
>
{
return
{
next
():
IIteratorResult
<
T
>
{
if
(
index
===
array
.
length
)
{
if
(
index
>=
length
)
{
return
{
done
:
true
,
value
:
undefined
};
}
...
...
src/vs/base/common/tree.ts
浏览文件 @
dd5e23bf
...
...
@@ -70,6 +70,21 @@ export class Tree<T> {
return
nodePath
.
map
(
node
=>
node
.
element
);
}
getElementRange
(
location
:
number
[],
length
:
number
):
[
T
[],
IIterator
<
ITreeElement
<
T
>>
]
{
if
(
location
.
length
===
0
)
{
throw
new
Error
(
'
Invalid tree location
'
);
}
const
[
parentLocation
,
index
]
=
tail2
(
location
);
const
parentPath
=
this
.
getNodePath
(
parentLocation
);
const
parent
=
last
(
parentPath
);
return
[
parentPath
.
slice
(
1
).
map
(
node
=>
node
.
element
),
map
(
iter
(
parent
.
children
,
index
,
length
),
asElement
)
];
}
getNodes
():
ITreeNode
<
T
>
[]
{
return
this
.
root
.
children
;
}
...
...
src/vs/base/test/browser/ui/list/treeModel.test.ts
浏览文件 @
dd5e23bf
...
...
@@ -4,7 +4,7 @@
*--------------------------------------------------------------------------------------------*/
import
*
as
assert
from
'
assert
'
;
import
{
TreeModel
,
ITreeListElement
}
from
'
vs/base/browser/ui/list/treeModel
'
;
import
{
TreeModel
,
ITreeListElement
,
CollapsibleTreeModel
,
ICollapsibleTreeListElement
}
from
'
vs/base/browser/ui/list/treeModel
'
;
import
{
ISpliceable
}
from
'
vs/base/browser/ui/list/splice
'
;
import
{
iter
}
from
'
vs/base/common/iterator
'
;
...
...
@@ -146,3 +146,63 @@ suite('TreeModel2', () => {
assert
.
deepEqual
(
list
[
1
].
depth
,
1
);
});
});
suite
(
'
CollapsibleTreeModel
'
,
()
=>
{
test
(
'
ctor
'
,
()
=>
{
const
list
=
[]
as
ICollapsibleTreeListElement
<
number
>
[];
const
model
=
new
CollapsibleTreeModel
<
number
>
(
toSpliceable
(
list
));
assert
(
model
);
assert
.
equal
(
list
.
length
,
0
);
});
test
(
'
insert
'
,
()
=>
{
const
list
=
[]
as
ICollapsibleTreeListElement
<
number
>
[];
const
model
=
new
CollapsibleTreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
{
element
:
0
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
1
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
2
,
collapsed
:
false
},
children
:
iter
([])
}
]));
assert
.
deepEqual
(
list
.
length
,
3
);
assert
.
deepEqual
(
list
[
0
].
element
.
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
.
element
,
1
);
assert
.
deepEqual
(
list
[
1
].
depth
,
1
);
assert
.
deepEqual
(
list
[
2
].
element
.
element
,
2
);
assert
.
deepEqual
(
list
[
2
].
depth
,
1
);
});
test
(
'
deep insert
'
,
()
=>
{
const
list
=
[]
as
ICollapsibleTreeListElement
<
number
>
[];
const
model
=
new
CollapsibleTreeModel
<
number
>
(
toSpliceable
(
list
));
model
.
splice
([
0
],
0
,
iter
([
{
element
:
{
element
:
0
,
collapsed
:
false
},
children
:
iter
([
{
element
:
{
element
:
10
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
11
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
12
,
collapsed
:
false
},
children
:
iter
([])
},
])
},
{
element
:
{
element
:
1
,
collapsed
:
false
},
children
:
iter
([])
},
{
element
:
{
element
:
2
,
collapsed
:
false
},
children
:
iter
([])
}
]));
assert
.
deepEqual
(
list
.
length
,
6
);
assert
.
deepEqual
(
list
[
0
].
element
.
element
,
0
);
assert
.
deepEqual
(
list
[
0
].
depth
,
1
);
assert
.
deepEqual
(
list
[
1
].
element
.
element
,
10
);
assert
.
deepEqual
(
list
[
1
].
depth
,
2
);
assert
.
deepEqual
(
list
[
2
].
element
.
element
,
11
);
assert
.
deepEqual
(
list
[
2
].
depth
,
2
);
assert
.
deepEqual
(
list
[
3
].
element
.
element
,
12
);
assert
.
deepEqual
(
list
[
3
].
depth
,
2
);
assert
.
deepEqual
(
list
[
4
].
element
.
element
,
1
);
assert
.
deepEqual
(
list
[
4
].
depth
,
1
);
assert
.
deepEqual
(
list
[
5
].
element
.
element
,
2
);
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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录