mirror of
https://github.com/Microsoft/vscode
synced 2024-08-28 05:19:39 +00:00
centralize part visibility eventing
add context key for editor area visible fixes #67707
This commit is contained in:
parent
b3eb413eaf
commit
c805ab792e
|
@ -20,7 +20,7 @@ import { MenuBarVisibility } from 'vs/platform/windows/common/windows';
|
|||
import { isWindows, isLinux, isWeb } from 'vs/base/common/platform';
|
||||
import { IsMacNativeContext } from 'vs/workbench/browser/contextkeys';
|
||||
import { KeybindingsRegistry, KeybindingWeight } from 'vs/platform/keybinding/common/keybindingsRegistry';
|
||||
import { InEditorZenModeContext, IsCenteredLayoutContext } from 'vs/workbench/common/editor';
|
||||
import { InEditorZenModeContext, IsCenteredLayoutContext, EditorAreaVisibleContext } from 'vs/workbench/common/editor';
|
||||
import { ContextKeyExpr } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { SideBarVisibleContext } from 'vs/workbench/common/viewlet';
|
||||
|
||||
|
@ -232,6 +232,16 @@ export class ToggleEditorVisibilityAction extends Action {
|
|||
|
||||
registry.registerWorkbenchAction(new SyncActionDescriptor(ToggleEditorVisibilityAction, ToggleEditorVisibilityAction.ID, ToggleEditorVisibilityAction.LABEL), 'View: Toggle Editor Area Visibility', viewCategory);
|
||||
|
||||
MenuRegistry.appendMenuItem(MenuId.MenubarAppearanceMenu, {
|
||||
group: '2_workbench_layout',
|
||||
command: {
|
||||
id: ToggleEditorVisibilityAction.ID,
|
||||
title: nls.localize({ key: 'miShowEditorArea', comment: ['&& denotes a mnemonic'] }, "Show &&Editor Area"),
|
||||
toggled: EditorAreaVisibleContext
|
||||
},
|
||||
order: 5
|
||||
});
|
||||
|
||||
export class ToggleSidebarVisibilityAction extends Action {
|
||||
|
||||
static readonly ID = 'workbench.action.toggleSidebarVisibility';
|
||||
|
|
|
@ -8,7 +8,7 @@ import { Disposable } from 'vs/base/common/lifecycle';
|
|||
import { IContextKeyService, IContextKey, RawContextKey } from 'vs/platform/contextkey/common/contextkey';
|
||||
import { InputFocusedContext } from 'vs/platform/contextkey/common/contextkeys';
|
||||
import { IWindowsConfiguration } from 'vs/platform/windows/common/windows';
|
||||
import { ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, TEXT_DIFF_EDITOR_ID, SplitEditorsVertically, InEditorZenModeContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorIsSaveableContext, toResource, SideBySideEditor } from 'vs/workbench/common/editor';
|
||||
import { ActiveEditorContext, EditorsVisibleContext, TextCompareEditorVisibleContext, TextCompareEditorActiveContext, ActiveEditorGroupEmptyContext, MultipleEditorGroupsContext, TEXT_DIFF_EDITOR_ID, SplitEditorsVertically, InEditorZenModeContext, IsCenteredLayoutContext, ActiveEditorGroupIndexContext, ActiveEditorGroupLastContext, ActiveEditorIsSaveableContext, toResource, SideBySideEditor, EditorAreaVisibleContext } from 'vs/workbench/common/editor';
|
||||
import { trackFocus, addDisposableListener, EventType } from 'vs/base/browser/dom';
|
||||
import { preferredSideBySideGroupDirection, GroupDirection, IEditorGroupsService } from 'vs/workbench/services/editor/common/editorGroupsService';
|
||||
import { IConfigurationService } from 'vs/platform/configuration/common/configuration';
|
||||
|
@ -73,6 +73,7 @@ export class WorkbenchContextKeysHandler extends Disposable {
|
|||
private isFullscreenContext: IContextKey<boolean>;
|
||||
private isCenteredLayoutContext: IContextKey<boolean>;
|
||||
private sideBarVisibleContext: IContextKey<boolean>;
|
||||
private editorAreaVisibleContext: IContextKey<boolean>;
|
||||
private panelPositionContext: IContextKey<string>;
|
||||
|
||||
constructor(
|
||||
|
@ -146,6 +147,9 @@ export class WorkbenchContextKeysHandler extends Disposable {
|
|||
// Centered Layout
|
||||
this.isCenteredLayoutContext = IsCenteredLayoutContext.bindTo(this.contextKeyService);
|
||||
|
||||
// Editor Area
|
||||
this.editorAreaVisibleContext = EditorAreaVisibleContext.bindTo(this.contextKeyService);
|
||||
|
||||
// Sidebar
|
||||
this.sideBarVisibleContext = SideBarVisibleContext.bindTo(this.contextKeyService);
|
||||
|
||||
|
@ -184,6 +188,8 @@ export class WorkbenchContextKeysHandler extends Disposable {
|
|||
|
||||
this._register(this.viewletService.onDidViewletClose(() => this.updateSideBarContextKeys()));
|
||||
this._register(this.viewletService.onDidViewletOpen(() => this.updateSideBarContextKeys()));
|
||||
|
||||
this._register(this.layoutService.onPartVisibilityChange(() => this.editorAreaVisibleContext.set(this.layoutService.isVisible(Parts.EDITOR_PART))));
|
||||
}
|
||||
|
||||
private updateEditorContextKeys(): void {
|
||||
|
|
|
@ -99,6 +99,9 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
|||
private readonly _onPanelPositionChange: Emitter<string> = this._register(new Emitter<string>());
|
||||
readonly onPanelPositionChange: Event<string> = this._onPanelPositionChange.event;
|
||||
|
||||
private readonly _onPartVisibilityChange: Emitter<void> = this._register(new Emitter<void>());
|
||||
readonly onPartVisibilityChange: Event<void> = this._onPartVisibilityChange.event;
|
||||
|
||||
private readonly _onLayout = this._register(new Emitter<IDimension>());
|
||||
readonly onLayout: Event<IDimension> = this._onLayout.event;
|
||||
|
||||
|
@ -797,17 +800,18 @@ export abstract class Layout extends Disposable implements IWorkbenchLayoutServi
|
|||
this.container.prepend(workbenchGrid.element);
|
||||
this.workbenchGrid = workbenchGrid;
|
||||
|
||||
this._register((this.sideBarPartView as SidebarPart).onDidVisibilityChange((visible) => {
|
||||
this.setSideBarHidden(!visible, true);
|
||||
}));
|
||||
|
||||
this._register((this.panelPartView as PanelPart).onDidVisibilityChange((visible) => {
|
||||
this.setPanelHidden(!visible, true);
|
||||
}));
|
||||
|
||||
this._register((this.editorPartView as PanelPart).onDidVisibilityChange((visible) => {
|
||||
this.setEditorHidden(!visible, true);
|
||||
}));
|
||||
[titleBar, editorPart, activityBar, panelPart, sideBar, statusBar].forEach((part: Part) => {
|
||||
this._register(part.onDidVisibilityChange((visible) => {
|
||||
this._onPartVisibilityChange.fire();
|
||||
if (part === sideBar) {
|
||||
this.setSideBarHidden(!visible, true);
|
||||
} else if (part === panelPart) {
|
||||
this.setPanelHidden(!visible, true);
|
||||
} else if (part === editorPart) {
|
||||
this.setEditorHidden(!visible, true);
|
||||
}
|
||||
}));
|
||||
});
|
||||
|
||||
this._register(this.storageService.onWillSaveState(() => {
|
||||
const grid = this.workbenchGrid as SerializableGrid<ISerializableView>;
|
||||
|
|
|
@ -33,6 +33,9 @@ export abstract class Part extends Component implements ISerializableView {
|
|||
private _dimension: Dimension | undefined;
|
||||
get dimension(): Dimension | undefined { return this._dimension; }
|
||||
|
||||
protected _onDidVisibilityChange = this._register(new Emitter<boolean>());
|
||||
readonly onDidVisibilityChange: Event<boolean> = this._onDidVisibilityChange.event;
|
||||
|
||||
private parent: HTMLElement | undefined;
|
||||
private titleArea: HTMLElement | undefined;
|
||||
private contentArea: HTMLElement | undefined;
|
||||
|
@ -138,6 +141,10 @@ export abstract class Part extends Component implements ISerializableView {
|
|||
this._dimension = new Dimension(width, height);
|
||||
}
|
||||
|
||||
setVisible(visible: boolean) {
|
||||
this._onDidVisibilityChange.fire(visible);
|
||||
}
|
||||
|
||||
abstract toJSON(): object;
|
||||
|
||||
//#endregion
|
||||
|
|
|
@ -437,12 +437,6 @@ export class ActivitybarPart extends Part implements IActivityBarService {
|
|||
.map(v => v.id);
|
||||
}
|
||||
|
||||
setVisible(visible: boolean): void {
|
||||
if (this.element) {
|
||||
this.element.style.display = visible ? '' : 'none';
|
||||
}
|
||||
}
|
||||
|
||||
layout(width: number, height: number): void {
|
||||
if (!this.layoutService.isVisible(Parts.ACTIVITYBAR_PART)) {
|
||||
return;
|
||||
|
|
|
@ -114,9 +114,6 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro
|
|||
private _onDidSizeConstraintsChange = this._register(new Relay<{ width: number; height: number; } | undefined>());
|
||||
get onDidSizeConstraintsChange(): Event<{ width: number; height: number; } | undefined> { return Event.any(this.onDidSetGridWidget.event, this._onDidSizeConstraintsChange.event); }
|
||||
|
||||
private _onDidVisibilityChange = this._register(new Emitter<boolean>());
|
||||
readonly onDidVisibilityChange: Event<boolean> = this._onDidVisibilityChange.event;
|
||||
|
||||
//#endregion
|
||||
|
||||
private readonly workspaceMemento: MementoObject;
|
||||
|
@ -1037,10 +1034,6 @@ export class EditorPart extends Part implements IEditorGroupsService, IEditorGro
|
|||
|
||||
//#endregion
|
||||
|
||||
setVisible(visible: boolean): void {
|
||||
this._onDidVisibilityChange.fire(visible);
|
||||
}
|
||||
|
||||
toJSON(): object {
|
||||
return {
|
||||
type: Parts.EDITOR_PART
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
import 'vs/css!./media/panelpart';
|
||||
import { IAction } from 'vs/base/common/actions';
|
||||
import { Event, Emitter } from 'vs/base/common/event';
|
||||
import { Event } from 'vs/base/common/event';
|
||||
import { Registry } from 'vs/platform/registry/common/platform';
|
||||
import { ActionsOrientation } from 'vs/base/browser/ui/actionbar/actionbar';
|
||||
import { IPanel, ActivePanelContext, PanelFocusContext } from 'vs/workbench/common/panel';
|
||||
|
@ -74,9 +74,6 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
|
|||
get onDidPanelOpen(): Event<{ panel: IPanel, focus: boolean; }> { return Event.map(this.onDidCompositeOpen.event, compositeOpen => ({ panel: compositeOpen.composite, focus: compositeOpen.focus })); }
|
||||
readonly onDidPanelClose: Event<IPanel> = this.onDidCompositeClose.event;
|
||||
|
||||
private _onDidVisibilityChange = this._register(new Emitter<boolean>());
|
||||
readonly onDidVisibilityChange: Event<boolean> = this._onDidVisibilityChange.event;
|
||||
|
||||
private activePanelContextKey: IContextKey<string>;
|
||||
private panelFocusContextKey: IContextKey<boolean>;
|
||||
|
||||
|
@ -446,10 +443,6 @@ export class PanelPart extends CompositePart<Panel> implements IPanelService {
|
|||
this.storageService.store(PanelPart.PINNED_PANELS, value, StorageScope.GLOBAL);
|
||||
}
|
||||
|
||||
setVisible(visible: boolean): void {
|
||||
this._onDidVisibilityChange.fire(visible);
|
||||
}
|
||||
|
||||
toJSON(): object {
|
||||
return {
|
||||
type: Parts.PANEL_PART
|
||||
|
|
|
@ -70,9 +70,6 @@ export class SidebarPart extends CompositePart<Viewlet> implements IViewletServi
|
|||
|
||||
get onDidViewletRegister(): Event<ViewletDescriptor> { return <Event<ViewletDescriptor>>this.viewletRegistry.onDidRegister; }
|
||||
|
||||
private _onDidVisibilityChange = this._register(new Emitter<boolean>());
|
||||
readonly onDidVisibilityChange: Event<boolean> = this._onDidVisibilityChange.event;
|
||||
|
||||
private _onDidViewletDeregister = this._register(new Emitter<ViewletDescriptor>());
|
||||
readonly onDidViewletDeregister: Event<ViewletDescriptor> = this._onDidViewletDeregister.event;
|
||||
|
||||
|
@ -284,10 +281,6 @@ export class SidebarPart extends CompositePart<Viewlet> implements IViewletServi
|
|||
}
|
||||
}
|
||||
|
||||
setVisible(visible: boolean): void {
|
||||
this._onDidVisibilityChange.fire(visible);
|
||||
}
|
||||
|
||||
toJSON(): object {
|
||||
return {
|
||||
type: Parts.SIDEBAR_PART
|
||||
|
|
|
@ -38,6 +38,7 @@ export const SingleEditorGroupsContext = MultipleEditorGroupsContext.toNegated()
|
|||
export const InEditorZenModeContext = new RawContextKey<boolean>('inZenMode', false);
|
||||
export const IsCenteredLayoutContext = new RawContextKey<boolean>('isCenteredLayout', false);
|
||||
export const SplitEditorsVertically = new RawContextKey<boolean>('splitEditorsVertically', false);
|
||||
export const EditorAreaVisibleContext = new RawContextKey<boolean>('editorAreaVisible', true);
|
||||
|
||||
/**
|
||||
* Text diff editor id.
|
||||
|
|
|
@ -56,6 +56,11 @@ export interface IWorkbenchLayoutService extends ILayoutService {
|
|||
*/
|
||||
readonly onPanelPositionChange: Event<string>;
|
||||
|
||||
/**
|
||||
* Emit when part visibility changes
|
||||
*/
|
||||
readonly onPartVisibilityChange: Event<void>;
|
||||
|
||||
/**
|
||||
* Asks the part service if all parts have been fully restored. For editor part
|
||||
* this means that the contents of editors have loaded.
|
||||
|
|
|
@ -462,6 +462,7 @@ export class TestLayoutService implements IWorkbenchLayoutService {
|
|||
onCenteredLayoutChange: Event<boolean> = Event.None;
|
||||
onFullscreenChange: Event<boolean> = Event.None;
|
||||
onPanelPositionChange: Event<string> = Event.None;
|
||||
onPartVisibilityChange: Event<void> = Event.None;
|
||||
onLayout = Event.None;
|
||||
|
||||
private readonly _onTitleBarVisibilityChange = new Emitter<void>();
|
||||
|
|
Loading…
Reference in a new issue