Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xxadev
vscode
提交
600995bb
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,发现更多精彩内容 >>
未验证
提交
600995bb
编写于
4月 20, 2020
作者:
S
Sandeep Somavarapu
提交者:
GitHub
4月 20, 2020
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #95721 from microsoft/sandy081/viewsModel
Unify view descriptor and view model into IViewContainerModel
上级
9e1acba7
116a3de4
变更
30
展开全部
隐藏空白更改
内联
并排
Showing
30 changed file
with
1434 addition
and
738 deletion
+1434
-738
src/vs/workbench/api/browser/mainThreadComments.ts
src/vs/workbench/api/browser/mainThreadComments.ts
+2
-1
src/vs/workbench/api/browser/viewsExtensionPoint.ts
src/vs/workbench/api/browser/viewsExtensionPoint.ts
+1
-1
src/vs/workbench/browser/actions/layoutActions.ts
src/vs/workbench/browser/actions/layoutActions.ts
+3
-3
src/vs/workbench/browser/parts/activitybar/activitybarPart.ts
...vs/workbench/browser/parts/activitybar/activitybarPart.ts
+19
-17
src/vs/workbench/browser/parts/compositeBar.ts
src/vs/workbench/browser/parts/compositeBar.ts
+2
-2
src/vs/workbench/browser/parts/compositeBarActions.ts
src/vs/workbench/browser/parts/compositeBarActions.ts
+2
-5
src/vs/workbench/browser/parts/panel/panelActions.ts
src/vs/workbench/browser/parts/panel/panelActions.ts
+4
-0
src/vs/workbench/browser/parts/panel/panelPart.ts
src/vs/workbench/browser/parts/panel/panelPart.ts
+45
-41
src/vs/workbench/browser/parts/views/viewPaneContainer.ts
src/vs/workbench/browser/parts/views/viewPaneContainer.ts
+27
-31
src/vs/workbench/browser/parts/views/views.ts
src/vs/workbench/browser/parts/views/views.ts
+7
-491
src/vs/workbench/browser/parts/views/viewsViewlet.ts
src/vs/workbench/browser/parts/views/viewsViewlet.ts
+10
-11
src/vs/workbench/common/views.ts
src/vs/workbench/common/views.ts
+40
-6
src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts
...rkbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts
+3
-2
src/vs/workbench/contrib/debug/browser/debug.contribution.ts
src/vs/workbench/contrib/debug/browser/debug.contribution.ts
+2
-1
src/vs/workbench/contrib/debug/browser/debugViewlet.ts
src/vs/workbench/contrib/debug/browser/debugViewlet.ts
+1
-1
src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts
...workbench/contrib/extensions/browser/extensionsViewlet.ts
+2
-3
src/vs/workbench/contrib/files/browser/explorerViewlet.ts
src/vs/workbench/contrib/files/browser/explorerViewlet.ts
+2
-3
src/vs/workbench/contrib/markers/browser/markers.contribution.ts
...workbench/contrib/markers/browser/markers.contribution.ts
+2
-1
src/vs/workbench/contrib/output/browser/output.contribution.ts
...s/workbench/contrib/output/browser/output.contribution.ts
+2
-1
src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts
.../workbench/contrib/quickaccess/browser/viewQuickAccess.ts
+3
-3
src/vs/workbench/contrib/remote/browser/remote.ts
src/vs/workbench/contrib/remote/browser/remote.ts
+1
-2
src/vs/workbench/contrib/scm/browser/scm.contribution.ts
src/vs/workbench/contrib/scm/browser/scm.contribution.ts
+1
-0
src/vs/workbench/contrib/scm/browser/scmViewlet.ts
src/vs/workbench/contrib/scm/browser/scmViewlet.ts
+12
-15
src/vs/workbench/contrib/search/browser/search.contribution.ts
...s/workbench/contrib/search/browser/search.contribution.ts
+1
-1
src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts
...rkbench/contrib/terminal/browser/terminal.contribution.ts
+2
-1
src/vs/workbench/contrib/terminal/browser/terminalService.ts
src/vs/workbench/contrib/terminal/browser/terminalService.ts
+1
-1
src/vs/workbench/contrib/userDataSync/browser/userDataSyncView.ts
...orkbench/contrib/userDataSync/browser/userDataSyncView.ts
+1
-1
src/vs/workbench/services/views/browser/viewDescriptorService.ts
...workbench/services/views/browser/viewDescriptorService.ts
+583
-93
src/vs/workbench/services/views/test/browser/viewDescriptorService.test.ts
...services/views/test/browser/viewDescriptorService.test.ts
+268
-0
src/vs/workbench/services/views/test/browser/viewsModel.test.ts
.../workbench/services/views/test/browser/viewsModel.test.ts
+385
-0
未找到文件。
src/vs/workbench/api/browser/mainThreadComments.ts
浏览文件 @
600995bb
...
...
@@ -451,7 +451,8 @@ export class MainThreadComments extends Disposable implements MainThreadComments
const
VIEW_CONTAINER
:
ViewContainer
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewExtensions
.
ViewContainersRegistry
).
registerViewContainer
({
id
:
COMMENTS_VIEW_ID
,
name
:
COMMENTS_VIEW_TITLE
,
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
COMMENTS_VIEW_ID
,
COMMENTS_VIEW_TITLE
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
COMMENTS_VIEW_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
storageId
:
COMMENTS_VIEW_TITLE
,
hideIfEmpty
:
true
,
order
:
10
,
},
ViewContainerLocation
.
Panel
);
...
...
src/vs/workbench/api/browser/viewsExtensionPoint.ts
浏览文件 @
600995bb
...
...
@@ -320,7 +320,7 @@ class ViewsExtensionHandler implements IWorkbenchContribution {
name
:
title
,
extensionId
,
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
id
,
`
${
id
}
.state`
,
{
mergeViewWithContainerWhenSingleView
:
true
}]
[
id
,
{
mergeViewWithContainerWhenSingleView
:
true
}]
),
hideIfEmpty
:
true
,
order
,
...
...
src/vs/workbench/browser/actions/layoutActions.ts
浏览文件 @
600995bb
...
...
@@ -488,9 +488,9 @@ export class ResetViewLocationsAction extends Action {
async
run
():
Promise
<
void
>
{
const
viewContainerRegistry
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewContainerExtensions
.
ViewContainersRegistry
);
viewContainerRegistry
.
all
.
forEach
(
viewContainer
=>
{
const
view
Descriptors
=
this
.
viewDescriptorService
.
getViewDescriptors
(
viewContainer
);
const
view
ContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
viewContainer
);
view
Descriptors
.
allViewDescriptors
.
forEach
(
viewDescriptor
=>
{
view
ContainerModel
.
allViewDescriptors
.
forEach
(
viewDescriptor
=>
{
const
defaultContainer
=
this
.
viewDescriptorService
.
getDefaultContainer
(
viewDescriptor
.
id
);
const
currentContainer
=
this
.
viewDescriptorService
.
getViewContainer
(
viewDescriptor
.
id
);
...
...
@@ -583,7 +583,7 @@ export class MoveFocusedViewAction extends Action {
const
currentContainer
=
this
.
viewDescriptorService
.
getViewContainer
(
focusedViewId
)
!
;
const
currentLocation
=
this
.
viewDescriptorService
.
getViewLocation
(
focusedViewId
)
!
;
const
isViewSolo
=
this
.
viewDescriptorService
.
getView
Descriptors
(
currentContainer
).
allViewDescriptors
.
length
===
1
;
const
isViewSolo
=
this
.
viewDescriptorService
.
getView
ContainerModel
(
currentContainer
).
allViewDescriptors
.
length
===
1
;
if
(
!
(
isViewSolo
&&
currentLocation
===
ViewContainerLocation
.
Sidebar
))
{
items
.
push
({
...
...
src/vs/workbench/browser/parts/activitybar/activitybarPart.ts
浏览文件 @
600995bb
...
...
@@ -26,7 +26,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten
import
{
URI
,
UriComponents
}
from
'
vs/base/common/uri
'
;
import
{
ToggleCompositePinnedAction
,
ICompositeBarColors
,
ActivityAction
,
ICompositeActivity
}
from
'
vs/workbench/browser/parts/compositeBarActions
'
;
import
{
ViewletDescriptor
}
from
'
vs/workbench/browser/viewlet
'
;
import
{
IViewDescriptorService
,
IViewContainersRegistry
,
Extensions
as
ViewContainerExtensions
,
ViewContainer
,
TEST_VIEW_CONTAINER_ID
,
IView
DescriptorCollection
,
ViewContainerLocation
}
from
'
vs/workbench/common/views
'
;
import
{
IViewDescriptorService
,
IViewContainersRegistry
,
Extensions
as
ViewContainerExtensions
,
ViewContainer
,
TEST_VIEW_CONTAINER_ID
,
IView
ContainerModel
,
ViewContainerLocation
}
from
'
vs/workbench/common/views
'
;
import
{
IContextKeyService
,
ContextKeyExpr
}
from
'
vs/platform/contextkey/common/contextkey
'
;
import
{
IViewlet
}
from
'
vs/workbench/common/viewlet
'
;
import
{
isUndefinedOrNull
,
assertIsDefined
,
isString
}
from
'
vs/base/common/types
'
;
...
...
@@ -216,8 +216,8 @@ export class ActivitybarPart extends Part implements IActivityBarService {
if
(
viewletDescriptor
)
{
const
viewContainer
=
this
.
getViewContainer
(
viewletDescriptor
.
id
);
if
(
viewContainer
?.
hideIfEmpty
)
{
const
view
Descriptors
=
this
.
viewDescriptorService
.
getViewDescriptors
(
viewContainer
);
if
(
view
Descriptors
.
activeViewDescriptors
.
length
===
0
)
{
const
view
ContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
viewContainer
);
if
(
view
ContainerModel
.
activeViewDescriptors
.
length
===
0
)
{
this
.
hideComposite
(
viewletDescriptor
.
id
);
// Update the composite bar by hiding
}
}
...
...
@@ -478,9 +478,14 @@ export class ActivitybarPart extends Part implements IActivityBarService {
for
(
const
viewlet
of
viewlets
)
{
this
.
enableCompositeActions
(
viewlet
);
const
viewContainer
=
this
.
getViewContainer
(
viewlet
.
id
)
!
;
const
viewDescriptors
=
this
.
viewDescriptorService
.
getViewDescriptors
(
viewContainer
);
this
.
onDidChangeActiveViews
(
viewlet
,
viewDescriptors
,
viewContainer
.
hideIfEmpty
);
this
.
viewletDisposables
.
set
(
viewlet
.
id
,
viewDescriptors
.
onDidChangeActiveViews
(()
=>
this
.
onDidChangeActiveViews
(
viewlet
,
viewDescriptors
,
viewContainer
.
hideIfEmpty
)));
const
viewContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
viewContainer
);
this
.
onDidChangeActiveViews
(
viewlet
,
viewContainerModel
,
viewContainer
.
hideIfEmpty
);
const
disposables
=
new
DisposableStore
();
disposables
.
add
(
viewContainerModel
.
onDidChangeActiveViewDescriptors
(()
=>
this
.
onDidChangeActiveViews
(
viewlet
,
viewContainerModel
,
viewContainer
.
hideIfEmpty
)));
disposables
.
add
(
viewContainerModel
.
onDidChangeContainerInfo
(()
=>
this
.
updateActivity
(
viewlet
,
viewContainerModel
)));
this
.
viewletDisposables
.
set
(
viewlet
.
id
,
disposables
);
}
}
...
...
@@ -494,17 +499,14 @@ export class ActivitybarPart extends Part implements IActivityBarService {
this
.
hideComposite
(
viewletId
);
}
private
updateActivity
(
viewlet
:
ViewletDescriptor
,
viewDescriptors
:
IViewDescriptorCollection
):
void
{
const
viewDescriptor
=
viewDescriptors
.
activeViewDescriptors
[
0
];
// Use the viewlet icon if any view inside belongs to it statically
const
shouldUseViewletIcon
=
viewDescriptors
.
allViewDescriptors
.
some
(
v
=>
this
.
viewDescriptorService
.
getDefaultContainer
(
v
.
id
)?.
id
===
viewlet
.
id
);
private
updateActivity
(
viewlet
:
ViewletDescriptor
,
viewContainerModel
:
IViewContainerModel
):
void
{
const
icon
=
viewContainerModel
.
icon
;
const
activity
:
IActivity
=
{
id
:
viewlet
.
id
,
name
:
shouldUseViewletIcon
?
viewlet
.
name
:
viewDescriptor
.
nam
e
,
cssClass
:
shouldUseViewletIcon
?
viewlet
.
cssClass
:
(
isString
(
viewDescriptor
.
containerIcon
)
?
viewDescriptor
.
containerIcon
:
(
viewDescriptor
.
containerIcon
===
undefined
?
'
codicon-window
'
:
undefined
))
,
iconUrl
:
shouldUseViewletIcon
?
viewlet
.
iconUrl
:
(
viewDescriptor
.
containerIcon
instanceof
URI
?
viewDescriptor
.
containerIcon
:
undefined
)
,
name
:
viewContainerModel
.
titl
e
,
cssClass
:
isString
(
icon
)
?
icon
:
undefined
,
iconUrl
:
icon
instanceof
URI
?
icon
:
undefined
,
keybindingId
:
viewlet
.
keybindingId
};
...
...
@@ -516,7 +518,7 @@ export class ActivitybarPart extends Part implements IActivityBarService {
}
}
private
onDidChangeActiveViews
(
viewlet
:
ViewletDescriptor
,
viewDescriptors
:
IView
DescriptorCollection
,
hideIfEmpty
?:
boolean
):
void
{
private
onDidChangeActiveViews
(
viewlet
:
ViewletDescriptor
,
viewDescriptors
:
IView
ContainerModel
,
hideIfEmpty
?:
boolean
):
void
{
if
(
viewDescriptors
.
activeViewDescriptors
.
length
)
{
this
.
updateActivity
(
viewlet
,
viewDescriptors
);
this
.
compositeBar
.
addComposite
(
viewlet
);
...
...
@@ -644,8 +646,8 @@ export class ActivitybarPart extends Part implements IActivityBarService {
if
(
viewlet
)
{
const
views
:
{
when
:
string
|
undefined
}[]
=
[];
if
(
viewContainer
)
{
const
view
Descriptors
=
this
.
viewDescriptorService
.
getViewDescriptors
(
viewContainer
);
for
(
const
{
when
}
of
view
Descriptors
.
allViewDescriptors
)
{
const
view
ContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
viewContainer
);
for
(
const
{
when
}
of
view
ContainerModel
.
allViewDescriptors
)
{
views
.
push
({
when
:
when
?
when
.
serialize
()
:
undefined
});
}
}
...
...
src/vs/workbench/browser/parts/compositeBar.ts
浏览文件 @
600995bb
...
...
@@ -56,7 +56,7 @@ export class CompositeDragAndDrop implements ICompositeDragAndDrop {
}
// ... on a different composite bar
else
{
const
viewsToMove
=
this
.
viewDescriptorService
.
getView
Descriptors
(
currentContainer
)
!
.
allViewDescriptors
;
const
viewsToMove
=
this
.
viewDescriptorService
.
getView
ContainerModel
(
currentContainer
)
!
.
allViewDescriptors
;
if
(
viewsToMove
.
some
(
v
=>
!
v
.
canMoveView
))
{
return
;
}
...
...
@@ -119,7 +119,7 @@ export class CompositeDragAndDrop implements ICompositeDragAndDrop {
}
// ... to another composite location
const
draggedViews
=
this
.
viewDescriptorService
.
getView
Descriptors
(
currentContainer
)
!
.
allViewDescriptors
;
const
draggedViews
=
this
.
viewDescriptorService
.
getView
ContainerModel
(
currentContainer
)
!
.
allViewDescriptors
;
// ... all views must be movable
return
!
draggedViews
.
some
(
v
=>
!
v
.
canMoveView
);
...
...
src/vs/workbench/browser/parts/compositeBarActions.ts
浏览文件 @
600995bb
...
...
@@ -161,9 +161,11 @@ export class ActivityActionViewItem extends BaseActionViewItem {
if
(
this
.
activity
.
iconUrl
)
{
// Apply background color to activity bar item provided with iconUrls
this
.
label
.
style
.
backgroundColor
=
foreground
?
foreground
.
toString
()
:
''
;
this
.
label
.
style
.
color
=
''
;
}
else
{
// Apply foreground color to activity bar items provided with codicons
this
.
label
.
style
.
color
=
foreground
?
foreground
.
toString
()
:
''
;
this
.
label
.
style
.
backgroundColor
=
''
;
}
const
dragColor
=
colors
.
activeBackgroundColor
||
colors
.
activeForegroundColor
;
...
...
@@ -691,9 +693,4 @@ export class ToggleCompositePinnedAction extends Action {
this
.
compositeBar
.
pin
(
id
);
}
}
setActivity
(
activity
:
IActivity
):
void
{
this
.
activity
=
activity
;
this
.
label
=
activity
.
name
;
}
}
src/vs/workbench/browser/parts/panel/panelActions.ts
浏览文件 @
600995bb
...
...
@@ -200,6 +200,10 @@ export class PlaceHolderToggleCompositePinnedAction extends ToggleCompositePinne
constructor
(
id
:
string
,
compositeBar
:
ICompositeBar
)
{
super
({
id
,
name
:
id
,
cssClass
:
undefined
},
compositeBar
);
}
setActivity
(
activity
:
IActivity
):
void
{
this
.
label
=
activity
.
name
;
}
}
...
...
src/vs/workbench/browser/parts/panel/panelPart.ts
浏览文件 @
600995bb
...
...
@@ -33,12 +33,13 @@ import { IContextKey, IContextKeyService, ContextKeyExpr } from 'vs/platform/con
import
{
isUndefinedOrNull
,
assertIsDefined
}
from
'
vs/base/common/types
'
;
import
{
registerSingleton
}
from
'
vs/platform/instantiation/common/extensions
'
;
import
{
IExtensionService
}
from
'
vs/workbench/services/extensions/common/extensions
'
;
import
{
ViewContainer
,
IViewContainersRegistry
,
Extensions
as
ViewContainerExtensions
,
IViewDescriptorService
,
IView
DescriptorCollection
,
ViewContainerLocation
}
from
'
vs/workbench/common/views
'
;
import
{
ViewContainer
,
IViewContainersRegistry
,
Extensions
as
ViewContainerExtensions
,
IViewDescriptorService
,
IView
ContainerModel
,
ViewContainerLocation
}
from
'
vs/workbench/common/views
'
;
import
{
MenuId
}
from
'
vs/platform/actions/common/actions
'
;
import
{
ViewMenuActions
}
from
'
vs/workbench/browser/parts/views/viewMenuActions
'
;
import
{
IPaneComposite
}
from
'
vs/workbench/common/panecomposite
'
;
import
{
IStorageKeysSyncRegistryService
}
from
'
vs/platform/userDataSync/common/storageKeys
'
;
import
{
Before2D
}
from
'
vs/workbench/browser/dnd
'
;
import
{
IActivity
}
from
'
vs/workbench/common/activity
'
;
interface
ICachedPanel
{
id
:
string
;
...
...
@@ -177,9 +178,9 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
const
result
:
IAction
[]
=
[];
const
container
=
this
.
getViewContainer
(
compositeId
);
if
(
container
)
{
const
view
Descriptors
=
this
.
viewDescriptorService
.
getViewDescriptors
(
container
);
if
(
view
Descriptors
.
allViewDescriptors
.
length
===
1
)
{
const
viewMenuActions
=
this
.
instantiationService
.
createInstance
(
ViewMenuActions
,
view
Descriptors
.
allViewDescriptors
[
0
].
id
,
MenuId
.
ViewTitle
,
MenuId
.
ViewTitleContext
);
const
view
ContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
container
);
if
(
view
ContainerModel
.
allViewDescriptors
.
length
===
1
)
{
const
viewMenuActions
=
this
.
instantiationService
.
createInstance
(
ViewMenuActions
,
view
ContainerModel
.
allViewDescriptors
[
0
].
id
,
MenuId
.
ViewTitle
,
MenuId
.
ViewTitleContext
);
result
.
push
(...
viewMenuActions
.
getContextMenuActions
());
viewMenuActions
.
dispose
();
}
...
...
@@ -209,12 +210,16 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
for
(
const
panel
of
panels
)
{
this
.
enableCompositeActions
(
panel
);
const
viewContainer
=
this
.
getViewContainer
(
panel
.
id
);
if
(
viewContainer
?.
hideIfEmpty
)
{
const
viewDescriptors
=
this
.
viewDescriptorService
.
getViewDescriptors
(
viewContainer
);
this
.
onDidChangeActiveViews
(
panel
,
viewDescriptors
);
this
.
panelDisposables
.
set
(
panel
.
id
,
viewDescriptors
.
onDidChangeActiveViews
(()
=>
this
.
onDidChangeActiveViews
(
panel
,
viewDescriptors
)));
}
const
viewContainer
=
this
.
getViewContainer
(
panel
.
id
)
!
;
const
viewContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
viewContainer
);
this
.
onDidChangeActiveViews
(
panel
,
viewContainerModel
,
viewContainer
.
hideIfEmpty
);
const
disposables
=
new
DisposableStore
();
disposables
.
add
(
viewContainerModel
.
onDidChangeActiveViewDescriptors
(()
=>
this
.
onDidChangeActiveViews
(
panel
,
viewContainerModel
,
viewContainer
.
hideIfEmpty
)));
disposables
.
add
(
viewContainerModel
.
onDidChangeAllViewDescriptors
(()
=>
this
.
onDidUpdateViews
(
panel
,
viewContainerModel
)));
disposables
.
add
(
viewContainerModel
.
onDidMoveVisibleViewDescriptors
(()
=>
this
.
onDidUpdateViews
(
panel
,
viewContainerModel
)));
this
.
panelDisposables
.
set
(
panel
.
id
,
disposables
);
}
}
...
...
@@ -230,19 +235,37 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
private
enableCompositeActions
(
panel
:
PanelDescriptor
):
void
{
const
{
activityAction
,
pinnedAction
}
=
this
.
getCompositeActions
(
panel
.
id
);
if
(
activityAction
instanceof
PlaceHolderPanelActivityAction
)
{
activityAction
.
setActivity
(
panel
);
}
activityAction
.
setActivity
(
panel
);
if
(
pinnedAction
instanceof
PlaceHolderToggleCompositePinnedAction
)
{
pinnedAction
.
setActivity
(
panel
);
}
}
private
onDidChangeActiveViews
(
panel
:
PanelDescriptor
,
viewDescriptors
:
IViewDescriptorCollection
):
void
{
private
updateActivity
(
panel
:
PanelDescriptor
,
viewContainerModel
:
IViewContainerModel
):
void
{
const
activity
:
IActivity
=
{
id
:
panel
.
id
,
name
:
viewContainerModel
.
title
,
keybindingId
:
panel
.
keybindingId
};
const
{
activityAction
,
pinnedAction
}
=
this
.
getCompositeActions
(
panel
.
id
);
activityAction
.
setActivity
(
activity
);
if
(
pinnedAction
instanceof
PlaceHolderToggleCompositePinnedAction
)
{
pinnedAction
.
setActivity
(
activity
);
}
}
private
onDidUpdateViews
(
panel
:
PanelDescriptor
,
viewDescriptors
:
IViewContainerModel
):
void
{
this
.
updateActivity
(
panel
,
viewDescriptors
);
}
private
onDidChangeActiveViews
(
panel
:
PanelDescriptor
,
viewDescriptors
:
IViewContainerModel
,
hideIfEmpty
?:
boolean
):
void
{
if
(
viewDescriptors
.
activeViewDescriptors
.
length
)
{
this
.
updateActivity
(
panel
,
viewDescriptors
);
this
.
compositeBar
.
addComposite
(
panel
);
}
else
{
}
else
if
(
hideIfEmpty
)
{
this
.
hideComposite
(
panel
.
id
);
}
}
...
...
@@ -320,8 +343,8 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
if
(
panelDescriptor
)
{
const
viewContainer
=
this
.
getViewContainer
(
panelDescriptor
.
id
);
if
(
viewContainer
?.
hideIfEmpty
)
{
const
view
Descriptors
=
this
.
viewDescriptorService
.
getViewDescriptors
(
viewContainer
);
if
(
view
Descriptors
.
activeViewDescriptors
.
length
===
0
&&
this
.
compositeBar
.
getPinnedComposites
().
length
>
1
)
{
const
view
ContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
viewContainer
);
if
(
view
ContainerModel
.
activeViewDescriptors
.
length
===
0
&&
this
.
compositeBar
.
getPinnedComposites
().
length
>
1
)
{
this
.
hideComposite
(
panelDescriptor
.
id
);
// Update the composite bar by hiding
}
}
...
...
@@ -540,28 +563,6 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
return
false
;
}
protected
onTitleAreaUpdate
(
compositeId
:
string
):
void
{
super
.
onTitleAreaUpdate
(
compositeId
);
const
activePanel
=
this
.
getActivePanel
();
const
panel
=
this
.
createComposite
(
compositeId
,
activePanel
?.
getId
()
===
compositeId
);
if
(
panel
)
{
const
compositeActions
=
this
.
compositeActions
.
get
(
compositeId
);
if
(
compositeActions
)
{
compositeActions
.
activityAction
.
setActivity
({
id
:
compositeActions
.
activityAction
.
id
,
name
:
panel
.
getTitle
()
||
compositeActions
.
activityAction
.
label
});
compositeActions
.
pinnedAction
.
setActivity
({
id
:
compositeActions
.
activityAction
.
id
,
name
:
panel
.
getTitle
()
||
compositeActions
.
activityAction
.
label
});
}
}
}
private
getToolbarWidth
():
number
{
const
activePanel
=
this
.
getActivePanel
();
if
(
!
activePanel
||
!
this
.
toolBar
)
{
...
...
@@ -609,8 +610,11 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
const
compositeItems
=
this
.
compositeBar
.
getCompositeBarItems
();
for
(
const
compositeItem
of
compositeItems
)
{
const
activityAction
=
this
.
getCompositeActions
(
compositeItem
.
id
).
activityAction
;
state
.
push
({
id
:
compositeItem
.
id
,
name
:
activityAction
.
label
,
pinned
:
compositeItem
.
pinned
,
order
:
compositeItem
.
order
,
visible
:
compositeItem
.
visible
});
const
viewContainer
=
this
.
getViewContainer
(
compositeItem
.
id
);
if
(
viewContainer
)
{
const
viewContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
viewContainer
);
state
.
push
({
id
:
compositeItem
.
id
,
name
:
viewContainerModel
.
title
,
pinned
:
compositeItem
.
pinned
,
order
:
compositeItem
.
order
,
visible
:
compositeItem
.
visible
});
}
}
this
.
cachedPanelsValue
=
JSON
.
stringify
(
state
);
...
...
src/vs/workbench/browser/parts/views/viewPaneContainer.ts
浏览文件 @
600995bb
...
...
@@ -24,11 +24,10 @@ import { PaneView, IPaneViewOptions, IPaneOptions, Pane } from 'vs/base/browser/
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
IWorkbenchLayoutService
,
Position
}
from
'
vs/workbench/services/layout/browser/layoutService
'
;
import
{
StandardMouseEvent
}
from
'
vs/base/browser/mouseEvent
'
;
import
{
Extensions
as
ViewContainerExtensions
,
IView
,
FocusedViewContext
,
IViewContainersRegistry
,
IViewDescriptor
,
ViewContainer
,
IViewDescriptorService
,
ViewContainerLocation
,
IViewPaneContainer
,
IViewsRegistry
,
IViewContentDescriptor
}
from
'
vs/workbench/common/views
'
;
import
{
Extensions
as
ViewContainerExtensions
,
IView
,
FocusedViewContext
,
IViewContainersRegistry
,
IViewDescriptor
,
ViewContainer
,
IViewDescriptorService
,
ViewContainerLocation
,
IViewPaneContainer
,
IViewsRegistry
,
IViewContentDescriptor
,
IAddedViewDescriptorRef
,
IViewDescriptorRef
,
IViewContainerModel
}
from
'
vs/workbench/common/views
'
;
import
{
IStorageService
,
StorageScope
}
from
'
vs/platform/storage/common/storage
'
;
import
{
IContextKey
,
IContextKeyService
}
from
'
vs/platform/contextkey/common/contextkey
'
;
import
{
assertIsDefined
}
from
'
vs/base/common/types
'
;
import
{
PersistentContributableViewsModel
,
IAddedViewDescriptorRef
,
IViewDescriptorRef
}
from
'
vs/workbench/browser/parts/views/views
'
;
import
{
IInstantiationService
}
from
'
vs/platform/instantiation/common/instantiation
'
;
import
{
IViewletViewOptions
}
from
'
vs/workbench/browser/parts/views/viewsViewlet
'
;
import
{
IExtensionService
}
from
'
vs/workbench/services/extensions/common/extensions
'
;
...
...
@@ -746,7 +745,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
private
readonly
visibleViewsCountFromCache
:
number
|
undefined
;
private
readonly
visibleViewsStorageId
:
string
;
protected
readonly
view
sModel
:
PersistentContributableViews
Model
;
protected
readonly
view
ContainerModel
:
IViewContainer
Model
;
private
viewDisposables
:
IDisposable
[]
=
[];
private
readonly
_onTitleAreaUpdate
:
Emitter
<
void
>
=
this
.
_register
(
new
Emitter
<
void
>
());
...
...
@@ -782,7 +781,6 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
constructor
(
id
:
string
,
viewPaneContainerStateStorageId
:
string
,
private
options
:
IViewPaneContainerOptions
,
@
IInstantiationService
protected
instantiationService
:
IInstantiationService
,
@
IConfigurationService
protected
configurationService
:
IConfigurationService
,
...
...
@@ -808,7 +806,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
this
.
visibleViewsStorageId
=
`
${
id
}
.numberOfVisibleViews`
;
this
.
visibleViewsCountFromCache
=
this
.
storageService
.
getNumber
(
this
.
visibleViewsStorageId
,
StorageScope
.
WORKSPACE
,
undefined
);
this
.
_register
(
toDisposable
(()
=>
this
.
viewDisposables
=
dispose
(
this
.
viewDisposables
)));
this
.
view
sModel
=
this
.
_register
(
this
.
instantiationService
.
createInstance
(
PersistentContributableViewsModel
,
container
,
viewPaneContainerStateStorageId
)
);
this
.
view
ContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
container
);
}
create
(
parent
:
HTMLElement
):
void
{
...
...
@@ -839,7 +837,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
const
viewContainerRegistry
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewContainerExtensions
.
ViewContainersRegistry
);
const
container
=
viewContainerRegistry
.
get
(
dropData
.
id
)
!
;
const
viewsToMove
=
this
.
viewDescriptorService
.
getView
Descriptors
(
container
).
allViewDescriptors
;
const
viewsToMove
=
this
.
viewDescriptorService
.
getView
ContainerModel
(
container
).
allViewDescriptors
;
if
(
!
viewsToMove
.
some
(
v
=>
!
v
.
canMoveView
))
{
overlay
=
new
ViewPaneDropOverlay
(
parent
,
undefined
,
this
.
themeService
);
...
...
@@ -861,7 +859,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
const
viewContainerRegistry
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewContainerExtensions
.
ViewContainersRegistry
);
const
container
=
viewContainerRegistry
.
get
(
dropData
.
id
)
!
;
const
allViews
=
this
.
viewDescriptorService
.
getView
Descriptors
(
container
).
allViewDescriptors
;
const
allViews
=
this
.
viewDescriptorService
.
getView
ContainerModel
(
container
).
allViewDescriptors
;
if
(
!
allViews
.
some
(
v
=>
!
v
.
canMoveView
))
{
viewsToMove
.
push
(...
allViews
);
}
...
...
@@ -884,11 +882,11 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
}));
this
.
_register
(
this
.
onDidSashChange
(()
=>
this
.
saveViewSizes
()));
this
.
view
sModel
.
onDidAdd
(
added
=>
this
.
onDidAddViewDescriptors
(
added
));
this
.
view
sModel
.
onDidRemove
(
removed
=>
this
.
onDidRemoveViewDescriptors
(
removed
));
const
addedViews
:
IAddedViewDescriptorRef
[]
=
this
.
view
s
Model
.
visibleViewDescriptors
.
map
((
viewDescriptor
,
index
)
=>
{
const
size
=
this
.
view
s
Model
.
getSize
(
viewDescriptor
.
id
);
const
collapsed
=
this
.
view
s
Model
.
isCollapsed
(
viewDescriptor
.
id
);
this
.
view
ContainerModel
.
onDidAddVisibleViewDescriptors
(
added
=>
this
.
onDidAddViewDescriptors
(
added
));
this
.
view
ContainerModel
.
onDidRemoveVisibleViewDescriptors
(
removed
=>
this
.
onDidRemoveViewDescriptors
(
removed
));
const
addedViews
:
IAddedViewDescriptorRef
[]
=
this
.
view
Container
Model
.
visibleViewDescriptors
.
map
((
viewDescriptor
,
index
)
=>
{
const
size
=
this
.
view
Container
Model
.
getSize
(
viewDescriptor
.
id
);
const
collapsed
=
this
.
view
Container
Model
.
isCollapsed
(
viewDescriptor
.
id
);
return
({
viewDescriptor
,
index
,
size
,
collapsed
});
});
if
(
addedViews
.
length
)
{
...
...
@@ -906,9 +904,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
}
getTitle
():
string
{
// use registered title if any of our panes are statically registered to this container
const
allViewDescriptors
=
this
.
viewDescriptorService
.
getViewDescriptors
(
this
.
viewContainer
).
allViewDescriptors
;
const
containerTitle
=
this
.
paneItems
.
length
===
0
||
allViewDescriptors
.
length
===
0
||
allViewDescriptors
.
some
(
v
=>
this
.
viewDescriptorService
.
getDefaultContainer
(
v
.
id
)
===
this
.
viewContainer
)
?
this
.
viewContainer
.
name
:
this
.
paneItems
[
0
].
pane
.
title
;
const
containerTitle
=
this
.
viewContainerModel
.
title
;
if
(
this
.
isViewMergedWithContainer
())
{
const
paneItemTitle
=
this
.
paneItems
[
0
].
pane
.
title
;
...
...
@@ -959,10 +955,10 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
}
}
const
viewToggleActions
=
this
.
view
sModel
.
v
iewDescriptors
.
map
(
viewDescriptor
=>
(
<
IAction
>
{
const
viewToggleActions
=
this
.
view
ContainerModel
.
activeV
iewDescriptors
.
map
(
viewDescriptor
=>
(
<
IAction
>
{
id
:
`
${
viewDescriptor
.
id
}
.toggleVisibility`
,
label
:
viewDescriptor
.
name
,
checked
:
this
.
view
s
Model
.
isVisible
(
viewDescriptor
.
id
),
checked
:
this
.
view
Container
Model
.
isVisible
(
viewDescriptor
.
id
),
enabled
:
viewDescriptor
.
canToggleVisibility
,
run
:
()
=>
this
.
toggleViewVisibility
(
viewDescriptor
.
id
)
}));
...
...
@@ -1091,7 +1087,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
// Save size only when the layout has happened
if
(
this
.
didLayout
)
{
for
(
const
view
of
this
.
panes
)
{
this
.
view
s
Model
.
setSize
(
view
.
id
,
this
.
getPaneSize
(
view
));
this
.
view
Container
Model
.
setSize
(
view
.
id
,
this
.
getPaneSize
(
view
));
}
}
}
...
...
@@ -1100,10 +1096,10 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
// Restore sizes only when the layout has happened
if
(
this
.
didLayout
)
{
let
initialSizes
;
for
(
let
i
=
0
;
i
<
this
.
view
s
Model
.
visibleViewDescriptors
.
length
;
i
++
)
{
for
(
let
i
=
0
;
i
<
this
.
view
Container
Model
.
visibleViewDescriptors
.
length
;
i
++
)
{
const
pane
=
this
.
panes
[
i
];
const
viewDescriptor
=
this
.
view
s
Model
.
visibleViewDescriptors
[
i
];
const
size
=
this
.
view
s
Model
.
getSize
(
viewDescriptor
.
id
);
const
viewDescriptor
=
this
.
view
Container
Model
.
visibleViewDescriptors
[
i
];
const
size
=
this
.
view
Container
Model
.
getSize
(
viewDescriptor
.
id
);
if
(
typeof
size
===
'
number
'
)
{
this
.
resizePane
(
pane
,
size
);
...
...
@@ -1118,8 +1114,8 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
private
computeInitialSizes
():
Map
<
string
,
number
>
{
const
sizes
:
Map
<
string
,
number
>
=
new
Map
<
string
,
number
>
();
if
(
this
.
dimension
)
{
const
totalWeight
=
this
.
view
s
Model
.
visibleViewDescriptors
.
reduce
((
totalWeight
,
{
weight
})
=>
totalWeight
+
(
weight
||
20
),
0
);
for
(
const
viewDescriptor
of
this
.
view
s
Model
.
visibleViewDescriptors
)
{
const
totalWeight
=
this
.
view
Container
Model
.
visibleViewDescriptors
.
reduce
((
totalWeight
,
{
weight
})
=>
totalWeight
+
(
weight
||
20
),
0
);
for
(
const
viewDescriptor
of
this
.
view
Container
Model
.
visibleViewDescriptors
)
{
if
(
this
.
orientation
===
Orientation
.
VERTICAL
)
{
sizes
.
set
(
viewDescriptor
.
id
,
this
.
dimension
.
height
*
(
viewDescriptor
.
weight
||
20
)
/
totalWeight
);
}
else
{
...
...
@@ -1180,7 +1176,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
});
const
collapseDisposable
=
Event
.
latch
(
Event
.
map
(
pane
.
onDidChange
,
()
=>
!
pane
.
isExpanded
()))(
collapsed
=>
{
this
.
view
s
Model
.
setCollapsed
(
viewDescriptor
.
id
,
collapsed
);
this
.
view
Container
Model
.
setCollapsed
(
viewDescriptor
.
id
,
collapsed
);
});
this
.
viewDisposables
.
splice
(
index
,
0
,
combinedDisposable
(
contextMenuDisposable
,
collapseDisposable
));
...
...
@@ -1211,13 +1207,13 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
}
protected
toggleViewVisibility
(
viewId
:
string
):
void
{
const
visible
=
!
this
.
view
s
Model
.
isVisible
(
viewId
);
const
visible
=
!
this
.
view
Container
Model
.
isVisible
(
viewId
);
type
ViewsToggleVisibilityClassification
=
{
viewId
:
{
classification
:
'
SystemMetaData
'
,
purpose
:
'
FeatureInsight
'
};
visible
:
{
classification
:
'
SystemMetaData
'
,
purpose
:
'
FeatureInsight
'
};
};
this
.
telemetryService
.
publicLog2
<
{
viewId
:
String
,
visible
:
boolean
},
ViewsToggleVisibilityClassification
>
(
'
views.toggleVisibility
'
,
{
viewId
,
visible
});
this
.
view
s
Model
.
setVisible
(
viewId
,
visible
);
this
.
view
Container
Model
.
setVisible
(
viewId
,
visible
);
}
private
addPane
(
pane
:
ViewPane
,
size
:
number
,
index
=
this
.
paneItems
.
length
-
1
):
void
{
...
...
@@ -1272,7 +1268,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
const
viewContainerRegistry
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewContainerExtensions
.
ViewContainersRegistry
);
const
container
=
viewContainerRegistry
.
get
(
dropData
.
id
)
!
;
const
viewsToMove
=
this
.
viewDescriptorService
.
getView
Descriptors
(
container
).
allViewDescriptors
;
const
viewsToMove
=
this
.
viewDescriptorService
.
getView
ContainerModel
(
container
).
allViewDescriptors
;
if
(
!
viewsToMove
.
some
(
v
=>
!
v
.
canMoveView
))
{
overlay
=
new
ViewPaneDropOverlay
(
pane
.
dropTargetElement
,
this
.
orientation
??
Orientation
.
VERTICAL
,
this
.
themeService
);
...
...
@@ -1294,7 +1290,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
const
viewContainerRegistry
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewContainerExtensions
.
ViewContainersRegistry
);
const
container
=
viewContainerRegistry
.
get
(
dropData
.
id
)
!
;
const
allViews
=
this
.
viewDescriptorService
.
getView
Descriptors
(
container
).
allViewDescriptors
;
const
allViews
=
this
.
viewDescriptorService
.
getView
ContainerModel
(
container
).
allViewDescriptors
;
if
(
allViews
.
length
>
0
&&
!
allViews
.
some
(
v
=>
!
v
.
canMoveView
))
{
viewsToMove
.
push
(...
allViews
);
...
...
@@ -1409,8 +1405,8 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
const
fromIndex
=
firstIndex
(
this
.
paneItems
,
item
=>
item
.
pane
===
from
);
const
toIndex
=
firstIndex
(
this
.
paneItems
,
item
=>
item
.
pane
===
to
);
const
fromViewDescriptor
=
this
.
view
s
Model
.
visibleViewDescriptors
[
fromIndex
];
const
toViewDescriptor
=
this
.
view
s
Model
.
visibleViewDescriptors
[
toIndex
];
const
fromViewDescriptor
=
this
.
view
Container
Model
.
visibleViewDescriptors
[
fromIndex
];
const
toViewDescriptor
=
this
.
view
Container
Model
.
visibleViewDescriptors
[
toIndex
];
if
(
fromIndex
<
0
||
fromIndex
>=
this
.
paneItems
.
length
)
{
return
;
...
...
@@ -1425,7 +1421,7 @@ export class ViewPaneContainer extends Component implements IViewPaneContainer {
assertIsDefined
(
this
.
paneview
).
movePane
(
from
,
to
);
this
.
view
s
Model
.
move
(
fromViewDescriptor
.
id
,
toViewDescriptor
.
id
);
this
.
view
Container
Model
.
move
(
fromViewDescriptor
.
id
,
toViewDescriptor
.
id
);
this
.
updateTitleArea
();
}
...
...
src/vs/workbench/browser/parts/views/views.ts
浏览文件 @
600995bb
此差异已折叠。
点击以展开。
src/vs/workbench/browser/parts/views/viewsViewlet.ts
浏览文件 @
600995bb
...
...
@@ -6,7 +6,7 @@
import
{
IAction
}
from
'
vs/base/common/actions
'
;
import
{
IExtensionService
}
from
'
vs/workbench/services/extensions/common/extensions
'
;
import
{
IContextMenuService
}
from
'
vs/platform/contextview/browser/contextView
'
;
import
{
IViewDescriptor
,
IViewDescriptorService
}
from
'
vs/workbench/common/views
'
;
import
{
IViewDescriptor
,
IViewDescriptorService
,
IAddedViewDescriptorRef
}
from
'
vs/workbench/common/views
'
;
import
{
ITelemetryService
}
from
'
vs/platform/telemetry/common/telemetry
'
;
import
{
IThemeService
}
from
'
vs/platform/theme/common/themeService
'
;
import
{
IInstantiationService
}
from
'
vs/platform/instantiation/common/instantiation
'
;
...
...
@@ -16,7 +16,6 @@ import { ViewPaneContainer, ViewPane, IViewPaneOptions } from 'vs/workbench/brow
import
{
Event
}
from
'
vs/base/common/event
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
IWorkbenchLayoutService
}
from
'
vs/workbench/services/layout/browser/layoutService
'
;
import
{
IAddedViewDescriptorRef
}
from
'
vs/workbench/browser/parts/views/views
'
;
export
interface
IViewletViewOptions
extends
IViewPaneOptions
{
}
...
...
@@ -41,14 +40,14 @@ export abstract class FilterViewPaneContainer extends ViewPaneContainer {
@
IViewDescriptorService
viewDescriptorService
:
IViewDescriptorService
)
{
super
(
viewletId
,
`
${
viewletId
}
.state`
,
{
mergeViewWithContainerWhenSingleView
:
false
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
super
(
viewletId
,
{
mergeViewWithContainerWhenSingleView
:
false
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
this
.
_register
(
onDidChangeFilterValue
(
newFilterValue
=>
{
this
.
filterValue
=
newFilterValue
;
this
.
onFilterChanged
(
newFilterValue
);
}));
this
.
_register
(
this
.
view
sModel
.
onDidChangeActiveViews
((
viewDescriptors
)
=>
{
this
.
updateAllViews
(
v
iewDescriptors
);
this
.
_register
(
this
.
view
ContainerModel
.
onDidChangeActiveViewDescriptors
((
)
=>
{
this
.
updateAllViews
(
this
.
viewContainerModel
.
activeV
iewDescriptors
);
}));
}
...
...
@@ -63,7 +62,7 @@ export abstract class FilterViewPaneContainer extends ViewPaneContainer {
}
this
.
allViews
.
get
(
filterOnValue
)
!
.
set
(
descriptor
.
id
,
descriptor
);
if
(
this
.
filterValue
&&
!
this
.
filterValue
.
includes
(
filterOnValue
))
{
this
.
view
s
Model
.
setVisible
(
descriptor
.
id
,
false
);
this
.
view
Container
Model
.
setVisible
(
descriptor
.
id
,
false
);
}
});
}
...
...
@@ -76,17 +75,17 @@ export abstract class FilterViewPaneContainer extends ViewPaneContainer {
private
onFilterChanged
(
newFilterValue
:
string
[])
{
if
(
this
.
allViews
.
size
===
0
)
{
this
.
updateAllViews
(
this
.
view
sModel
.
v
iewDescriptors
);
this
.
updateAllViews
(
this
.
view
ContainerModel
.
activeV
iewDescriptors
);
}
this
.
getViewsNotForTarget
(
newFilterValue
).
forEach
(
item
=>
this
.
view
s
Model
.
setVisible
(
item
.
id
,
false
));
this
.
getViewsForTarget
(
newFilterValue
).
forEach
(
item
=>
this
.
view
s
Model
.
setVisible
(
item
.
id
,
true
));
this
.
getViewsNotForTarget
(
newFilterValue
).
forEach
(
item
=>
this
.
view
Container
Model
.
setVisible
(
item
.
id
,
false
));
this
.
getViewsForTarget
(
newFilterValue
).
forEach
(
item
=>
this
.
view
Container
Model
.
setVisible
(
item
.
id
,
true
));
}
getContextMenuActions
():
IAction
[]
{
const
result
:
IAction
[]
=
Array
.
from
(
this
.
constantViewDescriptors
.
values
()).
map
(
viewDescriptor
=>
(
<
IAction
>
{
id
:
`
${
viewDescriptor
.
id
}
.toggleVisibility`
,
label
:
viewDescriptor
.
name
,
checked
:
this
.
view
s
Model
.
isVisible
(
viewDescriptor
.
id
),
checked
:
this
.
view
Container
Model
.
isVisible
(
viewDescriptor
.
id
),
enabled
:
viewDescriptor
.
canToggleVisibility
,
run
:
()
=>
this
.
toggleViewVisibility
(
viewDescriptor
.
id
)
}));
...
...
@@ -134,7 +133,7 @@ export abstract class FilterViewPaneContainer extends ViewPaneContainer {
}
// Check that allViews is ready
if
(
this
.
allViews
.
size
===
0
)
{
this
.
updateAllViews
(
this
.
view
sModel
.
v
iewDescriptors
);
this
.
updateAllViews
(
this
.
view
ContainerModel
.
activeV
iewDescriptors
);
}
return
panes
;
}
...
...
src/vs/workbench/common/views.ts
浏览文件 @
600995bb
...
...
@@ -43,6 +43,8 @@ export interface IViewContainerDescriptor {
readonly
ctorDescriptor
:
SyncDescriptor
<
IViewPaneContainer
>
;
readonly
storageId
?:
string
;
readonly
icon
?:
string
|
URI
;
readonly
order
?:
number
;
...
...
@@ -207,11 +209,43 @@ export interface IViewDescriptor {
readonly
remoteAuthority
?:
string
|
string
[];
}
export
interface
IViewDescriptorCollection
extends
IDisposable
{
readonly
onDidChangeViews
:
Event
<
{
added
:
IViewDescriptor
[],
removed
:
IViewDescriptor
[]
}
>
;
readonly
onDidChangeActiveViews
:
Event
<
{
added
:
IViewDescriptor
[],
removed
:
IViewDescriptor
[]
}
>
;
readonly
activeViewDescriptors
:
IViewDescriptor
[];
readonly
allViewDescriptors
:
IViewDescriptor
[];
export
interface
IViewDescriptorRef
{
viewDescriptor
:
IViewDescriptor
;
index
:
number
;
}
export
interface
IAddedViewDescriptorRef
extends
IViewDescriptorRef
{
collapsed
:
boolean
;
size
?:
number
;
}
export
interface
IViewContainerModel
{
readonly
title
:
string
;
readonly
icon
:
string
|
URI
|
undefined
;
readonly
onDidChangeContainerInfo
:
Event
<
{
title
?:
boolean
,
icon
?:
boolean
}
>
;
readonly
allViewDescriptors
:
ReadonlyArray
<
IViewDescriptor
>
;
readonly
onDidChangeAllViewDescriptors
:
Event
<
{
added
:
ReadonlyArray
<
IViewDescriptor
>
,
removed
:
ReadonlyArray
<
IViewDescriptor
>
}
>
;
readonly
activeViewDescriptors
:
ReadonlyArray
<
IViewDescriptor
>
;
readonly
onDidChangeActiveViewDescriptors
:
Event
<
{
added
:
ReadonlyArray
<
IViewDescriptor
>
,
removed
:
ReadonlyArray
<
IViewDescriptor
>
}
>
;
readonly
visibleViewDescriptors
:
ReadonlyArray
<
IViewDescriptor
>
;
readonly
onDidAddVisibleViewDescriptors
:
Event
<
IAddedViewDescriptorRef
[]
>
;
readonly
onDidRemoveVisibleViewDescriptors
:
Event
<
IViewDescriptorRef
[]
>
readonly
onDidMoveVisibleViewDescriptors
:
Event
<
{
from
:
IViewDescriptorRef
;
to
:
IViewDescriptorRef
;
}
>
isVisible
(
id
:
string
):
boolean
;
setVisible
(
id
:
string
,
visible
:
boolean
,
size
?:
number
):
void
;
isCollapsed
(
id
:
string
):
boolean
;
setCollapsed
(
id
:
string
,
collapsed
:
boolean
):
void
;
getSize
(
id
:
string
):
number
|
undefined
;
setSize
(
id
:
string
,
size
:
number
):
void
move
(
from
:
string
,
to
:
string
):
void
;
}
export
enum
ViewContentPriority
{
...
...
@@ -451,7 +485,7 @@ export interface IViewDescriptorService {
moveViewsToContainer
(
views
:
IViewDescriptor
[],
viewContainer
:
ViewContainer
):
void
;
getView
Descriptors
(
container
:
ViewContainer
):
IViewDescriptorCollection
;
getView
ContainerModel
(
container
:
ViewContainer
):
IViewContainerModel
;
getViewDescriptor
(
viewId
:
string
):
IViewDescriptor
|
null
;
...
...
src/vs/workbench/contrib/bulkEdit/browser/bulkEdit.contribution.ts
浏览文件 @
600995bb
...
...
@@ -352,8 +352,9 @@ const container = Registry.as<IViewContainersRegistry>(ViewContainerExtensions.V
hideIfEmpty
:
true
,
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
BulkEditPane
.
ID
,
BulkEditPane
.
ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]
)
[
BulkEditPane
.
ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]
),
storageId
:
BulkEditPane
.
ID
},
ViewContainerLocation
.
Panel
);
Registry
.
as
<
IViewsRegistry
>
(
ViewContainerExtensions
.
ViewsRegistry
).
registerViews
([{
...
...
src/vs/workbench/contrib/debug/browser/debug.contribution.ts
浏览文件 @
600995bb
...
...
@@ -90,7 +90,8 @@ const openPanelKb: IKeybindings = {
const
VIEW_CONTAINER
:
ViewContainer
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewExtensions
.
ViewContainersRegistry
).
registerViewContainer
({
id
:
DEBUG_PANEL_ID
,
name
:
nls
.
localize
({
comment
:
[
'
Debug is a noun in this context, not a verb.
'
],
key
:
'
debugPanel
'
},
'
Debug Console
'
),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
DEBUG_PANEL_ID
,
DEBUG_PANEL_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
DEBUG_PANEL_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
storageId
:
DEBUG_PANEL_ID
,
focusCommand
:
{
id
:
OpenDebugConsoleAction
.
ID
,
keybindings
:
openPanelKb
...
...
src/vs/workbench/contrib/debug/browser/debugViewlet.ts
浏览文件 @
600995bb
...
...
@@ -62,7 +62,7 @@ export class DebugViewPaneContainer extends ViewPaneContainer {
@
INotificationService
private
readonly
notificationService
:
INotificationService
,
@
IViewDescriptorService
viewDescriptorService
:
IViewDescriptorService
)
{
super
(
VIEWLET_ID
,
`
${
VIEWLET_ID
}
.state`
,
{
mergeViewWithContainerWhenSingleView
:
true
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
super
(
VIEWLET_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
this
.
_register
(
this
.
debugService
.
onDidChangeState
(
state
=>
this
.
onDebugServiceStateChange
(
state
)));
this
.
_register
(
this
.
debugService
.
onDidNewSession
(()
=>
this
.
updateToolBar
()));
...
...
src/vs/workbench/contrib/extensions/browser/extensionsViewlet.ts
浏览文件 @
600995bb
...
...
@@ -34,7 +34,7 @@ import Severity from 'vs/base/common/severity';
import
{
IActivityService
,
NumberBadge
}
from
'
vs/workbench/services/activity/common/activity
'
;
import
{
IThemeService
}
from
'
vs/platform/theme/common/themeService
'
;
import
{
IConfigurationService
}
from
'
vs/platform/configuration/common/configuration
'
;
import
{
IViewsRegistry
,
IViewDescriptor
,
Extensions
,
ViewContainer
,
IViewContainersRegistry
,
IViewDescriptorService
}
from
'
vs/workbench/common/views
'
;
import
{
IViewsRegistry
,
IViewDescriptor
,
Extensions
,
ViewContainer
,
IViewContainersRegistry
,
IViewDescriptorService
,
IAddedViewDescriptorRef
}
from
'
vs/workbench/common/views
'
;
import
{
IStorageService
,
StorageScope
}
from
'
vs/platform/storage/common/storage
'
;
import
{
IWorkspaceContextService
,
WorkbenchState
}
from
'
vs/platform/workspace/common/workspace
'
;
import
{
IContextKeyService
,
ContextKeyExpr
,
RawContextKey
,
IContextKey
}
from
'
vs/platform/contextkey/common/contextkey
'
;
...
...
@@ -44,7 +44,6 @@ import { ILogService } from 'vs/platform/log/common/log';
import
{
INotificationService
}
from
'
vs/platform/notification/common/notification
'
;
import
{
IHostService
}
from
'
vs/workbench/services/host/browser/host
'
;
import
{
IWorkbenchLayoutService
}
from
'
vs/workbench/services/layout/browser/layoutService
'
;
import
{
IAddedViewDescriptorRef
}
from
'
vs/workbench/browser/parts/views/views
'
;
import
{
ViewPane
,
ViewPaneContainer
}
from
'
vs/workbench/browser/parts/views/viewPaneContainer
'
;
import
{
Query
}
from
'
vs/workbench/contrib/extensions/common/extensionQuery
'
;
import
{
SuggestEnabledInput
,
attachSuggestEnabledInputBoxStyler
}
from
'
vs/workbench/contrib/codeEditor/browser/suggestEnabledInput/suggestEnabledInput
'
;
...
...
@@ -359,7 +358,7 @@ export class ExtensionsViewPaneContainer extends ViewPaneContainer implements IE
@
IViewDescriptorService
viewDescriptorService
:
IViewDescriptorService
,
@
IPreferencesService
private
readonly
preferencesService
:
IPreferencesService
)
{
super
(
VIEWLET_ID
,
`
${
VIEWLET_ID
}
.state`
,
{
mergeViewWithContainerWhenSingleView
:
true
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
super
(
VIEWLET_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
this
.
searchDelayer
=
new
Delayer
(
500
);
this
.
nonEmptyWorkspaceContextKey
=
NonEmptyWorkspaceContext
.
bindTo
(
contextKeyService
);
...
...
src/vs/workbench/contrib/files/browser/explorerViewlet.ts
浏览文件 @
600995bb
...
...
@@ -160,8 +160,6 @@ export class ExplorerViewletViewsContribution extends Disposable implements IWor
export
class
ExplorerViewPaneContainer
extends
ViewPaneContainer
{
private
static
readonly
EXPLORER_VIEWS_STATE
=
'
workbench.explorer.views.state
'
;
private
viewletVisibleContextKey
:
IContextKey
<
boolean
>
;
constructor
(
...
...
@@ -179,7 +177,7 @@ export class ExplorerViewPaneContainer extends ViewPaneContainer {
@
IViewDescriptorService
viewDescriptorService
:
IViewDescriptorService
)
{
super
(
VIEWLET_ID
,
ExplorerViewPaneContainer
.
EXPLORER_VIEWS_STATE
,
{
mergeViewWithContainerWhenSingleView
:
true
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
super
(
VIEWLET_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
this
.
viewletVisibleContextKey
=
ExplorerViewletVisibleContext
.
bindTo
(
contextKeyService
);
...
...
@@ -262,6 +260,7 @@ export const VIEW_CONTAINER: ViewContainer = Registry.as<IViewContainersRegistry
id
:
VIEWLET_ID
,
name
:
localize
(
'
explore
'
,
"
Explorer
"
),
ctorDescriptor
:
new
SyncDescriptor
(
ExplorerViewPaneContainer
),
storageId
:
'
workbench.explorer.views.state
'
,
icon
:
'
codicon-files
'
,
order
:
0
},
ViewContainerLocation
.
Sidebar
);
...
...
src/vs/workbench/contrib/markers/browser/markers.contribution.ts
浏览文件 @
600995bb
...
...
@@ -114,7 +114,8 @@ const VIEW_CONTAINER: ViewContainer = Registry.as<IViewContainersRegistry>(ViewC
name
:
Messages
.
MARKERS_PANEL_TITLE_PROBLEMS
,
hideIfEmpty
:
true
,
order
:
0
,
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
Constants
.
MARKERS_CONTAINER_ID
,
Constants
.
MARKERS_VIEW_STORAGE_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
Constants
.
MARKERS_CONTAINER_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
storageId
:
Constants
.
MARKERS_VIEW_STORAGE_ID
,
focusCommand
:
{
id
:
ToggleMarkersPanelAction
.
ID
,
keybindings
:
{
primary
:
KeyMod
.
CtrlCmd
|
KeyMod
.
Shift
|
KeyCode
.
KEY_M
...
...
src/vs/workbench/contrib/output/browser/output.contribution.ts
浏览文件 @
600995bb
...
...
@@ -62,7 +62,8 @@ const VIEW_CONTAINER: ViewContainer = Registry.as<IViewContainersRegistry>(ViewC
id
:
OUTPUT_VIEW_ID
,
name
:
nls
.
localize
(
'
output
'
,
"
Output
"
),
order
:
1
,
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
OUTPUT_VIEW_ID
,
OUTPUT_VIEW_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
OUTPUT_VIEW_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
storageId
:
OUTPUT_VIEW_ID
,
hideIfEmpty
:
true
,
focusCommand
:
{
id
:
toggleOutputAcitonId
,
keybindings
:
toggleOutputActionKeybindings
}
},
ViewContainerLocation
.
Panel
);
...
...
src/vs/workbench/contrib/quickaccess/browser/viewQuickAccess.ts
浏览文件 @
600995bb
...
...
@@ -96,9 +96,9 @@ export class ViewQuickAccessProvider extends PickerQuickAccessProvider<IViewQuic
const
viewEntries
:
Array
<
IViewQuickPickItem
>
=
[];
const
getViewEntriesForViewlet
=
(
viewlet
:
ViewletDescriptor
,
viewContainer
:
ViewContainer
):
IViewQuickPickItem
[]
=>
{
const
view
Descriptors
=
this
.
viewDescriptorService
.
getViewDescriptors
(
viewContainer
);
const
view
ContainerModel
=
this
.
viewDescriptorService
.
getViewContainerModel
(
viewContainer
);
const
result
:
IViewQuickPickItem
[]
=
[];
for
(
const
view
of
view
Descriptors
.
allViewDescriptors
)
{
for
(
const
view
of
view
ContainerModel
.
allViewDescriptors
)
{
if
(
this
.
contextKeyService
.
contextMatchesRules
(
view
.
when
))
{
result
.
push
({
label
:
view
.
name
,
...
...
@@ -176,7 +176,7 @@ export class ViewQuickAccessProvider extends PickerQuickAccessProvider<IViewQuic
private
includeViewContainer
(
container
:
ViewletDescriptor
|
IPanelIdentifier
):
boolean
{
const
viewContainer
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewExtensions
.
ViewContainersRegistry
).
get
(
container
.
id
);
if
(
viewContainer
?.
hideIfEmpty
)
{
return
this
.
viewDescriptorService
.
getView
Descriptors
(
viewContainer
).
activeViewDescriptors
.
length
>
0
;
return
this
.
viewDescriptorService
.
getView
ContainerModel
(
viewContainer
).
activeViewDescriptors
.
length
>
0
;
}
return
true
;
...
...
src/vs/workbench/contrib/remote/browser/remote.ts
浏览文件 @
600995bb
...
...
@@ -19,7 +19,7 @@ import { IExtensionService } from 'vs/workbench/services/extensions/common/exten
import
{
FilterViewPaneContainer
}
from
'
vs/workbench/browser/parts/views/viewsViewlet
'
;
import
{
VIEWLET_ID
}
from
'
vs/workbench/contrib/remote/common/remote.contribution
'
;
import
{
IContextKeyService
}
from
'
vs/platform/contextkey/common/contextkey
'
;
import
{
IViewDescriptor
,
IViewsRegistry
,
Extensions
,
ViewContainerLocation
,
IViewContainersRegistry
,
IViewDescriptorService
}
from
'
vs/workbench/common/views
'
;
import
{
IViewDescriptor
,
IViewsRegistry
,
Extensions
,
ViewContainerLocation
,
IViewContainersRegistry
,
IViewDescriptorService
,
IAddedViewDescriptorRef
}
from
'
vs/workbench/common/views
'
;
import
{
Registry
}
from
'
vs/platform/registry/common/platform
'
;
import
{
IExtensionDescription
}
from
'
vs/platform/extensions/common/extensions
'
;
import
{
IOpenerService
}
from
'
vs/platform/opener/common/opener
'
;
...
...
@@ -46,7 +46,6 @@ import { IRemoteExplorerService } from 'vs/workbench/services/remote/common/remo
import
{
IWorkbenchEnvironmentService
}
from
'
vs/workbench/services/environment/common/environmentService
'
;
import
{
startsWith
}
from
'
vs/base/common/strings
'
;
import
{
TunnelPanelDescriptor
,
TunnelViewModel
,
forwardedPortsViewEnabled
}
from
'
vs/workbench/contrib/remote/browser/tunnelView
'
;
import
{
IAddedViewDescriptorRef
}
from
'
vs/workbench/browser/parts/views/views
'
;
import
{
ViewPane
,
IViewPaneOptions
}
from
'
vs/workbench/browser/parts/views/viewPaneContainer
'
;
import
{
IListVirtualDelegate
}
from
'
vs/base/browser/ui/list/list
'
;
import
{
ITreeRenderer
,
ITreeNode
,
IAsyncDataSource
}
from
'
vs/base/browser/ui/tree/tree
'
;
...
...
src/vs/workbench/contrib/scm/browser/scm.contribution.ts
浏览文件 @
600995bb
...
...
@@ -51,6 +51,7 @@ Registry.as<IViewContainersRegistry>(ViewContainerExtensions.ViewContainersRegis
id
:
VIEWLET_ID
,
name
:
localize
(
'
source control
'
,
"
Source Control
"
),
ctorDescriptor
:
new
SyncDescriptor
(
SCMViewPaneContainer
),
storageId
:
'
workbench.scm.views.state
'
,
icon
:
'
codicon-source-control
'
,
order
:
2
},
ViewContainerLocation
.
Sidebar
);
...
...
src/vs/workbench/contrib/scm/browser/scmViewlet.ts
浏览文件 @
600995bb
...
...
@@ -24,12 +24,11 @@ import { INotificationService } from 'vs/platform/notification/common/notificati
import
{
IWorkbenchLayoutService
}
from
'
vs/workbench/services/layout/browser/layoutService
'
;
import
{
IExtensionService
}
from
'
vs/workbench/services/extensions/common/extensions
'
;
import
{
IWorkspaceContextService
}
from
'
vs/platform/workspace/common/workspace
'
;
import
{
IViewsRegistry
,
Extensions
,
IViewDescriptorService
,
IViewDescriptor
}
from
'
vs/workbench/common/views
'
;
import
{
IViewsRegistry
,
Extensions
,
IViewDescriptorService
,
IViewDescriptor
,
IAddedViewDescriptorRef
,
IViewDescriptorRef
}
from
'
vs/workbench/common/views
'
;
import
{
Registry
}
from
'
vs/platform/registry/common/platform
'
;
import
{
RepositoryPane
,
RepositoryViewDescriptor
}
from
'
vs/workbench/contrib/scm/browser/repositoryPane
'
;
import
{
MainPaneDescriptor
,
MainPane
,
IViewModel
}
from
'
vs/workbench/contrib/scm/browser/mainPane
'
;
import
{
ViewPaneContainer
,
IViewPaneOptions
,
ViewPane
}
from
'
vs/workbench/browser/parts/views/viewPaneContainer
'
;
import
type
{
IAddedViewDescriptorRef
,
IViewDescriptorRef
}
from
'
vs/workbench/browser/parts/views/views
'
;
import
{
debounce
}
from
'
vs/base/common/decorators
'
;
import
{
SyncDescriptor
}
from
'
vs/platform/instantiation/common/descriptors
'
;
import
{
IOpenerService
}
from
'
vs/platform/opener/common/opener
'
;
...
...
@@ -80,8 +79,6 @@ export class EmptyPaneDescriptor implements IViewDescriptor {
export
class
SCMViewPaneContainer
extends
ViewPaneContainer
implements
IViewModel
{
private
static
readonly
STATE_KEY
=
'
workbench.scm.views.state
'
;
private
menus
:
SCMMenus
;
private
_repositories
:
ISCMRepository
[]
=
[];
...
...
@@ -104,7 +101,7 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
}
get
onDidChangeVisibleRepositories
():
Event
<
ISCMRepository
[]
>
{
const
modificationEvent
=
Event
.
debounce
(
Event
.
any
(
this
.
view
sModel
.
onDidAdd
,
this
.
viewsModel
.
onDidRemove
),
()
=>
null
,
0
);
const
modificationEvent
=
Event
.
debounce
(
Event
.
any
(
this
.
view
ContainerModel
.
onDidAddVisibleViewDescriptors
,
this
.
viewContainerModel
.
onDidRemoveVisibleViewDescriptors
),
()
=>
null
,
0
);
return
Event
.
map
(
modificationEvent
,
()
=>
this
.
visibleRepositories
);
}
...
...
@@ -126,7 +123,7 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
@
IContextKeyService
contextKeyService
:
IContextKeyService
,
@
IViewDescriptorService
viewDescriptorService
:
IViewDescriptorService
)
{
super
(
VIEWLET_ID
,
SCMViewPaneContainer
.
STATE_KEY
,
{
mergeViewWithContainerWhenSingleView
:
true
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
super
(
VIEWLET_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
},
instantiationService
,
configurationService
,
layoutService
,
contextMenuService
,
telemetryService
,
extensionService
,
themeService
,
storageService
,
contextService
,
viewDescriptorService
);
this
.
menus
=
instantiationService
.
createInstance
(
SCMMenus
,
undefined
);
this
.
_register
(
this
.
menus
.
onDidChangeTitle
(
this
.
updateTitleArea
,
this
));
...
...
@@ -143,14 +140,14 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
this
.
_register
(
configurationService
.
onDidChangeConfiguration
(
e
=>
{
if
(
e
.
affectsConfiguration
(
'
scm.alwaysShowProviders
'
)
&&
configurationService
.
getValue
<
boolean
>
(
'
scm.alwaysShowProviders
'
))
{
this
.
view
s
Model
.
setVisible
(
MainPane
.
ID
,
true
);
this
.
view
Container
Model
.
setVisible
(
MainPane
.
ID
,
true
);
}
}));
this
.
repositoryCountKey
=
contextKeyService
.
createKey
(
'
scm.providerCount
'
,
0
);
this
.
_register
(
this
.
view
sModel
.
onDidAdd
(
this
.
onDidShowView
,
this
));
this
.
_register
(
this
.
view
sModel
.
onDidRemove
(
this
.
onDidHideView
,
this
));
this
.
_register
(
this
.
view
ContainerModel
.
onDidAddVisibleViewDescriptors
(
this
.
onDidShowView
,
this
));
this
.
_register
(
this
.
view
ContainerModel
.
onDidRemoveVisibleViewDescriptors
(
this
.
onDidHideView
,
this
));
}
create
(
parent
:
HTMLElement
):
void
{
...
...
@@ -217,8 +214,8 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
@
debounce
(
0
)
private
afterOnDidHideView
():
void
{
if
(
this
.
repositoryCountKey
.
get
()
!
>
0
&&
this
.
viewDescriptors
.
every
(
d
=>
!
this
.
view
s
Model
.
isVisible
(
d
.
id
)))
{
this
.
view
s
Model
.
setVisible
(
this
.
viewDescriptors
[
0
].
id
,
true
);
if
(
this
.
repositoryCountKey
.
get
()
!
>
0
&&
this
.
viewDescriptors
.
every
(
d
=>
!
this
.
view
Container
Model
.
isVisible
(
d
.
id
)))
{
this
.
view
Container
Model
.
setVisible
(
this
.
viewDescriptors
[
0
].
id
,
true
);
}
}
...
...
@@ -285,9 +282,9 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
}
setVisibleRepositories
(
repositories
:
ISCMRepository
[]):
void
{
const
visibleViewDescriptors
=
this
.
view
s
Model
.
visibleViewDescriptors
;
const
visibleViewDescriptors
=
this
.
view
Container
Model
.
visibleViewDescriptors
;
const
toSetVisible
=
this
.
view
sModel
.
v
iewDescriptors
const
toSetVisible
=
this
.
view
ContainerModel
.
activeV
iewDescriptors
.
filter
((
d
):
d
is
RepositoryViewDescriptor
=>
d
instanceof
RepositoryViewDescriptor
&&
repositories
.
indexOf
(
d
.
repository
)
>
-
1
&&
visibleViewDescriptors
.
indexOf
(
d
)
===
-
1
);
const
toSetInvisible
=
visibleViewDescriptors
...
...
@@ -305,11 +302,11 @@ export class SCMViewPaneContainer extends ViewPaneContainer implements IViewMode
}
}
this
.
view
s
Model
.
setVisible
(
viewDescriptor
.
id
,
false
);
this
.
view
Container
Model
.
setVisible
(
viewDescriptor
.
id
,
false
);
}
for
(
const
viewDescriptor
of
toSetVisible
)
{
this
.
view
s
Model
.
setVisible
(
viewDescriptor
.
id
,
true
,
size
);
this
.
view
Container
Model
.
setVisible
(
viewDescriptor
.
id
,
true
,
size
);
}
}
}
src/vs/workbench/contrib/search/browser/search.contribution.ts
浏览文件 @
600995bb
...
...
@@ -504,7 +504,7 @@ class ShowAllSymbolsAction extends Action {
const
viewContainer
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewExtensions
.
ViewContainersRegistry
).
registerViewContainer
({
id
:
VIEWLET_ID
,
name
:
nls
.
localize
(
'
name
'
,
"
Search
"
),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
VIEWLET_ID
,
`
${
VIEWLET_ID
}
.state`
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
VIEWLET_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
hideIfEmpty
:
true
,
icon
:
'
codicon-search
'
,
order
:
1
...
...
src/vs/workbench/contrib/terminal/browser/terminal.contribution.ts
浏览文件 @
600995bb
...
...
@@ -68,7 +68,8 @@ if (platform.isWeb) {
const
VIEW_CONTAINER
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewContainerExtensions
.
ViewContainersRegistry
).
registerViewContainer
({
id
:
TERMINAL_VIEW_ID
,
name
:
nls
.
localize
(
'
terminal
'
,
"
Terminal
"
),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
TERMINAL_VIEW_ID
,
TERMINAL_VIEW_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
TERMINAL_VIEW_ID
,
{
mergeViewWithContainerWhenSingleView
:
true
,
donotShowContainerTitleWhenMergedWithContainer
:
true
}]),
storageId
:
TERMINAL_VIEW_ID
,
focusCommand
:
{
id
:
TERMINAL_COMMAND_ID
.
FOCUS
},
hideIfEmpty
:
true
,
order
:
3
...
...
src/vs/workbench/contrib/terminal/browser/terminalService.ts
浏览文件 @
600995bb
...
...
@@ -704,7 +704,7 @@ export class TerminalService implements ITerminalService {
const
location
=
this
.
_viewDescriptorService
.
getViewLocation
(
TERMINAL_VIEW_ID
);
if
(
location
===
ViewContainerLocation
.
Panel
)
{
const
panel
=
this
.
_viewDescriptorService
.
getViewContainer
(
TERMINAL_VIEW_ID
);
if
(
panel
&&
this
.
_viewDescriptorService
.
getView
Descriptors
(
panel
).
activeViewDescriptors
.
length
===
1
)
{
if
(
panel
&&
this
.
_viewDescriptorService
.
getView
ContainerModel
(
panel
).
activeViewDescriptors
.
length
===
1
)
{
this
.
_layoutService
.
setPanelHidden
(
true
);
}
}
...
...
src/vs/workbench/contrib/userDataSync/browser/userDataSyncView.ts
浏览文件 @
600995bb
...
...
@@ -39,7 +39,7 @@ export class UserDataSyncViewContribution implements IWorkbenchContribution {
name
:
localize
(
'
sync preferences
'
,
"
Preferences Sync
"
),
ctorDescriptor
:
new
SyncDescriptor
(
ViewPaneContainer
,
[
'
workbench.view.sync
'
,
`workbench.view.sync.state`
,
{
mergeViewWithContainerWhenSingleView
:
true
}]
[
'
workbench.view.sync
'
,
{
mergeViewWithContainerWhenSingleView
:
true
}]
),
icon
:
'
codicon-sync
'
,
hideIfEmpty
:
true
,
...
...
src/vs/workbench/services/views/browser/viewDescriptorService.ts
浏览文件 @
600995bb
此差异已折叠。
点击以展开。
src/vs/workbench/
test/browser/parts/views/views
.test.ts
→
src/vs/workbench/
services/views/test/browser/viewDescriptorService
.test.ts
浏览文件 @
600995bb
此差异已折叠。
点击以展开。
src/vs/workbench/services/views/test/browser/viewsModel.test.ts
0 → 100644
浏览文件 @
600995bb
/*---------------------------------------------------------------------------------------------
* 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
*
as
sinon
from
'
sinon
'
;
import
{
IViewsRegistry
,
IViewDescriptor
,
IViewContainersRegistry
,
Extensions
as
ViewContainerExtensions
,
ViewContainerLocation
,
IViewContainerModel
,
IViewDescriptorService
,
ViewContainer
}
from
'
vs/workbench/common/views
'
;
import
{
IDisposable
,
dispose
,
DisposableStore
}
from
'
vs/base/common/lifecycle
'
;
import
{
move
}
from
'
vs/base/common/arrays
'
;
import
{
workbenchInstantiationService
}
from
'
vs/workbench/test/browser/workbenchTestServices
'
;
import
{
ContextKeyExpr
,
IContextKeyService
}
from
'
vs/platform/contextkey/common/contextkey
'
;
import
{
TestInstantiationService
}
from
'
vs/platform/instantiation/test/common/instantiationServiceMock
'
;
import
{
ContextKeyService
}
from
'
vs/platform/contextkey/browser/contextKeyService
'
;
import
{
ViewDescriptorService
}
from
'
vs/workbench/services/views/browser/viewDescriptorService
'
;
import
{
Registry
}
from
'
vs/platform/registry/common/platform
'
;
import
{
SyncDescriptor
}
from
'
vs/platform/instantiation/common/descriptors
'
;
import
{
IStorageService
,
StorageScope
}
from
'
vs/platform/storage/common/storage
'
;
const
ViewContainerRegistry
=
Registry
.
as
<
IViewContainersRegistry
>
(
ViewContainerExtensions
.
ViewContainersRegistry
);
const
ViewsRegistry
=
Registry
.
as
<
IViewsRegistry
>
(
ViewContainerExtensions
.
ViewsRegistry
);
class
ViewDescriptorSequence
{
readonly
elements
:
IViewDescriptor
[];
private
disposables
:
IDisposable
[]
=
[];
constructor
(
model
:
IViewContainerModel
)
{
this
.
elements
=
[...
model
.
visibleViewDescriptors
];
model
.
onDidAddVisibleViewDescriptors
(
added
=>
added
.
forEach
(({
viewDescriptor
,
index
})
=>
this
.
elements
.
splice
(
index
,
0
,
viewDescriptor
)),
null
,
this
.
disposables
);
model
.
onDidRemoveVisibleViewDescriptors
(
removed
=>
removed
.
sort
((
a
,
b
)
=>
b
.
index
-
a
.
index
).
forEach
(({
index
})
=>
this
.
elements
.
splice
(
index
,
1
)),
null
,
this
.
disposables
);
model
.
onDidMoveVisibleViewDescriptors
(({
from
,
to
})
=>
move
(
this
.
elements
,
from
.
index
,
to
.
index
),
null
,
this
.
disposables
);
}
dispose
()
{
this
.
disposables
=
dispose
(
this
.
disposables
);
}
}
suite
(
'
ViewContainerModel
'
,
()
=>
{
let
container
:
ViewContainer
;
let
disposableStore
:
DisposableStore
;
let
contextKeyService
:
IContextKeyService
;
let
viewDescriptorService
:
IViewDescriptorService
;
let
storageService
:
IStorageService
;
setup
(()
=>
{
disposableStore
=
new
DisposableStore
();
const
instantiationService
:
TestInstantiationService
=
<
TestInstantiationService
>
workbenchInstantiationService
();
contextKeyService
=
instantiationService
.
createInstance
(
ContextKeyService
);
instantiationService
.
stub
(
IContextKeyService
,
contextKeyService
);
storageService
=
instantiationService
.
get
(
IStorageService
);
viewDescriptorService
=
instantiationService
.
createInstance
(
ViewDescriptorService
);
});
teardown
(()
=>
{
disposableStore
.
dispose
();
ViewsRegistry
.
deregisterViews
(
ViewsRegistry
.
getViews
(
container
),
container
);
ViewContainerRegistry
.
deregisterViewContainer
(
container
);
});
test
(
'
empty model
'
,
function
()
{
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
);
});
test
(
'
register/unregister
'
,
()
=>
{
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
const
viewDescriptor
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
};
ViewsRegistry
.
registerViews
([
viewDescriptor
],
container
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
1
);
assert
.
equal
(
target
.
elements
.
length
,
1
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
[
0
],
viewDescriptor
);
assert
.
deepEqual
(
target
.
elements
[
0
],
viewDescriptor
);
ViewsRegistry
.
deregisterViews
([
viewDescriptor
],
container
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
});
test
(
'
when contexts
'
,
async
function
()
{
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
const
viewDescriptor
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
,
when
:
ContextKeyExpr
.
equals
(
'
showview1
'
,
true
)
};
ViewsRegistry
.
registerViews
([
viewDescriptor
],
container
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should not appear since context isnt in
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
const
key
=
contextKeyService
.
createKey
(
'
showview1
'
,
false
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should still not appear since showview1 isnt true
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
key
.
set
(
true
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
1
,
'
view should appear
'
);
assert
.
equal
(
target
.
elements
.
length
,
1
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
[
0
],
viewDescriptor
);
assert
.
equal
(
target
.
elements
[
0
],
viewDescriptor
);
key
.
set
(
false
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should disappear
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
ViewsRegistry
.
deregisterViews
([
viewDescriptor
],
container
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should not be there anymore
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
key
.
set
(
true
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should not be there anymore
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
});
test
(
'
when contexts - multiple
'
,
async
function
()
{
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
const
view1
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
};
const
view2
:
IViewDescriptor
=
{
id
:
'
view2
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 2
'
,
when
:
ContextKeyExpr
.
equals
(
'
showview2
'
,
true
)
};
ViewsRegistry
.
registerViews
([
view1
,
view2
],
container
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
],
'
only view1 should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
],
'
only view1 should be visible
'
);
const
key
=
contextKeyService
.
createKey
(
'
showview2
'
,
false
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
],
'
still only view1 should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
],
'
still only view1 should be visible
'
);
key
.
set
(
true
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view2
],
'
both views should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view2
],
'
both views should be visible
'
);
ViewsRegistry
.
deregisterViews
([
view1
,
view2
],
container
);
});
test
(
'
when contexts - multiple 2
'
,
async
function
()
{
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
const
view1
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
,
when
:
ContextKeyExpr
.
equals
(
'
showview1
'
,
true
)
};
const
view2
:
IViewDescriptor
=
{
id
:
'
view2
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 2
'
};
ViewsRegistry
.
registerViews
([
view1
,
view2
],
container
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view2
],
'
only view2 should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view2
],
'
only view2 should be visible
'
);
const
key
=
contextKeyService
.
createKey
(
'
showview1
'
,
false
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view2
],
'
still only view2 should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view2
],
'
still only view2 should be visible
'
);
key
.
set
(
true
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view2
],
'
both views should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view2
],
'
both views should be visible
'
);
ViewsRegistry
.
deregisterViews
([
view1
,
view2
],
container
);
});
test
(
'
setVisible
'
,
()
=>
{
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
const
view1
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
,
canToggleVisibility
:
true
};
const
view2
:
IViewDescriptor
=
{
id
:
'
view2
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 2
'
,
canToggleVisibility
:
true
};
const
view3
:
IViewDescriptor
=
{
id
:
'
view3
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 3
'
,
canToggleVisibility
:
true
};
ViewsRegistry
.
registerViews
([
view1
,
view2
,
view3
],
container
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view2
,
view3
]);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view2
,
view3
]);
testObject
.
setVisible
(
'
view2
'
,
true
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view2
,
view3
],
'
nothing should happen
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view2
,
view3
]);
testObject
.
setVisible
(
'
view2
'
,
false
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view3
],
'
view2 should hide
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view3
]);
testObject
.
setVisible
(
'
view1
'
,
false
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view3
],
'
view1 should hide
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view3
]);
testObject
.
setVisible
(
'
view3
'
,
false
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[],
'
view3 shoud hide
'
);
assert
.
deepEqual
(
target
.
elements
,
[]);
testObject
.
setVisible
(
'
view1
'
,
true
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
],
'
view1 should show
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
]);
testObject
.
setVisible
(
'
view3
'
,
true
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view3
],
'
view3 should show
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view3
]);
testObject
.
setVisible
(
'
view2
'
,
true
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view2
,
view3
],
'
view2 should show
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view2
,
view3
]);
ViewsRegistry
.
deregisterViews
([
view1
,
view2
,
view3
],
container
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[]);
assert
.
deepEqual
(
target
.
elements
,
[]);
});
test
(
'
move
'
,
()
=>
{
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
const
view1
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
};
const
view2
:
IViewDescriptor
=
{
id
:
'
view2
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 2
'
};
const
view3
:
IViewDescriptor
=
{
id
:
'
view3
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 3
'
};
ViewsRegistry
.
registerViews
([
view1
,
view2
,
view3
],
container
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view2
,
view3
],
'
model views should be OK
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view2
,
view3
],
'
sql views should be OK
'
);
testObject
.
move
(
'
view3
'
,
'
view1
'
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view3
,
view1
,
view2
],
'
view3 should go to the front
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view3
,
view1
,
view2
]);
testObject
.
move
(
'
view1
'
,
'
view2
'
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view3
,
view2
,
view1
],
'
view1 should go to the end
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view3
,
view2
,
view1
]);
testObject
.
move
(
'
view1
'
,
'
view3
'
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view3
,
view2
],
'
view1 should go to the front
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view3
,
view2
]);
testObject
.
move
(
'
view2
'
,
'
view3
'
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view1
,
view2
,
view3
],
'
view2 should go to the middle
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view1
,
view2
,
view3
]);
});
test
(
'
view states
'
,
async
function
()
{
storageService
.
store
(
`
${
container
.
id
}
.state.hidden`
,
JSON
.
stringify
([{
id
:
'
view1
'
,
isHidden
:
true
}]),
StorageScope
.
GLOBAL
);
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
const
viewDescriptor
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
};
ViewsRegistry
.
registerViews
([
viewDescriptor
],
container
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should not appear since it was set not visible in view state
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
});
test
(
'
view states and when contexts
'
,
async
function
()
{
storageService
.
store
(
`
${
container
.
id
}
.state.hidden`
,
JSON
.
stringify
([{
id
:
'
view1
'
,
isHidden
:
true
}]),
StorageScope
.
GLOBAL
);
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
const
viewDescriptor
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
,
when
:
ContextKeyExpr
.
equals
(
'
showview1
'
,
true
)
};
ViewsRegistry
.
registerViews
([
viewDescriptor
],
container
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should not appear since context isnt in
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
const
key
=
contextKeyService
.
createKey
(
'
showview1
'
,
false
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should still not appear since showview1 isnt true
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
key
.
set
(
true
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should still not appear since it was set not visible in view state
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
});
test
(
'
view states and when contexts multiple views
'
,
async
function
()
{
storageService
.
store
(
`
${
container
.
id
}
.state.hidden`
,
JSON
.
stringify
([{
id
:
'
view1
'
,
isHidden
:
true
}]),
StorageScope
.
GLOBAL
);
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
const
view1
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
,
when
:
ContextKeyExpr
.
equals
(
'
showview
'
,
true
)
};
const
view2
:
IViewDescriptor
=
{
id
:
'
view2
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 2
'
,
};
const
view3
:
IViewDescriptor
=
{
id
:
'
view3
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 3
'
,
when
:
ContextKeyExpr
.
equals
(
'
showview
'
,
true
)
};
ViewsRegistry
.
registerViews
([
view1
,
view2
,
view3
],
container
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view2
],
'
Only view2 should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view2
]);
const
key
=
contextKeyService
.
createKey
(
'
showview
'
,
false
);
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view2
],
'
Only view2 should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view2
]);
key
.
set
(
true
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view2
,
view3
],
'
view3 should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view2
,
view3
]);
key
.
set
(
false
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
deepEqual
(
testObject
.
visibleViewDescriptors
,
[
view2
],
'
Only view2 should be visible
'
);
assert
.
deepEqual
(
target
.
elements
,
[
view2
]);
});
test
(
'
remove event is not triggered if view was hidden and removed
'
,
async
function
()
{
container
=
ViewContainerRegistry
.
registerViewContainer
({
id
:
'
test
'
,
name
:
'
test
'
,
ctorDescriptor
:
new
SyncDescriptor
(
<
any
>
{})
},
ViewContainerLocation
.
Sidebar
);
const
testObject
=
viewDescriptorService
.
getViewContainerModel
(
container
);
const
target
=
disposableStore
.
add
(
new
ViewDescriptorSequence
(
testObject
));
const
viewDescriptor
:
IViewDescriptor
=
{
id
:
'
view1
'
,
ctorDescriptor
:
null
!
,
name
:
'
Test View 1
'
,
when
:
ContextKeyExpr
.
equals
(
'
showview1
'
,
true
),
canToggleVisibility
:
true
};
ViewsRegistry
.
registerViews
([
viewDescriptor
],
container
);
const
key
=
contextKeyService
.
createKey
(
'
showview1
'
,
true
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
1
,
'
view should appear after context is set
'
);
assert
.
equal
(
target
.
elements
.
length
,
1
);
testObject
.
setVisible
(
'
view1
'
,
false
);
assert
.
equal
(
testObject
.
visibleViewDescriptors
.
length
,
0
,
'
view should disappear after setting visibility to false
'
);
assert
.
equal
(
target
.
elements
.
length
,
0
);
const
targetEvent
=
sinon
.
spy
(
testObject
.
onDidRemoveVisibleViewDescriptors
);
key
.
set
(
false
);
await
new
Promise
(
c
=>
setTimeout
(
c
,
30
));
assert
.
ok
(
!
targetEvent
.
called
,
'
remove event should not be called since it is already hidden
'
);
});
});
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录