Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
6a5e884c
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,发现更多精彩内容 >>
提交
6a5e884c
编写于
2月 21, 2019
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ObjectTree.resort
fixes #67876
上级
eccccb64
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
87 addition
and
3 deletion
+87
-3
src/vs/base/browser/ui/tree/asyncDataTree.ts
src/vs/base/browser/ui/tree/asyncDataTree.ts
+4
-0
src/vs/base/browser/ui/tree/dataTree.ts
src/vs/base/browser/ui/tree/dataTree.ts
+4
-0
src/vs/base/browser/ui/tree/objectTree.ts
src/vs/base/browser/ui/tree/objectTree.ts
+4
-0
src/vs/base/browser/ui/tree/objectTreeModel.ts
src/vs/base/browser/ui/tree/objectTreeModel.ts
+38
-3
src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts
src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts
+37
-0
未找到文件。
src/vs/base/browser/ui/tree/asyncDataTree.ts
浏览文件 @
6a5e884c
...
...
@@ -418,6 +418,10 @@ export class AsyncDataTree<TInput, T, TFilterData = void> implements IDisposable
await
this
.
refreshAndRenderNode
(
this
.
getDataNode
(
element
),
recursive
,
ChildrenResolutionReason
.
Refresh
,
viewStateContext
);
}
resort
(
element
:
TInput
|
T
=
this
.
root
.
element
,
recursive
=
true
):
void
{
this
.
tree
.
resort
(
this
.
getDataNode
(
element
),
recursive
);
}
hasNode
(
element
:
TInput
|
T
):
boolean
{
return
element
===
this
.
root
.
element
||
this
.
nodes
.
has
(
element
as
T
);
}
...
...
src/vs/base/browser/ui/tree/dataTree.ts
浏览文件 @
6a5e884c
...
...
@@ -89,6 +89,10 @@ export class DataTree<TInput, T, TFilterData = void> extends AbstractTree<T | nu
this
.
_refresh
(
element
);
}
resort
(
element
:
T
|
TInput
=
this
.
input
!
,
recursive
=
true
):
void
{
this
.
model
.
resort
((
element
===
this
.
input
?
null
:
element
)
as
T
,
recursive
);
}
// View
refresh
(
element
:
T
):
void
{
...
...
src/vs/base/browser/ui/tree/objectTree.ts
浏览文件 @
6a5e884c
...
...
@@ -40,6 +40,10 @@ export class ObjectTree<T extends NonNullable<any>, TFilterData = void> extends
this
.
model
.
refresh
(
element
);
}
resort
(
element
:
T
,
recursive
=
true
):
void
{
this
.
model
.
resort
(
element
,
recursive
);
}
protected
createModel
(
view
:
ISpliceable
<
ITreeNode
<
T
,
TFilterData
>>
,
options
:
IObjectTreeOptions
<
T
,
TFilterData
>
):
ITreeModel
<
T
|
null
,
TFilterData
,
T
|
null
>
{
return
new
ObjectTreeModel
(
view
,
options
);
}
...
...
src/vs/base/browser/ui/tree/objectTreeModel.ts
浏览文件 @
6a5e884c
...
...
@@ -19,7 +19,7 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
private
model
:
IndexTreeModel
<
T
|
null
,
TFilterData
>
;
private
nodes
=
new
Map
<
T
|
null
,
ITreeNode
<
T
,
TFilterData
>>
();
private
sorter
?:
ITreeSorter
<
ITreeElement
<
T
>
>
;
private
sorter
?:
ITreeSorter
<
{
element
:
T
;
}
>
;
readonly
onDidSplice
:
Event
<
ITreeModelSpliceEvent
<
T
|
null
,
TFilterData
>>
;
readonly
onDidChangeCollapseState
:
Event
<
ICollapseStateChangeEvent
<
T
,
TFilterData
>>
;
...
...
@@ -49,6 +49,15 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
onDidDeleteNode
?:
(
node
:
ITreeNode
<
T
,
TFilterData
>
)
=>
void
):
Iterator
<
ITreeElement
<
T
|
null
>>
{
const
location
=
this
.
getElementLocation
(
element
);
return
this
.
_setChildren
(
location
,
this
.
preserveCollapseState
(
children
),
onDidCreateNode
,
onDidDeleteNode
);
}
private
_setChildren
(
location
:
number
[],
children
:
ISequence
<
ITreeElement
<
T
>>
|
undefined
,
onDidCreateNode
?:
(
node
:
ITreeNode
<
T
,
TFilterData
>
)
=>
void
,
onDidDeleteNode
?:
(
node
:
ITreeNode
<
T
,
TFilterData
>
)
=>
void
):
Iterator
<
ITreeElement
<
T
|
null
>>
{
const
insertedElements
=
new
Set
<
T
|
null
>
();
const
_onDidCreateNode
=
(
node
:
ITreeNode
<
T
,
TFilterData
>
)
=>
{
...
...
@@ -73,13 +82,13 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
return
this
.
model
.
splice
(
[...
location
,
0
],
Number
.
MAX_VALUE
,
this
.
preserveCollapseState
(
children
)
,
children
,
_onDidCreateNode
,
_onDidDeleteNode
);
}
private
preserveCollapseState
(
elements
:
ISequence
<
ITreeElement
<
T
|
null
>>
|
undefined
):
ISequence
<
ITreeElement
<
T
|
null
>>
{
private
preserveCollapseState
(
elements
:
ISequence
<
ITreeElement
<
T
>>
|
undefined
):
ISequence
<
ITreeElement
<
T
>>
{
let
iterator
=
elements
?
getSequenceIterator
(
elements
)
:
Iterator
.
empty
<
ITreeElement
<
T
>>
();
if
(
this
.
sorter
)
{
...
...
@@ -113,6 +122,32 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
this
.
model
.
refresh
(
location
);
}
resort
(
element
:
T
|
null
=
null
,
recursive
=
true
):
void
{
if
(
!
this
.
sorter
)
{
return
;
}
const
location
=
this
.
getElementLocation
(
element
);
const
node
=
this
.
model
.
getNode
(
location
);
this
.
_setChildren
(
location
,
this
.
resortChildren
(
node
,
recursive
));
}
private
resortChildren
(
node
:
ITreeNode
<
T
|
null
,
TFilterData
>
,
recursive
:
boolean
,
first
=
true
):
ISequence
<
ITreeElement
<
T
>>
{
let
childrenNodes
=
Iterator
.
fromArray
(
node
.
children
as
ITreeNode
<
T
,
TFilterData
>
[]);
if
(
recursive
||
first
)
{
childrenNodes
=
Iterator
.
fromArray
(
Iterator
.
collect
(
childrenNodes
).
sort
(
this
.
sorter
!
.
compare
.
bind
(
this
.
sorter
)));
}
return
Iterator
.
map
<
ITreeNode
<
T
|
null
,
TFilterData
>
,
ITreeElement
<
T
>>
(
childrenNodes
,
node
=>
({
element
:
node
.
element
as
T
,
collapsible
:
node
.
collapsible
,
collapsed
:
node
.
collapsed
,
children
:
this
.
resortChildren
(
node
,
recursive
,
false
)
}));
}
getParentElement
(
ref
:
T
|
null
=
null
):
T
|
null
{
const
location
=
this
.
getElementLocation
(
ref
);
return
this
.
model
.
getParentElement
(
location
);
...
...
src/vs/base/test/browser/ui/tree/objectTreeModel.test.ts
浏览文件 @
6a5e884c
...
...
@@ -183,4 +183,41 @@ suite('ObjectTreeModel', function () {
model
.
setChildren
(
null
,
data
);
assert
.
deepEqual
(
toArray
(
list
),
[
'
airplanes
'
,
'
jet
'
,
'
passenger
'
,
'
bicycles
'
,
'
dutch
'
,
'
electric
'
,
'
mountain
'
,
'
cars
'
,
'
compact
'
,
'
convertible
'
,
'
sedan
'
]);
});
test
(
'
resort
'
,
()
=>
{
let
compare
:
(
a
:
string
,
b
:
string
)
=>
number
=
()
=>
0
;
const
list
:
ITreeNode
<
string
>
[]
=
[];
const
model
=
new
ObjectTreeModel
<
string
>
(
toSpliceable
(
list
),
{
sorter
:
{
compare
(
a
,
b
)
{
return
compare
(
a
,
b
);
}
}
});
const
data
=
[
{
element
:
'
cars
'
,
children
:
[{
element
:
'
sedan
'
},
{
element
:
'
convertible
'
},
{
element
:
'
compact
'
}]
},
{
element
:
'
airplanes
'
,
children
:
[{
element
:
'
passenger
'
},
{
element
:
'
jet
'
}]
},
{
element
:
'
bicycles
'
,
children
:
[{
element
:
'
dutch
'
},
{
element
:
'
mountain
'
},
{
element
:
'
electric
'
}]
},
];
model
.
setChildren
(
null
,
data
);
assert
.
deepEqual
(
toArray
(
list
),
[
'
cars
'
,
'
sedan
'
,
'
convertible
'
,
'
compact
'
,
'
airplanes
'
,
'
passenger
'
,
'
jet
'
,
'
bicycles
'
,
'
dutch
'
,
'
mountain
'
,
'
electric
'
]);
// lexicographical
compare
=
(
a
,
b
)
=>
a
<
b
?
-
1
:
1
;
// non-recursive
model
.
resort
(
null
,
false
);
assert
.
deepEqual
(
toArray
(
list
),
[
'
airplanes
'
,
'
passenger
'
,
'
jet
'
,
'
bicycles
'
,
'
dutch
'
,
'
mountain
'
,
'
electric
'
,
'
cars
'
,
'
sedan
'
,
'
convertible
'
,
'
compact
'
]);
// recursive
model
.
resort
();
assert
.
deepEqual
(
toArray
(
list
),
[
'
airplanes
'
,
'
jet
'
,
'
passenger
'
,
'
bicycles
'
,
'
dutch
'
,
'
electric
'
,
'
mountain
'
,
'
cars
'
,
'
compact
'
,
'
convertible
'
,
'
sedan
'
]);
// reverse
compare
=
(
a
,
b
)
=>
a
<
b
?
1
:
-
1
;
// scoped
model
.
resort
(
'
cars
'
);
assert
.
deepEqual
(
toArray
(
list
),
[
'
airplanes
'
,
'
jet
'
,
'
passenger
'
,
'
bicycles
'
,
'
dutch
'
,
'
electric
'
,
'
mountain
'
,
'
cars
'
,
'
sedan
'
,
'
convertible
'
,
'
compact
'
]);
// recursive
model
.
resort
();
assert
.
deepEqual
(
toArray
(
list
),
[
'
cars
'
,
'
sedan
'
,
'
convertible
'
,
'
compact
'
,
'
bicycles
'
,
'
mountain
'
,
'
electric
'
,
'
dutch
'
,
'
airplanes
'
,
'
passenger
'
,
'
jet
'
]);
});
});
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录