Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
4b3c04ec
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,发现更多精彩内容 >>
提交
4b3c04ec
编写于
6月 24, 2018
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
tree: expand/collapse on click
上级
323bbc57
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
39 addition
and
10 deletion
+39
-10
src/vs/base/browser/ui/tree/tree.ts
src/vs/base/browser/ui/tree/tree.ts
+25
-8
src/vs/base/browser/ui/tree/treeModel.ts
src/vs/base/browser/ui/tree/treeModel.ts
+14
-2
未找到文件。
src/vs/base/browser/ui/tree/tree.ts
浏览文件 @
4b3c04ec
...
@@ -4,19 +4,13 @@
...
@@ -4,19 +4,13 @@
*--------------------------------------------------------------------------------------------*/
*--------------------------------------------------------------------------------------------*/
import
'
vs/css!./tree
'
;
import
'
vs/css!./tree
'
;
import
{
IDisposable
}
from
'
vs/base/common/lifecycle
'
;
import
{
IDisposable
,
dispose
}
from
'
vs/base/common/lifecycle
'
;
import
{
IListOptions
,
List
,
IIdentityProvider
,
IMultipleSelectionController
}
from
'
vs/base/browser/ui/list/listWidget
'
;
import
{
IListOptions
,
List
,
IIdentityProvider
,
IMultipleSelectionController
}
from
'
vs/base/browser/ui/list/listWidget
'
;
import
{
TreeModel
,
ITreeNode
,
ITreeElement
}
from
'
vs/base/browser/ui/tree/treeModel
'
;
import
{
TreeModel
,
ITreeNode
,
ITreeElement
}
from
'
vs/base/browser/ui/tree/treeModel
'
;
import
{
IIterator
,
empty
}
from
'
vs/base/common/iterator
'
;
import
{
IIterator
,
empty
}
from
'
vs/base/common/iterator
'
;
import
{
IDelegate
,
IRenderer
}
from
'
vs/base/browser/ui/list/list
'
;
import
{
IDelegate
,
IRenderer
,
IListMouseEvent
}
from
'
vs/base/browser/ui/list/list
'
;
import
{
append
,
$
}
from
'
vs/base/browser/dom
'
;
import
{
append
,
$
}
from
'
vs/base/browser/dom
'
;
/**
* Remove ITreeNode and just use ITreeNode instead.
* We need ITreeNode live objects to associate them with the respective rendered
* HTMLElement. That way we can find the right node when DOM events happen, eg click.
*/
function
toTreeListOptions
<
T
>
(
options
?:
IListOptions
<
T
>
):
IListOptions
<
ITreeNode
<
T
>>
{
function
toTreeListOptions
<
T
>
(
options
?:
IListOptions
<
T
>
):
IListOptions
<
ITreeNode
<
T
>>
{
if
(
!
options
)
{
if
(
!
options
)
{
return
undefined
;
return
undefined
;
...
@@ -95,10 +89,22 @@ class TreeRenderer<T, TTemplateData> implements IRenderer<ITreeNode<T>, ITreeLis
...
@@ -95,10 +89,22 @@ class TreeRenderer<T, TTemplateData> implements IRenderer<ITreeNode<T>, ITreeLis
}
}
}
}
function
getLocation
<
T
>
(
node
:
ITreeNode
<
T
>
):
number
[]
{
const
location
=
[];
while
(
node
.
parent
)
{
location
.
push
(
node
.
parent
.
children
.
indexOf
(
node
));
node
=
node
.
parent
;
}
return
location
.
reverse
();
}
export
class
Tree
<
T
>
implements
IDisposable
{
export
class
Tree
<
T
>
implements
IDisposable
{
private
view
:
List
<
ITreeNode
<
T
>>
;
private
view
:
List
<
ITreeNode
<
T
>>
;
private
model
:
TreeModel
<
T
>
;
private
model
:
TreeModel
<
T
>
;
private
disposables
:
IDisposable
[]
=
[];
constructor
(
constructor
(
container
:
HTMLElement
,
container
:
HTMLElement
,
...
@@ -112,13 +118,24 @@ export class Tree<T> implements IDisposable {
...
@@ -112,13 +118,24 @@ export class Tree<T> implements IDisposable {
this
.
view
=
new
List
(
container
,
treeDelegate
,
treeRenderers
,
treeOptions
);
this
.
view
=
new
List
(
container
,
treeDelegate
,
treeRenderers
,
treeOptions
);
this
.
model
=
new
TreeModel
<
T
>
(
this
.
view
);
this
.
model
=
new
TreeModel
<
T
>
(
this
.
view
);
this
.
view
.
onMouseClick
(
this
.
onMouseClick
,
this
,
this
.
disposables
);
}
}
splice
(
location
:
number
[],
deleteCount
:
number
,
toInsert
:
IIterator
<
ITreeElement
<
T
>>
=
empty
()):
IIterator
<
ITreeElement
<
T
>>
{
splice
(
location
:
number
[],
deleteCount
:
number
,
toInsert
:
IIterator
<
ITreeElement
<
T
>>
=
empty
()):
IIterator
<
ITreeElement
<
T
>>
{
return
this
.
model
.
splice
(
location
,
deleteCount
,
toInsert
);
return
this
.
model
.
splice
(
location
,
deleteCount
,
toInsert
);
}
}
private
onMouseClick
(
e
:
IListMouseEvent
<
ITreeNode
<
T
>>
):
void
{
const
node
=
e
.
element
;
const
location
=
getLocation
(
node
);
this
.
model
.
toggleCollapsed
(
location
);
}
dispose
():
void
{
dispose
():
void
{
this
.
disposables
=
dispose
(
this
.
disposables
);
this
.
view
.
dispose
();
this
.
view
.
dispose
();
this
.
view
=
null
;
this
.
model
=
null
;
}
}
}
}
\ No newline at end of file
src/vs/base/browser/ui/tree/treeModel.ts
浏览文件 @
4b3c04ec
...
@@ -16,7 +16,7 @@ export interface ITreeElement<T> {
...
@@ -16,7 +16,7 @@ export interface ITreeElement<T> {
}
}
export
interface
ITreeNode
<
T
>
{
export
interface
ITreeNode
<
T
>
{
readonly
parent
:
IMutableTreeNode
<
T
>
;
readonly
parent
:
IMutableTreeNode
<
T
>
|
undefined
;
readonly
element
:
T
;
readonly
element
:
T
;
readonly
children
:
IMutableTreeNode
<
T
>
[];
readonly
children
:
IMutableTreeNode
<
T
>
[];
readonly
depth
:
number
;
readonly
depth
:
number
;
...
@@ -52,7 +52,7 @@ function getVisibleNodes<T>(nodes: IMutableTreeNode<T>[], result: ITreeNode<T>[]
...
@@ -52,7 +52,7 @@ function getVisibleNodes<T>(nodes: IMutableTreeNode<T>[], result: ITreeNode<T>[]
function
treeElementToNode
<
T
>
(
treeElement
:
ITreeElement
<
T
>
,
parent
:
IMutableTreeNode
<
T
>
,
visible
:
boolean
,
treeListElements
:
ITreeNode
<
T
>
[]):
IMutableTreeNode
<
T
>
{
function
treeElementToNode
<
T
>
(
treeElement
:
ITreeElement
<
T
>
,
parent
:
IMutableTreeNode
<
T
>
,
visible
:
boolean
,
treeListElements
:
ITreeNode
<
T
>
[]):
IMutableTreeNode
<
T
>
{
const
depth
=
parent
.
depth
+
1
;
const
depth
=
parent
.
depth
+
1
;
const
{
element
,
collapsed
}
=
treeElement
;
const
{
element
,
collapsed
}
=
treeElement
;
const
node
=
{
parent
:
undefined
,
element
,
children
:
[],
depth
,
collapsed
,
visibleCount
:
0
};
const
node
=
{
parent
,
element
,
children
:
[],
depth
,
collapsed
,
visibleCount
:
0
};
if
(
visible
)
{
if
(
visible
)
{
treeListElements
.
push
(
node
);
treeListElements
.
push
(
node
);
...
@@ -105,8 +105,20 @@ export class TreeModel<T> {
...
@@ -105,8 +105,20 @@ export class TreeModel<T> {
}
}
setCollapsed
(
location
:
number
[],
collapsed
:
boolean
):
void
{
setCollapsed
(
location
:
number
[],
collapsed
:
boolean
):
void
{
this
.
_setCollapsed
(
location
,
collapsed
);
}
toggleCollapsed
(
location
:
number
[]):
void
{
this
.
_setCollapsed
(
location
);
}
private
_setCollapsed
(
location
:
number
[],
collapsed
?:
boolean
|
undefined
):
void
{
const
{
node
,
listIndex
,
visible
}
=
this
.
findNode
(
location
);
const
{
node
,
listIndex
,
visible
}
=
this
.
findNode
(
location
);
if
(
typeof
collapsed
===
'
undefined
'
)
{
collapsed
=
!
node
.
collapsed
;
}
if
(
node
.
collapsed
===
collapsed
)
{
if
(
node
.
collapsed
===
collapsed
)
{
return
;
return
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录