Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
徽霖
Vscode
提交
4a048890
V
Vscode
项目概览
徽霖
/
Vscode
通知
9
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,发现更多精彩内容 >>
提交
4a048890
编写于
5月 25, 2016
作者:
J
Joao Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
simplify render and splice methods in list
fixes #3464
上级
e074dc18
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
47 addition
and
69 deletion
+47
-69
src/vs/base/browser/ui/list/listView.ts
src/vs/base/browser/ui/list/listView.ts
+21
-68
src/vs/base/browser/ui/list/rangeMap.ts
src/vs/base/browser/ui/list/rangeMap.ts
+26
-0
src/vs/editor/contrib/suggest/browser/suggestWidget.ts
src/vs/editor/contrib/suggest/browser/suggestWidget.ts
+0
-1
未找到文件。
src/vs/base/browser/ui/list/listView.ts
浏览文件 @
4a048890
...
...
@@ -9,10 +9,9 @@ import { Gesture } from 'vs/base/browser/touch';
import
*
as
DOM
from
'
vs/base/browser/dom
'
;
import
{
ScrollableElement
}
from
'
vs/base/browser/ui/scrollbar/scrollableElement
'
;
import
{
ScrollbarVisibility
}
from
'
vs/base/browser/ui/scrollbar/scrollableElementOptions
'
;
import
{
RangeMap
,
IRange
}
from
'
./rangeMap
'
;
import
{
RangeMap
,
IRange
,
relativeComplement
,
each
}
from
'
./rangeMap
'
;
import
{
IDelegate
,
IRenderer
}
from
'
./list
'
;
import
{
RowCache
,
IRow
}
from
'
./rowCache
'
;
import
{
LcsDiff
,
ISequence
}
from
'
vs/base/common/diff/diff
'
;
interface
IItemRange
<
T
>
{
item
:
IItem
<
T
>
;
...
...
@@ -28,13 +27,6 @@ interface IItem<T> {
row
:
IRow
;
}
function
toSequence
<
T
>
(
itemRanges
:
IItemRange
<
T
>
[]):
ISequence
{
return
{
getLength
:
()
=>
itemRanges
.
length
,
getElementHash
:
i
=>
`
${
itemRanges
[
i
].
item
.
id
}
:
${
itemRanges
[
i
].
range
.
start
}
:
${
itemRanges
[
i
].
range
.
end
}
`
};
}
const
MouseEventTypes
=
[
'
click
'
,
'
dblclick
'
,
...
...
@@ -53,16 +45,12 @@ export class ListView<T> implements IDisposable {
private
rangeMap
:
RangeMap
;
private
cache
:
RowCache
<
T
>
;
private
renderers
:
{
[
templateId
:
string
]:
IRenderer
<
T
,
any
>
;
};
private
lastRenderTop
:
number
;
private
lastRenderHeight
:
number
;
private
_domNode
:
HTMLElement
;
private
gesture
:
Gesture
;
private
rowsContainer
:
HTMLElement
;
private
scrollableElement
:
ScrollableElement
;
private
toDispose
:
IDisposable
[];
constructor
(
...
...
@@ -110,7 +98,9 @@ export class ListView<T> implements IDisposable {
}
splice
(
start
:
number
,
deleteCount
:
number
,
...
elements
:
T
[]):
T
[]
{
const
before
=
this
.
getRenderedItemRanges
();
const
previousRenderRange
=
this
.
getRenderRange
(
this
.
lastRenderTop
,
this
.
lastRenderHeight
);
each
(
previousRenderRange
,
i
=>
this
.
removeItemFromDOM
(
this
.
items
[
i
]));
const
inserted
=
elements
.
map
<
IItem
<
T
>>
(
element
=>
({
id
:
String
(
this
.
itemId
++
),
element
,
...
...
@@ -120,21 +110,11 @@ export class ListView<T> implements IDisposable {
}));
this
.
rangeMap
.
splice
(
start
,
deleteCount
,
...
inserted
);
const
deleted
=
this
.
items
.
splice
(
start
,
deleteCount
,
...
inserted
);
const
after
=
this
.
getRenderedItemRanges
();
const
lcs
=
new
LcsDiff
(
toSequence
(
before
),
toSequence
(
after
),
null
);
const
diffs
=
lcs
.
ComputeDiff
();
const
deleted
=
this
.
items
.
splice
(
start
,
deleteCount
,
...
inserted
);
for
(
const
diff
of
diffs
)
{
for
(
let
i
=
0
;
i
<
diff
.
originalLength
;
i
++
)
{
this
.
removeItemFromDOM
(
before
[
diff
.
originalStart
+
i
].
item
);
}
for
(
let
i
=
0
;
i
<
diff
.
modifiedLength
;
i
++
)
{
this
.
insertItemInDOM
(
after
[
diff
.
modifiedStart
+
i
].
item
,
after
[
0
].
index
+
diff
.
modifiedStart
+
i
);
}
}
const
renderRange
=
this
.
getRenderRange
(
this
.
lastRenderTop
,
this
.
lastRenderHeight
);
each
(
renderRange
,
i
=>
this
.
insertItemInDOM
(
this
.
items
[
i
],
i
));
const
scrollHeight
=
this
.
getContentHeight
();
this
.
rowsContainer
.
style
.
height
=
`
${
scrollHeight
}
px`
;
...
...
@@ -180,52 +160,18 @@ export class ListView<T> implements IDisposable {
// Render
private
render
(
renderTop
:
number
,
renderHeight
:
number
):
void
{
const
renderBottom
=
renderTop
+
renderHeight
;
const
thisRenderBottom
=
this
.
lastRenderTop
+
this
.
lastRenderHeight
;
let
i
:
number
,
stop
:
number
;
const
previousRenderRange
=
this
.
getRenderRange
(
this
.
lastRenderTop
,
this
.
lastRenderHeight
);
const
renderRange
=
this
.
getRenderRange
(
renderTop
,
renderHeight
);
// when view scrolls down, start rendering from the renderBottom
for
(
i
=
this
.
rangeMap
.
indexAfter
(
renderBottom
)
-
1
,
stop
=
this
.
rangeMap
.
indexAt
(
Math
.
max
(
thisRenderBottom
,
renderTop
));
i
>=
stop
;
i
--
)
{
this
.
insertItemInDOM
(
this
.
items
[
i
],
i
);
}
const
rangesToInsert
=
relativeComplement
(
renderRange
,
previousRenderRange
);
const
rangesToRemove
=
relativeComplement
(
previousRenderRange
,
renderRange
);
// when view scrolls up, start rendering from either this.renderTop or renderBottom
for
(
i
=
Math
.
min
(
this
.
rangeMap
.
indexAt
(
this
.
lastRenderTop
),
this
.
rangeMap
.
indexAfter
(
renderBottom
))
-
1
,
stop
=
this
.
rangeMap
.
indexAt
(
renderTop
);
i
>=
stop
;
i
--
)
{
this
.
insertItemInDOM
(
this
.
items
[
i
],
i
);
}
// when view scrolls down, start unrendering from renderTop
for
(
i
=
this
.
rangeMap
.
indexAt
(
this
.
lastRenderTop
),
stop
=
Math
.
min
(
this
.
rangeMap
.
indexAt
(
renderTop
),
this
.
rangeMap
.
indexAfter
(
thisRenderBottom
));
i
<
stop
;
i
++
)
{
this
.
removeItemFromDOM
(
this
.
items
[
i
]);
}
// when view scrolls up, start unrendering from either renderBottom this.renderTop
for
(
i
=
Math
.
max
(
this
.
rangeMap
.
indexAfter
(
renderBottom
),
this
.
rangeMap
.
indexAt
(
this
.
lastRenderTop
)),
stop
=
this
.
rangeMap
.
indexAfter
(
thisRenderBottom
);
i
<
stop
;
i
++
)
{
this
.
removeItemFromDOM
(
this
.
items
[
i
]);
}
rangesToInsert
.
forEach
(
range
=>
each
(
range
,
i
=>
this
.
insertItemInDOM
(
this
.
items
[
i
],
i
)));
rangesToRemove
.
forEach
(
range
=>
each
(
range
,
i
=>
this
.
removeItemFromDOM
(
this
.
items
[
i
])));
this
.
rowsContainer
.
style
.
transform
=
`translate3d(0px, -
${
renderTop
}
px, 0px)`
;
this
.
lastRenderTop
=
renderTop
;
this
.
lastRenderHeight
=
renderBottom
-
renderTop
;
}
private
getRenderedItemRanges
():
IItemRange
<
T
>
[]
{
const
result
:
IItemRange
<
T
>
[]
=
[];
const
renderBottom
=
this
.
lastRenderTop
+
this
.
lastRenderHeight
;
let
start
=
this
.
lastRenderTop
;
let
index
=
this
.
rangeMap
.
indexAt
(
start
);
let
item
=
this
.
items
[
index
];
let
end
=
-
1
;
while
(
item
&&
start
<=
renderBottom
)
{
end
=
start
+
item
.
size
;
result
.
push
({
item
,
index
,
range
:
{
start
,
end
}});
start
=
end
;
item
=
this
.
items
[
++
index
];
}
return
result
;
this
.
lastRenderHeight
=
renderHeight
;
}
// DOM operations
...
...
@@ -304,6 +250,13 @@ export class ListView<T> implements IDisposable {
return
-
1
;
}
private
getRenderRange
(
renderTop
:
number
,
renderHeight
:
number
):
IRange
{
return
{
start
:
this
.
rangeMap
.
indexAt
(
renderTop
),
end
:
this
.
rangeMap
.
indexAfter
(
renderTop
+
renderHeight
-
1
)
};
}
// Dispose
dispose
()
{
...
...
src/vs/base/browser/ui/list/rangeMap.ts
浏览文件 @
4a048890
...
...
@@ -36,6 +36,32 @@ export function intersect(one: IRange, other: IRange): IRange {
return
{
start
,
end
};
}
export
function
isEmpty
(
range
:
IRange
):
boolean
{
return
range
.
end
-
range
.
start
<=
0
;
}
export
function
relativeComplement
(
one
:
IRange
,
other
:
IRange
):
IRange
[]
{
const
result
:
IRange
[]
=
[];
const
first
=
{
start
:
one
.
start
,
end
:
Math
.
min
(
other
.
start
,
one
.
end
)
};
const
second
=
{
start
:
Math
.
max
(
other
.
end
,
one
.
start
),
end
:
one
.
end
};
if
(
!
isEmpty
(
first
))
{
result
.
push
(
first
);
}
if
(
!
isEmpty
(
second
))
{
result
.
push
(
second
);
}
return
result
;
}
export
function
each
(
range
:
IRange
,
fn
:
(
index
:
number
)
=>
void
):
void
{
for
(
let
i
=
range
.
start
;
i
<
range
.
end
;
i
++
)
{
fn
(
i
);
}
}
/**
* Returns the intersection between a ranged group and a range.
* Returns `[]` if the intersection is empty.
...
...
src/vs/editor/contrib/suggest/browser/suggestWidget.ts
浏览文件 @
4a048890
...
...
@@ -484,7 +484,6 @@ export class SuggestWidget implements IContentWidget, IDisposable {
this
.
suggestionSupportsAutoAccept
.
set
(
!
item
.
suggestion
.
noAutoAccept
);
this
.
focusedItem
=
item
;
this
.
list
.
setFocus
(
index
);
this
.
updateWidgetHeight
();
this
.
list
.
reveal
(
index
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录