Skip to content

Commit 1c4e229

Browse files
committed
custom views are tricky
1 parent 481923c commit 1c4e229

5 files changed

Lines changed: 32 additions & 16 deletions

File tree

src/vs/platform/list/browser/listService.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -839,6 +839,11 @@ export class WorkbenchAsyncDataTree<TInput, T, TFilterData = void> extends Async
839839
this.internals = new WorkbenchTreeInternals(this, treeOptions, getAutomaticKeyboardNavigation, options.overrideStyles, contextKeyService, listService, themeService, configurationService, accessibilityService);
840840
this.disposables.add(this.internals);
841841
}
842+
843+
updateOptions(options: IWorkbenchAsyncDataTreeOptions<T, TFilterData> = {}): void {
844+
super.updateOptions(options);
845+
this.internals.updateStyleOverrides(options.overrideStyles);
846+
}
842847
}
843848

844849
export interface IWorkbenchCompressibleAsyncDataTreeOptions<T, TFilterData> extends ICompressibleAsyncDataTreeOptions<T, TFilterData> {
@@ -936,15 +941,16 @@ class WorkbenchTreeInternals<TInput, T, TFilterData> {
936941
private hasMultiSelection: IContextKey<boolean>;
937942
private _useAltAsMultipleSelectionModifier: boolean;
938943
private disposables: IDisposable[] = [];
944+
private styler!: IDisposable;
939945

940946
constructor(
941-
tree: WorkbenchObjectTree<T, TFilterData> | CompressibleObjectTree<T, TFilterData> | WorkbenchDataTree<TInput, T, TFilterData> | WorkbenchAsyncDataTree<TInput, T, TFilterData> | WorkbenchCompressibleAsyncDataTree<TInput, T, TFilterData>,
947+
private tree: WorkbenchObjectTree<T, TFilterData> | CompressibleObjectTree<T, TFilterData> | WorkbenchDataTree<TInput, T, TFilterData> | WorkbenchAsyncDataTree<TInput, T, TFilterData> | WorkbenchCompressibleAsyncDataTree<TInput, T, TFilterData>,
942948
options: IAbstractTreeOptions<T, TFilterData> | IAsyncDataTreeOptions<T, TFilterData>,
943949
getAutomaticKeyboardNavigation: () => boolean | undefined,
944950
overrideStyles: IColorMapping | undefined,
945951
@IContextKeyService contextKeyService: IContextKeyService,
946952
@IListService listService: IListService,
947-
@IThemeService themeService: IThemeService,
953+
@IThemeService private themeService: IThemeService,
948954
@IConfigurationService configurationService: IConfigurationService,
949955
@IAccessibilityService accessibilityService: IAccessibilityService,
950956
) {
@@ -970,10 +976,11 @@ class WorkbenchTreeInternals<TInput, T, TFilterData> {
970976
});
971977
};
972978

979+
this.updateStyleOverrides(overrideStyles);
980+
973981
this.disposables.push(
974982
this.contextKeyService,
975983
(listService as ListService).register(tree),
976-
overrideStyles ? attachListStyler(tree, themeService, overrideStyles) : Disposable.None,
977984
tree.onDidChangeSelection(() => {
978985
const selection = tree.getSelection();
979986
const focus = tree.getFocus();
@@ -1023,8 +1030,14 @@ class WorkbenchTreeInternals<TInput, T, TFilterData> {
10231030
return this._useAltAsMultipleSelectionModifier;
10241031
}
10251032

1033+
updateStyleOverrides(overrideStyles?: IColorMapping): void {
1034+
dispose(this.styler);
1035+
this.styler = overrideStyles ? attachListStyler(this.tree, this.themeService, overrideStyles) : Disposable.None;
1036+
}
1037+
10261038
dispose(): void {
10271039
this.disposables = dispose(this.disposables);
1040+
this.styler = dispose(this.styler);
10281041
}
10291042
}
10301043

src/vs/workbench/api/browser/viewsExtensionPoint.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ import { IWorkbenchActionRegistry, Extensions as ActionExtensions } from 'vs/wor
3737
import { SyncActionDescriptor } from 'vs/platform/actions/common/actions';
3838
import { ViewPaneContainer } from 'vs/workbench/browser/parts/views/viewPaneContainer';
3939
import { SyncDescriptor } from 'vs/platform/instantiation/common/descriptors';
40+
// import { SIDE_BAR_BACKGROUND, PANEL_BACKGROUND } from 'vs/workbench/common/theme';
4041

4142
export interface IUserFriendlyViewsContainerDescriptor {
4243
id: string;
@@ -421,8 +422,9 @@ class ViewsExtensionHandler implements IWorkbenchContribution {
421422
ctorDescriptor: new SyncDescriptor(CustomTreeViewPane),
422423
when: ContextKeyExpr.deserialize(item.when),
423424
canToggleVisibility: true,
425+
canMoveView: true,
426+
treeView: this.instantiationService.createInstance(CustomTreeView, item.id, item.name),
424427
collapsed: this.showCollapsed(container),
425-
treeView: this.instantiationService.createInstance(CustomTreeView, item.id, item.name, container),
426428
order: order,
427429
extensionId: extension.description.identifier,
428430
originalContainerId: entry.key,

src/vs/workbench/browser/parts/views/customView.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import { IContextMenuService } from 'vs/platform/contextview/browser/contextView
1313
import { IMenuService, MenuId, MenuItemAction } from 'vs/platform/actions/common/actions';
1414
import { ContextAwareMenuEntryActionViewItem, createAndFillInContextMenuActions } from 'vs/platform/actions/browser/menuEntryActionViewItem';
1515
import { IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
16-
import { ITreeView, ITreeItem, TreeItemCollapsibleState, ITreeViewDataProvider, TreeViewItemHandleArg, ITreeViewDescriptor, IViewsRegistry, ViewContainer, ITreeItemLabel, Extensions, IViewDescriptorService } from 'vs/workbench/common/views';
16+
import { ITreeView, ITreeItem, TreeItemCollapsibleState, ITreeViewDataProvider, TreeViewItemHandleArg, ITreeViewDescriptor, IViewsRegistry, ViewContainer, ITreeItemLabel, Extensions, IViewDescriptorService, IViewContainersRegistry, ViewContainerLocation } from 'vs/workbench/common/views';
1717
import { IViewletViewOptions } from 'vs/workbench/browser/parts/views/viewsViewlet';
1818
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
1919
import { INotificationService } from 'vs/platform/notification/common/notification';
@@ -41,7 +41,7 @@ import { ITreeRenderer, ITreeNode, IAsyncDataSource, ITreeContextMenuEvent } fro
4141
import { FuzzyScore, createMatches } from 'vs/base/common/filters';
4242
import { CollapseAllAction } from 'vs/base/browser/ui/tree/treeDefaults';
4343
import { isFalsyOrWhitespace } from 'vs/base/common/strings';
44-
import { SIDE_BAR_BACKGROUND } from 'vs/workbench/common/theme';
44+
import { SIDE_BAR_BACKGROUND, PANEL_BACKGROUND } from 'vs/workbench/common/theme';
4545

4646
export class CustomTreeViewPane extends ViewPane {
4747

@@ -154,7 +154,6 @@ export class CustomTreeView extends Disposable implements ITreeView {
154154
constructor(
155155
private id: string,
156156
private _title: string,
157-
private viewContainer: ViewContainer,
158157
@IExtensionService private readonly extensionService: IExtensionService,
159158
@IWorkbenchThemeService private readonly themeService: IWorkbenchThemeService,
160159
@IInstantiationService private readonly instantiationService: IInstantiationService,
@@ -163,6 +162,7 @@ export class CustomTreeView extends Disposable implements ITreeView {
163162
@IProgressService private readonly progressService: IProgressService,
164163
@IContextMenuService private readonly contextMenuService: IContextMenuService,
165164
@IKeybindingService private readonly keybindingService: IKeybindingService,
165+
@IViewDescriptorService private readonly viewDescriptorService: IViewDescriptorService,
166166
@INotificationService private readonly notificationService: INotificationService
167167
) {
168168
super();
@@ -174,11 +174,7 @@ export class CustomTreeView extends Disposable implements ITreeView {
174174
this.doRefresh([this.root]); /** soft refresh **/
175175
}
176176
}));
177-
this._register(Registry.as<IViewsRegistry>(Extensions.ViewsRegistry).onDidChangeContainer(({ views, from, to }) => {
178-
if (from === this.viewContainer && views.some(v => v.id === this.id)) {
179-
this.viewContainer = to;
180-
}
181-
}));
177+
182178
this.create();
183179
}
184180

src/vs/workbench/common/views.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,8 @@ export interface IViewDescriptorService {
366366

367367
_serviceBrand: undefined;
368368

369+
readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>;
370+
369371
moveViewToLocation(view: IViewDescriptor, location: ViewContainerLocation): void;
370372

371373
moveViewsToContainer(views: IViewDescriptor[], viewContainer: ViewContainer): void;
@@ -443,9 +445,7 @@ export interface IRevealOptions {
443445
}
444446

445447
export interface ITreeViewDescriptor extends IViewDescriptor {
446-
447-
readonly treeView: ITreeView;
448-
448+
treeView: ITreeView;
449449
}
450450

451451
export type TreeViewItemHandleArg = {

src/vs/workbench/services/views/browser/viewDescriptorService.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,9 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor
181181
private static readonly CACHED_VIEW_POSITIONS = 'views.cachedViewPositions';
182182
private static readonly COMMON_CONTAINER_ID_PREFIX = 'workbench.views.service';
183183

184+
private readonly _onDidChangeContainer: Emitter<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }> = this._register(new Emitter<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }>());
185+
readonly onDidChangeContainer: Event<{ views: IViewDescriptor[], from: ViewContainer, to: ViewContainer }> = this._onDidChangeContainer.event;
186+
184187
private readonly viewDescriptorCollections: Map<ViewContainer, { viewDescriptorCollection: ViewDescriptorCollection, disposable: IDisposable; }>;
185188
private readonly activeViewContextKeys: Map<string, IContextKey<boolean>>;
186189
private readonly movableViewContextKeys: Map<string, IContextKey<boolean>>;
@@ -230,7 +233,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor
230233
this._register(this.viewsRegistry.onViewsRegistered(({ views, viewContainer }) => this.onDidRegisterViews(views, viewContainer)));
231234
this._register(this.viewsRegistry.onViewsDeregistered(({ views, viewContainer }) => this.onDidDeregisterViews(views, viewContainer)));
232235

233-
this._register(this.viewsRegistry.onDidChangeContainer(({ views, from, to }) => { this.removeViews(from, views); this.addViews(to, views); }));
236+
this._register(this.viewsRegistry.onDidChangeContainer(({ views, from, to }) => { this.removeViews(from, views); this.addViews(to, views); this._onDidChangeContainer.fire({ views, from, to }); }));
234237

235238
this._register(this.viewContainersRegistry.onDidRegister(({ viewContainer }) => this.onDidRegisterViewContainer(viewContainer)));
236239
this._register(this.viewContainersRegistry.onDidDeregister(({ viewContainer }) => this.onDidDeregisterViewContainer(viewContainer)));
@@ -357,6 +360,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor
357360

358361
getViewContainer(viewId: string): ViewContainer | null {
359362
const containerId = this.cachedViewInfo.get(viewId)?.containerId;
363+
360364
return containerId ?
361365
this.viewContainersRegistry.get(containerId) ?? null :
362366
this.viewsRegistry.getViewContainer(viewId);
@@ -395,6 +399,7 @@ export class ViewDescriptorService extends Disposable implements IViewDescriptor
395399
if (from && to && from !== to) {
396400
this.removeViews(from, views);
397401
this.addViews(to, views);
402+
this._onDidChangeContainer.fire({ views, from, to });
398403
this.saveViewPositionsToCache();
399404
}
400405
}

0 commit comments

Comments
 (0)