Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
707bb36d
V
vscode
项目概览
掘金者说
/
vscode
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
V
vscode
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
707bb36d
编写于
12月 12, 2018
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
ObjectTree.navigate
fixes #64793
上级
89a77514
变更
5
显示空白变更内容
内联
并排
Showing
5 changed file
with
231 addition
and
2 deletion
+231
-2
src/vs/base/browser/ui/list/listWidget.ts
src/vs/base/browser/ui/list/listWidget.ts
+4
-0
src/vs/base/browser/ui/tree/abstractTree.ts
src/vs/base/browser/ui/tree/abstractTree.ts
+61
-1
src/vs/base/browser/ui/tree/indexTreeModel.ts
src/vs/base/browser/ui/tree/indexTreeModel.ts
+2
-1
src/vs/base/browser/ui/tree/tree.ts
src/vs/base/browser/ui/tree/tree.ts
+9
-0
src/vs/base/test/browser/ui/tree/objectTree.test.ts
src/vs/base/test/browser/ui/tree/objectTree.test.ts
+155
-0
未找到文件。
src/vs/base/browser/ui/list/listWidget.ts
浏览文件 @
707bb36d
...
...
@@ -1096,6 +1096,10 @@ export class List<T> implements ISpliceable<T>, IDisposable {
this
.
eventBufferer
.
bufferEvents
(()
=>
this
.
spliceable
.
splice
(
start
,
deleteCount
,
elements
));
}
element
(
index
:
number
):
T
{
return
this
.
view
.
element
(
index
);
}
get
length
():
number
{
return
this
.
view
.
length
;
}
...
...
src/vs/base/browser/ui/tree/abstractTree.ts
浏览文件 @
707bb36d
...
...
@@ -11,7 +11,7 @@ import { append, $, toggleClass } from 'vs/base/browser/dom';
import
{
Event
,
Relay
}
from
'
vs/base/common/event
'
;
import
{
StandardKeyboardEvent
}
from
'
vs/base/browser/keyboardEvent
'
;
import
{
KeyCode
}
from
'
vs/base/common/keyCodes
'
;
import
{
ITreeModel
,
ITreeNode
,
ITreeRenderer
,
ITreeEvent
,
ITreeMouseEvent
,
ITreeContextMenuEvent
,
ITreeFilter
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
ITreeModel
,
ITreeNode
,
ITreeRenderer
,
ITreeEvent
,
ITreeMouseEvent
,
ITreeContextMenuEvent
,
ITreeFilter
,
ITreeNavigator
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
ISpliceable
}
from
'
vs/base/common/sequence
'
;
function
asListOptions
<
T
,
TFilterData
>
(
options
?:
IAbstractTreeOptions
<
T
,
TFilterData
>
):
IListOptions
<
ITreeNode
<
T
,
TFilterData
>>
|
undefined
{
...
...
@@ -491,8 +491,68 @@ export abstract class AbstractTree<T, TFilterData, TRef> implements IDisposable
protected
abstract
createModel
(
view
:
ISpliceable
<
ITreeNode
<
T
,
TFilterData
>>
,
options
:
IAbstractTreeOptions
<
T
,
TFilterData
>
):
ITreeModel
<
T
,
TFilterData
,
TRef
>
;
navigate
():
ITreeNavigator
<
T
>
{
return
new
TreeNavigator
(
this
.
view
,
this
.
model
);
}
dispose
():
void
{
this
.
disposables
=
dispose
(
this
.
disposables
);
this
.
view
.
dispose
();
}
}
interface
ITreeNavigatorView
<
T
extends
NonNullable
<
any
>
,
TFilterData
>
{
readonly
length
:
number
;
element
(
index
:
number
):
ITreeNode
<
T
,
TFilterData
>
;
}
class
TreeNavigator
<
T
extends
NonNullable
<
any
>
,
TFilterData
,
TRef
>
implements
ITreeNavigator
<
T
>
{
private
index
:
number
=
-
1
;
constructor
(
private
view
:
ITreeNavigatorView
<
T
,
TFilterData
>
,
private
model
:
ITreeModel
<
T
,
TFilterData
,
TRef
>
)
{
}
current
():
T
|
null
{
if
(
this
.
index
<
0
||
this
.
index
>=
this
.
view
.
length
)
{
return
null
;
}
return
this
.
view
.
element
(
this
.
index
).
element
;
}
previous
():
T
|
null
{
this
.
index
--
;
return
this
.
current
();
}
next
():
T
|
null
{
this
.
index
++
;
return
this
.
current
();
}
parent
():
T
|
null
{
if
(
this
.
index
<
0
||
this
.
index
>=
this
.
view
.
length
)
{
return
null
;
}
const
node
=
this
.
view
.
element
(
this
.
index
);
if
(
!
node
.
parent
)
{
this
.
index
=
-
1
;
return
this
.
current
();
}
this
.
index
=
this
.
model
.
getListIndex
(
this
.
model
.
getNodeLocation
(
node
.
parent
));
return
this
.
current
();
}
first
():
T
|
null
{
this
.
index
=
0
;
return
this
.
current
();
}
last
():
T
|
null
{
this
.
index
=
this
.
view
.
length
-
1
;
return
this
.
current
();
}
}
\ No newline at end of file
src/vs/base/browser/ui/tree/indexTreeModel.ts
浏览文件 @
707bb36d
...
...
@@ -120,7 +120,8 @@ export class IndexTreeModel<T extends Exclude<any, undefined>, TFilterData = voi
}
getListIndex
(
location
:
number
[]):
number
{
return
this
.
getTreeNodeWithListIndex
(
location
).
listIndex
;
const
{
node
,
listIndex
}
=
this
.
getTreeNodeWithListIndex
(
location
);
return
node
?
listIndex
:
-
1
;
}
setCollapsed
(
location
:
number
[],
collapsed
:
boolean
):
boolean
{
...
...
src/vs/base/browser/ui/tree/tree.ts
浏览文件 @
707bb36d
...
...
@@ -128,6 +128,15 @@ export interface ITreeContextMenuEvent<T> {
anchor
:
HTMLElement
|
{
x
:
number
;
y
:
number
;
}
|
undefined
;
}
export
interface
ITreeNavigator
<
T
>
{
current
():
T
|
null
;
previous
():
T
|
null
;
parent
():
T
|
null
;
first
():
T
|
null
;
last
():
T
|
null
;
next
():
T
|
null
;
}
/**
* Use this renderer when you want to re-render elements on account of
* an event firing.
...
...
src/vs/base/test/browser/ui/tree/objectTree.test.ts
0 → 100644
浏览文件 @
707bb36d
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
import
*
as
assert
from
'
assert
'
;
import
{
ITreeNode
,
ITreeRenderer
}
from
'
vs/base/browser/ui/tree/tree
'
;
import
{
IListVirtualDelegate
}
from
'
vs/base/browser/ui/list/list
'
;
import
{
ObjectTree
}
from
'
vs/base/browser/ui/tree/objectTree
'
;
import
{
Iterator
}
from
'
vs/base/common/iterator
'
;
suite
(
'
ObjectTree
'
,
function
()
{
suite
(
'
TreeNavigator
'
,
function
()
{
let
tree
:
ObjectTree
<
number
>
;
let
filter
=
(
_
:
number
)
=>
true
;
setup
(()
=>
{
const
container
=
document
.
createElement
(
'
div
'
);
container
.
style
.
width
=
'
200px
'
;
container
.
style
.
height
=
'
200px
'
;
const
delegate
=
new
class
implements
IListVirtualDelegate
<
number
>
{
getHeight
()
{
return
20
;
}
getTemplateId
():
string
{
return
'
default
'
;
}
};
const
renderer
=
new
class
implements
ITreeRenderer
<
number
,
void
,
HTMLElement
>
{
readonly
templateId
=
'
default
'
;
renderTemplate
(
container
:
HTMLElement
):
HTMLElement
{
return
container
;
}
renderElement
(
element
:
ITreeNode
<
number
,
void
>
,
index
:
number
,
templateData
:
HTMLElement
):
void
{
templateData
.
textContent
=
`
${
element
.
element
}
`
;
}
disposeTemplate
():
void
{
}
};
tree
=
new
ObjectTree
<
number
>
(
container
,
delegate
,
[
renderer
],
{
filter
:
{
filter
:
(
el
)
=>
filter
(
el
)
}
});
tree
.
layout
(
200
);
});
teardown
(()
=>
{
tree
.
dispose
();
});
test
(
'
should be able to navigate
'
,
()
=>
{
tree
.
setChildren
(
null
,
Iterator
.
fromArray
([
{
element
:
0
,
children
:
Iterator
.
fromArray
([
{
element
:
10
},
{
element
:
11
},
{
element
:
12
},
])
},
{
element
:
1
},
{
element
:
2
}
]));
const
navigator
=
tree
.
navigate
();
assert
.
equal
(
navigator
.
current
(),
null
);
assert
.
equal
(
navigator
.
next
(),
0
);
assert
.
equal
(
navigator
.
current
(),
0
);
assert
.
equal
(
navigator
.
next
(),
10
);
assert
.
equal
(
navigator
.
current
(),
10
);
assert
.
equal
(
navigator
.
next
(),
11
);
assert
.
equal
(
navigator
.
current
(),
11
);
assert
.
equal
(
navigator
.
next
(),
12
);
assert
.
equal
(
navigator
.
current
(),
12
);
assert
.
equal
(
navigator
.
next
(),
1
);
assert
.
equal
(
navigator
.
current
(),
1
);
assert
.
equal
(
navigator
.
next
(),
2
);
assert
.
equal
(
navigator
.
current
(),
2
);
assert
.
equal
(
navigator
.
previous
(),
1
);
assert
.
equal
(
navigator
.
current
(),
1
);
assert
.
equal
(
navigator
.
previous
(),
12
);
assert
.
equal
(
navigator
.
previous
(),
11
);
assert
.
equal
(
navigator
.
previous
(),
10
);
assert
.
equal
(
navigator
.
previous
(),
0
);
assert
.
equal
(
navigator
.
previous
(),
null
);
assert
.
equal
(
navigator
.
next
(),
0
);
assert
.
equal
(
navigator
.
next
(),
10
);
assert
.
equal
(
navigator
.
parent
(),
0
);
assert
.
equal
(
navigator
.
parent
(),
null
);
assert
.
equal
(
navigator
.
first
(),
0
);
assert
.
equal
(
navigator
.
last
(),
2
);
});
test
(
'
should skip collapsed nodes
'
,
()
=>
{
tree
.
setChildren
(
null
,
Iterator
.
fromArray
([
{
element
:
0
,
collapsed
:
true
,
children
:
Iterator
.
fromArray
([
{
element
:
10
},
{
element
:
11
},
{
element
:
12
},
])
},
{
element
:
1
},
{
element
:
2
}
]));
const
navigator
=
tree
.
navigate
();
assert
.
equal
(
navigator
.
current
(),
null
);
assert
.
equal
(
navigator
.
next
(),
0
);
assert
.
equal
(
navigator
.
next
(),
1
);
assert
.
equal
(
navigator
.
next
(),
2
);
assert
.
equal
(
navigator
.
next
(),
null
);
assert
.
equal
(
navigator
.
previous
(),
2
);
assert
.
equal
(
navigator
.
previous
(),
1
);
assert
.
equal
(
navigator
.
previous
(),
0
);
assert
.
equal
(
navigator
.
previous
(),
null
);
assert
.
equal
(
navigator
.
next
(),
0
);
assert
.
equal
(
navigator
.
parent
(),
null
);
assert
.
equal
(
navigator
.
first
(),
0
);
assert
.
equal
(
navigator
.
last
(),
2
);
});
test
(
'
should skip filtered elements
'
,
()
=>
{
filter
=
el
=>
el
%
2
===
0
;
tree
.
setChildren
(
null
,
Iterator
.
fromArray
([
{
element
:
0
,
children
:
Iterator
.
fromArray
([
{
element
:
10
},
{
element
:
11
},
{
element
:
12
},
])
},
{
element
:
1
},
{
element
:
2
}
]));
const
navigator
=
tree
.
navigate
();
assert
.
equal
(
navigator
.
current
(),
null
);
assert
.
equal
(
navigator
.
next
(),
0
);
assert
.
equal
(
navigator
.
next
(),
10
);
assert
.
equal
(
navigator
.
next
(),
12
);
assert
.
equal
(
navigator
.
next
(),
2
);
assert
.
equal
(
navigator
.
next
(),
null
);
assert
.
equal
(
navigator
.
previous
(),
2
);
assert
.
equal
(
navigator
.
previous
(),
12
);
assert
.
equal
(
navigator
.
previous
(),
10
);
assert
.
equal
(
navigator
.
previous
(),
0
);
assert
.
equal
(
navigator
.
previous
(),
null
);
assert
.
equal
(
navigator
.
next
(),
0
);
assert
.
equal
(
navigator
.
next
(),
10
);
assert
.
equal
(
navigator
.
parent
(),
0
);
assert
.
equal
(
navigator
.
parent
(),
null
);
assert
.
equal
(
navigator
.
first
(),
0
);
assert
.
equal
(
navigator
.
last
(),
2
);
});
});
});
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录