Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
掘金者说
vscode
提交
d9bfe033
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,发现更多精彩内容 >>
提交
d9bfe033
编写于
12月 19, 2018
作者:
B
Benjamin Pasero
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
labels - visibility
上级
db535e02
变更
9
隐藏空白更改
内联
并排
Showing
9 changed file
with
137 addition
and
27 deletion
+137
-27
src/vs/workbench/browser/labels.ts
src/vs/workbench/browser/labels.ts
+43
-1
src/vs/workbench/browser/parts/views/customView.ts
src/vs/workbench/browser/parts/views/customView.ts
+11
-2
src/vs/workbench/parts/comments/electron-browser/commentsPanel.ts
...orkbench/parts/comments/electron-browser/commentsPanel.ts
+11
-4
src/vs/workbench/parts/debug/browser/loadedScriptsView.ts
src/vs/workbench/parts/debug/browser/loadedScriptsView.ts
+12
-4
src/vs/workbench/parts/files/electron-browser/views/explorerView.ts
...kbench/parts/files/electron-browser/views/explorerView.ts
+8
-0
src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts
...nch/parts/files/electron-browser/views/openEditorsView.ts
+13
-6
src/vs/workbench/parts/markers/electron-browser/markersPanel.ts
.../workbench/parts/markers/electron-browser/markersPanel.ts
+11
-2
src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts
src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts
+16
-4
src/vs/workbench/parts/search/browser/searchView.ts
src/vs/workbench/parts/search/browser/searchView.ts
+12
-4
未找到文件。
src/vs/workbench/browser/labels.ts
浏览文件 @
d9bfe033
...
...
@@ -67,6 +67,9 @@ export interface IResourceLabel extends IDisposable {
*/
setEditor
(
editor
:
IEditorInput
,
options
?:
IResourceLabelOptions
):
void
;
/**
* Resets the label to be empty.
*/
clear
():
void
;
}
...
...
@@ -103,7 +106,7 @@ export class ResourceLabels extends Disposable {
this
.
_register
(
this
.
decorationsService
.
onDidChangeDecorations
(
e
=>
this
.
_widgets
.
forEach
(
widget
=>
widget
.
notifyFileDecorationsChanges
(
e
))));
// notify when theme changes
this
.
_register
(
this
.
themeService
.
onThemeChange
(()
=>
()
=>
this
.
_widgets
.
forEach
(
widget
=>
widget
.
notifyThemeChange
())));
this
.
_register
(
this
.
themeService
.
onThemeChange
(()
=>
this
.
_widgets
.
forEach
(
widget
=>
widget
.
notifyThemeChange
())));
// notify when files.associations changes
this
.
_register
(
this
.
configurationService
.
onDidChangeConfiguration
(
e
=>
{
...
...
@@ -145,6 +148,14 @@ export class ResourceLabels extends Disposable {
dispose
(
widget
);
}
onVisible
():
void
{
this
.
_widgets
.
forEach
(
widget
=>
widget
.
notifyVisibilityChanged
(
true
));
}
onHidden
():
void
{
this
.
_widgets
.
forEach
(
widget
=>
widget
.
notifyVisibilityChanged
(
false
));
}
clear
():
void
{
this
.
_widgets
=
dispose
(
this
.
_widgets
);
this
.
_labels
=
[];
...
...
@@ -186,6 +197,11 @@ export class ResourceLabel extends ResourceLabels {
}
}
enum
Redraw
{
Basic
=
1
,
Full
=
2
}
class
ResourceLabelWidget
extends
IconLabel
{
private
_onDidRender
=
this
.
_register
(
new
Emitter
<
void
>
());
...
...
@@ -197,6 +213,9 @@ class ResourceLabelWidget extends IconLabel {
private
lastKnownConfiguredLangId
:
string
;
private
computedPathLabel
:
string
;
private
needsRedraw
:
Redraw
;
private
isHidden
:
boolean
=
false
;
constructor
(
container
:
HTMLElement
,
options
:
IIconLabelCreationOptions
,
...
...
@@ -210,6 +229,17 @@ class ResourceLabelWidget extends IconLabel {
super
(
container
,
options
);
}
notifyVisibilityChanged
(
visible
:
boolean
):
void
{
if
(
visible
===
this
.
isHidden
)
{
this
.
isHidden
=
!
visible
;
if
(
visible
&&
this
.
needsRedraw
)
{
this
.
render
(
this
.
needsRedraw
===
Redraw
.
Basic
?
false
:
true
);
this
.
needsRedraw
=
void
0
;
}
}
}
notifyModelModeChanged
(
e
:
{
model
:
ITextModel
;
oldModeId
:
string
;
}):
void
{
if
(
!
this
.
label
||
!
this
.
label
.
resource
)
{
return
;
// only update if label exists
...
...
@@ -335,6 +365,18 @@ class ResourceLabelWidget extends IconLabel {
}
private
render
(
clearIconCache
:
boolean
):
void
{
if
(
this
.
isHidden
)
{
if
(
!
this
.
needsRedraw
)
{
this
.
needsRedraw
=
clearIconCache
?
Redraw
.
Full
:
Redraw
.
Basic
;
}
if
(
this
.
needsRedraw
===
Redraw
.
Basic
&&
clearIconCache
)
{
this
.
needsRedraw
=
Redraw
.
Full
;
}
return
;
}
if
(
this
.
label
)
{
const
configuredLangId
=
getConfiguredLangId
(
this
.
modelService
,
this
.
label
.
resource
);
if
(
this
.
lastKnownConfiguredLangId
!==
configuredLangId
)
{
...
...
src/vs/workbench/browser/parts/views/customView.ts
浏览文件 @
d9bfe033
...
...
@@ -194,6 +194,7 @@ export class CustomTreeView extends Disposable implements ITreeView {
private
_messageValue
:
string
|
IMarkdownString
|
undefined
;
private
messageElement
:
HTMLDivElement
;
private
tree
:
FileIconThemableWorkbenchTree
;
private
treeLabels
:
ResourceLabels
;
private
root
:
ITreeItem
;
private
elementsToRefresh
:
ITreeItem
[]
=
[];
private
menus
:
TitleMenus
;
...
...
@@ -349,6 +350,14 @@ export class CustomTreeView extends Disposable implements ITreeView {
}
}
if
(
this
.
treeLabels
)
{
if
(
this
.
isVisible
)
{
this
.
treeLabels
.
onVisible
();
}
else
{
this
.
treeLabels
.
onHidden
();
}
}
this
.
_onDidChangeVisibility
.
fire
(
this
.
isVisible
);
}
...
...
@@ -383,9 +392,9 @@ export class CustomTreeView extends Disposable implements ITreeView {
private
createTree
()
{
const
actionItemProvider
=
(
action
:
IAction
)
=>
action
instanceof
MenuItemAction
?
this
.
instantiationService
.
createInstance
(
ContextAwareMenuItemActionItem
,
action
)
:
undefined
;
const
menus
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
TreeMenus
,
this
.
id
));
const
l
abels
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
ResourceLabels
));
this
.
treeL
abels
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
ResourceLabels
));
const
dataSource
=
this
.
instantiationService
.
createInstance
(
TreeDataSource
,
this
,
this
.
container
);
const
renderer
=
this
.
instantiationService
.
createInstance
(
TreeRenderer
,
this
.
id
,
menus
,
l
abels
,
actionItemProvider
);
const
renderer
=
this
.
instantiationService
.
createInstance
(
TreeRenderer
,
this
.
id
,
menus
,
this
.
treeL
abels
,
actionItemProvider
);
const
controller
=
this
.
instantiationService
.
createInstance
(
TreeController
,
this
.
id
,
menus
);
this
.
tree
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
FileIconThemableWorkbenchTree
,
this
.
treeContainer
,
{
dataSource
,
renderer
,
controller
},
{}));
this
.
tree
.
contextKeyService
.
createKey
<
boolean
>
(
this
.
id
,
true
);
...
...
src/vs/workbench/parts/comments/electron-browser/commentsPanel.ts
浏览文件 @
d9bfe033
...
...
@@ -29,7 +29,7 @@ export const COMMENTS_PANEL_ID = 'workbench.panel.comments';
export
const
COMMENTS_PANEL_TITLE
=
'
Comments
'
;
export
class
CommentsPanel
extends
Panel
{
private
l
abels
:
ResourceLabels
;
private
treeL
abels
:
ResourceLabels
;
private
tree
:
WorkbenchTree
;
private
treeContainer
:
HTMLElement
;
private
messageBoxContainer
:
HTMLElement
;
...
...
@@ -131,11 +131,11 @@ export class CommentsPanel extends Panel {
}
private
createTree
():
void
{
this
.
l
abels
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
ResourceLabels
));
this
.
treeL
abels
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
ResourceLabels
));
this
.
tree
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
WorkbenchTree
,
this
.
treeContainer
,
{
dataSource
:
new
CommentsDataSource
(),
renderer
:
new
CommentsModelRenderer
(
this
.
l
abels
,
this
.
openerService
),
renderer
:
new
CommentsModelRenderer
(
this
.
treeL
abels
,
this
.
openerService
),
accessibilityProvider
:
new
DefaultAccessibilityProvider
,
controller
:
new
DefaultController
(),
dnd
:
new
DefaultDragAndDrop
(),
...
...
@@ -176,7 +176,6 @@ export class CommentsPanel extends Panel {
return
true
;
}
const
threadToReveal
=
element
instanceof
ResourceWithCommentThreads
?
element
.
commentThreads
[
0
].
threadId
:
element
.
threadId
;
const
commentToReveal
=
element
instanceof
ResourceWithCommentThreads
?
element
.
commentThreads
[
0
].
comment
:
element
.
comment
;
...
...
@@ -241,6 +240,14 @@ export class CommentsPanel extends Panel {
this
.
refresh
();
}
}
if
(
this
.
treeLabels
)
{
if
(
visible
)
{
this
.
treeLabels
.
onVisible
();
}
else
{
this
.
treeLabels
.
onHidden
();
}
}
}
private
refresh
():
void
{
...
...
src/vs/workbench/parts/debug/browser/loadedScriptsView.ts
浏览文件 @
d9bfe033
...
...
@@ -364,10 +364,10 @@ export class LoadedScriptsView extends ViewletPanel {
private
treeContainer
:
HTMLElement
;
private
loadedScriptsItemType
:
IContextKey
<
string
>
;
private
tree
:
WorkbenchAsyncDataTree
<
LoadedScriptsItem
,
LoadedScriptsItem
>
;
private
treeLabels
:
ResourceLabels
;
private
changeScheduler
:
RunOnceScheduler
;
private
treeNeedsRefreshOnVisible
:
boolean
;
private
filter
:
LoadedScriptsFilter
;
private
labels
:
ResourceLabels
;
constructor
(
options
:
IViewletViewOptions
,
...
...
@@ -397,10 +397,11 @@ export class LoadedScriptsView extends ViewletPanel {
const
root
=
new
RootTreeItem
(
this
.
debugService
.
getModel
(),
this
.
environmentService
,
this
.
contextService
);
this
.
labels
=
this
.
instantiationService
.
createInstance
(
ResourceLabels
);
this
.
treeLabels
=
this
.
instantiationService
.
createInstance
(
ResourceLabels
);
this
.
disposables
.
push
(
this
.
treeLabels
);
this
.
tree
=
new
WorkbenchAsyncDataTree
(
this
.
treeContainer
,
new
LoadedScriptsDelegate
(),
[
new
LoadedScriptsRenderer
(
this
.
l
abels
)],
[
new
LoadedScriptsRenderer
(
this
.
treeL
abels
)],
new
LoadedScriptsDataSource
(),
{
identityProvider
:
{
...
...
@@ -509,6 +510,13 @@ export class LoadedScriptsView extends ViewletPanel {
if
(
visible
&&
this
.
treeNeedsRefreshOnVisible
)
{
this
.
changeScheduler
.
schedule
();
}
if
(
this
.
treeLabels
)
{
if
(
visible
)
{
this
.
treeLabels
.
onVisible
();
}
else
{
this
.
treeLabels
.
onHidden
();
}
}
}
/*
...
...
@@ -521,7 +529,7 @@ export class LoadedScriptsView extends ViewletPanel {
dispose
():
void
{
this
.
tree
=
dispose
(
this
.
tree
);
this
.
labels
=
dispose
(
this
.
l
abels
);
this
.
treeLabels
=
dispose
(
this
.
treeL
abels
);
super
.
dispose
();
}
}
...
...
src/vs/workbench/parts/files/electron-browser/views/explorerView.ts
浏览文件 @
d9bfe033
...
...
@@ -373,6 +373,14 @@ export class ExplorerView extends TreeViewsViewletPanel implements IExplorerView
this
.
openFocusedElement
();
});
}
if
(
this
.
explorerLabels
)
{
if
(
visible
)
{
this
.
explorerLabels
.
onVisible
();
}
else
{
this
.
explorerLabels
.
onHidden
();
}
}
}
private
openFocusedElement
(
preserveFocus
?:
boolean
):
void
{
...
...
src/vs/workbench/parts/files/electron-browser/views/openEditorsView.ts
浏览文件 @
d9bfe033
...
...
@@ -51,7 +51,7 @@ export class OpenEditorsView extends ViewletPanel {
private
listRefreshScheduler
:
RunOnceScheduler
;
private
structuralRefreshDelay
:
number
;
private
list
:
WorkbenchList
<
OpenEditor
|
IEditorGroup
>
;
private
labels
:
ResourceLabels
;
private
l
istL
abels
:
ResourceLabels
;
private
contributedContextMenu
:
IMenu
;
private
needsRefresh
:
boolean
;
private
resourceContext
:
ResourceContextKey
;
...
...
@@ -214,19 +214,19 @@ export class OpenEditorsView extends ViewletPanel {
if
(
this
.
list
)
{
this
.
list
.
dispose
();
}
if
(
this
.
labels
)
{
this
.
labels
.
clear
();
if
(
this
.
l
istL
abels
)
{
this
.
l
istL
abels
.
clear
();
}
this
.
labels
=
this
.
instantiationService
.
createInstance
(
ResourceLabels
);
this
.
l
istL
abels
=
this
.
instantiationService
.
createInstance
(
ResourceLabels
);
this
.
list
=
this
.
instantiationService
.
createInstance
(
WorkbenchList
,
container
,
delegate
,
[
new
EditorGroupRenderer
(
this
.
keybindingService
,
this
.
instantiationService
,
this
.
editorGroupService
),
new
OpenEditorRenderer
(
this
.
labels
,
getSelectedElements
,
this
.
instantiationService
,
this
.
keybindingService
,
this
.
configurationService
,
this
.
editorGroupService
)
new
OpenEditorRenderer
(
this
.
l
istL
abels
,
getSelectedElements
,
this
.
instantiationService
,
this
.
keybindingService
,
this
.
configurationService
,
this
.
editorGroupService
)
],
{
identityProvider
:
{
getId
:
(
element
:
OpenEditor
|
IEditorGroup
)
=>
element
instanceof
OpenEditor
?
element
.
getId
()
:
element
.
id
.
toString
()
},
selectOnMouseDown
:
false
/* disabled to better support DND */
})
as
WorkbenchList
<
OpenEditor
|
IEditorGroup
>
;
this
.
disposables
.
push
(
this
.
list
);
this
.
disposables
.
push
(
this
.
labels
);
this
.
disposables
.
push
(
this
.
l
istL
abels
);
this
.
contributedContextMenu
=
this
.
menuService
.
createMenu
(
MenuId
.
OpenEditorsContext
,
this
.
list
.
contextKeyService
);
this
.
disposables
.
push
(
this
.
contributedContextMenu
);
...
...
@@ -333,6 +333,13 @@ export class OpenEditorsView extends ViewletPanel {
dom
.
hide
(
this
.
list
.
getHTMLElement
());
// make sure the list goes out of the tabindex world by hiding it
}
}
if
(
this
.
listLabels
)
{
if
(
isVisible
)
{
this
.
listLabels
.
onVisible
();
}
else
{
this
.
listLabels
.
onHidden
();
}
}
}
private
get
showGroups
():
boolean
{
...
...
src/vs/workbench/parts/markers/electron-browser/markersPanel.ts
浏览文件 @
d9bfe033
...
...
@@ -67,6 +67,7 @@ export class MarkersPanel extends Panel implements IMarkerFilterController {
private
currentActiveResource
:
URI
|
null
=
null
;
private
tree
:
WorkbenchObjectTree
<
TreeElement
,
FilterData
>
;
private
treeLabels
:
ResourceLabels
;
private
rangeHighlightDecorations
:
RangeHighlightDecorations
;
private
actions
:
IAction
[];
...
...
@@ -171,6 +172,14 @@ export class MarkersPanel extends Panel implements IMarkerFilterController {
}
else
{
this
.
rangeHighlightDecorations
.
removeHighlightRange
();
}
if
(
this
.
treeLabels
)
{
if
(
visible
)
{
this
.
treeLabels
.
onVisible
();
}
else
{
this
.
treeLabels
.
onHidden
();
}
}
}
public
getActions
():
IAction
[]
{
...
...
@@ -288,11 +297,11 @@ export class MarkersPanel extends Panel implements IMarkerFilterController {
const
onDidChangeRenderNodeCount
=
new
Relay
<
ITreeNode
<
any
,
any
>>
();
const
l
abels
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
ResourceLabels
));
this
.
treeL
abels
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
ResourceLabels
));
const
virtualDelegate
=
new
VirtualDelegate
(
this
.
markersViewState
);
const
renderers
=
[
this
.
instantiationService
.
createInstance
(
ResourceMarkersRenderer
,
l
abels
,
onDidChangeRenderNodeCount
.
event
),
this
.
instantiationService
.
createInstance
(
ResourceMarkersRenderer
,
this
.
treeL
abels
,
onDidChangeRenderNodeCount
.
event
),
this
.
instantiationService
.
createInstance
(
MarkerRenderer
,
this
.
markersViewState
,
a
=>
this
.
getActionItem
(
a
)),
this
.
instantiationService
.
createInstance
(
RelatedInformationRenderer
)
];
...
...
src/vs/workbench/parts/scm/electron-browser/scmViewlet.ts
浏览文件 @
d9bfe033
...
...
@@ -728,7 +728,7 @@ export class RepositoryPanel extends ViewletPanel {
private
inputBox
:
InputBox
;
private
listContainer
:
HTMLElement
;
private
list
:
List
<
ISCMResourceGroup
|
ISCMResource
>
;
private
labels
:
ResourceLabels
;
private
l
istL
abels
:
ResourceLabels
;
private
menus
:
SCMMenus
;
private
visibilityDisposables
:
IDisposable
[]
=
[];
protected
contextKeyService
:
IContextKeyService
;
...
...
@@ -870,12 +870,12 @@ export class RepositoryPanel extends ViewletPanel {
const
actionItemProvider
=
(
action
:
IAction
)
=>
this
.
getActionItem
(
action
);
this
.
labels
=
this
.
instantiationService
.
createInstance
(
ResourceLabels
);
this
.
disposables
.
push
(
this
.
labels
);
this
.
l
istL
abels
=
this
.
instantiationService
.
createInstance
(
ResourceLabels
);
this
.
disposables
.
push
(
this
.
l
istL
abels
);
const
renderers
=
[
new
ResourceGroupRenderer
(
actionItemProvider
,
this
.
themeService
,
this
.
menus
),
new
ResourceRenderer
(
this
.
labels
,
actionItemProvider
,
()
=>
this
.
getSelectedResources
(),
this
.
themeService
,
this
.
menus
)
new
ResourceRenderer
(
this
.
l
istL
abels
,
actionItemProvider
,
()
=>
this
.
getSelectedResources
(),
this
.
themeService
,
this
.
menus
)
];
this
.
list
=
this
.
instantiationService
.
createInstance
(
WorkbenchList
,
this
.
listContainer
,
delegate
,
renderers
,
{
...
...
@@ -911,6 +911,18 @@ export class RepositoryPanel extends ViewletPanel {
this
.
inputBox
.
setEnabled
(
this
.
isVisible
()
&&
this
.
isExpanded
());
}
setVisible
(
visible
:
boolean
):
void
{
super
.
setVisible
(
visible
);
if
(
this
.
listLabels
)
{
if
(
visible
)
{
this
.
listLabels
.
onVisible
();
}
else
{
this
.
listLabels
.
onHidden
();
}
}
}
setExpanded
(
expanded
:
boolean
):
void
{
super
.
setExpanded
(
expanded
);
this
.
inputBox
.
setEnabled
(
this
.
isVisible
()
&&
this
.
isExpanded
());
...
...
src/vs/workbench/parts/search/browser/searchView.ts
浏览文件 @
d9bfe033
...
...
@@ -137,7 +137,7 @@ export class SearchView extends Viewlet implements IViewlet, IPanel {
private
contextMenu
:
IMenu
;
private
tree
:
WorkbenchObjectTree
<
RenderableMatch
>
;
private
l
abels
:
ResourceLabels
;
private
treeL
abels
:
ResourceLabels
;
private
viewletState
:
object
;
private
globalMemento
:
object
;
private
messagesElement
:
HTMLElement
;
...
...
@@ -586,13 +586,13 @@ export class SearchView extends Viewlet implements IViewlet, IPanel {
}
};
this
.
l
abels
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
ResourceLabels
));
this
.
treeL
abels
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
ResourceLabels
));
this
.
tree
=
this
.
_register
(
<
WorkbenchObjectTree
<
RenderableMatch
,
any
>>
this
.
instantiationService
.
createInstance
(
WorkbenchObjectTree
,
this
.
resultsElement
,
delegate
,
[
this
.
_register
(
this
.
instantiationService
.
createInstance
(
FolderMatchRenderer
,
this
.
viewModel
,
this
,
this
.
l
abels
)),
this
.
_register
(
this
.
instantiationService
.
createInstance
(
FileMatchRenderer
,
this
.
viewModel
,
this
,
this
.
l
abels
)),
this
.
_register
(
this
.
instantiationService
.
createInstance
(
FolderMatchRenderer
,
this
.
viewModel
,
this
,
this
.
treeL
abels
)),
this
.
_register
(
this
.
instantiationService
.
createInstance
(
FileMatchRenderer
,
this
.
viewModel
,
this
,
this
.
treeL
abels
)),
this
.
_register
(
this
.
instantiationService
.
createInstance
(
MatchRenderer
,
this
.
viewModel
,
this
)),
],
{
...
...
@@ -769,6 +769,14 @@ export class SearchView extends Viewlet implements IViewlet, IPanel {
this
.
onFocus
(
focus
,
true
);
}
}
if
(
this
.
treeLabels
)
{
if
(
visible
)
{
this
.
treeLabels
.
onVisible
();
}
else
{
this
.
treeLabels
.
onHidden
();
}
}
}
public
moveFocusToResults
():
void
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录