Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
1c6050ce
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,发现更多精彩内容 >>
提交
1c6050ce
编写于
12月 14, 2018
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
add tree sorter
fixes #63148
上级
3fc2c908
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
45 addition
and
23 deletion
+45
-23
src/vs/base/browser/ui/tree/abstractTree.ts
src/vs/base/browser/ui/tree/abstractTree.ts
+1
-0
src/vs/base/browser/ui/tree/asyncDataTree.ts
src/vs/base/browser/ui/tree/asyncDataTree.ts
+7
-1
src/vs/base/browser/ui/tree/indexTree.ts
src/vs/base/browser/ui/tree/indexTree.ts
+1
-3
src/vs/base/browser/ui/tree/objectTree.ts
src/vs/base/browser/ui/tree/objectTree.ts
+2
-2
src/vs/base/browser/ui/tree/objectTreeModel.ts
src/vs/base/browser/ui/tree/objectTreeModel.ts
+18
-3
src/vs/base/browser/ui/tree/tree.ts
src/vs/base/browser/ui/tree/tree.ts
+4
-0
test/tree/public/index.html
test/tree/public/index.html
+12
-6
test/tree/server.js
test/tree/server.js
+0
-8
未找到文件。
src/vs/base/browser/ui/tree/abstractTree.ts
浏览文件 @
1c6050ce
...
...
@@ -179,6 +179,7 @@ function asTreeContextMenuEvent<T>(event: IListContextMenuEvent<ITreeNode<T, any
}
export
interface
IAbstractTreeOptions
<
T
,
TFilterData
=
void
>
extends
IListOptions
<
T
>
{
collapseByDefault
?:
boolean
;
// defaults to false
filter
?:
ITreeFilter
<
T
,
TFilterData
>
;
}
...
...
src/vs/base/browser/ui/tree/asyncDataTree.ts
浏览文件 @
1c6050ce
...
...
@@ -6,7 +6,7 @@
import
{
ComposedTreeDelegate
,
IAbstractTreeOptions
}
from
'
vs/base/browser/ui/tree/abstractTree
'
;
import
{
ObjectTree
,
IObjectTreeOptions
}
from
'
vs/base/browser/ui/tree/objectTree
'
;
import
{
IListVirtualDelegate
,
IIdentityProvider
}
from
'
vs/base/browser/ui/list/list
'
;
import
{
ITreeElement
,
ITreeNode
,
ITreeRenderer
,
ITreeEvent
,
ITreeMouseEvent
,
ITreeContextMenuEvent
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
ITreeElement
,
ITreeNode
,
ITreeRenderer
,
ITreeEvent
,
ITreeMouseEvent
,
ITreeContextMenuEvent
,
ITreeSorter
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
IDisposable
,
dispose
}
from
'
vs/base/common/lifecycle
'
;
import
{
Emitter
,
Event
}
from
'
vs/base/common/event
'
;
import
{
timeout
,
always
}
from
'
vs/base/common/async
'
;
...
...
@@ -157,6 +157,11 @@ function asObjectTreeOptions<T, TFilterData>(options?: IAsyncDataTreeOptions<T,
getKeyboardNavigationLabel
(
e
)
{
return
options
.
keyboardNavigationLabelProvider
!
.
getKeyboardNavigationLabel
(
e
.
element
!
);
}
},
sorter
:
options
.
sorter
&&
{
compare
(
a
,
b
)
{
return
options
.
sorter
!
.
compare
(
a
.
element
!
,
b
.
element
!
);
}
}
};
}
...
...
@@ -170,6 +175,7 @@ function asTreeElement<T>(node: IAsyncDataTreeNode<T>): ITreeElement<IAsyncDataT
export
interface
IAsyncDataTreeOptions
<
T
,
TFilterData
=
void
>
extends
IAbstractTreeOptions
<
T
,
TFilterData
>
{
identityProvider
?:
IIdentityProvider
<
T
>
;
sorter
?:
ITreeSorter
<
T
>
;
}
export
class
AsyncDataTree
<
T
extends
NonNullable
<
any
>
,
TFilterData
=
void
>
implements
IDisposable
{
...
...
src/vs/base/browser/ui/tree/indexTree.ts
浏览文件 @
1c6050ce
...
...
@@ -11,9 +11,7 @@ import { IndexTreeModel } from 'vs/base/browser/ui/tree/indexTreeModel';
import
{
ITreeElement
,
ITreeModel
,
ITreeNode
,
ITreeRenderer
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
IListVirtualDelegate
}
from
'
vs/base/browser/ui/list/list
'
;
export
interface
IIndexTreeOptions
<
T
,
TFilterData
=
void
>
extends
IAbstractTreeOptions
<
T
,
TFilterData
>
{
collapseByDefault
?:
boolean
;
// defaults to false
}
export
interface
IIndexTreeOptions
<
T
,
TFilterData
=
void
>
extends
IAbstractTreeOptions
<
T
,
TFilterData
>
{
}
export
class
IndexTree
<
T
,
TFilterData
=
void
>
extends
AbstractTree
<
T
,
TFilterData
,
number
[]
>
{
...
...
src/vs/base/browser/ui/tree/objectTree.ts
浏览文件 @
1c6050ce
...
...
@@ -6,12 +6,12 @@
import
{
Iterator
,
ISequence
}
from
'
vs/base/common/iterator
'
;
import
{
AbstractTree
,
IAbstractTreeOptions
}
from
'
vs/base/browser/ui/tree/abstractTree
'
;
import
{
ISpliceable
}
from
'
vs/base/common/sequence
'
;
import
{
ITreeNode
,
ITreeModel
,
ITreeElement
,
ITreeRenderer
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
ITreeNode
,
ITreeModel
,
ITreeElement
,
ITreeRenderer
,
ITreeSorter
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
ObjectTreeModel
}
from
'
vs/base/browser/ui/tree/objectTreeModel
'
;
import
{
IListVirtualDelegate
}
from
'
vs/base/browser/ui/list/list
'
;
export
interface
IObjectTreeOptions
<
T
,
TFilterData
=
void
>
extends
IAbstractTreeOptions
<
T
,
TFilterData
>
{
collapseByDefault
?:
boolean
;
// defaults to false
sorter
?:
ITreeSorter
<
T
>
;
}
export
class
ObjectTree
<
T
extends
NonNullable
<
any
>
,
TFilterData
=
void
>
extends
AbstractTree
<
T
|
null
,
TFilterData
,
T
|
null
>
{
...
...
src/vs/base/browser/ui/tree/objectTreeModel.ts
浏览文件 @
1c6050ce
...
...
@@ -7,9 +7,11 @@ import { ISpliceable } from 'vs/base/common/sequence';
import
{
Iterator
,
ISequence
,
getSequenceIterator
}
from
'
vs/base/common/iterator
'
;
import
{
IndexTreeModel
,
IIndexTreeModelOptions
}
from
'
vs/base/browser/ui/tree/indexTreeModel
'
;
import
{
Event
}
from
'
vs/base/common/event
'
;
import
{
ITreeModel
,
ITreeNode
,
ITreeElement
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
ITreeModel
,
ITreeNode
,
ITreeElement
,
ITreeSorter
}
from
'
vs/base/browser/ui/tree/tree
'
;
export
interface
IObjectTreeModelOptions
<
T
,
TFilterData
>
extends
IIndexTreeModelOptions
<
T
,
TFilterData
>
{
}
export
interface
IObjectTreeModelOptions
<
T
,
TFilterData
>
extends
IIndexTreeModelOptions
<
T
,
TFilterData
>
{
sorter
?:
ITreeSorter
<
T
>
;
}
export
class
ObjectTreeModel
<
T
extends
NonNullable
<
any
>
,
TFilterData
extends
NonNullable
<
any
>
=
void
>
implements
ITreeModel
<
T
|
null
,
TFilterData
,
T
|
null
>
{
...
...
@@ -17,6 +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
>>
;
readonly
onDidChangeCollapseState
:
Event
<
ITreeNode
<
T
,
TFilterData
>>
;
readonly
onDidChangeRenderNodeCount
:
Event
<
ITreeNode
<
T
,
TFilterData
>>
;
...
...
@@ -27,6 +30,14 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
this
.
model
=
new
IndexTreeModel
(
list
,
null
,
options
);
this
.
onDidChangeCollapseState
=
this
.
model
.
onDidChangeCollapseState
as
Event
<
ITreeNode
<
T
,
TFilterData
>>
;
this
.
onDidChangeRenderNodeCount
=
this
.
model
.
onDidChangeRenderNodeCount
as
Event
<
ITreeNode
<
T
,
TFilterData
>>
;
if
(
options
.
sorter
)
{
this
.
sorter
=
{
compare
(
a
,
b
)
{
return
options
.
sorter
!
.
compare
(
a
.
element
,
b
.
element
);
}
};
}
}
setChildren
(
...
...
@@ -67,7 +78,11 @@ export class ObjectTreeModel<T extends NonNullable<any>, TFilterData extends Non
}
private
preserveCollapseState
(
elements
:
ISequence
<
ITreeElement
<
T
|
null
>>
|
undefined
):
ISequence
<
ITreeElement
<
T
|
null
>>
{
const
iterator
=
elements
?
getSequenceIterator
(
elements
)
:
Iterator
.
empty
<
ITreeElement
<
T
>>
();
let
iterator
=
elements
?
getSequenceIterator
(
elements
)
:
Iterator
.
empty
<
ITreeElement
<
T
>>
();
if
(
this
.
sorter
)
{
iterator
=
Iterator
.
fromArray
(
Iterator
.
collect
(
iterator
).
sort
(
this
.
sorter
.
compare
.
bind
(
this
.
sorter
)));
}
return
Iterator
.
map
(
iterator
,
treeElement
=>
{
const
node
=
this
.
nodes
.
get
(
treeElement
.
element
);
...
...
src/vs/base/browser/ui/tree/tree.ts
浏览文件 @
1c6050ce
...
...
@@ -67,6 +67,10 @@ export interface ITreeFilter<T, TFilterData = void> {
filter
(
element
:
T
,
parentVisibility
:
TreeVisibility
):
TreeFilterResult
<
TFilterData
>
;
}
export
interface
ITreeSorter
<
T
>
{
compare
(
element
:
T
,
otherElement
:
T
):
number
;
}
export
interface
ITreeElement
<
T
>
{
readonly
element
:
T
;
readonly
children
?:
Iterator
<
ITreeElement
<
T
>>
|
ITreeElement
<
T
>
[];
...
...
test/tree/public/index.html
浏览文件 @
1c6050ce
...
...
@@ -138,6 +138,16 @@
}
};
const
sorter
=
new
class
{
compare
(
a
,
b
)
{
if
(
a
.
collapsible
===
b
.
collapsible
)
{
return
a
.
name
<
b
.
name
?
-
1
:
1
;
}
return
a
.
collapsible
?
-
1
:
1
;
}
};
const
dataSource
=
new
class
{
hasChildren
(
element
)
{
return
element
===
null
||
element
.
element
.
type
===
'
dir
'
;
...
...
@@ -154,11 +164,7 @@
collapsible
:
element
.
type
===
'
dir
'
}));
if
(
element
)
{
setTimeout
(()
=>
c
(
els
),
2500
);
}
else
{
c
(
els
);
}
c
(
els
);
}
};
});
...
...
@@ -171,7 +177,7 @@
}
};
const
tree
=
new
AsyncDataTree
(
container
,
delegate
,
[
renderer
],
dataSource
,
{
filter
:
treeFilter
,
identityProvider
});
const
tree
=
new
AsyncDataTree
(
container
,
delegate
,
[
renderer
],
dataSource
,
{
filter
:
treeFilter
,
sorter
,
identityProvider
});
return
{
tree
,
treeFilter
};
}
...
...
test/tree/server.js
浏览文件 @
1c6050ce
...
...
@@ -46,14 +46,6 @@ async function readdir(relativePath) {
}
}
result
.
sort
((
a
,
b
)
=>
{
if
(
a
.
type
===
b
.
type
)
{
return
a
.
name
<
b
.
name
?
-
1
:
1
;
}
return
a
.
type
===
'
dir
'
?
-
1
:
1
;
});
return
result
;
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录