Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
9b893830
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,发现更多精彩内容 >>
提交
9b893830
编写于
7月 22, 2016
作者:
J
João Moreno
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement touch interaction in list
fixes #9338
上级
f5e9cb6d
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
57 addition
and
20 deletion
+57
-20
src/vs/base/browser/ui/list/listView.ts
src/vs/base/browser/ui/list/listView.ts
+53
-18
src/vs/base/browser/ui/list/listWidget.ts
src/vs/base/browser/ui/list/listWidget.ts
+4
-2
未找到文件。
src/vs/base/browser/ui/list/listView.ts
浏览文件 @
9b893830
...
...
@@ -5,9 +5,11 @@
import
{
toObject
,
assign
,
getOrDefault
}
from
'
vs/base/common/objects
'
;
import
{
IDisposable
,
dispose
}
from
'
vs/base/common/lifecycle
'
;
import
{
Gesture
}
from
'
vs/base/browser/touch
'
;
import
{
Gesture
,
EventType
as
TouchEventType
,
GestureEvent
}
from
'
vs/base/browser/touch
'
;
import
*
as
DOM
from
'
vs/base/browser/dom
'
;
import
{
domEvent
}
from
'
vs/base/browser/event
'
;
import
{
ScrollableElement
}
from
'
vs/base/browser/ui/scrollbar/scrollableElement
'
;
import
{
ScrollEvent
}
from
'
vs/base/common/scrollable
'
;
import
{
ScrollbarVisibility
}
from
'
vs/base/common/scrollable
'
;
import
{
RangeMap
,
IRange
,
relativeComplement
,
each
}
from
'
./rangeMap
'
;
import
{
IDelegate
,
IRenderer
}
from
'
./list
'
;
...
...
@@ -59,7 +61,7 @@ export class ListView<T> implements IDisposable {
private
gesture
:
Gesture
;
private
rowsContainer
:
HTMLElement
;
private
scrollableElement
:
ScrollableElement
;
private
toDispose
:
IDisposable
[];
private
disposables
:
IDisposable
[];
constructor
(
container
:
HTMLElement
,
...
...
@@ -91,12 +93,13 @@ export class ListView<T> implements IDisposable {
saveLastScrollTimeOnClassName
:
'
monaco-list-row
'
});
const
listener
=
this
.
scrollableElement
.
onScroll
(
e
=>
this
.
render
(
e
.
scrollTop
,
e
.
height
));
this
.
_domNode
.
appendChild
(
this
.
scrollableElement
.
getDomNode
());
container
.
appendChild
(
this
.
_domNode
);
this
.
toDispose
=
[
this
.
rangeMap
,
this
.
gesture
,
listener
,
this
.
scrollableElement
];
this
.
disposables
=
[
this
.
rangeMap
,
this
.
gesture
,
this
.
scrollableElement
];
this
.
scrollableElement
.
onScroll
(
this
.
onScroll
,
this
,
this
.
disposables
);
domEvent
(
this
.
rowsContainer
,
TouchEventType
.
Change
)(
this
.
onTouchChange
,
this
,
this
.
disposables
);
this
.
layout
();
}
...
...
@@ -217,29 +220,61 @@ export class ListView<T> implements IDisposable {
this
.
scrollableElement
.
updateState
({
scrollTop
});
}
get
scrollTop
():
number
{
return
this
.
getScrollTop
();
}
set
scrollTop
(
scrollTop
:
number
)
{
this
.
setScrollTop
(
scrollTop
);
}
// Events
addListener
(
type
:
string
,
handler
:
(
event
:
any
)
=>
void
,
useCapture
?:
boolean
):
IDisposable
{
const
userHandler
=
handler
;
let
domNode
=
this
.
domNode
;
if
(
MouseEventTypes
.
indexOf
(
type
)
>
-
1
)
{
const
userHandler
=
handler
;
handler
=
(
event
:
MouseEvent
)
=>
{
const
index
=
this
.
getItemIndex
(
event
);
handler
=
e
=>
this
.
fireScopedEvent
(
userHandler
,
this
.
getItemIndexFromMouseEvent
(
e
));
}
else
if
(
type
===
TouchEventType
.
Tap
)
{
domNode
=
this
.
rowsContainer
;
handler
=
e
=>
this
.
fireScopedEvent
(
userHandler
,
this
.
getItemIndexFromGestureEvent
(
e
));
}
if
(
index
<
0
)
{
return
;
}
return
DOM
.
addDisposableListener
(
domNode
,
type
,
handler
,
useCapture
);
}
const
element
=
this
.
items
[
index
].
element
;
userHandler
(
assign
(
event
,
{
element
,
index
}));
}
;
private
fireScopedEvent
(
handler
:
(
event
:
any
)
=>
void
,
index
)
{
if
(
index
<
0
)
{
return
;
}
return
DOM
.
addDisposableListener
(
this
.
domNode
,
type
,
handler
,
useCapture
);
const
element
=
this
.
items
[
index
].
element
;
handler
(
assign
(
event
,
{
element
,
index
}));
}
private
getItemIndex
(
event
:
MouseEvent
):
number
{
let
target
=
event
.
target
;
private
onScroll
(
e
:
ScrollEvent
):
void
{
this
.
render
(
e
.
scrollTop
,
e
.
height
);
}
private
onTouchChange
(
e
:
GestureEvent
):
void
{
event
.
preventDefault
();
event
.
stopPropagation
();
this
.
scrollTop
-=
e
.
translationY
;
}
// Util
private
getItemIndexFromMouseEvent
(
event
:
MouseEvent
):
number
{
return
this
.
getItemIndexFromEventTarget
(
event
.
target
);
}
private
getItemIndexFromGestureEvent
(
event
:
GestureEvent
):
number
{
return
this
.
getItemIndexFromEventTarget
(
event
.
initialTarget
);
}
private
getItemIndexFromEventTarget
(
target
:
EventTarget
):
number
{
while
(
target
instanceof
HTMLElement
&&
target
!==
this
.
rowsContainer
)
{
const
element
=
target
as
HTMLElement
;
const
rawIndex
=
element
.
getAttribute
(
'
data-index
'
);
...
...
@@ -275,6 +310,6 @@ export class ListView<T> implements IDisposable {
this
.
_domNode
=
null
;
}
this
.
toDispose
=
dispose
(
this
.
toDispose
);
this
.
disposables
=
dispose
(
this
.
disposables
);
}
}
src/vs/base/browser/ui/list/listWidget.ts
浏览文件 @
9b893830
...
...
@@ -7,6 +7,7 @@ import 'vs/css!./list';
import
{
IDisposable
,
dispose
}
from
'
vs/base/common/lifecycle
'
;
import
{
isNumber
}
from
'
vs/base/common/types
'
;
import
*
as
DOM
from
'
vs/base/browser/dom
'
;
import
{
EventType
as
TouchEventType
}
from
'
vs/base/browser/touch
'
;
import
{
KeyCode
}
from
'
vs/base/common/keyCodes
'
;
import
{
StandardKeyboardEvent
}
from
'
vs/base/browser/keyboardEvent
'
;
import
Event
,
{
Emitter
,
mapEvent
,
EventBufferer
,
filterEvent
}
from
'
vs/base/common/event
'
;
...
...
@@ -130,7 +131,8 @@ class Controller<T> implements IDisposable {
)
{
this
.
disposables
=
[];
this
.
disposables
.
push
(
view
.
addListener
(
'
mousedown
'
,
e
=>
this
.
onMouseDown
(
e
)));
this
.
disposables
.
push
(
view
.
addListener
(
'
click
'
,
e
=>
this
.
onClick
(
e
)));
this
.
disposables
.
push
(
view
.
addListener
(
'
click
'
,
e
=>
this
.
onPointer
(
e
)));
this
.
disposables
.
push
(
view
.
addListener
(
TouchEventType
.
Tap
,
e
=>
this
.
onPointer
(
e
)));
const
onRawKeyDown
=
domEvent
(
view
.
domNode
,
'
keydown
'
);
const
onKeyDown
=
mapEvent
(
onRawKeyDown
,
e
=>
new
StandardKeyboardEvent
(
e
));
...
...
@@ -146,7 +148,7 @@ class Controller<T> implements IDisposable {
e
.
stopPropagation
();
}
private
on
Click
(
e
:
IListMouseEvent
<
T
>
)
{
private
on
Pointer
(
e
:
IListMouseEvent
<
T
>
)
{
e
.
preventDefault
();
e
.
stopPropagation
();
this
.
view
.
domNode
.
focus
();
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录