提交 80f35559 编写于 作者: I isidor

vertical panel: add a secondary x sash to the workbench layout

上级 0585cef4
...@@ -45,7 +45,8 @@ interface PartLayoutInfo { ...@@ -45,7 +45,8 @@ interface PartLayoutInfo {
*/ */
export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontalSashLayoutProvider { export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontalSashLayoutProvider {
private static sashXWidthSettingsKey = 'workbench.sidebar.width'; private static sashXOneWidthSettingsKey = 'workbench.sidebar.width';
private static sashXTwoWidthSettingsKey = 'workbench.panel.width';
private static sashYHeightSettingsKey = 'workbench.panel.height'; private static sashYHeightSettingsKey = 'workbench.panel.height';
private parent: Builder; private parent: Builder;
...@@ -60,15 +61,14 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -60,15 +61,14 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
private toUnbind: IDisposable[]; private toUnbind: IDisposable[];
private partLayoutInfo: PartLayoutInfo; private partLayoutInfo: PartLayoutInfo;
private workbenchSize: Dimension; private workbenchSize: Dimension;
private sashX: Sash; private sashXOne: Sash;
private sashXTwo: Sash;
private sashY: Sash; private sashY: Sash;
private startSidebarWidth: number;
private sidebarWidth: number; private sidebarWidth: number;
private sidebarHeight: number; private sidebarHeight: number;
private titlebarHeight: number; private titlebarHeight: number;
private activitybarWidth: number; private activitybarWidth: number;
private statusbarHeight: number; private statusbarHeight: number;
private startPanelHeight: number;
private panelHeight: number; private panelHeight: number;
private panelHeightBeforeMaximized: number; private panelHeightBeforeMaximized: number;
private panelMaximized: boolean; private panelMaximized: boolean;
...@@ -110,7 +110,11 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -110,7 +110,11 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
this.panelHeightBeforeMaximized = 0; this.panelHeightBeforeMaximized = 0;
this.panelMaximized = false; this.panelMaximized = false;
this.sashX = new Sash(this.workbenchContainer.getHTMLElement(), this, { this.sashXOne = new Sash(this.workbenchContainer.getHTMLElement(), this, {
baseSize: 5
});
this.sashXTwo = new Sash(this.workbenchContainer.getHTMLElement(), this, {
baseSize: 5 baseSize: 5
}); });
...@@ -119,8 +123,9 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -119,8 +123,9 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
orientation: Orientation.HORIZONTAL orientation: Orientation.HORIZONTAL
}); });
this.sidebarWidth = this.storageService.getInteger(WorkbenchLayout.sashXWidthSettingsKey, StorageScope.GLOBAL, -1); this.sidebarWidth = this.storageService.getInteger(WorkbenchLayout.sashXOneWidthSettingsKey, StorageScope.GLOBAL, -1);
this.panelHeight = this.storageService.getInteger(WorkbenchLayout.sashYHeightSettingsKey, StorageScope.GLOBAL, 0); this.panelHeight = this.storageService.getInteger(WorkbenchLayout.sashYHeightSettingsKey, StorageScope.GLOBAL, 0);
this.panelWidth = this.storageService.getInteger(WorkbenchLayout.sashXTwoWidthSettingsKey, StorageScope.GLOBAL, 0);
this.layoutEditorGroupsVertically = (this.editorGroupService.getGroupOrientation() !== 'horizontal'); this.layoutEditorGroupsVertically = (this.editorGroupService.getGroupOrientation() !== 'horizontal');
...@@ -158,22 +163,31 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -158,22 +163,31 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
private registerSashListeners(): void { private registerSashListeners(): void {
let startX: number = 0; let startX: number = 0;
let startY: number = 0; let startY: number = 0;
let startX2: number = 0;
let startSidebarWidth: number;
let startPanelHeight: number;
let startPanelWidth: number;
this.sashX.addListener('start', (e: ISashEvent) => { this.toUnbind.push(this.sashXOne.addListener('start', (e: ISashEvent) => {
this.startSidebarWidth = this.sidebarWidth; startSidebarWidth = this.sidebarWidth;
startX = e.startX; startX = e.startX;
}); }));
this.sashY.addListener('start', (e: ISashEvent) => { this.toUnbind.push(this.sashY.addListener('start', (e: ISashEvent) => {
this.startPanelHeight = this.panelHeight; startPanelHeight = this.panelHeight;
startY = e.startY; startY = e.startY;
}); }));
this.toUnbind.push(this.sashXTwo.addListener('start', (e: ISashEvent) => {
startPanelWidth = this.panelWidth;
startX2 = e.startX;
}));
this.sashX.addListener('change', (e: ISashEvent) => { this.toUnbind.push(this.sashXOne.addListener('change', (e: ISashEvent) => {
let doLayout = false; let doLayout = false;
let sidebarPosition = this.partService.getSideBarPosition(); let sidebarPosition = this.partService.getSideBarPosition();
let isSidebarVisible = this.partService.isVisible(Parts.SIDEBAR_PART); let isSidebarVisible = this.partService.isVisible(Parts.SIDEBAR_PART);
let newSashWidth = (sidebarPosition === Position.LEFT) ? this.startSidebarWidth + e.currentX - startX : this.startSidebarWidth - e.currentX + startX; let newSashWidth = (sidebarPosition === Position.LEFT) ? startSidebarWidth + e.currentX - startX : startSidebarWidth - e.currentX + startX;
let promise = TPromise.as<void>(null); let promise = TPromise.as<void>(null);
// Sidebar visible // Sidebar visible
...@@ -184,7 +198,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -184,7 +198,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
let dragCompensation = MIN_SIDEBAR_PART_WIDTH - HIDE_SIDEBAR_WIDTH_THRESHOLD; let dragCompensation = MIN_SIDEBAR_PART_WIDTH - HIDE_SIDEBAR_WIDTH_THRESHOLD;
promise = this.partService.setSideBarHidden(true); promise = this.partService.setSideBarHidden(true);
startX = (sidebarPosition === Position.LEFT) ? Math.max(this.activitybarWidth, e.currentX - dragCompensation) : Math.min(e.currentX + dragCompensation, this.workbenchSize.width - this.activitybarWidth); startX = (sidebarPosition === Position.LEFT) ? Math.max(this.activitybarWidth, e.currentX - dragCompensation) : Math.min(e.currentX + dragCompensation, this.workbenchSize.width - this.activitybarWidth);
this.sidebarWidth = this.startSidebarWidth; // when restoring sidebar, restore to the sidebar width we started from this.sidebarWidth = startSidebarWidth; // when restoring sidebar, restore to the sidebar width we started from
} }
// Otherwise size the sidebar accordingly // Otherwise size the sidebar accordingly
...@@ -198,7 +212,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -198,7 +212,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
else { else {
if ((sidebarPosition === Position.LEFT && e.currentX - startX >= this.partLayoutInfo.sidebar.minWidth) || if ((sidebarPosition === Position.LEFT && e.currentX - startX >= this.partLayoutInfo.sidebar.minWidth) ||
(sidebarPosition === Position.RIGHT && startX - e.currentX >= this.partLayoutInfo.sidebar.minWidth)) { (sidebarPosition === Position.RIGHT && startX - e.currentX >= this.partLayoutInfo.sidebar.minWidth)) {
this.startSidebarWidth = this.partLayoutInfo.sidebar.minWidth - (sidebarPosition === Position.LEFT ? e.currentX - startX : startX - e.currentX); startSidebarWidth = this.partLayoutInfo.sidebar.minWidth - (sidebarPosition === Position.LEFT ? e.currentX - startX : startX - e.currentX);
this.sidebarWidth = this.partLayoutInfo.sidebar.minWidth; this.sidebarWidth = this.partLayoutInfo.sidebar.minWidth;
promise = this.partService.setSideBarHidden(false); promise = this.partService.setSideBarHidden(false);
} }
...@@ -207,12 +221,12 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -207,12 +221,12 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
if (doLayout) { if (doLayout) {
promise.done(() => this.layout(), errors.onUnexpectedError); promise.done(() => this.layout(), errors.onUnexpectedError);
} }
}); }));
this.sashY.addListener('change', (e: ISashEvent) => { this.toUnbind.push(this.sashY.addListener('change', (e: ISashEvent) => {
let doLayout = false; let doLayout = false;
let isPanelVisible = this.partService.isVisible(Parts.PANEL_PART); let isPanelVisible = this.partService.isVisible(Parts.PANEL_PART);
let newSashHeight = this.startPanelHeight - (e.currentY - startY); let newSashHeight = startPanelHeight - (e.currentY - startY);
let promise = TPromise.as<void>(null); let promise = TPromise.as<void>(null);
// Panel visible // Panel visible
...@@ -223,7 +237,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -223,7 +237,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
let dragCompensation = MIN_PANEL_PART_HEIGHT - HIDE_PANEL_HEIGHT_THRESHOLD; let dragCompensation = MIN_PANEL_PART_HEIGHT - HIDE_PANEL_HEIGHT_THRESHOLD;
promise = this.partService.setPanelHidden(true); promise = this.partService.setPanelHidden(true);
startY = Math.min(this.sidebarHeight - this.statusbarHeight - this.titlebarHeight, e.currentY + dragCompensation); startY = Math.min(this.sidebarHeight - this.statusbarHeight - this.titlebarHeight, e.currentY + dragCompensation);
this.panelHeight = this.startPanelHeight; // when restoring panel, restore to the panel height we started from this.panelHeight = startPanelHeight; // when restoring panel, restore to the panel height we started from
} }
// Otherwise size the panel accordingly // Otherwise size the panel accordingly
...@@ -236,7 +250,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -236,7 +250,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
// Panel hidden // Panel hidden
else { else {
if (startY - e.currentY >= this.partLayoutInfo.panel.minHeight) { if (startY - e.currentY >= this.partLayoutInfo.panel.minHeight) {
this.startPanelHeight = 0; startPanelHeight = 0;
this.panelHeight = this.partLayoutInfo.panel.minHeight; this.panelHeight = this.partLayoutInfo.panel.minHeight;
promise = this.partService.setPanelHidden(false); promise = this.partService.setPanelHidden(false);
} }
...@@ -245,29 +259,44 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -245,29 +259,44 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
if (doLayout) { if (doLayout) {
promise.done(() => this.layout(), errors.onUnexpectedError); promise.done(() => this.layout(), errors.onUnexpectedError);
} }
}); }));
this.sashX.addListener('end', () => { this.toUnbind.push(this.sashXTwo.addListener('change', (e: ISashEvent) => {
this.storageService.store(WorkbenchLayout.sashXWidthSettingsKey, this.sidebarWidth, StorageScope.GLOBAL); console.log('change');
}); // TODO@Isidor
}));
this.sashY.addListener('end', () => { this.toUnbind.push(this.sashXOne.addListener('end', () => {
this.storageService.store(WorkbenchLayout.sashXOneWidthSettingsKey, this.sidebarWidth, StorageScope.GLOBAL);
}));
this.toUnbind.push(this.sashY.addListener('end', () => {
this.storageService.store(WorkbenchLayout.sashYHeightSettingsKey, this.panelHeight, StorageScope.GLOBAL); this.storageService.store(WorkbenchLayout.sashYHeightSettingsKey, this.panelHeight, StorageScope.GLOBAL);
}); }));
this.toUnbind.push(this.sashXTwo.addListener('end', () => {
this.storageService.store(WorkbenchLayout.sashXTwoWidthSettingsKey, this.panelWidth, StorageScope.GLOBAL);
}));
this.sashY.addListener('reset', () => { this.toUnbind.push(this.sashY.addListener('reset', () => {
this.panelHeight = this.sidebarHeight * DEFAULT_PANEL_HEIGHT_COEFFICIENT; this.panelHeight = this.sidebarHeight * DEFAULT_PANEL_HEIGHT_COEFFICIENT;
this.storageService.store(WorkbenchLayout.sashYHeightSettingsKey, this.panelHeight, StorageScope.GLOBAL); this.storageService.store(WorkbenchLayout.sashYHeightSettingsKey, this.panelHeight, StorageScope.GLOBAL);
this.partService.setPanelHidden(false).done(() => this.layout(), errors.onUnexpectedError); this.layout();
}); }));
this.sashX.addListener('reset', () => { this.toUnbind.push(this.sashXOne.addListener('reset', () => {
let activeViewlet = this.viewletService.getActiveViewlet(); let activeViewlet = this.viewletService.getActiveViewlet();
let optimalWidth = activeViewlet && activeViewlet.getOptimalWidth(); let optimalWidth = activeViewlet && activeViewlet.getOptimalWidth();
this.sidebarWidth = Math.max(MIN_SIDEBAR_PART_WIDTH, optimalWidth || 0); this.sidebarWidth = Math.max(MIN_SIDEBAR_PART_WIDTH, optimalWidth || 0);
this.storageService.store(WorkbenchLayout.sashXWidthSettingsKey, this.sidebarWidth, StorageScope.GLOBAL); this.storageService.store(WorkbenchLayout.sashXOneWidthSettingsKey, this.sidebarWidth, StorageScope.GLOBAL);
this.partService.setSideBarHidden(false).done(() => this.layout(), errors.onUnexpectedError); this.partService.setSideBarHidden(false).done(() => this.layout(), errors.onUnexpectedError);
}); }));
this.toUnbind.push(this.sashXTwo.addListener('reset', () => {
this.panelWidth = 0; // TODO@ISIDOR
this.storageService.store(WorkbenchLayout.sashXTwoWidthSettingsKey, this.panelWidth, StorageScope.GLOBAL);
this.layout();
}));
} }
private onEditorsChanged(): void { private onEditorsChanged(): void {
...@@ -308,6 +337,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -308,6 +337,7 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
const isStatusbarHidden = !this.partService.isVisible(Parts.STATUSBAR_PART); const isStatusbarHidden = !this.partService.isVisible(Parts.STATUSBAR_PART);
const isSidebarHidden = !this.partService.isVisible(Parts.SIDEBAR_PART); const isSidebarHidden = !this.partService.isVisible(Parts.SIDEBAR_PART);
const sidebarPosition = this.partService.getSideBarPosition(); const sidebarPosition = this.partService.getSideBarPosition();
const panelPosition = this.partService.getPanelPosition();
// Sidebar // Sidebar
let sidebarWidth: number; let sidebarWidth: number;
...@@ -409,12 +439,14 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -409,12 +439,14 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
if (!isSidebarHidden) { if (!isSidebarHidden) {
this.sidebarWidth = sidebarSize.width; this.sidebarWidth = sidebarSize.width;
this.storageService.store(WorkbenchLayout.sashXWidthSettingsKey, this.sidebarWidth, StorageScope.GLOBAL); this.storageService.store(WorkbenchLayout.sashXOneWidthSettingsKey, this.sidebarWidth, StorageScope.GLOBAL);
} }
if (!isPanelHidden) { if (!isPanelHidden) {
this.panelHeight = panelDimension.height; this.panelHeight = panelDimension.height;
this.panelWidth = panelDimension.width;
this.storageService.store(WorkbenchLayout.sashYHeightSettingsKey, this.panelHeight, StorageScope.GLOBAL); this.storageService.store(WorkbenchLayout.sashYHeightSettingsKey, this.panelHeight, StorageScope.GLOBAL);
this.storageService.store(WorkbenchLayout.sashXTwoWidthSettingsKey, this.panelWidth, StorageScope.GLOBAL);
} }
// Workbench // Workbench
...@@ -490,8 +522,14 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -490,8 +522,14 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
this.quickopen.layout(this.workbenchSize); this.quickopen.layout(this.workbenchSize);
// Sashes // Sashes
this.sashX.layout(); this.sashXOne.layout();
this.sashY.layout(); if (panelPosition === Position.BOTTOM) {
this.sashY.layout();
this.sashXTwo.hide();
} else {
this.sashY.hide();
this.sashXTwo.layout();
}
// Propagate to Part Layouts // Propagate to Part Layouts
this.titlebar.layout(new Dimension(this.workbenchSize.width, this.titlebarHeight)); this.titlebar.layout(new Dimension(this.workbenchSize.width, this.titlebarHeight));
...@@ -511,12 +549,16 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal ...@@ -511,12 +549,16 @@ export class WorkbenchLayout implements IVerticalSashLayoutProvider, IHorizontal
public getVerticalSashLeft(sash: Sash): number { public getVerticalSashLeft(sash: Sash): number {
let isSidebarVisible = this.partService.isVisible(Parts.SIDEBAR_PART); let isSidebarVisible = this.partService.isVisible(Parts.SIDEBAR_PART);
let sidebarPosition = this.partService.getSideBarPosition(); let sidebarPosition = this.partService.getSideBarPosition();
if (sash === this.sashXOne) {
if (sidebarPosition === Position.LEFT) { if (sidebarPosition === Position.LEFT) {
return isSidebarVisible ? this.sidebarWidth + this.activitybarWidth : this.activitybarWidth; return isSidebarVisible ? this.sidebarWidth + this.activitybarWidth : this.activitybarWidth;
}
return isSidebarVisible ? this.workbenchSize.width - this.sidebarWidth - this.activitybarWidth : this.workbenchSize.width - this.activitybarWidth;
} }
return isSidebarVisible ? this.workbenchSize.width - this.sidebarWidth - this.activitybarWidth : this.workbenchSize.width - this.activitybarWidth; return this.workbenchSize.width - this.panelWidth - (sidebarPosition === Position.RIGHT && isSidebarVisible ? this.sidebarWidth + this.activitybarWidth : 0);
} }
public getVerticalSashHeight(sash: Sash): number { public getVerticalSashHeight(sash: Sash): number {
......
...@@ -1226,7 +1226,7 @@ export class Workbench implements IPartService { ...@@ -1226,7 +1226,7 @@ export class Workbench implements IPartService {
private createPanelPart(): void { private createPanelPart(): void {
const panelPartContainer = $(this.workbench) const panelPartContainer = $(this.workbench)
.div({ .div({
'class': ['part', 'panel'], 'class': ['part', 'panel', this.panelPosition === Position.BOTTOM ? 'bottom' : 'right'],
id: Identifiers.PANEL_PART, id: Identifiers.PANEL_PART,
role: 'complementary' role: 'complementary'
}); });
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册