Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
24a7cb0c
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,发现更多精彩内容 >>
提交
24a7cb0c
编写于
3月 20, 2018
作者:
C
Christof Marti
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Keyboard access (#45589)
上级
7cd87957
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
130 addition
and
26 deletion
+130
-26
src/vs/workbench/browser/parts/quickinput/quickInput.ts
src/vs/workbench/browser/parts/quickinput/quickInput.ts
+41
-0
src/vs/workbench/browser/parts/quickinput/quickInputBox.ts
src/vs/workbench/browser/parts/quickinput/quickInputBox.ts
+15
-2
src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts
...kbench/browser/parts/quickinput/quickInputCheckboxList.ts
+74
-24
未找到文件。
src/vs/workbench/browser/parts/quickinput/quickInput.ts
浏览文件 @
24a7cb0c
...
...
@@ -20,6 +20,8 @@ import { TPromise } from 'vs/base/common/winjs.base';
import
{
CancellationToken
}
from
'
vs/base/common/cancellation
'
;
import
{
QuickInputCheckboxList
}
from
'
./quickInputCheckboxList
'
;
import
{
QuickInputBox
}
from
'
./quickInputBox
'
;
import
{
KeyCode
}
from
'
vs/base/common/keyCodes
'
;
import
{
StandardKeyboardEvent
}
from
'
vs/base/browser/keyboardEvent
'
;
const
$
=
dom
.
$
;
...
...
@@ -56,12 +58,35 @@ export class QuickInputService extends Component implements IQuickInputService {
this
.
container
.
style
.
display
=
'
none
'
;
this
.
inputBox
=
new
QuickInputBox
(
this
.
container
);
this
.
toUnbind
.
push
(
this
.
inputBox
);
this
.
inputBox
.
style
(
this
.
themeService
.
getTheme
());
this
.
inputBox
.
onInput
(
value
=>
{
this
.
checkboxList
.
filter
(
value
);
});
this
.
toUnbind
.
push
(
this
.
inputBox
.
onKeyDown
(
event
=>
{
switch
(
event
.
keyCode
)
{
case
KeyCode
.
DownArrow
:
this
.
checkboxList
.
focus
(
'
Next
'
);
break
;
case
KeyCode
.
UpArrow
:
this
.
checkboxList
.
focus
(
'
Previous
'
);
break
;
case
KeyCode
.
PageDown
:
this
.
checkboxList
.
focus
(
'
NextPage
'
);
break
;
case
KeyCode
.
PageUp
:
this
.
checkboxList
.
focus
(
'
PreviousPage
'
);
break
;
case
KeyCode
.
Space
:
if
(
event
.
ctrlKey
)
{
this
.
checkboxList
.
toggleCheckbox
();
}
break
;
}
}));
this
.
checkboxList
=
this
.
instantiationService
.
createInstance
(
QuickInputCheckboxList
,
this
.
container
);
this
.
toUnbind
.
push
(
this
.
checkboxList
);
const
buttonContainer
=
dom
.
append
(
this
.
container
,
$
(
'
.quick-input-actions
'
));
const
cancel
=
dom
.
append
(
buttonContainer
,
$
(
'
button
'
));
...
...
@@ -79,6 +104,19 @@ export class QuickInputService extends Component implements IQuickInputService {
}
this
.
close
(
false
);
}));
this
.
toUnbind
.
push
(
dom
.
addDisposableListener
(
this
.
container
,
dom
.
EventType
.
KEY_DOWN
,
(
e
:
KeyboardEvent
)
=>
{
const
event
=
new
StandardKeyboardEvent
(
e
);
switch
(
event
.
keyCode
)
{
case
KeyCode
.
Enter
:
dom
.
EventHelper
.
stop
(
e
,
true
);
this
.
close
(
true
);
break
;
case
KeyCode
.
Escape
:
dom
.
EventHelper
.
stop
(
e
,
true
);
this
.
close
(
false
);
break
;
}
}));
}
private
close
(
ok
:
boolean
)
{
...
...
@@ -92,6 +130,9 @@ export class QuickInputService extends Component implements IQuickInputService {
async
pick
<
T
extends
IPickOpenEntry
>
(
picks
:
TPromise
<
T
[]
>
,
options
?:
IPickOptions
,
token
?:
CancellationToken
):
TPromise
<
T
[]
>
{
this
.
create
();
if
(
this
.
resolve
)
{
this
.
resolve
(
undefined
);
}
this
.
inputBox
.
setPlaceholder
(
options
.
placeHolder
||
''
);
// TODO: Progress indication.
...
...
src/vs/workbench/browser/parts/quickinput/quickInputBox.ts
浏览文件 @
24a7cb0c
...
...
@@ -11,7 +11,8 @@ import { InputBox } from 'vs/base/browser/ui/inputbox/inputBox';
import
*
as
nls
from
'
vs/nls
'
;
import
{
inputBackground
,
inputForeground
,
inputBorder
}
from
'
vs/platform/theme/common/colorRegistry
'
;
import
{
ITheme
}
from
'
vs/platform/theme/common/themeService
'
;
import
{
IDisposable
}
from
'
vs/base/common/lifecycle
'
;
import
{
dispose
,
IDisposable
}
from
'
vs/base/common/lifecycle
'
;
import
{
StandardKeyboardEvent
}
from
'
vs/base/browser/keyboardEvent
'
;
const
$
=
dom
.
$
;
...
...
@@ -19,8 +20,9 @@ const DEFAULT_INPUT_ARIA_LABEL = nls.localize('quickInputBoxAriaLabel', "Type to
export
class
QuickInputBox
{
p
ublic
container
:
HTMLElement
;
p
rivate
container
:
HTMLElement
;
private
inputBox
:
InputBox
;
private
disposables
:
IDisposable
[]
=
[];
constructor
(
private
parent
:
HTMLElement
...
...
@@ -29,6 +31,7 @@ export class QuickInputBox {
this
.
inputBox
=
new
InputBox
(
this
.
container
,
null
,
{
ariaLabel
:
DEFAULT_INPUT_ARIA_LABEL
});
this
.
disposables
.
push
(
this
.
inputBox
);
// ARIA
const
inputElement
=
this
.
inputBox
.
inputElement
;
...
...
@@ -37,6 +40,12 @@ export class QuickInputBox {
inputElement
.
setAttribute
(
'
aria-autocomplete
'
,
'
list
'
);
}
onKeyDown
(
handler
:
(
event
:
StandardKeyboardEvent
)
=>
void
):
IDisposable
{
return
dom
.
addDisposableListener
(
this
.
inputBox
.
inputElement
,
dom
.
EventType
.
KEY_DOWN
,
(
e
:
KeyboardEvent
)
=>
{
handler
(
new
StandardKeyboardEvent
(
e
));
});
}
onInput
(
handler
:
(
event
:
string
)
=>
void
):
IDisposable
{
return
this
.
inputBox
.
onDidChange
(
handler
);
}
...
...
@@ -60,4 +69,8 @@ export class QuickInputBox {
inputBorder
:
theme
.
getColor
(
inputBorder
)
});
}
dispose
()
{
this
.
disposables
=
dispose
(
this
.
disposables
);
}
}
src/vs/workbench/browser/parts/quickinput/quickInputCheckboxList.ts
浏览文件 @
24a7cb0c
...
...
@@ -15,30 +15,57 @@ import { IPickOpenEntry } from 'vs/platform/quickOpen/common/quickOpen';
import
{
IMatch
}
from
'
vs/base/common/filters
'
;
import
{
matchesFuzzyOcticonAware
,
parseOcticons
}
from
'
vs/base/common/octicon
'
;
import
{
compareAnything
}
from
'
vs/base/common/comparers
'
;
import
{
Emitter
}
from
'
vs/base/common/event
'
;
import
{
assign
}
from
'
vs/base/common/objects
'
;
import
{
KeyCode
}
from
'
vs/base/common/keyCodes
'
;
import
{
StandardKeyboardEvent
}
from
'
vs/base/browser/keyboardEvent
'
;
const
$
=
dom
.
$
;
export
interface
ISelected
Element
{
interface
ISelectable
Element
{
index
:
number
;
item
:
object
;
label
:
string
;
shouldAlwaysShow
?:
boolean
;
hidden
?:
boolean
;
selected
?:
boolean
;
selected
:
boolean
;
}
class
SelectableElement
implements
ISelectableElement
{
index
:
number
;
item
:
object
;
label
:
string
;
shouldAlwaysShow
=
false
;
hidden
=
false
;
private
_onSelected
=
new
Emitter
<
boolean
>
();
onSelected
=
this
.
_onSelected
.
event
;
_selected
:
boolean
;
get
selected
()
{
return
this
.
_selected
;
}
set
selected
(
value
:
boolean
)
{
if
(
value
!==
this
.
_selected
)
{
this
.
_selected
=
value
;
this
.
_onSelected
.
fire
(
value
);
}
}
labelHighlights
?:
IMatch
[];
descriptionHighlights
?:
IMatch
[];
detailHighlights
?:
IMatch
[];
constructor
(
init
:
ISelectableElement
)
{
assign
(
this
,
init
);
}
}
interface
ISelectedElementTemplateData
{
element
:
HTMLElement
;
name
:
HTMLElement
;
checkbox
:
HTMLInputElement
;
context
:
ISelectedElement
;
toDispose
:
IDisposable
[];
context
:
SelectableElement
;
toDisposeElement
:
IDisposable
[];
toDisposeTemplate
:
IDisposable
[];
}
class
SelectedElementRenderer
implements
IRenderer
<
ISelected
Element
,
ISelectedElementTemplateData
>
{
class
SelectedElementRenderer
implements
IRenderer
<
Selectable
Element
,
ISelectedElementTemplateData
>
{
static
readonly
ID
=
'
selectedelement
'
;
...
...
@@ -52,8 +79,11 @@ class SelectedElementRenderer implements IRenderer<ISelectedElement, ISelectedEl
data
.
checkbox
=
<
HTMLInputElement
>
$
(
'
input
'
);
data
.
checkbox
.
type
=
'
checkbox
'
;
data
.
toDispose
=
[];
data
.
toDispose
.
push
(
dom
.
addStandardDisposableListener
(
data
.
checkbox
,
'
change
'
,
(
e
)
=>
data
.
context
.
selected
=
!
data
.
context
.
selected
));
data
.
toDisposeElement
=
[];
data
.
toDisposeTemplate
=
[];
data
.
toDisposeTemplate
.
push
(
dom
.
addStandardDisposableListener
(
data
.
checkbox
,
dom
.
EventType
.
CHANGE
,
e
=>
{
data
.
context
.
selected
=
data
.
checkbox
.
checked
;
}));
dom
.
append
(
data
.
element
,
data
.
checkbox
);
...
...
@@ -62,34 +92,37 @@ class SelectedElementRenderer implements IRenderer<ISelectedElement, ISelectedEl
return
data
;
}
renderElement
(
element
:
ISelectedElement
,
index
:
number
,
data
:
ISelectedElementTemplateData
):
void
{
renderElement
(
element
:
SelectableElement
,
index
:
number
,
data
:
ISelectedElementTemplateData
):
void
{
dispose
(
data
.
toDisposeElement
);
data
.
context
=
element
;
data
.
name
.
textContent
=
element
.
label
;
data
.
element
.
title
=
data
.
name
.
textContent
;
data
.
checkbox
.
checked
=
element
.
selected
;
data
.
toDisposeElement
.
push
(
element
.
onSelected
(
selected
=>
data
.
checkbox
.
checked
=
selected
));
}
disposeTemplate
(
templateD
ata
:
ISelectedElementTemplateData
):
void
{
dispose
(
templateData
.
toDispos
e
);
disposeTemplate
(
d
ata
:
ISelectedElementTemplateData
):
void
{
dispose
(
data
.
toDisposeTemplat
e
);
}
}
class
SelectedElementDelegate
implements
IDelegate
<
ISelected
Element
>
{
class
SelectedElementDelegate
implements
IDelegate
<
Selectable
Element
>
{
getHeight
(
element
:
ISelected
Element
):
number
{
getHeight
(
element
:
Selectable
Element
):
number
{
return
22
;
}
getTemplateId
(
element
:
ISelected
Element
):
string
{
getTemplateId
(
element
:
Selectable
Element
):
string
{
return
SelectedElementRenderer
.
ID
;
}
}
export
class
QuickInputCheckboxList
{
container
:
HTMLElement
;
private
list
:
WorkbenchList
<
ISelectedElement
>
;
private
elements
:
ISelectedElement
[]
=
[];
private
container
:
HTMLElement
;
private
list
:
WorkbenchList
<
SelectableElement
>
;
private
elements
:
SelectableElement
[]
=
[];
private
disposables
:
IDisposable
[]
=
[];
constructor
(
private
parent
:
HTMLElement
,
...
...
@@ -100,11 +133,18 @@ export class QuickInputCheckboxList {
this
.
list
=
this
.
instantiationService
.
createInstance
(
WorkbenchList
,
this
.
container
,
delegate
,
[
new
SelectedElementRenderer
()],
{
identityProvider
:
element
=>
element
.
label
,
multipleSelectionSupport
:
false
})
as
WorkbenchList
<
ISelectedElement
>
;
})
as
WorkbenchList
<
SelectableElement
>
;
this
.
disposables
.
push
(
this
.
list
);
this
.
disposables
.
push
(
this
.
list
.
onKeyDown
(
e
=>
{
const
event
=
new
StandardKeyboardEvent
(
e
);
if
(
event
.
keyCode
===
KeyCode
.
Space
)
{
this
.
toggleCheckbox
();
}
}));
}
setElements
(
elements
:
IPickOpenEntry
[]):
void
{
this
.
elements
=
elements
.
map
((
item
,
index
)
=>
({
this
.
elements
=
elements
.
map
((
item
,
index
)
=>
new
SelectableElement
({
index
,
item
,
label
:
item
.
label
,
...
...
@@ -118,9 +158,8 @@ export class QuickInputCheckboxList {
.
map
(
e
=>
e
.
item
);
}
setFocus
():
void
{
this
.
list
.
focusFirst
();
this
.
list
.
domFocus
();
focus
(
what
:
'
Next
'
|
'
Previous
'
|
'
NextPage
'
|
'
PreviousPage
'
):
void
{
this
.
list
[
'
focus
'
+
what
]();
}
layout
():
void
{
...
...
@@ -176,9 +215,20 @@ export class QuickInputCheckboxList {
this
.
list
.
focusFirst
();
}
}
toggleCheckbox
()
{
const
elements
=
this
.
list
.
getFocusedElements
();
for
(
const
element
of
elements
)
{
element
.
selected
=
!
element
.
selected
;
}
}
dispose
()
{
this
.
disposables
=
dispose
(
this
.
disposables
);
}
}
function
compareEntries
(
elementA
:
ISelectedElement
,
elementB
:
ISelected
Element
,
lookFor
:
string
):
number
{
function
compareEntries
(
elementA
:
SelectableElement
,
elementB
:
Selectable
Element
,
lookFor
:
string
):
number
{
const
labelHighlightsA
=
elementA
.
labelHighlights
||
[];
const
labelHighlightsB
=
elementB
.
labelHighlights
||
[];
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录